From 97a42da31276a7ee80cccd8d4dc26baf149ddf1f Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Sat, 17 Oct 2026 13:00:45 +0100 Subject: [PATCH] fix(glass): render context bug Closes: #340 --- .../projection/ProjectionLevelRenderer.java | 18 +++-- .../imb11/platform/LevelRenderContexts.java | 72 +++++++++++++++++++ 2 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 glass/src/main/java/dev/imb11/platform/LevelRenderContexts.java diff --git a/glass/src/main/java/dev/imb11/client/renderer/projection/ProjectionLevelRenderer.java b/glass/src/main/java/dev/imb11/client/renderer/projection/ProjectionLevelRenderer.java index 6a5146b..04aea07 100644 --- a/glass/src/main/java/dev/imb11/client/renderer/projection/ProjectionLevelRenderer.java +++ b/glass/src/main/java/dev/imb11/client/renderer/projection/ProjectionLevelRenderer.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.ProjectionType; import dev.imb11.client.compat.IrisCompatibility; import dev.imb11.mixins.LevelRendererBufferAccessor; +import dev.imb11.platform.LevelRenderContexts; import net.minecraft.client.Minecraft; import net.minecraft.client.DeltaTracker; import net.minecraft.client.SectionUpdateTracker; @@ -367,10 +368,12 @@ private void renderProjectionLevel(FogRenderer fog, DeltaTracker delta, GpuBuffe var terrainFog = fog.getBuffer(FogRenderer.FogMode.WORLD); var modelView = RenderSystem.getModelViewStack(); modelView.pushMatrix(); - modelView.mul(camera.viewRotationMatrix); - access.glass$submitFeatures(levelState, access.glass$submitNodeStorage(), false); - FeatureRenderDispatcher.PreparedFrame featureFrame = features.prepareFrame(access.glass$submitNodeStorage()); + FeatureRenderDispatcher.PreparedFrame featureFrame = null; try { + modelView.mul(camera.viewRotationMatrix); + LevelRenderContexts.prepare(this, levelState, access.glass$submitNodeStorage()); + access.glass$submitFeatures(levelState, access.glass$submitNodeStorage(), false); + featureFrame = features.prepareFrame(access.glass$submitNodeStorage()); var frame = new FrameGraphBuilder(); var target = minecraft.gameRenderer.mainRenderTarget(); targets.main = frame.importExternal("main", target); @@ -385,8 +388,9 @@ private void renderProjectionLevel(FogRenderer fog, DeltaTracker delta, GpuBuffe useProjection(frame, targets, "glass_sky_projection", skyProjection); access.glass$skyPass(frame, camera, terrainFog); useProjection(frame, targets, "glass_scene_projection", sceneProjection); - access.glass$mainPass(frame, featureFrame, terrainFog, levelState, Profiler.get(), - prepareChunkRenders(camera.viewRotationMatrix)); + ChunkSectionsToRender chunks = prepareChunkRenders(camera.viewRotationMatrix); + LevelRenderContexts.setSectionsToRender(this, chunks); + access.glass$mainPass(frame, featureFrame, terrainFog, levelState, Profiler.get(), chunks); if (state.optionsRenderState.cloudStatus != CloudStatus.OFF && ARGB.alpha(levelState.cloudColor) > 0) { access.glass$cloudsPass(frame, state.optionsRenderState.cloudStatus, camera.pos, levelState.gameTime, delta.getGameTimeDeltaPartialTick(false), levelState.cloudColor, levelState.cloudHeight, @@ -396,7 +400,9 @@ private void renderProjectionLevel(FogRenderer fog, DeltaTracker delta, GpuBuffe IrisCompatibility.renderWithPipeline(this, () -> frame.execute(GraphicsResourceAllocator.UNPOOLED)); } finally { targets.clear(); - featureFrame.close(); + if (featureFrame != null) { + featureFrame.close(); + } modelView.popMatrix(); levelState.reset(); } diff --git a/glass/src/main/java/dev/imb11/platform/LevelRenderContexts.java b/glass/src/main/java/dev/imb11/platform/LevelRenderContexts.java new file mode 100644 index 0000000..805c286 --- /dev/null +++ b/glass/src/main/java/dev/imb11/platform/LevelRenderContexts.java @@ -0,0 +1,72 @@ +//? if fabric { +package dev.imb11.platform; + +import net.fabricmc.fabric.impl.client.rendering.level.LevelRenderContextImpl; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.state.level.LevelRenderState; + +import java.lang.reflect.Field; + +public final class LevelRenderContexts { + private static final Field CONTEXT = findContextField(); + + private LevelRenderContexts() { + } + + public static void prepare(LevelRenderer renderer, LevelRenderState state, SubmitNodeCollector collector) { + LevelRenderContextImpl context = context(renderer); + if (context != null) { + context.prepare(Minecraft.getInstance().gameRenderer, renderer, state, collector); + } + } + + public static void setSectionsToRender(LevelRenderer renderer, ChunkSectionsToRender sections) { + LevelRenderContextImpl context = context(renderer); + if (context != null) { + context.setSectionsToRender(sections); + } + } + + private static LevelRenderContextImpl context(LevelRenderer renderer) { + if (CONTEXT == null) { + return null; + } + try { + return (LevelRenderContextImpl) CONTEXT.get(renderer); + } catch (IllegalAccessException e) { + return null; + } + } + + private static Field findContextField() { + for (Field field : LevelRenderer.class.getDeclaredFields()) { + if (field.getType() == LevelRenderContextImpl.class) { + field.setAccessible(true); + return field; + } + } + return null; + } +} +//?} else { +/*package dev.imb11.platform; + +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.state.level.LevelRenderState; + +public final class LevelRenderContexts { + private LevelRenderContexts() { + } + + public static void prepare(LevelRenderer renderer, LevelRenderState state, SubmitNodeCollector collector) { + } + + public static void setSectionsToRender(LevelRenderer renderer, ChunkSectionsToRender sections) { + } +} +*///?}