diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java index d31560822e..7fae4c77ce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java @@ -3,18 +3,24 @@ package com.simibubi.create.content.contraptions.render; import java.util.ArrayList; import java.util.List; -import dev.engine_room.flywheel.api.visual.LightUpdatedVisual; - -import dev.engine_room.flywheel.api.visual.ShaderLightVisual; -import it.unimi.dsi.fastutil.longs.LongArraySet; -import it.unimi.dsi.fastutil.longs.LongSet; - import org.apache.commons.lang3.tuple.MutablePair; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllMovementBehaviours; +import com.simibubi.create.content.contraptions.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.Contraption; +import com.simibubi.create.content.contraptions.Contraption.RenderedBlocks; +import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; +import com.simibubi.create.content.contraptions.behaviour.MovementContext; +import com.simibubi.create.foundation.utility.worldWrappers.WrappedBlockAndTintGetter; +import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; + import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.task.Plan; import dev.engine_room.flywheel.api.visual.BlockEntityVisual; import dev.engine_room.flywheel.api.visual.DynamicVisual; +import dev.engine_room.flywheel.api.visual.LightUpdatedVisual; +import dev.engine_room.flywheel.api.visual.ShaderLightVisual; import dev.engine_room.flywheel.api.visual.TickableVisual; import dev.engine_room.flywheel.api.visualization.BlockEntityVisualizer; import dev.engine_room.flywheel.api.visualization.VisualEmbedding; @@ -28,16 +34,8 @@ import dev.engine_room.flywheel.lib.task.NestedPlan; import dev.engine_room.flywheel.lib.task.PlanMap; import dev.engine_room.flywheel.lib.task.RunnablePlan; import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllMovementBehaviours; -import com.simibubi.create.content.contraptions.AbstractContraptionEntity; -import com.simibubi.create.content.contraptions.Contraption; -import com.simibubi.create.content.contraptions.Contraption.RenderedBlocks; -import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; -import com.simibubi.create.content.contraptions.behaviour.MovementContext; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedBlockAndTintGetter; -import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; - +import it.unimi.dsi.fastutil.longs.LongArraySet; +import it.unimi.dsi.fastutil.longs.LongSet; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.util.Mth; @@ -179,9 +177,6 @@ public class ContraptionVisual extends Abst } if (hasMovedBlocks()) { - // TODO: incremental light collection - // TODO: optimize light collection for very large contraptions - // by only collecting cuboids that contain faces updateLight(partialTick); } } @@ -200,7 +195,6 @@ public class ContraptionVisual extends Abst @Override public void updateLight(float partialTick) { - super.update(partialTick); } public LongSet collectLightSections() { diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java index 4a458de179..d4f4360b54 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java @@ -2,6 +2,11 @@ package com.simibubi.create.content.kinetics.crank; import java.util.function.Consumer; +import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; +import com.simibubi.create.content.kinetics.base.RotatingInstance; +import com.simibubi.create.foundation.render.AllInstanceTypes; +import com.simibubi.create.foundation.render.VirtualRenderHelper; + import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visual.DynamicVisual; @@ -9,13 +14,11 @@ 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.visual.SimpleDynamicVisual; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; - import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -public class HandCrankVisual extends SingleRotatingVisual implements SimpleDynamicVisual { - +public class HandCrankVisual extends KineticBlockEntityVisual implements SimpleDynamicVisual { + protected RotatingInstance rotatingModel; private final TransformedInstance crank; private final Direction facing; @@ -23,22 +26,21 @@ public class HandCrankVisual extends SingleRotatingVisual super(modelManager, blockEntity, partialTick); facing = blockState.getValue(BlockStateProperties.FACING); Model model = blockEntity.getRenderedHandleInstance(); + crank = instancerProvider.instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); rotateCrank(partialTick); - if (blockEntity.shouldRenderShaft()) + if (blockEntity.shouldRenderShaft()) { + rotatingModel = instancerProvider.instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(blockState)) + .createInstance(); setup(rotatingModel); - - updateLight(partialTick); + } } @Override public void beginFrame(DynamicVisual.Context ctx) { - if (crank == null) - return; - rotateCrank(ctx.partialTick()); } @@ -56,31 +58,23 @@ public class HandCrankVisual extends SingleRotatingVisual @Override protected void _delete() { - if (blockEntity.shouldRenderShaft()) - super._delete(); - if (crank != null) - crank.delete(); + crank.delete(); } @Override public void update(float pt) { - if (blockEntity.shouldRenderShaft()) - super.update(pt); + if (rotatingModel != null) + updateRotation(rotatingModel); } @Override public void updateLight(float partialTick) { - if (blockEntity.shouldRenderShaft()) - super.updateLight(partialTick); - if (crank != null) - relight(pos, crank); + relight(pos, crank, rotatingModel); } @Override public void collectCrumblingInstances(Consumer consumer) { - super.collectCrumblingInstances(consumer); - if (crank != null) { - consumer.accept(crank); - } + consumer.accept(crank); + consumer.accept(rotatingModel); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java index 9d0fa86978..8531591e41 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java @@ -4,16 +4,16 @@ import static com.simibubi.create.Create.asResource; import org.lwjgl.system.MemoryUtil; -import dev.engine_room.flywheel.api.instance.InstanceType; -import dev.engine_room.flywheel.api.layout.FloatRepr; -import dev.engine_room.flywheel.api.layout.IntegerRepr; -import dev.engine_room.flywheel.api.layout.LayoutBuilder; -import dev.engine_room.flywheel.lib.instance.SimpleInstanceType; import com.simibubi.create.content.contraptions.actors.ActorInstance; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.content.kinetics.belt.BeltInstance; import com.simibubi.create.content.logistics.flwdata.FlapInstance; +import dev.engine_room.flywheel.api.instance.InstanceType; +import dev.engine_room.flywheel.api.layout.FloatRepr; +import dev.engine_room.flywheel.api.layout.IntegerRepr; +import dev.engine_room.flywheel.api.layout.LayoutBuilder; +import dev.engine_room.flywheel.lib.instance.SimpleInstanceType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -117,11 +117,11 @@ public class AllInstanceTypes { MemoryUtil.memPutFloat(ptr + 24, instance.rotation.x); MemoryUtil.memPutFloat(ptr + 28, instance.rotation.y); MemoryUtil.memPutFloat(ptr + 32, instance.rotation.z); - MemoryUtil.memPutFloat(ptr + 34, instance.rotation.w); - MemoryUtil.memPutByte(ptr + 38, instance.rotationCenterX); - MemoryUtil.memPutByte(ptr + 39, instance.rotationCenterY); - MemoryUtil.memPutByte(ptr + 40, instance.rotationCenterZ); - MemoryUtil.memPutFloat(ptr + 42, instance.speed); + MemoryUtil.memPutFloat(ptr + 36, instance.rotation.w); + MemoryUtil.memPutByte(ptr + 40, instance.rotationCenterX); + MemoryUtil.memPutByte(ptr + 41, instance.rotationCenterY); + MemoryUtil.memPutByte(ptr + 42, instance.rotationCenterZ); + MemoryUtil.memPutFloat(ptr + 44, instance.speed); }) .register();