From 9fefaf6eca8e49d7cab7e7891dccfcebd7cb9731 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 5 Aug 2023 16:28:10 -0500 Subject: [PATCH] Fix some rendering mixins 1.16 --- .../common/rendering/SeamlessOverdraw.java | 11 +++ .../fabric/FabricClientProxy.java | 12 ++- .../mixins/client/MixinGameRenderer.java | 42 +++++----- .../mixins/client/MixinGameRenderer.java | 37 ++++----- .../mixins/client/MixinLevelRenderer.java | 78 ++++++++++--------- 5 files changed, 100 insertions(+), 80 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/rendering/SeamlessOverdraw.java b/common/src/main/java/com/seibel/distanthorizons/common/rendering/SeamlessOverdraw.java index 1d851dfe4..16b67e00d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/rendering/SeamlessOverdraw.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/rendering/SeamlessOverdraw.java @@ -7,6 +7,7 @@ import org.joml.Matrix4f; #endif import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.util.RenderUtil; +import com.seibel.distanthorizons.coreapi.util.math.Mat4f; import java.nio.FloatBuffer; @@ -30,6 +31,16 @@ public class SeamlessOverdraw minecraftProjectionMatrix.get(matrixFloatArray); #endif + return overwriteMinecraftNearFarClipPlanes(matrixFloatArray, previousPartialTicks); + } + + public static float[] overwriteMinecraftNearFarClipPlanes(Mat4f minecraftProjectionMatrix, float previousPartialTicks) + { + return overwriteMinecraftNearFarClipPlanes(minecraftProjectionMatrix.getValuesAsArray(), previousPartialTicks); + } + + private static float[] overwriteMinecraftNearFarClipPlanes(float[] matrixFloatArray, float previousPartialTicks) + { float dhFarClipPlane = RenderUtil.getNearClipPlaneDistanceInBlocks(previousPartialTicks); float farClip = dhFarClipPlane * 5.1f; // magic number found via trial and error, James has no idea what it represents, except that it makes the seam between DH and vanilla rendering pretty close float nearClip = 0.5f; // this causes issues with some vanilla rendering, specifically the wireframe around selected blocks is slightly off. Unfortunately the ratio between the near and far clip plane can't be easily modified without completely screwing up the rendering. diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java index 6aaa1b471..9b4b90f0f 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -62,6 +62,7 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.phys.HitResult; import org.apache.logging.log4j.Logger; import org.lwjgl.glfw.GLFW; +import org.lwjgl.opengl.GL15; /** * This handles all events sent to the client, @@ -211,7 +212,16 @@ public class FabricClientProxy { float[] matrixFloatArray = SeamlessOverdraw.overwriteMinecraftNearFarClipPlanes(renderContext.projectionMatrix(), renderContext.tickDelta()); - #if PRE_MC_1_19_4 + #if MC_1_16_5 + int glMatrixMode = GL15.glGetInteger(GL15.GL_MATRIX_MODE); + GL15.glMatrixMode(GL15.GL_PROJECTION); + + GL15.glPopMatrix(); + GL15.glPushMatrix(); + GL15.glLoadMatrixf(matrixFloatArray); + + GL15.glMatrixMode(glMatrixMode); + #elif PRE_MC_1_19_4 renderContext.projectionMatrix().load(FloatBuffer.wrap(matrixFloatArray)); #else renderContext.projectionMatrix().set(matrixFloatArray); diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinGameRenderer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinGameRenderer.java index c2bc8da9d..abb627f47 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinGameRenderer.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinGameRenderer.java @@ -17,16 +17,6 @@ public class MixinGameRenderer #if POST_MC_1_17_1 - @Inject(method = "shutdownShaders", at = @At("HEAD")) - public void onShutdownShaders(CallbackInfo ci) { - LOGGER.info("Shutting down renderer (fabric)"); - if (!DependencySetupDoneCheck.isDone) { - LOGGER.warn("Dependency setup is not done yet, skipping renderer this shutdown event!"); - return; - } - ClientApi.INSTANCE.rendererShutdownEvent(); - } - // FIXME: This I think will dup multiple renderStartupEvent calls... @Inject(method = {"reloadShaders", "preloadUiShader"}, at = @At("TAIL")) public void onStartupShaders(CallbackInfo ci) { @@ -37,20 +27,28 @@ public class MixinGameRenderer } ClientApi.INSTANCE.rendererStartupEvent(); } - #else - // FIXME: on 1.16 we dont have stuff for reloading/shutting down shaders - - @Inject(method = "shutdownShaders", at = @At("HEAD")) + + @Inject(method = "shutdownShaders", at = @At("HEAD")) public void onShutdownShaders(CallbackInfo ci) { - LOGGER.info("Shutting down renderer"); + LOGGER.info("Shutting down renderer (fabric)"); + if (!DependencySetupDoneCheck.isDone) { + LOGGER.warn("Dependency setup is not done yet, skipping renderer this shutdown event!"); + return; + } ClientApi.INSTANCE.rendererShutdownEvent(); } - - // FIXME: This I think will dup multiple renderStartupEvent calls... - @Inject(method = {"reloadShaders", "preloadUiShader", "preloadShader"}, at = @At("TAIL")) - public void onStartupShaders(CallbackInfo ci) { - LOGGER.info("Starting up renderer"); - ClientApi.INSTANCE.rendererStartupEvent(); - } + #else + // FIXME: on 1.16 we dont have stuff for reloading/shutting down shaders + + // FIXME: This I think will dup multiple renderStartupEvent calls... + @Inject(method = {"loadEffect"}, at = @At("TAIL")) + public void onStartupShaders(CallbackInfo ci) { + ClientApi.INSTANCE.rendererStartupEvent(); + } + + @Inject(method = "shutdownEffect", at = @At("HEAD")) + public void onShutdownShaders(CallbackInfo ci) { + ClientApi.INSTANCE.rendererShutdownEvent(); + } #endif } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinGameRenderer.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinGameRenderer.java index 1c39a9204..7d2428f17 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinGameRenderer.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinGameRenderer.java @@ -17,16 +17,6 @@ public class MixinGameRenderer private static final Logger LOGGER = LogManager.getLogger(MixinGameRenderer.class.getSimpleName()); #if POST_MC_1_17_1 - @Inject(method = "shutdownShaders", at = @At("HEAD")) - public void onShutdownShaders(CallbackInfo ci) { - LOGGER.info("Shutting down renderer (forge)"); - if (!DependencySetupDoneCheck.isDone) { - LOGGER.warn("Dependency setup is not done yet, skipping renderer this shutdown event!"); - return; - } - ClientApi.INSTANCE.rendererShutdownEvent(); - } - // FIXME: This I think will dup multiple renderStartupEvent calls... @Inject(method = {"reloadShaders", "preloadUiShader"}, at = @At("TAIL")) public void onStartupShaders(CallbackInfo ci) { @@ -37,21 +27,28 @@ public class MixinGameRenderer } ClientApi.INSTANCE.rendererStartupEvent(); } - #else - // FIXME: on 1.16 we dont have stuff for reloading/shutting down shaders - - @Inject(method = "shutdownShaders", at = @At("HEAD")) + + @Inject(method = "shutdownShaders", at = @At("HEAD")) public void onShutdownShaders(CallbackInfo ci) { - LOGGER.info("Shutting down renderer"); + LOGGER.info("Shutting down renderer (forge)"); + if (!DependencySetupDoneCheck.isDone) { + LOGGER.warn("Dependency setup is not done yet, skipping renderer this shutdown event!"); + return; + } ClientApi.INSTANCE.rendererShutdownEvent(); } - - // FIXME: This I think will dup multiple renderStartupEvent calls... - @Inject(method = {"reloadShaders", "preloadUiShader", "preloadShader"}, at = @At("TAIL")) + #else + + + @Inject(method = {"loadEffect"}, at = @At("TAIL")) public void onStartupShaders(CallbackInfo ci) { - LOGGER.info("Starting up renderer"); ClientApi.INSTANCE.rendererStartupEvent(); } + + @Inject(method = "shutdownEffect", at = @At("HEAD")) + public void onShutdownShaders(CallbackInfo ci) { + ClientApi.INSTANCE.rendererShutdownEvent(); + } #endif - + } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java index 7761a05aa..9fcd6b926 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java @@ -46,6 +46,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.nio.FloatBuffer; +#if PRE_MC_1_17_1 +import org.lwjgl.opengl.GL15; +#endif + + /** * This class is used to mix in my rendering code * before Minecraft starts rendering blocks. @@ -75,43 +80,18 @@ public class MixinLevelRenderer #if PRE_MC_1_17_1 @Inject(at = @At("RETURN"), method = "renderSky(Lcom/mojang/blaze3d/vertex/PoseStack;F)V") private void renderSky(PoseStack matrixStackIn, float partialTicks, CallbackInfo callback) + #else + @Inject(method = "renderClouds", at = @At("HEAD"), cancellable = true) + public void renderClouds(PoseStack poseStack, Matrix4f projectionMatrix, float partialTicks, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) + #endif { // get the partial ticks since renderBlockLayer doesn't // have access to them previousPartialTicks = partialTicks; } - - @Inject(at = @At("HEAD"), - method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V", - cancellable = true) - private void renderChunkLayer(RenderType renderType, PoseStack matrixStackIn, double xIn, double yIn, double zIn, CallbackInfo callback) - { - // only render before solid blocks - if (renderType.equals(RenderType.solid())) - { - // get MC's current projection matrix - float[] mcProjMatrixRaw = new float[16]; - GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw); - Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); - mcProjectionMatrix.transpose(); - Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); - - ClientApi.INSTANCE.renderLods(LevelWrapper.getWorldWrapper(level), mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); - } - if (Config.Client.Advanced.lodOnlyMode.get()) { - callback.cancel(); - } - } - #else - @Inject(method = "renderClouds", at = @At("HEAD"), cancellable = true) - public void renderClouds(PoseStack poseStack, Matrix4f projectionMatrix, float tickDelta, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { - // get the partial ticks since renderChunkLayer doesn't - // have access to them - previousPartialTicks = tickDelta; - } - #endif - - // TODO: Can we move this o forge's client proxy simmilar to how fabric does it + + + // TODO: Can we move this to forge's client proxy similarly to how fabric does it #if PRE_MC_1_17_1 @Inject(at = @At("HEAD"), method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V", @@ -129,20 +109,44 @@ public class MixinLevelRenderer private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback) #endif { + // get MC's model view and projection matrices + #if MC_1_16_5 + // get the matrices from the OpenGL fixed pipeline + float[] mcProjMatrixRaw = new float[16]; + GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw); + Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); + mcProjectionMatrix.transpose(); + + Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); + + #else + // get the matrices directly from MC + Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); + Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); + #endif + + + // only render before solid blocks if (renderType.equals(RenderType.solid())) { - Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); - Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); - ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(level), mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); // experimental proof-of-concept option if (Config.Client.Advanced.Graphics.AdvancedGraphics.seamlessOverdraw.get()) { - float[] matrixFloatArray = SeamlessOverdraw.overwriteMinecraftNearFarClipPlanes(projectionMatrix, previousPartialTicks); + float[] matrixFloatArray = SeamlessOverdraw.overwriteMinecraftNearFarClipPlanes(mcProjectionMatrix, previousPartialTicks); - #if PRE_MC_1_19_4 + #if MC_1_16_5 + int glMatrixMode = GL15.glGetInteger(GL15.GL_MATRIX_MODE); + GL15.glMatrixMode(GL15.GL_PROJECTION); + + GL15.glPopMatrix(); + GL15.glPushMatrix(); + GL15.glLoadMatrixf(matrixFloatArray); + + GL15.glMatrixMode(glMatrixMode); + #elif PRE_MC_1_19_4 projectionMatrix.load(FloatBuffer.wrap(matrixFloatArray)); #else projectionMatrix.set(matrixFloatArray);