Crank it!

- Fix valve handle visual rendering a ghost instance
- Fix drills rendering garbage
This commit is contained in:
Jozufozu 2024-07-19 18:26:13 -07:00
parent 73661845fe
commit bbc30e41c7
3 changed files with 42 additions and 54 deletions

View file

@ -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<E extends AbstractContraptionEntity> 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<E extends AbstractContraptionEntity> extends Abst
@Override
public void updateLight(float partialTick) {
super.update(partialTick);
}
public LongSet collectLightSections() {

View file

@ -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<HandCrankBlockEntity> implements SimpleDynamicVisual {
public class HandCrankVisual extends KineticBlockEntityVisual<HandCrankBlockEntity> implements SimpleDynamicVisual {
protected RotatingInstance rotatingModel;
private final TransformedInstance crank;
private final Direction facing;
@ -23,22 +26,21 @@ public class HandCrankVisual extends SingleRotatingVisual<HandCrankBlockEntity>
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<HandCrankBlockEntity>
@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<Instance> consumer) {
super.collectCrumblingInstances(consumer);
if (crank != null) {
consumer.accept(crank);
}
consumer.accept(crank);
consumer.accept(rotatingModel);
}
}

View file

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