diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/ModelRotation.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/ModelRotation.java.patch index 5025d3973a..9a07db1e7e 100644 --- a/patches/minecraft/net/minecraft/client/renderer/block/model/ModelRotation.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/ModelRotation.java.patch @@ -14,8 +14,8 @@ } } + -+ public java.util.Optional apply(java.util.Optional part) { return net.minecraftforge.client.ForgeHooksClient.applyTransform(getMatrix(), part); } -+ public javax.vecmath.Matrix4f getMatrix() { return net.minecraftforge.client.ForgeHooksClient.getMatrix(this); } ++ public java.util.Optional apply(java.util.Optional part) { return net.minecraftforge.client.ForgeHooksClient.applyTransform(this, part); } ++ public javax.vecmath.Matrix4f getMatrix() { return net.minecraftforge.common.model.TRSRTransformation.from(this).getMatrix(); } + public EnumFacing rotate(EnumFacing facing) { return func_177523_a(facing); } + public int rotate(EnumFacing facing, int vertexIndex) { return func_177520_a(facing, vertexIndex); } } diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index 78945445b6..308883cc61 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -57,6 +57,7 @@ import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BlockFaceUV; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; +import net.minecraft.client.renderer.block.model.ItemTransformVec3f; import net.minecraft.client.renderer.block.model.ModelManager; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelRotation; @@ -76,7 +77,6 @@ import net.minecraft.client.settings.GameSettings; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityHorse; -import net.minecraft.entity.passive.HorseArmorType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.Item; @@ -388,7 +388,7 @@ public class ForgeHooksClient } @SuppressWarnings("deprecation") - public static Matrix4f getMatrix(net.minecraft.client.renderer.block.model.ItemTransformVec3f transform) + public static Matrix4f getMatrix(ItemTransformVec3f transform) { javax.vecmath.Matrix4f m = new javax.vecmath.Matrix4f(), t = new javax.vecmath.Matrix4f(); m.setIdentity(); @@ -627,10 +627,16 @@ public class ForgeHooksClient } @SuppressWarnings("deprecation") - public static Optional applyTransform(net.minecraft.client.renderer.block.model.ItemTransformVec3f transform, Optional part) + public static Optional applyTransform(ItemTransformVec3f transform, Optional part) { if(part.isPresent()) return Optional.empty(); - return Optional.of(TRSRTransformation.blockCenterToCorner(new TRSRTransformation(transform))); + return Optional.of(TRSRTransformation.blockCenterToCorner(TRSRTransformation.from(transform))); + } + + public static Optional applyTransform(ModelRotation rotation, Optional part) + { + if(part.isPresent()) return Optional.empty(); + return Optional.of(TRSRTransformation.from(rotation)); } public static Optional applyTransform(Matrix4f matrix, Optional part) @@ -746,9 +752,9 @@ public class ForgeHooksClient @SuppressWarnings("deprecation") public static Pair handlePerspective(IBakedModel model, ItemCameraTransforms.TransformType type) { - TRSRTransformation tr = new TRSRTransformation(model.getItemCameraTransforms().getTransform(type)); + TRSRTransformation tr = TRSRTransformation.from(model.getItemCameraTransforms().getTransform(type)); Matrix4f mat = null; - if(!tr.equals(TRSRTransformation.identity())) mat = tr.getMatrix(); + if (!tr.isIdentity()) mat = tr.getMatrix(); return Pair.of(model, mat); } diff --git a/src/main/java/net/minecraftforge/client/model/BakedItemModel.java b/src/main/java/net/minecraftforge/client/model/BakedItemModel.java index c8189b7bf2..d28a459bc5 100644 --- a/src/main/java/net/minecraftforge/client/model/BakedItemModel.java +++ b/src/main/java/net/minecraftforge/client/model/BakedItemModel.java @@ -55,7 +55,7 @@ public class BakedItemModel implements IBakedModel private static boolean hasGuiIdentity(ImmutableMap transforms) { TRSRTransformation guiTransform = transforms.get(TransformType.GUI); - return guiTransform == null || guiTransform.equals(TRSRTransformation.identity()); + return guiTransform == null || guiTransform.isIdentity(); } @Override public boolean isAmbientOcclusion() { return true; } diff --git a/src/main/java/net/minecraftforge/client/model/BlockStateLoader.java b/src/main/java/net/minecraftforge/client/model/BlockStateLoader.java index aa6eb40f4b..f30f78882d 100644 --- a/src/main/java/net/minecraftforge/client/model/BlockStateLoader.java +++ b/src/main/java/net/minecraftforge/client/model/BlockStateLoader.java @@ -94,8 +94,8 @@ public class BlockStateLoader boolean gui3d = var.getGui3d().orElse(true); int weight = var.getWeight().orElse(1); - if (var.getModel() != null && var.getSubmodels().size() == 0 && var.getTextures().size() == 0 && var.getCustomData().size() == 0 && var.getState().orElse(null) instanceof ModelRotation) - mcVars.add(new Variant(var.getModel(), (ModelRotation)var.getState().get(), uvLock, weight)); + if (var.getModel() != null && var.getSubmodels().size() == 0 && var.getTextures().size() == 0 && var.getCustomData().size() == 0 && var.getState().orElse(ModelRotation.X0_Y0) instanceof ModelRotation) + mcVars.add(new Variant(var.getModel(), (ModelRotation)var.getState().orElse(ModelRotation.X0_Y0), uvLock, weight)); else mcVars.add(new ForgeVariant(location, var.getModel(), var.getState().orElse(TRSRTransformation.identity()), uvLock, smooth, gui3d, weight, var.getTextures(), var.getOnlyPartsVariant(), var.getCustomData())); } diff --git a/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java b/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java index 4272e68d00..2d79ad7fc5 100644 --- a/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java +++ b/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java @@ -467,6 +467,61 @@ public class ForgeBlockStateV1 extends Marker return TRSRTransformation.blockCenterToCorner(flipX.compose(TRSRTransformation.blockCornerToCenter(transform)).compose(flipX)); } + // Note: these strings might change to a full-blown resource locations in the future, and move from here to some json somewhere + // TODO: vanilla now includes from parent, deprecate? + private static final ImmutableMap transforms; + + static + { + ImmutableMap.Builder builder = ImmutableMap.builder(); + + builder.put("identity", TRSRTransformation.identity()); + + // block/block + { + EnumMap map = new EnumMap<>(TransformType.class); + TRSRTransformation thirdperson = get(0, 2.5f, 0, 75, 45, 0, 0.375f); + map.put(TransformType.GUI, get(0, 0, 0, 30, 225, 0, 0.625f)); + map.put(TransformType.GROUND, get(0, 3, 0, 0, 0, 0, 0.25f)); + map.put(TransformType.FIXED, get(0, 0, 0, 0, 0, 0, 0.5f)); + map.put(TransformType.THIRD_PERSON_RIGHT_HAND, thirdperson); + map.put(TransformType.THIRD_PERSON_LEFT_HAND, leftify(thirdperson)); + map.put(TransformType.FIRST_PERSON_RIGHT_HAND, get(0, 0, 0, 0, 45, 0, 0.4f)); + map.put(TransformType.FIRST_PERSON_LEFT_HAND, get(0, 0, 0, 0, 225, 0, 0.4f)); + builder.put("forge:default-block", new SimpleModelState(ImmutableMap.copyOf(map))); + } + + // item/generated + { + EnumMap map = new EnumMap<>(TransformType.class); + TRSRTransformation thirdperson = get(0, 3, 1, 0, 0, 0, 0.55f); + TRSRTransformation firstperson = get(1.13f, 3.2f, 1.13f, 0, -90, 25, 0.68f); + map.put(TransformType.GROUND, get(0, 2, 0, 0, 0, 0, 0.5f)); + map.put(TransformType.HEAD, get(0, 13, 7, 0, 180, 0, 1)); + map.put(TransformType.THIRD_PERSON_RIGHT_HAND, thirdperson); + map.put(TransformType.THIRD_PERSON_LEFT_HAND, leftify(thirdperson)); + map.put(TransformType.FIRST_PERSON_RIGHT_HAND, firstperson); + map.put(TransformType.FIRST_PERSON_LEFT_HAND, leftify(firstperson)); + map.put(TransformType.FIXED, get(0, 0, 0, 0, 180, 0, 1)); + builder.put("forge:default-item", new SimpleModelState(ImmutableMap.copyOf(map))); + } + + // item/handheld + { + EnumMap map = new EnumMap<>(TransformType.class); + map.put(TransformType.GROUND, get(0, 2, 0, 0, 0, 0, 0.5f)); + map.put(TransformType.HEAD, get(0, 13, 7, 0, 180, 0, 1)); + map.put(TransformType.THIRD_PERSON_RIGHT_HAND, get(0, 4, 0.5f, 0, -90, 55, 0.85f)); + map.put(TransformType.THIRD_PERSON_LEFT_HAND, get(0, 4, 0.5f, 0, 90, -55, 0.85f)); + map.put(TransformType.FIRST_PERSON_RIGHT_HAND, get(1.13f, 3.2f, 1.13f, 0, -90, 25, 0.68f)); + map.put(TransformType.FIRST_PERSON_LEFT_HAND, get(1.13f, 3.2f, 1.13f, 0, 90, -25, 0.68f)); + map.put(TransformType.FIXED, get(0, 0, 0, 0, 180, 0, 1)); + builder.put("forge:default-tool", new SimpleModelState(ImmutableMap.copyOf(map))); + } + + transforms = builder.build(); + } + @Override public ForgeBlockStateV1.Variant deserialize(JsonElement element, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { @@ -497,7 +552,7 @@ public class ForgeBlockStateV1 extends Marker { // Load rotation values. int x = JsonUtils.getInt(json, "x", 0); int y = JsonUtils.getInt(json, "y", 0); - ret.state = Optional.of(new TRSRTransformation(ModelRotation.getModelRotation(x, y))); + ret.state = Optional.ofNullable(ModelRotation.getModelRotation(x, y)); if (!ret.state.isPresent()) throw new JsonParseException("Invalid BlockModelRotation x: " + x + " y: " + y); } @@ -507,51 +562,8 @@ public class ForgeBlockStateV1 extends Marker if (json.get("transform").isJsonPrimitive() && json.get("transform").getAsJsonPrimitive().isString()) { String transform = json.get("transform").getAsString(); - // Note: these strings might change to a full-blown resource locations in the future, and move from here to some json somewhere - // TODO: vanilla now includes from parent, deprecate? - if (transform.equals("identity")) - { - ret.state = Optional.of(TRSRTransformation.identity()); - } - // block/block - else if (transform.equals("forge:default-block")) - { - TRSRTransformation thirdperson = get(0, 2.5f, 0, 75, 45, 0, 0.375f); - ImmutableMap.Builder builder = ImmutableMap.builder(); - builder.put(TransformType.GUI, get(0, 0, 0, 30, 225, 0, 0.625f)); - builder.put(TransformType.GROUND, get(0, 3, 0, 0, 0, 0, 0.25f)); - builder.put(TransformType.FIXED, get(0, 0, 0, 0, 0, 0, 0.5f)); - builder.put(TransformType.THIRD_PERSON_RIGHT_HAND, thirdperson); - builder.put(TransformType.THIRD_PERSON_LEFT_HAND, leftify(thirdperson)); - builder.put(TransformType.FIRST_PERSON_RIGHT_HAND, get(0, 0, 0, 0, 45, 0, 0.4f)); - builder.put(TransformType.FIRST_PERSON_LEFT_HAND, get(0, 0, 0, 0, 225, 0, 0.4f)); - ret.state = Optional.of(new SimpleModelState(builder.build())); - } - // item/generated - else if (transform.equals("forge:default-item")) - { - TRSRTransformation thirdperson = get(0, 3, 1, 0, 0, 0, 0.55f); - TRSRTransformation firstperson = get(1.13f, 3.2f, 1.13f, 0, -90, 25, 0.68f); - ImmutableMap.Builder builder = ImmutableMap.builder(); - builder.put(TransformType.GROUND, get(0, 2, 0, 0, 0, 0, 0.5f)); - builder.put(TransformType.HEAD, get(0, 13, 7, 0, 180, 0, 1)); - builder.put(TransformType.THIRD_PERSON_RIGHT_HAND, thirdperson); - builder.put(TransformType.THIRD_PERSON_LEFT_HAND, leftify(thirdperson)); - builder.put(TransformType.FIRST_PERSON_RIGHT_HAND, firstperson); - builder.put(TransformType.FIRST_PERSON_LEFT_HAND, leftify(firstperson)); - builder.put(TransformType.FIXED, get(0, 0, 0, 0, 180, 0, 1)); - ret.state = Optional.of(new SimpleModelState(builder.build())); - } - // item/handheld - else if (transform.equals("forge:default-tool")) - { - ret.state = Optional.of(new SimpleModelState(ImmutableMap.of( - TransformType.THIRD_PERSON_RIGHT_HAND, get(0, 4, 0.5f, 0, -90, 55, 0.85f), - TransformType.THIRD_PERSON_LEFT_HAND, get(0, 4, 0.5f, 0, 90, -55, 0.85f), - TransformType.FIRST_PERSON_RIGHT_HAND, get(1.13f, 3.2f, 1.13f, 0, -90, 25, 0.68f), - TransformType.FIRST_PERSON_LEFT_HAND, get(1.13f, 3.2f, 1.13f, 0, 90, -25, 0.68f)))); - } - else + ret.state = Optional.ofNullable(transforms.get(transform)); + if (!ret.state.isPresent()) { throw new JsonParseException("transform: unknown default string: " + transform); } diff --git a/src/main/java/net/minecraftforge/client/model/ItemTextureQuadConverter.java b/src/main/java/net/minecraftforge/client/model/ItemTextureQuadConverter.java index 456904931f..5eb8d1228d 100644 --- a/src/main/java/net/minecraftforge/client/model/ItemTextureQuadConverter.java +++ b/src/main/java/net/minecraftforge/client/model/ItemTextureQuadConverter.java @@ -268,7 +268,7 @@ public final class ItemTextureQuadConverter switch (format.getElement(e).getUsage()) { case POSITION: - if (transform == TRSRTransformation.identity()) + if (transform.isIdentity()) { builder.put(e, x, y, z, 1); } diff --git a/src/main/java/net/minecraftforge/client/model/ModelFluid.java b/src/main/java/net/minecraftforge/client/model/ModelFluid.java index f556f92991..3854502d04 100644 --- a/src/main/java/net/minecraftforge/client/model/ModelFluid.java +++ b/src/main/java/net/minecraftforge/client/model/ModelFluid.java @@ -322,7 +322,7 @@ public final class ModelFluid implements IModel { case POSITION: float[] data = new float[]{ x - side.getDirectionVec().getX() * eps, y, z - side.getDirectionVec().getZ() * eps, 1 }; - if(transformation.isPresent() && transformation.get() != TRSRTransformation.identity()) + if(transformation.isPresent() && !transformation.get().isIdentity()) { Vector4f vec = new Vector4f(data); transformation.get().getMatrix().transform(vec); diff --git a/src/main/java/net/minecraftforge/client/model/ModelLoader.java b/src/main/java/net/minecraftforge/client/model/ModelLoader.java index 97b0ef22b9..e725ef1daa 100644 --- a/src/main/java/net/minecraftforge/client/model/ModelLoader.java +++ b/src/main/java/net/minecraftforge/client/model/ModelLoader.java @@ -461,7 +461,7 @@ public final class ModelLoader extends ModelBakery } ItemCameraTransforms transforms = model.getAllTransforms(); - Map tMap = Maps.newHashMap(); + Map tMap = Maps.newEnumMap(TransformType.class); tMap.putAll(PerspectiveMapWrapper.getTransforms(transforms)); tMap.putAll(PerspectiveMapWrapper.getTransforms(state)); IModelState perState = new SimpleModelState(ImmutableMap.copyOf(tMap)); diff --git a/src/main/java/net/minecraftforge/client/model/MultiModel.java b/src/main/java/net/minecraftforge/client/model/MultiModel.java index 463b0b1429..968b9cb962 100644 --- a/src/main/java/net/minecraftforge/client/model/MultiModel.java +++ b/src/main/java/net/minecraftforge/client/model/MultiModel.java @@ -20,6 +20,7 @@ package net.minecraftforge.client.model; import java.util.Collection; +import java.util.EnumMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -47,7 +48,6 @@ import net.minecraftforge.common.model.TRSRTransformation; import net.minecraftforge.fml.common.FMLLog; import org.apache.commons.lang3.tuple.Pair; -import org.apache.logging.log4j.Level; import java.util.function.Function; import java.util.Optional; @@ -129,14 +129,18 @@ public final class MultiModel implements IModel // Only changes the base model based on perspective, may recurse for parts in the future. if(base != null && perspective) { - ImmutableMap.Builder> builder = ImmutableMap.builder(); + EnumMap> map = new EnumMap<>(TransformType.class); for(TransformType type : TransformType.values()) { Pair p = base.handlePerspective(type); IBakedModel newBase = p.getLeft(); - builder.put(type, Pair.of(new Baked(location, false, newBase, parts), new TRSRTransformation(p.getRight()))); + Matrix4f matrix = p.getRight(); + if (newBase != base || matrix != null) + { + map.put(type, Pair.of(new Baked(location, false, newBase, parts), new TRSRTransformation(matrix))); + } } - transforms = builder.build(); + transforms = ImmutableMap.copyOf(map); } else { @@ -212,8 +216,8 @@ public final class MultiModel implements IModel @Override public Pair handlePerspective(TransformType cameraTransformType) { - if(transforms.isEmpty()) return Pair.of(this, null); Pair p = transforms.get(cameraTransformType); + if (p == null) return Pair.of(this, null); return Pair.of(p.getLeft(), p.getRight().getMatrix()); } diff --git a/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java b/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java index c0924ee9a9..b4d062e564 100644 --- a/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java +++ b/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java @@ -1,5 +1,6 @@ package net.minecraftforge.client.model; +import java.util.EnumMap; import java.util.Optional; import com.google.common.collect.ImmutableMap; import net.minecraft.block.state.IBlockState; @@ -35,41 +36,46 @@ public class PerspectiveMapWrapper implements IBakedModel public static ImmutableMap getTransforms(IModelState state) { - ImmutableMap.Builder builder = ImmutableMap.builder(); + EnumMap map = new EnumMap<>(ItemCameraTransforms.TransformType.class); for(ItemCameraTransforms.TransformType type : ItemCameraTransforms.TransformType.values()) { Optional tr = state.apply(Optional.of(type)); if(tr.isPresent()) { - builder.put(type, tr.get()); + map.put(type, tr.get()); } } - return builder.build(); + return ImmutableMap.copyOf(map); } @SuppressWarnings("deprecation") public static ImmutableMap getTransforms(ItemCameraTransforms transforms) { - ImmutableMap.Builder builder = ImmutableMap.builder(); + EnumMap map = new EnumMap<>(ItemCameraTransforms.TransformType.class); for(ItemCameraTransforms.TransformType type : ItemCameraTransforms.TransformType.values()) { - builder.put(type, TRSRTransformation.blockCenterToCorner(new TRSRTransformation(transforms.getTransform(type)))); + if (transforms.hasCustomTransform(type)) + { + map.put(type, TRSRTransformation.blockCenterToCorner(TRSRTransformation.from(transforms.getTransform(type)))); + } } - return builder.build(); + return ImmutableMap.copyOf(map); } public static Pair handlePerspective(IBakedModel model, ImmutableMap transforms, ItemCameraTransforms.TransformType cameraTransformType) { - TRSRTransformation tr = transforms.get(cameraTransformType); - Matrix4f mat = null; - if(tr != null && !tr.equals(TRSRTransformation.identity())) mat = TRSRTransformation.blockCornerToCenter(tr).getMatrix(); - return Pair.of(model, mat); + TRSRTransformation tr = transforms.getOrDefault(cameraTransformType, TRSRTransformation.identity()); + if (!tr.isIdentity()) + { + return Pair.of(model, TRSRTransformation.blockCornerToCenter(tr).getMatrix()); + } + return Pair.of(model, null); } public static Pair handlePerspective(IBakedModel model, IModelState state, ItemCameraTransforms.TransformType cameraTransformType) { TRSRTransformation tr = state.apply(Optional.of(cameraTransformType)).orElse(TRSRTransformation.identity()); - if(tr != TRSRTransformation.identity()) + if (!tr.isIdentity()) { return Pair.of(model, TRSRTransformation.blockCornerToCenter(tr).getMatrix()); } diff --git a/src/main/java/net/minecraftforge/client/model/animation/ModelBlockAnimation.java b/src/main/java/net/minecraftforge/client/model/animation/ModelBlockAnimation.java index 0f16eeb0bd..3892a65060 100644 --- a/src/main/java/net/minecraftforge/client/model/animation/ModelBlockAnimation.java +++ b/src/main/java/net/minecraftforge/client/model/animation/ModelBlockAnimation.java @@ -529,7 +529,7 @@ public class ModelBlockAnimation { ModelBlockAnimation.MBJoint joint = new ModelBlockAnimation.MBJoint(info.getName()); Optional trOp = state.apply(Optional.of(joint)); - if(trOp.isPresent() && trOp.get() != TRSRTransformation.identity()) + if(trOp.isPresent() && !trOp.get().isIdentity()) { float w = info.getWeights().get(i)[0]; tmp = trOp.get().getMatrix(); diff --git a/src/main/java/net/minecraftforge/common/model/TRSRTransformation.java b/src/main/java/net/minecraftforge/common/model/TRSRTransformation.java index 3d48270f47..0b26ea73c9 100644 --- a/src/main/java/net/minecraftforge/common/model/TRSRTransformation.java +++ b/src/main/java/net/minecraftforge/common/model/TRSRTransformation.java @@ -20,6 +20,9 @@ package net.minecraftforge.common.model; import java.util.EnumMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import javax.annotation.Nullable; import javax.vecmath.AxisAngle4f; @@ -32,9 +35,11 @@ import javax.vecmath.Tuple4f; import javax.vecmath.Vector3f; import javax.vecmath.Vector4f; +import net.minecraft.client.renderer.block.model.ItemTransformVec3f; import net.minecraft.client.renderer.block.model.ModelRotation; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.Vec3i; +import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -42,7 +47,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import com.google.common.base.MoreObjects; -import java.util.Optional; import com.google.common.collect.Maps; /* @@ -67,7 +71,7 @@ public final class TRSRTransformation implements IModelState, ITransformation private Vector3f scale; private Quat4f rightRot; - public TRSRTransformation(Matrix4f matrix) + public TRSRTransformation(@Nullable Matrix4f matrix) { if(matrix == null) { @@ -89,38 +93,68 @@ public final class TRSRTransformation implements IModelState, ITransformation full = true; } - @Deprecated + /** @deprecated use {@link #from(ItemTransformVec3f)} */ + @Deprecated // TODO: remove / make private @SideOnly(Side.CLIENT) - public TRSRTransformation(net.minecraft.client.renderer.block.model.ItemTransformVec3f transform) + public TRSRTransformation(ItemTransformVec3f transform) { this(toVecmath(transform.translation), quatFromXYZDegrees(toVecmath(transform.rotation)), toVecmath(transform.scale), null); } + /** @deprecated use {@link #from(ModelRotation)} */ + @Deprecated // TODO: remove @SideOnly(Side.CLIENT) public TRSRTransformation(ModelRotation rotation) { this(rotation.getMatrix()); } + /** @deprecated use {@link #from(EnumFacing)} */ + @Deprecated // TODO: remove @SideOnly(Side.CLIENT) public TRSRTransformation(EnumFacing facing) { this(getMatrix(facing)); } + @Deprecated + @SideOnly(Side.CLIENT) + public static TRSRTransformation from(ItemTransformVec3f transform) + { + return transform.equals(ItemTransformVec3f.DEFAULT) ? identity : new TRSRTransformation(transform); + } + + @SideOnly(Side.CLIENT) + public static TRSRTransformation from(ModelRotation rotation) + { + return Cache.get(rotation); + } + + @SideOnly(Side.CLIENT) + public static TRSRTransformation from(EnumFacing facing) + { + return Cache.get(getRotation(facing)); + } + @SideOnly(Side.CLIENT) public static Matrix4f getMatrix(EnumFacing facing) { - switch(facing) + return getRotation(facing).getMatrix(); + } + + @SideOnly(Side.CLIENT) + public static ModelRotation getRotation(EnumFacing facing) + { + switch (facing) { - case DOWN: return ModelRotation.X90_Y0.getMatrix(); - case UP: return ModelRotation.X270_Y0.getMatrix(); - case NORTH: return TRSRTransformation.identity.matrix; - case SOUTH: return ModelRotation.X0_Y180.getMatrix(); - case WEST: return ModelRotation.X0_Y270.getMatrix(); - case EAST: return ModelRotation.X0_Y90.getMatrix(); - default: return new Matrix4f(); + case DOWN: return ModelRotation.X90_Y0; + case UP: return ModelRotation.X270_Y0; + case NORTH: return ModelRotation.X0_Y0; + case SOUTH: return ModelRotation.X0_Y180; + case WEST: return ModelRotation.X0_Y270; + case EAST: return ModelRotation.X0_Y90; } + throw new IllegalArgumentException(String.valueOf(facing)); } private static final TRSRTransformation identity; @@ -140,6 +174,8 @@ public final class TRSRTransformation implements IModelState, ITransformation public TRSRTransformation compose(TRSRTransformation b) { + if (this.isIdentity()) return b; + if (b.isIdentity()) return this; Matrix4f m = getMatrix(); m.mul(b.getMatrix()); return new TRSRTransformation(m); @@ -147,7 +183,7 @@ public final class TRSRTransformation implements IModelState, ITransformation public TRSRTransformation inverse() { - if(this == identity) return this; + if (this.isIdentity()) return this; Matrix4f m = getMatrix(); m.invert(); return new TRSRTransformation(m); @@ -523,9 +559,14 @@ public final class TRSRTransformation implements IModelState, ITransformation */ @Deprecated @SideOnly(Side.CLIENT) - public net.minecraft.client.renderer.block.model.ItemTransformVec3f toItemTransform() + public ItemTransformVec3f toItemTransform() { - return new net.minecraft.client.renderer.block.model.ItemTransformVec3f(toLwjgl(toXYZDegrees(getLeftRot())), toLwjgl(getTranslation()), toLwjgl(getScale())); + return new ItemTransformVec3f(toLwjgl(toXYZDegrees(getLeftRot())), toLwjgl(getTranslation()), toLwjgl(getScale())); + } + + public boolean isIdentity() + { + return this.equals(identity); } @Override @@ -625,6 +666,8 @@ public final class TRSRTransformation implements IModelState, ITransformation */ public static TRSRTransformation blockCenterToCorner(TRSRTransformation transform) { + if (transform.isIdentity()) return transform; + Matrix4f ret = new Matrix4f(transform.getMatrix()), tmp = new Matrix4f(); tmp.setIdentity(); tmp.m03 = tmp.m13 = tmp.m23 = .5f; @@ -639,6 +682,8 @@ public final class TRSRTransformation implements IModelState, ITransformation */ public static TRSRTransformation blockCornerToCenter(TRSRTransformation transform) { + if (transform.isIdentity()) return transform; + Matrix4f ret = new Matrix4f(transform.getMatrix()), tmp = new Matrix4f(); tmp.setIdentity(); tmp.m03 = tmp.m13 = tmp.m23 = -.5f; @@ -653,7 +698,7 @@ public final class TRSRTransformation implements IModelState, ITransformation { final int prime = 31; int result = 1; - result = prime * result + ((matrix == null) ? 0 : matrix.hashCode()); + result = prime * result + Objects.hashCode(matrix); return result; } @@ -664,12 +709,7 @@ public final class TRSRTransformation implements IModelState, ITransformation if (obj == null) return false; if (getClass() != obj.getClass()) return false; TRSRTransformation other = (TRSRTransformation) obj; - if (matrix == null) - { - if (other.matrix != null) return false; - } - else if (!matrix.equals(other.matrix)) return false; - return true; + return Objects.equals(matrix, other.matrix); } @SideOnly(Side.CLIENT) @@ -806,4 +846,20 @@ public final class TRSRTransformation implements IModelState, ITransformation return new TRSRTransformation(null, null, new Vector3f(0, 0, 0), null); } } + + @SideOnly(Side.CLIENT) + private static final class Cache + { + private static final Map rotations = new EnumMap<>(ModelRotation.class); + + static + { + rotations.put(ModelRotation.X0_Y0, identity()); + } + + static TRSRTransformation get(ModelRotation rotation) + { + return rotations.computeIfAbsent(rotation, r -> new TRSRTransformation(ForgeHooksClient.getMatrix(r))); + } + } }