Fix After Translucent Render Event (#4155)

This commit is contained in:
Aaron 2024-10-15 08:20:27 -04:00 committed by GitHub
parent 118941c0e0
commit 6e4c084dbc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 7 deletions

View file

@ -17,6 +17,7 @@
package net.fabricmc.fabric.mixin.client.rendering; package net.fabricmc.fabric.mixin.client.rendering;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.sugar.Local;
import org.joml.Matrix4f; import org.joml.Matrix4f;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; 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.option.CloudRenderMode;
import net.minecraft.client.render.BufferBuilderStorage; import net.minecraft.client.render.BufferBuilderStorage;
import net.minecraft.client.render.Camera; import net.minecraft.client.render.Camera;
import net.minecraft.client.render.DefaultFramebufferSet;
import net.minecraft.client.render.Fog; import net.minecraft.client.render.Fog;
import net.minecraft.client.render.FrameGraphBuilder; import net.minecraft.client.render.FrameGraphBuilder;
import net.minecraft.client.render.Frustum; import net.minecraft.client.render.Frustum;
import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.LightmapTextureManager;
import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderPass;
import net.minecraft.client.render.RenderTickCounter; import net.minecraft.client.render.RenderTickCounter;
import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.render.WorldRenderer;
@ -63,6 +66,9 @@ public abstract class WorldRendererMixin {
@Final @Final
@Shadow @Shadow
private MinecraftClient client; private MinecraftClient client;
@Shadow
@Final
private DefaultFramebufferSet framebufferSet;
@Unique private final WorldRenderContextImpl context = new WorldRenderContextImpl(); @Unique private final WorldRenderContextImpl context = new WorldRenderContextImpl();
@Inject(method = "render", at = @At("HEAD")) @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;")) @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/GameOptions;getCloudRenderModeValue()Lnet/minecraft/client/option/CloudRenderMode;"))
private void beforeClouds(CallbackInfo ci) { private void beforeClouds(CallbackInfo ci, @Local FrameGraphBuilder frameGraphBuilder) {
WorldRenderEvents.AFTER_TRANSLUCENT.invoker().afterTranslucent(context); 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")) @Inject(method = "method_62214", at = @At("RETURN"))

View file

@ -34,6 +34,7 @@ import net.minecraft.util.math.Vec3d;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
public class WorldRenderEventsTests implements ClientModInitializer { public class WorldRenderEventsTests implements ClientModInitializer {
private static boolean onBlockOutline(WorldRenderContext wrc, WorldRenderContext.BlockOutlineContext blockOutlineContext) { 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) { private static void renderAfterTranslucent(WorldRenderContext context) {
MatrixStack matrices = context.matrixStack(); MatrixStack matrices = context.matrixStack();
@ -75,7 +76,7 @@ public class WorldRenderEventsTests implements ClientModInitializer {
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc(); 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()); BufferRenderer.drawWithGlobalProgram(buffer.end());
matrices.pop(); matrices.pop();
@ -85,8 +86,8 @@ public class WorldRenderEventsTests implements ClientModInitializer {
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
// Renders a diamond block above diamond blocks when they are looked at. // Renders a diamond block above diamond blocks when they are looked at.
//WorldRenderEvents.BLOCK_OUTLINE.register(WorldRenderEventsTests::onBlockOutline); WorldRenderEvents.BLOCK_OUTLINE.register(WorldRenderEventsTests::onBlockOutline);
// Renders a translucent box at (0, 100, 0) // Renders a translucent filled box at (0, 100, 0)
//WorldRenderEvents.AFTER_TRANSLUCENT.register(WorldRenderEventsTests::renderAfterTranslucent); WorldRenderEvents.AFTER_TRANSLUCENT.register(WorldRenderEventsTests::renderAfterTranslucent);
} }
} }