Embed and virtualize

- Use VisualEmbedding in ContraptionVisual
- Remove context shaders
- Directly use the model from the blockstate in VirtualRenderHelper
  - Fixes many bes trying to use empty meshes because they correctly
    identify as ENTITYBLOCK_ANIMATED
- Fix valves being unlit
- Fix bearing contraptions spinning way too fast
- Do not implement SimpleDynamicVisual in CarriageContraptionVisual,
  that's taken care of by the base ContraptionVisual now
This commit is contained in:
Jozufozu 2024-02-28 11:06:17 -08:00
parent 286d2a68ab
commit 7613ebcb1e
11 changed files with 50 additions and 127 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-alpha-53 flywheel_version = 1.0.0-alpha-56
jei_minecraft_version = 1.20.1 jei_minecraft_version = 1.20.1
jei_version = 15.2.0.22 jei_version = 15.2.0.22
curios_minecraft_version = 1.20.1 curios_minecraft_version = 1.20.1

View file

@ -18,7 +18,6 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsClient;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.outliner.Outliner; import com.simibubi.create.foundation.outliner.Outliner;
import com.simibubi.create.foundation.ponder.element.WorldSectionElement; import com.simibubi.create.foundation.ponder.element.WorldSectionElement;
import com.simibubi.create.foundation.render.AllContextShaders;
import com.simibubi.create.foundation.render.AllInstanceTypes; import com.simibubi.create.foundation.render.AllInstanceTypes;
import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.render.StitchedSprite; import com.simibubi.create.foundation.render.StitchedSprite;
@ -68,7 +67,6 @@ public class CreateClient {
modEventBus.addListener(StitchedSprite::onTextureStitchPost); modEventBus.addListener(StitchedSprite::onTextureStitchPost);
AllInstanceTypes.init(); AllInstanceTypes.init();
AllContextShaders.init();
MODEL_SWAPPER.registerListeners(modEventBus); MODEL_SWAPPER.registerListeners(modEventBus);

View file

@ -250,7 +250,7 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity {
TransformStack.of(matrixStack) TransformStack.of(matrixStack)
.nudge(getId()) .nudge(getId())
.center() .center()
.rotate(angle, axis) .rotateDegrees(angle, axis)
.uncenter(); .uncenter();
} }
} }

View file

@ -6,11 +6,6 @@ import java.util.function.LongConsumer;
import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.MutablePair;
import com.jozufozu.flywheel.api.context.Context;
import com.jozufozu.flywheel.api.context.ContextShader;
import com.jozufozu.flywheel.api.context.Shader;
import com.jozufozu.flywheel.api.context.TextureSource;
import com.jozufozu.flywheel.api.material.Material;
import com.jozufozu.flywheel.api.model.Model; import com.jozufozu.flywheel.api.model.Model;
import com.jozufozu.flywheel.api.task.Plan; import com.jozufozu.flywheel.api.task.Plan;
import com.jozufozu.flywheel.api.visual.BlockEntityVisual; import com.jozufozu.flywheel.api.visual.BlockEntityVisual;
@ -20,6 +15,7 @@ import com.jozufozu.flywheel.api.visual.TickableVisual;
import com.jozufozu.flywheel.api.visual.VisualFrameContext; import com.jozufozu.flywheel.api.visual.VisualFrameContext;
import com.jozufozu.flywheel.api.visual.VisualTickContext; import com.jozufozu.flywheel.api.visual.VisualTickContext;
import com.jozufozu.flywheel.api.visualization.BlockEntityVisualizer; import com.jozufozu.flywheel.api.visualization.BlockEntityVisualizer;
import com.jozufozu.flywheel.api.visualization.VisualEmbedding;
import com.jozufozu.flywheel.api.visualization.VisualizationContext; import com.jozufozu.flywheel.api.visualization.VisualizationContext;
import com.jozufozu.flywheel.api.visualization.VisualizerRegistry; import com.jozufozu.flywheel.api.visualization.VisualizerRegistry;
import com.jozufozu.flywheel.lib.instance.InstanceTypes; import com.jozufozu.flywheel.lib.instance.InstanceTypes;
@ -30,32 +26,25 @@ import com.jozufozu.flywheel.lib.task.NestedPlan;
import com.jozufozu.flywheel.lib.task.PlanMap; import com.jozufozu.flywheel.lib.task.PlanMap;
import com.jozufozu.flywheel.lib.task.RunnablePlan; import com.jozufozu.flywheel.lib.task.RunnablePlan;
import com.jozufozu.flywheel.lib.visual.AbstractEntityVisual; import com.jozufozu.flywheel.lib.visual.AbstractEntityVisual;
import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual;
import com.jozufozu.flywheel.lib.visual.SimpleTickableVisual;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.AllMovementBehaviours;
import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.AbstractContraptionEntity;
import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.Contraption;
import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour;
import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.behaviour.MovementContext;
import com.simibubi.create.foundation.render.AllContextShaders;
import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld;
import net.minecraft.core.Vec3i;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
public class ContraptionVisual<E extends AbstractContraptionEntity> extends AbstractEntityVisual<E> implements DynamicVisual, TickableVisual, LitVisual { public class ContraptionVisual<E extends AbstractContraptionEntity> extends AbstractEntityVisual<E> implements DynamicVisual, TickableVisual, LitVisual {
protected final ContraptionContext context; protected final VisualEmbedding embedding;
protected final VisualizationContext visualizationContext;
private final List<BlockEntityVisual<?>> children = new ArrayList<>(); private final List<BlockEntityVisual<?>> children = new ArrayList<>();
private final List<ActorVisual> actors = new ArrayList<>(); private final List<ActorVisual> actors = new ArrayList<>();
private final PlanMap<DynamicVisual, VisualFrameContext> dynamicVisuals = new PlanMap<>(); private final PlanMap<DynamicVisual, VisualFrameContext> dynamicVisuals = new PlanMap<>();
private final List<SimpleDynamicVisual> simpleDynamicVisuals = new ArrayList<>();
private final PlanMap<TickableVisual, VisualTickContext> tickableVisuals = new PlanMap<>(); private final PlanMap<TickableVisual, VisualTickContext> tickableVisuals = new PlanMap<>();
private final List<SimpleTickableVisual> simpleTickableVisuals = new ArrayList<>();
private VirtualRenderWorld virtualRenderWorld; private VirtualRenderWorld virtualRenderWorld;
private Notifier notifier; private Notifier notifier;
private Model model; private Model model;
@ -65,8 +54,7 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> extends Abst
public ContraptionVisual(VisualizationContext ctx, E entity) { public ContraptionVisual(VisualizationContext ctx, E entity) {
super(ctx, entity); super(ctx, entity);
context = new ContraptionContext(); embedding = ctx.createEmbedding();
visualizationContext = ctx.withContext(context, Vec3i.ZERO);
} }
@Override @Override
@ -79,7 +67,7 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> extends Abst
.renderWorld(virtualRenderWorld) .renderWorld(virtualRenderWorld)
.build(); .build();
structure = visualizationContext.instancerProvider() structure = embedding.instancerProvider()
.instancer(InstanceTypes.TRANSFORMED, model) .instancer(InstanceTypes.TRANSFORMED, model)
.createInstance(); .createInstance();
@ -107,7 +95,7 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> extends Abst
if (movementBehaviour == null) { if (movementBehaviour == null) {
return; return;
} }
var instance = movementBehaviour.createInstance(this.visualizationContext, virtualRenderWorld, context); var instance = movementBehaviour.createInstance(this.embedding, virtualRenderWorld, context);
if (instance == null) { if (instance == null) {
return; return;
@ -127,18 +115,18 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> extends Abst
Level world = be.getLevel(); Level world = be.getLevel();
be.setLevel(virtualRenderWorld); be.setLevel(virtualRenderWorld);
BlockEntityVisual<? super T> visual = visualizer.createVisual(this.visualizationContext, be); BlockEntityVisual<? super T> visual = visualizer.createVisual(this.embedding, be);
visual.init(partialTicks); visual.init(partialTicks);
children.add(visual); children.add(visual);
if (visual instanceof DynamicVisual dynamic) { if (visual instanceof DynamicVisual dynamic) {
if (dynamic instanceof SimpleDynamicVisual simple) { dynamicVisuals.add(dynamic, dynamic.planFrame());
simpleDynamicVisuals.add(simple); }
} else {
dynamicVisuals.add(dynamic, dynamic.planFrame()); if (visual instanceof TickableVisual tickable) {
} tickableVisuals.add(tickable, tickable.planTick());
} }
be.setLevel(world); be.setLevel(world);
@ -148,7 +136,6 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> extends Abst
public Plan<VisualTickContext> planTick() { public Plan<VisualTickContext> planTick() {
return NestedPlan.of( return NestedPlan.of(
ForEachPlan.of(() -> actors, ActorVisual::tick), ForEachPlan.of(() -> actors, ActorVisual::tick),
ForEachPlan.of(() -> simpleTickableVisuals, SimpleTickableVisual::tick),
tickableVisuals tickableVisuals
); );
} }
@ -158,11 +145,37 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> extends Abst
return NestedPlan.of( return NestedPlan.of(
RunnablePlan.of(this::beginFrame), RunnablePlan.of(this::beginFrame),
ForEachPlan.of(() -> actors, ActorVisual::beginFrame), ForEachPlan.of(() -> actors, ActorVisual::beginFrame),
ForEachPlan.of(() -> simpleDynamicVisuals, SimpleDynamicVisual::beginFrame),
dynamicVisuals dynamicVisuals
); );
} }
protected void beginFrame(VisualFrameContext context) {
double x = Mth.lerp(context.partialTick(), entity.xOld, entity.getX());
double y = Mth.lerp(context.partialTick(), entity.yOld, entity.getY());
double z = Mth.lerp(context.partialTick(), entity.zOld, entity.getZ());
contraptionMatrix.setIdentity();
contraptionMatrix.translate(x, y, z);
entity.applyLocalTransforms(contraptionMatrix, context.partialTick());
embedding.transforms(contraptionMatrix.last().pose(), contraptionMatrix.last().normal());
}
@Override
public void updateLight() {
}
@Override
public void collectLightSections(LongConsumer consumer) {
var boundingBox = entity.getBoundingBox();
}
@Override
public void initLightSectionNotifier(Notifier notifier) {
this.notifier = notifier;
}
@Override @Override
protected void _delete() { protected void _delete() {
children.forEach(BlockEntityVisual::delete); children.forEach(BlockEntityVisual::delete);
@ -177,44 +190,4 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> extends Abst
structure.delete(); structure.delete();
} }
} }
@Override
public void updateLight() {
}
protected void beginFrame(VisualFrameContext context) {
double x = Mth.lerp(context.partialTick(), entity.xOld, entity.getX());
double y = Mth.lerp(context.partialTick(), entity.yOld, entity.getY());
double z = Mth.lerp(context.partialTick(), entity.zOld, entity.getZ());
contraptionMatrix.setIdentity();
contraptionMatrix.translate(x, y, z);
entity.applyLocalTransforms(contraptionMatrix, context.partialTick());
}
@Override
public void collectLightSections(LongConsumer consumer) {
var boundingBox = entity.getBoundingBox();
}
@Override
public void initLightSectionNotifier(Notifier notifier) {
this.notifier = notifier;
}
public class ContraptionContext implements Context {
@Override
public ContextShader contextShader() {
return AllContextShaders.CONTRAPTION;
}
@Override
public void prepare(Material material, Shader shader, TextureSource textureSource) {
// shader.setVec3("create_oneOverLightBoxSize");
// shader.setVec3("create_lightVolumeMin");
shader.setMat4("create_model", contraptionMatrix.last().pose());
}
}
} }

View file

@ -4,11 +4,11 @@ import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance; import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.model.Model; import com.jozufozu.flywheel.api.model.Model;
import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual;
import com.jozufozu.flywheel.api.visual.VisualFrameContext; import com.jozufozu.flywheel.api.visual.VisualFrameContext;
import com.jozufozu.flywheel.api.visualization.VisualizationContext; import com.jozufozu.flywheel.api.visualization.VisualizationContext;
import com.jozufozu.flywheel.lib.instance.InstanceTypes; import com.jozufozu.flywheel.lib.instance.InstanceTypes;
import com.jozufozu.flywheel.lib.instance.TransformedInstance; import com.jozufozu.flywheel.lib.instance.TransformedInstance;
import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual;
import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; import com.simibubi.create.content.kinetics.base.SingleRotatingVisual;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
@ -54,6 +54,8 @@ public class HandCrankVisual extends SingleRotatingVisual<HandCrankBlockEntity>
// FIXME: need to call super.super.init here // FIXME: need to call super.super.init here
if (blockEntity.shouldRenderShaft()) if (blockEntity.shouldRenderShaft())
super.init(pt); super.init(pt);
updateLight();
} }
@Override @Override

View file

@ -3,13 +3,12 @@ package com.simibubi.create.content.kinetics.flywheel;
import java.util.function.Consumer; import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance; import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.lib.model.Models;
import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual;
import com.jozufozu.flywheel.api.visual.VisualFrameContext; import com.jozufozu.flywheel.api.visual.VisualFrameContext;
import com.jozufozu.flywheel.api.visualization.VisualizationContext; import com.jozufozu.flywheel.api.visualization.VisualizationContext;
import com.jozufozu.flywheel.lib.instance.InstanceTypes; import com.jozufozu.flywheel.lib.instance.InstanceTypes;
import com.jozufozu.flywheel.lib.instance.TransformedInstance; import com.jozufozu.flywheel.lib.instance.TransformedInstance;
import com.jozufozu.flywheel.lib.transform.TransformStack; import com.jozufozu.flywheel.lib.transform.TransformStack;
import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual;
import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.content.kinetics.base.RotatingInstance;
@ -31,7 +30,7 @@ public class FlywheelVisual extends KineticBlockEntityVisual<FlywheelBlockEntity
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, Models.block(blockState)) wheel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(blockState))
.createInstance(); .createInstance();
animate(blockEntity.angle); animate(blockEntity.angle);

View file

@ -5,7 +5,6 @@ import org.joml.Vector3f;
import com.jozufozu.flywheel.api.visual.VisualFrameContext; import com.jozufozu.flywheel.api.visual.VisualFrameContext;
import com.jozufozu.flywheel.api.visualization.VisualizationContext; import com.jozufozu.flywheel.api.visualization.VisualizationContext;
import com.jozufozu.flywheel.lib.transform.TransformStack; import com.jozufozu.flywheel.lib.transform.TransformStack;
import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.content.contraptions.render.ContraptionVisual; import com.simibubi.create.content.contraptions.render.ContraptionVisual;
import com.simibubi.create.content.trains.bogey.BogeyRenderer; import com.simibubi.create.content.trains.bogey.BogeyRenderer;
@ -14,7 +13,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
public class CarriageContraptionVisual extends ContraptionVisual<CarriageContraptionEntity> implements SimpleDynamicVisual { public class CarriageContraptionVisual extends ContraptionVisual<CarriageContraptionEntity> {
private final PoseStack ms = new PoseStack(); private final PoseStack ms = new PoseStack();
@ -100,6 +99,8 @@ public class CarriageContraptionVisual extends ContraptionVisual<CarriageContrap
@Override @Override
public void _delete() { public void _delete() {
super._delete();
if (bogeys == null) if (bogeys == null)
return; return;

View file

@ -1,24 +0,0 @@
package com.simibubi.create.foundation.render;
import com.jozufozu.flywheel.api.context.ContextShader;
import com.jozufozu.flywheel.lib.context.SimpleContextShader;
import com.simibubi.create.Create;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class AllContextShaders {
public static final ContextShader CONTRAPTION = ContextShader.REGISTRY.registerAndGet(new SimpleContextShader(
Create.asResource("context/contraption.vert"),
Create.asResource("context/contraption.frag")
));
private AllContextShaders() {
}
public static void init() {
// register statics
}
}

View file

@ -12,7 +12,7 @@ import com.jozufozu.flywheel.lib.model.ModelCache;
import com.jozufozu.flywheel.lib.model.ModelUtil; import com.jozufozu.flywheel.lib.model.ModelUtil;
import com.jozufozu.flywheel.lib.model.baked.BakedModelBufferer; import com.jozufozu.flywheel.lib.model.baked.BakedModelBufferer;
import com.jozufozu.flywheel.lib.model.baked.BakedModelBufferer.ShadeSeparatedResultConsumer; import com.jozufozu.flywheel.lib.model.baked.BakedModelBufferer.ShadeSeparatedResultConsumer;
import com.jozufozu.flywheel.lib.model.baked.BlockModelBuilder; import com.jozufozu.flywheel.lib.model.baked.BakedModelBuilder;
import com.jozufozu.flywheel.lib.model.baked.VirtualEmptyBlockGetter; import com.jozufozu.flywheel.lib.model.baked.VirtualEmptyBlockGetter;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer; import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
@ -27,7 +27,7 @@ import net.minecraftforge.client.model.data.ModelProperty;
public class VirtualRenderHelper { 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();
public static final ModelCache<BlockState> VIRTUAL_BLOCKS = new ModelCache<>(state -> new BlockModelBuilder(state).modelData(VIRTUAL_DATA).build()); public static final ModelCache<BlockState> VIRTUAL_BLOCKS = new ModelCache<>(state -> new BakedModelBuilder(ModelUtil.VANILLA_RENDERER.getBlockModel(state)).modelData(VIRTUAL_DATA).build());
public static boolean isVirtual(ModelData data) { public static boolean isVirtual(ModelData data) {
return data.has(VirtualRenderHelper.VIRTUAL_PROPERTY) && data.get(VirtualRenderHelper.VIRTUAL_PROPERTY); return data.has(VirtualRenderHelper.VIRTUAL_PROPERTY) && data.get(VirtualRenderHelper.VIRTUAL_PROPERTY);

View file

@ -1,10 +0,0 @@
uniform sampler3D create_lightVolume;
in vec3 create_lightVolumeCoord;
void flw_beginFragment() {
flw_fragLight = max(flw_fragLight, texture(create_lightVolume, create_lightVolumeCoord).rg);
}
void flw_endFragment() {
}

View file

@ -1,16 +0,0 @@
uniform vec3 create_oneOverLightBoxSize;
uniform vec3 create_lightVolumeMin;
uniform mat4 create_model;
uniform mat3 create_normal;
out vec3 create_lightVolumeCoord;
void flw_beginVertex() {
}
void flw_endVertex() {
create_lightVolumeCoord = (flw_vertexPos.xyz - create_lightVolumeMin) * create_oneOverLightBoxSize;
flw_vertexPos = create_model * flw_vertexPos;
flw_vertexNormal = create_normal * flw_vertexNormal;
}