From 258d73be9a03c72db6e7fc27479c6aab428c17f4 Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 28 May 2025 18:07:56 -0400 Subject: [PATCH] fix block LOD chunks rendering --- .../entity/ClientEntityUtils.java | 1 + .../types/terrain/BlockChunkEntity.java | 2 +- .../renderer/meshgen/BlockMeshgen.java | 57 +++++++++---------- .../renderer/meshgen/BlockMeshgenTests.java | 6 +- 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/main/java/electrosphere/entity/ClientEntityUtils.java b/src/main/java/electrosphere/entity/ClientEntityUtils.java index 87521d8b..90643df2 100644 --- a/src/main/java/electrosphere/entity/ClientEntityUtils.java +++ b/src/main/java/electrosphere/entity/ClientEntityUtils.java @@ -40,6 +40,7 @@ public class ClientEntityUtils { public static void reositionEntity(Entity entity, Vector3d position, Quaterniond rotation){ //reposition entity CollisionObjUtils.clientPositionCharacter(entity, position, rotation); + EntityUtils.getPosition(entity).set(position); } /** diff --git a/src/main/java/electrosphere/entity/types/terrain/BlockChunkEntity.java b/src/main/java/electrosphere/entity/types/terrain/BlockChunkEntity.java index 1e0006bb..3b3ceb5d 100644 --- a/src/main/java/electrosphere/entity/types/terrain/BlockChunkEntity.java +++ b/src/main/java/electrosphere/entity/types/terrain/BlockChunkEntity.java @@ -79,7 +79,7 @@ public class BlockChunkEntity { EntityCreationUtils.makeEntityDrawablePreexistingModel(solidsEnt, modelPath); if(levelOfDetail == BlockChunkData.LOD_FULL_RES){ PhysicsEntityUtils.clientAttachTriGeomCollider(solidsEnt, data); - CollisionObjUtils.clientPositionCharacter(solidsEnt, new Vector3d(EntityUtils.getPosition(solidsEnt)), new Quaterniond()); + ClientEntityUtils.reositionEntity(solidsEnt, new Vector3d(EntityUtils.getPosition(solidsEnt)), new Quaterniond()); } else { EntityCreationUtils.bypassShadowPass(solidsEnt); EntityCreationUtils.bypassVolumetics(solidsEnt); diff --git a/src/main/java/electrosphere/renderer/meshgen/BlockMeshgen.java b/src/main/java/electrosphere/renderer/meshgen/BlockMeshgen.java index bc343192..fa425f58 100644 --- a/src/main/java/electrosphere/renderer/meshgen/BlockMeshgen.java +++ b/src/main/java/electrosphere/renderer/meshgen/BlockMeshgen.java @@ -194,21 +194,24 @@ public class BlockMeshgen { * @param depth The depth of the box * @param blockType The type of block * @param indexOffset The offset for the indices that will be added (ie, if there are already vertices in the verts list, pass in the size of the vert list) + * @param scalingFactor The factor to scale by */ - protected static void meshifyBox(MeshGenStore meshStore, QuadMesh quad, int depth, int blockType){ + protected static void meshifyBox(MeshGenStore meshStore, QuadMesh quad, int depth, int blockType, int scalingFactor){ int indexOffset = meshStore.getVertCount() / 3; + float finalScalingFactor = scalingFactor * BlockChunkData.BLOCK_SIZE_MULTIPLIER; + // //face 1 // int samplerIndex = Globals.blockTextureAtlas.getVoxelTypeOffset(blockType); //verts - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.y + quad.h) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.y + quad.h) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); + meshStore.addVert(quad.x * finalScalingFactor, quad.y * finalScalingFactor, quad.z * finalScalingFactor); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, quad.y * finalScalingFactor, quad.z * finalScalingFactor); + meshStore.addVert(quad.x * finalScalingFactor, (quad.y + quad.h) * finalScalingFactor, quad.z * finalScalingFactor); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, (quad.y + quad.h) * finalScalingFactor, quad.z * finalScalingFactor); //indices meshStore.addFace(indexOffset + 0, indexOffset + 2, indexOffset + 3); meshStore.addFace(indexOffset + 0, indexOffset + 3, indexOffset + 1); @@ -233,10 +236,10 @@ public class BlockMeshgen { // //verts - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.y + quad.h) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.y + quad.h) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); + meshStore.addVert(quad.x * finalScalingFactor, quad.y * finalScalingFactor, quad.z * finalScalingFactor); + meshStore.addVert(quad.x * finalScalingFactor, quad.y * finalScalingFactor, (quad.z + depth) * finalScalingFactor); + meshStore.addVert(quad.x * finalScalingFactor, (quad.y + quad.h) * finalScalingFactor, quad.z * finalScalingFactor); + meshStore.addVert(quad.x * finalScalingFactor, (quad.y + quad.h) * finalScalingFactor, (quad.z + depth) * finalScalingFactor); //indices meshStore.addFace(indexOffset + 4, indexOffset + 7, indexOffset + 6); meshStore.addFace(indexOffset + 4, indexOffset + 5, indexOffset + 7); @@ -261,14 +264,10 @@ public class BlockMeshgen { // //verts - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - // verts.add(new Vector3f(quad.x, quad.y, quad.z ).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); - // verts.add(new Vector3f(quad.x, quad.y, quad.z + depth).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); - // verts.add(new Vector3f(quad.x + quad.w, quad.y, quad.z ).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); - // verts.add(new Vector3f(quad.x + quad.w, quad.y, quad.z + depth).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); + meshStore.addVert(quad.x * finalScalingFactor, quad.y * finalScalingFactor, quad.z * finalScalingFactor); + meshStore.addVert(quad.x * finalScalingFactor, quad.y * finalScalingFactor, (quad.z + depth) * finalScalingFactor); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, quad.y * finalScalingFactor, quad.z * finalScalingFactor); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, quad.y * finalScalingFactor, (quad.z + depth) * finalScalingFactor); //indices meshStore.addFace(indexOffset + 8, indexOffset + 10, indexOffset + 11); meshStore.addFace(indexOffset + 9, indexOffset + 8, indexOffset + 11); @@ -293,14 +292,10 @@ public class BlockMeshgen { // //verts - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert(quad.x * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.y + quad.h) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.y + quad.h) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - // verts.add(new Vector3f(quad.x, quad.y, quad.z + depth).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); - // verts.add(new Vector3f(quad.x + quad.w, quad.y, quad.z + depth).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); - // verts.add(new Vector3f(quad.x, quad.y + quad.h, quad.z + depth).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); - // verts.add(new Vector3f(quad.x + quad.w, quad.y + quad.h, quad.z + depth).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); + meshStore.addVert(quad.x * finalScalingFactor, quad.y * finalScalingFactor, (quad.z + depth) * finalScalingFactor); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, quad.y * finalScalingFactor, (quad.z + depth) * finalScalingFactor); + meshStore.addVert(quad.x * finalScalingFactor, (quad.y + quad.h) * finalScalingFactor, (quad.z + depth) * finalScalingFactor); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, (quad.y + quad.h) * finalScalingFactor, (quad.z + depth) * finalScalingFactor); //indices meshStore.addFace(indexOffset + 12, indexOffset + 15, indexOffset + 14); meshStore.addFace(indexOffset + 12, indexOffset + 13, indexOffset + 15); @@ -326,10 +321,10 @@ public class BlockMeshgen { // //verts - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.y * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.y + quad.h) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, quad.z * BlockChunkData.BLOCK_SIZE_MULTIPLIER); - meshStore.addVert((quad.x + quad.w) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.y + quad.h) * BlockChunkData.BLOCK_SIZE_MULTIPLIER, (quad.z + depth) * BlockChunkData.BLOCK_SIZE_MULTIPLIER); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, quad.y * finalScalingFactor, quad.z * finalScalingFactor); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, quad.y * finalScalingFactor, (quad.z + depth) * finalScalingFactor); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, (quad.y + quad.h) * finalScalingFactor, quad.z * finalScalingFactor); + meshStore.addVert((quad.x + quad.w) * finalScalingFactor, (quad.y + quad.h) * finalScalingFactor, (quad.z + depth) * finalScalingFactor); // verts.add(new Vector3f(quad.x + quad.w, quad.y, quad.z ).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); // verts.add(new Vector3f(quad.x + quad.w, quad.y, quad.z + depth).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); // verts.add(new Vector3f(quad.x + quad.w, quad.y + quad.h, quad.z ).mul(BlockChunkData.BLOCK_SIZE_MULTIPLIER)); @@ -426,7 +421,7 @@ public class BlockMeshgen { if(quad1.x == quad2.x && quad1.y == quad2.y && quad1.w == quad2.w && quad1.h == quad2.h && quad1.z + zEnd == quad2.z){ zEnd++; } else { - BlockMeshgen.meshifyBox(meshGenStore,quad1,zEnd,quad1.type); + BlockMeshgen.meshifyBox(meshGenStore,quad1,zEnd,quad1.type,scalingFactor); quad1 = quad2; // BlockSingleShape blockSingleShape = BlockMeshgen.copyDataToShape(meshGenStore, vertCount, faceCount); @@ -439,7 +434,7 @@ public class BlockMeshgen { i = i + zEnd; } if(quad1 != null){ - BlockMeshgen.meshifyBox(meshGenStore,quad1,zEnd,quad1.type); + BlockMeshgen.meshifyBox(meshGenStore,quad1,zEnd,quad1.type,scalingFactor); // BlockSingleShape blockSingleShape = BlockMeshgen.copyDataToShape(meshGenStore, vertCount, faceCount); // vertCount = meshGenStore.getVertCount(); // faceCount = meshGenStore.getFaceCount(); diff --git a/src/test/java/electrosphere/renderer/meshgen/BlockMeshgenTests.java b/src/test/java/electrosphere/renderer/meshgen/BlockMeshgenTests.java index a8e333c3..f2e72701 100644 --- a/src/test/java/electrosphere/renderer/meshgen/BlockMeshgenTests.java +++ b/src/test/java/electrosphere/renderer/meshgen/BlockMeshgenTests.java @@ -297,7 +297,7 @@ public class BlockMeshgenTests { quad.set(0, 0, 0, 1, 1,1); //call - BlockMeshgen.meshifyBox(store, quad, 1, 1); + BlockMeshgen.meshifyBox(store, quad, 1, 1, 1); //error check result @@ -355,7 +355,7 @@ public class BlockMeshgenTests { quad.set(0, 0, 0, 1, 1, 1); //call - BlockMeshgen.meshifyBox(store, quad, 1, 1); + BlockMeshgen.meshifyBox(store, quad, 1, 1, 1); //error check result @@ -411,7 +411,7 @@ public class BlockMeshgenTests { quad.set(0, 0, 0, 1, 1, 1); //call - BlockMeshgen.meshifyBox(store, quad, 1, 1); + BlockMeshgen.meshifyBox(store, quad, 1, 1, 1); //error check result