From 7613ebcb1ef564d345feb206ba8fb68c6c059e3e Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Wed, 28 Feb 2024 11:06:17 -0800 Subject: [PATCH] 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 --- gradle.properties | 2 +- .../com/simibubi/create/CreateClient.java | 2 - .../ControlledContraptionEntity.java | 2 +- .../render/ContraptionVisual.java | 103 +++++++----------- .../kinetics/crank/HandCrankVisual.java | 4 +- .../kinetics/flywheel/FlywheelVisual.java | 5 +- .../entity/CarriageContraptionVisual.java | 5 +- .../foundation/render/AllContextShaders.java | 24 ---- .../render/VirtualRenderHelper.java | 4 +- .../create/flywheel/context/contraption.frag | 10 -- .../create/flywheel/context/contraption.vert | 16 --- 11 files changed, 50 insertions(+), 127 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/AllContextShaders.java delete mode 100644 src/main/resources/assets/create/flywheel/context/contraption.frag delete mode 100644 src/main/resources/assets/create/flywheel/context/contraption.vert diff --git a/gradle.properties b/gradle.properties index cb20af218..2b3131ea5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 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_version = 15.2.0.22 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index cd41bd8a1..be27cae85 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -18,7 +18,6 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsClient; import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.outliner.Outliner; 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.CachedBufferer; import com.simibubi.create.foundation.render.StitchedSprite; @@ -68,7 +67,6 @@ public class CreateClient { modEventBus.addListener(StitchedSprite::onTextureStitchPost); AllInstanceTypes.init(); - AllContextShaders.init(); MODEL_SWAPPER.registerListeners(modEventBus); diff --git a/src/main/java/com/simibubi/create/content/contraptions/ControlledContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/ControlledContraptionEntity.java index cf40c01cb..b6e7d311e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/ControlledContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/ControlledContraptionEntity.java @@ -250,7 +250,7 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { TransformStack.of(matrixStack) .nudge(getId()) .center() - .rotate(angle, axis) + .rotateDegrees(angle, axis) .uncenter(); } } 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 ba78b6b12..a989e0324 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 @@ -6,11 +6,6 @@ import java.util.function.LongConsumer; 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.task.Plan; 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.VisualTickContext; 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.VisualizerRegistry; 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.RunnablePlan; 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.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; -import com.simibubi.create.foundation.render.AllContextShaders; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; -import net.minecraft.core.Vec3i; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; public class ContraptionVisual extends AbstractEntityVisual implements DynamicVisual, TickableVisual, LitVisual { - protected final ContraptionContext context; - protected final VisualizationContext visualizationContext; + protected final VisualEmbedding embedding; private final List> children = new ArrayList<>(); private final List actors = new ArrayList<>(); private final PlanMap dynamicVisuals = new PlanMap<>(); - private final List simpleDynamicVisuals = new ArrayList<>(); private final PlanMap tickableVisuals = new PlanMap<>(); - private final List simpleTickableVisuals = new ArrayList<>(); private VirtualRenderWorld virtualRenderWorld; private Notifier notifier; private Model model; @@ -65,8 +54,7 @@ public class ContraptionVisual extends Abst public ContraptionVisual(VisualizationContext ctx, E entity) { super(ctx, entity); - context = new ContraptionContext(); - visualizationContext = ctx.withContext(context, Vec3i.ZERO); + embedding = ctx.createEmbedding(); } @Override @@ -79,7 +67,7 @@ public class ContraptionVisual extends Abst .renderWorld(virtualRenderWorld) .build(); - structure = visualizationContext.instancerProvider() + structure = embedding.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); @@ -107,7 +95,7 @@ public class ContraptionVisual extends Abst if (movementBehaviour == null) { return; } - var instance = movementBehaviour.createInstance(this.visualizationContext, virtualRenderWorld, context); + var instance = movementBehaviour.createInstance(this.embedding, virtualRenderWorld, context); if (instance == null) { return; @@ -127,18 +115,18 @@ public class ContraptionVisual extends Abst Level world = be.getLevel(); be.setLevel(virtualRenderWorld); - BlockEntityVisual visual = visualizer.createVisual(this.visualizationContext, be); + BlockEntityVisual visual = visualizer.createVisual(this.embedding, be); visual.init(partialTicks); children.add(visual); if (visual instanceof DynamicVisual dynamic) { - if (dynamic instanceof SimpleDynamicVisual simple) { - simpleDynamicVisuals.add(simple); - } else { - dynamicVisuals.add(dynamic, dynamic.planFrame()); - } + dynamicVisuals.add(dynamic, dynamic.planFrame()); + } + + if (visual instanceof TickableVisual tickable) { + tickableVisuals.add(tickable, tickable.planTick()); } be.setLevel(world); @@ -148,7 +136,6 @@ public class ContraptionVisual extends Abst public Plan planTick() { return NestedPlan.of( ForEachPlan.of(() -> actors, ActorVisual::tick), - ForEachPlan.of(() -> simpleTickableVisuals, SimpleTickableVisual::tick), tickableVisuals ); } @@ -158,11 +145,37 @@ public class ContraptionVisual extends Abst return NestedPlan.of( RunnablePlan.of(this::beginFrame), ForEachPlan.of(() -> actors, ActorVisual::beginFrame), - ForEachPlan.of(() -> simpleDynamicVisuals, SimpleDynamicVisual::beginFrame), 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 protected void _delete() { children.forEach(BlockEntityVisual::delete); @@ -177,44 +190,4 @@ public class ContraptionVisual extends Abst 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()); - } - } } 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 2c4b125d3..38f9c2a64 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 @@ -4,11 +4,11 @@ import java.util.function.Consumer; import com.jozufozu.flywheel.api.instance.Instance; 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.visualization.VisualizationContext; import com.jozufozu.flywheel.lib.instance.InstanceTypes; 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.foundation.utility.AnimationTickHolder; @@ -54,6 +54,8 @@ public class HandCrankVisual extends SingleRotatingVisual // FIXME: need to call super.super.init here if (blockEntity.shouldRenderShaft()) super.init(pt); + + updateLight(); } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java index 3ac8d6752..fb65499db 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java @@ -3,13 +3,12 @@ package com.simibubi.create.content.kinetics.flywheel; import java.util.function.Consumer; 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.visualization.VisualizationContext; import com.jozufozu.flywheel.lib.instance.InstanceTypes; import com.jozufozu.flywheel.lib.instance.TransformedInstance; import com.jozufozu.flywheel.lib.transform.TransformStack; +import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; @@ -31,7 +30,7 @@ public class FlywheelVisual extends KineticBlockEntityVisual implements SimpleDynamicVisual { +public class CarriageContraptionVisual extends ContraptionVisual { private final PoseStack ms = new PoseStack(); @@ -100,6 +99,8 @@ public class CarriageContraptionVisual extends ContraptionVisual VIRTUAL_PROPERTY = new ModelProperty<>(); public static final ModelData VIRTUAL_DATA = ModelData.builder().with(VIRTUAL_PROPERTY, true).build(); - public static final ModelCache VIRTUAL_BLOCKS = new ModelCache<>(state -> new BlockModelBuilder(state).modelData(VIRTUAL_DATA).build()); + public static final ModelCache VIRTUAL_BLOCKS = new ModelCache<>(state -> new BakedModelBuilder(ModelUtil.VANILLA_RENDERER.getBlockModel(state)).modelData(VIRTUAL_DATA).build()); public static boolean isVirtual(ModelData data) { return data.has(VirtualRenderHelper.VIRTUAL_PROPERTY) && data.get(VirtualRenderHelper.VIRTUAL_PROPERTY); diff --git a/src/main/resources/assets/create/flywheel/context/contraption.frag b/src/main/resources/assets/create/flywheel/context/contraption.frag deleted file mode 100644 index f336cd669..000000000 --- a/src/main/resources/assets/create/flywheel/context/contraption.frag +++ /dev/null @@ -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() { -} diff --git a/src/main/resources/assets/create/flywheel/context/contraption.vert b/src/main/resources/assets/create/flywheel/context/contraption.vert deleted file mode 100644 index 2e519879c..000000000 --- a/src/main/resources/assets/create/flywheel/context/contraption.vert +++ /dev/null @@ -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; -}