mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-27 23:47:38 +01:00
Stop relying on IDynamicInstance#beginFrame to setup instance state.
- Gantry carriages no longer update when not necessary.
This commit is contained in:
parent
d3d338e64b
commit
4675e0ad15
10 changed files with 88 additions and 48 deletions
|
@ -14,11 +14,13 @@ import net.minecraft.util.Direction;
|
|||
|
||||
public class HandCrankInstance extends SingleRotatingInstance implements IDynamicInstance {
|
||||
|
||||
private final HandCrankTileEntity tile;
|
||||
private InstanceKey<ModelData> 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<ModelData> 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)
|
||||
|
|
|
@ -37,11 +37,8 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
|||
protected InstanceKey<ModelData> upperSliding;
|
||||
protected InstanceKey<ModelData> 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<FlywheelTileEntity> im
|
|||
} else {
|
||||
connectors = Collections.emptyList();
|
||||
}
|
||||
|
||||
animate(tile.angle);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -80,8 +79,14 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> 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<FlywheelTileEntity> im
|
|||
.unCentre();
|
||||
|
||||
wheel.getInstance().setTransform(ms);
|
||||
|
||||
lastAngle = angle;
|
||||
firstFrame = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -14,25 +14,25 @@ import com.simibubi.create.foundation.utility.MatrixStacker;
|
|||
public class PressInstance extends ShaftInstance implements IDynamicInstance {
|
||||
|
||||
private final InstanceKey<ModelData> 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();
|
||||
|
|
|
@ -28,6 +28,8 @@ public class StickerInstance extends TileEntityInstance<StickerTileEntity> 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<StickerTileEntity> 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<StickerTileEntity> imple
|
|||
|
||||
head.getInstance()
|
||||
.setTransform(stack);
|
||||
|
||||
lastOffset = offset;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -34,8 +34,6 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
|
|||
|
||||
keys.add(setup(half.createInstance(), splitSpeed));
|
||||
}
|
||||
|
||||
updateLight();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -28,7 +28,6 @@ public class EjectorInstance extends ShaftInstance implements IDynamicInstance {
|
|||
plate = getTransformMaterial().getModel(AllBlockPartials.EJECTOR_TOP, blockState).createInstance();
|
||||
|
||||
pivotPlate();
|
||||
updateLight();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -3,7 +3,6 @@ package com.simibubi.create.content.logistics.block.mechanicalArm;
|
|||
import com.google.common.collect.Lists;
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.simibubi.create.AllBlockPartials;
|
||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.content.contraptions.base.RotatingData;
|
||||
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
|
||||
import com.simibubi.create.foundation.render.backend.instancing.*;
|
||||
|
@ -31,10 +30,11 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
|
|||
private final ArrayList<InstanceKey<ModelData>> clawGrips;
|
||||
|
||||
private final ArrayList<InstanceKey<ModelData>> 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<?, InstancedModel<ModelData>> 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();
|
||||
|
|
|
@ -31,16 +31,16 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
|
|||
rX = face == AttachFace.FLOOR ? 0 : face == AttachFace.WALL ? 90 : 180;
|
||||
rY = AngleHelper.horizontalAngle(blockState.get(AnalogLeverBlock.HORIZONTAL_FACING));
|
||||
|
||||
setupModel();
|
||||
animateLever();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beginFrame() {
|
||||
if (!tile.clientState.settled())
|
||||
setupModel();
|
||||
animateLever();
|
||||
}
|
||||
|
||||
protected void setupModel() {
|
||||
protected void animateLever() {
|
||||
MatrixStack ms = new MatrixStack();
|
||||
MatrixStacker msr = MatrixStacker.of(ms);
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@ public class SchematicannonInstance extends TileEntityInstance<SchematicannonTil
|
|||
|
||||
connector = mat.getModel(AllBlockPartials.SCHEMATICANNON_CONNECTOR, blockState).createInstance();
|
||||
pipe = mat.getModel(AllBlockPartials.SCHEMATICANNON_PIPE, blockState).createInstance();
|
||||
|
||||
beginFrame();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Reference in a new issue