diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelData.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelData.java index 2d437a1d2..7f53555ba 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelData.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelData.java @@ -1,24 +1,27 @@ package com.jozufozu.flywheel.core.materials.model; -import java.nio.FloatBuffer; - import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.core.materials.BasicData; -import com.jozufozu.flywheel.util.Attribute; +import com.jozufozu.flywheel.util.WriteSafe; +import com.jozufozu.flywheel.util.transform.Rotate; +import com.jozufozu.flywheel.util.transform.Scale; +import com.jozufozu.flywheel.util.transform.Translate; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; +import com.mojang.math.Quaternion; -public class ModelData extends BasicData { - private static final float[] empty = new float[25]; +import net.minecraft.util.Mth; - public final float[] matrices = empty.clone(); - private final FloatBuffer wrap = FloatBuffer.wrap(matrices); +public class ModelData extends BasicData implements Translate, Rotate, Scale { + public final Matrix4f model = new Matrix4f(); + public final Matrix3f normal = new Matrix3f(); public ModelData setTransform(PoseStack stack) { - this.wrap.position(0); - - ((Attribute)(Object) stack.last().pose()).append(this.wrap); - ((Attribute)(Object) stack.last().normal()).append(this.wrap); markDirty(); + + this.model.load(stack.last().pose()); + this.normal.load(stack.last().normal()); return this; } @@ -30,15 +33,63 @@ public class ModelData extends BasicData { *

*/ public ModelData setEmptyTransform() { - this.wrap.position(0) - .put(empty); markDirty(); + + this.model.load(new Matrix4f()); + this.normal.load(new Matrix3f()); + return this; + } + + public ModelData loadIdentity() { + markDirty(); + + this.model.setIdentity(); + this.normal.setIdentity(); return this; } @Override public void write(VecBuffer buf) { super.write(buf); - buf.putFloatArray(matrices); + ((WriteSafe) (Object) model).write(buf); + ((WriteSafe) (Object) normal).write(buf); + } + + @Override + public ModelData multiply(Quaternion quaternion) { + markDirty(); + + model.multiply(quaternion); + normal.mul(quaternion); + return this; + } + + @Override + public ModelData scale(float pX, float pY, float pZ) { + markDirty(); + + model.multiply(Matrix4f.createScaleMatrix(pX, pY, pZ)); + if (pX == pY && pY == pZ) { + if (pX > 0.0F) { + return this; + } + + normal.mul(-1.0F); + } + + float f = 1.0F / pX; + float f1 = 1.0F / pY; + float f2 = 1.0F / pZ; + float f3 = Mth.fastInvCubeRoot(f * f1 * f2); + normal.mul(Matrix3f.createScaleMatrix(f3 * f, f3 * f1, f3 * f2)); + return this; + } + + @Override + public ModelData translate(double x, double y, double z) { + markDirty(); + + model.multiplyWithTranslation((float) x, (float) y, (float) z); + return this; } } diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/writer/UnsafeModelWriter.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/writer/UnsafeModelWriter.java index 2b07cebf0..090070cc2 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/writer/UnsafeModelWriter.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/writer/UnsafeModelWriter.java @@ -6,6 +6,7 @@ import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.backend.struct.StructType; import com.jozufozu.flywheel.backend.struct.UnsafeBufferWriter; import com.jozufozu.flywheel.core.materials.model.ModelData; +import com.jozufozu.flywheel.util.WriteUnsafe; public class UnsafeModelWriter extends UnsafeBufferWriter { @@ -25,10 +26,9 @@ public class UnsafeModelWriter extends UnsafeBufferWriter { addr += 6; - float[] matrices = d.matrices; - for (int i = 0; i < matrices.length; i++) { - MemoryUtil.memPutFloat(addr + i * 4L, matrices[i]); - } + ((WriteUnsafe) (Object) d.model).writeUnsafe(addr); + addr += 4 * 16; + ((WriteUnsafe) (Object) d.normal).writeUnsafe(addr); advance(); } diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedData.java b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedData.java index b43711cf9..15a45882a 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedData.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedData.java @@ -2,6 +2,8 @@ package com.jozufozu.flywheel.core.materials.oriented; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.jozufozu.flywheel.core.materials.BasicData; +import com.jozufozu.flywheel.util.transform.Rotate; +import com.jozufozu.flywheel.util.transform.Translate; import com.jozufozu.flywheel.util.vec.Vec3; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; @@ -83,6 +85,15 @@ public class OrientedData extends BasicData { return this; } + public OrientedData resetRotation() { + this.qX = 0; + this.qY = 0; + this.qZ = 0; + this.qW = 1; + markDirty(); + return this; + } + @Override public void write(VecBuffer buf) { super.write(buf); diff --git a/src/main/java/com/jozufozu/flywheel/mixin/matrix/Matrix3fMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/matrix/Matrix3fMixin.java index b40c487f5..1c5449100 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/matrix/Matrix3fMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/matrix/Matrix3fMixin.java @@ -1,11 +1,12 @@ package com.jozufozu.flywheel.mixin.matrix; -import java.nio.FloatBuffer; - +import org.lwjgl.system.MemoryUtil; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import com.jozufozu.flywheel.util.Attribute; +import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; +import com.jozufozu.flywheel.util.WriteSafe; +import com.jozufozu.flywheel.util.WriteUnsafe; import com.mojang.math.Matrix3f; import net.minecraftforge.api.distmarker.Dist; @@ -13,7 +14,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) @Mixin(Matrix3f.class) -public abstract class Matrix3fMixin implements Attribute { +public abstract class Matrix3fMixin implements WriteUnsafe, WriteSafe { @Shadow protected float m00; @Shadow protected float m01; @@ -26,15 +27,28 @@ public abstract class Matrix3fMixin implements Attribute { @Shadow protected float m22; @Override - public void append(FloatBuffer buffer) { - buffer.put(m00); - buffer.put(m10); - buffer.put(m20); - buffer.put(m01); - buffer.put(m11); - buffer.put(m21); - buffer.put(m02); - buffer.put(m12); - buffer.put(m22); + public void writeUnsafe(long addr) { + MemoryUtil.memPutFloat(addr, m00); + MemoryUtil.memPutFloat(addr += 4L, m10); + MemoryUtil.memPutFloat(addr += 4L, m20); + MemoryUtil.memPutFloat(addr += 4L, m01); + MemoryUtil.memPutFloat(addr += 4L, m11); + MemoryUtil.memPutFloat(addr += 4L, m21); + MemoryUtil.memPutFloat(addr += 4L, m02); + MemoryUtil.memPutFloat(addr += 4L, m12); + MemoryUtil.memPutFloat(addr += 4L, m22); + } + + @Override + public void write(VecBuffer buffer) { + buffer.putFloat(m00); + buffer.putFloat(m10); + buffer.putFloat(m20); + buffer.putFloat(m01); + buffer.putFloat(m11); + buffer.putFloat(m21); + buffer.putFloat(m02); + buffer.putFloat(m12); + buffer.putFloat(m22); } } diff --git a/src/main/java/com/jozufozu/flywheel/mixin/matrix/Matrix4fMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/matrix/Matrix4fMixin.java index 378252cbc..33bc6da8f 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/matrix/Matrix4fMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/matrix/Matrix4fMixin.java @@ -1,11 +1,12 @@ package com.jozufozu.flywheel.mixin.matrix; -import java.nio.FloatBuffer; - +import org.lwjgl.system.MemoryUtil; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import com.jozufozu.flywheel.util.Attribute; +import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; +import com.jozufozu.flywheel.util.WriteSafe; +import com.jozufozu.flywheel.util.WriteUnsafe; import com.mojang.math.Matrix4f; import net.minecraftforge.api.distmarker.Dist; @@ -13,7 +14,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) @Mixin(Matrix4f.class) -public abstract class Matrix4fMixin implements Attribute { +public abstract class Matrix4fMixin implements WriteUnsafe, WriteSafe { @Shadow protected float m00; @Shadow protected float m01; @@ -33,22 +34,42 @@ public abstract class Matrix4fMixin implements Attribute { @Shadow protected float m33; @Override - public void append(FloatBuffer buffer) { - buffer.put(m00); - buffer.put(m10); - buffer.put(m20); - buffer.put(m30); - buffer.put(m01); - buffer.put(m11); - buffer.put(m21); - buffer.put(m31); - buffer.put(m02); - buffer.put(m12); - buffer.put(m22); - buffer.put(m32); - buffer.put(m03); - buffer.put(m13); - buffer.put(m23); - buffer.put(m33); + public void writeUnsafe(long addr) { + MemoryUtil.memPutFloat(addr, m00); + MemoryUtil.memPutFloat(addr += 4L, m10); + MemoryUtil.memPutFloat(addr += 4L, m20); + MemoryUtil.memPutFloat(addr += 4L, m30); + MemoryUtil.memPutFloat(addr += 4L, m01); + MemoryUtil.memPutFloat(addr += 4L, m11); + MemoryUtil.memPutFloat(addr += 4L, m21); + MemoryUtil.memPutFloat(addr += 4L, m31); + MemoryUtil.memPutFloat(addr += 4L, m02); + MemoryUtil.memPutFloat(addr += 4L, m12); + MemoryUtil.memPutFloat(addr += 4L, m22); + MemoryUtil.memPutFloat(addr += 4L, m32); + MemoryUtil.memPutFloat(addr += 4L, m03); + MemoryUtil.memPutFloat(addr += 4L, m13); + MemoryUtil.memPutFloat(addr += 4L, m23); + MemoryUtil.memPutFloat(addr += 4L, m33); + } + + @Override + public void write(VecBuffer buf) { + buf.putFloat(m00); + buf.putFloat(m10); + buf.putFloat(m20); + buf.putFloat(m30); + buf.putFloat(m01); + buf.putFloat(m11); + buf.putFloat(m21); + buf.putFloat(m31); + buf.putFloat(m02); + buf.putFloat(m12); + buf.putFloat(m22); + buf.putFloat(m32); + buf.putFloat(m03); + buf.putFloat(m13); + buf.putFloat(m23); + buf.putFloat(m33); } } diff --git a/src/main/java/com/jozufozu/flywheel/util/Attribute.java b/src/main/java/com/jozufozu/flywheel/util/Attribute.java deleted file mode 100644 index 75739b500..000000000 --- a/src/main/java/com/jozufozu/flywheel/util/Attribute.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.jozufozu.flywheel.util; - -import java.nio.FloatBuffer; - -public interface Attribute { - - /** - * Append the contents of this object to the given FloatBuffer. - */ - void append(FloatBuffer buffer); -} diff --git a/src/main/java/com/jozufozu/flywheel/util/WriteSafe.java b/src/main/java/com/jozufozu/flywheel/util/WriteSafe.java new file mode 100644 index 000000000..0fdc7f128 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/util/WriteSafe.java @@ -0,0 +1,7 @@ +package com.jozufozu.flywheel.util; + +import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; + +public interface WriteSafe { + void write(VecBuffer buf); +} diff --git a/src/main/java/com/jozufozu/flywheel/util/WriteUnsafe.java b/src/main/java/com/jozufozu/flywheel/util/WriteUnsafe.java new file mode 100644 index 000000000..7d963ee5c --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/util/WriteUnsafe.java @@ -0,0 +1,9 @@ +package com.jozufozu.flywheel.util; + +public interface WriteUnsafe { + + /** + * Write the contents of this object into sequential memory starting at the given address. + */ + void writeUnsafe(long addr); +} diff --git a/src/main/java/com/jozufozu/flywheel/util/transform/Rotate.java b/src/main/java/com/jozufozu/flywheel/util/transform/Rotate.java new file mode 100644 index 000000000..68814740c --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/util/transform/Rotate.java @@ -0,0 +1,72 @@ +package com.jozufozu.flywheel.util.transform; + +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; + +import net.minecraft.core.Direction; + +public interface Rotate { + + Self multiply(Quaternion quaternion); + + default Self rotate(Direction axis, float radians) { + if (radians == 0) + return (Self) this; + return multiply(axis.step() + .rotation(radians)); + } + + default Self rotate(double angle, Direction.Axis axis) { + Vector3f vec = + axis == Direction.Axis.X ? Vector3f.XP : axis == Direction.Axis.Y ? Vector3f.YP : Vector3f.ZP; + return multiply(vec, angle); + } + + default Self rotateX(double angle) { + return multiply(Vector3f.XP, angle); + } + + default Self rotateY(double angle) { + return multiply(Vector3f.YP, angle); + } + + default Self rotateZ(double angle) { + return multiply(Vector3f.ZP, angle); + } + + default Self rotateXRadians(double angle) { + return multiplyRadians(Vector3f.XP, angle); + } + + default Self rotateYRadians(double angle) { + return multiplyRadians(Vector3f.YP, angle); + } + + default Self rotateZRadians(double angle) { + return multiplyRadians(Vector3f.ZP, angle); + } + + default Self multiply(Vector3f axis, double angle) { + if (angle == 0) + return (Self) this; + return multiply(axis.rotationDegrees((float) angle)); + } + + default Self multiplyRadians(Vector3f axis, double angle) { + if (angle == 0) + return (Self) this; + return multiply(axis.rotation((float) angle)); + } + + default Self rotateToFace(Direction facing) { + switch (facing) { + case SOUTH -> multiply(Vector3f.YP.rotationDegrees(180)); + case WEST -> multiply(Vector3f.YP.rotationDegrees(90)); + case NORTH -> multiply(Vector3f.YP.rotationDegrees(0)); + case EAST -> multiply(Vector3f.YP.rotationDegrees(270)); + case UP -> multiply(Vector3f.XP.rotationDegrees(90)); + case DOWN -> multiply(Vector3f.XN.rotationDegrees(90)); + } + return (Self) this; + } +} diff --git a/src/main/java/com/jozufozu/flywheel/util/transform/Scale.java b/src/main/java/com/jozufozu/flywheel/util/transform/Scale.java new file mode 100644 index 000000000..8fd7e7ab7 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/util/transform/Scale.java @@ -0,0 +1,9 @@ +package com.jozufozu.flywheel.util.transform; + +public interface Scale { + Self scale(float factorX, float factorY, float factorZ); + + default Self scale(float factor) { + return scale(factor, factor, factor); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/util/transform/TransformStack.java b/src/main/java/com/jozufozu/flywheel/util/transform/TransformStack.java index f6cdf2ade..5779b8bfd 100644 --- a/src/main/java/com/jozufozu/flywheel/util/transform/TransformStack.java +++ b/src/main/java/com/jozufozu/flywheel/util/transform/TransformStack.java @@ -1,152 +1,7 @@ package com.jozufozu.flywheel.util.transform; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3f; - -import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; -import net.minecraft.world.phys.Vec3; - -public interface TransformStack { - Vec3 CENTER = new Vec3(0.5, 0.5, 0.5); - - TransformStack translate(double x, double y, double z); - - TransformStack multiply(Quaternion quaternion); - - TransformStack scale(float factorX, float factorY, float factorZ); - +public interface TransformStack extends Scale, Translate, Rotate { TransformStack push(); TransformStack pop(); - - default TransformStack scale(float factor) { - return scale(factor, factor, factor); - } - - default TransformStack rotate(Direction axis, float radians) { - if (radians == 0) - return this; - return multiply(axis.step() - .rotation(radians)); - } - - default TransformStack rotate(double angle, Direction.Axis axis) { - Vector3f vec = - axis == Direction.Axis.X ? Vector3f.XP : axis == Direction.Axis.Y ? Vector3f.YP : Vector3f.ZP; - return multiply(vec, angle); - } - - default TransformStack rotateX(double angle) { - return multiply(Vector3f.XP, angle); - } - - default TransformStack rotateY(double angle) { - return multiply(Vector3f.YP, angle); - } - - default TransformStack rotateZ(double angle) { - return multiply(Vector3f.ZP, angle); - } - - default TransformStack rotateXRadians(double angle) { - return multiplyRadians(Vector3f.XP, angle); - } - - default TransformStack rotateYRadians(double angle) { - return multiplyRadians(Vector3f.YP, angle); - } - - default TransformStack rotateZRadians(double angle) { - return multiplyRadians(Vector3f.ZP, angle); - } - - default TransformStack centre() { - return translateAll(0.5); - } - - default TransformStack unCentre() { - return translateAll(-0.5); - } - - default TransformStack translateAll(double v) { - return translate(v, v, v); - } - - default TransformStack translateX(double x) { - return translate(x, 0, 0); - } - - default TransformStack translateY(double y) { - return translate(0, y, 0); - } - - default TransformStack translateZ(double z) { - return translate(0, 0, z); - } - - default TransformStack translate(Vec3i vec) { - return translate(vec.getX(), vec.getY(), vec.getZ()); - } - - default TransformStack translate(Vec3 vec) { - return translate(vec.x, vec.y, vec.z); - } - - default TransformStack translate(Vector3f vec) { - return translate(vec.x(), vec.y(), vec.z()); - } - - default TransformStack translateBack(Vec3 vec) { - return translate(-vec.x, -vec.y, -vec.z); - } - - default TransformStack translateBack(Vec3i vec) { - return translate(-vec.getX(), -vec.getY(), -vec.getZ()); - } - - default TransformStack nudge(int id) { - long randomBits = (long) id * 31L * 493286711L; - randomBits = randomBits * randomBits * 4392167121L + randomBits * 98761L; - float xNudge = (((float) (randomBits >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; - float yNudge = (((float) (randomBits >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; - float zNudge = (((float) (randomBits >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; - return translate(xNudge, yNudge, zNudge); - } - - default TransformStack multiply(Vector3f axis, double angle) { - if (angle == 0) - return this; - return multiply(axis.rotationDegrees((float) angle)); - } - - default TransformStack multiplyRadians(Vector3f axis, double angle) { - if (angle == 0) - return this; - return multiply(axis.rotation((float) angle)); - } - - default TransformStack rotateToFace(Direction facing) { - switch (facing) { - case SOUTH: - multiply(Vector3f.YP.rotationDegrees(180)); - break; - case WEST: - multiply(Vector3f.YP.rotationDegrees(90)); - break; - case NORTH: - multiply(Vector3f.YP.rotationDegrees(0)); - break; - case EAST: - multiply(Vector3f.YP.rotationDegrees(270)); - break; - case UP: - multiply(Vector3f.XP.rotationDegrees(90)); - break; - case DOWN: - multiply(Vector3f.XN.rotationDegrees(90)); - break; - } - return this; - } } diff --git a/src/main/java/com/jozufozu/flywheel/util/transform/Translate.java b/src/main/java/com/jozufozu/flywheel/util/transform/Translate.java new file mode 100644 index 000000000..2e3da5a32 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/util/transform/Translate.java @@ -0,0 +1,67 @@ +package com.jozufozu.flywheel.util.transform; + +import com.mojang.math.Vector3f; + +import net.minecraft.core.Vec3i; +import net.minecraft.world.phys.Vec3; + +public interface Translate { + Self translate(double x, double y, double z); + + default Self centre() { + return translateAll(0.5); + } + + default Self unCentre() { + return translateAll(-0.5); + } + + default Self translateAll(double v) { + return translate(v, v, v); + } + + default Self translateX(double x) { + return translate(x, 0, 0); + } + + default Self translateY(double y) { + return translate(0, y, 0); + } + + default Self translateZ(double z) { + return translate(0, 0, z); + } + + default Self translate(Vec3i vec) { + return translate(vec.getX(), vec.getY(), vec.getZ()); + } + + default Self translate(Vec3 vec) { + return translate(vec.x, vec.y, vec.z); + } + + default Self translate(Vector3f vec) { + return translate(vec.x(), vec.y(), vec.z()); + } + + default Self translateBack(Vec3 vec) { + return translate(-vec.x, -vec.y, -vec.z); + } + + default Self translateBack(double x, double y, double z) { + return translate(-x, -y, -z); + } + + default Self translateBack(Vec3i vec) { + return translate(-vec.getX(), -vec.getY(), -vec.getZ()); + } + + default Self nudge(int id) { + long randomBits = (long) id * 31L * 493286711L; + randomBits = randomBits * randomBits * 4392167121L + randomBits * 98761L; + float xNudge = (((float) (randomBits >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + float yNudge = (((float) (randomBits >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + float zNudge = (((float) (randomBits >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + return translate(xNudge, yNudge, zNudge); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java index 3ed6547ec..b93961253 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java @@ -31,7 +31,6 @@ import net.minecraft.world.level.block.state.properties.ChestType; public class ChestInstance extends TileEntityInstance implements IDynamicInstance { - private final MatrixTransformStack stack = new MatrixTransformStack(); private final OrientedData body; private final ModelData lid; @@ -57,9 +56,6 @@ public class ChestInstance extends TileE if (block instanceof AbstractChestBlock) { -// MatrixStack stack = new MatrixStack(); -// -// stack.push(); float horizontalAngle = blockState.getValue(ChestBlock.FACING).toYRot(); baseRotation = Vector3f.YP.rotationDegrees(-horizontalAngle); @@ -92,7 +88,7 @@ public class ChestInstance extends TileE float angleX = -(progress * ((float) Math.PI / 2F)); - stack.setIdentity() + lid.loadIdentity() .translate(getInstancePosition()) .translate(0, 9f/16f, 0) .centre() @@ -101,9 +97,6 @@ public class ChestInstance extends TileE .translate(0, 0, 1f / 16f) .multiply(Vector3f.XP.rotation(angleX)) .translate(0, 0, -1f / 16f); - - lid.setTransform(stack.unwrap()); - } @Override