diff --git a/apron/src/main/java/io/github/betterthanupdates/reforged/mixin/client/RenderWorldLastMixin.java b/apron/src/main/java/io/github/betterthanupdates/reforged/mixin/client/RenderWorldLastMixin.java new file mode 100644 index 00000000..782df978 --- /dev/null +++ b/apron/src/main/java/io/github/betterthanupdates/reforged/mixin/client/RenderWorldLastMixin.java @@ -0,0 +1,33 @@ +package io.github.betterthanupdates.reforged.mixin.client; + +import com.llamalad7.mixinextras.sugar.Local; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.class_555; +import net.minecraft.client.render.WorldRenderer; +import org.lwjgl.opengl.GL11; +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 reforged.ReforgedHooksClient; + +@Environment(EnvType.CLIENT) +@Mixin(class_555.class) // EntityRenderer +public class RenderWorldLastMixin { + + @Inject(method = "method_1841", + at = @At(value = "INVOKE", target = "Lnet/minecraft/class_555;method_1842(IF)V", ordinal = 4)) + private void reforged$pushCloudMatrix(float f, long l, CallbackInfo ci) { + GL11.glPushMatrix(); + } + + @Inject(method = "method_1841", + at = @At(value = "INVOKE", target = "Lnet/minecraft/class_555;method_1842(IF)V", ordinal = 5, + shift = At.Shift.AFTER)) + private void reforged$popCloudMatrixAndDraw(float f, long l, CallbackInfo ci, @Local WorldRenderer var5) { + GL11.glPopMatrix(); + ReforgedHooksClient.onRenderWorldLast(var5, f); + } + +} diff --git a/apron/src/main/java/reforged/IRenderWorldLastHandler.java b/apron/src/main/java/reforged/IRenderWorldLastHandler.java new file mode 100644 index 00000000..0c00f195 --- /dev/null +++ b/apron/src/main/java/reforged/IRenderWorldLastHandler.java @@ -0,0 +1,12 @@ +package reforged; + +import net.minecraft.client.render.WorldRenderer; + +public interface IRenderWorldLastHandler { + /** Called after rendering all the 3D data of the world. This is + * called before the user's tool is rendered, but otherwise after all + * 3D content. It is called twice in anaglyph mode. This is intended + * for rendering visual effect overlays into the world. + */ + void onRenderWorldLast(WorldRenderer wr, float f); +} diff --git a/apron/src/main/java/reforged/ReforgedHooksClient.java b/apron/src/main/java/reforged/ReforgedHooksClient.java new file mode 100644 index 00000000..1af5c4fd --- /dev/null +++ b/apron/src/main/java/reforged/ReforgedHooksClient.java @@ -0,0 +1,17 @@ +package reforged; + +import java.util.LinkedList; + +import net.minecraft.client.render.WorldRenderer; + +public class ReforgedHooksClient { + + public static LinkedList renderWorldLastHandlers = new LinkedList<>(); + + public static void onRenderWorldLast(WorldRenderer wr, float f) { + for (IRenderWorldLastHandler handler : renderWorldLastHandlers) { + handler.onRenderWorldLast(wr, f); + } + } + +} diff --git a/apron/src/main/resources/reforged.mixins.json b/apron/src/main/resources/reforged.mixins.json index fd3b8cb1..ac98d76e 100644 --- a/apron/src/main/resources/reforged.mixins.json +++ b/apron/src/main/resources/reforged.mixins.json @@ -12,6 +12,7 @@ "client": [ "client.nostation.GameRendererMixin", "client.MultiplayerInteractionManagerMixin", + "client.RenderWorldLastMixin", "client.SingleplayerInteractionManagerMixin" ], "plugin": "io.github.betterthanupdates.apron.ApronMixinPlugin",