From 6e4c084dbcebb1bbff2d2132f514b0c7754a699c Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Tue, 15 Oct 2024 08:20:27 -0400 Subject: [PATCH] Fix After Translucent Render Event (#4155) --- .../mixin/client/rendering/WorldRendererMixin.java | 13 +++++++++++-- .../rendering/client/WorldRenderEventsTests.java | 11 ++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin.java index e52413d09..4ad26b87c 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin.java @@ -17,6 +17,7 @@ package net.fabricmc.fabric.mixin.client.rendering; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -33,12 +34,14 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.CloudRenderMode; import net.minecraft.client.render.BufferBuilderStorage; import net.minecraft.client.render.Camera; +import net.minecraft.client.render.DefaultFramebufferSet; import net.minecraft.client.render.Fog; import net.minecraft.client.render.FrameGraphBuilder; import net.minecraft.client.render.Frustum; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderPass; import net.minecraft.client.render.RenderTickCounter; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.WorldRenderer; @@ -63,6 +66,9 @@ public abstract class WorldRendererMixin { @Final @Shadow private MinecraftClient client; + @Shadow + @Final + private DefaultFramebufferSet framebufferSet; @Unique private final WorldRenderContextImpl context = new WorldRenderContextImpl(); @Inject(method = "render", at = @At("HEAD")) @@ -151,8 +157,11 @@ public abstract class WorldRendererMixin { } @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/GameOptions;getCloudRenderModeValue()Lnet/minecraft/client/option/CloudRenderMode;")) - private void beforeClouds(CallbackInfo ci) { - WorldRenderEvents.AFTER_TRANSLUCENT.invoker().afterTranslucent(context); + private void beforeClouds(CallbackInfo ci, @Local FrameGraphBuilder frameGraphBuilder) { + RenderPass afterTranslucentPass = frameGraphBuilder.createPass("afterTranslucent"); + framebufferSet.mainFramebuffer = afterTranslucentPass.transfer(framebufferSet.mainFramebuffer); + + afterTranslucentPass.setRenderer(() -> WorldRenderEvents.AFTER_TRANSLUCENT.invoker().afterTranslucent(context)); } @Inject(method = "method_62214", at = @At("RETURN")) diff --git a/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/WorldRenderEventsTests.java b/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/WorldRenderEventsTests.java index 9e28fa3ac..b0d6d415d 100644 --- a/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/WorldRenderEventsTests.java +++ b/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/WorldRenderEventsTests.java @@ -34,6 +34,7 @@ import net.minecraft.util.math.Vec3d; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; public class WorldRenderEventsTests implements ClientModInitializer { private static boolean onBlockOutline(WorldRenderContext wrc, WorldRenderContext.BlockOutlineContext blockOutlineContext) { @@ -59,7 +60,7 @@ public class WorldRenderEventsTests implements ClientModInitializer { } /** - * Renders a translucent box at (0, 100, 0). + * Renders a translucent filled box at (0, 100, 0). */ private static void renderAfterTranslucent(WorldRenderContext context) { MatrixStack matrices = context.matrixStack(); @@ -75,7 +76,7 @@ public class WorldRenderEventsTests implements ClientModInitializer { RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); - VertexRendering.drawBox(matrices, buffer, 0, 100, 0, 1, 101, 1, 0, 1, 0, 0.5f); + VertexRendering.drawFilledBox(matrices, buffer, 0, 100, 0, 1, 101, 1, 0, 1, 0, 0.5f); BufferRenderer.drawWithGlobalProgram(buffer.end()); matrices.pop(); @@ -85,8 +86,8 @@ public class WorldRenderEventsTests implements ClientModInitializer { @Override public void onInitializeClient() { // Renders a diamond block above diamond blocks when they are looked at. - //WorldRenderEvents.BLOCK_OUTLINE.register(WorldRenderEventsTests::onBlockOutline); - // Renders a translucent box at (0, 100, 0) - //WorldRenderEvents.AFTER_TRANSLUCENT.register(WorldRenderEventsTests::renderAfterTranslucent); + WorldRenderEvents.BLOCK_OUTLINE.register(WorldRenderEventsTests::onBlockOutline); + // Renders a translucent filled box at (0, 100, 0) + WorldRenderEvents.AFTER_TRANSLUCENT.register(WorldRenderEventsTests::renderAfterTranslucent); } }