From 34caf07d8c0210132e9bd1752c32fff6d9206ddb Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Tue, 7 Oct 2025 13:21:15 +1000 Subject: [PATCH] Add occlusion debug util --- .../me/cortex/voxy/client/VoxyClient.java | 8 ++++++ .../client/core/AbstractRenderPipeline.java | 12 ++++++--- .../voxy/client/core/VoxyRenderSystem.java | 7 +++-- .../sodium/MixinDefaultChunkRenderer.java | 27 ++++++++++++++++++- 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/main/java/me/cortex/voxy/client/VoxyClient.java b/src/main/java/me/cortex/voxy/client/VoxyClient.java index af8aceed..5b157f19 100644 --- a/src/main/java/me/cortex/voxy/client/VoxyClient.java +++ b/src/main/java/me/cortex/voxy/client/VoxyClient.java @@ -59,4 +59,12 @@ public class VoxyClient implements ClientModInitializer { public static boolean isFrexActive() { return !FREX.isEmpty(); } + + public static int getOcclusionDebugState() { + return 0; + } + + public static boolean disableSodiumChunkRender() { + return getOcclusionDebugState() != 0; + } } \ No newline at end of file diff --git a/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java b/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java index 3ead8118..797965ff 100644 --- a/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java +++ b/src/main/java/me/cortex/voxy/client/core/AbstractRenderPipeline.java @@ -2,7 +2,7 @@ package me.cortex.voxy.client.core; import me.cortex.voxy.client.RenderStatistics; import me.cortex.voxy.client.TimingStatistics; -import me.cortex.voxy.client.core.gl.Capabilities; +import me.cortex.voxy.client.VoxyClient; import me.cortex.voxy.client.core.model.ModelBakerySubsystem; import me.cortex.voxy.client.core.rendering.Viewport; import me.cortex.voxy.client.core.rendering.hierachical.AsyncNodeManager; @@ -12,6 +12,7 @@ import me.cortex.voxy.client.core.rendering.post.FullscreenBlit; import me.cortex.voxy.client.core.rendering.section.AbstractSectionRenderer; import me.cortex.voxy.client.core.rendering.util.DownloadStream; import me.cortex.voxy.common.util.TrackedObject; +import me.cortex.voxy.commonImpl.VoxyCommon; import org.joml.Matrix4f; import org.lwjgl.opengl.GL30; import org.lwjgl.system.MemoryUtil; @@ -86,8 +87,13 @@ public abstract class AbstractRenderPipeline extends TrackedObject { var rs = ((AbstractSectionRenderer)this.sectionRenderer); rs.renderOpaque(viewport); - this.innerPrimaryWork(viewport, depthTexture); - rs.buildDrawCalls(viewport); + var occlusionDebug = VoxyClient.getOcclusionDebugState(); + if (occlusionDebug==0) { + this.innerPrimaryWork(viewport, depthTexture); + } + if (occlusionDebug<=1) { + rs.buildDrawCalls(viewport); + } rs.renderTemporal(viewport); this.postOpaquePreTranslucent(viewport); diff --git a/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java b/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java index 704fa47c..98b81fc8 100644 --- a/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java +++ b/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java @@ -197,7 +197,10 @@ public class VoxyRenderSystem { .setScreenSize(width, height) .setFogParameters(fogParameters) .update(); - viewport.frameId++; + + if (VoxyClient.getOcclusionDebugState()==0) { + viewport.frameId++; + } return viewport; } @@ -240,7 +243,7 @@ public class VoxyRenderSystem { this.pipeline.preSetup(viewport); TimingStatistics.E.start(); - if (!IrisUtil.irisShadowActive()) { + if ((!VoxyClient.disableSodiumChunkRender())&&!IrisUtil.irisShadowActive()) { this.chunkBoundRenderer.render(viewport); } else { viewport.depthBoundingBuffer.clear(0); diff --git a/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinDefaultChunkRenderer.java b/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinDefaultChunkRenderer.java index 71326bb8..cd285385 100644 --- a/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinDefaultChunkRenderer.java +++ b/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinDefaultChunkRenderer.java @@ -1,27 +1,52 @@ package me.cortex.voxy.client.mixin.sodium; +import me.cortex.voxy.client.VoxyClient; import me.cortex.voxy.client.core.IGetVoxyRenderSystem; import me.cortex.voxy.client.core.rendering.Viewport; import me.cortex.voxy.client.core.util.IrisUtil; +import me.cortex.voxy.commonImpl.VoxyCommon; import net.caffeinemc.mods.sodium.client.gl.device.CommandList; +import net.caffeinemc.mods.sodium.client.gl.device.RenderDevice; import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; import net.caffeinemc.mods.sodium.client.render.chunk.DefaultChunkRenderer; +import net.caffeinemc.mods.sodium.client.render.chunk.ShaderChunkRenderer; import net.caffeinemc.mods.sodium.client.render.chunk.lists.ChunkRenderListIterable; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.ChunkVertexType; import net.caffeinemc.mods.sodium.client.render.viewport.CameraTransform; import net.caffeinemc.mods.sodium.client.util.FogParameters; import net.minecraft.client.MinecraftClient; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = DefaultChunkRenderer.class, remap = false) -public class MixinDefaultChunkRenderer { +public abstract class MixinDefaultChunkRenderer extends ShaderChunkRenderer { + + public MixinDefaultChunkRenderer(RenderDevice device, ChunkVertexType vertexType) { + super(device, vertexType); + } + + @Inject(method = "render", at = @At(value = "HEAD"), cancellable = true) + private void cancelThingie(ChunkRenderMatrices matrices, CommandList commandList, ChunkRenderListIterable renderLists, TerrainRenderPass renderPass, CameraTransform camera, FogParameters fogParameters, boolean indexedRenderingEnabled, CallbackInfo ci) { + if (VoxyClient.disableSodiumChunkRender()) { + super.begin(renderPass, fogParameters); + this.doRender(matrices, renderPass, camera, fogParameters); + super.end(renderPass); + ci.cancel(); + } + } @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/ShaderChunkRenderer;end(Lnet/caffeinemc/mods/sodium/client/render/chunk/terrain/TerrainRenderPass;)V", shift = At.Shift.BEFORE)) private void injectRender(ChunkRenderMatrices matrices, CommandList commandList, ChunkRenderListIterable renderLists, TerrainRenderPass renderPass, CameraTransform camera, FogParameters fogParameters, boolean indexedRenderingEnabled, CallbackInfo ci) { + this.doRender(matrices, renderPass, camera, fogParameters); + } + + @Unique + private void doRender(ChunkRenderMatrices matrices, TerrainRenderPass renderPass, CameraTransform camera, FogParameters fogParameters) { if (renderPass == DefaultTerrainRenderPasses.CUTOUT) { var renderer = ((IGetVoxyRenderSystem) MinecraftClient.getInstance().worldRenderer).getVoxyRenderSystem(); if (renderer != null) {