Method actor

- DrillsActorVisuals no longer use RotatingInstance
- Instead manually animate by updating rotation in #tick and
  interpolating
This commit is contained in:
Jozufozu 2025-01-25 14:26:30 -06:00
parent b073ada21c
commit 484de7cc03

View file

@ -8,7 +8,10 @@ import com.simibubi.create.foundation.render.AllInstanceTypes;
import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld;
import dev.engine_room.flywheel.api.visualization.VisualizationContext;
import dev.engine_room.flywheel.lib.instance.InstanceTypes;
import dev.engine_room.flywheel.lib.instance.TransformedInstance;
import dev.engine_room.flywheel.lib.model.Models;
import net.createmod.catnip.animation.AnimationTickHolder;
import net.createmod.catnip.math.VecHelper;
import net.createmod.catnip.math.AngleHelper;
import net.minecraft.core.Direction;
@ -17,9 +20,12 @@ import net.minecraft.world.level.block.state.BlockState;
public class DrillActorVisual extends ActorVisual {
RotatingInstance drillHead;
TransformedInstance drillHead;
private final Direction facing;
private double rotation;
private double previousRotation;
public DrillActorVisual(VisualizationContext visualizationContext, VirtualRenderWorld contraption, MovementContext context) {
super(visualizationContext, contraption, context);
@ -27,39 +33,39 @@ public class DrillActorVisual extends ActorVisual {
facing = state.getValue(DrillBlock.FACING);
Direction.Axis axis = facing.getAxis();
float eulerX = AngleHelper.verticalAngle(facing);
float eulerY;
if (axis == Direction.Axis.Y)
eulerY = 0;
else
eulerY = facing.toYRot() + ((axis == Direction.Axis.X) ? 180 : 0);
drillHead = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.DRILL_HEAD))
drillHead = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.DRILL_HEAD))
.createInstance();
}
drillHead.rotation.rotationXYZ(eulerX * Mth.DEG_TO_RAD, eulerY * Mth.DEG_TO_RAD, 0);
@Override
public void tick() {
previousRotation = rotation;
drillHead.setPosition(context.localPos)
.setRotationOffset(0)
.setRotationAxis(0, 0, 1)
.setRotationalSpeed(getSpeed(facing))
.light(localBlockLight(), 0)
if (context.contraption.stalled || context.disabled
|| VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()))
return;
float deg = context.getAnimationSpeed();
rotation += deg / 20;
rotation %= 360;
}
@Override
public void beginFrame() {
drillHead.setIdentityTransform()
.translate(context.localPos)
.center()
.rotateToFace(facing.getOpposite())
.rotateZDegrees((float) getRotation())
.uncenter()
.setChanged();
}
@Override
public void beginFrame() {
drillHead.setRotationalSpeed(getSpeed(facing))
.setChanged();
}
protected float getSpeed(Direction facing) {
if (context.contraption.stalled || !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()))
return context.getAnimationSpeed();
return 0;
}
protected double getRotation() {
return AngleHelper.angleLerp(AnimationTickHolder.getPartialTicks(), previousRotation, rotation);
}
@Override
protected void _delete() {