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
Fix block mesh ray casting bug due to trimesh overlap
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)){
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(),

View File

@ -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;

View File

@ -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<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
public void test_meshifyBox_verts(){
//expected data