From 1b5c787b3ac87abd9b44ecab6a76e46408fdfec1 Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Thu, 8 May 2025 16:00:14 +1000 Subject: [PATCH] match sodium culling --- .../voxy/client/core/model/ModelFactory.java | 2 ++ .../client/core/rendering/ChunkBoundRenderer.java | 13 ++++++++++--- .../mixin/sodium/MixinRenderSectionManager.java | 3 ++- .../assets/voxy/shaders/chunkoutline/outline.vsh | 14 +++++++++++++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/me/cortex/voxy/client/core/model/ModelFactory.java b/src/main/java/me/cortex/voxy/client/core/model/ModelFactory.java index ed7af43a..1f44fb26 100644 --- a/src/main/java/me/cortex/voxy/client/core/model/ModelFactory.java +++ b/src/main/java/me/cortex/voxy/client/core/model/ModelFactory.java @@ -359,6 +359,7 @@ public class ModelFactory { boolean faceCoversFullBlock = faceSize[0] == 0 && faceSize[2] == 0 && faceSize[1] == (MODEL_TEXTURE_SIZE-1) && faceSize[3] == (MODEL_TEXTURE_SIZE-1); + //TODO: use faceSize and the depths to compute if mesh can be correctly rendered metadata |= faceCoversFullBlock?2:0; @@ -660,6 +661,7 @@ public class ModelFactory { return this.metadataCache[clientId]; } + //TODO: redo to batch blit, instead of 6 seperate blits, and also fix mipping private void putTextures(int id, ColourDepthTextureData[] textures) { int X = (id&0xFF) * MODEL_TEXTURE_SIZE*3; int Y = ((id>>8)&0xFF) * MODEL_TEXTURE_SIZE*2; diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/ChunkBoundRenderer.java b/src/main/java/me/cortex/voxy/client/core/rendering/ChunkBoundRenderer.java index 3f1476cf..0983b307 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/ChunkBoundRenderer.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/ChunkBoundRenderer.java @@ -14,6 +14,7 @@ import me.cortex.voxy.client.core.rendering.util.UploadStream; import me.cortex.voxy.common.Logger; import net.minecraft.util.math.MathHelper; import org.joml.Matrix4f; +import org.joml.Vector3f; import org.joml.Vector3i; import org.lwjgl.system.MemoryUtil; @@ -84,17 +85,23 @@ public class ChunkBoundRenderer { long ptr = UploadStream.INSTANCE.upload(this.uniformBuffer, 0, 128); long matPtr = ptr; ptr += 4*4*4; + + final float renderDistance = 32*16; {//This is recomputed to be in chunk section space not worldsection int sx = MathHelper.floor(viewport.cameraX) >> 4; int sy = MathHelper.floor(viewport.cameraY) >> 4; int sz = MathHelper.floor(viewport.cameraZ) >> 4; new Vector3i(sx, sy, sz).getToAddress(ptr); ptr += 4*4; - viewport.MVP.translate( + var negInnerSec = new Vector3f( -(float) (viewport.cameraX - (sx << 4)), -(float) (viewport.cameraY - (sy << 4)), - -(float) (viewport.cameraZ - (sz << 4)), - new Matrix4f()).getToAddress(matPtr); + -(float) (viewport.cameraZ - (sz << 4))); + + viewport.MVP.translate(negInnerSec, new Matrix4f()).getToAddress(matPtr); + + negInnerSec.getToAddress(ptr); ptr += 4*3; + MemoryUtil.memPutFloat(ptr, renderDistance); ptr += 4; } UploadStream.INSTANCE.commit(); diff --git a/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinRenderSectionManager.java b/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinRenderSectionManager.java index 755f9ea8..99263614 100644 --- a/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinRenderSectionManager.java +++ b/src/main/java/me/cortex/voxy/client/mixin/sodium/MixinRenderSectionManager.java @@ -101,11 +101,12 @@ public class MixinRenderSectionManager { return true; } + /* @ModifyReturnValue(method = "getSearchDistance", at = @At("RETURN")) private float voxy$increaseSearchDistanceFix(float searchDistance) { if (((IGetVoxyRenderSystem)(this.level.worldRenderer)).getVoxyRenderSystem() == null) { return searchDistance; } return searchDistance + 32; - } + }*/ } diff --git a/src/main/resources/assets/voxy/shaders/chunkoutline/outline.vsh b/src/main/resources/assets/voxy/shaders/chunkoutline/outline.vsh index 4a85dcef..651085de 100644 --- a/src/main/resources/assets/voxy/shaders/chunkoutline/outline.vsh +++ b/src/main/resources/assets/voxy/shaders/chunkoutline/outline.vsh @@ -1,9 +1,9 @@ #version 460 -layout(location = 0) out vec2 uv; layout(binding = 0, std140) uniform SceneUniform { mat4 MVP; ivec4 section; + vec4 negInnerSec; }; layout(binding = 1, std430) restrict readonly buffer ChunkPosBuffer { @@ -14,12 +14,24 @@ ivec3 unpackPos(ivec2 pos) { return ivec3(pos.y>>10, (pos.x<<12)>>12, ((pos.y<<22)|int(uint(pos.x)>>10))>>10); } +bool shouldRender(ivec3 icorner) { + vec3 corner = vec3(icorner*16)+negInnerSec.xyz; + //closest point TODO: OPTIMIZE + corner = mix(mix(vec3(0), corner, lessThan(vec3(0), corner)), corner+16, lessThan(corner+16, vec3(0))); + return (corner.x*corner.x + corner.z*corner.z < negInnerSec.w*negInnerSec.w) && abs(corner.y) < negInnerSec.w; +} + void main() { uint id = (gl_InstanceID<<5)+gl_BaseInstance+(gl_VertexID>>3); ivec3 origin = unpackPos(chunkPos[id]); origin -= section.xyz; + if (!shouldRender(origin)) { + gl_Position = vec4(-100.0f, -100.0f, -100.0f, 0.0f); + return; + } + ivec3 cubeCornerI = ivec3(gl_VertexID&1, (gl_VertexID>>2)&1, (gl_VertexID>>1)&1); //Expand the y height to be big (will be +- 8192) //TODO: make it W.R.T world height and offsets