diff --git a/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch index 1da7501ee2..a74f85c282 100644 --- a/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch @@ -25,7 +25,7 @@ } this.addLateDebugPass(framegraphbuilder, this.levelRenderState.cameraRenderState.pos, p_407881_, frustum); -+ net.minecraftforge.client.FramePassManager.insertForgePasses(framegraphbuilder, targets); // Forge: Modded passes are inserted here. ++ net.minecraftforge.client.FramePassManager.insertForgePasses(framegraphbuilder, targets, this.levelRenderState); // Forge: Modded passes are inserted here. profilerfiller.popPush("executeFrameGraph"); framegraphbuilder.execute(p_367325_, new FrameGraphBuilder.Inspector() { @Override diff --git a/src/main/java/net/minecraftforge/client/FramePassManager.java b/src/main/java/net/minecraftforge/client/FramePassManager.java index 1330764962..dca3d314b4 100644 --- a/src/main/java/net/minecraftforge/client/FramePassManager.java +++ b/src/main/java/net/minecraftforge/client/FramePassManager.java @@ -7,9 +7,12 @@ package net.minecraftforge.client; import com.mojang.blaze3d.framegraph.FrameGraphBuilder; import com.mojang.blaze3d.framegraph.FramePass; +import com.mojang.blaze3d.resource.ResourceHandle; import net.minecraft.client.renderer.LevelTargetBundle; +import net.minecraft.client.renderer.state.LevelRenderState; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -27,18 +30,43 @@ public class FramePassManager { // Note: Pass order is determined automatically within FrameGraphBuilder. It's unclear what must be done to guarantee ordering. @ApiStatus.Internal - public static void insertForgePasses(FrameGraphBuilder graphBuilder, LevelTargetBundle bundle) { + public static void insertForgePasses(FrameGraphBuilder graphBuilder, LevelTargetBundle bundle, LevelRenderState state) { for (PassInfo info : addedPasses) { FramePass pass = graphBuilder.addPass(info.name); PassDefinition forgePass = info.pass; - forgePass.targets(bundle, pass); - pass.executes(forgePass::executes); + forgePass.extracts(bundle, pass); + pass.executes(() -> forgePass.executes(state)); } } public interface PassDefinition { - void targets(LevelTargetBundle bundle, FramePass pass); - void executes(); + /** + * Use to define which targets your pass will bind against, see {@link FramePass#reads} and {@link FramePass#readsAndWrites} + * A FramePass must bind to at least ONE target. Otherwise, you get freaky issues with >1 modded passes. + * Additionally, this method should be used for extracting render states into instance variables if desired. + */ + default void extracts(LevelTargetBundle bundle, FramePass pass) { + targets(bundle, pass); + } + + /** + * Prefer {@link PassDefinition#extracts} + */ + @Deprecated(forRemoval = true, since = "1.21.10") + default void targets(LevelTargetBundle bundle, FramePass pass) {} + + /** + * Use to define what your pass does during the render stage. + */ + default void executes(LevelRenderState state) { + executes(); + }; + + /** + * Use to define what your pass does during the render stage, prefer {@link PassDefinition#executes(LevelRenderState)}. + */ + @Deprecated(forRemoval = true, since = "1.21.10") + default void executes(){}; } private record PassInfo(String name, PassDefinition pass){} diff --git a/src/test/java/net/minecraftforge/debug/client/RenderFrameLayerTest.java b/src/test/java/net/minecraftforge/debug/client/RenderFrameLayerTest.java index b0dd493481..cd8bd36796 100644 --- a/src/test/java/net/minecraftforge/debug/client/RenderFrameLayerTest.java +++ b/src/test/java/net/minecraftforge/debug/client/RenderFrameLayerTest.java @@ -6,6 +6,7 @@ package net.minecraftforge.debug.client; import net.minecraft.client.renderer.LevelTargetBundle; +import net.minecraft.client.renderer.state.LevelRenderState; import net.minecraftforge.client.FramePassManager; import net.minecraftforge.client.event.AddFramePassEvent; import net.minecraftforge.common.extensions.IForgeGameTestHelper; @@ -48,18 +49,17 @@ public class RenderFrameLayerTest extends BaseTestMod { * If this is working, two white line box cubes will be rendered at ground level in a superflat world around (0,0) */ public static void renderTest(AddFramePassEvent event) { - var mainCamera = Minecraft.getInstance().gameRenderer.getMainCamera(); FramePassManager.PassDefinition def = new FramePassManager.PassDefinition() { @Override - public void targets(LevelTargetBundle bundle, FramePass pass) { + public void extracts(LevelTargetBundle bundle, FramePass pass) { bundle.main = pass.readsAndWrites(bundle.main); } @Override - public void executes() { + public void executes(LevelRenderState state) { PoseStack ps = new PoseStack(); passOne.set(true); - ps.translate(mainCamera.getPosition().multiply(-1,-1,-1)); + ps.translate(state.cameraRenderState.entityPos.multiply(-1,-1,-1)); ps.pushPose(); var buffSource = Minecraft.getInstance().renderBuffers().bufferSource(); var vc = buffSource.getBuffer(RenderType.lines()); @@ -72,15 +72,15 @@ public class RenderFrameLayerTest extends BaseTestMod { event.addPass(rl(MODID), def); FramePassManager.PassDefinition def2 = new FramePassManager.PassDefinition() { @Override - public void targets(LevelTargetBundle bundle, FramePass pass) { + public void extracts(LevelTargetBundle bundle, FramePass pass) { bundle.main = pass.readsAndWrites(bundle.main); } @Override - public void executes() { + public void executes(LevelRenderState state) { PoseStack ps = new PoseStack(); passTwo.set(true); - ps.translate(mainCamera.getPosition().multiply(-1,-1,-1)); + ps.translate(state.cameraRenderState.entityPos.multiply(-1,-1,-1)); ps.pushPose(); var buffSource = Minecraft.getInstance().renderBuffers().bufferSource(); var vc = buffSource.getBuffer(RenderType.lines());