As shrimple as that

- Update to SimpleDynamicVisuals
- Translate old context stuff to new api
- Add contraption visual, doesn't fully work yet
- Strip out more FlwContraption stuff
This commit is contained in:
Jozufozu 2024-02-25 13:04:31 -08:00
parent 633a7abc23
commit 286d2a68ab
45 changed files with 438 additions and 176 deletions

View file

@ -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-43
flywheel_version = 1.0.0-alpha-53
jei_minecraft_version = 1.20.1
jei_version = 15.2.0.22
curios_minecraft_version = 1.20.1

View file

@ -8,6 +8,7 @@ import com.simibubi.create.content.contraptions.gantry.GantryContraptionEntity;
import com.simibubi.create.content.contraptions.glue.SuperGlueEntity;
import com.simibubi.create.content.contraptions.glue.SuperGlueRenderer;
import com.simibubi.create.content.contraptions.render.ContraptionEntityRenderer;
import com.simibubi.create.content.contraptions.render.ContraptionVisual;
import com.simibubi.create.content.contraptions.render.OrientedContraptionEntityRenderer;
import com.simibubi.create.content.equipment.blueprint.BlueprintEntity;
import com.simibubi.create.content.equipment.blueprint.BlueprintRenderer;
@ -33,15 +34,22 @@ import net.minecraft.world.entity.MobCategory;
public class AllEntityTypes {
public static final EntityEntry<OrientedContraptionEntity> ORIENTED_CONTRAPTION = contraption("contraption",
OrientedContraptionEntity::new, () -> OrientedContraptionEntityRenderer::new, 5, 3, true).register();
OrientedContraptionEntity::new, () -> OrientedContraptionEntityRenderer::new, 5, 3, true)
.instance(() -> ContraptionVisual::new)
.register();
public static final EntityEntry<ControlledContraptionEntity> CONTROLLED_CONTRAPTION =
contraption("stationary_contraption", ControlledContraptionEntity::new, () -> ContraptionEntityRenderer::new,
20, 40, false).register();
20, 40, false)
.instance(() -> ContraptionVisual::new)
.register();
public static final EntityEntry<GantryContraptionEntity> GANTRY_CONTRAPTION = contraption("gantry_contraption",
GantryContraptionEntity::new, () -> ContraptionEntityRenderer::new, 10, 40, false).register();
GantryContraptionEntity::new, () -> ContraptionEntityRenderer::new, 10, 40, false)
.instance(() -> ContraptionVisual::new)
.register();
public static final EntityEntry<CarriageContraptionEntity> CARRIAGE_CONTRAPTION =
contraption("carriage_contraption", CarriageContraptionEntity::new,
() -> CarriageContraptionEntityRenderer::new, 15, 3, true).instance(() -> CarriageContraptionVisual::new)
() -> CarriageContraptionEntityRenderer::new, 15, 3, true)
.instance(() -> CarriageContraptionVisual::new)
.register();
public static final EntityEntry<SuperGlueEntity> SUPER_GLUE =

View file

@ -18,6 +18,7 @@ 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;
@ -67,6 +68,7 @@ public class CreateClient {
modEventBus.addListener(StitchedSprite::onTextureStitchPost);
AllInstanceTypes.init();
AllContextShaders.init();
MODEL_SWAPPER.registerListeners(modEventBus);

View file

@ -246,10 +246,12 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity {
float angle = getAngle(partialTicks);
Axis axis = getRotationAxis();
TransformStack.of(matrixStack)
.nudge(getId())
.center()
.rotate(angle, axis)
.uncenter();
if (axis != null) {
TransformStack.of(matrixStack)
.nudge(getId())
.center()
.rotate(angle, axis)
.uncenter();
}
}
}

View file

@ -94,7 +94,17 @@ public class HarvesterActorVisual extends ActorVisual {
.setChanged();
}
protected double getRotation() {
@Override
protected void _delete() {
harvester.delete();
}
protected double getRotation() {
return AngleHelper.angleLerp(AnimationTickHolder.getPartialTicks(), previousRotation, rotation);
}
@Override
public void init(float partialTick) {
}
}

View file

@ -28,4 +28,13 @@ public class PSIActorVisual extends ActorVisual {
instance.beginFrame(lf.getValue(AnimationTickHolder.getPartialTicks()));
}
@Override
protected void _delete() {
instance.remove();
}
@Override
public void init(float partialTick) {
}
}

View file

@ -3,15 +3,15 @@ package com.simibubi.create.content.contraptions.actors.psi;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
import com.jozufozu.flywheel.api.visual.TickableVisual;
import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual;
import com.jozufozu.flywheel.lib.visual.SimpleTickableVisual;
import com.jozufozu.flywheel.api.visual.VisualFrameContext;
import com.jozufozu.flywheel.api.visual.VisualTickContext;
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
import com.jozufozu.flywheel.lib.visual.AbstractBlockEntityVisual;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
public class PSIVisual extends AbstractBlockEntityVisual<PortableStorageInterfaceBlockEntity> implements DynamicVisual, TickableVisual {
public class PSIVisual extends AbstractBlockEntityVisual<PortableStorageInterfaceBlockEntity> implements SimpleDynamicVisual, SimpleTickableVisual {
private final PIInstance instance;

View file

@ -61,4 +61,10 @@ public class RollerActorVisual extends HarvesterActorVisual {
return 16.5;
}
@Override
protected void _delete() {
super._delete();
frame.delete();
}
}

View file

@ -5,7 +5,7 @@ import java.util.function.Consumer;
import org.joml.Quaternionf;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -22,7 +22,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
public class BearingVisual<B extends KineticBlockEntity & IBearingBlockEntity> extends BackHalfShaftVisual<B> implements DynamicVisual {
public class BearingVisual<B extends KineticBlockEntity & IBearingBlockEntity> extends BackHalfShaftVisual<B> implements SimpleDynamicVisual {
final OrientedInstance topInstance;
final Axis rotationAxis;

View file

@ -64,4 +64,15 @@ public class StabilizedBearingVisual extends ActorVisual {
topInstance.setRotation(rotation);
}
@Override
protected void _delete() {
topInstance.delete();
shaft.delete();
}
@Override
public void init(float partialTick) {
}
}

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.chassis;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -17,7 +17,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
public class StickerVisual extends AbstractBlockEntityVisual<StickerBlockEntity> implements DynamicVisual {
public class StickerVisual extends AbstractBlockEntityVisual<StickerBlockEntity> implements SimpleDynamicVisual {
float lastOffset = Float.NaN;
final Direction facing;

View file

@ -1,12 +1,12 @@
package com.simibubi.create.content.contraptions.elevator;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual;
import com.jozufozu.flywheel.api.visual.VisualFrameContext;
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
import com.simibubi.create.content.kinetics.base.ShaftVisual;
// TODO
public class ElevatorPulleyVisual extends ShaftVisual<ElevatorPulleyBlockEntity> implements DynamicVisual {
public class ElevatorPulleyVisual extends ShaftVisual<ElevatorPulleyBlockEntity> implements SimpleDynamicVisual {
public ElevatorPulleyVisual(VisualizationContext context, ElevatorPulleyBlockEntity blockEntity) {
super(context, blockEntity);

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.gantry;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -19,7 +19,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
public class GantryCarriageVisual extends ShaftVisual<GantryCarriageBlockEntity> implements DynamicVisual {
public class GantryCarriageVisual extends ShaftVisual<GantryCarriageBlockEntity> implements SimpleDynamicVisual {
private final TransformedInstance gantryCogs;

View file

@ -4,7 +4,7 @@ import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.instance.Instancer;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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.box.MutableBox;
@ -21,7 +21,7 @@ import com.simibubi.create.foundation.render.SelectInstance;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
public abstract class AbstractPulleyVisual<T extends KineticBlockEntity> extends ShaftVisual<T> implements DynamicVisual {
public abstract class AbstractPulleyVisual<T extends KineticBlockEntity> extends ShaftVisual<T> implements SimpleDynamicVisual {
final OrientedInstance coil;
final SelectInstance<OrientedInstance> magnet;

View file

@ -1,18 +1,21 @@
package com.simibubi.create.content.contraptions.render;
import com.jozufozu.flywheel.api.instance.InstancerProvider;
import com.jozufozu.flywheel.api.visual.Visual;
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
import com.simibubi.create.content.contraptions.behaviour.MovementContext;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.LightLayer;
public abstract class ActorVisual {
public abstract class ActorVisual implements Visual {
protected final VisualizationContext visualizationContext;
protected final InstancerProvider instancerProvider;
protected final BlockAndTintGetter simulationWorld;
protected final MovementContext context;
private boolean deleted;
public ActorVisual(VisualizationContext visualizationContext, BlockAndTintGetter world, MovementContext context) {
this.visualizationContext = visualizationContext;
this.instancerProvider = visualizationContext.instancerProvider();
@ -27,4 +30,25 @@ public abstract class ActorVisual {
protected int localBlockLight() {
return simulationWorld.getBrightness(LightLayer.BLOCK, context.localPos);
}
@Override
public void update(float partialTick) {
}
@Override
public boolean shouldReset() {
return false;
}
protected abstract void _delete();
@Override
public final void delete() {
if (deleted) {
return;
}
_delete();
deleted = true;
}
}

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.render;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.content.contraptions.AbstractContraptionEntity;
import com.simibubi.create.content.contraptions.Contraption;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.culling.Frustum;
@ -39,10 +38,10 @@ public class ContraptionEntityRenderer<C extends AbstractContraptionEntity> exte
int overlay) {
super.render(entity, yaw, partialTicks, ms, buffers, overlay);
Contraption contraption = entity.getContraption();
if (contraption != null) {
ContraptionRenderDispatcher.renderFromEntity(entity, contraption, buffers);
}
// Contraption contraption = entity.getContraption();
// if (contraption != null) {
// ContraptionRenderDispatcher.renderFromEntity(entity, contraption, buffers);
// }
}
}

View file

@ -28,7 +28,6 @@ import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
@OnlyIn(Dist.CLIENT)
@ -59,14 +58,12 @@ public class ContraptionRenderDispatcher {
.tick();
}
@SubscribeEvent
public static void beginFrame(BeginFrameEvent event) {
WORLDS.get(event.getContext()
.level())
.beginFrame(event);
}
@SubscribeEvent
public static void renderLayer(RenderStageEvent event) {
WORLDS.get(event.getLevel())
.renderLayer(event);
@ -74,7 +71,6 @@ public class ContraptionRenderDispatcher {
GlError.pollAndThrow(() -> "contraption layer: " + event.getStage());
}
@SubscribeEvent
public static void onRendererReload(ReloadLevelRendererEvent event) {
reset();
}
@ -177,13 +173,7 @@ public class ContraptionRenderDispatcher {
}
public static void reset() {
WORLDS.empty(ContraptionRenderingWorld::delete);
// if (Backend.isOn()) {
// WORLDS = new WorldAttached<>(FlwContraptionManager::new);
// } else {
WORLDS = new WorldAttached<>(SBBContraptionManager::new);
// }
}
public static boolean canInstance() {

View file

@ -0,0 +1,220 @@
package com.simibubi.create.content.contraptions.render;
import java.util.ArrayList;
import java.util.List;
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;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
import com.jozufozu.flywheel.api.visual.LitVisual;
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.VisualizationContext;
import com.jozufozu.flywheel.api.visualization.VisualizerRegistry;
import com.jozufozu.flywheel.lib.instance.InstanceTypes;
import com.jozufozu.flywheel.lib.instance.TransformedInstance;
import com.jozufozu.flywheel.lib.model.baked.MultiBlockModelBuilder;
import com.jozufozu.flywheel.lib.task.ForEachPlan;
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;
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;
private TransformedInstance structure;
private final PoseStack contraptionMatrix = new PoseStack();
public ContraptionVisual(VisualizationContext ctx, E entity) {
super(ctx, entity);
context = new ContraptionContext();
visualizationContext = ctx.withContext(context, Vec3i.ZERO);
}
@Override
public void init(float partialTick) {
Contraption contraption = entity.getContraption();
virtualRenderWorld = ContraptionRenderDispatcher.setupRenderWorld(level, contraption);
model = new MultiBlockModelBuilder(contraption.getRenderedBlocks())
.modelDataMap(contraption.modelData)
.renderWorld(virtualRenderWorld)
.build();
structure = visualizationContext.instancerProvider()
.instancer(InstanceTypes.TRANSFORMED, model)
.createInstance();
for (BlockEntity be : contraption.maybeInstancedBlockEntities) {
setupVisualizer(be, partialTick);
}
for (var actor : contraption.getActors()) {
setupActor(actor, partialTick);
}
}
private void setupActor(MutablePair<StructureTemplate.StructureBlockInfo, MovementContext> actor, float partialTick) {
MovementContext context = actor.getRight();
if (context == null) {
return;
}
if (context.world == null) {
context.world = level;
}
StructureTemplate.StructureBlockInfo blockInfo = actor.getLeft();
MovementBehaviour movementBehaviour = AllMovementBehaviours.getBehaviour(blockInfo.state());
if (movementBehaviour == null) {
return;
}
var instance = movementBehaviour.createInstance(this.visualizationContext, virtualRenderWorld, context);
if (instance == null) {
return;
}
instance.init(partialTick);
actors.add(instance);
}
@SuppressWarnings("unchecked")
protected <T extends BlockEntity> void setupVisualizer(T be, float partialTicks) {
BlockEntityVisualizer<? super T> visualizer = (BlockEntityVisualizer<? super T>) VisualizerRegistry.getVisualizer(be.getType());
if (visualizer == null) {
return;
}
Level world = be.getLevel();
be.setLevel(virtualRenderWorld);
BlockEntityVisual<? super T> visual = visualizer.createVisual(this.visualizationContext, 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());
}
}
be.setLevel(world);
}
@Override
public Plan<VisualTickContext> planTick() {
return NestedPlan.of(
ForEachPlan.of(() -> actors, ActorVisual::tick),
ForEachPlan.of(() -> simpleTickableVisuals, SimpleTickableVisual::tick),
tickableVisuals
);
}
@Override
public Plan<VisualFrameContext> planFrame() {
return NestedPlan.of(
RunnablePlan.of(this::beginFrame),
ForEachPlan.of(() -> actors, ActorVisual::beginFrame),
ForEachPlan.of(() -> simpleDynamicVisuals, SimpleDynamicVisual::beginFrame),
dynamicVisuals
);
}
@Override
protected void _delete() {
children.forEach(BlockEntityVisual::delete);
actors.forEach(ActorVisual::delete);
if (model != null) {
model.delete();
}
if (structure != null) {
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

@ -11,7 +11,6 @@ import com.simibubi.create.content.contraptions.Contraption;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.util.Mth;
import net.minecraft.world.phys.AABB;
@ -36,7 +35,7 @@ public class FlwContraption extends ContraptionRenderInfo {
var restoreState = GlStateTracker.getRestoreState();
buildLayers();
if (ContraptionRenderDispatcher.canInstance()) {
buildInstancedBlockEntities();
// buildInstancedBlockEntities();
buildActors();
}
restoreState.restore();
@ -133,7 +132,7 @@ public class FlwContraption extends ContraptionRenderInfo {
// }
}
private void buildInstancedBlockEntities() {
// private void buildInstancedBlockEntities() {
// for (BlockEntity be : contraption.maybeInstancedBlockEntities) {
// if (!InstancedRenderRegistry.canInstance(be.getType())) {
// continue;
@ -144,7 +143,7 @@ public class FlwContraption extends ContraptionRenderInfo {
// instanceWorld.blockEntityInstanceManager.add(be);
// be.setLevel(world);
// }
}
// }
private void buildActors() {
// contraption.getActors().forEach(instanceWorld.blockEntityInstanceManager::createActor);

View file

@ -4,7 +4,7 @@ import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.instance.Instancer;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -16,7 +16,7 @@ import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.Direction;
public class ToolBoxVisual extends AbstractBlockEntityVisual<ToolboxBlockEntity> implements DynamicVisual {
public class ToolBoxVisual extends AbstractBlockEntityVisual<ToolboxBlockEntity> implements SimpleDynamicVisual {
private final Direction facing;
private TransformedInstance lid;

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.fluids.pipes.valve;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -18,7 +18,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
public class FluidValveVisual extends ShaftVisual<FluidValveBlockEntity> implements DynamicVisual {
public class FluidValveVisual extends ShaftVisual<FluidValveBlockEntity> implements SimpleDynamicVisual {
protected TransformedInstance pointer;
protected boolean settled;

View file

@ -1,7 +1,7 @@
package com.simibubi.create.content.fluids.pump;
import com.jozufozu.flywheel.api.model.Model;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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.model.Models;
@ -12,7 +12,7 @@ import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
public class PumpCogVisual extends SingleRotatingVisual<PumpBlockEntity> implements DynamicVisual {
public class PumpCogVisual extends SingleRotatingVisual<PumpBlockEntity> implements SimpleDynamicVisual {
public PumpCogVisual(VisualizationContext context, PumpBlockEntity blockEntity) {
super(context, blockEntity);

View file

@ -4,7 +4,7 @@ import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.model.Model;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -15,7 +15,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
public class HandCrankVisual extends SingleRotatingVisual<HandCrankBlockEntity> implements DynamicVisual {
public class HandCrankVisual extends SingleRotatingVisual<HandCrankBlockEntity> implements SimpleDynamicVisual {
private TransformedInstance crank;
private Direction facing;

View file

@ -117,4 +117,16 @@ public class DeployerActorVisual extends ActorVisual {
hand.setTransform(stack);
}
@Override
protected void _delete() {
pole.delete();
hand.delete();
shaft.delete();
}
@Override
public void init(float partialTick) {
}
}

View file

@ -8,8 +8,8 @@ import java.util.function.Consumer;
import org.joml.Quaternionf;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
import com.jozufozu.flywheel.api.visual.TickableVisual;
import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual;
import com.jozufozu.flywheel.lib.visual.SimpleTickableVisual;
import com.jozufozu.flywheel.api.visual.VisualFrameContext;
import com.jozufozu.flywheel.api.visual.VisualTickContext;
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
@ -28,7 +28,7 @@ import net.minecraft.core.Direction;
import net.minecraft.core.Vec3i;
import net.minecraft.util.Mth;
public class DeployerVisual extends ShaftVisual<DeployerBlockEntity> implements DynamicVisual, TickableVisual {
public class DeployerVisual extends ShaftVisual<DeployerBlockEntity> implements SimpleDynamicVisual, SimpleTickableVisual {
final Direction facing;
final float yRot;

View file

@ -59,4 +59,14 @@ public class DrillActorVisual extends ActorVisual {
return context.getAnimationSpeed();
return 0;
}
@Override
protected void _delete() {
drillHead.delete();
}
@Override
public void init(float partialTick) {
}
}

View file

@ -3,7 +3,8 @@ package com.simibubi.create.content.kinetics.flywheel;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -19,7 +20,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.core.Direction;
public class FlywheelVisual extends KineticBlockEntityVisual<FlywheelBlockEntity> implements DynamicVisual {
public class FlywheelVisual extends KineticBlockEntityVisual<FlywheelBlockEntity> implements SimpleDynamicVisual {
protected final RotatingInstance shaft;
protected final TransformedInstance wheel;
@ -30,7 +31,7 @@ public class FlywheelVisual extends KineticBlockEntityVisual<FlywheelBlockEntity
shaft = setup(instancerProvider.instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(shaft()))
.createInstance());
wheel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(blockState))
wheel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.block(blockState))
.createInstance();
animate(blockEntity.angle);

View file

@ -5,7 +5,7 @@ import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.instance.Instancer;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -22,7 +22,7 @@ import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
public abstract class GaugeVisual extends ShaftVisual<GaugeBlockEntity> implements DynamicVisual {
public abstract class GaugeVisual extends ShaftVisual<GaugeBlockEntity> implements SimpleDynamicVisual {
protected final ArrayList<DialFace> faces;

View file

@ -6,7 +6,7 @@ import java.util.function.Consumer;
import com.google.common.collect.Lists;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.model.Model;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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.AbstractInstance;
@ -27,7 +27,7 @@ import net.minecraft.util.Mth;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
public class ArmVisual extends SingleRotatingVisual<ArmBlockEntity> implements DynamicVisual {
public class ArmVisual extends SingleRotatingVisual<ArmBlockEntity> implements SimpleDynamicVisual {
final TransformedInstance base;
final TransformedInstance lowerBody;

View file

@ -4,7 +4,7 @@ import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.model.Model;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -18,7 +18,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.core.Direction;
public class MixerVisual extends EncasedCogVisual implements DynamicVisual {
public class MixerVisual extends EncasedCogVisual implements SimpleDynamicVisual {
private final RotatingInstance mixerHead;
private final OrientedInstance mixerPole;

View file

@ -5,7 +5,7 @@ import java.util.function.Consumer;
import org.joml.Quaternionf;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -17,7 +17,7 @@ import com.simibubi.create.content.kinetics.base.ShaftVisual;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
public class PressVisual extends ShaftVisual<MechanicalPressBlockEntity> implements DynamicVisual {
public class PressVisual extends ShaftVisual<MechanicalPressBlockEntity> implements SimpleDynamicVisual {
private final OrientedInstance pressHead;

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.kinetics.steamEngine;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -18,7 +18,7 @@ import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.util.Mth;
public class SteamEngineVisual extends AbstractBlockEntityVisual<SteamEngineBlockEntity> implements DynamicVisual {
public class SteamEngineVisual extends AbstractBlockEntityVisual<SteamEngineBlockEntity> implements SimpleDynamicVisual {
protected final TransformedInstance piston;
protected final TransformedInstance linkage;

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.depot;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -13,7 +13,7 @@ import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.ShaftVisual;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
public class EjectorVisual extends ShaftVisual<EjectorBlockEntity> implements DynamicVisual {
public class EjectorVisual extends ShaftVisual<EjectorBlockEntity> implements SimpleDynamicVisual {
protected final TransformedInstance plate;

View file

@ -5,7 +5,7 @@ import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.instance.Instancer;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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.AbstractInstance;
@ -20,7 +20,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.core.Direction;
import net.minecraft.world.level.LightLayer;
public class FunnelVisual extends AbstractBlockEntityVisual<FunnelBlockEntity> implements DynamicVisual {
public class FunnelVisual extends AbstractBlockEntityVisual<FunnelBlockEntity> implements SimpleDynamicVisual {
private final ArrayList<FlapInstance> flaps;

View file

@ -8,7 +8,7 @@ import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.instance.Instancer;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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.AbstractInstance;
@ -23,7 +23,7 @@ import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import net.minecraft.core.Direction;
import net.minecraft.world.level.LightLayer;
public class BeltTunnelVisual extends AbstractBlockEntityVisual<BeltTunnelBlockEntity> implements DynamicVisual {
public class BeltTunnelVisual extends AbstractBlockEntityVisual<BeltTunnelBlockEntity> implements SimpleDynamicVisual {
private final Map<Direction, ArrayList<FlapInstance>> tunnelFlaps;

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.redstone.analogLever;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -20,7 +20,7 @@ import com.simibubi.create.foundation.utility.Color;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.properties.AttachFace;
public class AnalogLeverVisual extends AbstractBlockEntityVisual<AnalogLeverBlockEntity> implements DynamicVisual {
public class AnalogLeverVisual extends AbstractBlockEntityVisual<AnalogLeverBlockEntity> implements SimpleDynamicVisual {
protected final TransformedInstance handle;
protected final TransformedInstance indicator;

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.redstone.diodes;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.TickableVisual;
import com.jozufozu.flywheel.lib.visual.SimpleTickableVisual;
import com.jozufozu.flywheel.api.visual.VisualTickContext;
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
import com.jozufozu.flywheel.lib.instance.InstanceTypes;
@ -13,7 +13,7 @@ import com.jozufozu.flywheel.lib.visual.AbstractBlockEntityVisual;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.foundation.utility.Color;
public class BrassDiodeVisual extends AbstractBlockEntityVisual<BrassDiodeBlockEntity> implements TickableVisual {
public class BrassDiodeVisual extends AbstractBlockEntityVisual<BrassDiodeBlockEntity> implements SimpleTickableVisual {
protected final TransformedInstance indicator;

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.schematics.cannon;
import java.util.function.Consumer;
import com.jozufozu.flywheel.api.instance.Instance;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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;
@ -16,7 +16,7 @@ import com.simibubi.create.AllPartialModels;
import net.minecraft.core.Direction;
public class SchematicannonVisual extends AbstractBlockEntityVisual<SchematicannonBlockEntity> implements DynamicVisual {
public class SchematicannonVisual extends AbstractBlockEntityVisual<SchematicannonBlockEntity> implements SimpleDynamicVisual {
private final TransformedInstance connector;
private final TransformedInstance pipe;

View file

@ -2,19 +2,19 @@ package com.simibubi.create.content.trains.entity;
import org.joml.Vector3f;
import com.jozufozu.flywheel.api.visual.DynamicVisual;
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.AbstractEntityVisual;
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;
import com.simibubi.create.content.trains.bogey.BogeyVisual;
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 AbstractEntityVisual<CarriageContraptionEntity> implements DynamicVisual {
public class CarriageContraptionVisual extends ContraptionVisual<CarriageContraptionEntity> implements SimpleDynamicVisual {
private final PoseStack ms = new PoseStack();
@ -47,6 +47,7 @@ public class CarriageContraptionVisual extends AbstractEntityVisual<CarriageCont
@Override
public void beginFrame(VisualFrameContext ctx) {
super.beginFrame(ctx);
if (bogeys == null) {
if (entity.isReadyForRender())
init(ctx.partialTick());

View file

@ -12,7 +12,6 @@ import com.simibubi.create.content.contraptions.minecart.CouplingHandlerClient;
import com.simibubi.create.content.contraptions.minecart.CouplingPhysics;
import com.simibubi.create.content.contraptions.minecart.CouplingRenderer;
import com.simibubi.create.content.contraptions.minecart.capability.CapabilityMinecartController;
import com.simibubi.create.content.contraptions.render.ContraptionRenderDispatcher;
import com.simibubi.create.content.decoration.girder.GirderWrenchBehavior;
import com.simibubi.create.content.equipment.armor.BacktankArmorLayer;
import com.simibubi.create.content.equipment.armor.DivingHelmetItem;
@ -156,7 +155,6 @@ public class ClientEvents {
PlacementHelpers.tick();
CreateClient.OUTLINER.tickOutlines();
CreateClient.GHOST_BLOCKS.tickGhosts();
ContraptionRenderDispatcher.tick(world);
BlueprintOverlayRenderer.tick();
ToolboxHandlerClient.clientTick();
TrackTargetingClient.clientTick();
@ -207,7 +205,7 @@ public class ClientEvents {
public static void onRenderWorld(RenderLevelStageEvent event) {
if (event.getStage() != Stage.AFTER_PARTICLES)
return;
PoseStack ms = event.getPoseStack();
ms.pushPose();
SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance();

View file

@ -0,0 +1,24 @@
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

@ -1,13 +0,0 @@
package com.simibubi.create.foundation.render;
import com.simibubi.create.Create;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class CreateContexts {
private static final ResourceLocation CONTRAPTION = Create.asResource("context/contraption");
}

View file

@ -0,0 +1,10 @@
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,77 +0,0 @@
#use "flywheel:context/fog.glsl"
uniform sampler3D uLightVolume;
uniform sampler2D uBlockAtlas;
uniform sampler2D uLightMap;
uniform vec3 uLightBoxSize;
uniform vec3 uLightBoxMin;
uniform mat4 uModel;
uniform float uTime;
uniform mat4 uViewProjection;
uniform vec3 uCameraPos;
#if defined(VERTEX_SHADER)
out vec3 BoxCoord;
vec4 FLWVertex(inout Vertex v) {
vec4 worldPos = uModel * vec4(v.pos, 1.);
BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize;
FragDistance = max(length(worldPos.xz), abs(worldPos.y)); // cylindrical fog
mat3 m;
m[0] = uModel[0].xyz;
m[1] = uModel[1].xyz;
m[2] = uModel[2].xyz;
v.normal = m * v.normal;
v.pos = worldPos.xyz;
return uViewProjection * worldPos;
}
#elif defined(FRAGMENT_SHADER)
#use "flywheel:core/lightutil.glsl"
// optimize discard usage
#if defined(ALPHA_DISCARD)
#if defined(GL_ARB_conservative_depth)
layout (depth_greater) out float gl_FragDepth;
#endif
#endif
in vec3 BoxCoord;
out vec4 FragColor;
vec4 FLWBlockTexture(vec2 texCoords) {
return texture(uBlockAtlas, texCoords);
}
void FLWFinalizeColor(vec4 color) {
float a = color.a;
float fog = clamp(FLWFogFactor(), 0., 1.);
color = mix(uFogColor, color, fog);
color.a = a;
#if defined(ALPHA_DISCARD)
if (color.a < ALPHA_DISCARD) {
discard;
}
#endif
FragColor = color;
}
vec4 FLWLight(vec2 lightCoords) {
lightCoords = max(lightCoords, texture(uLightVolume, BoxCoord).rg);
return texture(uLightMap, shiftLight(lightCoords));
}
#endif

View file

@ -0,0 +1,16 @@
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;
}