list,
+ @NotNull TooltipFlag tooltipFlag) {
+ list.add(Component.literal("1) Place the camera in your hotbar"));
+ list.add(Component.literal("2) Hold an item in your hand"));
+ list.add(Component.literal("3) Use the cursor keys to"));
+ list.add(Component.literal(" modify the item transform."));
+ }
+
+}
diff --git a/common/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java b/common/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java
new file mode 100644
index 00000000..2700c73e
--- /dev/null
+++ b/common/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java
@@ -0,0 +1,97 @@
+package itemtransformhelper;
+
+
+import dev.architectury.injectables.annotations.ExpectPlatform;
+import java.util.List;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.renderer.block.model.ItemOverrides;
+import net.minecraft.client.renderer.block.model.ItemTransforms;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.client.resources.model.BakedModel;
+import net.minecraft.core.Direction;
+import net.minecraft.util.RandomSource;
+import net.minecraft.world.level.block.state.BlockState;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * User: The Grey Ghost
+ * Date: 20/01/2015
+ * This class is a simple wrapper to substitute a new set of camera transforms for an existing item
+ * Usage:
+ * 1) Construct a new ItemModelFlexibleCamera with the model to wrap and an UpdateLink using getWrappedModel()
+ * 2) Replace the ItemModelFlexibleCamera into the modelRegistry in place of the model to wrap
+ * 3) Alter the UpdateLink to control the ItemCameraTransform of a given model:
+ * a) itemModelToOverride selects the item to be overridden
+ * b) forcedTransform is the transform to apply
+ * Models which don't match itemModelToOverride will use their original transform
+ *
+ * NB Starting with Forge 1.8-11.14.4.1563, it appears that all items now implement IPerspectiveAwareModel
+ */
+public abstract class ItemModelFlexibleCamera implements BakedModel {
+
+ protected final BakedModel originalModel;
+ protected final UpdateLink updateLink;
+
+ protected ItemModelFlexibleCamera(BakedModel originalModel, UpdateLink updateLink) {
+ this.originalModel = originalModel;
+ this.updateLink = updateLink;
+ }
+
+ @ExpectPlatform
+ public static ItemModelFlexibleCamera create(BakedModel originalModel, UpdateLink updateLink) {
+ throw new UnsupportedOperationException();
+ }
+
+ @NotNull
+ @Override
+ public ItemTransforms getTransforms() {
+ return (updateLink.itemModelToOverride == this)
+ ? updateLink.forcedTransform
+ : originalModel.getTransforms();
+ }
+
+ @Override
+ public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand) {
+ return originalModel.getQuads(state, side, rand);
+ }
+
+ @Override
+ public boolean useAmbientOcclusion() {
+ return originalModel.useAmbientOcclusion();
+ }
+
+ @Override
+ public boolean isGui3d() {
+ return originalModel.isGui3d();
+ }
+
+ @Override
+ public boolean usesBlockLight() {
+ return originalModel.usesBlockLight();
+ }
+
+ @Override
+ public boolean isCustomRenderer() {
+ return originalModel.isCustomRenderer();
+ }
+
+ @Override
+ public TextureAtlasSprite getParticleIcon() {
+ return originalModel.getParticleIcon();
+ }
+
+ @Override
+ public ItemOverrides getOverrides() {
+ return originalModel.getOverrides();
+ }
+
+ public static class UpdateLink {
+
+ public BakedModel itemModelToOverride;
+
+ public ItemTransforms forcedTransform;
+
+ }
+
+}
diff --git a/common/src/main/java/itemtransformhelper/ItemTransformHelper.java b/common/src/main/java/itemtransformhelper/ItemTransformHelper.java
new file mode 100644
index 00000000..8aada8f4
--- /dev/null
+++ b/common/src/main/java/itemtransformhelper/ItemTransformHelper.java
@@ -0,0 +1,16 @@
+package itemtransformhelper;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ItemTransformHelper {
+
+ public static final String MODID = "itemtransformhelper";
+
+ public static final Logger logger = LogManager.getLogger(MODID);
+
+ public static void init() {
+ StartupCommon.init();
+ }
+
+}
diff --git a/common/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java b/common/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java
new file mode 100644
index 00000000..84410278
--- /dev/null
+++ b/common/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java
@@ -0,0 +1,246 @@
+package itemtransformhelper;
+
+import dev.architectury.injectables.annotations.ExpectPlatform;
+import java.util.Locale;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.block.model.ItemTransform;
+import net.minecraft.client.renderer.block.model.ItemTransforms;
+import net.minecraft.client.resources.model.BakedModel;
+import net.minecraft.network.chat.Component;
+import net.minecraft.util.Mth;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.lwjgl.glfw.GLFW;
+
+
+/**
+ * The menu used to select and alter the different parts of the ItemCameraTransform for the currently selected item.
+ * The menu state is rendered on the screen by HUDTextRenderer.
+ * The class registers its components on the Forge and FML event buses.
+ * Created by TheGreyGhost on 22/01/15.
+ */
+public class MenuItemCameraTransforms {
+
+ private static final Logger LOGGER = LogManager.getLogger();
+
+ private final HUDTextRenderer.HUDInfoUpdateLink linkToHudRenderer;
+
+ public MenuItemCameraTransforms() {
+ linkToHudRenderer = new HUDTextRenderer.HUDInfoUpdateLink();
+ registerListeners(new HUDTextRenderer(linkToHudRenderer),
+ new MenuKeyHandler(this.new KeyPressCallback()));
+ }
+
+ @ExpectPlatform
+ public static void registerListeners(HUDTextRenderer hudTextRenderer, MenuKeyHandler menuKeyHandler) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * get the current ItemCameraTransforms
+ *
+ * @return the transform
+ */
+ public ItemTransforms getItemCameraTransforms() {
+ return linkToHudRenderer.itemCameraTransforms;
+ }
+
+ /**
+ * turn menu on or off
+ *
+ * @param visible true = make visible
+ */
+ public void changeMenuVisible(boolean visible) {
+ linkToHudRenderer.menuVisible = visible;
+ }
+
+ public class KeyPressCallback {
+
+ void keyPressed(MenuKeyHandler.ArrowKeys whichKey) {
+ if (!linkToHudRenderer.menuVisible) return;
+
+ switch (whichKey) {
+ case DOWN -> linkToHudRenderer.selectedField = linkToHudRenderer.selectedField.getNextField();
+ case UP -> linkToHudRenderer.selectedField = linkToHudRenderer.selectedField.getPreviousField();
+ case RIGHT, LEFT -> alterField(whichKey == MenuKeyHandler.ArrowKeys.RIGHT);
+ default -> {
+ }
+ }
+ }
+
+ }
+
+ private void alterField(boolean increase) {
+ ItemTransform transformVec3f = getItemTransformRef(linkToHudRenderer, linkToHudRenderer.selectedTransform);
+ if (transformVec3f == null) return; // should never happen
+
+ final float SCALE_INCREMENT = 0.01F;
+ final float ROTATION_INCREMENT = 2F;
+ final float TRANSLATION_INCREMENT = 0.25F * 0.0625F; // 1/4 of a block, with multiplier from
+ // Transformation.Deserializer::deserialize
+ switch (linkToHudRenderer.selectedField) {
+ case TRANSFORM -> linkToHudRenderer.selectedTransform = increase ? linkToHudRenderer.selectedTransform.getNext()
+ : linkToHudRenderer.selectedTransform.getPrevious();
+ case SCALE_X -> transformVec3f.scale.add(increase ? SCALE_INCREMENT : -SCALE_INCREMENT, 0, 0);
+ case SCALE_Y -> transformVec3f.scale.add(0, increase ? SCALE_INCREMENT : -SCALE_INCREMENT, 0);
+ case SCALE_Z -> transformVec3f.scale.add(0, 0, increase ? SCALE_INCREMENT : -SCALE_INCREMENT);
+ case ROTATE_X -> {
+ float newAngle = transformVec3f.rotation.x() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT);
+ newAngle = Mth.wrapDegrees(newAngle - 180) + 180;
+ transformVec3f.rotation.set(newAngle, transformVec3f.rotation.y(), transformVec3f.rotation.z());
+ }
+ case ROTATE_Y -> {
+ float newAngle = transformVec3f.rotation.y() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT);
+ newAngle = Mth.wrapDegrees(newAngle - 180) + 180;
+ transformVec3f.rotation.set(transformVec3f.rotation.x(), newAngle, transformVec3f.rotation.z());
+ }
+ case ROTATE_Z -> {
+ float newAngle = transformVec3f.rotation.z() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT);
+ newAngle = Mth.wrapDegrees(newAngle - 180) + 180;
+ transformVec3f.rotation.set(transformVec3f.rotation.x(), transformVec3f.rotation.y(), newAngle);
+ }
+ case TRANSLATE_X -> transformVec3f.translation
+ .add(increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT, 0, 0);
+ case TRANSLATE_Y -> transformVec3f.translation
+ .add(0, increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT, 0);
+ case TRANSLATE_Z -> transformVec3f.translation
+ .add(0, 0, increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT);
+ case RESTORE_DEFAULT_ALL, RESTORE_DEFAULT -> {
+ ItemModelFlexibleCamera.UpdateLink link = StartupClientOnly.modelBakeEventHandler.getItemOverrideLink();
+ BakedModel savedModel = link.itemModelToOverride;
+ if (savedModel != null) { // not sure why this would ever be null, but it was (in a bug report), so just
+ // check to make sure.
+ link.itemModelToOverride = null;
+ if (linkToHudRenderer.selectedField == HUDTextRenderer.HUDInfoUpdateLink.SelectedField.RESTORE_DEFAULT) {
+ copySingleTransform(linkToHudRenderer, savedModel, linkToHudRenderer.selectedTransform);
+ } else {
+ for (HUDTextRenderer.HUDInfoUpdateLink.TransformName transformName
+ : HUDTextRenderer.HUDInfoUpdateLink.TransformName.VALUES) {
+ copySingleTransform(linkToHudRenderer, savedModel, transformName);
+ }
+ }
+ }
+ link.itemModelToOverride = savedModel;
+ }
+ case PRINT -> {
+ StringBuilder output = new StringBuilder();
+ output.append("\n\"display\": {\n");
+ printTransform(output, "thirdperson_righthand",
+ linkToHudRenderer.itemCameraTransforms.thirdPersonRightHand);
+ output.append(",\n");
+ printTransform(output, "thirdperson_lefthand", linkToHudRenderer.itemCameraTransforms.thirdPersonLeftHand);
+ output.append(",\n");
+ printTransform(output, "firstperson_righthand",
+ linkToHudRenderer.itemCameraTransforms.firstPersonRightHand);
+ output.append(",\n");
+ printTransform(output, "firstperson_lefthand", linkToHudRenderer.itemCameraTransforms.firstPersonLeftHand);
+ output.append(",\n");
+ printTransform(output, "gui", linkToHudRenderer.itemCameraTransforms.gui);
+ output.append(",\n");
+ printTransform(output, "head", linkToHudRenderer.itemCameraTransforms.head);
+ output.append(",\n");
+ printTransform(output, "fixed", linkToHudRenderer.itemCameraTransforms.fixed);
+ output.append(",\n");
+ printTransform(output, "ground", linkToHudRenderer.itemCameraTransforms.ground);
+ output.append("\n}");
+ LOGGER.info(output);
+ Component text = Component.literal("\"display\" JSON section printed to console (LOGGER.info)...");
+ Minecraft.getInstance().gui.getChat().addMessage(text);
+ }
+ }
+ }
+
+ // points to the appropriate transform based on which transform has been selected.
+ private static ItemTransform getItemTransformRef(HUDTextRenderer.HUDInfoUpdateLink linkToHUDRenderer,
+ HUDTextRenderer.HUDInfoUpdateLink.TransformName transformName) {
+ return switch (transformName) {
+ case THIRD_LEFT -> linkToHUDRenderer.itemCameraTransforms.thirdPersonLeftHand;
+ case THIRD_RIGHT -> linkToHUDRenderer.itemCameraTransforms.thirdPersonRightHand;
+ case FIRST_LEFT -> linkToHUDRenderer.itemCameraTransforms.firstPersonLeftHand;
+ case FIRST_RIGHT -> linkToHUDRenderer.itemCameraTransforms.firstPersonRightHand;
+ case GUI -> linkToHUDRenderer.itemCameraTransforms.gui;
+ case HEAD -> linkToHUDRenderer.itemCameraTransforms.head;
+ case FIXED -> linkToHUDRenderer.itemCameraTransforms.fixed;
+ case GROUND -> linkToHUDRenderer.itemCameraTransforms.ground;
+ };
+ }
+
+ private void copySingleTransform(HUDTextRenderer.HUDInfoUpdateLink linkToHUDRenderer, BakedModel savedModel,
+ HUDTextRenderer.HUDInfoUpdateLink.TransformName transformToBeCopied) {
+ ItemTransform transformation = getItemTransformRef(linkToHUDRenderer, transformToBeCopied);
+ ItemTransforms.TransformType currentType = transformToBeCopied.getVanillaTransformType();
+ ItemTransform transform = savedModel.getTransforms().getTransform(currentType);
+ copyTransforms(transform, transformation);
+ }
+
+ private static void printTransform(StringBuilder output, String transformView, ItemTransform transformation) {
+ output.append(" \"").append(transformView).append("\": {\n");
+ output.append(" \"rotation\": [ ");
+ output.append(String.format(Locale.US, "%.0f, ", transformation.rotation.x()));
+ output.append(String.format(Locale.US, "%.0f, ", transformation.rotation.y()));
+ output.append(String.format(Locale.US, "%.0f ],", transformation.rotation.z()));
+ output.append("\n");
+
+ final double TRANSLATE_MULTIPLIER = 1 / 0.0625; // see Transformation.Deserializer::deserialize
+ output.append(" \"translation\": [ ");
+ output.append(String.format(Locale.US, "%.2f, ", transformation.translation.x() * TRANSLATE_MULTIPLIER));
+ output.append(String.format(Locale.US, "%.2f, ", transformation.translation.y() * TRANSLATE_MULTIPLIER));
+ output.append(String.format(Locale.US, "%.2f ],", transformation.translation.z() * TRANSLATE_MULTIPLIER));
+ output.append("\n");
+ output.append(" \"scale\": [ ");
+ output.append(String.format(Locale.US, "%.2f, ", transformation.scale.x()));
+ output.append(String.format(Locale.US, "%.2f, ", transformation.scale.y()));
+ output.append(String.format(Locale.US, "%.2f ]", transformation.scale.z()));
+ output.append("\n }");
+ }
+
+ private static void copyTransforms(ItemTransform from, ItemTransform to) {
+ to.translation.load(from.translation);
+ to.scale.load(from.scale);
+ to.rotation.load(from.rotation);
+ }
+
+ /**
+ * Intercept arrow keys and handle repeats
+ */
+ public static class MenuKeyHandler {
+
+ private final KeyPressCallback keyPressCallback;
+ private long keyDownTimeTicks = 0;
+ private ArrowKeys lastKey = ArrowKeys.NONE;
+
+ public MenuKeyHandler(KeyPressCallback keyPressCallback) {
+ this.keyPressCallback = keyPressCallback;
+ }
+
+ public void clientTick() {
+ ArrowKeys keyPressed = ArrowKeys.NONE;
+ if (isKeyDown(GLFW.GLFW_KEY_LEFT)) keyPressed = ArrowKeys.LEFT;
+ if (isKeyDown(GLFW.GLFW_KEY_RIGHT)) keyPressed = ArrowKeys.RIGHT;
+ if (isKeyDown(GLFW.GLFW_KEY_DOWN)) keyPressed = ArrowKeys.DOWN;
+ if (isKeyDown(GLFW.GLFW_KEY_UP)) keyPressed = ArrowKeys.UP;
+
+ if (keyPressed == ArrowKeys.NONE) {
+ lastKey = ArrowKeys.NONE;
+ return;
+ }
+ if (keyPressed != lastKey) {
+ lastKey = keyPressed;
+ keyDownTimeTicks = 0;
+ } else {
+ ++keyDownTimeTicks;
+ final int INITIAL_PAUSE_TICKS = 10; // wait 10 ticks before repeating
+ if (keyDownTimeTicks < INITIAL_PAUSE_TICKS) return;
+ }
+ keyPressCallback.keyPressed(keyPressed);
+ }
+
+ static boolean isKeyDown(int key) {
+ return GLFW.glfwGetKey(Minecraft.getInstance().getWindow().getWindow(), key) == GLFW.GLFW_PRESS;
+ }
+
+ public enum ArrowKeys {NONE, UP, DOWN, LEFT, RIGHT}
+
+ }
+
+}
diff --git a/common/src/main/java/itemtransformhelper/ModelBakeEventHandler.java b/common/src/main/java/itemtransformhelper/ModelBakeEventHandler.java
new file mode 100644
index 00000000..68cabc72
--- /dev/null
+++ b/common/src/main/java/itemtransformhelper/ModelBakeEventHandler.java
@@ -0,0 +1,51 @@
+package itemtransformhelper;
+
+import java.util.Map;
+import net.minecraft.client.renderer.block.model.ItemTransform;
+import net.minecraft.client.renderer.block.model.ItemTransforms;
+import net.minecraft.client.resources.model.BakedModel;
+import net.minecraft.resources.ResourceLocation;
+
+/**
+ * User: The Grey Ghost
+ * Date: 20/01/2015
+ * We use the ModelBakeEvent to iterate through all the registered models, wrap each one in an
+ * ItemModelFlexibleCamera, and write it
+ * back into the registry.
+ * Each wrapped model gets a reference to ModelBakeEventHandler::itemOverrideLink.
+ * Later, we can alter the members of itemOverrideLink to change the ItemCameraTransforms for a desired Item
+ */
+public class ModelBakeEventHandler {
+
+ private final ItemModelFlexibleCamera.UpdateLink itemOverrideLink = new ItemModelFlexibleCamera.UpdateLink();
+
+ public ModelBakeEventHandler() {
+ itemOverrideLink.forcedTransform = new ItemTransforms(
+ ItemTransform.NO_TRANSFORM, ItemTransform.NO_TRANSFORM,
+ ItemTransform.NO_TRANSFORM, ItemTransform.NO_TRANSFORM,
+ ItemTransform.NO_TRANSFORM, ItemTransform.NO_TRANSFORM,
+ ItemTransform.NO_TRANSFORM, ItemTransform.NO_TRANSFORM);
+ }
+
+ public void modelBakeEvent(Map modelRegistry) {
+ for (ResourceLocation modelKey : modelRegistry.keySet()) {
+ BakedModel bakedModel = modelRegistry.get(modelKey);
+ ItemModelFlexibleCamera wrappedModel = ItemModelFlexibleCamera.create(bakedModel, itemOverrideLink);
+ modelRegistry.put(modelKey, wrappedModel);
+ }
+
+ ItemTransformHelper.logger.warn("Warning - The Item Transform Helper replaces your BakedModels with a "
+ + "wrapped version, this");
+ ItemTransformHelper.logger.warn(" is done even when the helper is not in your hotbar, and might cause "
+ + "problems if your");
+ ItemTransformHelper.logger.warn(" BakedModel implements an interface ItemTransformHelper doesn't know about"
+ + ".");
+ ItemTransformHelper.logger.warn(" I recommend you disable the mod when you're not actively using it to "
+ + "transform your items.");
+ }
+
+ public ItemModelFlexibleCamera.UpdateLink getItemOverrideLink() {
+ return itemOverrideLink;
+ }
+
+}
diff --git a/common/src/main/java/itemtransformhelper/StartupClientOnly.java b/common/src/main/java/itemtransformhelper/StartupClientOnly.java
new file mode 100644
index 00000000..1f87de88
--- /dev/null
+++ b/common/src/main/java/itemtransformhelper/StartupClientOnly.java
@@ -0,0 +1,29 @@
+package itemtransformhelper;
+
+import dev.architectury.injectables.annotations.ExpectPlatform;
+
+/**
+ * User: The Grey Ghost
+ * Date: 24/12/2014
+ *
+ * The Startup classes for this example are called during startup, in the following order:
+ * preInitCommon
+ * preInitClientOnly
+ * initCommon
+ * initClientOnly
+ * postInitCommon
+ * postInitClientOnly
+ * See MinecraftByExample class for more information
+ */
+public class StartupClientOnly {
+
+ public static final ModelBakeEventHandler modelBakeEventHandler = new ModelBakeEventHandler();
+ public static final ClientTickHandler clientTickHandler = new ClientTickHandler();
+ public static final MenuItemCameraTransforms menuItemCameraTransforms = new MenuItemCameraTransforms();
+
+ @ExpectPlatform
+ public static void clientSetup() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/common/src/main/java/itemtransformhelper/StartupCommon.java b/common/src/main/java/itemtransformhelper/StartupCommon.java
new file mode 100644
index 00000000..92696c48
--- /dev/null
+++ b/common/src/main/java/itemtransformhelper/StartupCommon.java
@@ -0,0 +1,43 @@
+package itemtransformhelper;
+
+import dev.architectury.registry.CreativeTabRegistry;
+import dev.architectury.registry.registries.DeferredRegister;
+import dev.architectury.registry.registries.RegistrySupplier;
+import net.minecraft.core.Registry;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.item.CreativeModeTab;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.ItemStack;
+
+import static itemtransformhelper.ItemTransformHelper.MODID;
+
+/**
+ * User: The Grey Ghost
+ * Date: 24/12/2014
+ *
+ * The Startup classes for this example are called during startup, in the following order:
+ * preInitCommon
+ * preInitClientOnly
+ * initCommon
+ * initClientOnly
+ * postInitCommon
+ * postInitClientOnly
+ * See MinecraftByExample class for more information
+ */
+public class StartupCommon {
+
+ // Registries
+ public static final DeferredRegister- ITEMS = DeferredRegister.create(MODID, Registry.ITEM_REGISTRY);
+
+ // Items
+ public static final RegistrySupplier ITEM_CAMERA = ITEMS.register("item_camera", ItemCamera::new);
+
+ // Item Groups
+ public static final CreativeModeTab ITH_ITEM_GROUP =
+ CreativeTabRegistry.create(new ResourceLocation(MODID, "items"), () -> new ItemStack(ITEM_CAMERA.get()));
+
+ public static void init() {
+ ITEMS.register();
+ }
+
+}
diff --git a/src/main/java/itemtransformhelper/Notes.txt b/common/src/main/resources/Notes.txt
similarity index 59%
rename from src/main/java/itemtransformhelper/Notes.txt
rename to common/src/main/resources/Notes.txt
index 8ac0cf56..ca4b195a 100644
--- a/src/main/java/itemtransformhelper/Notes.txt
+++ b/common/src/main/resources/Notes.txt
@@ -1,20 +1,20 @@
-ITEM_TRANSFORM_HELPER
+Item Transform Helper
-When you create a custom item, you need to provide ItemCameraTransforms for it. This example is an interactive
- tool to help you get the transforms right.
+When you create a custom item, you need to provide ItemCameraTransforms for it. This project is an interactive
+ tool to help you get the transforms right by interactively adjusting them.
How to use:
-1) Place the ItemCamera somewhere in the player's hotbar
+1) Place the Camera item somewhere in the player's hotbar
2) Hold the Item you want to modify in the player's hand
3) Use the up/down keys to move up and down the menu.
-4) Use the left/right keys to edit the value (eg scaleX)
-5) To select a different view (eg first person, third person) use left/right to change the VIEW menu item.
+4) Use the left/right keys to edit the value (e.g. scaleX)
+5) To select a different view (e.g. first person, third person) use left/right to change the VIEW menu item.
6) To modify the transform for an item on the ground:
- a) throw your Item onto the ground, and then put another copy of your Item into the player's hand
+ a) Throw your Item onto the ground, and then put another copy of your Item into the player's hand
b) Use left/right to change the VIEW menu item to grnd
Use the same technique for items in the gui, on your head (eg pumpkin), fixed (in picture frames), or in the
player's left hand.
-7) To reset the parameters for the current view, select the RESET menu item and press left or right. Use RESET ALL (RSTALL) to reset the parameters for all views.
+7) To reset the parameters for the current view, select the RESET menu item and press left or right. Use RESET ALL (RSTALL) to reset the parameters for all views.
You can also copy parameters from a vanilla item to your custom item:
a) Hold the vanilla item in your hand
b) Select RESET or RSTALL, press left or right.
@@ -25,7 +25,7 @@ How to use:
The item will appear in the Helpers tab in the creative inventory.
For background information on
-- items: see here http://greyminecraftcoder.blogspot.com/2013/12/items.html
-- rendering items: see here http://greyminecraftcoder.blogspot.com.au/2014/12/item-rendering-18.html
+- Items: see here https://greyminecraftcoder.blogspot.com/2013/12/items.html
+- Rendering items: see here https://greyminecraftcoder.blogspot.com/2014/12/item-rendering-18.html
- This link describes the structure of the JSON Item Model file (see the Item Models section halfway down):
- http://minecraft.gamepedia.com/Block_models
+ https://minecraft.fandom.com/wiki/Model#Item_models
diff --git a/common/src/main/resources/assets/itemtransformhelper/lang/en_us.json b/common/src/main/resources/assets/itemtransformhelper/lang/en_us.json
new file mode 100644
index 00000000..3dfc125b
--- /dev/null
+++ b/common/src/main/resources/assets/itemtransformhelper/lang/en_us.json
@@ -0,0 +1,4 @@
+{
+ "item.itemtransformhelper.item_camera": "Item Transform Helper",
+ "itemGroup.itemtransformhelper.items": "Item Transform Helper"
+}
diff --git a/common/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json b/common/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json
new file mode 100644
index 00000000..464edba8
--- /dev/null
+++ b/common/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json
@@ -0,0 +1,144 @@
+{
+ "parent": "builtin/generated",
+ "textures": {
+ "layer0": "itemtransformhelper:items/item_camera_icon"
+ },
+ "display": {
+ "thirdperson_righthand": {
+ "rotation": [
+ 0,
+ 0,
+ 0
+ ],
+ "translation": [
+ 0.00,
+ 3.00,
+ 1.00
+ ],
+ "scale": [
+ 0.55,
+ 0.55,
+ 0.55
+ ]
+ },
+ "thirdperson_lefthand": {
+ "rotation": [
+ 0,
+ 0,
+ 0
+ ],
+ "translation": [
+ 0.00,
+ 3.00,
+ 1.00
+ ],
+ "scale": [
+ 0.55,
+ 0.55,
+ 0.55
+ ]
+ },
+ "firstperson_righthand": {
+ "rotation": [
+ -25,
+ -90,
+ 0
+ ],
+ "translation": [
+ 1.13,
+ 3.20,
+ 1.13
+ ],
+ "scale": [
+ 0.68,
+ 0.68,
+ 0.68
+ ]
+ },
+ "firstperson_lefthand": {
+ "rotation": [
+ -25,
+ -90,
+ 0
+ ],
+ "translation": [
+ 1.13,
+ 3.20,
+ 1.13
+ ],
+ "scale": [
+ 0.68,
+ 0.68,
+ 0.68
+ ]
+ },
+ "gui": {
+ "rotation": [
+ 0,
+ 0,
+ 0
+ ],
+ "translation": [
+ 0.00,
+ 0.00,
+ 0.00
+ ],
+ "scale": [
+ 1.00,
+ 1.00,
+ 1.00
+ ]
+ },
+ "head": {
+ "rotation": [
+ -180,
+ -0,
+ -180
+ ],
+ "translation": [
+ -0.00,
+ 13.00,
+ 7.00
+ ],
+ "scale": [
+ 1.00,
+ 1.00,
+ 1.00
+ ]
+ },
+ "fixed": {
+ "rotation": [
+ 0,
+ 0,
+ 0
+ ],
+ "translation": [
+ 0.00,
+ 0.00,
+ 0.00
+ ],
+ "scale": [
+ 1.00,
+ 1.00,
+ 1.00
+ ]
+ },
+ "ground": {
+ "rotation": [
+ 0,
+ 0,
+ 0
+ ],
+ "translation": [
+ 0.00,
+ 2.00,
+ 0.00
+ ],
+ "scale": [
+ 0.50,
+ 0.50,
+ 0.50
+ ]
+ }
+ }
+}
diff --git a/src/main/resources/assets/itemtransformhelper/textures/items/item_camera_icon.png b/common/src/main/resources/assets/itemtransformhelper/textures/items/item_camera_icon.png
similarity index 100%
rename from src/main/resources/assets/itemtransformhelper/textures/items/item_camera_icon.png
rename to common/src/main/resources/assets/itemtransformhelper/textures/items/item_camera_icon.png
diff --git a/fabric-like/build.gradle b/fabric-like/build.gradle
new file mode 100644
index 00000000..ef34aacc
--- /dev/null
+++ b/fabric-like/build.gradle
@@ -0,0 +1,12 @@
+architectury {
+ common(rootProject.enabled_platforms.split(","))
+}
+
+dependencies {
+ modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
+ modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}"
+ // Remove the next line if you don't want to depend on the API
+ modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}"
+
+ compileClasspath(project(path: ":common", configuration: "namedElements")) { transitive false }
+}
diff --git a/fabric-like/src/main/java/itemtransformhelper.fabriclike/ItemTransformHelperFabricLike.java b/fabric-like/src/main/java/itemtransformhelper.fabriclike/ItemTransformHelperFabricLike.java
new file mode 100644
index 00000000..5ce92428
--- /dev/null
+++ b/fabric-like/src/main/java/itemtransformhelper.fabriclike/ItemTransformHelperFabricLike.java
@@ -0,0 +1,13 @@
+package itemtransformhelper.fabriclike;
+
+import itemtransformhelper.ItemTransformHelper;
+import itemtransformhelper.StartupClientOnly;
+
+public class ItemTransformHelperFabricLike {
+
+ public static void init() {
+ ItemTransformHelper.init();
+ StartupClientOnly.clientSetup();
+ }
+
+}
diff --git a/fabric/build.gradle b/fabric/build.gradle
new file mode 100644
index 00000000..3c8f1520
--- /dev/null
+++ b/fabric/build.gradle
@@ -0,0 +1,77 @@
+plugins {
+ id "com.github.johnrengelman.shadow" version "7.1.2"
+}
+
+architectury {
+ platformSetupLoomIde()
+ fabric()
+}
+
+configurations {
+ common
+ shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
+ compileClasspath.extendsFrom common
+ runtimeClasspath.extendsFrom common
+ developmentFabric.extendsFrom common
+}
+
+dependencies {
+ modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
+ modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}"
+ // Remove the next line if you don't want to depend on the API
+ modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}"
+
+ common(project(path: ":common", configuration: "namedElements")) { transitive false }
+ shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false }
+ common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false }
+ shadowCommon(project(path: ":fabric-like", configuration: "transformProductionFabric")) { transitive false }
+}
+
+processResources {
+ inputs.property "version", project.version
+
+ filesMatching("fabric.mod.json") {
+ expand "version": project.version
+ }
+}
+
+shadowJar {
+ configurations = [project.configurations.shadowCommon]
+ classifier "dev-shadow"
+}
+
+remapJar {
+ input.set shadowJar.archiveFile
+ dependsOn shadowJar
+ classifier null
+}
+
+jar {
+ classifier "dev"
+}
+
+sourcesJar {
+ def commonSources = project(":common").sourcesJar
+ dependsOn commonSources
+ from commonSources.archiveFile.map { zipTree(it) }
+}
+
+components.java {
+ withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
+ skip()
+ }
+}
+
+publishing {
+ publications {
+ mavenFabric(MavenPublication) {
+ artifactId = rootProject.archives_base_name + "-" + project.name
+ from components.java
+ }
+ }
+
+ // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
+ repositories {
+ // Add repositories to publish to here.
+ }
+}
diff --git a/fabric/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java b/fabric/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java
new file mode 100644
index 00000000..088913b1
--- /dev/null
+++ b/fabric/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java
@@ -0,0 +1,17 @@
+package itemtransformhelper.fabric;
+
+import itemtransformhelper.ItemModelFlexibleCamera;
+import net.minecraft.client.resources.model.BakedModel;
+
+public class ItemModelFlexibleCameraImpl extends ItemModelFlexibleCamera {
+
+ public ItemModelFlexibleCameraImpl(BakedModel originalModel, UpdateLink updateLink) {
+ super(originalModel, updateLink);
+ }
+
+ public static ItemModelFlexibleCamera create(BakedModel originalModel,
+ ItemModelFlexibleCamera.UpdateLink updateLink) {
+ return new ItemModelFlexibleCameraImpl(originalModel, updateLink);
+ }
+
+}
diff --git a/fabric/src/main/java/itemtransformhelper/fabric/ItemTransformHelperFabric.java b/fabric/src/main/java/itemtransformhelper/fabric/ItemTransformHelperFabric.java
new file mode 100644
index 00000000..333f8a66
--- /dev/null
+++ b/fabric/src/main/java/itemtransformhelper/fabric/ItemTransformHelperFabric.java
@@ -0,0 +1,13 @@
+package itemtransformhelper.fabric;
+
+import itemtransformhelper.fabriclike.ItemTransformHelperFabricLike;
+import net.fabricmc.api.ModInitializer;
+
+public class ItemTransformHelperFabric implements ModInitializer {
+
+ @Override
+ public void onInitialize() {
+ ItemTransformHelperFabricLike.init();
+ }
+
+}
diff --git a/fabric/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java b/fabric/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java
new file mode 100644
index 00000000..3db5b742
--- /dev/null
+++ b/fabric/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java
@@ -0,0 +1,19 @@
+package itemtransformhelper.fabric;
+
+import itemtransformhelper.HUDTextRenderer;
+import itemtransformhelper.MenuItemCameraTransforms;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+public class MenuItemCameraTransformsImpl {
+
+ public static Queue RENDERERS = new ConcurrentLinkedQueue<>();
+ public static Queue HANDLERS = new ConcurrentLinkedQueue<>();
+
+ public static void registerListeners(HUDTextRenderer hudTextRenderer,
+ MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler) {
+ RENDERERS.offer(hudTextRenderer);
+ HANDLERS.offer(menuKeyHandler);
+ }
+
+}
diff --git a/fabric/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java b/fabric/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java
new file mode 100644
index 00000000..2ffd9ac4
--- /dev/null
+++ b/fabric/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java
@@ -0,0 +1,11 @@
+package itemtransformhelper.fabric;
+
+public class StartupClientOnlyImpl {
+
+ public static void clientSetup() {
+ // Nothing to do here as this handled by these mixins:
+ // BakedModelManagerMixin
+ // MinecraftClientMixin
+ }
+
+}
diff --git a/fabric/src/main/java/itemtransformhelper/fabric/mixin/GuiMixin.java b/fabric/src/main/java/itemtransformhelper/fabric/mixin/GuiMixin.java
new file mode 100644
index 00000000..236503be
--- /dev/null
+++ b/fabric/src/main/java/itemtransformhelper/fabric/mixin/GuiMixin.java
@@ -0,0 +1,21 @@
+package itemtransformhelper.fabric.mixin;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import net.minecraft.client.gui.Gui;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import static itemtransformhelper.fabric.MenuItemCameraTransformsImpl.RENDERERS;
+
+@Mixin(Gui.class)
+public class GuiMixin {
+
+ @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;renderEffects"
+ + "(Lcom/mojang/blaze3d/vertex/PoseStack;)V"))
+ public void render(PoseStack matrices, float tickDelta, CallbackInfo ci) {
+ RENDERERS.forEach(r -> r.displayHUDText(matrices));
+ }
+
+}
diff --git a/fabric/src/main/java/itemtransformhelper/fabric/mixin/MinecraftMixin.java b/fabric/src/main/java/itemtransformhelper/fabric/mixin/MinecraftMixin.java
new file mode 100644
index 00000000..0dad52d4
--- /dev/null
+++ b/fabric/src/main/java/itemtransformhelper/fabric/mixin/MinecraftMixin.java
@@ -0,0 +1,24 @@
+package itemtransformhelper.fabric.mixin;
+
+import itemtransformhelper.MenuItemCameraTransforms;
+import net.minecraft.client.Minecraft;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import static itemtransformhelper.StartupClientOnly.clientTickHandler;
+import static itemtransformhelper.fabric.MenuItemCameraTransformsImpl.HANDLERS;
+
+@Mixin(Minecraft.class)
+public class MinecraftMixin {
+
+ @Inject(method = "tick",
+ at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;"
+ + ")V"))
+ public void tick(CallbackInfo ci) {
+ clientTickHandler.clientTickEvent();
+ HANDLERS.forEach(MenuItemCameraTransforms.MenuKeyHandler::clientTick);
+ }
+
+}
diff --git a/fabric/src/main/java/itemtransformhelper/fabric/mixin/ModelManagerMixin.java b/fabric/src/main/java/itemtransformhelper/fabric/mixin/ModelManagerMixin.java
new file mode 100644
index 00000000..c44b7aae
--- /dev/null
+++ b/fabric/src/main/java/itemtransformhelper/fabric/mixin/ModelManagerMixin.java
@@ -0,0 +1,33 @@
+package itemtransformhelper.fabric.mixin;
+
+import java.util.Map;
+import net.minecraft.client.resources.model.BakedModel;
+import net.minecraft.client.resources.model.ModelBakery;
+import net.minecraft.client.resources.model.ModelManager;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.packs.resources.ResourceManager;
+import net.minecraft.util.profiling.ProfilerFiller;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import static itemtransformhelper.StartupClientOnly.modelBakeEventHandler;
+
+@Mixin(ModelManager.class)
+public class ModelManagerMixin {
+
+ @Shadow
+ private Map bakedRegistry;
+
+ @Inject(method = "apply(Lnet/minecraft/client/resources/model/ModelBakery;"
+ + "Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V",
+ at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush"
+ + "(Ljava/lang/String;)V"))
+ public void apply(ModelBakery modelLoader, ResourceManager resourceManager, ProfilerFiller profiler,
+ CallbackInfo ci) {
+ modelBakeEventHandler.modelBakeEvent(bakedRegistry);
+ }
+
+}
diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json
new file mode 100644
index 00000000..ef9c522c
--- /dev/null
+++ b/fabric/src/main/resources/fabric.mod.json
@@ -0,0 +1,34 @@
+{
+ "schemaVersion": 1,
+ "id": "itemtransformhelper",
+ "version": "${version}",
+ "name": "Item Transform Helper",
+ "description": "Interactively change the position, scale, and rotation of an item.",
+ "authors": [
+ "TGG",
+ "ThexXTURBOXx",
+ "Romejanic",
+ "lehjr"
+ ],
+ "contact": {
+ "homepage": "https://www.planetminecraft.com/mod/item-transform-helper---interactively-rotate-scale-translate/",
+ "sources": "https://github.com/TheGreyGhost/ItemTransformHelper",
+ "issues": "https://github.com/TheGreyGhost/ItemTransformHelper/issues"
+ },
+ "license": "All rights reserved",
+ "environment": "*",
+ "entrypoints": {
+ "main": [
+ "itemtransformhelper.fabric.ItemTransformHelperFabric"
+ ]
+ },
+ "mixins": [
+ "itemtransformhelper.mixins.json"
+ ],
+ "depends": {
+ "minecraft": ">=1.19",
+ "fabricloader": ">=0.14.7",
+ "fabric": "*",
+ "architectury": ">=5.6.22"
+ }
+}
diff --git a/fabric/src/main/resources/itemtransformhelper.mixins.json b/fabric/src/main/resources/itemtransformhelper.mixins.json
new file mode 100644
index 00000000..adf02d3b
--- /dev/null
+++ b/fabric/src/main/resources/itemtransformhelper.mixins.json
@@ -0,0 +1,16 @@
+{
+ "required": true,
+ "minVersion": "0.8",
+ "package": "itemtransformhelper.fabric.mixin",
+ "compatibilityLevel": "JAVA_17",
+ "client": [
+ "GuiMixin",
+ "MinecraftMixin",
+ "ModelManagerMixin"
+ ],
+ "mixins": [],
+ "server": [],
+ "injectors": {
+ "defaultRequire": 1
+ }
+}
diff --git a/forge/build.gradle b/forge/build.gradle
new file mode 100644
index 00000000..8b93a128
--- /dev/null
+++ b/forge/build.gradle
@@ -0,0 +1,76 @@
+plugins {
+ id "com.github.johnrengelman.shadow" version "7.1.2"
+}
+
+architectury {
+ platformSetupLoomIde()
+ forge()
+}
+
+configurations {
+ common
+ shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
+ compileClasspath.extendsFrom common
+ runtimeClasspath.extendsFrom common
+ developmentForge.extendsFrom common
+}
+
+dependencies {
+ forge "net.minecraftforge:forge:${rootProject.forge_version}"
+ // Remove the next line if you don't want to depend on the API
+ modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}"
+
+ common(project(path: ":common", configuration: "namedElements")) { transitive false }
+ shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false }
+}
+
+processResources {
+ inputs.property "version", project.version
+
+ filesMatching("META-INF/mods.toml") {
+ expand "version": project.version
+ }
+}
+
+shadowJar {
+ exclude "fabric.mod.json"
+
+ configurations = [project.configurations.shadowCommon]
+ classifier "dev-shadow"
+}
+
+remapJar {
+ input.set shadowJar.archiveFile
+ dependsOn shadowJar
+ classifier null
+}
+
+jar {
+ classifier "dev"
+}
+
+sourcesJar {
+ def commonSources = project(":common").sourcesJar
+ dependsOn commonSources
+ from commonSources.archiveFile.map { zipTree(it) }
+}
+
+components.java {
+ withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
+ skip()
+ }
+}
+
+publishing {
+ publications {
+ mavenForge(MavenPublication) {
+ artifactId = rootProject.archives_base_name + "-" + project.name
+ from components.java
+ }
+ }
+
+ // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
+ repositories {
+ // Add repositories to publish to here.
+ }
+}
diff --git a/forge/gradle.properties b/forge/gradle.properties
new file mode 100644
index 00000000..a58ba141
--- /dev/null
+++ b/forge/gradle.properties
@@ -0,0 +1 @@
+loom.platform = forge
diff --git a/forge/src/main/java/itemtransformhelper/forge/ItemModelFlexibleCameraImpl.java b/forge/src/main/java/itemtransformhelper/forge/ItemModelFlexibleCameraImpl.java
new file mode 100644
index 00000000..bcba8366
--- /dev/null
+++ b/forge/src/main/java/itemtransformhelper/forge/ItemModelFlexibleCameraImpl.java
@@ -0,0 +1,39 @@
+package itemtransformhelper.forge;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.math.Transformation;
+import itemtransformhelper.ItemModelFlexibleCamera;
+import net.minecraft.client.renderer.block.model.ItemTransforms;
+import net.minecraft.client.resources.model.BakedModel;
+import net.minecraftforge.common.model.TransformationHelper;
+import org.jetbrains.annotations.NotNull;
+
+public class ItemModelFlexibleCameraImpl extends ItemModelFlexibleCamera {
+
+ public ItemModelFlexibleCameraImpl(BakedModel originalModel, UpdateLink updateLink) {
+ super(originalModel, updateLink);
+ }
+
+ public static ItemModelFlexibleCamera create(BakedModel originalModel,
+ ItemModelFlexibleCamera.UpdateLink updateLink) {
+ return new ItemModelFlexibleCameraImpl(originalModel, updateLink);
+ }
+
+ @NotNull
+ @Override
+ @SuppressWarnings("deprecation")
+ public BakedModel handlePerspective(@NotNull ItemTransforms.TransformType cameraTransformType,
+ @NotNull PoseStack poseStack) {
+ if (updateLink.itemModelToOverride == this) {
+ Transformation tr =
+ TransformationHelper.toTransformation(getTransforms().getTransform(cameraTransformType));
+ if (!tr.isIdentity()) {
+ tr.push(poseStack);
+ }
+ return this;
+ } else {
+ return super.handlePerspective(cameraTransformType, poseStack);
+ }
+ }
+
+}
diff --git a/src/main/java/itemtransformhelper/ItemTransformHelper.java b/forge/src/main/java/itemtransformhelper/forge/ItemTransformHelperForge.java
similarity index 66%
rename from src/main/java/itemtransformhelper/ItemTransformHelper.java
rename to forge/src/main/java/itemtransformhelper/forge/ItemTransformHelperForge.java
index f99b0d05..a4a4a1b2 100644
--- a/src/main/java/itemtransformhelper/ItemTransformHelper.java
+++ b/forge/src/main/java/itemtransformhelper/forge/ItemTransformHelperForge.java
@@ -1,20 +1,22 @@
-package itemtransformhelper;
+package itemtransformhelper.forge;
+import dev.architectury.platform.forge.EventBuses;
+import itemtransformhelper.ItemTransformHelper;
+import itemtransformhelper.StartupClientOnly;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-@Mod(ItemTransformHelper.MODID)
-public class ItemTransformHelper {
- public static final String MODID = "itemtransformhelper";
- public static final Logger logger = LogManager.getLogger(MODID);
+import static itemtransformhelper.ItemTransformHelper.MODID;
- public ItemTransformHelper() {
+@Mod(MODID)
+public class ItemTransformHelperForge {
+
+ public ItemTransformHelperForge() {
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
+ EventBuses.registerModEventBus(MODID, modEventBus);
// Register the setup method for modloading
modEventBus.addListener(this::setup);
@@ -22,7 +24,7 @@ public ItemTransformHelper() {
// Register the doClientStuff method for modloading
modEventBus.addListener(this::clientSetup);
- StartupCommon.ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
+ ItemTransformHelper.init();
}
private void setup(final FMLCommonSetupEvent event) {
@@ -32,4 +34,5 @@ private void setup(final FMLCommonSetupEvent event) {
public void clientSetup(final FMLClientSetupEvent event) {
StartupClientOnly.clientSetup();
}
+
}
diff --git a/forge/src/main/java/itemtransformhelper/forge/MenuItemCameraTransformsImpl.java b/forge/src/main/java/itemtransformhelper/forge/MenuItemCameraTransformsImpl.java
new file mode 100644
index 00000000..a0ddbe65
--- /dev/null
+++ b/forge/src/main/java/itemtransformhelper/forge/MenuItemCameraTransformsImpl.java
@@ -0,0 +1,38 @@
+package itemtransformhelper.forge;
+
+import itemtransformhelper.HUDTextRenderer;
+import itemtransformhelper.MenuItemCameraTransforms;
+import net.minecraftforge.client.event.RenderGameOverlayEvent;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.TickEvent;
+import net.minecraftforge.eventbus.api.SubscribeEvent;
+
+public class MenuItemCameraTransformsImpl {
+
+ private final HUDTextRenderer hudTextRenderer;
+ private final MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler;
+
+ public MenuItemCameraTransformsImpl(HUDTextRenderer hudTextRenderer,
+ MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler) {
+ this.hudTextRenderer = hudTextRenderer;
+ this.menuKeyHandler = menuKeyHandler;
+ }
+
+ public static void registerListeners(HUDTextRenderer hudTextRenderer,
+ MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler) {
+ MinecraftForge.EVENT_BUS.register(new MenuItemCameraTransformsImpl(hudTextRenderer, menuKeyHandler));
+ }
+
+ @SubscribeEvent
+ public void displayHUDText(RenderGameOverlayEvent.Text event) {
+ hudTextRenderer.displayHUDText(event.getPoseStack());
+ }
+
+ @SubscribeEvent
+ public void clientTick(TickEvent.ClientTickEvent event) {
+ if (event.phase == TickEvent.Phase.START) {
+ menuKeyHandler.clientTick();
+ }
+ }
+
+}
diff --git a/forge/src/main/java/itemtransformhelper/forge/StartupClientOnlyImpl.java b/forge/src/main/java/itemtransformhelper/forge/StartupClientOnlyImpl.java
new file mode 100644
index 00000000..70fba62e
--- /dev/null
+++ b/forge/src/main/java/itemtransformhelper/forge/StartupClientOnlyImpl.java
@@ -0,0 +1,32 @@
+package itemtransformhelper.forge;
+
+import net.minecraftforge.client.event.ModelBakeEvent;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.TickEvent;
+import net.minecraftforge.eventbus.api.SubscribeEvent;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
+
+import static itemtransformhelper.StartupClientOnly.clientTickHandler;
+import static itemtransformhelper.StartupClientOnly.modelBakeEventHandler;
+
+public class StartupClientOnlyImpl {
+
+ public static void clientSetup() {
+ StartupClientOnlyImpl instance = new StartupClientOnlyImpl();
+ FMLJavaModLoadingContext.get().getModEventBus().addListener(instance::modelBakeEvent);
+ MinecraftForge.EVENT_BUS.register(instance);
+ }
+
+ @SubscribeEvent
+ public void modelBakeEvent(ModelBakeEvent event) {
+ modelBakeEventHandler.modelBakeEvent(event.getModelRegistry());
+ }
+
+ @SubscribeEvent
+ public void clientTickEvent(TickEvent.ClientTickEvent event) {
+ if (event.phase == TickEvent.Phase.START) {
+ clientTickHandler.clientTickEvent();
+ }
+ }
+
+}
diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml
new file mode 100644
index 00000000..ba0f2e8c
--- /dev/null
+++ b/forge/src/main/resources/META-INF/mods.toml
@@ -0,0 +1,34 @@
+modLoader = "javafml"
+loaderVersion = "[41,)"
+issueTrackerURL = "https://github.com/TheGreyGhost/ItemTransformHelper"
+license = "All rights reserved"
+
+[[mods]]
+modId = "itemtransformhelper"
+version = "${version}"
+displayName = "Item Transform Helper"
+authors = "TGG, ThexXTURBOXx, Romejanic, lehjr"
+description = '''
+Interactively change the position, scale, and rotation of an item.
+'''
+
+[[dependencies.itemtransformhelper]]
+modId = "forge"
+mandatory = true
+versionRange = "[41,)"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies.itemtransformhelper]]
+modId = "minecraft"
+mandatory = true
+versionRange = "[1.19,)"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies.itemtransformhelper]]
+modId = "architectury"
+mandatory = true
+versionRange = "[5.6.22,)"
+ordering = "AFTER"
+side = "BOTH"
diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta
new file mode 100644
index 00000000..276f749e
--- /dev/null
+++ b/forge/src/main/resources/pack.mcmeta
@@ -0,0 +1,6 @@
+{
+ "pack": {
+ "description": "ItemTransformHelper resources",
+ "pack_format": 9
+ }
+}
diff --git a/gradle.properties b/gradle.properties
index 878bf1f7..15f13887 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,18 @@
-# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
-# This is required to provide enough memory for the Minecraft decompilation process.
-org.gradle.jvmargs=-Xmx3G
-org.gradle.daemon=false
\ No newline at end of file
+org.gradle.jvmargs = -Xmx4G
+
+minecraft_version = 1.19
+enabled_platforms = quilt,fabric,forge
+
+archives_base_name = itemtransformhelper
+mod_version = 1.0
+maven_group = thegreyghost
+
+architectury_version = 5.6.22
+
+fabric_loader_version = 0.14.7
+fabric_api_version = 0.55.3+1.19
+
+forge_version = 1.19-41.0.17
+
+quilt_loader_version = 0.17.0
+quilt_fabric_api_version = 2.0.0-alpha.2+0.55.3-1.19
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 7a3265ee..41d9927a 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 1d5b29fb..aa991fce 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip
diff --git a/gradlew b/gradlew
index cccdd3d5..1b6c7873 100755
--- a/gradlew
+++ b/gradlew
@@ -1,78 +1,129 @@
-#!/usr/bin/env sh
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
##############################################################################
-##
-## Gradle start up script for UN*X
-##
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
##############################################################################
# Attempt to set APP_HOME
+
# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
warn () {
echo "$*"
-}
+} >&2
die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
+ JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -89,84 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
fi
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
fi
- i=$((i+1))
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
fi
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=$(save "$@")
-
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
- cd "$(dirname "$0")"
-fi
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index e95643d6..ac1b06f9 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,3 +1,19 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -35,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,28 +64,14 @@ echo location of your Java installation.
goto fail
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/quilt/build.gradle b/quilt/build.gradle
new file mode 100644
index 00000000..3fb1bf54
--- /dev/null
+++ b/quilt/build.gradle
@@ -0,0 +1,88 @@
+plugins {
+ id "com.github.johnrengelman.shadow" version "7.1.2"
+}
+
+repositories {
+ maven { url "https://maven.quiltmc.org/repository/release/" }
+}
+
+architectury {
+ platformSetupLoomIde()
+ loader("quilt")
+}
+
+configurations {
+ common
+ shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
+ compileClasspath.extendsFrom common
+ runtimeClasspath.extendsFrom common
+ developmentQuilt.extendsFrom common
+}
+
+dependencies {
+ modImplementation "org.quiltmc:quilt-loader:${rootProject.quilt_loader_version}"
+ modApi "org.quiltmc.quilted-fabric-api:quilted-fabric-api:${rootProject.quilt_fabric_api_version}"
+ // Remove the next few lines if you don't want to depend on the API
+ modApi("dev.architectury:architectury-fabric:${rootProject.architectury_version}") {
+ // We must not pull Fabric Loader from Architectury Fabric
+ exclude group: "net.fabricmc"
+ exclude group: "net.fabricmc.fabric-api"
+ }
+
+ common(project(path: ":common", configuration: "namedElements")) { transitive false }
+ shadowCommon(project(path: ":common", configuration: "transformProductionQuilt")) { transitive false }
+ common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false }
+ shadowCommon(project(path: ":fabric-like", configuration: "transformProductionQuilt")) { transitive false }
+}
+
+processResources {
+ inputs.property "group", rootProject.maven_group
+ inputs.property "version", project.version
+
+ filesMatching("quilt.mod.json") {
+ expand "group": rootProject.maven_group,
+ "version": project.version
+ }
+}
+
+shadowJar {
+ configurations = [project.configurations.shadowCommon]
+ classifier "dev-shadow"
+}
+
+remapJar {
+ injectAccessWidener = true
+ input.set shadowJar.archiveFile
+ dependsOn shadowJar
+ classifier null
+}
+
+jar {
+ classifier "dev"
+}
+
+sourcesJar {
+ def commonSources = project(":common").sourcesJar
+ dependsOn commonSources
+ from commonSources.archiveFile.map { zipTree(it) }
+}
+
+components.java {
+ withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
+ skip()
+ }
+}
+
+publishing {
+ publications {
+ mavenQuilt(MavenPublication) {
+ artifactId = rootProject.archives_base_name + "-" + project.name
+ from components.java
+ }
+ }
+
+ // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
+ repositories {
+ // Add repositories to publish to here.
+ }
+}
diff --git a/quilt/gradle.properties b/quilt/gradle.properties
new file mode 100644
index 00000000..96758ce8
--- /dev/null
+++ b/quilt/gradle.properties
@@ -0,0 +1 @@
+loom.platform=quilt
\ No newline at end of file
diff --git a/quilt/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java b/quilt/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java
new file mode 100644
index 00000000..2781dda2
--- /dev/null
+++ b/quilt/src/main/java/itemtransformhelper/fabric/ItemModelFlexibleCameraImpl.java
@@ -0,0 +1,17 @@
+package itemtransformhelper.fabric;
+
+import itemtransformhelper.ItemModelFlexibleCamera;
+import net.minecraft.client.resources.model.BakedModel;
+
+public class ItemModelFlexibleCameraImpl extends ItemModelFlexibleCamera {
+
+ public ItemModelFlexibleCameraImpl(BakedModel originalModel, UpdateLink updateLink) {
+ super(originalModel, updateLink);
+ }
+
+ public static ItemModelFlexibleCamera create(BakedModel originalModel,
+ UpdateLink updateLink) {
+ return new ItemModelFlexibleCameraImpl(originalModel, updateLink);
+ }
+
+}
diff --git a/quilt/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java b/quilt/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java
new file mode 100644
index 00000000..3db5b742
--- /dev/null
+++ b/quilt/src/main/java/itemtransformhelper/fabric/MenuItemCameraTransformsImpl.java
@@ -0,0 +1,19 @@
+package itemtransformhelper.fabric;
+
+import itemtransformhelper.HUDTextRenderer;
+import itemtransformhelper.MenuItemCameraTransforms;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+public class MenuItemCameraTransformsImpl {
+
+ public static Queue RENDERERS = new ConcurrentLinkedQueue<>();
+ public static Queue HANDLERS = new ConcurrentLinkedQueue<>();
+
+ public static void registerListeners(HUDTextRenderer hudTextRenderer,
+ MenuItemCameraTransforms.MenuKeyHandler menuKeyHandler) {
+ RENDERERS.offer(hudTextRenderer);
+ HANDLERS.offer(menuKeyHandler);
+ }
+
+}
diff --git a/quilt/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java b/quilt/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java
new file mode 100644
index 00000000..2ffd9ac4
--- /dev/null
+++ b/quilt/src/main/java/itemtransformhelper/fabric/StartupClientOnlyImpl.java
@@ -0,0 +1,11 @@
+package itemtransformhelper.fabric;
+
+public class StartupClientOnlyImpl {
+
+ public static void clientSetup() {
+ // Nothing to do here as this handled by these mixins:
+ // BakedModelManagerMixin
+ // MinecraftClientMixin
+ }
+
+}
diff --git a/quilt/src/main/java/itemtransformhelper/quilt/ItemTransformHelperQuilt.java b/quilt/src/main/java/itemtransformhelper/quilt/ItemTransformHelperQuilt.java
new file mode 100644
index 00000000..ef8f7284
--- /dev/null
+++ b/quilt/src/main/java/itemtransformhelper/quilt/ItemTransformHelperQuilt.java
@@ -0,0 +1,14 @@
+package itemtransformhelper.quilt;
+
+import itemtransformhelper.fabriclike.ItemTransformHelperFabricLike;
+import org.quiltmc.loader.api.ModContainer;
+import org.quiltmc.qsl.base.api.entrypoint.ModInitializer;
+
+public class ItemTransformHelperQuilt implements ModInitializer {
+
+ @Override
+ public void onInitialize(ModContainer mod) {
+ ItemTransformHelperFabricLike.init();
+ }
+
+}
diff --git a/quilt/src/main/java/itemtransformhelper/quilt/mixin/GuiMixin.java b/quilt/src/main/java/itemtransformhelper/quilt/mixin/GuiMixin.java
new file mode 100644
index 00000000..1c3583f5
--- /dev/null
+++ b/quilt/src/main/java/itemtransformhelper/quilt/mixin/GuiMixin.java
@@ -0,0 +1,20 @@
+package itemtransformhelper.quilt.mixin;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import itemtransformhelper.fabric.MenuItemCameraTransformsImpl;
+import net.minecraft.client.gui.Gui;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(Gui.class)
+public class GuiMixin {
+
+ @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;renderEffects"
+ + "(Lcom/mojang/blaze3d/vertex/PoseStack;)V"))
+ public void render(PoseStack matrices, float tickDelta, CallbackInfo ci) {
+ MenuItemCameraTransformsImpl.RENDERERS.forEach(r -> r.displayHUDText(matrices));
+ }
+
+}
diff --git a/quilt/src/main/java/itemtransformhelper/quilt/mixin/MinecraftMixin.java b/quilt/src/main/java/itemtransformhelper/quilt/mixin/MinecraftMixin.java
new file mode 100644
index 00000000..96848541
--- /dev/null
+++ b/quilt/src/main/java/itemtransformhelper/quilt/mixin/MinecraftMixin.java
@@ -0,0 +1,24 @@
+package itemtransformhelper.quilt.mixin;
+
+import itemtransformhelper.MenuItemCameraTransforms;
+import net.minecraft.client.Minecraft;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import static itemtransformhelper.StartupClientOnly.clientTickHandler;
+import static itemtransformhelper.fabric.MenuItemCameraTransformsImpl.HANDLERS;
+
+@Mixin(Minecraft.class)
+public class MinecraftMixin {
+
+ @Inject(method = "tick",
+ at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;"
+ + ")V"))
+ public void tick(CallbackInfo ci) {
+ clientTickHandler.clientTickEvent();
+ HANDLERS.forEach(MenuItemCameraTransforms.MenuKeyHandler::clientTick);
+ }
+
+}
diff --git a/quilt/src/main/java/itemtransformhelper/quilt/mixin/ModelManagerMixin.java b/quilt/src/main/java/itemtransformhelper/quilt/mixin/ModelManagerMixin.java
new file mode 100644
index 00000000..c77ddfbb
--- /dev/null
+++ b/quilt/src/main/java/itemtransformhelper/quilt/mixin/ModelManagerMixin.java
@@ -0,0 +1,33 @@
+package itemtransformhelper.quilt.mixin;
+
+import java.util.Map;
+import net.minecraft.client.resources.model.BakedModel;
+import net.minecraft.client.resources.model.ModelBakery;
+import net.minecraft.client.resources.model.ModelManager;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.packs.resources.ResourceManager;
+import net.minecraft.util.profiling.ProfilerFiller;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import static itemtransformhelper.StartupClientOnly.modelBakeEventHandler;
+
+@Mixin(ModelManager.class)
+public class ModelManagerMixin {
+
+ @Shadow
+ private Map bakedRegistry;
+
+ @Inject(method = "apply(Lnet/minecraft/client/resources/model/ModelBakery;"
+ + "Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V",
+ at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush"
+ + "(Ljava/lang/String;)V"))
+ public void apply(ModelBakery modelLoader, ResourceManager resourceManager, ProfilerFiller profiler,
+ CallbackInfo ci) {
+ modelBakeEventHandler.modelBakeEvent(bakedRegistry);
+ }
+
+}
diff --git a/quilt/src/main/resources/itemtransformhelper.mixins.json b/quilt/src/main/resources/itemtransformhelper.mixins.json
new file mode 100644
index 00000000..0c0f20f9
--- /dev/null
+++ b/quilt/src/main/resources/itemtransformhelper.mixins.json
@@ -0,0 +1,14 @@
+{
+ "required": true,
+ "package": "itemtransformhelper.quilt.mixin",
+ "compatibilityLevel": "JAVA_17",
+ "client": [
+ "GuiMixin",
+ "MinecraftMixin",
+ "ModelManagerMixin"
+ ],
+ "mixins": [],
+ "injectors": {
+ "defaultRequire": 1
+ }
+}
diff --git a/quilt/src/main/resources/quilt.mod.json b/quilt/src/main/resources/quilt.mod.json
new file mode 100644
index 00000000..0ceb591a
--- /dev/null
+++ b/quilt/src/main/resources/quilt.mod.json
@@ -0,0 +1,50 @@
+{
+ "schema_version": 1,
+ "mixin": [
+ "itemtransformhelper.mixins.json"
+ ],
+ "quilt_loader": {
+ "group": "${group}",
+ "id": "itemtransformhelper",
+ "version": "${version}",
+ "name": "Item Transform Helper",
+ "description": "Interactively change the position, scale, and rotation of an item.",
+ "authors": [
+ "TGG",
+ "ThexXTURBOXx",
+ "Romejanic",
+ "lehjr"
+ ],
+ "contact": {
+ "homepage": "https://www.planetminecraft.com/mod/item-transform-helper---interactively-rotate-scale-translate/",
+ "sources": "https://github.com/TheGreyGhost/ItemTransformHelper",
+ "issues": "https://github.com/TheGreyGhost/ItemTransformHelper/issues"
+ },
+ "license": "All rights reserved",
+ "intermediate_mappings": "net.fabricmc:intermediary",
+ "environment": "*",
+ "entrypoints": {
+ "init": [
+ "itemtransformhelper.quilt.ItemTransformHelperQuilt"
+ ]
+ },
+ "depends": [
+ {
+ "id": "quilt_loader",
+ "version": "*"
+ },
+ {
+ "id": "quilt_base",
+ "version": "*"
+ },
+ {
+ "id": "minecraft",
+ "version": ">=1.19"
+ },
+ {
+ "id": "architectury",
+ "version": ">=5.6.22"
+ }
+ ]
+ }
+}
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 00000000..169cca43
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,16 @@
+pluginManagement {
+ repositories {
+ maven { url "https://maven.fabricmc.net/" }
+ maven { url "https://maven.architectury.dev/" }
+ maven { url "https://maven.minecraftforge.net/" }
+ gradlePluginPortal()
+ }
+}
+
+include("common")
+include("fabric-like")
+include("fabric")
+include("quilt")
+include("forge")
+
+rootProject.name = "itemtransformhelper"
diff --git a/src/main/java/itemtransformhelper/ClientTickHandler.java b/src/main/java/itemtransformhelper/ClientTickHandler.java
deleted file mode 100644
index 9c14aab9..00000000
--- a/src/main/java/itemtransformhelper/ClientTickHandler.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package itemtransformhelper;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.player.ClientPlayerEntity;
-import net.minecraft.client.renderer.model.IBakedModel;
-import net.minecraft.entity.player.PlayerInventory;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.Hand;
-import net.minecraftforge.event.TickEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-
-/**
- * User: The Grey Ghost
- * Date: 2/11/13
- * Every tick, check all the items in the hotbar to see if any are the camera If so, apply the transform
- * override to the held item.
- */
-@SuppressWarnings("deprecation")
-public class ClientTickHandler {
- @SubscribeEvent
- public void clientTickEvent(TickEvent.ClientTickEvent event) {
- if (event.phase != TickEvent.Phase.START) {
- return;
- }
-
- ClientPlayerEntity player = Minecraft.getInstance().player;
- if (player == null) return;
-
- boolean foundCamera = false;
- PlayerInventory inventoryPlayer = player.inventory;
- for (int i = 0; i < PlayerInventory.getHotbarSize(); ++i) {
- ItemStack slotItemStack = inventoryPlayer.mainInventory.get(i);
- if (slotItemStack.getItem() == StartupCommon.ITEM_CAMERA.get()) {
- foundCamera = true;
- break;
- }
- }
- StartupClientOnly.menuItemCameraTransforms.changeMenuVisible(foundCamera);
-
- IBakedModel ibakedmodel = null;
- if (foundCamera) {
- ItemStack heldItemStack = player.getHeldItem(Hand.MAIN_HAND);
- if (heldItemStack.isEmpty()) {
- heldItemStack = player.getHeldItem(Hand.OFF_HAND);
- }
- if (!heldItemStack.isEmpty()) {
- ibakedmodel = Minecraft.getInstance().getItemRenderer().getItemModelMesher().getItemModel(heldItemStack);
- }
- }
-
- ItemModelFlexibleCamera.UpdateLink link = StartupClientOnly.modelBakeEventHandler.getItemOverrideLink();
- link.itemModelToOverride = ibakedmodel;
- link.forcedTransform = StartupClientOnly.menuItemCameraTransforms.getItemCameraTransforms();
- }
-}
diff --git a/src/main/java/itemtransformhelper/CreativeTabITH.java b/src/main/java/itemtransformhelper/CreativeTabITH.java
deleted file mode 100644
index 833596f8..00000000
--- a/src/main/java/itemtransformhelper/CreativeTabITH.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package itemtransformhelper;
-
-import net.minecraft.item.ItemGroup;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
-
-/**
- * User: The Grey Ghost
- * Date: 26/01/2015
- */
-public class CreativeTabITH extends ItemGroup {
- public CreativeTabITH(String unlocalizedName) {
- super(unlocalizedName);
- }
-
- @OnlyIn(Dist.CLIENT)
- @Override
- public ItemStack createIcon() {
- return new ItemStack(StartupCommon.ITEM_CAMERA.get());
- }
-}
\ No newline at end of file
diff --git a/src/main/java/itemtransformhelper/HUDtextRenderer.java b/src/main/java/itemtransformhelper/HUDtextRenderer.java
deleted file mode 100644
index 85f1eff6..00000000
--- a/src/main/java/itemtransformhelper/HUDtextRenderer.java
+++ /dev/null
@@ -1,300 +0,0 @@
-package itemtransformhelper;
-
-import com.mojang.blaze3d.matrix.MatrixStack;
-import com.mojang.blaze3d.platform.GlStateManager;
-import com.mojang.blaze3d.systems.RenderSystem;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.renderer.BufferBuilder;
-import net.minecraft.client.renderer.Tessellator;
-import net.minecraft.client.renderer.model.ItemCameraTransforms;
-import net.minecraft.client.renderer.model.ItemTransformVec3f;
-import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
-import net.minecraft.util.math.vector.Matrix4f;
-import net.minecraft.util.math.vector.Vector3f;
-import net.minecraftforge.client.event.RenderGameOverlayEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-
-import java.util.ArrayList;
-
-/**
- * User: The Grey Ghost
- * Date: 20/01/2015
- * Class to draw the menu on the screen
- */
-@SuppressWarnings("deprecation")
-public class HUDtextRenderer {
- /**
- * Create the HUDtextRenderer; caller needs to register this class on the forge event bus
- *
- * @param i_HUDinfoUpdateLink the menu state information needed to draw the Heads Up Display
- */
- public HUDtextRenderer(HUDinfoUpdateLink i_HUDinfoUpdateLink) {
- huDinfoUpdateLink = i_HUDinfoUpdateLink;
- }
-
- /**
- * Draw the Head Up Display menu on screen.
- * The information is taken from the hudInfoUpdateLink which is updated by other classes.
- *
- * @param event
- */
- @SubscribeEvent
- public void displayHUDtext(RenderGameOverlayEvent.Text event) {
- if (huDinfoUpdateLink == null || !huDinfoUpdateLink.menuVisible || huDinfoUpdateLink.itemCameraTransforms == null)
- return;
- ArrayList displayText = new ArrayList<>();
- ArrayList selectableField = new ArrayList<>();
-
- final HUDinfoUpdateLink.SelectedField NOT_SELECTABLE = null;
-
- displayText.add("======");
- selectableField.add(NOT_SELECTABLE);
- displayText.add("VIEW ");
- selectableField.add(NOT_SELECTABLE);
- ItemTransformVec3f transformVec3f = huDinfoUpdateLink.itemCameraTransforms.thirdperson_right;
-
- switch (huDinfoUpdateLink.selectedTransform) {
- case THIRD_LEFT: {
- displayText.add("3rd-L");
- transformVec3f = huDinfoUpdateLink.itemCameraTransforms.thirdperson_left;
- break;
- }
- case THIRD_RIGHT: {
- displayText.add("3rd-R");
- transformVec3f = huDinfoUpdateLink.itemCameraTransforms.thirdperson_right;
- break;
- }
- case FIRST_LEFT: {
- displayText.add("1st-L");
- transformVec3f = huDinfoUpdateLink.itemCameraTransforms.firstperson_left;
- break;
- }
- case FIRST_RIGHT: {
- displayText.add("1st-R");
- transformVec3f = huDinfoUpdateLink.itemCameraTransforms.firstperson_right;
- break;
- }
- case GUI: {
- displayText.add("gui");
- transformVec3f = huDinfoUpdateLink.itemCameraTransforms.gui;
- break;
- }
- case HEAD: {
- displayText.add("head");
- transformVec3f = huDinfoUpdateLink.itemCameraTransforms.head;
- break;
- }
- case FIXED: {
- displayText.add("fixed");
- transformVec3f = huDinfoUpdateLink.itemCameraTransforms.fixed;
- break;
- }
- case GROUND: {
- displayText.add("grnd");
- transformVec3f = huDinfoUpdateLink.itemCameraTransforms.ground;
- break;
- }
- default: {
- throw new IllegalArgumentException("Unknown cameraTransformType:" + huDinfoUpdateLink.selectedTransform);
- }
- }
- selectableField.add(HUDinfoUpdateLink.SelectedField.TRANSFORM);
-
- displayText.add("======");
- selectableField.add(NOT_SELECTABLE);
- displayText.add("SCALE");
- selectableField.add(NOT_SELECTABLE);
- displayText.add("X:" + String.format("%.2f", transformVec3f.scale.getX()));
- selectableField.add(HUDinfoUpdateLink.SelectedField.SCALE_X);
- displayText.add("Y:" + String.format("%.2f", transformVec3f.scale.getY()));
- selectableField.add(HUDinfoUpdateLink.SelectedField.SCALE_Y);
- displayText.add("Z:" + String.format("%.2f", transformVec3f.scale.getZ()));
- selectableField.add(HUDinfoUpdateLink.SelectedField.SCALE_Z);
-
- displayText.add("======");
- selectableField.add(NOT_SELECTABLE);
- displayText.add("ROTATE");
- selectableField.add(NOT_SELECTABLE);
- displayText.add("X:" + String.format("%3.0f", transformVec3f.rotation.getX()));
- selectableField.add(HUDinfoUpdateLink.SelectedField.ROTATE_X);
- displayText.add("Y:" + String.format("%3.0f", transformVec3f.rotation.getY()));
- selectableField.add(HUDinfoUpdateLink.SelectedField.ROTATE_Y);
- displayText.add("Z:" + String.format("%3.0f", transformVec3f.rotation.getZ()));
- selectableField.add(HUDinfoUpdateLink.SelectedField.ROTATE_Z);
-
- final double TRANSLATE_MULTIPLIER = 1 / 0.0625; // see ItemTransformVec3f::deserialize0()
- displayText.add("======");
- selectableField.add(NOT_SELECTABLE);
- displayText.add("TRANSL");
- selectableField.add(NOT_SELECTABLE);
- displayText.add("X:" + String.format("%.2f", transformVec3f.translation.getX() * TRANSLATE_MULTIPLIER));
- selectableField.add(HUDinfoUpdateLink.SelectedField.TRANSLATE_X);
- displayText.add("Y:" + String.format("%.2f", transformVec3f.translation.getY() * TRANSLATE_MULTIPLIER));
- selectableField.add(HUDinfoUpdateLink.SelectedField.TRANSLATE_Y);
- displayText.add("Z:" + String.format("%.2f", transformVec3f.translation.getZ() * TRANSLATE_MULTIPLIER));
- selectableField.add(HUDinfoUpdateLink.SelectedField.TRANSLATE_Z);
-
- displayText.add("======");
- selectableField.add(NOT_SELECTABLE);
- displayText.add("RESET");
- selectableField.add(HUDinfoUpdateLink.SelectedField.RESTORE_DEFAULT);
- displayText.add("RSTALL");
- selectableField.add(HUDinfoUpdateLink.SelectedField.RESTORE_DEFAULT_ALL);
- displayText.add("PRINT");
- selectableField.add(HUDinfoUpdateLink.SelectedField.PRINT);
- displayText.add("======");
- selectableField.add(NOT_SELECTABLE);
-
- FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer;
- int ypos = 2;
- int xpos = 2;
- for (int i = 0; i < displayText.size(); ++i) {
- String msg = displayText.get(i);
- ypos += fontRenderer.FONT_HEIGHT;
- if (msg == null) continue;
- final int MED_GRAY_HALF_TRANSPARENT = 0x6FAFAFB0;
- final int GREEN_HALF_TRANSPARENT = 0x6F00FF00;
- boolean fieldIsSelected = (huDinfoUpdateLink.selectedField == selectableField.get(i));
- int highlightColour = fieldIsSelected ? GREEN_HALF_TRANSPARENT : MED_GRAY_HALF_TRANSPARENT;
- drawRect(event.getMatrixStack(), xpos - 1, ypos - 1, xpos + fontRenderer.getStringWidth(msg) + 1, ypos + fontRenderer.FONT_HEIGHT - 1, highlightColour);
- final int LIGHT_GRAY = 0xE0E0E0;
- final int BLACK = 0x000000;
- int stringColour = fieldIsSelected ? BLACK : LIGHT_GRAY;
- fontRenderer.drawString(event.getMatrixStack(), msg, xpos, ypos, stringColour);
- }
- }
-
- /**
- * Used to provide the information that the HUDtextRenderer needs to draw the menu
- */
- public static class HUDinfoUpdateLink {
- public ItemCameraTransforms itemCameraTransforms;
- public SelectedField selectedField;
- public TransformName selectedTransform;
- public boolean menuVisible;
-
- public HUDinfoUpdateLink() {
- final Vector3f ROTATION_DEFAULT = new Vector3f(0.0F, 0.0F, 0.0F);
- final Vector3f TRANSLATION_DEFAULT = new Vector3f(0.0F, 0.0F, 0.0F);
- final Vector3f SCALE_DEFAULT = new Vector3f(1.0F, 1.0F, 1.0F);
-
- ItemTransformVec3f itvThirdLeft = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT);
- ItemTransformVec3f itvThirdRight = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT);
- ItemTransformVec3f itvFirstLeft = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT);
- ItemTransformVec3f itvFirstRight = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT);
- ItemTransformVec3f itvHead = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT);
- ItemTransformVec3f itvGui = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT);
- ItemTransformVec3f itvGround = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT);
- ItemTransformVec3f itvFixed = new ItemTransformVec3f(ROTATION_DEFAULT, TRANSLATION_DEFAULT, SCALE_DEFAULT);
- itemCameraTransforms = new ItemCameraTransforms(itvThirdLeft, itvThirdRight, itvFirstLeft, itvFirstRight, itvHead, itvGui, itvGround, itvFixed);
-
- selectedField = SelectedField.TRANSFORM;
- selectedTransform = TransformName.FIRST_RIGHT;
- menuVisible = false;
- }
-
- public enum TransformName {
- THIRD_LEFT(ItemCameraTransforms.TransformType.THIRD_PERSON_LEFT_HAND),
- THIRD_RIGHT(ItemCameraTransforms.TransformType.THIRD_PERSON_RIGHT_HAND),
- FIRST_LEFT(ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND),
- FIRST_RIGHT(ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND),
- HEAD(ItemCameraTransforms.TransformType.HEAD),
- GUI(ItemCameraTransforms.TransformType.GUI),
- GROUND(ItemCameraTransforms.TransformType.GROUND),
- FIXED(ItemCameraTransforms.TransformType.FIXED);
-
- public TransformName getNext() {
- for (TransformName transformName : TransformName.values()) {
- if (transformName.ordinal() == this.ordinal() + 1) return transformName;
- }
- return THIRD_LEFT;
- }
-
- public TransformName getPrevious() {
- for (TransformName transformName : TransformName.values()) {
- if (transformName.ordinal() == this.ordinal() - 1) return transformName;
- }
- return FIXED;
- }
-
- public ItemCameraTransforms.TransformType getVanillaTransformType() {
- return vanillaType;
- }
-
- TransformName(ItemCameraTransforms.TransformType i_type) {
- vanillaType = i_type;
- }
-
- private ItemCameraTransforms.TransformType vanillaType;
- }
-
- public enum SelectedField {
- TRANSFORM(0), SCALE_X(1), SCALE_Y(2), SCALE_Z(3), ROTATE_X(4), ROTATE_Y(5), ROTATE_Z(6), TRANSLATE_X(7),
- TRANSLATE_Y(8), TRANSLATE_Z(9), RESTORE_DEFAULT(10), RESTORE_DEFAULT_ALL(11), PRINT(12);
-
- SelectedField(int index) {
- fieldIndex = index;
- }
-
- public final int fieldIndex;
- private static final SelectedField FIRST_FIELD = TRANSFORM;
- private static final SelectedField LAST_FIELD = PRINT;
-
- public static SelectedField getFieldName(int indexToFind) {
- for (SelectedField checkField : SelectedField.values()) {
- if (checkField.fieldIndex == indexToFind) return checkField;
- }
- return null;
- }
-
- public SelectedField getNextField() {
- SelectedField nextField = getFieldName(fieldIndex + 1);
- if (nextField == null) nextField = FIRST_FIELD;
- return nextField;
- }
-
- public SelectedField getPreviousField() {
- SelectedField previousField = getFieldName(fieldIndex - 1);
- if (previousField == null) previousField = LAST_FIELD;
- return previousField;
- }
- }
-
- }
-
- private HUDinfoUpdateLink huDinfoUpdateLink;
-
- // copied straight from vanilla ForgeIngameGui
- private static void drawRect(MatrixStack matrixStackIn, int left, int top, int right, int bottom, int color) {
- if (left < right) {
- int i = left;
- left = right;
- right = i;
- }
-
- if (top < bottom) {
- int j = top;
- top = bottom;
- bottom = j;
- }
-
- float alpha = (float) (color >> 24 & 255) / 255.0F;
- float red = (float) (color >> 16 & 255) / 255.0F;
- float green = (float) (color >> 8 & 255) / 255.0F;
- float blue = (float) (color & 255) / 255.0F;
- Tessellator tessellator = Tessellator.getInstance();
- BufferBuilder builder = tessellator.getBuffer();
- GlStateManager.enableBlend();
- RenderSystem.disableTexture();
- builder.begin(7, DefaultVertexFormats.POSITION_COLOR);
- Matrix4f matrix = matrixStackIn.getLast().getMatrix();
- builder.pos(matrix, (float) left, (float) bottom, 0F).color(red, green, blue, alpha).endVertex();
- builder.pos(matrix, (float) right, (float) bottom, 0F).color(red, green, blue, alpha).endVertex();
- builder.pos(matrix, (float) right, (float) top, 0F).color(red, green, blue, alpha).endVertex();
- builder.pos(matrix, (float) left, (float) top, 0F).color(red, green, blue, alpha).endVertex();
- tessellator.draw();
- RenderSystem.enableTexture();
- GlStateManager.disableBlend();
- }
-}
\ No newline at end of file
diff --git a/src/main/java/itemtransformhelper/ItemCamera.java b/src/main/java/itemtransformhelper/ItemCamera.java
deleted file mode 100644
index 9c98dcea..00000000
--- a/src/main/java/itemtransformhelper/ItemCamera.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package itemtransformhelper;
-
-import net.minecraft.client.util.ITooltipFlag;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.text.ITextComponent;
-import net.minecraft.util.text.StringTextComponent;
-import net.minecraft.world.World;
-
-import javax.annotation.Nullable;
-import java.util.List;
-
-/**
- * User: The Grey Ghost
- * Date: 26/01/2015
- * ItemCamera is very simple item used to activate the ItemCameraTransforms override when it is held in the hotbar.
- * See the Notes.
- */
-public class ItemCamera extends Item {
- public ItemCamera(Properties properties) {
- super(properties);
- }
-
- @Override
- public void addInformation(ItemStack stack, @Nullable World worldIn, List tooltip, ITooltipFlag flagIn) {
- tooltip.add(new StringTextComponent("1) Place the camera in your hotbar"));
- tooltip.add(new StringTextComponent("2) Hold an item in your hand"));
- tooltip.add(new StringTextComponent("3) Use the cursor keys to "));
- tooltip.add(new StringTextComponent(" modify the item transform."));
- }
-}
diff --git a/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java b/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java
deleted file mode 100644
index dffc044f..00000000
--- a/src/main/java/itemtransformhelper/ItemModelFlexibleCamera.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package itemtransformhelper;
-
-
-import com.mojang.blaze3d.matrix.MatrixStack;
-import net.minecraft.block.BlockState;
-import net.minecraft.client.renderer.model.BakedQuad;
-import net.minecraft.client.renderer.model.IBakedModel;
-import net.minecraft.client.renderer.model.ItemCameraTransforms;
-import net.minecraft.util.Direction;
-import net.minecraft.util.math.vector.TransformationMatrix;
-import net.minecraftforge.client.model.BakedModelWrapper;
-import net.minecraftforge.client.model.data.EmptyModelData;
-import net.minecraftforge.common.model.TransformationHelper;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.Random;
-
-/**
- * User: The Grey Ghost
- * Date: 20/01/2015
- * This class is a simple wrapper to substitute a new set of camera transforms for an existing item
- * Usage:
- * 1) Construct a new ItemModelFlexibleCamera with the model to wrap and an UpdateLink using getWrappedModel()
- * 2) Replace the ItemModelFlexibleCamera into the modelRegistry in place of the model to wrap
- * 3) Alter the UpdateLink to control the ItemCameraTransform of a given model:
- * a) itemModelToOverride selects the item to be overridden
- * b) forcedTransform is the transform to apply
- * Models which don't match itemModelToOverride will use their original transform
- *
- * NB Starting with Forge 1.8-11.14.4.1563, it appears that all items now implement IPerspectiveAwareModel
- */
-@SuppressWarnings({"deprecation", "unchecked"})
-public class ItemModelFlexibleCamera extends BakedModelWrapper {
- protected final UpdateLink updateLink;
-
- public ItemModelFlexibleCamera(IBakedModel i_modelToWrap, UpdateLink linkToCurrentInformation) {
- super(i_modelToWrap);
- updateLink = linkToCurrentInformation;
- }
-
- @Override
- public ItemCameraTransforms getItemCameraTransforms() {
- return (updateLink.itemModelToOverride == this) ? updateLink.forcedTransform : originalModel.getItemCameraTransforms();
- }
-
- @Override
- public IBakedModel handlePerspective(ItemCameraTransforms.TransformType cameraTransformType, MatrixStack mat) {
- if (updateLink.itemModelToOverride == this) {
- TransformationMatrix tr = TransformationHelper.toTransformation(getItemCameraTransforms().getTransform(cameraTransformType));
- if (!tr.isIdentity()) {
- tr.push(mat);
- }
- return this;
- } else {
- return super.handlePerspective(cameraTransformType, mat);
- }
- }
-
- public static class UpdateLink {
- public IBakedModel itemModelToOverride;
- public ItemCameraTransforms forcedTransform;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java b/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java
deleted file mode 100644
index 026d3b77..00000000
--- a/src/main/java/itemtransformhelper/MenuItemCameraTransforms.java
+++ /dev/null
@@ -1,299 +0,0 @@
-package itemtransformhelper;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.model.IBakedModel;
-import net.minecraft.client.renderer.model.ItemCameraTransforms;
-import net.minecraft.client.renderer.model.ItemTransformVec3f;
-import net.minecraft.util.math.MathHelper;
-import net.minecraft.util.text.StringTextComponent;
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.TickEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.lwjgl.glfw.GLFW;
-
-import java.util.Locale;
-
-
-/**
- * The menu used to select and alter the different parts of the ItemCameraTransform for the currently selected item.
- * The menu state is rendered on the screen by HUDtextRenderer.
- * The class registers its components on the Forge and FML event buses.
- * Created by TheGreyGhost on 22/01/15.
- */
-@SuppressWarnings("deprecation")
-public class MenuItemCameraTransforms {
- public MenuItemCameraTransforms() {
- linkToHUDrenderer = new HUDtextRenderer.HUDinfoUpdateLink();
- MinecraftForge.EVENT_BUS.register(new HUDtextRenderer(linkToHUDrenderer));
- menuKeyHandler = new MenuKeyHandler(this.new KeyPressCallback());
- MinecraftForge.EVENT_BUS.register(menuKeyHandler);
- }
-
- /**
- * get the current ItemCameraTransforms
- *
- * @return the transform
- */
- public ItemCameraTransforms getItemCameraTransforms() {
- return linkToHUDrenderer.itemCameraTransforms;
- }
-
- /**
- * turn menu on or off
- *
- * @param visible true = make visible
- */
- public void changeMenuVisible(boolean visible) {
- linkToHUDrenderer.menuVisible = visible;
- }
-
- public class KeyPressCallback {
- void keyPressed(MenuKeyHandler.ArrowKeys whichKey) {
- if (!linkToHUDrenderer.menuVisible) return;
-
- switch (whichKey) {
- case DOWN: {
- linkToHUDrenderer.selectedField = linkToHUDrenderer.selectedField.getNextField();
- break;
- }
- case UP: {
- linkToHUDrenderer.selectedField = linkToHUDrenderer.selectedField.getPreviousField();
- break;
- }
- case RIGHT:
- case LEFT: {
- alterField(whichKey == MenuKeyHandler.ArrowKeys.RIGHT);
- break;
- }
- case NONE:
- }
- }
- }
-
- private void alterField(boolean increase) {
- ItemTransformVec3f transformVec3f = getItemTransformRef(linkToHUDrenderer, linkToHUDrenderer.selectedTransform);
- if (transformVec3f == null) return; // should never happen
-
- final float SCALE_INCREMENT = 0.01F;
- final float ROTATION_INCREMENT = 2F;
- final float TRANSLATION_INCREMENT = 0.25F * 0.0625F; // 1/4 of a block, with multiplier from ItemTransformVec3f::deserialize0()
- switch (linkToHUDrenderer.selectedField) {
- case TRANSFORM: {
- linkToHUDrenderer.selectedTransform = increase ? linkToHUDrenderer.selectedTransform.getNext()
- : linkToHUDrenderer.selectedTransform.getPrevious();
- break;
- }
- case SCALE_X: {
- transformVec3f.scale.setX(transformVec3f.scale.getX() + (increase ? SCALE_INCREMENT : -SCALE_INCREMENT));
- break;
- }
- case SCALE_Y: {
- transformVec3f.scale.setY(transformVec3f.scale.getY() + (increase ? SCALE_INCREMENT : -SCALE_INCREMENT));
- break;
- }
- case SCALE_Z: {
- transformVec3f.scale.setZ(transformVec3f.scale.getZ() + (increase ? SCALE_INCREMENT : -SCALE_INCREMENT));
- break;
- }
- case ROTATE_X: {
- float newAngle = transformVec3f.rotation.getX() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT);
- newAngle = MathHelper.wrapDegrees(newAngle - 180) + 180;
- transformVec3f.rotation.setX(newAngle);
- break;
- }
- case ROTATE_Y: {
- float newAngle = transformVec3f.rotation.getY() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT);
- newAngle = MathHelper.wrapDegrees(newAngle - 180) + 180;
- transformVec3f.rotation.setY(newAngle);
- break;
- }
- case ROTATE_Z: {
- float newAngle = transformVec3f.rotation.getZ() + (increase ? ROTATION_INCREMENT : -ROTATION_INCREMENT);
- newAngle = MathHelper.wrapDegrees(newAngle - 180) + 180;
- transformVec3f.rotation.setZ(newAngle);
- break;
- }
- case TRANSLATE_X: {
- transformVec3f.translation.setX(transformVec3f.translation.getX() + (increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT));
- break;
- }
- case TRANSLATE_Y: {
- transformVec3f.translation.setY(transformVec3f.translation.getY() + (increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT));
- break;
- }
- case TRANSLATE_Z: {
- transformVec3f.translation.setZ(transformVec3f.translation.getZ() + (increase ? TRANSLATION_INCREMENT : -TRANSLATION_INCREMENT));
- break;
- }
- case RESTORE_DEFAULT_ALL:
- case RESTORE_DEFAULT: {
- ItemModelFlexibleCamera.UpdateLink link = StartupClientOnly.modelBakeEventHandler.getItemOverrideLink();
- IBakedModel savedModel = link.itemModelToOverride;
- if (savedModel != null) { // not sure why this would ever be null, but it was (in a bug report), so just check to make sure.
- link.itemModelToOverride = null;
- if (linkToHUDrenderer.selectedField == HUDtextRenderer.HUDinfoUpdateLink.SelectedField.RESTORE_DEFAULT) {
- copySingleTransform(linkToHUDrenderer, savedModel, linkToHUDrenderer.selectedTransform);
- } else {
- for (HUDtextRenderer.HUDinfoUpdateLink.TransformName transformName
- : HUDtextRenderer.HUDinfoUpdateLink.TransformName.values()) {
- copySingleTransform(linkToHUDrenderer, savedModel, transformName);
- }
- }
- }
- link.itemModelToOverride = savedModel;
- break;
- }
- case PRINT: {
- StringBuilder output = new StringBuilder();
- output.append("\n\"display\": {\n");
- printTransform(output, "thirdperson_righthand", linkToHUDrenderer.itemCameraTransforms.thirdperson_right);
- output.append(",\n");
- printTransform(output, "thirdperson_lefthand", linkToHUDrenderer.itemCameraTransforms.thirdperson_left);
- output.append(",\n");
- printTransform(output, "firstperson_righthand", linkToHUDrenderer.itemCameraTransforms.firstperson_right);
- output.append(",\n");
- printTransform(output, "firstperson_lefthand", linkToHUDrenderer.itemCameraTransforms.firstperson_left);
- output.append(",\n");
- printTransform(output, "gui", linkToHUDrenderer.itemCameraTransforms.gui);
- output.append(",\n");
- printTransform(output, "head", linkToHUDrenderer.itemCameraTransforms.head);
- output.append(",\n");
- printTransform(output, "fixed", linkToHUDrenderer.itemCameraTransforms.fixed);
- output.append(",\n");
- printTransform(output, "ground", linkToHUDrenderer.itemCameraTransforms.ground);
- output.append("\n}");
- LOGGER.info(output);
- StringTextComponent text = new StringTextComponent(" \"display\" JSON section printed to console (LOGGER.info)...");
- Minecraft.getInstance().ingameGUI.getChatGUI().printChatMessage(text);
- break;
- }
- }
- }
-
- // points to the appropriate transform based on which transform has been selected.
- private static ItemTransformVec3f getItemTransformRef(HUDtextRenderer.HUDinfoUpdateLink linkToHUDrenderer,
- HUDtextRenderer.HUDinfoUpdateLink.TransformName transformName) {
- switch (transformName) {
- case THIRD_LEFT: {
- return linkToHUDrenderer.itemCameraTransforms.thirdperson_left;
- }
- case THIRD_RIGHT: {
- return linkToHUDrenderer.itemCameraTransforms.thirdperson_right;
- }
- case FIRST_LEFT: {
- return linkToHUDrenderer.itemCameraTransforms.firstperson_left;
- }
- case FIRST_RIGHT: {
- return linkToHUDrenderer.itemCameraTransforms.firstperson_right;
- }
- case GUI: {
- return linkToHUDrenderer.itemCameraTransforms.gui;
- }
- case HEAD: {
- return linkToHUDrenderer.itemCameraTransforms.head;
- }
- case FIXED: {
- return linkToHUDrenderer.itemCameraTransforms.fixed;
- }
- case GROUND: {
- return linkToHUDrenderer.itemCameraTransforms.ground;
- }
- }
- return null;
- }
-
- private void copySingleTransform(HUDtextRenderer.HUDinfoUpdateLink linkToHUDrenderer,
- IBakedModel savedModel,
- HUDtextRenderer.HUDinfoUpdateLink.TransformName transformToBeCopied
- ) {
- ItemTransformVec3f transformVec3f = getItemTransformRef(linkToHUDrenderer, transformToBeCopied);
- ItemCameraTransforms.TransformType currentType = transformToBeCopied.getVanillaTransformType();
- ItemTransformVec3f transform = savedModel.getItemCameraTransforms().getTransform(currentType);
- copyTransforms(transform, transformVec3f);
- }
-
- private static void printTransform(StringBuilder output, String transformView, ItemTransformVec3f itemTransformVec3f) {
- output.append(" \"" + transformView + "\": {\n");
- output.append(" \"rotation\": [ ");
- output.append(String.format(Locale.US, "%.0f, ", itemTransformVec3f.rotation.getX()));
- output.append(String.format(Locale.US, "%.0f, ", itemTransformVec3f.rotation.getY()));
- output.append(String.format(Locale.US, "%.0f ],", itemTransformVec3f.rotation.getZ()));
- output.append("\n");
-
- final double TRANSLATE_MULTIPLIER = 1 / 0.0625; // see ItemTransformVec3f::deserialize0()
- output.append(" \"translation\": [ ");
- output.append(String.format(Locale.US, "%.2f, ", itemTransformVec3f.translation.getX() * TRANSLATE_MULTIPLIER));
- output.append(String.format(Locale.US, "%.2f, ", itemTransformVec3f.translation.getY() * TRANSLATE_MULTIPLIER));
- output.append(String.format(Locale.US, "%.2f ],", itemTransformVec3f.translation.getZ() * TRANSLATE_MULTIPLIER));
- output.append("\n");
- output.append(" \"scale\": [ ");
- output.append(String.format(Locale.US, "%.2f, ", itemTransformVec3f.scale.getX()));
- output.append(String.format(Locale.US, "%.2f, ", itemTransformVec3f.scale.getY()));
- output.append(String.format(Locale.US, "%.2f ]", itemTransformVec3f.scale.getZ()));
- output.append("\n }");
- }
-
- private static void copyTransforms(ItemTransformVec3f from, ItemTransformVec3f to) {
- to.translation.setX(from.translation.getX());
- to.scale.setX(from.scale.getX());
- to.rotation.setX(from.rotation.getX());
- to.translation.setY(from.translation.getY());
- to.scale.setY(from.scale.getY());
- to.rotation.setY(from.rotation.getY());
- to.translation.setZ(from.translation.getZ());
- to.scale.setZ(from.scale.getZ());
- to.rotation.setZ(from.rotation.getZ());
- }
-
- private HUDtextRenderer.HUDinfoUpdateLink linkToHUDrenderer;
- private MenuKeyHandler menuKeyHandler;
-
- /**
- * Intercept arrow keys and handle repeats
- */
- public static class MenuKeyHandler {
- public MenuKeyHandler(KeyPressCallback i_keyPressCallback) {
- keyPressCallback = i_keyPressCallback;
- }
-
- @SubscribeEvent
- public void clientTick(TickEvent.ClientTickEvent event) {
- if (event.phase != TickEvent.Phase.START) {
- return;
- }
-
- ArrowKeys keyPressed = ArrowKeys.NONE;
- if (isKeyDown(GLFW.GLFW_KEY_LEFT)) keyPressed = ArrowKeys.LEFT;
- if (isKeyDown(GLFW.GLFW_KEY_RIGHT)) keyPressed = ArrowKeys.RIGHT;
- if (isKeyDown(GLFW.GLFW_KEY_DOWN)) keyPressed = ArrowKeys.DOWN;
- if (isKeyDown(GLFW.GLFW_KEY_UP)) keyPressed = ArrowKeys.UP;
-
- if (keyPressed == ArrowKeys.NONE) {
- lastKey = keyPressed;
- return;
- }
- if (keyPressed != lastKey) {
- lastKey = keyPressed;
- keyDownTimeTicks = 0;
- } else {
- ++keyDownTimeTicks;
- final int INITIAL_PAUSE_TICKS = 10; // wait 10 ticks before repeating
- if (keyDownTimeTicks < INITIAL_PAUSE_TICKS) return;
- }
- keyPressCallback.keyPressed(keyPressed);
- }
-
- static boolean isKeyDown(int key) {
- return GLFW.glfwGetKey(Minecraft.getInstance().getMainWindow().getHandle(), key) == GLFW.GLFW_PRESS;
- }
-
- public enum ArrowKeys {NONE, UP, DOWN, LEFT, RIGHT}
-
- private long keyDownTimeTicks = 0;
- private ArrowKeys lastKey = ArrowKeys.NONE;
- private KeyPressCallback keyPressCallback;
- }
- private static final Logger LOGGER = LogManager.getLogger();
-}
diff --git a/src/main/java/itemtransformhelper/ModelBakeEventHandler.java b/src/main/java/itemtransformhelper/ModelBakeEventHandler.java
deleted file mode 100644
index be9ef9c7..00000000
--- a/src/main/java/itemtransformhelper/ModelBakeEventHandler.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package itemtransformhelper;
-
-import net.minecraft.client.renderer.model.IBakedModel;
-import net.minecraft.client.renderer.model.ItemCameraTransforms;
-import net.minecraft.client.renderer.model.ItemTransformVec3f;
-import net.minecraft.util.ResourceLocation;
-import net.minecraftforge.client.event.ModelBakeEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-
-import java.util.Map;
-
-/**
- * User: The Grey Ghost
- * Date: 20/01/2015
- * We use the ModelBakeEvent to iterate through all the registered models, wrap each one in an ItemModelFlexibleCamera, and write it
- * back into the registry.
- * Each wrapped model gets a reference to ModelBakeEventHandler::itemOverrideLink.
- * Later, we can alter the members of itemOverrideLink to change the ItemCameraTransforms for a desired Item
- */
-@SuppressWarnings("deprecation")
-public class ModelBakeEventHandler {
- public ModelBakeEventHandler() {
- itemOverrideLink.forcedTransform = new ItemCameraTransforms(ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT,
- ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT,
- ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT,
- ItemTransformVec3f.DEFAULT, ItemTransformVec3f.DEFAULT);
- }
-
- @SubscribeEvent
- public void modelBakeEvent(ModelBakeEvent event) {
- Map modelRegistry = event.getModelRegistry();
- for (ResourceLocation modelKey : modelRegistry.keySet()) {
- IBakedModel iBakedModel = event.getModelRegistry().get(modelKey);
- ItemModelFlexibleCamera wrappedModel = new ItemModelFlexibleCamera(iBakedModel, itemOverrideLink);
- event.getModelRegistry().put(modelKey, wrappedModel);
- }
- ItemTransformHelper.logger.warn("Warning - The Item Transform Helper replaces your IBakedModels with a wrapped version, this");
- ItemTransformHelper.logger.warn(" is done even when the helper is not in your hotbar, and might cause problems if your");
- ItemTransformHelper.logger.warn(" IBakedModel implements an interface ItemTransformHelper doesn't know about.");
- ItemTransformHelper.logger.warn(" I recommend you disable the mod when you're not actively using it to transform your items.");
- }
-
- public ItemModelFlexibleCamera.UpdateLink getItemOverrideLink() {
- return itemOverrideLink;
- }
-
- private ItemModelFlexibleCamera.UpdateLink itemOverrideLink = new ItemModelFlexibleCamera.UpdateLink();
-}
diff --git a/src/main/java/itemtransformhelper/StartupClientOnly.java b/src/main/java/itemtransformhelper/StartupClientOnly.java
deleted file mode 100644
index 34d22002..00000000
--- a/src/main/java/itemtransformhelper/StartupClientOnly.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package itemtransformhelper;
-
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
-
-/**
- * User: The Grey Ghost
- * Date: 24/12/2014
- *
- * The Startup classes for this example are called during startup, in the following order:
- * preInitCommon
- * preInitClientOnly
- * initCommon
- * initClientOnly
- * postInitCommon
- * postInitClientOnly
- * See MinecraftByExample class for more information
- */
-public class StartupClientOnly {
- public final static ModelBakeEventHandler modelBakeEventHandler = new ModelBakeEventHandler();
- public final static ClientTickHandler clientTickHandler = new ClientTickHandler();
- public static MenuItemCameraTransforms menuItemCameraTransforms;
-
- public static void clientSetup() {
- FMLJavaModLoadingContext.get().getModEventBus().addListener(modelBakeEventHandler::modelBakeEvent);
- MinecraftForge.EVENT_BUS.register(clientTickHandler);
- menuItemCameraTransforms = new MenuItemCameraTransforms();
- }
-}
\ No newline at end of file
diff --git a/src/main/java/itemtransformhelper/StartupCommon.java b/src/main/java/itemtransformhelper/StartupCommon.java
deleted file mode 100644
index 948a3d26..00000000
--- a/src/main/java/itemtransformhelper/StartupCommon.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package itemtransformhelper;
-
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemGroup;
-import net.minecraftforge.fml.RegistryObject;
-import net.minecraftforge.registries.DeferredRegister;
-import net.minecraftforge.registries.ForgeRegistries;
-
-import static itemtransformhelper.ItemTransformHelper.MODID;
-
-/**
- * User: The Grey Ghost
- * Date: 24/12/2014
- *
- * The Startup classes for this example are called during startup, in the following order:
- * preInitCommon
- * preInitClientOnly
- * initCommon
- * initClientOnly
- * postInitCommon
- * postInitClientOnly
- * See MinecraftByExample class for more information
- */
-public class StartupCommon {
- public static ItemGroup tabITH = new CreativeTabITH("itemtransformhelper");
-
- public static final DeferredRegister- ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
- public static final RegistryObject ITEM_CAMERA = ITEMS.register("item_camera", () -> new ItemCamera(
- new Item.Properties().group(tabITH).maxStackSize(1)));
-}
\ No newline at end of file
diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml
deleted file mode 100644
index f94e7f5c..00000000
--- a/src/main/resources/META-INF/mods.toml
+++ /dev/null
@@ -1,24 +0,0 @@
-modLoader="javafml"
-loaderVersion="[32,)"
-# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties.
-# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here.
-license="All rights reserved"
-[[mods]]
-modId="itemtransformhelper"
-version="${file.jarVersion}"
-displayName="Item Transform Helper"
-credits="The Forge, MCP, and FML guys. Maruohon"
-authors="TGG, Romejanic, lehjr"
-description="Interactively change the position, scale, and rotation of an item"
-[[dependencies.itemtransformhelper]]
- modId="forge"
- mandatory=true
- versionRange="[32,)"
- ordering="NONE"
- side="BOTH"
-[[dependencies.itemtransformhelper]]
- modId="minecraft"
- mandatory=true
- versionRange="[1.16.1]"
- ordering="NONE"
- side="BOTH"
diff --git a/src/main/resources/assets/itemtransformhelper/lang/en_us.json b/src/main/resources/assets/itemtransformhelper/lang/en_us.json
deleted file mode 100644
index 19bde922..00000000
--- a/src/main/resources/assets/itemtransformhelper/lang/en_us.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "item.itemtransformhelper.item_camera": "Item Transform Helper",
- "itemGroup.itemtransformhelper": "Item Transform Helper"
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json b/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json
deleted file mode 100644
index 0573f6f2..00000000
--- a/src/main/resources/assets/itemtransformhelper/models/item/item_camera.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "parent": "builtin/generated",
- "textures": {
- "layer0": "itemtransformhelper:items/item_camera_icon"
- },
- "display": {
- "thirdperson_righthand": {
- "rotation": [ 0, 0, 0 ],
- "translation": [ 0.00, 3.00, 1.00 ],
- "scale": [ 0.55, 0.55, 0.55 ]
- },
- "thirdperson_lefthand": {
- "rotation": [ 0, 0, 0 ],
- "translation": [ 0.00, 3.00, 1.00 ],
- "scale": [ 0.55, 0.55, 0.55 ]
- },
- "firstperson_righthand": {
- "rotation": [ -25, -90, 0 ],
- "translation": [ 1.13, 3.20, 1.13 ],
- "scale": [ 0.68, 0.68, 0.68 ]
- },
- "firstperson_lefthand": {
- "rotation": [ -25, -90, 0 ],
- "translation": [ 1.13, 3.20, 1.13 ],
- "scale": [ 0.68, 0.68, 0.68 ]
- },
- "gui": {
- "rotation": [ 0, 0, 0 ],
- "translation": [ 0.00, 0.00, 0.00 ],
- "scale": [ 1.00, 1.00, 1.00 ]
- },
- "head": {
- "rotation": [ -180, -0, -180 ],
- "translation": [ -0.00, 13.00, 7.00 ],
- "scale": [ 1.00, 1.00, 1.00 ]
- },
- "fixed": {
- "rotation": [ 0, 0, 0 ],
- "translation": [ 0.00, 0.00, 0.00 ],
- "scale": [ 1.00, 1.00, 1.00 ]
- },
- "ground": {
- "rotation": [ 0, 0, 0 ],
- "translation": [ 0.00, 2.00, 0.00 ],
- "scale": [ 0.50, 0.50, 0.50 ]
- }
- }}
diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta
deleted file mode 100644
index 148fbf9c..00000000
--- a/src/main/resources/pack.mcmeta
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "pack": {
- "description": "itemtransformhelper resources",
- "pack_format": 5,
- "_comment": "A pack_format of 5 requires json lang files and some texture changes from 1.15. Note: we require v5 pack meta for all mods."
- }
-}