diff --git a/src/main/java/me/cortex/voxelmon/core/VoxelCore.java b/src/main/java/me/cortex/voxelmon/core/VoxelCore.java index 5f4e08c6..05ce4090 100644 --- a/src/main/java/me/cortex/voxelmon/core/VoxelCore.java +++ b/src/main/java/me/cortex/voxelmon/core/VoxelCore.java @@ -73,17 +73,17 @@ public class VoxelCore { //Trigger the shared index buffer loading SharedIndexBuffer.INSTANCE.id(); this.renderer = new Gl46FarWorldRenderer(); - this.world = new WorldEngine(new File("storagefile.db"), 5, 20, 5);//"storagefile.db"//"ethoslab.db" + this.world = new WorldEngine(new File("storagefile2.db"), 5, 20, 5);//"storagefile.db"//"ethoslab.db" this.renderTracker = new RenderTracker(this.world, this.renderer); - this.renderGen = new RenderGenerationService(this.world,10, this.renderTracker::processBuildResult); + this.renderGen = new RenderGenerationService(this.world,5, this.renderTracker::processBuildResult); this.world.setRenderTracker(this.renderTracker); this.renderTracker.setRenderGen(this.renderGen); //To get to chunk scale multiply the scale by 2, the scale is after how many chunks does the lods halve this.distanceTracker = new DistanceTracker(this.renderTracker, 5, 16); - this.postProcessing = new PostProcessing(); + this.postProcessing = null;// = new PostProcessing(); this.world.getMapper().setCallbacks(this::stateUpdate, this::biomeUpdate); diff --git a/src/main/java/me/cortex/voxelmon/core/rendering/Gl46FarWorldRenderer.java b/src/main/java/me/cortex/voxelmon/core/rendering/Gl46FarWorldRenderer.java index 2610a22e..959f845a 100644 --- a/src/main/java/me/cortex/voxelmon/core/rendering/Gl46FarWorldRenderer.java +++ b/src/main/java/me/cortex/voxelmon/core/rendering/Gl46FarWorldRenderer.java @@ -80,23 +80,38 @@ public class Gl46FarWorldRenderer extends AbstractFarWorldRenderer { glBindVertexArray(this.vao); this.commandGen.bind(); - glDispatchCompute((this.geometry.getSectionCount()+127)/128, 1, 1); - glMemoryBarrier(GL_COMMAND_BARRIER_BIT|GL_SHADER_STORAGE_BARRIER_BIT|GL_UNIFORM_BARRIER_BIT); + glDispatchCompute((this.geometry.getSectionCount() + 127) / 128, 1, 1); + glMemoryBarrier(GL_COMMAND_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT | GL_UNIFORM_BARRIER_BIT); this.lodShader.bind(); - glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, 0, this.geometry.getSectionCount(), 0); + if (false) {//Bloody intel gpus + glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, 0, 1000, 0); + + //int count = this.geometry.getSectionCount()/1000; + //for (int i = 0; i < 10; i++) { + // glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, i*1000L*20, 1000, 0); + //} + //int rem = this.geometry.getSectionCount() - (count*1000); + //if (rem != 0) { + // glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, count*1000L*20, rem, 0); + //} + + } else { + //TODO: swap to a multidraw indirect counted + glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, 0, this.geometry.getSectionCount(), 0); + } //ARBIndirectParameters.glMultiDrawElementsIndirectCountARB( - glMemoryBarrier(GL_PIXEL_BUFFER_BARRIER_BIT|GL_FRAMEBUFFER_BARRIER_BIT); + glMemoryBarrier(GL_PIXEL_BUFFER_BARRIER_BIT | GL_FRAMEBUFFER_BARRIER_BIT); //TODO: add gpu occlusion culling here (after the lod drawing) (maybe, finish the rest of the PoC first) + + cullShader.bind(); - - glColorMask(false,false,false,false); + glColorMask(false, false, false, false); glDepthMask(false); - glDrawElementsInstanced(GL_TRIANGLES, 6*2*3, GL_UNSIGNED_BYTE, (1<<16)*6*2, this.geometry.getSectionCount()); + glDrawElementsInstanced(GL_TRIANGLES, 6 * 2 * 3, GL_UNSIGNED_BYTE, (1 << 16) * 6 * 2, this.geometry.getSectionCount()); glDepthMask(true); - glColorMask(true,true,true,true); - + glColorMask(true, true, true, true); glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); glBindVertexArray(0); diff --git a/src/main/java/me/cortex/voxelmon/core/rendering/building/RenderDataFactory.java b/src/main/java/me/cortex/voxelmon/core/rendering/building/RenderDataFactory.java index 481f8807..b9f1d37c 100644 --- a/src/main/java/me/cortex/voxelmon/core/rendering/building/RenderDataFactory.java +++ b/src/main/java/me/cortex/voxelmon/core/rendering/building/RenderDataFactory.java @@ -328,4 +328,5 @@ public class RenderDataFactory { this.outData.clear(); return new BuiltSectionGeometry(section.getKey(), output, null); } + } diff --git a/src/main/resources/assets/voxelmon/shaders/lod/gl46/bindings.glsl b/src/main/resources/assets/voxelmon/shaders/lod/gl46/bindings.glsl index c3d5cf3a..4bf335e5 100644 --- a/src/main/resources/assets/voxelmon/shaders/lod/gl46/bindings.glsl +++ b/src/main/resources/assets/voxelmon/shaders/lod/gl46/bindings.glsl @@ -70,5 +70,8 @@ layout(binding = 7, std430) readonly restrict buffer LightingBuffer { }; vec4 getLighting(uint index) { - return vec4((uvec4(lightData[index])>>uvec4(16,8,0,24))&uvec4(0xFF))*vec4(1f/255.0f); + uvec4 arr = uvec4(lightData[index]); + arr = arr>>uvec4(16,8,0,24); + arr = arr & uvec4(0xFF); + return vec4(arr)*vec4(1.0f/255.0f); } diff --git a/src/main/resources/assets/voxelmon/shaders/lod/gl46/cmdgen.comp b/src/main/resources/assets/voxelmon/shaders/lod/gl46/cmdgen.comp index 013a7015..74734305 100644 --- a/src/main/resources/assets/voxelmon/shaders/lod/gl46/cmdgen.comp +++ b/src/main/resources/assets/voxelmon/shaders/lod/gl46/cmdgen.comp @@ -26,6 +26,9 @@ uint encodeLocalLodPos(uint detail, ivec3 pos) { return (detail<<29)|(detla.x<<20)|(detla.y<<11)|(detla.z<<2); } + +//TODO: swap to a multidraw indirect counted + void main() { if (gl_GlobalInvocationID.x >= sectionCount) { return; @@ -37,16 +40,14 @@ void main() { vec3 cornerPos = vec3(((ipos<>(shift))&((1u<<(amountBits))-1)) +//#define Eu32(data, amountBits, shift) (uint((data)>>(shift))&((1u<<(amountBits))-1)) + +uint Eu32v(ivec2 data, int amount, int shift) { + if (shift > 31) { + shift -= 32; + return (uint(data.y)>>uint(shift))&((1u<>uint(shift))&((1u<