Rolling over a bump

- Bump flywheel version
- Make all visuals use instancerProvider() method
- Fix ModelCache usage
- Use PosedInstance in BogeyRenderer
This commit is contained in:
Jozufozu 2024-09-20 19:35:16 -07:00
parent cafd877802
commit cdc41b18cc
35 changed files with 88 additions and 86 deletions

View file

@ -23,7 +23,7 @@ use_parchment = true
# dependency versions # dependency versions
registrate_version = MC1.20-1.3.3 registrate_version = MC1.20-1.3.3
flywheel_minecraft_version = 1.20.1 flywheel_minecraft_version = 1.20.1
flywheel_version = 1.0.0-beta-113 flywheel_version = 1.0.0-beta-134
jei_minecraft_version = 1.20.1 jei_minecraft_version = 1.20.1
jei_version = 15.10.0.39 jei_version = 15.10.0.39
curios_minecraft_version = 1.20.1 curios_minecraft_version = 1.20.1

View file

@ -38,7 +38,7 @@ public class BearingVisual<B extends KineticBlockEntity & IBearingBlockEntity> e
PartialModel top = PartialModel top =
blockEntity.isWoodenTop() ? AllPartialModels.BEARING_TOP_WOODEN : AllPartialModels.BEARING_TOP; blockEntity.isWoodenTop() ? AllPartialModels.BEARING_TOP_WOODEN : AllPartialModels.BEARING_TOP;
topInstance = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(top)) topInstance = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(top))
.createInstance(); .createInstance();
topInstance.position(getVisualPosition()) topInstance.position(getVisualPosition())

View file

@ -29,7 +29,7 @@ public class StickerVisual extends AbstractBlockEntityVisual<StickerBlockEntity>
public StickerVisual(VisualizationContext context, StickerBlockEntity blockEntity, float partialTick) { public StickerVisual(VisualizationContext context, StickerBlockEntity blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
head = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.STICKER_HEAD)).createInstance(); head = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.STICKER_HEAD)).createInstance();
fakeWorld = blockEntity.getLevel() != Minecraft.getInstance().level; fakeWorld = blockEntity.getLevel() != Minecraft.getInstance().level;
facing = blockState.getValue(StickerBlock.FACING); facing = blockState.getValue(StickerBlock.FACING);

View file

@ -34,7 +34,7 @@ public class GantryCarriageVisual extends ShaftVisual<GantryCarriageBlockEntity>
public GantryCarriageVisual(VisualizationContext context, GantryCarriageBlockEntity blockEntity, float partialTick) { public GantryCarriageVisual(VisualizationContext context, GantryCarriageBlockEntity blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
gantryCogs = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GANTRY_COGS)) gantryCogs = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GANTRY_COGS))
.createInstance(); .createInstance();
facing = blockState.getValue(GantryCarriageBlock.FACING); facing = blockState.getValue(GantryCarriageBlock.FACING);

View file

@ -16,27 +16,27 @@ public class HosePulleyVisual extends AbstractPulleyVisual<HosePulleyBlockEntity
@Override @Override
protected Instancer<OrientedInstance> getRopeModel() { protected Instancer<OrientedInstance> getRopeModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE)); return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE));
} }
@Override @Override
protected Instancer<OrientedInstance> getMagnetModel() { protected Instancer<OrientedInstance> getMagnetModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_MAGNET)); return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_MAGNET));
} }
@Override @Override
protected Instancer<OrientedInstance> getHalfMagnetModel() { protected Instancer<OrientedInstance> getHalfMagnetModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF_MAGNET)); return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF_MAGNET));
} }
@Override @Override
protected Instancer<OrientedInstance> getCoilModel() { protected Instancer<OrientedInstance> getCoilModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_COIL, rotatingAbout)); return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_COIL, rotatingAbout));
} }
@Override @Override
protected Instancer<OrientedInstance> getHalfRopeModel() { protected Instancer<OrientedInstance> getHalfRopeModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF)); return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF));
} }
@Override @Override

View file

@ -18,27 +18,27 @@ public class RopePulleyVisual extends AbstractPulleyVisual<PulleyBlockEntity> {
@Override @Override
protected Instancer<OrientedInstance> getRopeModel() { protected Instancer<OrientedInstance> getRopeModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.ROPE.getDefaultState())); return instancerProvider().instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.ROPE.getDefaultState()));
} }
@Override @Override
protected Instancer<OrientedInstance> getMagnetModel() { protected Instancer<OrientedInstance> getMagnetModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.PULLEY_MAGNET.getDefaultState())); return instancerProvider().instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.PULLEY_MAGNET.getDefaultState()));
} }
@Override @Override
protected Instancer<OrientedInstance> getHalfMagnetModel() { protected Instancer<OrientedInstance> getHalfMagnetModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF_MAGNET)); return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF_MAGNET));
} }
@Override @Override
protected Instancer<OrientedInstance> getCoilModel() { protected Instancer<OrientedInstance> getCoilModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_COIL, rotatingAbout)); return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_COIL, rotatingAbout));
} }
@Override @Override
protected Instancer<OrientedInstance> getHalfRopeModel() { protected Instancer<OrientedInstance> getHalfRopeModel() {
return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF)); return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF));
} }
@Override @Override

View file

@ -93,6 +93,8 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> extends Abst
.instancer(InstanceTypes.TRANSFORMED, model) .instancer(InstanceTypes.TRANSFORMED, model)
.createInstance(); .createInstance();
structure.setChanged();
for (BlockEntity be : contraption.getRenderedBEs()) { for (BlockEntity be : contraption.getRenderedBEs()) {
setupVisualizer(be, partialTick); setupVisualizer(be, partialTick);
} }

View file

@ -28,10 +28,10 @@ public class ToolBoxVisual extends AbstractBlockEntityVisual<ToolboxBlockEntity>
facing = blockState.getValue(ToolboxBlock.FACING) facing = blockState.getValue(ToolboxBlock.FACING)
.getOpposite(); .getOpposite();
Instancer<TransformedInstance> drawerModel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TOOLBOX_DRAWER)); Instancer<TransformedInstance> drawerModel = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TOOLBOX_DRAWER));
drawers = new TransformedInstance[]{drawerModel.createInstance(), drawerModel.createInstance()}; drawers = new TransformedInstance[]{drawerModel.createInstance(), drawerModel.createInstance()};
lid = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TOOLBOX_LIDS.get(blockEntity.getColor()))) lid = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TOOLBOX_LIDS.get(blockEntity.getColor())))
.createInstance(); .createInstance();
} }

View file

@ -41,7 +41,7 @@ public class FluidValveVisual extends ShaftVisual<FluidValveBlockEntity> impleme
pointerRotationOffset = twist ? 90 : 0; pointerRotationOffset = twist ? 90 : 0;
settled = false; settled = false;
pointer = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.FLUID_VALVE_POINTER)).createInstance(); pointer = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.FLUID_VALVE_POINTER)).createInstance();
transformPointer(partialTick); transformPointer(partialTick);
} }

View file

@ -15,7 +15,7 @@ public class SingleRotatingVisual<T extends KineticBlockEntity> extends KineticB
public SingleRotatingVisual(VisualizationContext context, T blockEntity, float partialTick) { public SingleRotatingVisual(VisualizationContext context, T blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
rotatingModel = instancerProvider.instancer(AllInstanceTypes.ROTATING, model()) rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, model())
.createInstance(); .createInstance();
setup(rotatingModel); setup(rotatingModel);
} }

View file

@ -65,7 +65,7 @@ public class BeltVisual extends KineticBlockEntityVisual<BeltBlockEntity> {
PartialModel beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); PartialModel beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom);
SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom);
Instancer<BeltInstance> beltModel = instancerProvider.instancer(AllInstanceTypes.BELT, Models.partial(beltPartial)); Instancer<BeltInstance> beltModel = instancerProvider().instancer(AllInstanceTypes.BELT, Models.partial(beltPartial));
keys.add(setup(beltModel.createInstance(), bottom, spriteShift)); keys.add(setup(beltModel.createInstance(), bottom, spriteShift));
@ -138,7 +138,7 @@ public class BeltVisual extends KineticBlockEntityVisual<BeltBlockEntity> {
msr.uncenter(); msr.uncenter();
}); });
return instancerProvider.instancer(AllInstanceTypes.ROTATING, model); return instancerProvider().instancer(AllInstanceTypes.ROTATING, model);
} }
private Direction getOrientation() { private Direction getOrientation() {

View file

@ -27,13 +27,13 @@ public class HandCrankVisual extends KineticBlockEntityVisual<HandCrankBlockEnti
facing = blockState.getValue(BlockStateProperties.FACING); facing = blockState.getValue(BlockStateProperties.FACING);
Model model = blockEntity.getRenderedHandleInstance(); Model model = blockEntity.getRenderedHandleInstance();
crank = instancerProvider.instancer(InstanceTypes.TRANSFORMED, model) crank = instancerProvider().instancer(InstanceTypes.TRANSFORMED, model)
.createInstance(); .createInstance();
rotateCrank(partialTick); rotateCrank(partialTick);
if (blockEntity.shouldRenderShaft()) { if (blockEntity.shouldRenderShaft()) {
rotatingModel = instancerProvider.instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(blockState)) rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(blockState))
.createInstance(); .createInstance();
setup(rotatingModel); setup(rotatingModel);
} }

View file

@ -52,11 +52,11 @@ public class DeployerVisual extends ShaftVisual<DeployerBlockEntity> implements
xRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; xRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0;
zRot = rotatePole ? 90 : 0; zRot = rotatePole ? 90 : 0;
pole = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.DEPLOYER_POLE)).createInstance(); pole = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.DEPLOYER_POLE)).createInstance();
currentHand = this.blockEntity.getHandPose(); currentHand = this.blockEntity.getHandPose();
hand = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(currentHand)).createInstance(); hand = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(currentHand)).createInstance();
progress = getProgress(partialTick); progress = getProgress(partialTick);
updateRotation(pole, hand, yRot, xRot, zRot); updateRotation(pole, hand, yRot, xRot, zRot);
@ -69,7 +69,7 @@ public class DeployerVisual extends ShaftVisual<DeployerBlockEntity> implements
if (currentHand != handPose) { if (currentHand != handPose) {
currentHand = handPose; currentHand = handPose;
instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(currentHand)) instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(currentHand))
.stealInstance(hand); .stealInstance(hand);
} }
} }

View file

@ -29,8 +29,8 @@ public class FanVisual extends KineticBlockEntityVisual<EncasedFanBlockEntity> {
direction = blockState.getValue(FACING); direction = blockState.getValue(FACING);
opposite = direction.getOpposite(); opposite = direction.getOpposite();
shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, opposite)).createInstance(); shaft = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, opposite)).createInstance();
fan = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.ENCASED_FAN_INNER, opposite)) fan = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.ENCASED_FAN_INNER, opposite))
.createInstance(); .createInstance();
setup(shaft); setup(shaft);

View file

@ -27,9 +27,9 @@ public class FlywheelVisual extends KineticBlockEntityVisual<FlywheelBlockEntity
public FlywheelVisual(VisualizationContext context, FlywheelBlockEntity blockEntity, float partialTick) { public FlywheelVisual(VisualizationContext context, FlywheelBlockEntity blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
shaft = setup(instancerProvider.instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(shaft())) shaft = setup(instancerProvider().instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(shaft()))
.createInstance()); .createInstance());
wheel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(blockState)) wheel = instancerProvider().instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(blockState))
.createInstance(); .createInstance();
animate(blockEntity.angle); animate(blockEntity.angle);

View file

@ -34,7 +34,7 @@ public abstract class GaugeVisual extends ShaftVisual<GaugeBlockEntity> implemen
GaugeBlock gaugeBlock = (GaugeBlock) blockState.getBlock(); GaugeBlock gaugeBlock = (GaugeBlock) blockState.getBlock();
Instancer<TransformedInstance> dialModel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_DIAL)); Instancer<TransformedInstance> dialModel = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_DIAL));
Instancer<TransformedInstance> headModel = getHeadModel(); Instancer<TransformedInstance> headModel = getHeadModel();
var msr = TransformStack.of(ms); var msr = TransformStack.of(ms);
@ -157,7 +157,7 @@ public abstract class GaugeVisual extends ShaftVisual<GaugeBlockEntity> implemen
@Override @Override
protected Instancer<TransformedInstance> getHeadModel() { protected Instancer<TransformedInstance> getHeadModel() {
return instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_HEAD_SPEED)); return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_HEAD_SPEED));
} }
} }
@ -168,7 +168,7 @@ public abstract class GaugeVisual extends ShaftVisual<GaugeBlockEntity> implemen
@Override @Override
protected Instancer<TransformedInstance> getHeadModel() { protected Instancer<TransformedInstance> getHeadModel() {
return instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_HEAD_STRESS)); return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_HEAD_STRESS));
} }
} }
} }

View file

@ -41,7 +41,7 @@ public class GearboxVisual extends KineticBlockEntityVisual<GearboxBlockEntity>
if (boxAxis == axis) if (boxAxis == axis)
continue; continue;
RotatingInstance key = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, direction)) RotatingInstance key = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, direction))
.createInstance(); .createInstance();
key.setRotationAxis(axis) key.setRotationAxis(axis)

View file

@ -49,18 +49,18 @@ public class ArmVisual extends SingleRotatingVisual<ArmBlockEntity> implements S
public ArmVisual(VisualizationContext context, ArmBlockEntity blockEntity, float partialTick) { public ArmVisual(VisualizationContext context, ArmBlockEntity blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
base = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_BASE)) base = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_BASE))
.createInstance(); .createInstance();
lowerBody = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_LOWER_BODY)) lowerBody = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_LOWER_BODY))
.createInstance(); .createInstance();
upperBody = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_UPPER_BODY)) upperBody = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_UPPER_BODY))
.createInstance(); .createInstance();
claw = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE)) claw = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE))
.createInstance(); .createInstance();
TransformedInstance clawGrip1 = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_CLAW_GRIP_UPPER)) TransformedInstance clawGrip1 = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_CLAW_GRIP_UPPER))
.createInstance(); .createInstance();
TransformedInstance clawGrip2 = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_CLAW_GRIP_LOWER)) TransformedInstance clawGrip2 = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_CLAW_GRIP_LOWER))
.createInstance(); .createInstance();
clawGrips = Lists.newArrayList(clawGrip1, clawGrip2); clawGrips = Lists.newArrayList(clawGrip1, clawGrip2);
@ -175,7 +175,7 @@ public class ArmVisual extends SingleRotatingVisual<ArmBlockEntity> implements S
super.update(pt); super.update(pt);
models.remove(claw); models.remove(claw);
claw.delete(); claw.delete();
claw = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE)) claw = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE))
.createInstance(); .createInstance();
models.add(claw); models.add(claw);
updateLight(pt); updateLight(pt);

View file

@ -27,12 +27,12 @@ public class MixerVisual extends EncasedCogVisual implements SimpleDynamicVisual
super(context, blockEntity, false, partialTick); super(context, blockEntity, false, partialTick);
this.mixer = blockEntity; this.mixer = blockEntity;
mixerHead = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.MECHANICAL_MIXER_HEAD)) mixerHead = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.MECHANICAL_MIXER_HEAD))
.createInstance(); .createInstance();
mixerHead.setRotationAxis(Direction.Axis.Y); mixerHead.setRotationAxis(Direction.Axis.Y);
mixerPole = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.MECHANICAL_MIXER_POLE)) mixerPole = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.MECHANICAL_MIXER_POLE))
.createInstance(); .createInstance();
animate(partialTick); animate(partialTick);

View file

@ -24,7 +24,7 @@ public class PressVisual extends ShaftVisual<MechanicalPressBlockEntity> impleme
public PressVisual(VisualizationContext context, MechanicalPressBlockEntity blockEntity, float partialTick) { public PressVisual(VisualizationContext context, MechanicalPressBlockEntity blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
pressHead = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.MECHANICAL_PRESS_HEAD)) pressHead = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.MECHANICAL_PRESS_HEAD))
.createInstance(); .createInstance();
Quaternionf q = Axis.YP Quaternionf q = Axis.YP

View file

@ -39,7 +39,7 @@ public class BracketedKineticBlockEntityVisual extends SingleRotatingVisual<Brac
BlockPos pos = blockEntity.getBlockPos(); BlockPos pos = blockEntity.getBlockPos();
float offset = BracketedKineticBlockEntityRenderer.getShaftAngleOffset(axis, pos); float offset = BracketedKineticBlockEntityRenderer.getShaftAngleOffset(axis, pos);
var model = Models.partial(AllPartialModels.COGWHEEL_SHAFT, axis, BracketedKineticBlockEntityVisual::rotateToAxis); var model = Models.partial(AllPartialModels.COGWHEEL_SHAFT, axis, BracketedKineticBlockEntityVisual::rotateToAxis);
Instancer<RotatingInstance> half = instancerProvider.instancer(AllInstanceTypes.ROTATING, model); Instancer<RotatingInstance> half = instancerProvider().instancer(AllInstanceTypes.ROTATING, model);
additionalShaft = setup(half.createInstance(), speed); additionalShaft = setup(half.createInstance(), speed);
additionalShaft.setRotationOffset(offset) additionalShaft.setRotationOffset(offset)

View file

@ -49,7 +49,7 @@ public class EncasedCogVisual extends KineticBlockEntityVisual<KineticBlockEntit
super(modelManager, blockEntity, partialTick); super(modelManager, blockEntity, partialTick);
this.large = large; this.large = large;
var instancer = instancerProvider.instancer(AllInstanceTypes.ROTATING, getCogModel()); var instancer = instancerProvider().instancer(AllInstanceTypes.ROTATING, getCogModel());
rotatingModel = setup(instancer.createInstance()); rotatingModel = setup(instancer.createInstance());
RotatingInstance rotatingTopShaft = null; RotatingInstance rotatingTopShaft = null;
@ -60,7 +60,7 @@ public class EncasedCogVisual extends KineticBlockEntityVisual<KineticBlockEntit
for (Direction d : Iterate.directionsInAxis(axis)) { for (Direction d : Iterate.directionsInAxis(axis)) {
if (!def.hasShaftTowards(blockEntity.getLevel(), blockEntity.getBlockPos(), blockState, d)) if (!def.hasShaftTowards(blockEntity.getLevel(), blockEntity.getBlockPos(), blockState, d))
continue; continue;
RotatingInstance data = setup(instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, d)) RotatingInstance data = setup(instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, d))
.createInstance()); .createInstance());
if (large) { if (large) {
data.setRotationOffset(BracketedKineticBlockEntityRenderer.getShaftAngleOffset(axis, pos)); data.setRotationOffset(BracketedKineticBlockEntityRenderer.getShaftAngleOffset(axis, pos));

View file

@ -27,11 +27,11 @@ public class SteamEngineVisual extends AbstractBlockEntityVisual<SteamEngineBloc
public SteamEngineVisual(VisualizationContext context, SteamEngineBlockEntity blockEntity, float partialTick) { public SteamEngineVisual(VisualizationContext context, SteamEngineBlockEntity blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
piston = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ENGINE_PISTON)) piston = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ENGINE_PISTON))
.createInstance(); .createInstance();
linkage = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ENGINE_LINKAGE)) linkage = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ENGINE_LINKAGE))
.createInstance(); .createInstance();
connector = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ENGINE_CONNECTOR)) connector = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ENGINE_CONNECTOR))
.createInstance(); .createInstance();
} }

View file

@ -33,7 +33,7 @@ public class SplitShaftVisual extends KineticBlockEntityVisual<SplitShaftBlockEn
float splitSpeed = speed * blockEntity.getRotationSpeedModifier(dir); 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, dir))
.createInstance(); .createInstance();
keys.add(setup(instance, splitSpeed)); keys.add(setup(instance, splitSpeed));

View file

@ -11,15 +11,15 @@ import com.simibubi.create.foundation.render.CachedBufferer;
import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instance;
import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.model.Model;
import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.api.visualization.VisualizationContext;
import dev.engine_room.flywheel.lib.model.ModelCache;
import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder;
import dev.engine_room.flywheel.lib.util.ResourceReloadCache;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.Direction.AxisDirection; import net.minecraft.core.Direction.AxisDirection;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
public class WaterWheelVisual<T extends WaterWheelBlockEntity> extends KineticBlockEntityVisual<T> { public class WaterWheelVisual<T extends WaterWheelBlockEntity> extends KineticBlockEntityVisual<T> {
private static final ModelCache<WaterWheelModelKey> MODEL_CACHE = new ModelCache<>(WaterWheelVisual::createModel); private static final ResourceReloadCache<WaterWheelModelKey, Model> MODEL_CACHE = new ResourceReloadCache<>(WaterWheelVisual::createModel);
protected final boolean large; protected final boolean large;
protected BlockState lastMaterial; protected BlockState lastMaterial;
@ -42,7 +42,7 @@ public class WaterWheelVisual<T extends WaterWheelBlockEntity> extends KineticBl
private void setupInstance() { private void setupInstance() {
lastMaterial = blockEntity.material; lastMaterial = blockEntity.material;
rotatingModel = instancerProvider.instancer(AllInstanceTypes.ROTATING, MODEL_CACHE.get(new WaterWheelModelKey(large, blockState, blockEntity.material))) rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, MODEL_CACHE.get(new WaterWheelModelKey(large, blockState, blockEntity.material)))
.createInstance(); .createInstance();
setup(rotatingModel); setup(rotatingModel);
} }

View file

@ -22,7 +22,7 @@ public class EjectorVisual extends ShaftVisual<EjectorBlockEntity> implements Si
public EjectorVisual(VisualizationContext dispatcher, EjectorBlockEntity blockEntity, float partialTick) { public EjectorVisual(VisualizationContext dispatcher, EjectorBlockEntity blockEntity, float partialTick) {
super(dispatcher, blockEntity, partialTick); super(dispatcher, blockEntity, partialTick);
plate = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.EJECTOR_TOP)).createInstance(); plate = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.EJECTOR_TOP)).createInstance();
pivotPlate(getLidProgress(partialTick)); pivotPlate(getLidProgress(partialTick));
} }

View file

@ -34,7 +34,7 @@ public class FunnelVisual extends AbstractBlockEntityVisual<FunnelBlockEntity> i
PartialModel flapPartial = (blockState.getBlock() instanceof FunnelBlock ? AllPartialModels.FUNNEL_FLAP PartialModel flapPartial = (blockState.getBlock() instanceof FunnelBlock ? AllPartialModels.FUNNEL_FLAP
: AllPartialModels.BELT_FUNNEL_FLAP); : AllPartialModels.BELT_FUNNEL_FLAP);
Instancer<FlapInstance> model = instancerProvider.instancer(AllInstanceTypes.FLAP, Models.partial(flapPartial)); Instancer<FlapInstance> model = instancerProvider().instancer(AllInstanceTypes.FLAP, Models.partial(flapPartial));
int blockLight = level.getBrightness(LightLayer.BLOCK, pos); int blockLight = level.getBrightness(LightLayer.BLOCK, pos);
int skyLight = level.getBrightness(LightLayer.SKY, pos); int skyLight = level.getBrightness(LightLayer.SKY, pos);

View file

@ -34,7 +34,7 @@ public class BeltTunnelVisual extends AbstractBlockEntityVisual<BeltTunnelBlockE
} }
private void setupFlaps(float partialTick) { private void setupFlaps(float partialTick) {
Instancer<FlapInstance> model = instancerProvider.instancer(AllInstanceTypes.FLAP, Models.partial(AllPartialModels.BELT_TUNNEL_FLAP)); Instancer<FlapInstance> model = instancerProvider().instancer(AllInstanceTypes.FLAP, Models.partial(AllPartialModels.BELT_TUNNEL_FLAP));
int blockLight = level.getBrightness(LightLayer.BLOCK, pos); int blockLight = level.getBrightness(LightLayer.BLOCK, pos);
int skyLight = level.getBrightness(LightLayer.SKY, pos); int skyLight = level.getBrightness(LightLayer.SKY, pos);

View file

@ -55,7 +55,7 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual<BlazeBurnerBloc
PartialModel blazeModel = BlazeBurnerRenderer.getBlazeModel(heatLevel, validBlockAbove); PartialModel blazeModel = BlazeBurnerRenderer.getBlazeModel(heatLevel, validBlockAbove);
isInert = blazeModel == AllPartialModels.BLAZE_INERT; isInert = blazeModel == AllPartialModels.BLAZE_INERT;
head = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(blazeModel)) head = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(blazeModel))
.createInstance(); .createInstance();
head.light(LightTexture.FULL_BRIGHT); head.light(LightTexture.FULL_BRIGHT);
@ -66,9 +66,9 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual<BlazeBurnerBloc
PartialModel rodsModel2 = heatLevel == BlazeBurnerBlock.HeatLevel.SEETHING ? AllPartialModels.BLAZE_BURNER_SUPER_RODS_2 PartialModel rodsModel2 = heatLevel == BlazeBurnerBlock.HeatLevel.SEETHING ? AllPartialModels.BLAZE_BURNER_SUPER_RODS_2
: AllPartialModels.BLAZE_BURNER_RODS_2; : AllPartialModels.BLAZE_BURNER_RODS_2;
smallRods = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(rodsModel)) smallRods = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(rodsModel))
.createInstance(); .createInstance();
largeRods = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(rodsModel2)) largeRods = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(rodsModel2))
.createInstance(); .createInstance();
smallRods.light(LightTexture.FULL_BRIGHT); smallRods.light(LightTexture.FULL_BRIGHT);
@ -98,7 +98,7 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual<BlazeBurnerBloc
this.validBlockAbove = validBlockAbove; this.validBlockAbove = validBlockAbove;
PartialModel blazeModel = BlazeBurnerRenderer.getBlazeModel(heatLevel, validBlockAbove); PartialModel blazeModel = BlazeBurnerRenderer.getBlazeModel(heatLevel, validBlockAbove);
instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(blazeModel)) instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(blazeModel))
.stealInstance(head); .stealInstance(head);
} }
@ -111,7 +111,7 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual<BlazeBurnerBloc
} }
if (blockEntity.goggles && goggles == null) { if (blockEntity.goggles && goggles == null) {
goggles = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(isInert ? AllPartialModels.BLAZE_GOGGLES_SMALL : AllPartialModels.BLAZE_GOGGLES)) goggles = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(isInert ? AllPartialModels.BLAZE_GOGGLES_SMALL : AllPartialModels.BLAZE_GOGGLES))
.createInstance(); .createInstance();
goggles.light(LightTexture.FULL_BRIGHT); goggles.light(LightTexture.FULL_BRIGHT);
} else if (!blockEntity.goggles && goggles != null) { } else if (!blockEntity.goggles && goggles != null) {
@ -120,7 +120,7 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual<BlazeBurnerBloc
} }
if (blockEntity.hat && hat == null) { if (blockEntity.hat && hat == null) {
hat = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TRAIN_HAT)) hat = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TRAIN_HAT))
.createInstance(); .createInstance();
hat.light(LightTexture.FULL_BRIGHT); hat.light(LightTexture.FULL_BRIGHT);
} else if (!blockEntity.hat && hat != null) { } else if (!blockEntity.hat && hat != null) {
@ -194,7 +194,7 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual<BlazeBurnerBloc
} }
private void setupFlameInstance() { private void setupFlameInstance() {
flame = instancerProvider.instancer(AllInstanceTypes.SCROLLING, Models.partial(AllPartialModels.BLAZE_BURNER_FLAME)) flame = instancerProvider().instancer(AllInstanceTypes.SCROLLING, Models.partial(AllPartialModels.BLAZE_BURNER_FLAME))
.createInstance(); .createInstance();
flame.position(getVisualPosition()) flame.position(getVisualPosition())

View file

@ -30,9 +30,9 @@ public class AnalogLeverVisual extends AbstractBlockEntityVisual<AnalogLeverBloc
public AnalogLeverVisual(VisualizationContext context, AnalogLeverBlockEntity blockEntity, float partialTick) { public AnalogLeverVisual(VisualizationContext context, AnalogLeverBlockEntity blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
handle = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ANALOG_LEVER_HANDLE)) handle = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ANALOG_LEVER_HANDLE))
.createInstance(); .createInstance();
indicator = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ANALOG_LEVER_INDICATOR)) indicator = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ANALOG_LEVER_INDICATOR))
.createInstance(); .createInstance();
AttachFace face = blockState.getValue(AnalogLeverBlock.FACE); AttachFace face = blockState.getValue(AnalogLeverBlock.FACE);

View file

@ -23,7 +23,7 @@ public class BrassDiodeVisual extends AbstractBlockEntityVisual<BrassDiodeBlockE
public BrassDiodeVisual(VisualizationContext context, BrassDiodeBlockEntity blockEntity, float partialTick) { public BrassDiodeVisual(VisualizationContext context, BrassDiodeBlockEntity blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
indicator = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.FLEXPEATER_INDICATOR)).createInstance(); indicator = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.FLEXPEATER_INDICATOR)).createInstance();
indicator.setIdentityTransform() indicator.setIdentityTransform()
.translate(getVisualPosition()) .translate(getVisualPosition())

View file

@ -24,8 +24,8 @@ public class SchematicannonVisual extends AbstractBlockEntityVisual<Schematicann
public SchematicannonVisual(VisualizationContext context, SchematicannonBlockEntity blockEntity, float partialTick) { public SchematicannonVisual(VisualizationContext context, SchematicannonBlockEntity blockEntity, float partialTick) {
super(context, blockEntity, partialTick); super(context, blockEntity, partialTick);
connector = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.SCHEMATICANNON_CONNECTOR)).createInstance(); connector = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.SCHEMATICANNON_CONNECTOR)).createInstance();
pipe = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.SCHEMATICANNON_PIPE)).createInstance(); pipe = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.SCHEMATICANNON_PIPE)).createInstance();
} }
@Override @Override

View file

@ -20,7 +20,7 @@ import com.simibubi.create.foundation.render.VirtualRenderHelper;
import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.api.visualization.VisualizationContext;
import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.InstanceTypes;
import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.instance.PosedInstance;
import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.model.Models;
import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.model.baked.PartialModel;
import dev.engine_room.flywheel.lib.transform.Transform; import dev.engine_room.flywheel.lib.transform.Transform;
@ -195,7 +195,7 @@ public abstract class BogeyRenderer {
*/ */
public void createModelInstance(VisualizationContext context, PartialModel model, int count) { public void createModelInstance(VisualizationContext context, PartialModel model, int count) {
var instancer = context.instancerProvider() var instancer = context.instancerProvider()
.instancer(InstanceTypes.TRANSFORMED, Models.partial(model)); .instancer(InstanceTypes.POSED, Models.partial(model));
BogeyModelData[] modelData = IntStream.range(0, count) BogeyModelData[] modelData = IntStream.range(0, count)
.mapToObj(i -> instancer.createInstance()) .mapToObj(i -> instancer.createInstance())
.map(BogeyModelData::new) .map(BogeyModelData::new)
@ -212,7 +212,7 @@ public abstract class BogeyRenderer {
*/ */
public void createModelInstance(VisualizationContext context, BlockState state, int count) { public void createModelInstance(VisualizationContext context, BlockState state, int count) {
var instancer = context.instancerProvider() var instancer = context.instancerProvider()
.instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(state)); .instancer(InstanceTypes.POSED, VirtualRenderHelper.blockModel(state));
BogeyModelData[] modelData = IntStream.range(0, count) BogeyModelData[] modelData = IntStream.range(0, count)
.mapToObj(i -> instancer.createInstance()) .mapToObj(i -> instancer.createInstance())
.map(BogeyModelData::new) .map(BogeyModelData::new)
@ -340,27 +340,27 @@ public abstract class BogeyRenderer {
} }
public BogeyModelData setTransform(PoseStack ms) { public BogeyModelData setTransform(PoseStack ms) {
if (this.transform instanceof TransformedInstance model) if (this.transform instanceof PosedInstance model)
model.setTransform(ms) model.setTransform(ms)
.setChanged(); .setChanged();
return this; return this;
} }
public BogeyModelData setEmptyTransform() { public BogeyModelData setEmptyTransform() {
if (this.transform instanceof TransformedInstance model) if (this.transform instanceof PosedInstance model)
model.setZeroTransform() model.setZeroTransform()
.setChanged(); .setChanged();
return this; return this;
} }
public BogeyModelData delete() { public BogeyModelData delete() {
if (this.transform instanceof TransformedInstance model) if (this.transform instanceof PosedInstance model)
model.delete(); model.delete();
return this; return this;
} }
public BogeyModelData updateLight(int blockLight, int skyLight) { public BogeyModelData updateLight(int blockLight, int skyLight) {
if (this.transform instanceof TransformedInstance model) if (this.transform instanceof PosedInstance model)
model.light(blockLight, skyLight) model.light(blockLight, skyLight)
.setChanged(); .setChanged();
return this; return this;

View file

@ -138,11 +138,11 @@ public class TrackVisual extends AbstractBlockEntityVisual<TrackBlockEntity> {
TrackMaterial.TrackModelHolder modelHolder = bc.getMaterial().getModelHolder(); TrackMaterial.TrackModelHolder modelHolder = bc.getMaterial().getModelHolder();
instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.tie())) instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.tie()))
.createInstances(ties); .createInstances(ties);
instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.leftSegment())) instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.leftSegment()))
.createInstances(left); .createInstances(left);
instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.rightSegment())) instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.rightSegment()))
.createInstances(right); .createInstances(right);
SegmentAngles[] segments = bc.getBakedSegments(); SegmentAngles[] segments = bc.getBakedSegments();
@ -151,14 +151,14 @@ public class TrackVisual extends AbstractBlockEntityVisual<TrackBlockEntity> {
var modelIndex = i - 1; var modelIndex = i - 1;
ties[modelIndex].setTransform(pose) ties[modelIndex].setTransform(pose)
.transform(segment.tieTransform) .mul(segment.tieTransform)
.setChanged(); .setChanged();
tiesLightPos[modelIndex] = segment.lightPosition.offset(tePosition); tiesLightPos[modelIndex] = segment.lightPosition.offset(tePosition);
for (boolean first : Iterate.trueAndFalse) { for (boolean first : Iterate.trueAndFalse) {
Pose transform = segment.railTransforms.get(first); Pose transform = segment.railTransforms.get(first);
(first ? this.left : this.right)[modelIndex].setTransform(pose) (first ? this.left : this.right)[modelIndex].setTransform(pose)
.transform(transform) .mul(transform)
.setChanged(); .setChanged();
(first ? leftLightPos : rightLightPos)[modelIndex] = segment.lightPosition.offset(tePosition); (first ? leftLightPos : rightLightPos)[modelIndex] = segment.lightPosition.offset(tePosition);
} }
@ -218,10 +218,10 @@ public class TrackVisual extends AbstractBlockEntityVisual<TrackBlockEntity> {
beams = Couple.create(() -> new TransformedInstance[segCount]); beams = Couple.create(() -> new TransformedInstance[segCount]);
beamCaps = Couple.create(() -> Couple.create(() -> new TransformedInstance[segCount])); beamCaps = Couple.create(() -> Couple.create(() -> new TransformedInstance[segCount]));
lightPos = new BlockPos[segCount]; lightPos = new BlockPos[segCount];
beams.forEach(instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GIRDER_SEGMENT_MIDDLE))::createInstances); beams.forEach(instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GIRDER_SEGMENT_MIDDLE))::createInstances);
beamCaps.forEachWithContext((c, top) -> { beamCaps.forEachWithContext((c, top) -> {
var partialModel = Models.partial(top ? AllPartialModels.GIRDER_SEGMENT_TOP : AllPartialModels.GIRDER_SEGMENT_BOTTOM); var partialModel = Models.partial(top ? AllPartialModels.GIRDER_SEGMENT_TOP : AllPartialModels.GIRDER_SEGMENT_BOTTOM);
c.forEach(instancerProvider.instancer(InstanceTypes.TRANSFORMED, partialModel)::createInstances); c.forEach(instancerProvider().instancer(InstanceTypes.TRANSFORMED, partialModel)::createInstances);
}); });
GirderAngles[] bakedGirders = bc.getBakedGirders(); GirderAngles[] bakedGirders = bc.getBakedGirders();
@ -233,14 +233,14 @@ public class TrackVisual extends AbstractBlockEntityVisual<TrackBlockEntity> {
for (boolean first : Iterate.trueAndFalse) { for (boolean first : Iterate.trueAndFalse) {
Pose beamTransform = segment.beams.get(first); Pose beamTransform = segment.beams.get(first);
beams.get(first)[modelIndex].setTransform(pose) beams.get(first)[modelIndex].setTransform(pose)
.transform(beamTransform) .mul(beamTransform)
.setChanged(); .setChanged();
for (boolean top : Iterate.trueAndFalse) { for (boolean top : Iterate.trueAndFalse) {
Pose beamCapTransform = segment.beamCaps.get(top) Pose beamCapTransform = segment.beamCaps.get(top)
.get(first); .get(first);
beamCaps.get(top) beamCaps.get(top)
.get(first)[modelIndex].setTransform(pose) .get(first)[modelIndex].setTransform(pose)
.transform(beamCapTransform) .mul(beamCapTransform)
.setChanged(); .setChanged();
} }
} }

View file

@ -7,10 +7,10 @@ import org.jetbrains.annotations.Nullable;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.model.Model;
import dev.engine_room.flywheel.lib.model.ModelCache;
import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.ModelUtil;
import dev.engine_room.flywheel.lib.model.baked.ForgeBakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.ForgeBakedModelBuilder;
import dev.engine_room.flywheel.lib.model.baked.VirtualEmptyBlockGetter; import dev.engine_room.flywheel.lib.model.baked.VirtualEmptyBlockGetter;
import dev.engine_room.flywheel.lib.util.ResourceReloadCache;
import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
@ -25,7 +25,7 @@ public class VirtualRenderHelper {
public static final ModelProperty<Boolean> VIRTUAL_PROPERTY = new ModelProperty<>(); public static final ModelProperty<Boolean> VIRTUAL_PROPERTY = new ModelProperty<>();
public static final ModelData VIRTUAL_DATA = ModelData.builder().with(VIRTUAL_PROPERTY, true).build(); public static final ModelData VIRTUAL_DATA = ModelData.builder().with(VIRTUAL_PROPERTY, true).build();
private static final ModelCache<BlockState> VIRTUAL_BLOCKS = new ModelCache<>(state -> new ForgeBakedModelBuilder(ModelUtil.VANILLA_RENDERER.getBlockModel(state)).modelData(VIRTUAL_DATA).build()); private static final ResourceReloadCache<BlockState, Model> VIRTUAL_BLOCKS = new ResourceReloadCache<>(state -> new ForgeBakedModelBuilder(ModelUtil.VANILLA_RENDERER.getBlockModel(state)).modelData(VIRTUAL_DATA).build());
private static final ThreadLocal<ThreadLocalObjects> THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); private static final ThreadLocal<ThreadLocalObjects> THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new);
public static boolean isVirtual(ModelData data) { public static boolean isVirtual(ModelData data) {