Add occlusion debug util

This commit is contained in:
mcrcortex
2025-10-07 13:21:15 +10:00
parent ab1c8b0f71
commit 34caf07d8c
4 changed files with 48 additions and 6 deletions

View File

@@ -59,4 +59,12 @@ public class VoxyClient implements ClientModInitializer {
public static boolean isFrexActive() { public static boolean isFrexActive() {
return !FREX.isEmpty(); return !FREX.isEmpty();
} }
public static int getOcclusionDebugState() {
return 0;
}
public static boolean disableSodiumChunkRender() {
return getOcclusionDebugState() != 0;
}
} }

View File

@@ -2,7 +2,7 @@ package me.cortex.voxy.client.core;
import me.cortex.voxy.client.RenderStatistics; import me.cortex.voxy.client.RenderStatistics;
import me.cortex.voxy.client.TimingStatistics; 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.model.ModelBakerySubsystem;
import me.cortex.voxy.client.core.rendering.Viewport; import me.cortex.voxy.client.core.rendering.Viewport;
import me.cortex.voxy.client.core.rendering.hierachical.AsyncNodeManager; 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.section.AbstractSectionRenderer;
import me.cortex.voxy.client.core.rendering.util.DownloadStream; import me.cortex.voxy.client.core.rendering.util.DownloadStream;
import me.cortex.voxy.common.util.TrackedObject; import me.cortex.voxy.common.util.TrackedObject;
import me.cortex.voxy.commonImpl.VoxyCommon;
import org.joml.Matrix4f; import org.joml.Matrix4f;
import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL30;
import org.lwjgl.system.MemoryUtil; import org.lwjgl.system.MemoryUtil;
@@ -86,8 +87,13 @@ public abstract class AbstractRenderPipeline extends TrackedObject {
var rs = ((AbstractSectionRenderer)this.sectionRenderer); var rs = ((AbstractSectionRenderer)this.sectionRenderer);
rs.renderOpaque(viewport); rs.renderOpaque(viewport);
this.innerPrimaryWork(viewport, depthTexture); var occlusionDebug = VoxyClient.getOcclusionDebugState();
rs.buildDrawCalls(viewport); if (occlusionDebug==0) {
this.innerPrimaryWork(viewport, depthTexture);
}
if (occlusionDebug<=1) {
rs.buildDrawCalls(viewport);
}
rs.renderTemporal(viewport); rs.renderTemporal(viewport);
this.postOpaquePreTranslucent(viewport); this.postOpaquePreTranslucent(viewport);

View File

@@ -197,7 +197,10 @@ public class VoxyRenderSystem {
.setScreenSize(width, height) .setScreenSize(width, height)
.setFogParameters(fogParameters) .setFogParameters(fogParameters)
.update(); .update();
viewport.frameId++;
if (VoxyClient.getOcclusionDebugState()==0) {
viewport.frameId++;
}
return viewport; return viewport;
} }
@@ -240,7 +243,7 @@ public class VoxyRenderSystem {
this.pipeline.preSetup(viewport); this.pipeline.preSetup(viewport);
TimingStatistics.E.start(); TimingStatistics.E.start();
if (!IrisUtil.irisShadowActive()) { if ((!VoxyClient.disableSodiumChunkRender())&&!IrisUtil.irisShadowActive()) {
this.chunkBoundRenderer.render(viewport); this.chunkBoundRenderer.render(viewport);
} else { } else {
viewport.depthBoundingBuffer.clear(0); viewport.depthBoundingBuffer.clear(0);

View File

@@ -1,27 +1,52 @@
package me.cortex.voxy.client.mixin.sodium; 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.IGetVoxyRenderSystem;
import me.cortex.voxy.client.core.rendering.Viewport; import me.cortex.voxy.client.core.rendering.Viewport;
import me.cortex.voxy.client.core.util.IrisUtil; 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.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.ChunkRenderMatrices;
import net.caffeinemc.mods.sodium.client.render.chunk.DefaultChunkRenderer; 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.lists.ChunkRenderListIterable;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; 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.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.render.viewport.CameraTransform;
import net.caffeinemc.mods.sodium.client.util.FogParameters; import net.caffeinemc.mods.sodium.client.util.FogParameters;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import org.spongepowered.asm.mixin.Mixin; 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.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(value = DefaultChunkRenderer.class, remap = false) @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)) @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) { 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) { if (renderPass == DefaultTerrainRenderPasses.CUTOUT) {
var renderer = ((IGetVoxyRenderSystem) MinecraftClient.getInstance().worldRenderer).getVoxyRenderSystem(); var renderer = ((IGetVoxyRenderSystem) MinecraftClient.getInstance().worldRenderer).getVoxyRenderSystem();
if (renderer != null) { if (renderer != null) {