> instanceManagers;
- private int vertexCount;
- private int instanceCount;
public InstancingEngine(ProgramCompiler context) {
this.context = context;
@@ -97,48 +96,62 @@ public class InstancingEngine
implements Engine {
}
@Override
- public void renderAllRemaining(TaskEngine taskEngine, RenderContext context) {
- var camX = context.camX() - originCoordinate.getX();
- var camY = context.camY() - originCoordinate.getY();
- var camZ = context.camZ() - originCoordinate.getZ();
+ public void renderStage(TaskEngine taskEngine, RenderContext context, RenderStage stage) {
+ if (!renderLists.process(stage)) {
+ return;
+ }
+
+ var camPos = context.camera().getPosition();
+ var camX = camPos.x - originCoordinate.getX();
+ var camY = camPos.y - originCoordinate.getY();
+ var camZ = camPos.z - originCoordinate.getZ();
// don't want to mutate viewProjection
var vp = context.viewProjection().copy();
vp.multiplyWithTranslation((float) -camX, (float) -camY, (float) -camZ);
- for (RenderType renderType : renderLists.drainLayers()) {
- render(renderType, camX, camY, camZ, vp, context.level());
+ var renderList = renderLists.get(stage);
+ for (var entry : renderList.entrySet()) {
+ var multimap = entry.getValue();
+
+ if (multimap.isEmpty()) {
+ return;
+ }
+
+ render(entry.getKey(), multimap, camX, camY, camZ, vp, context.level());
}
}
- @Override
- public void renderSpecificType(TaskEngine taskEngine, RenderContext context, RenderType type) {
- if (!renderLists.process(type)) {
+ // TODO: Is this useful? Should it be added to the base interface? Currently it is only used for the old CrumblingRenderer.
+ @Deprecated
+ public void renderAll(TaskEngine taskEngine, RenderContext context) {
+ if (renderLists.isEmpty()) {
return;
}
- var camX = context.camX() - originCoordinate.getX();
- var camY = context.camY() - originCoordinate.getY();
- var camZ = context.camZ() - originCoordinate.getZ();
+ var camPos = context.camera().getPosition();
+ var camX = camPos.x - originCoordinate.getX();
+ var camY = camPos.y - originCoordinate.getY();
+ var camZ = camPos.z - originCoordinate.getZ();
// don't want to mutate viewProjection
var vp = context.viewProjection().copy();
vp.multiplyWithTranslation((float) -camX, (float) -camY, (float) -camZ);
- render(type, camX, camY, camZ, vp, context.level());
- }
-
- protected void render(RenderType type, double camX, double camY, double camZ, Matrix4f viewProjection, ClientLevel level) {
- vertexCount = 0;
- instanceCount = 0;
-
- var multimap = renderLists.get(type);
-
- if (multimap.isEmpty()) {
- return;
+ for (RenderStage stage : renderLists.stagesToProcess) {
+ var renderList = renderLists.get(stage);
+ for (var entry : renderList.entrySet()) {
+ var multimap = entry.getValue();
+
+ if (multimap.isEmpty()) {
+ return;
+ }
+
+ render(entry.getKey(), multimap, camX, camY, camZ, vp, context.level());
+ }
}
- render(type, multimap, camX, camY, camZ, viewProjection, level);
+ renderLists.stagesToProcess.clear();
}
protected void render(RenderType type, ListMultimap multimap, double camX, double camY, double camZ, Matrix4f viewProjection, ClientLevel level) {
@@ -176,7 +189,7 @@ public class InstancingEngine implements Engine {
Material material = desc.material();
P program = context.getProgram(new ProgramCompiler.Context(vertexType, instanceShader,
- material.vertexShader(), material.fragmentShader(), coreShaderInfo.getAdjustedAlphaDiscard(),
+ material.getVertexShader(), material.getFragmentShader(), coreShaderInfo.getAdjustedAlphaDiscard(),
coreShaderInfo.fogType(), ctx));
program.bind();
@@ -223,7 +236,7 @@ public class InstancingEngine
implements Engine {
}
@Override
- public void beginFrame(TaskEngine taskEngine, Camera info) {
+ public void beginFrame(TaskEngine taskEngine, RenderContext context) {
for (var model : uninitializedModels) {
model.init(renderLists);
}
@@ -246,8 +259,6 @@ public class InstancingEngine
implements Engine {
@Override
public void addDebugInfo(List info) {
info.add("GL33 Instanced Arrays");
- info.add("Instances: " + instanceCount);
- info.add("Vertices: " + vertexCount);
info.add("Origin: " + originCoordinate.getX() + ", " + originCoordinate.getY() + ", " + originCoordinate.getZ());
}
@@ -299,13 +310,13 @@ public class InstancingEngine implements Engine {
continue;
}
- material.renderType().setupRenderState();
+ material.getRenderType().setupRenderState();
CoreShaderInfo coreShaderInfo = CoreShaderInfo.get();
CrumblingProgram program = Contexts.CRUMBLING.getProgram(new ProgramCompiler.Context(Formats.POS_TEX_NORMAL,
- structType.getInstanceShader(), material.vertexShader(), material.fragmentShader(),
+ structType.getInstanceShader(), material.getVertexShader(), material.getFragmentShader(),
coreShaderInfo.getAdjustedAlphaDiscard(), coreShaderInfo.fogType(),
GameStateRegistry.takeSnapshot()));
@@ -332,7 +343,7 @@ public class InstancingEngine
implements Engine {
for (var blockEntityInstance : entry.getValue()) {
for (var part : blockEntityInstance.getCrumblingParts()) {
- if (part.getOwner() instanceof GPUInstancer instancer) {
+ if (part.getOwner() instanceof GPUInstancer> instancer) {
// queue the instances for copying to the crumbling instance buffer
map.computeIfAbsent(instancer.parent.getModel(), k -> new ArrayList<>()).add(part);
diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/RenderLists.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/RenderLists.java
index b5aa12258..34ecab81a 100644
--- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/RenderLists.java
+++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/RenderLists.java
@@ -1,49 +1,57 @@
package com.jozufozu.flywheel.backend.instancing.instancing;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.EnumSet;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
+import com.jozufozu.flywheel.api.RenderStage;
+import com.jozufozu.flywheel.api.material.Material;
import net.minecraft.client.renderer.RenderType;
public class RenderLists {
- private final Map> renderLists = new HashMap<>();
- public final Set layersToProcess = new HashSet<>();
+ private final Map>> renderLists = new EnumMap<>(RenderStage.class);
+ public final Set stagesToProcess = EnumSet.noneOf(RenderStage.class);
- public ListMultimap get(RenderType type) {
- return renderLists.computeIfAbsent(type, k -> ArrayListMultimap.create());
+ public Map> get(RenderStage stage) {
+ var renderList = renderLists.get(stage);
+ if (renderList == null) {
+ return Collections.emptyMap();
+ }
+ return renderList;
}
public void add(ShaderState shaderState, DrawCall layer) {
- RenderType renderType = shaderState.material()
- .renderType();
+ Material material = shaderState.material();
- get(renderType).put(shaderState, layer);
+ renderLists
+ .computeIfAbsent(material.getRenderStage(), k -> new HashMap<>())
+ .computeIfAbsent(material.getRenderType(), k -> ArrayListMultimap.create())
+ .put(shaderState, layer);
}
public void prepare() {
- layersToProcess.clear();
+ stagesToProcess.clear();
- layersToProcess.addAll(renderLists.keySet());
- }
-
- public Iterable extends RenderType> drainLayers() {
- var out = new HashSet<>(layersToProcess);
- layersToProcess.clear();
- return out;
+ stagesToProcess.addAll(renderLists.keySet());
}
/**
- * Check and mark a layer as processed.
- * @param type The layer to check.
- * @return {@code true} if the layer should be processed.
+ * Check and mark a stage as processed.
+ * @param stage The stage to check.
+ * @return {@code true} if the stage should be processed.
*/
- public boolean process(RenderType type) {
- return layersToProcess.remove(type);
+ public boolean process(RenderStage stage) {
+ return stagesToProcess.remove(stage);
+ }
+
+ public boolean isEmpty() {
+ return stagesToProcess.isEmpty();
}
}
diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/BufferWriter.java b/src/main/java/com/jozufozu/flywheel/backend/struct/BufferWriter.java
index 943559acc..49ce4969d 100644
--- a/src/main/java/com/jozufozu/flywheel/backend/struct/BufferWriter.java
+++ b/src/main/java/com/jozufozu/flywheel/backend/struct/BufferWriter.java
@@ -2,7 +2,7 @@ package com.jozufozu.flywheel.backend.struct;
import java.nio.ByteBuffer;
-import com.jozufozu.flywheel.api.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
import com.jozufozu.flywheel.api.struct.StructType;
import com.jozufozu.flywheel.api.struct.StructWriter;
diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/UnsafeBufferWriter.java b/src/main/java/com/jozufozu/flywheel/backend/struct/UnsafeBufferWriter.java
index 96e675bbd..7aa852de1 100644
--- a/src/main/java/com/jozufozu/flywheel/backend/struct/UnsafeBufferWriter.java
+++ b/src/main/java/com/jozufozu/flywheel/backend/struct/UnsafeBufferWriter.java
@@ -4,7 +4,7 @@ import java.nio.ByteBuffer;
import org.lwjgl.system.MemoryUtil;
-import com.jozufozu.flywheel.api.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
import com.jozufozu.flywheel.api.struct.StructType;
/**
diff --git a/src/main/java/com/jozufozu/flywheel/core/BasicModelSupplier.java b/src/main/java/com/jozufozu/flywheel/core/BasicModelSupplier.java
index e64837738..f4c456691 100644
--- a/src/main/java/com/jozufozu/flywheel/core/BasicModelSupplier.java
+++ b/src/main/java/com/jozufozu/flywheel/core/BasicModelSupplier.java
@@ -6,23 +6,14 @@ import org.jetbrains.annotations.NotNull;
import com.google.common.collect.ImmutableMap;
import com.jozufozu.flywheel.api.material.Material;
-import com.jozufozu.flywheel.core.material.MaterialShaders;
import com.jozufozu.flywheel.core.model.Mesh;
import com.jozufozu.flywheel.core.model.ModelSupplier;
import com.jozufozu.flywheel.util.Lazy;
import com.jozufozu.flywheel.util.NonNullSupplier;
-import net.minecraft.client.renderer.RenderType;
-
public class BasicModelSupplier implements ModelSupplier {
- private static final Material DEFAULT_MATERIAL = new Material(RenderType.solid(), MaterialShaders.DEFAULT_VERTEX, MaterialShaders.DEFAULT_FRAGMENT);
-
- private Material material;
private final Lazy supplier;
-
- public BasicModelSupplier(NonNullSupplier supplier) {
- this(supplier, DEFAULT_MATERIAL);
- }
+ private Material material;
public BasicModelSupplier(NonNullSupplier supplier, Material material) {
this.supplier = Lazy.of(supplier);
diff --git a/src/main/java/com/jozufozu/flywheel/core/CoreShaderInfoMap.java b/src/main/java/com/jozufozu/flywheel/core/CoreShaderInfoMap.java
index 9e6e16ffb..33dfb683f 100644
--- a/src/main/java/com/jozufozu/flywheel/core/CoreShaderInfoMap.java
+++ b/src/main/java/com/jozufozu/flywheel/core/CoreShaderInfoMap.java
@@ -10,6 +10,7 @@ import java.util.Map;
import org.jetbrains.annotations.Nullable;
import com.jozufozu.flywheel.backend.ShadersModHandler;
+import com.jozufozu.flywheel.core.CoreShaderInfoMap.CoreShaderInfo.FogType;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.renderer.ShaderInstance;
diff --git a/src/main/java/com/jozufozu/flywheel/core/LastActiveCamera.java b/src/main/java/com/jozufozu/flywheel/core/LastActiveCamera.java
deleted file mode 100644
index 60e36f463..000000000
--- a/src/main/java/com/jozufozu/flywheel/core/LastActiveCamera.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.jozufozu.flywheel.core;
-
-import net.minecraft.client.Camera;
-
-/**
- * A class tracking which object last had {@link Camera#setup} called on it.
- *
- * @see com.jozufozu.flywheel.mixin.CameraMixin
- */
-public class LastActiveCamera {
-
- private static Camera camera;
-
- public static void _setActiveCamera(Camera camera) {
- LastActiveCamera.camera = camera;
- }
-
- public static Camera getActiveCamera() {
- return camera;
- }
-}
diff --git a/src/main/java/com/jozufozu/flywheel/core/Models.java b/src/main/java/com/jozufozu/flywheel/core/Models.java
index 063453a7e..cebc63d0a 100644
--- a/src/main/java/com/jozufozu/flywheel/core/Models.java
+++ b/src/main/java/com/jozufozu/flywheel/core/Models.java
@@ -4,23 +4,30 @@ import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;
+import com.jozufozu.flywheel.api.RenderStage;
+import com.jozufozu.flywheel.api.material.Material;
+import com.jozufozu.flywheel.core.material.MaterialShaders;
+import com.jozufozu.flywheel.core.material.SimpleMaterial;
import com.jozufozu.flywheel.core.model.BlockMesh;
import com.jozufozu.flywheel.core.model.ModelUtil;
import com.jozufozu.flywheel.event.ReloadRenderersEvent;
import com.jozufozu.flywheel.util.Pair;
import com.mojang.blaze3d.vertex.PoseStack;
+import net.minecraft.client.renderer.RenderType;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.BlockState;
public class Models {
+ public static final Material DEFAULT_MATERIAL = new SimpleMaterial(RenderStage.AFTER_SOLID_TERRAIN, RenderType.cutout(), MaterialShaders.SHADED_VERTEX, MaterialShaders.DEFAULT_FRAGMENT);
+
public static BasicModelSupplier block(BlockState state) {
- return BLOCK_STATE.computeIfAbsent(state, it -> new BasicModelSupplier(() -> new BlockMesh(it)));
+ return BLOCK_STATE.computeIfAbsent(state, it -> new BasicModelSupplier(() -> new BlockMesh(it), DEFAULT_MATERIAL));
}
public static BasicModelSupplier partial(PartialModel partial) {
- return PARTIAL.computeIfAbsent(partial, it -> new BasicModelSupplier(() -> new BlockMesh(it)));
+ return PARTIAL.computeIfAbsent(partial, it -> new BasicModelSupplier(() -> new BlockMesh(it), DEFAULT_MATERIAL));
}
public static BasicModelSupplier partial(PartialModel partial, Direction dir) {
@@ -28,7 +35,7 @@ public class Models {
}
public static BasicModelSupplier partial(PartialModel partial, Direction dir, Supplier modelTransform) {
- return PARTIAL_DIR.computeIfAbsent(Pair.of(dir, partial), $ -> new BasicModelSupplier(() -> new BlockMesh(partial, modelTransform.get())));
+ return PARTIAL_DIR.computeIfAbsent(Pair.of(dir, partial), $ -> new BasicModelSupplier(() -> new BlockMesh(partial, modelTransform.get()), DEFAULT_MATERIAL));
}
public static void onReload(ReloadRenderersEvent ignored) {
diff --git a/src/main/java/com/jozufozu/flywheel/core/QuadConverter.java b/src/main/java/com/jozufozu/flywheel/core/QuadConverter.java
index d55568b13..901e324f7 100644
--- a/src/main/java/com/jozufozu/flywheel/core/QuadConverter.java
+++ b/src/main/java/com/jozufozu/flywheel/core/QuadConverter.java
@@ -1,8 +1,6 @@
package com.jozufozu.flywheel.core;
-import java.nio.Buffer;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
diff --git a/src/main/java/com/jozufozu/flywheel/core/RenderContext.java b/src/main/java/com/jozufozu/flywheel/core/RenderContext.java
index d49f724f1..6fd3effbb 100644
--- a/src/main/java/com/jozufozu/flywheel/core/RenderContext.java
+++ b/src/main/java/com/jozufozu/flywheel/core/RenderContext.java
@@ -1,18 +1,20 @@
package com.jozufozu.flywheel.core;
+import org.jetbrains.annotations.NotNull;
+
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Matrix3f;
import com.mojang.math.Matrix4f;
import com.mojang.math.Quaternion;
+import net.minecraft.client.Camera;
import net.minecraft.client.multiplayer.ClientLevel;
+import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.RenderBuffers;
-public record RenderContext(ClientLevel level, PoseStack stack, Matrix4f viewProjection, RenderBuffers buffers,
- double camX, double camY, double camZ) implements TransformStack {
-
- public static RenderContext CURRENT;
+public record RenderContext(LevelRenderer renderer, ClientLevel level, PoseStack stack, Matrix4f viewProjection,
+ Matrix4f projection, RenderBuffers buffers, Camera camera) implements TransformStack {
@Override
public TransformStack multiply(Quaternion quaternion) {
@@ -50,4 +52,11 @@ public record RenderContext(ClientLevel level, PoseStack stack, Matrix4f viewPro
public TransformStack translate(double x, double y, double z) {
return TransformStack.cast(stack).translate(x, y, z);
}
+
+ @NotNull
+ public static Matrix4f createViewProjection(PoseStack view, Matrix4f projection) {
+ var viewProjection = projection.copy();
+ viewProjection.multiply(view.last().pose());
+ return viewProjection;
+ }
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/VertexCompiler.java b/src/main/java/com/jozufozu/flywheel/core/compile/VertexCompiler.java
index 1c6c2c7d5..c54cafe62 100644
--- a/src/main/java/com/jozufozu/flywheel/core/compile/VertexCompiler.java
+++ b/src/main/java/com/jozufozu/flywheel/core/compile/VertexCompiler.java
@@ -12,8 +12,6 @@ import com.jozufozu.flywheel.core.source.FileIndex;
import com.jozufozu.flywheel.core.source.FileResolution;
import com.jozufozu.flywheel.core.source.ShaderField;
import com.jozufozu.flywheel.core.source.SourceFile;
-import com.jozufozu.flywheel.core.source.parse.ShaderStruct;
-import com.jozufozu.flywheel.core.source.parse.StructField;
import com.jozufozu.flywheel.core.source.span.Span;
import com.jozufozu.flywheel.util.Pair;
diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java
index df67c6c48..c58b5984d 100644
--- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java
+++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java
@@ -1,7 +1,7 @@
package com.jozufozu.flywheel.core.crumbling;
-import com.jozufozu.flywheel.api.InstancerManager;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
+import com.jozufozu.flywheel.api.instancer.InstancerManager;
import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstanceManager;
public class CrumblingInstanceManager extends BlockEntityInstanceManager {
diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java
index 2624cf2f1..ce7867afc 100644
--- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java
+++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java
@@ -4,24 +4,25 @@ import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
+import com.google.common.collect.ListMultimap;
import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
import com.jozufozu.flywheel.backend.instancing.InstanceManager;
import com.jozufozu.flywheel.backend.instancing.SerialTaskEngine;
+import com.jozufozu.flywheel.backend.instancing.instancing.DrawCall;
import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine;
+import com.jozufozu.flywheel.backend.instancing.instancing.ShaderState;
import com.jozufozu.flywheel.core.Contexts;
import com.jozufozu.flywheel.core.RenderContext;
import com.jozufozu.flywheel.event.ReloadRenderersEvent;
import com.jozufozu.flywheel.mixin.LevelRendererAccessor;
import com.jozufozu.flywheel.util.Lazy;
-import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Matrix4f;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
-import net.minecraft.client.Camera;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.RenderType;
@@ -29,7 +30,6 @@ import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.BlockDestructionProgress;
import net.minecraft.world.level.block.entity.BlockEntity;
-import net.minecraft.world.phys.Vec3;
// TODO: merge directly into InstancingEngine for efficiency
/**
@@ -43,45 +43,34 @@ public class CrumblingRenderer {
_init();
}
- public static void renderCrumbling(LevelRenderer levelRenderer, ClientLevel level, PoseStack poseStack, Camera camera, Matrix4f projectionMatrix) {
+ public static void renderCrumbling(RenderContext context) {
// TODO: one pass base/crumbling
if (true) return;
- Int2ObjectMap> activeStages = getActiveStageBlockEntities(levelRenderer, level);
+ Int2ObjectMap> activeStages = getActiveStageBlockEntities(context.renderer(), context.level());
if (activeStages.isEmpty()) return;
try (var restoreState = GlStateTracker.getRestoreState()) {
-
- Matrix4f viewProjection = poseStack.last()
- .pose()
- .copy();
- viewProjection.multiplyBackward(projectionMatrix);
-
State state = STATE.get();
var instanceManager = state.instanceManager;
var engine = state.instancerManager;
- renderCrumblingInner(activeStages, instanceManager, engine, level, poseStack, camera, viewProjection);
+ renderCrumblingInner(activeStages, instanceManager, engine, context);
}
}
- private static void renderCrumblingInner(Int2ObjectMap> activeStages, InstanceManager instanceManager, CrumblingEngine engine, ClientLevel level, PoseStack stack, Camera camera, Matrix4f viewProjection) {
- Vec3 cameraPos = camera.getPosition();
- RenderContext ctx = new RenderContext(level, stack, viewProjection, null, cameraPos.x, cameraPos.y, cameraPos.z);
-
+ private static void renderCrumblingInner(Int2ObjectMap> activeStages, InstanceManager instanceManager, CrumblingEngine engine, RenderContext ctx) {
for (Int2ObjectMap.Entry> stage : activeStages.int2ObjectEntrySet()) {
RenderType currentLayer = ModelBakery.DESTROY_TYPES.get(stage.getIntKey());
// something about when we call this means that the textures are not ready for use on the first frame they should appear
if (currentLayer != null) {
- engine.currentLayer = currentLayer;
-
stage.getValue().forEach(instanceManager::add);
- instanceManager.beginFrame(SerialTaskEngine.INSTANCE, camera);
- engine.beginFrame(SerialTaskEngine.INSTANCE, camera);
+ instanceManager.beginFrame(SerialTaskEngine.INSTANCE, ctx);
+ engine.beginFrame(SerialTaskEngine.INSTANCE, ctx);
- engine.renderAllRemaining(SerialTaskEngine.INSTANCE, ctx);
+ engine.renderAll(SerialTaskEngine.INSTANCE, ctx);
instanceManager.invalidate();
}
@@ -154,25 +143,17 @@ public class CrumblingRenderer {
}
private static class CrumblingEngine extends InstancingEngine {
- private RenderType currentLayer;
-
public CrumblingEngine() {
super(Contexts.CRUMBLING);
}
@Override
- protected void render(RenderType type, double camX, double camY, double camZ, Matrix4f viewProjection, ClientLevel level) {
+ protected void render(RenderType type, ListMultimap multimap, double camX, double camY, double camZ, Matrix4f viewProjection, ClientLevel level) {
if (!type.affectsCrumbling()) {
return;
}
- var multimap = renderLists.get(type);
-
- if (multimap.isEmpty()) {
- return;
- }
-
- render(currentLayer, multimap, camX, camY, camZ, viewProjection, level);
+ super.render(type, multimap, camX, camY, camZ, viewProjection, level);
}
}
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java b/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java
index a723692a8..a60aa14cb 100644
--- a/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java
+++ b/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java
@@ -9,7 +9,6 @@ import com.jozufozu.flywheel.core.model.Mesh;
import com.jozufozu.flywheel.core.vertex.Formats;
import com.jozufozu.flywheel.core.vertex.PosTexNormalVertex;
import com.jozufozu.flywheel.core.vertex.PosTexNormalWriterUnsafe;
-import com.mojang.blaze3d.platform.MemoryTracker;
public class ModelPart implements Mesh {
diff --git a/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java b/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java
index db420b2e9..d915d63b8 100644
--- a/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java
@@ -5,8 +5,8 @@ import java.util.function.Consumer;
import org.jetbrains.annotations.Nullable;
-import com.jozufozu.flywheel.api.InstancedPart;
-import com.jozufozu.flywheel.api.Instancer;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.Instancer;
public class ConditionalInstance {
diff --git a/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java b/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java
index 8ccdc143d..a48c5c3a9 100644
--- a/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java
@@ -5,8 +5,8 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
-import com.jozufozu.flywheel.api.InstancedPart;
-import com.jozufozu.flywheel.api.Instancer;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.Instancer;
public class GroupInstance extends AbstractCollection {
diff --git a/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java b/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java
index 81c6de015..d8fdf5cf4 100644
--- a/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java
@@ -6,8 +6,8 @@ import java.util.Optional;
import org.jetbrains.annotations.Nullable;
-import com.jozufozu.flywheel.api.InstancedPart;
-import com.jozufozu.flywheel.api.Instancer;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.Instancer;
public class SelectInstance {
diff --git a/src/main/java/com/jozufozu/flywheel/core/material/SimpleMaterial.java b/src/main/java/com/jozufozu/flywheel/core/material/SimpleMaterial.java
new file mode 100644
index 000000000..c3880e5bd
--- /dev/null
+++ b/src/main/java/com/jozufozu/flywheel/core/material/SimpleMaterial.java
@@ -0,0 +1,41 @@
+package com.jozufozu.flywheel.core.material;
+
+import com.jozufozu.flywheel.api.RenderStage;
+import com.jozufozu.flywheel.api.material.Material;
+import com.jozufozu.flywheel.core.source.FileResolution;
+
+import net.minecraft.client.renderer.RenderType;
+
+public class SimpleMaterial implements Material {
+ protected final RenderStage stage;
+ protected final RenderType type;
+ protected final FileResolution vertexShader;
+ protected final FileResolution fragmentShader;
+
+ public SimpleMaterial(RenderStage stage, RenderType type, FileResolution vertexShader, FileResolution fragmentShader) {
+ this.stage = stage;
+ this.type = type;
+ this.vertexShader = vertexShader;
+ this.fragmentShader = fragmentShader;
+ }
+
+ @Override
+ public RenderStage getRenderStage() {
+ return stage;
+ }
+
+ @Override
+ public RenderType getRenderType() {
+ return type;
+ }
+
+ @Override
+ public FileResolution getVertexShader() {
+ return vertexShader;
+ }
+
+ @Override
+ public FileResolution getFragmentShader() {
+ return fragmentShader;
+ }
+}
diff --git a/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java b/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java
index 8c5e4342b..97013adb8 100644
--- a/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java
+++ b/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java
@@ -1,7 +1,6 @@
package com.jozufozu.flywheel.core.model;
import java.lang.reflect.Field;
-import java.nio.ByteBuffer;
import java.util.EnumMap;
import java.util.Random;
@@ -11,7 +10,6 @@ import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexFormat;
-import com.mojang.datafixers.util.Pair;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderType;
diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/ColoredLitPart.java b/src/main/java/com/jozufozu/flywheel/core/structs/ColoredLitPart.java
index db8936937..ca75d2f40 100644
--- a/src/main/java/com/jozufozu/flywheel/core/structs/ColoredLitPart.java
+++ b/src/main/java/com/jozufozu/flywheel/core/structs/ColoredLitPart.java
@@ -1,6 +1,6 @@
package com.jozufozu.flywheel.core.structs;
-import com.jozufozu.flywheel.api.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
import com.jozufozu.flywheel.api.struct.StructType;
import com.jozufozu.flywheel.util.Color;
diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/FlatLit.java b/src/main/java/com/jozufozu/flywheel/core/structs/FlatLit.java
index 01fd710a7..b0f753503 100644
--- a/src/main/java/com/jozufozu/flywheel/core/structs/FlatLit.java
+++ b/src/main/java/com/jozufozu/flywheel/core/structs/FlatLit.java
@@ -1,6 +1,6 @@
package com.jozufozu.flywheel.core.structs;
-import com.jozufozu.flywheel.api.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.BlockAndTintGetter;
diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java
index f595d4c1b..586679472 100644
--- a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java
@@ -1,7 +1,6 @@
package com.jozufozu.flywheel.core.vertex;
import com.jozufozu.flywheel.api.vertex.ShadedVertexList;
-import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.api.vertex.VertexType;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferBuilder;
import com.jozufozu.flywheel.util.RenderMath;
diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexListUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexListUnsafe.java
index 7b1065899..a5073832c 100644
--- a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexListUnsafe.java
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexListUnsafe.java
@@ -1,6 +1,5 @@
package com.jozufozu.flywheel.core.vertex;
-import java.lang.ref.Cleaner;
import java.nio.ByteBuffer;
import org.lwjgl.system.MemoryUtil;
diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexListUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexListUnsafe.java
index dbae103b0..95189b2fb 100644
--- a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexListUnsafe.java
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexListUnsafe.java
@@ -4,9 +4,7 @@ import java.nio.ByteBuffer;
import org.lwjgl.system.MemoryUtil;
-import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.api.vertex.VertexType;
-import com.jozufozu.flywheel.backend.FlywheelMemory;
import com.jozufozu.flywheel.util.RenderMath;
public class PosTexNormalVertexListUnsafe extends AbstractVertexList {
diff --git a/src/main/java/com/jozufozu/flywheel/event/BeginFrameEvent.java b/src/main/java/com/jozufozu/flywheel/event/BeginFrameEvent.java
index db4d6fd1f..4ef40af54 100644
--- a/src/main/java/com/jozufozu/flywheel/event/BeginFrameEvent.java
+++ b/src/main/java/com/jozufozu/flywheel/event/BeginFrameEvent.java
@@ -1,35 +1,17 @@
package com.jozufozu.flywheel.event;
-import net.minecraft.client.Camera;
-import net.minecraft.client.multiplayer.ClientLevel;
-import net.minecraft.client.renderer.culling.Frustum;
-import net.minecraft.world.phys.Vec3;
+import com.jozufozu.flywheel.core.RenderContext;
+
import net.minecraftforge.eventbus.api.Event;
public class BeginFrameEvent extends Event {
- private final ClientLevel world;
- private final Camera camera;
- private final Frustum frustum;
+ private final RenderContext context;
- public BeginFrameEvent(ClientLevel world, Camera camera, Frustum frustum) {
- this.world = world;
- this.camera = camera;
- this.frustum = frustum;
+ public BeginFrameEvent(RenderContext context) {
+ this.context = context;
}
- public ClientLevel getWorld() {
- return world;
- }
-
- public Camera getCamera() {
- return camera;
- }
-
- public Frustum getFrustum() {
- return frustum;
- }
-
- public Vec3 getCameraPos() {
- return camera.getPosition();
+ public RenderContext getContext() {
+ return context;
}
}
diff --git a/src/main/java/com/jozufozu/flywheel/event/EntityWorldHandler.java b/src/main/java/com/jozufozu/flywheel/event/EntityWorldHandler.java
index 6746fd963..a6848009c 100644
--- a/src/main/java/com/jozufozu/flywheel/event/EntityWorldHandler.java
+++ b/src/main/java/com/jozufozu/flywheel/event/EntityWorldHandler.java
@@ -3,11 +3,8 @@ package com.jozufozu.flywheel.event;
import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
-import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.event.entity.EntityLeaveWorldEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-import net.minecraftforge.fml.common.Mod;
public class EntityWorldHandler {
diff --git a/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java b/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java
index e398b8698..1310235f7 100644
--- a/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java
+++ b/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java
@@ -10,25 +10,21 @@ import com.jozufozu.flywheel.light.LightUpdater;
import com.jozufozu.flywheel.util.WorldAttached;
import net.minecraft.client.Minecraft;
-import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.world.WorldEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-import net.minecraftforge.fml.common.Mod;
public class ForgeEvents {
public static void addToDebugScreen(RenderGameOverlayEvent.Text event) {
-
if (Minecraft.getInstance().options.renderDebug) {
-
ArrayList debug = event.getRight();
debug.add("");
debug.add("Flywheel: " + Flywheel.getVersion());
InstancedRenderDispatcher.getDebugString(debug);
+ // TODO: compress into one line
debug.add("Memory used:");
debug.add("GPU: " + FlywheelMemory.getGPUMemory());
debug.add("CPU: " + FlywheelMemory.getCPUMemory());
@@ -39,8 +35,8 @@ public class ForgeEvents {
WorldAttached.invalidateWorld(event.getWorld());
}
- public static void tickLight(TickEvent.ClientTickEvent e) {
- if (e.phase == TickEvent.Phase.END && Backend.isGameActive()) {
+ public static void tickLight(TickEvent.ClientTickEvent event) {
+ if (event.phase == TickEvent.Phase.END && Backend.isGameActive()) {
LightUpdater.get(Minecraft.getInstance().level)
.tick();
}
diff --git a/src/main/java/com/jozufozu/flywheel/event/RenderLayerEvent.java b/src/main/java/com/jozufozu/flywheel/event/RenderLayerEvent.java
deleted file mode 100644
index 83d45bab6..000000000
--- a/src/main/java/com/jozufozu/flywheel/event/RenderLayerEvent.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.jozufozu.flywheel.event;
-
-import org.jetbrains.annotations.NotNull;
-
-import com.jozufozu.flywheel.core.RenderContext;
-import com.mojang.blaze3d.systems.RenderSystem;
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.math.Matrix4f;
-
-import net.minecraft.client.multiplayer.ClientLevel;
-import net.minecraft.client.renderer.RenderBuffers;
-import net.minecraft.client.renderer.RenderType;
-import net.minecraftforge.eventbus.api.Event;
-
-public class RenderLayerEvent extends Event {
- public final RenderContext context;
- public final RenderType type;
-
- public RenderLayerEvent(RenderContext context, RenderType type) {
- this.context = context;
- this.type = type;
- }
-
- @NotNull
- public static Matrix4f createViewProjection(PoseStack view) {
- var viewProjection = view.last()
- .pose()
- .copy();
- viewProjection.multiplyBackward(RenderSystem.getProjectionMatrix());
- return viewProjection;
- }
-
- @Override
- public String toString() {
- return "RenderLayerEvent{" + context + "}";
- }
-
- public ClientLevel getWorld() {
- return context.level();
- }
-
- public RenderType getType() {
- return type;
- }
-
- public PoseStack getStack() {
- return context.stack();
- }
-
- public Matrix4f getViewProjection() {
- return context.viewProjection();
- }
-
- public RenderBuffers getBuffers() {
- return context.buffers();
- }
-
- public double getCamX() {
- return context.camX();
- }
-
- public double getCamY() {
- return context.camY();
- }
-
- public double getCamZ() {
- return context.camZ();
- }
-}
diff --git a/src/main/java/com/jozufozu/flywheel/event/RenderStageEvent.java b/src/main/java/com/jozufozu/flywheel/event/RenderStageEvent.java
new file mode 100644
index 000000000..17bbb2d0f
--- /dev/null
+++ b/src/main/java/com/jozufozu/flywheel/event/RenderStageEvent.java
@@ -0,0 +1,54 @@
+package com.jozufozu.flywheel.event;
+
+import com.jozufozu.flywheel.api.RenderStage;
+import com.jozufozu.flywheel.core.RenderContext;
+import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.math.Matrix4f;
+
+import net.minecraft.client.Camera;
+import net.minecraft.client.multiplayer.ClientLevel;
+import net.minecraft.client.renderer.RenderBuffers;
+import net.minecraftforge.eventbus.api.Event;
+
+public class RenderStageEvent extends Event {
+ private final RenderContext context;
+ private final RenderStage stage;
+
+ public RenderStageEvent(RenderContext context, RenderStage stage) {
+ this.context = context;
+ this.stage = stage;
+ }
+
+ public RenderContext getContext() {
+ return context;
+ }
+
+ public RenderStage getStage() {
+ return stage;
+ }
+
+ public ClientLevel getLevel() {
+ return context.level();
+ }
+
+ public PoseStack getStack() {
+ return context.stack();
+ }
+
+ public Matrix4f getViewProjection() {
+ return context.viewProjection();
+ }
+
+ public RenderBuffers getBuffers() {
+ return context.buffers();
+ }
+
+ public Camera getCamera() {
+ return context.camera();
+ }
+
+ @Override
+ public String toString() {
+ return "RenderStageEvent{" + context + "}";
+ }
+}
diff --git a/src/main/java/com/jozufozu/flywheel/mixin/CameraMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/CameraMixin.java
deleted file mode 100644
index 52e6043ef..000000000
--- a/src/main/java/com/jozufozu/flywheel/mixin/CameraMixin.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.jozufozu.flywheel.mixin;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import com.jozufozu.flywheel.core.LastActiveCamera;
-
-import net.minecraft.client.Camera;
-import net.minecraft.world.entity.Entity;
-import net.minecraft.world.level.BlockGetter;
-
-@Mixin(Camera.class)
-public class CameraMixin {
-
- @Inject(method = "setup", at = @At("TAIL"))
- private void setup(BlockGetter level, Entity entity, boolean is3rdPerson, boolean isMirrored, float pt, CallbackInfo ci) {
- LastActiveCamera._setActiveCamera((Camera)(Object) this);
- }
-}
diff --git a/src/main/java/com/jozufozu/flywheel/mixin/FrustumMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/FrustumMixin.java
deleted file mode 100644
index 2da2c0e8e..000000000
--- a/src/main/java/com/jozufozu/flywheel/mixin/FrustumMixin.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.jozufozu.flywheel.mixin;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import com.jozufozu.flywheel.backend.ShadersModHandler;
-import com.jozufozu.flywheel.backend.gl.GlStateTracker;
-import com.jozufozu.flywheel.core.LastActiveCamera;
-import com.jozufozu.flywheel.event.BeginFrameEvent;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.culling.Frustum;
-import net.minecraftforge.common.MinecraftForge;
-
-@Mixin(Frustum.class)
-public class FrustumMixin {
-
- @Inject(method = "prepare", at = @At("TAIL"))
- private void onPrepare(double x, double y, double z, CallbackInfo ci) {
- if (ShadersModHandler.isRenderingShadowPass()) {
- try (var restoreState = GlStateTracker.getRestoreState()) {
- MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(Minecraft.getInstance().level, LastActiveCamera.getActiveCamera(), (Frustum) (Object) this));
- }
- }
- }
-}
diff --git a/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererDispatchMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererDispatchMixin.java
deleted file mode 100644
index aac392311..000000000
--- a/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererDispatchMixin.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package com.jozufozu.flywheel.mixin;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import com.jozufozu.flywheel.backend.Backend;
-import com.jozufozu.flywheel.backend.gl.GlStateTracker;
-import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
-import com.jozufozu.flywheel.core.RenderContext;
-import com.jozufozu.flywheel.event.RenderLayerEvent;
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.math.Matrix4f;
-
-import net.minecraft.client.renderer.LevelRenderer;
-import net.minecraft.client.renderer.RenderType;
-import net.minecraft.client.renderer.Sheets;
-import net.minecraft.client.renderer.texture.TextureAtlas;
-import net.minecraftforge.common.MinecraftForge;
-
-@Mixin(value = LevelRenderer.class, priority = 1001) // Higher priority to go after sodium
-public class LevelRendererDispatchMixin {
-
- @Inject(at = @At("TAIL"), method = "renderChunkLayer")
- private void renderChunkLayer(RenderType pRenderType, PoseStack pPoseStack, double pCamX, double pCamY, double pCamZ, Matrix4f pProjectionMatrix, CallbackInfo ci) {
- try (var restoreState = GlStateTracker.getRestoreState()) {
-
- // TODO: Is this necessary?
- InstancedRenderDispatcher.renderSpecificType(RenderContext.CURRENT, pRenderType);
- MinecraftForge.EVENT_BUS.post(new RenderLayerEvent(RenderContext.CURRENT, pRenderType));
- }
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V"))
- private void endBatch(CallbackInfo ci) {
- if (RenderContext.CURRENT != null && Backend.isGameActive() && Backend.isOn()) {
- try (var restoreState = GlStateTracker.getRestoreState()) {
- InstancedRenderDispatcher.renderAllRemaining(RenderContext.CURRENT);
- }
- }
- }
-
- @Unique
- private void flywheel$dispatch(RenderType pRenderType) {
- if (RenderContext.CURRENT != null && Backend.isGameActive() && Backend.isOn()) {
- try (var restoreState = GlStateTracker.getRestoreState()) {
- InstancedRenderDispatcher.renderSpecificType(RenderContext.CURRENT, pRenderType);
- }
- }
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 0, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$entitySolid(CallbackInfo ci) {
- flywheel$dispatch(RenderType.entitySolid(TextureAtlas.LOCATION_BLOCKS));
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 1, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$entityCutout(CallbackInfo ci) {
- flywheel$dispatch(RenderType.entityCutout(TextureAtlas.LOCATION_BLOCKS));
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 2, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$entityCutoutNoCull(CallbackInfo ci) {
- flywheel$dispatch(RenderType.entityCutoutNoCull(TextureAtlas.LOCATION_BLOCKS));
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 3, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$entitySmoothCutout(CallbackInfo ci) {
- flywheel$dispatch(RenderType.entitySmoothCutout(TextureAtlas.LOCATION_BLOCKS));
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 4, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$solid(CallbackInfo ci) {
- flywheel$dispatch(RenderType.solid());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 5, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$endPortal(CallbackInfo ci) {
- flywheel$dispatch(RenderType.endPortal());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 6, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$endGateway(CallbackInfo ci) {
- flywheel$dispatch(RenderType.endGateway());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 7, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$solidBlockSheet(CallbackInfo ci) {
- flywheel$dispatch(Sheets.solidBlockSheet());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 8, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$cutoutBlockSheet(CallbackInfo ci) {
- flywheel$dispatch(Sheets.cutoutBlockSheet());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 9, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$bedSheet(CallbackInfo ci) {
- flywheel$dispatch(Sheets.bedSheet());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 10, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$shulkerBoxSheet(CallbackInfo ci) {
- flywheel$dispatch(Sheets.shulkerBoxSheet());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 11, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$signSheet(CallbackInfo ci) {
- flywheel$dispatch(Sheets.signSheet());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 12, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$chestSheet(CallbackInfo ci) {
- flywheel$dispatch(Sheets.chestSheet());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 13, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$translucentCullBlockSheet(CallbackInfo ci) {
- flywheel$dispatch(Sheets.translucentCullBlockSheet());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 14, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$bannerSheet(CallbackInfo ci) {
- flywheel$dispatch(Sheets.bannerSheet());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 15, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$shieldSheet(CallbackInfo ci) {
- flywheel$dispatch(Sheets.shieldSheet());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 16, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$armorGlint(CallbackInfo ci) {
- flywheel$dispatch(RenderType.armorGlint());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 17, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$armorEntityGlint(CallbackInfo ci) {
- flywheel$dispatch(RenderType.armorEntityGlint());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 18, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$glint(CallbackInfo ci) {
- flywheel$dispatch(RenderType.glint());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 19, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$glintDirect(CallbackInfo ci) {
- flywheel$dispatch(RenderType.glintDirect());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 20, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$glintTranslucent(CallbackInfo ci) {
- flywheel$dispatch(RenderType.glintTranslucent());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 21, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$entityGlint(CallbackInfo ci) {
- flywheel$dispatch(RenderType.entityGlint());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 22, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$entityGlintDirect(CallbackInfo ci) {
- flywheel$dispatch(RenderType.entityGlintDirect());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 23, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$waterMask(CallbackInfo ci) {
- flywheel$dispatch(RenderType.waterMask());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 24, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$lines1(CallbackInfo ci) {
- flywheel$dispatch(RenderType.lines());
- }
-
- @Inject(method = "renderLevel", at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 25, target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch(Lnet/minecraft/client/renderer/RenderType;)V"))
- private void renderLayer$lines2(CallbackInfo ci) {
- flywheel$dispatch(RenderType.lines());
- }
-}
diff --git a/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererMixin.java
index 12fa21441..89952c908 100644
--- a/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererMixin.java
+++ b/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererMixin.java
@@ -1,5 +1,6 @@
package com.jozufozu.flywheel.mixin;
+import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@@ -9,14 +10,14 @@ import org.spongepowered.asm.mixin.injection.At.Shift;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import com.jozufozu.flywheel.api.RenderStage;
import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
-import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
import com.jozufozu.flywheel.core.RenderContext;
import com.jozufozu.flywheel.core.crumbling.CrumblingRenderer;
import com.jozufozu.flywheel.event.BeginFrameEvent;
import com.jozufozu.flywheel.event.ReloadRenderersEvent;
-import com.jozufozu.flywheel.event.RenderLayerEvent;
+import com.jozufozu.flywheel.event.RenderStageEvent;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Matrix4f;
@@ -26,13 +27,10 @@ import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.RenderBuffers;
-import net.minecraft.client.renderer.RenderType;
-import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.MinecraftForge;
@Mixin(value = LevelRenderer.class, priority = 1001) // Higher priority to go after sodium
public class LevelRendererMixin {
-
@Shadow
private ClientLevel level;
@@ -40,19 +38,21 @@ public class LevelRendererMixin {
@Final
private RenderBuffers renderBuffers;
+ @Unique
+ private RenderContext renderContext;
+
@Inject(at = @At("HEAD"), method = "renderLevel")
private void beginRender(PoseStack pPoseStack, float pPartialTick, long pFinishNanoTime, boolean pRenderBlockOutline, Camera pCamera, GameRenderer pGameRenderer, LightTexture pLightTexture, Matrix4f pProjectionMatrix, CallbackInfo ci) {
- Vec3 position = pCamera.getPosition();
- RenderContext.CURRENT = new RenderContext(level, pPoseStack, RenderLayerEvent.createViewProjection(pPoseStack), renderBuffers, position.x, position.y, position.z);
+ renderContext = new RenderContext((LevelRenderer) (Object) this, level, pPoseStack, RenderContext.createViewProjection(pPoseStack, pProjectionMatrix), pProjectionMatrix, renderBuffers, pCamera);
try (var restoreState = GlStateTracker.getRestoreState()) {
- MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(level, pCamera, null));
+ MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(renderContext));
}
}
@Inject(at = @At("TAIL"), method = "renderLevel")
private void endRender(PoseStack pPoseStack, float pPartialTick, long pFinishNanoTime, boolean pRenderBlockOutline, Camera pCamera, GameRenderer pGameRenderer, LightTexture pLightTexture, Matrix4f pProjectionMatrix, CallbackInfo ci) {
- RenderContext.CURRENT = null;
+ renderContext = null;
}
@Inject(at = @At("TAIL"), method = "allChanged")
@@ -64,7 +64,90 @@ public class LevelRendererMixin {
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderBuffers;crumblingBufferSource()Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;", ordinal = 2, shift = Shift.BY, by = 2 // after the game renders the breaking overlay normally
), method = "renderLevel")
- private void renderBlockBreaking(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) {
- CrumblingRenderer.renderCrumbling((LevelRenderer) (Object) this, level, poseStack, camera, projectionMatrix);
+ private void renderCrumbling(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) {
+ if (renderContext != null) {
+ CrumblingRenderer.renderCrumbling(renderContext);
+ }
+ }
+
+ // STAGE DISPATCHING
+
+ @Unique
+ private void flywheel$dispatch(RenderStage stage) {
+ if (renderContext != null) {
+ try (var restoreState = GlStateTracker.getRestoreState()) {
+ MinecraftForge.EVENT_BUS.post(new RenderStageEvent(renderContext, stage));
+ }
+ }
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=sky"))
+ private void onStage$beforeSky(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.BEFORE_SKY);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=fog"))
+ private void onStage$afterSky(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_SKY);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=terrain"))
+ private void onStage$beforeTerrain(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.BEFORE_TERRAIN);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=entities"))
+ private void onStage$afterSolidTerrain(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_SOLID_TERRAIN);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderBuffers;bufferSource()Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;", ordinal = 0))
+ private void onStage$beforeEntities(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.BEFORE_ENTITIES);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=blockentities"))
+ private void onStage$beforeBlockEntities(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_ENTITIES);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/OutlineBufferSource;endOutlineBatch()V", ordinal = 0))
+ private void onStage$afterSolidBlockEntities(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_BLOCK_ENTITIES);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V", ordinal = 0))
+ private void onStage$beforeCrumbling(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.BEFORE_CRUMBLING);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/LevelRenderer;translucentTarget:Lcom/mojang/blaze3d/pipeline/RenderTarget;", opcode = Opcodes.GETFIELD, ordinal = 0))
+ private void onStage$afterFinalEndBatch$fabulous(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_FINAL_END_BATCH);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/LevelRenderer;particlesTarget:Lcom/mojang/blaze3d/pipeline/RenderTarget;", opcode = Opcodes.GETFIELD, ordinal = 0))
+ private void onStage$afterTranslucentTerrain$fabulous(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_TRANSLUCENT_TERRAIN);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V", ordinal = 2, shift = Shift.AFTER))
+ private void onStage$afterFinalEndBatch(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_FINAL_END_BATCH);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLcom/mojang/math/Matrix4f;)V", ordinal = 6, shift = Shift.AFTER))
+ private void onStage$afterTranslucentTerrain(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_TRANSLUCENT_TERRAIN);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/ParticleEngine;render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;Lnet/minecraft/client/renderer/LightTexture;Lnet/minecraft/client/Camera;FLnet/minecraft/client/renderer/culling/Frustum;)V", shift = Shift.AFTER))
+ private void onStage$afterParticles(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_PARTICLES);
+ }
+
+ @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;renderSnowAndRain(Lnet/minecraft/client/renderer/LightTexture;FDDD)V", shift = Shift.AFTER))
+ private void onStage$afterWeather(CallbackInfo ci) {
+ flywheel$dispatch(RenderStage.AFTER_WEATHER);
}
}
diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java
index e1746a006..a87e5fa04 100644
--- a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java
@@ -5,14 +5,15 @@ import java.util.List;
import org.jetbrains.annotations.NotNull;
-import com.jozufozu.flywheel.api.InstancedPart;
-import com.jozufozu.flywheel.api.InstancerManager;
+import com.jozufozu.flywheel.api.RenderStage;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
-import com.jozufozu.flywheel.api.material.Material;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.InstancerManager;
import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance;
import com.jozufozu.flywheel.core.BasicModelSupplier;
import com.jozufozu.flywheel.core.hardcoded.ModelPart;
import com.jozufozu.flywheel.core.material.MaterialShaders;
+import com.jozufozu.flywheel.core.material.SimpleMaterial;
import com.jozufozu.flywheel.core.structs.StructTypes;
import com.jozufozu.flywheel.core.structs.oriented.OrientedPart;
import com.jozufozu.flywheel.util.AnimationTickHolder;
@@ -26,7 +27,7 @@ import net.minecraft.world.level.block.entity.BellBlockEntity;
public class BellInstance extends BlockEntityInstance implements DynamicInstance {
- private static final BasicModelSupplier MODEL = new BasicModelSupplier(BellInstance::createBellModel, new Material(Sheets.solidBlockSheet(), MaterialShaders.SHADED_VERTEX, MaterialShaders.DEFAULT_FRAGMENT));
+ private static final BasicModelSupplier MODEL = new BasicModelSupplier(BellInstance::createBellModel, new SimpleMaterial(RenderStage.AFTER_BLOCK_ENTITIES, Sheets.solidBlockSheet(), MaterialShaders.SHADED_VERTEX, MaterialShaders.DEFAULT_FRAGMENT));
private final OrientedPart bell;
diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java
index d444378ea..92828149c 100644
--- a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java
@@ -7,13 +7,15 @@ import java.util.function.BiFunction;
import org.jetbrains.annotations.NotNull;
-import com.jozufozu.flywheel.api.InstancedPart;
-import com.jozufozu.flywheel.api.InstancerManager;
+import com.jozufozu.flywheel.api.RenderStage;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.InstancerManager;
import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance;
import com.jozufozu.flywheel.core.BasicModelSupplier;
import com.jozufozu.flywheel.core.hardcoded.ModelPart;
import com.jozufozu.flywheel.core.material.MaterialShaders;
+import com.jozufozu.flywheel.core.material.SimpleMaterial;
import com.jozufozu.flywheel.core.structs.StructTypes;
import com.jozufozu.flywheel.core.structs.model.TransformedPart;
import com.jozufozu.flywheel.core.structs.oriented.OrientedPart;
@@ -37,7 +39,7 @@ import net.minecraft.world.level.block.state.properties.ChestType;
public class ChestInstance extends BlockEntityInstance implements DynamicInstance {
- private static final com.jozufozu.flywheel.api.material.Material CHEST_MATERIAL = new com.jozufozu.flywheel.api.material.Material(Sheets.chestSheet(), MaterialShaders.SHADED_VERTEX, MaterialShaders.DEFAULT_FRAGMENT);
+ private static final com.jozufozu.flywheel.api.material.Material CHEST_MATERIAL = new SimpleMaterial(RenderStage.AFTER_BLOCK_ENTITIES, Sheets.chestSheet(), MaterialShaders.SHADED_VERTEX, MaterialShaders.DEFAULT_FRAGMENT);
private static final BiFunction LID = Util.memoize((type, mat) -> new BasicModelSupplier(() -> createLidModel(type, mat.sprite()), CHEST_MATERIAL));
private static final BiFunction BASE = Util.memoize((type, mat) -> new BasicModelSupplier(() -> createBaseModel(type, mat.sprite()), CHEST_MATERIAL));
diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java
index 7adb8713f..6a7afc30f 100644
--- a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java
@@ -2,15 +2,16 @@ package com.jozufozu.flywheel.vanilla;
import org.jetbrains.annotations.NotNull;
-import com.jozufozu.flywheel.api.InstancerManager;
+import com.jozufozu.flywheel.api.RenderStage;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.api.instance.TickableInstance;
-import com.jozufozu.flywheel.api.material.Material;
+import com.jozufozu.flywheel.api.instancer.InstancerManager;
import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance;
import com.jozufozu.flywheel.core.BasicModelSupplier;
import com.jozufozu.flywheel.core.Models;
import com.jozufozu.flywheel.core.hardcoded.ModelPart;
import com.jozufozu.flywheel.core.material.MaterialShaders;
+import com.jozufozu.flywheel.core.material.SimpleMaterial;
import com.jozufozu.flywheel.core.model.Mesh;
import com.jozufozu.flywheel.core.structs.StructTypes;
import com.jozufozu.flywheel.core.structs.model.TransformedPart;
@@ -31,7 +32,7 @@ import net.minecraft.world.phys.Vec3;
public class MinecartInstance extends EntityInstance implements DynamicInstance, TickableInstance {
private static final ResourceLocation MINECART_LOCATION = new ResourceLocation("textures/entity/minecart.png");
- private static final BasicModelSupplier MODEL = new BasicModelSupplier(MinecartInstance::getBodyModel, new Material(RenderType.entitySolid(MINECART_LOCATION), MaterialShaders.SHADED_VERTEX, MaterialShaders.DEFAULT_FRAGMENT));
+ private static final BasicModelSupplier MODEL = new BasicModelSupplier(MinecartInstance::getBodyModel, new SimpleMaterial(RenderStage.AFTER_ENTITIES, RenderType.entitySolid(MINECART_LOCATION), MaterialShaders.SHADED_VERTEX, MaterialShaders.DEFAULT_FRAGMENT));
private final PoseStack stack = new PoseStack();
diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java
index e02349d79..b5d3b8874 100644
--- a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java
@@ -4,14 +4,16 @@ import java.util.Collections;
import java.util.List;
import java.util.function.Function;
-import com.jozufozu.flywheel.api.InstancedPart;
-import com.jozufozu.flywheel.api.InstancerManager;
+import com.jozufozu.flywheel.api.RenderStage;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
+import com.jozufozu.flywheel.api.instancer.InstancedPart;
+import com.jozufozu.flywheel.api.instancer.InstancerManager;
import com.jozufozu.flywheel.api.material.Material;
import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance;
import com.jozufozu.flywheel.core.BasicModelSupplier;
import com.jozufozu.flywheel.core.hardcoded.ModelPart;
import com.jozufozu.flywheel.core.material.MaterialShaders;
+import com.jozufozu.flywheel.core.material.SimpleMaterial;
import com.jozufozu.flywheel.core.structs.StructTypes;
import com.jozufozu.flywheel.core.structs.model.TransformedPart;
import com.jozufozu.flywheel.util.AnimationTickHolder;
@@ -31,7 +33,7 @@ import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity;
public class ShulkerBoxInstance extends BlockEntityInstance implements DynamicInstance {
- private static final Material SHULKER_BOX_MATERIAL = new Material(RenderType.entityCutoutNoCull(Sheets.SHULKER_SHEET), MaterialShaders.SHADED_VERTEX, MaterialShaders.DEFAULT_FRAGMENT);
+ private static final Material SHULKER_BOX_MATERIAL = new SimpleMaterial(RenderStage.AFTER_BLOCK_ENTITIES, RenderType.entityCutoutNoCull(Sheets.SHULKER_SHEET), MaterialShaders.SHADED_VERTEX, MaterialShaders.DEFAULT_FRAGMENT);
private static final Function BASE = Util.memoize(it -> new BasicModelSupplier(() -> makeBaseModel(it), SHULKER_BOX_MATERIAL));
private static final Function LID = Util.memoize(it -> new BasicModelSupplier(() -> makeLidModel(it), SHULKER_BOX_MATERIAL));
diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/effect/ExampleEffect.java b/src/main/java/com/jozufozu/flywheel/vanilla/effect/ExampleEffect.java
index cfbe63506..238ef654c 100644
--- a/src/main/java/com/jozufozu/flywheel/vanilla/effect/ExampleEffect.java
+++ b/src/main/java/com/jozufozu/flywheel/vanilla/effect/ExampleEffect.java
@@ -5,9 +5,9 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import com.jozufozu.flywheel.api.InstancerManager;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.api.instance.TickableInstance;
+import com.jozufozu.flywheel.api.instancer.InstancerManager;
import com.jozufozu.flywheel.backend.instancing.AbstractInstance;
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
import com.jozufozu.flywheel.backend.instancing.effect.Effect;
diff --git a/src/main/resources/flywheel.mixins.json b/src/main/resources/flywheel.mixins.json
index 71f847654..202a065d3 100644
--- a/src/main/resources/flywheel.mixins.json
+++ b/src/main/resources/flywheel.mixins.json
@@ -9,17 +9,14 @@
"BlockEntityTypeMixin",
"BufferBuilderMixin",
"BufferUploaderMixin",
- "CameraMixin",
"ChunkRebuildHooksMixin",
"ClientLevelMixin",
"EntityTypeMixin",
"FixFabulousDepthMixin",
- "FrustumMixin",
"GlStateManagerMixin",
"InstanceAddMixin",
"InstanceRemoveMixin",
"LevelRendererAccessor",
- "LevelRendererDispatchMixin",
"LevelRendererInstanceUpdateMixin",
"LevelRendererMixin",
"PausedPartialTickAccessor",