From 3f2456ba654d9ce9bc473cd48c0ab66b1e68716b Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Tue, 29 Jun 2021 12:39:06 +0200 Subject: [PATCH] Use GameRenderer.render instead of renderWorld, improves compat In particular, Iris updates its frame counter and timer in the outer method, so if we only call the inner one, then its shadows and sky will not update properly. Since the render method also renders the GUI, we set the current screen to null and cancel the HUD during rendering. MC also clears the depth before rendering the HUD, which we don't want because it breaks the depth map export, so we cancel that as well. This also allows Vanilla post-processing (aka Super Secret Settings, aka Vanilla Shaders) as well as entity outlines to function properly cause those are applied in that method as well. Should have done this a long time ago but better late than never. Closes #321 --- .../render/hooks/EntityRendererHandler.java | 26 +++++++++++++---- ...Mixin_PreserveDepthDuringGuiRendering.java | 28 +++++++++++++++++++ .../mixin/Mixin_SkipHudDuringRender.java | 23 +++++++++++++++ .../resources/mixins.render.replaymod.json | 2 ++ versions/1.14.4-forge/mapping.txt | 2 +- 5 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringGuiRendering.java create mode 100644 src/main/java/com/replaymod/render/mixin/Mixin_SkipHudDuringRender.java diff --git a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java index 54560f1d..20e10c07 100644 --- a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java +++ b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java @@ -8,6 +8,7 @@ import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.WorldRenderer; import de.johni0702.minecraft.gui.utils.EventRegistrations; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; //#if MC>=11500 import net.minecraft.client.util.math.MatrixStack; @@ -65,11 +66,26 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe //#endif if (mc.world != null && mc.player != null) { - //#if MC>=11500 - mc.gameRenderer.renderWorld(partialTicks, finishTimeNano, new MatrixStack()); - //#else - //$$ mc.gameRenderer.renderWorld(partialTicks, finishTimeNano); - //#endif + Screen orgScreen = mc.currentScreen; + boolean orgPauseOnLostFocus = mc.options.pauseOnLostFocus; + try { + mc.currentScreen = null; // do not want to render the current screen (that'd just be the progress gui) + mc.options.pauseOnLostFocus = false; // do not want the pause menu to open if the window is unfocused + + //#if MC>=11400 + mc.gameRenderer.render(partialTicks, finishTimeNano, true); + //#else + //$$ mc.setIngameNotInFocus(); // this should already be the case but it somehow still sometimes is not + //#if MC>=10809 + //$$ mc.entityRenderer.updateCameraAndRender(partialTicks, finishTimeNano); + //#else + //$$ mc.entityRenderer.updateCameraAndRender(partialTicks); + //#endif + //#endif + } finally { + mc.currentScreen = orgScreen; + mc.options.pauseOnLostFocus = orgPauseOnLostFocus; + } } //#if MC>=11400 diff --git a/src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringGuiRendering.java b/src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringGuiRendering.java new file mode 100644 index 00000000..0e9ab2c0 --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringGuiRendering.java @@ -0,0 +1,28 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.render.GameRenderer; +import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(GameRenderer.class) +public abstract class Mixin_PreserveDepthDuringGuiRendering { + @ModifyArg( + //#if MC>=11700 + method = "render", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;clear(IZ)V"), index = 0 + //#else + //$$ method = "setupOverlayRendering", + //$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;clear(I)V"), index = 0 + //#endif + ) + private int replayModRender_skipClearWhenRecordingDepth(int mask) { + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) this).replayModRender_getHandler(); + if (handler != null && handler.getSettings().isDepthMap()) { + mask = mask & ~GL11.GL_DEPTH_BUFFER_BIT; + } + return mask; + } +} diff --git a/src/main/java/com/replaymod/render/mixin/Mixin_SkipHudDuringRender.java b/src/main/java/com/replaymod/render/mixin/Mixin_SkipHudDuringRender.java new file mode 100644 index 00000000..328b726d --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/Mixin_SkipHudDuringRender.java @@ -0,0 +1,23 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.hud.InGameHud; +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; + +//#if MC>=11400 +@Mixin(InGameHud.class) +//#else +//$$ @Mixin({ GuiIngame.class, net.minecraftforge.client.GuiIngameForge.class }) +//#endif +public abstract class Mixin_SkipHudDuringRender { + @Inject(method = "render", at = @At("HEAD"), cancellable = true) + private void replayModRender_skipHudDuringRender(CallbackInfo ci) { + if (((EntityRendererHandler.IEntityRenderer) MinecraftClient.getInstance().gameRenderer).replayModRender_getHandler() != null) { + ci.cancel(); + } + } +} diff --git a/src/main/resources/mixins.render.replaymod.json b/src/main/resources/mixins.render.replaymod.json index 3118ccd3..05ba5423 100644 --- a/src/main/resources/mixins.render.replaymod.json +++ b/src/main/resources/mixins.render.replaymod.json @@ -14,7 +14,9 @@ "Mixin_Omnidirectional_DisableFrustumCulling", "Mixin_Omnidirectional_Rotation", "Mixin_Omnidirectional_SkipHand", + "Mixin_PreserveDepthDuringGuiRendering", "Mixin_SkipBlockOutlinesDuringRender", + "Mixin_SkipHudDuringRender", "Mixin_StabilizeCamera", "Mixin_Stereoscopic_Camera", "Mixin_Stereoscopic_HandRenderPass", diff --git a/versions/1.14.4-forge/mapping.txt b/versions/1.14.4-forge/mapping.txt index ec310305..d57a46f3 100644 --- a/versions/1.14.4-forge/mapping.txt +++ b/versions/1.14.4-forge/mapping.txt @@ -19,6 +19,7 @@ org.apache.maven.artifact.versioning.ComparableVersion net.minecraftforge.fml.co org.lwjgl.glfw.GLFW com.replaymod.core.versions.GLFW net.minecraft.client.MainWindow com.replaymod.core.versions.Window net.minecraft.client.audio.SimpleSound net.minecraft.client.audio.PositionedSoundRecord +net.minecraft.client.gui.IngameGui net.minecraft.client.gui.GuiIngame net.minecraft.resources.FolderPack getInputStream() getInputStreamByName() net.minecraft.client.gui.GuiYesNoCallback confirmResult() confirmClicked() @@ -183,7 +184,6 @@ net.minecraft.client.gui.screen.Screen removed() onGuiClosed() net.minecraft.client.gui.screen.Screen renderBackground() drawDefaultBackground() net.minecraft.client.gui.screen.Screen renderDirtBackground() drawBackground() net.minecraft.client.gui.hud.ChatHud net.minecraft.client.gui.GuiNewChat -net.minecraft.client.gui.hud.InGameHud net.minecraft.client.gui.GuiIngame net.minecraft.client.GameSettings net.minecraft.client.settings.GameSettings net.minecraft.client.GameSettings debugEnabled showDebugInfo net.minecraft.client.GameSettings viewDistance renderDistanceChunks