diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java index 5b7734a713..5f52e946ab 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java @@ -35,6 +35,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.util.profiling.Profiler; import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -116,14 +117,18 @@ public ChunkBuildOutput execute(ChunkBuildContext buildContext, CancellationToke for (int z = minZ; z < maxZ; z++) { for (int x = minX; x < maxX; x++) { BlockState blockState = slice.getBlockState(x, y, z); + blockPos.set(x, y, z); if (blockState.isAir() && !blockState.hasBlockEntity()) { + MemoryUtil.memPutInt(addr + (to1D(x & 15, y & 15, z & 15) * 8), 0); + MemoryUtil.memPutInt(addr + (to1D(x & 15, y & 15, z & 15) * 8) + 4, cache.getWorldSlice().getBrightness(LightLayer.SKY, blockPos)); + continue; } - blockPos.set(x, y, z); modelOffset.set(x & 15, y & 15, z & 15); - MemoryUtil.memPutInt(addr + (to1D(x & 15, y & 15, z & 15) * Integer.BYTES), 1); + MemoryUtil.memPutInt(addr + (to1D(x & 15, y & 15, z & 15) * 8), 1); + MemoryUtil.memPutInt(addr + (to1D(x & 15, y & 15, z & 15) * 8) + 4, cache.getWorldSlice().getBrightness(LightLayer.SKY, blockPos)); if (blockState.getRenderShape() == RenderShape.MODEL) { BakedModel model = cache.getBlockModels() diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegionManager.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegionManager.java index a7a008eb7c..676ad30740 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegionManager.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegionManager.java @@ -38,6 +38,7 @@ public class RenderRegionManager { private final StagingBuffer stagingBuffer; private final GlBufferArena voxelArena; + private PendingSectionVoxelUpload upcomingUpload; public RenderRegionManager(CommandList commandList) { this.stagingBuffer = createStagingBuffer(commandList); @@ -66,6 +67,26 @@ public void update() { } } } + + if (this.upcomingUpload != null) { + PendingSectionVoxelUpload upload = this.upcomingUpload; + this.upcomingUpload = null; + GL46C.glFinish(); + System.out.println("Chunk " + upload.section.toString()); + long addr = MemoryUtil.nmemAlloc(32768); + GL46C.nglGetNamedBufferSubData(voxelArena.getBufferObject().handle(), upload.upload.getResult().getOffset() * 32768, 32768, addr); + GL46C.glFinish(); + DefaultShaderInterface.VOXEL = (int) (upload.upload.getResult().getOffset()); + for (int x = 0; x < 4096; x++) { + boolean hasBlock = MemoryUtil.memGetInt(addr + (x * 8)) != 0; + int[] v = to3D(x); + if (!hasBlock) { + System.out.println("Block " + (upload.section.getOriginX() + v[0]) + ", " + (upload.section.getOriginY() + v[1]) + ", " + (upload.section.getOriginZ() + v[2]) + " is missing"); + } else { + System.out.println("Block " + (upload.section.getOriginX() + v[0]) + ", " + (upload.section.getOriginY() + v[1]) + ", " + (upload.section.getOriginZ() + v[2]) + " exists"); + } + } + } } public void uploadResults(CommandList commandList, Collection results) { @@ -173,15 +194,7 @@ private void uploadResults(CommandList commandList, RenderRegion region, Collect // Collect the upload results for (PendingSectionVoxelUpload upload : voxelUpload) { if (SectionPos.of(Minecraft.getInstance().player.blockPosition()).equals(SectionPos.of(upload.section.getChunkX(), upload.section.getChunkY(), upload.section.getChunkZ()))) { - System.out.println("Chunk " + upload.section.toString()); - DefaultShaderInterface.VOXEL = (int) upload.upload.getResult().getOffset(); - for (int x = 0; x < 4096; x++) { - boolean hasBlock = MemoryUtil.memGetInt(upload.data.getAddress() + (x * 4)) != 0; - if (!hasBlock) { - int[] v = to3D(x); - System.out.println("Block " + (upload.section.getOriginX() + v[0]) + ", " + (upload.section.getOriginY() + v[1]) + ", " + (upload.section.getOriginZ() + v[2]) + " is missing"); - } - } + this.upcomingUpload = upload; } upload.section.setVoxelOffset(upload.upload.getResult().getOffset()); diff --git a/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.fsh b/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.fsh index 2501125c6d..06ef2fa711 100644 --- a/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.fsh +++ b/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.fsh @@ -3,7 +3,7 @@ #import struct Chunk { - uint blocks[4096]; + uvec2 blocks[4096]; }; layout(binding = 8, std430) buffer Voxels { @@ -43,8 +43,8 @@ void main() { } #endif - if (ids[u_Test].blocks[to1D(11, 15, 5)] == 0u) { - fragColor = diffuseColor.rrra; + if (ids[u_Test].blocks[to1D(10, 4, 3)].y > 10u) { + fragColor = v_Color; } else { fragColor = _linearFog(diffuseColor, v_FragDistance, u_FogColor, u_FogStart, u_FogEnd);