fix block meshgen algo bug
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2025-03-28 12:53:41 -04:00
parent dae678f0c7
commit 72e329d855
4 changed files with 43 additions and 2 deletions

View File

@ -1355,6 +1355,7 @@ Fix TextureInstancedActor packing data texture incorrectly (column major instead
Grass height variance with control from ui + file Grass height variance with control from ui + file
Fix block mesh ray casting bug due to trimesh overlap Fix block mesh ray casting bug due to trimesh overlap
Fix block mesh samplers incorrectly buffering Fix block mesh samplers incorrectly buffering
Fix block mesh gen algorithm merging quads incorrectly

View File

@ -208,7 +208,6 @@ public class TerrainProtocol implements ClientProtocolTemplate<TerrainMessage> {
if(Globals.clientBlockManager.containsChunkDataAtWorldPoint(worldPos.x, worldPos.y, worldPos.z, ChunkData.NO_STRIDE)){ 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); BlockChunkData data = Globals.clientBlockManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y, worldPos.z, ChunkData.NO_STRIDE);
if(data != null){ if(data != null){
System.out.println("Set " + message.getvoxelX() + " " + message.getvoxelY() + " " + message.getvoxelZ() + " to " + message.getblockType());
data.setType( data.setType(
message.getvoxelX(), message.getvoxelX(),
message.getvoxelY(), message.getvoxelY(),

View File

@ -82,7 +82,7 @@ public class BlockMeshgen {
currentQuad.h = y - currentQuad.y; currentQuad.h = y - currentQuad.y;
//check if should merge with previous quad //check if should merge with previous quad
for(QuadMesh prevMesh : quadMeshes){ 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; prevMesh.w = prevMesh.w + 1;
currentQuad = null; currentQuad = null;
break; break;

View File

@ -193,6 +193,47 @@ public class BlockMeshgenTests {
assertEquals(0, quadMeshes.size()); 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<QuadMesh> quadMeshes = new LinkedList<QuadMesh>();
//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 @UnitTest
public void test_meshifyBox_verts(){ public void test_meshifyBox_verts(){
//expected data //expected data