From a8d7424acb2d2ef59d5662120ee5e882ee3d66fb Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Tue, 21 Jul 2026 03:05:42 +0100 Subject: [PATCH 1/2] Disable Depth Writing within zones that have water --- .../rs117/hd/renderer/zone/ZoneRenderer.java | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java b/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java index 01c1f2f0a3..442cf41902 100644 --- a/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java +++ b/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java @@ -977,20 +977,29 @@ public void drawZoneAlpha(Projection entityProjection, Scene scene, int level, i } if (!sceneManager.isRoot(ctx) || z.inSceneFrustum) { - // Write color without depth writes - sceneCmd.DepthMask(false); - sceneCmd.ColorMask(true, true, true, true); - - z.renderAlpha(sceneCmd, zx - offset, zz - offset, level, ctx, false, false); - - // Write depth without color - sceneCmd.DepthMask(true); - sceneCmd.ColorMask(false, false, false, false); - - z.renderAlpha(sceneCmd, zx - offset, zz - offset, level, ctx, true, false); - - // Restore color writes - sceneCmd.ColorMask(true, true, true, true); + if(renderWater) { + // Water is currently drawn with depth writing & testing enabled, as such alpha models and the water plane + // can fight depending on the draw order, to avoid alpha models causing water to fail depth testing we disable + // depth writing for this zone + sceneCmd.DepthMask(false); + z.renderAlpha(sceneCmd, zx - offset, zz - offset, level, ctx, false, false); + sceneCmd.DepthMask(true); + } else { + // Write color without depth writes + sceneCmd.DepthMask(false); + sceneCmd.ColorMask(true, true, true, true); + + z.renderAlpha(sceneCmd, zx - offset, zz - offset, level, ctx, false, false); + + // Write depth without color + sceneCmd.DepthMask(true); + sceneCmd.ColorMask(false, false, false, false); + + z.renderAlpha(sceneCmd, zx - offset, zz - offset, level, ctx, true, false); + + // Restore color writes + sceneCmd.ColorMask(true, true, true, true); + } } } frameTimer.end(Timer.DRAW_ZONE_ALPHA); From 1f11fecbc30bf4792b2b588df93381fdfd5325c7 Mon Sep 17 00:00:00 2001 From: Hooder Date: Wed, 29 Jul 2026 19:37:52 +0200 Subject: [PATCH 2/2] Rephrase some comments --- .../java/rs117/hd/renderer/zone/ZoneRenderer.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java b/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java index 6b25ccd8e9..39c6412acf 100644 --- a/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java +++ b/src/main/java/rs117/hd/renderer/zone/ZoneRenderer.java @@ -978,24 +978,25 @@ public void drawZoneAlpha(Projection entityProjection, Scene scene, int level, i } if (!sceneManager.isRoot(ctx) || z.inSceneFrustum) { - if(renderWater) { - // Water is currently drawn with depth writing & testing enabled, as such alpha models and the water plane - // can fight depending on the draw order, to avoid alpha models causing water to fail depth testing we disable - // depth writing for this zone + if (renderWater) { + // Water is currently drawn with depth writes & depth testing enabled, and as such, alpha models and the water plane + // can Z-fight depending on draw order. To avoid alpha models above water causing the water surface to fail its + // depth test, we disable depth writes for alpha models and rely on correct back to front ordering of the zones sceneCmd.DepthMask(false); z.renderAlpha(sceneCmd, zx - offset, zz - offset, level, ctx, false, false); sceneCmd.DepthMask(true); } else { + // Draw alpha models in two passes, first blending colors correctly, then writing depth for subsequent opaque models + // to test against. This is necessary because opaque models on higher planes can be drawn later + // Write color without depth writes sceneCmd.DepthMask(false); sceneCmd.ColorMask(true, true, true, true); - z.renderAlpha(sceneCmd, zx - offset, zz - offset, level, ctx, false, false); // Write depth without color sceneCmd.DepthMask(true); sceneCmd.ColorMask(false, false, false, false); - z.renderAlpha(sceneCmd, zx - offset, zz - offset, level, ctx, true, false); // Restore color writes