diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/DefaultGeometryManager.java b/src/main/java/me/cortex/voxy/client/core/rendering/DefaultGeometryManager.java index fd331661..ac685683 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/DefaultGeometryManager.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/DefaultGeometryManager.java @@ -24,11 +24,18 @@ public class DefaultGeometryManager extends AbstractGeometryManager { private final GlBuffer sectionMetaBuffer; private final BufferArena geometryBuffer; + private final int geometryElementSize; + public DefaultGeometryManager(long geometryBufferSize, int maxSections) { + this(geometryBufferSize, maxSections, 8);//8 is default quad size + } + + public DefaultGeometryManager(long geometryBufferSize, int maxSections, int elementSize) { super(maxSections); this.sectionMetaBuffer = new GlBuffer(((long) maxSections) * SECTION_METADATA_SIZE); - this.geometryBuffer = new BufferArena(geometryBufferSize, 8); + this.geometryBuffer = new BufferArena(geometryBufferSize, elementSize); this.pos2id.defaultReturnValue(-1); + this.geometryElementSize = elementSize; } IntArrayList uploadResults() { @@ -169,7 +176,7 @@ public class DefaultGeometryManager extends AbstractGeometryManager { System.err.println(msg); return null; } - return new SectionMeta(geometry.position, geometry.aabb, geometryPtr, (int) (geometry.geometryBuffer.size/8), geometry.offsets); + return new SectionMeta(geometry.position, geometry.aabb, geometryPtr, (int) (geometry.geometryBuffer.size/this.geometryElementSize), geometry.offsets); } protected void freeMeta(SectionMeta meta) { diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java b/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java index 7bf7be12..8019bb72 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java @@ -32,6 +32,13 @@ import static org.lwjgl.opengl.GL45C.nglClearNamedBufferData; import static org.lwjgl.opengl.NVMeshShader.glDrawMeshTasksNV; import static org.lwjgl.opengl.NVRepresentativeFragmentTest.GL_REPRESENTATIVE_FRAGMENT_TEST_NV; +//TODO: NOTE +// can do "meshlet compaction" +// that is, meshlets are refered not by the meshlet id but by an 8 byte alligned index, (the quad index) +// this means that non full meshlets can have the tailing data be truncated and used in the next meshlet +// as long as the number of quads in the meshlet is stored in the header +// the shader can cull the verticies of any quad that has its index over the expected quuad count +// this could potentially result in a fair bit of memory savings (especially if used in normal mc terrain rendering) public class Gl46MeshletsFarWorldRenderer extends AbstractFarWorldRenderer { private final Shader meshletGenerator = Shader.make() .add(ShaderType.COMPUTE, "voxy:lod/gl46mesh/cmdgen.comp") @@ -51,9 +58,9 @@ public class Gl46MeshletsFarWorldRenderer extends AbstractFarWorldRenderer