diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index c5ee4dea..3f8eea1d 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1355,6 +1355,7 @@ Fix TextureInstancedActor packing data texture incorrectly (column major instead Grass height variance with control from ui + file Fix block mesh ray casting bug due to trimesh overlap Fix block mesh samplers incorrectly buffering +Fix block mesh gen algorithm merging quads incorrectly diff --git a/src/main/java/electrosphere/net/client/protocol/TerrainProtocol.java b/src/main/java/electrosphere/net/client/protocol/TerrainProtocol.java index c0298cc7..4671c389 100644 --- a/src/main/java/electrosphere/net/client/protocol/TerrainProtocol.java +++ b/src/main/java/electrosphere/net/client/protocol/TerrainProtocol.java @@ -208,7 +208,6 @@ public class TerrainProtocol implements ClientProtocolTemplate { if(Globals.clientBlockManager.containsChunkDataAtWorldPoint(worldPos.x, worldPos.y, worldPos.z, ChunkData.NO_STRIDE)){ BlockChunkData data = Globals.clientBlockManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y, worldPos.z, ChunkData.NO_STRIDE); if(data != null){ - System.out.println("Set " + message.getvoxelX() + " " + message.getvoxelY() + " " + message.getvoxelZ() + " to " + message.getblockType()); data.setType( message.getvoxelX(), message.getvoxelY(), diff --git a/src/main/java/electrosphere/renderer/meshgen/BlockMeshgen.java b/src/main/java/electrosphere/renderer/meshgen/BlockMeshgen.java index 2fade580..872e2341 100644 --- a/src/main/java/electrosphere/renderer/meshgen/BlockMeshgen.java +++ b/src/main/java/electrosphere/renderer/meshgen/BlockMeshgen.java @@ -82,7 +82,7 @@ public class BlockMeshgen { currentQuad.h = y - currentQuad.y; //check if should merge with previous quad for(QuadMesh prevMesh : quadMeshes){ - if(prevMesh.x + prevMesh.w == currentQuad.x && prevMesh.y == currentQuad.y && prevMesh.h == currentQuad.h){ + if(prevMesh.x + prevMesh.w == currentQuad.x && prevMesh.y == currentQuad.y && prevMesh.h == currentQuad.h && prevMesh.z == currentQuad.z){ prevMesh.w = prevMesh.w + 1; currentQuad = null; break; diff --git a/src/test/java/electrosphere/renderer/meshgen/BlockMeshgenTests.java b/src/test/java/electrosphere/renderer/meshgen/BlockMeshgenTests.java index 9490332e..56b263d5 100644 --- a/src/test/java/electrosphere/renderer/meshgen/BlockMeshgenTests.java +++ b/src/test/java/electrosphere/renderer/meshgen/BlockMeshgenTests.java @@ -193,6 +193,47 @@ public class BlockMeshgenTests { assertEquals(0, quadMeshes.size()); } + @UnitTest + public void test_fillQuadMeshes_6(){ + //expected data + QuadMesh[] expectedData = new QuadMesh[]{ + new QuadMesh(5,0,8,1,1,1), + new QuadMesh(8,0,8,1,1,1), + new QuadMesh(7,0,4,1,1,1), + }; + + //setup data + BlockChunkData chunkData = new BlockChunkData(); + short[] types = new short[BlockChunkData.CHUNK_DATA_WIDTH * BlockChunkData.CHUNK_DATA_WIDTH * BlockChunkData.CHUNK_DATA_WIDTH]; + chunkData.setType(types); + chunkData.setType(5, 0, 8, (short)1); + chunkData.setType(8, 0, 8, (short)1); + chunkData.setType(7, 0, 4, (short)1); + List quadMeshes = new LinkedList(); + + //call + BlockMeshgen.fillQuadMeshes(quadMeshes, chunkData); + + + //error check result + assertEquals(expectedData.length, quadMeshes.size()); + + for(QuadMesh expected : expectedData){ + boolean found = false; + for(QuadMesh actual : quadMeshes){ + if(expected.x == actual.x && expected.y == actual.y && expected.w == actual.w && expected.h == actual.h){ + found = true; + assertEquals(expected.x, actual.x); + assertEquals(expected.y, actual.y); + assertEquals(expected.w, actual.w); + assertEquals(expected.h, actual.h); + break; + } + } + assertEquals(true, found); + } + } + @UnitTest public void test_meshifyBox_verts(){ //expected data