From 4675e0ad15a21e37679d0f8102a7f42ac23dbdb9 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 26 Mar 2021 22:59:47 -0700 Subject: [PATCH] Stop relying on IDynamicInstance#beginFrame to setup instance state. - Gantry carriages no longer update when not necessary. --- .../components/crank/HandCrankInstance.java | 12 +++-- .../components/flywheel/FlyWheelInstance.java | 16 +++--- .../components/press/PressInstance.java | 12 ++--- .../chassis/StickerInstance.java | 10 +++- .../gantry/GantryCarriageInstance.java | 50 ++++++++++++++----- .../relays/encased/SplitShaftInstance.java | 2 - .../block/depot/EjectorInstance.java | 1 - .../block/mechanicalArm/ArmInstance.java | 25 +++++----- .../block/redstone/AnalogLeverInstance.java | 6 +-- .../block/SchematicannonInstance.java | 2 + 10 files changed, 88 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java index f825d1927..8035fb705 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java @@ -14,11 +14,13 @@ import net.minecraft.util.Direction; public class HandCrankInstance extends SingleRotatingInstance implements IDynamicInstance { + private final HandCrankTileEntity tile; private InstanceKey crank; private Direction facing; - public HandCrankInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public HandCrankInstance(InstancedTileRenderer modelManager, HandCrankTileEntity tile) { super(modelManager, tile); + this.tile = tile; Block block = blockState.getBlock(); AllBlockPartials renderedHandle = null; @@ -30,16 +32,20 @@ public class HandCrankInstance extends SingleRotatingInstance implements IDynami facing = blockState.get(BlockStateProperties.FACING); InstancedModel model = renderedHandle.renderOnDirectionalSouthModel(modelManager, blockState, facing.getOpposite()); crank = model.createInstance(); + + rotateCrank(); } @Override public void beginFrame() { if (crank == null) return; - HandCrankTileEntity crankTile = (HandCrankTileEntity) tile; + rotateCrank(); + } + private void rotateCrank() { Direction.Axis axis = facing.getAxis(); - float angle = (crankTile.independentAngle + AnimationTickHolder.getPartialTicks() * crankTile.chasingVelocity) / 360; + float angle = (tile.independentAngle + AnimationTickHolder.getPartialTicks() * tile.chasingVelocity) / 360; MatrixStack ms = new MatrixStack(); MatrixStacker.of(ms) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index 8b1fc41bf..c3c0d478e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -37,11 +37,8 @@ public class FlyWheelInstance extends KineticTileInstance im protected InstanceKey upperSliding; protected InstanceKey lowerSliding; - protected float lastAngle = Float.NaN; - protected boolean firstFrame = true; - public FlyWheelInstance(InstancedTileRenderer modelManager, FlywheelTileEntity tile) { super(modelManager, tile); @@ -70,6 +67,8 @@ public class FlyWheelInstance extends KineticTileInstance im } else { connectors = Collections.emptyList(); } + + animate(tile.angle); } @Override @@ -80,8 +79,14 @@ public class FlyWheelInstance extends KineticTileInstance im float speed = tile.visualSpeed.get(partialTicks) * 3 / 10f; float angle = tile.angle + speed * partialTicks; - if (!firstFrame && Math.abs(angle - lastAngle) < 0.001) return; + if (Math.abs(angle - lastAngle) < 0.001) return; + animate(angle); + + lastAngle = angle; + } + + private void animate(float angle) { MatrixStack ms = new MatrixStack(); MatrixStacker msr = MatrixStacker.of(ms); @@ -121,9 +126,6 @@ public class FlyWheelInstance extends KineticTileInstance im .unCentre(); wheel.getInstance().setTransform(ms); - - lastAngle = angle; - firstFrame = false; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java index b4a3eff51..e9985adb6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java @@ -14,25 +14,25 @@ import com.simibubi.create.foundation.utility.MatrixStacker; public class PressInstance extends ShaftInstance implements IDynamicInstance { private final InstanceKey pressHead; + private final MechanicalPressTileEntity press; - public PressInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + public PressInstance(InstancedTileRenderer dispatcher, MechanicalPressTileEntity tile) { super(dispatcher, tile); + press = tile; pressHead = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontalModel(dispatcher, blockState).createInstance(); - - transformModels((MechanicalPressTileEntity) tile); + transformModels(); } @Override public void beginFrame() { - MechanicalPressTileEntity press = (MechanicalPressTileEntity) tile; if (!press.running) return; - transformModels(press); + transformModels(); } - private void transformModels(MechanicalPressTileEntity press) { + private void transformModels() { float renderedHeadOffset = getRenderedHeadOffset(press); MatrixStack ms = new MatrixStack(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java index 3fd32da92..2d0a9dec7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java @@ -28,6 +28,8 @@ public class StickerInstance extends TileEntityInstance imple fakeWorld = tile.getWorld() != Minecraft.getInstance().world; facing = blockState.get(StickerBlock.FACING); offset = blockState.get(StickerBlock.EXTENDED) ? 1 : 0; + + animateHead(offset); } @Override @@ -40,6 +42,12 @@ public class StickerInstance extends TileEntityInstance imple if (MathHelper.epsilonEquals(offset, lastOffset)) return; + animateHead(offset); + + lastOffset = offset; + } + + private void animateHead(float offset) { MatrixStack stack = new MatrixStack(); MatrixStacker.of(stack) .translate(getInstancePosition()) @@ -52,8 +60,6 @@ public class StickerInstance extends TileEntityInstance imple head.getInstance() .setTransform(stack); - - lastOffset = offset; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java index 1ea699d6c..ff9e962d6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java @@ -15,6 +15,7 @@ import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; public class GantryCarriageInstance extends ShaftInstance implements IDynamicInstance { @@ -23,8 +24,11 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns final Direction facing; final Boolean alongFirst; final Direction.Axis rotationAxis; + final float rotationMult; final BlockPos visualPos; + private float lastAngle = Float.NaN; + public GantryCarriageInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { super(dispatcher, tile); @@ -36,27 +40,29 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns alongFirst = blockState.get(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE); rotationAxis = KineticTileEntityRenderer.getRotationAxisOf(tile); + rotationMult = getRotationMultiplier(getGantryAxis(), facing); + visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos() : tile.getPos() .offset(facing.getOpposite()); + + animateCogs(getCogAngle()); } @Override public void beginFrame() { - float angleForTe = GantryCarriageRenderer.getAngleForTe(tile, visualPos, rotationAxis); + float cogAngle = getCogAngle(); - Direction.Axis gantryAxis = Direction.Axis.X; - for (Direction.Axis axis : Iterate.axes) - if (axis != rotationAxis && axis != facing.getAxis()) - gantryAxis = axis; + if (MathHelper.epsilonEquals(cogAngle, lastAngle)) return; - if (gantryAxis == Direction.Axis.Z) - if (facing == Direction.DOWN) - angleForTe *= -1; - if (gantryAxis == Direction.Axis.Y) - if (facing == Direction.NORTH || facing == Direction.EAST) - angleForTe *= -1; + animateCogs(cogAngle); + } + private float getCogAngle() { + return GantryCarriageRenderer.getAngleForTe(tile, visualPos, rotationAxis) * rotationMult; + } + + private void animateCogs(float cogAngle) { MatrixStack ms = new MatrixStack(); MatrixStacker.of(ms) .translate(getInstancePosition()) @@ -65,13 +71,33 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) .rotateY(alongFirst ^ facing.getAxis() == Direction.Axis.Z ? 90 : 0) .translate(0, -9 / 16f, 0) - .multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe)) + .multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-cogAngle)) .translate(0, 9 / 16f, 0) .unCentre(); gantryCogs.getInstance().setTransform(ms); } + static float getRotationMultiplier(Direction.Axis gantryAxis, Direction facing) { + float multiplier = 1; + if (gantryAxis == Direction.Axis.Z) + if (facing == Direction.DOWN) + multiplier *= -1; + if (gantryAxis == Direction.Axis.Y) + if (facing == Direction.NORTH || facing == Direction.EAST) + multiplier *= -1; + + return multiplier; + } + + private Direction.Axis getGantryAxis() { + Direction.Axis gantryAxis = Direction.Axis.X; + for (Direction.Axis axis : Iterate.axes) + if (axis != rotationAxis && axis != facing.getAxis()) + gantryAxis = axis; + return gantryAxis; + } + @Override public void updateLight() { relight(pos, gantryCogs.getInstance(), rotatingModel.getInstance()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index d55d5f4ce..1a82c8645 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -34,8 +34,6 @@ public class SplitShaftInstance extends KineticTileInstance> clawGrips; private final ArrayList> models; + private final ArmTileEntity arm; private boolean firstTick = true; - public ArmInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public ArmInstance(InstancedTileRenderer modelManager, ArmTileEntity tile) { super(modelManager, tile); RenderMaterial> mat = getTransformMaterial(); @@ -51,33 +51,35 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta clawGrips = Lists.newArrayList(clawGrip1, clawGrip2); models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2); + arm = tile; + + animateArm(false); } @Override public void beginFrame() { - ArmTileEntity arm = (ArmTileEntity) tile; boolean settled = arm.baseAngle.settled() && arm.lowerArmAngle.settled() && arm.upperArmAngle.settled() && arm.headAngle.settled(); boolean rave = arm.phase == ArmTileEntity.Phase.DANCING; if (!settled || rave || firstTick) - transformModels(arm, rave); + animateArm(rave); if (settled) firstTick = false; } - private void transformModels(ArmTileEntity arm, boolean rave) { + private void animateArm(boolean rave) { float pt = AnimationTickHolder.getPartialTicks(); int color = 0xFFFFFF; - float baseAngle = arm.baseAngle.get(pt); - float lowerArmAngle = arm.lowerArmAngle.get(pt) - 135; - float upperArmAngle = arm.upperArmAngle.get(pt) - 90; - float headAngle = arm.headAngle.get(pt); + float baseAngle = this.arm.baseAngle.get(pt); + float lowerArmAngle = this.arm.lowerArmAngle.get(pt) - 135; + float upperArmAngle = this.arm.upperArmAngle.get(pt) - 90; + float headAngle = this.arm.headAngle.get(pt); if (rave) { - float renderTick = AnimationTickHolder.getRenderTime(arm.getWorld()) + (tile.hashCode() % 64); + float renderTick = AnimationTickHolder.getRenderTime(this.arm.getWorld()) + (tile.hashCode() % 64); baseAngle = (renderTick * 10) % 360; lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15); upperArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 8) + 1) / 4, -45, 95); @@ -85,7 +87,6 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta color = ColorHelper.rainbowColor(AnimationTickHolder.getTicks() * 100); } - MatrixStack msLocal = new MatrixStack(); MatrixStacker msr = MatrixStacker.of(msLocal); msr.translate(getInstancePosition()); @@ -116,7 +117,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta claw.getInstance() .setTransform(msLocal); - ItemStack item = arm.heldItem; + ItemStack item = this.arm.heldItem; ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); boolean hasItem = !item.isEmpty(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java index 8245a1e9f..3be2796a3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java @@ -31,16 +31,16 @@ public class AnalogLeverInstance extends TileEntityInstance