mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-02-27 20:34:43 +01:00
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:
parent
286d2a68ab
commit
7613ebcb1e
11 changed files with 50 additions and 127 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -250,7 +250,7 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity {
|
|||
TransformStack.of(matrixStack)
|
||||
.nudge(getId())
|
||||
.center()
|
||||
.rotate(angle, axis)
|
||||
.rotateDegrees(angle, axis)
|
||||
.uncenter();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<E extends AbstractContraptionEntity> extends AbstractEntityVisual<E> implements DynamicVisual, TickableVisual, LitVisual {
|
||||
protected final ContraptionContext context;
|
||||
protected final VisualizationContext visualizationContext;
|
||||
protected final VisualEmbedding embedding;
|
||||
private final List<BlockEntityVisual<?>> children = new ArrayList<>();
|
||||
private final List<ActorVisual> actors = new ArrayList<>();
|
||||
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 List<SimpleTickableVisual> simpleTickableVisuals = new ArrayList<>();
|
||||
private VirtualRenderWorld virtualRenderWorld;
|
||||
private Notifier notifier;
|
||||
private Model model;
|
||||
|
@ -65,8 +54,7 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> 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<E extends AbstractContraptionEntity> extends Abst
|
|||
.renderWorld(virtualRenderWorld)
|
||||
.build();
|
||||
|
||||
structure = visualizationContext.instancerProvider()
|
||||
structure = embedding.instancerProvider()
|
||||
.instancer(InstanceTypes.TRANSFORMED, model)
|
||||
.createInstance();
|
||||
|
||||
|
@ -107,7 +95,7 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> 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<E extends AbstractContraptionEntity> extends Abst
|
|||
|
||||
Level world = be.getLevel();
|
||||
be.setLevel(virtualRenderWorld);
|
||||
BlockEntityVisual<? super T> visual = visualizer.createVisual(this.visualizationContext, be);
|
||||
BlockEntityVisual<? super T> 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<E extends AbstractContraptionEntity> extends Abst
|
|||
public Plan<VisualTickContext> planTick() {
|
||||
return NestedPlan.of(
|
||||
ForEachPlan.of(() -> actors, ActorVisual::tick),
|
||||
ForEachPlan.of(() -> simpleTickableVisuals, SimpleTickableVisual::tick),
|
||||
tickableVisuals
|
||||
);
|
||||
}
|
||||
|
@ -158,11 +145,37 @@ public class ContraptionVisual<E extends AbstractContraptionEntity> 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<E extends AbstractContraptionEntity> 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<HandCrankBlockEntity>
|
|||
// FIXME: need to call super.super.init here
|
||||
if (blockEntity.shouldRenderShaft())
|
||||
super.init(pt);
|
||||
|
||||
updateLight();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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<FlywheelBlockEntity
|
|||
|
||||
shaft = setup(instancerProvider.instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(shaft()))
|
||||
.createInstance());
|
||||
wheel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.block(blockState))
|
||||
wheel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(blockState))
|
||||
.createInstance();
|
||||
|
||||
animate(blockEntity.angle);
|
||||
|
|
|
@ -5,7 +5,6 @@ import org.joml.Vector3f;
|
|||
import com.jozufozu.flywheel.api.visual.VisualFrameContext;
|
||||
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
|
||||
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.contraptions.render.ContraptionVisual;
|
||||
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.Iterate;
|
||||
|
||||
public class CarriageContraptionVisual extends ContraptionVisual<CarriageContraptionEntity> implements SimpleDynamicVisual {
|
||||
public class CarriageContraptionVisual extends ContraptionVisual<CarriageContraptionEntity> {
|
||||
|
||||
private final PoseStack ms = new PoseStack();
|
||||
|
||||
|
@ -100,6 +99,8 @@ public class CarriageContraptionVisual extends ContraptionVisual<CarriageContrap
|
|||
|
||||
@Override
|
||||
public void _delete() {
|
||||
super._delete();
|
||||
|
||||
if (bogeys == null)
|
||||
return;
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -12,7 +12,7 @@ import com.jozufozu.flywheel.lib.model.ModelCache;
|
|||
import com.jozufozu.flywheel.lib.model.ModelUtil;
|
||||
import com.jozufozu.flywheel.lib.model.baked.BakedModelBufferer;
|
||||
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.mojang.blaze3d.vertex.BufferBuilder;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
|
||||
|
@ -27,7 +27,7 @@ import net.minecraftforge.client.model.data.ModelProperty;
|
|||
public class VirtualRenderHelper {
|
||||
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 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) {
|
||||
return data.has(VirtualRenderHelper.VIRTUAL_PROPERTY) && data.get(VirtualRenderHelper.VIRTUAL_PROPERTY);
|
||||
|
|
|
@ -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() {
|
||||
}
|
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue