From 24acef316d98da1be123576ee8aec8e0a3dde52f Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 17 Jan 2025 16:39:42 -0600 Subject: [PATCH] Unite them - Reduce usage of rotated partial models - Instead use per-instance rotation to reduce draw calls and memory usage - Migrate to RotatingInstance.setup where possible --- .../bearing/StabilizedBearingVisual.java | 3 +- .../base/KineticBlockEntityVisual.java | 2 - .../content/kinetics/fan/FanVisual.java | 24 ++++++++---- .../kinetics/gearbox/GearboxVisual.java | 37 +++++++++---------- .../transmission/SplitShaftVisual.java | 13 +++++-- 5 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java index 431aa38023..a0612eed5b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java @@ -48,7 +48,7 @@ public class StabilizedBearingVisual extends ActorVisual { .light(blockLight, 0) .setChanged(); - shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, blockState.getValue(BlockStateProperties.FACING).getOpposite())) + shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF)) .createInstance(); // not rotating so no need to set speed. @@ -56,6 +56,7 @@ public class StabilizedBearingVisual extends ActorVisual { shaft.setRotationAxis(axis) .setRotationOffset(KineticBlockEntityVisual.rotationOffset(blockState, axis, movementContext.localPos)) .setPosition(movementContext.localPos) + .rotateToFace(Direction.SOUTH, blockState.getValue(BlockStateProperties.FACING).getOpposite()) .light(blockLight, 0) .setChanged(); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java index df99f4c30b..6539c7b207 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java @@ -1,8 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import com.simibubi.create.AllBlocks; import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; -import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java b/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java index 57aa69a525..9b8e4cd53f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java @@ -29,12 +29,20 @@ public class FanVisual extends KineticBlockEntityVisual { direction = blockState.getValue(FACING); opposite = direction.getOpposite(); - shaft = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, opposite)).createInstance(); - fan = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.ENCASED_FAN_INNER, opposite)) + shaft = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF)) + .createInstance(); + fan = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.ENCASED_FAN_INNER)) .createInstance(); - setup(shaft); - setup(fan, getFanSpeed()); + shaft.setup(blockEntity) + .setPosition(getVisualPosition()) + .rotateToFace(Direction.SOUTH, opposite) + .setChanged(); + + fan.setup(blockEntity, getFanSpeed()) + .setPosition(getVisualPosition()) + .rotateToFace(Direction.SOUTH, opposite) + .setChanged(); } private float getFanSpeed() { @@ -48,9 +56,11 @@ public class FanVisual extends KineticBlockEntityVisual { @Override public void update(float pt) { - updateRotation(shaft); - updateRotation(fan, getFanSpeed()); - } + shaft.setup(blockEntity) + .setChanged(); + fan.setup(blockEntity, getFanSpeed()) + .setChanged(); + } @Override public void updateLight(float partialTick) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java index 3d173b56e6..20938d693e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java @@ -10,6 +10,7 @@ import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; +import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.AbstractInstance; import dev.engine_room.flywheel.lib.instance.FlatLit; @@ -22,36 +23,32 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; public class GearboxVisual extends KineticBlockEntityVisual { - protected final EnumMap keys; + protected final EnumMap keys = new EnumMap<>(Direction.class); protected Direction sourceFacing; public GearboxVisual(VisualizationContext context, GearboxBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); - keys = new EnumMap<>(Direction.class); + final Direction.Axis boxAxis = blockState.getValue(BlockStateProperties.AXIS); - final Direction.Axis boxAxis = blockState.getValue(BlockStateProperties.AXIS); - - int blockLight = level.getBrightness(LightLayer.BLOCK, pos); - int skyLight = level.getBrightness(LightLayer.SKY, pos); updateSourceFacing(); - for (Direction direction : Iterate.directions) { + var instancer = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF)); + + for (Direction direction : Iterate.directions) { final Direction.Axis axis = direction.getAxis(); - if (boxAxis == axis) + if (boxAxis == axis) { continue; + } - RotatingInstance key = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, direction)) - .createInstance(); + RotatingInstance instance = instancer.createInstance(); - key.setRotationAxis(axis) - .setRotationalSpeed(getSpeed(direction) * RotatingInstance.SPEED_MULTIPLIER) - .setRotationOffset(getRotationOffset(axis)).setColor(blockEntity) - .setPosition(getVisualPosition()) - .light(blockLight, skyLight) - .setChanged(); + instance.setup(blockEntity, axis, getSpeed(direction)) + .setPosition(getVisualPosition()) + .rotateToFace(Direction.SOUTH, direction) + .setChanged(); - keys.put(direction, key); + keys.put(direction, instance); } } @@ -83,8 +80,10 @@ public class GearboxVisual extends KineticBlockEntityVisual Direction direction = key.getKey(); Direction.Axis axis = direction.getAxis(); - updateRotation(key.getValue(), axis, getSpeed(direction)); - } + key.getValue() + .setup(blockEntity, axis, getSpeed(direction)) + .setChanged(); + } } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java index c2f1fce6f7..d03ffadcfe 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java @@ -33,10 +33,15 @@ public class SplitShaftVisual extends KineticBlockEntityVisual