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
This commit is contained in:
Jozufozu 2025-01-17 16:39:42 -06:00
parent 6ac654d722
commit 24acef316d
5 changed files with 47 additions and 32 deletions

View file

@ -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();
}

View file

@ -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;

View file

@ -29,12 +29,20 @@ public class FanVisual extends KineticBlockEntityVisual<EncasedFanBlockEntity> {
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,8 +56,10 @@ public class FanVisual extends KineticBlockEntityVisual<EncasedFanBlockEntity> {
@Override
public void update(float pt) {
updateRotation(shaft);
updateRotation(fan, getFanSpeed());
shaft.setup(blockEntity)
.setChanged();
fan.setup(blockEntity, getFanSpeed())
.setChanged();
}
@Override

View file

@ -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<GearboxBlockEntity> {
protected final EnumMap<Direction, RotatingInstance> keys;
protected final EnumMap<Direction, RotatingInstance> 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);
int blockLight = level.getBrightness(LightLayer.BLOCK, pos);
int skyLight = level.getBrightness(LightLayer.SKY, pos);
updateSourceFacing();
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)
instance.setup(blockEntity, axis, getSpeed(direction))
.setPosition(getVisualPosition())
.light(blockLight, skyLight)
.rotateToFace(Direction.SOUTH, direction)
.setChanged();
keys.put(direction, key);
keys.put(direction, instance);
}
}
@ -83,7 +80,9 @@ public class GearboxVisual extends KineticBlockEntityVisual<GearboxBlockEntity>
Direction direction = key.getKey();
Direction.Axis axis = direction.getAxis();
updateRotation(key.getValue(), axis, getSpeed(direction));
key.getValue()
.setup(blockEntity, axis, getSpeed(direction))
.setChanged();
}
}

View file

@ -33,10 +33,15 @@ public class SplitShaftVisual extends KineticBlockEntityVisual<SplitShaftBlockEn
float splitSpeed = speed * blockEntity.getRotationSpeedModifier(dir);
var instance = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, dir))
var instance = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF))
.createInstance();
keys.add(setup(instance, splitSpeed));
instance.setup(blockEntity, splitSpeed)
.setPosition(getVisualPosition())
.rotateToFace(Direction.SOUTH, dir)
.setChanged();
keys.add(instance);
}
}
@ -48,7 +53,9 @@ public class SplitShaftVisual extends KineticBlockEntityVisual<SplitShaftBlockEn
Direction[] directions = Iterate.directionsInAxis(boxAxis);
for (int i : Iterate.zeroAndOne) {
updateRotation(keys.get(i), blockEntity.getSpeed() * blockEntity.getRotationSpeedModifier(directions[i]));
keys.get(i)
.setup(blockEntity, blockEntity.getSpeed() * blockEntity.getRotationSpeedModifier(directions[i]))
.setChanged();
}
}