Strided terrain data
Some checks failed
studiorailgun/Renderer/pipeline/pr-master There was a failure building this commit

This commit is contained in:
austin 2024-11-06 14:18:47 -05:00
parent 4b8e4cb542
commit c045c0a0d4
3 changed files with 243 additions and 238 deletions

View File

@ -548,48 +548,50 @@ public class ClientDrawCellManager {
} }
} }
} }
// if(highResFaces != null){ int highResLod = this.chunkTree.getMaxLevel() - (node.getLevel() + 1);
// for(DrawCellFace highResFace : highResFaces){ int highResSpacingFactor = (int)Math.pow(2,highResLod);
// //x & y are in face-space if(highResFaces != null){
// for(int x = 0; x < 4; x++){ for(DrawCellFace highResFace : highResFaces){
// for(int y = 0; y < 4; y++){ //x & y are in face-space
// Vector3i posToCheck = null; for(int x = 0; x < 3; x++){
// //implicitly performing transforms to adapt from face-space to world space for(int y = 0; y < 3; y++){
// switch(highResFace){ Vector3i posToCheck = null;
// case X_POSITIVE: { //implicitly performing transforms to adapt from face-space to world space
// posToCheck = new Vector3i(cell.getWorldPos()).add(lodMultiplitier,x,y); switch(highResFace){
// } break; case X_POSITIVE: {
// case X_NEGATIVE: { posToCheck = new Vector3i(cell.getWorldPos()).add(spacingFactor,x*highResSpacingFactor,y*highResSpacingFactor);
// posToCheck = new Vector3i(cell.getWorldPos()).add(-1,x,y); } break;
// } break; case X_NEGATIVE: {
// case Y_POSITIVE: { posToCheck = new Vector3i(cell.getWorldPos()).add(0,x*highResSpacingFactor,y*highResSpacingFactor);
// posToCheck = new Vector3i(cell.getWorldPos()).add(x,lodMultiplitier,y); } break;
// } break; case Y_POSITIVE: {
// case Y_NEGATIVE: { posToCheck = new Vector3i(cell.getWorldPos()).add(x*highResSpacingFactor,spacingFactor,y*highResSpacingFactor);
// posToCheck = new Vector3i(cell.getWorldPos()).add(x,-1,y); } break;
// } break; case Y_NEGATIVE: {
// case Z_POSITIVE: { posToCheck = new Vector3i(cell.getWorldPos()).add(x*highResSpacingFactor,0,y*highResSpacingFactor);
// posToCheck = new Vector3i(cell.getWorldPos()).add(x,y,lodMultiplitier); } break;
// } break; case Z_POSITIVE: {
// case Z_NEGATIVE: { posToCheck = new Vector3i(cell.getWorldPos()).add(x*highResSpacingFactor,y*highResSpacingFactor,spacingFactor);
// posToCheck = new Vector3i(cell.getWorldPos()).add(x,y,-1); } break;
// } break; case Z_NEGATIVE: {
// } posToCheck = new Vector3i(cell.getWorldPos()).add(x*highResSpacingFactor,y*highResSpacingFactor,0);
// if( } break;
// posToCheck.x >= 0 && }
// posToCheck.x < Globals.clientWorldData.getWorldDiscreteSize() && if(
// posToCheck.y >= 0 && posToCheck.x >= 0 &&
// posToCheck.y < Globals.clientWorldData.getWorldDiscreteSize() && posToCheck.x < Globals.clientWorldData.getWorldDiscreteSize() &&
// posToCheck.z >= 0 && posToCheck.y >= 0 &&
// posToCheck.z < Globals.clientWorldData.getWorldDiscreteSize() && posToCheck.y < Globals.clientWorldData.getWorldDiscreteSize() &&
// !Globals.clientTerrainManager.containsChunkDataAtWorldPoint(posToCheck.x, posToCheck.y, posToCheck.z, ChunkData.NO_STRIDE) posToCheck.z >= 0 &&
// ){ posToCheck.z < Globals.clientWorldData.getWorldDiscreteSize() &&
// return false; !Globals.clientTerrainManager.containsChunkDataAtWorldPoint(posToCheck.x, posToCheck.y, posToCheck.z, highResLod)
// } ){
// } return false;
// } }
// } }
// } }
}
}
return true; return true;
} }

View File

@ -12,7 +12,9 @@ import electrosphere.engine.Globals;
import electrosphere.entity.ClientEntityUtils; import electrosphere.entity.ClientEntityUtils;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.types.terrain.TerrainChunk; import electrosphere.entity.types.terrain.TerrainChunk;
import electrosphere.renderer.meshgen.TransvoxelModelGeneration;
import electrosphere.renderer.meshgen.TransvoxelModelGeneration.TransvoxelChunkData; import electrosphere.renderer.meshgen.TransvoxelModelGeneration.TransvoxelChunkData;
import electrosphere.server.terrain.manager.ServerTerrainChunk;
/** /**
* A single drawcell - contains an entity that has a physics mesh and potentially graphics * A single drawcell - contains an entity that has a physics mesh and potentially graphics
@ -232,201 +234,202 @@ public class DrawCell {
* @return true if successfully filled in data, false otherwise * @return true if successfully filled in data, false otherwise
*/ */
private boolean fillInFaceData(TransvoxelChunkData chunkData, DrawCellFace higherLODFace, int lod){ private boolean fillInFaceData(TransvoxelChunkData chunkData, DrawCellFace higherLODFace, int lod){
// int mainSpacing = (int)Math.pow(2,lod); int mainSpacing = (int)Math.pow(2,lod);
// int higherResSpacing = (int)Math.pow(2,lod - 1); int higherLOD = lod - 1;
// float[][] faceWeights = new float[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS]; int higherResSpacing = (int)Math.pow(2,higherLOD);
// int[][] faceTypes = new int[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS]; float[][] faceWeights = new float[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS];
// //allocate face array int[][] faceTypes = new int[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS];
// for(int x = 0; x < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; x++){ //allocate face array
// for(int y = 0; y < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; y++){ for(int x = 0; x < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; x++){
// int worldCoordOffset1 = (x * higherResSpacing) / ChunkData.CHUNK_SIZE; for(int y = 0; y < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; y++){
// int worldCoordOffset2 = (y * higherResSpacing) / ChunkData.CHUNK_SIZE; int worldCoordOffset1 = x / ChunkData.CHUNK_SIZE * higherResSpacing;
// //solve coordinates relative to the face int worldCoordOffset2 = y / ChunkData.CHUNK_SIZE * higherResSpacing;
// int localCoord1 = (x * higherResSpacing) % ChunkData.CHUNK_SIZE; //solve coordinates relative to the face
// int localCoord2 = (y * higherResSpacing) % ChunkData.CHUNK_SIZE; int localCoord1 = x % ChunkData.CHUNK_SIZE;
int localCoord2 = y % ChunkData.CHUNK_SIZE;
// //implicitly performing transforms to adapt from face-space to world & local space //implicitly performing transforms to adapt from face-space to world & local space
// switch(higherLODFace){ switch(higherLODFace){
// case X_POSITIVE: { case X_POSITIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint( ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i( new Vector3i(
// worldPos.x + (17 * mainSpacing) / ChunkData.CHUNK_SIZE, worldPos.x + mainSpacing,
// worldPos.y + worldCoordOffset1, worldPos.y + worldCoordOffset1,
// worldPos.z + worldCoordOffset2 worldPos.z + worldCoordOffset2
// ), ),
// ChunkData.NO_STRIDE higherLOD
// ); );
// if(currentChunk == null){ if(currentChunk == null){
// return false; return false;
// } }
// faceWeights[x][y] = currentChunk.getWeight( faceWeights[x][y] = currentChunk.getWeight(
// 0, 0,
// localCoord1, localCoord1,
// localCoord2 localCoord2
// ); );
// faceTypes[x][y] = currentChunk.getType( faceTypes[x][y] = currentChunk.getType(
// 0, 0,
// localCoord1, localCoord1,
// localCoord2 localCoord2
// ); );
// } break; } break;
// case X_NEGATIVE: { case X_NEGATIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint( ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i( new Vector3i(
// worldPos.x, worldPos.x,
// worldPos.y + worldCoordOffset1, worldPos.y + worldCoordOffset1,
// worldPos.z + worldCoordOffset2 worldPos.z + worldCoordOffset2
// ), ),
// ChunkData.NO_STRIDE higherLOD
// ); );
// if(currentChunk == null){ if(currentChunk == null){
// return false; return false;
// } }
// faceWeights[x][y] = currentChunk.getWeight( faceWeights[x][y] = currentChunk.getWeight(
// 0, 0,
// localCoord1, localCoord1,
// localCoord2 localCoord2
// ); );
// faceTypes[x][y] = currentChunk.getType( faceTypes[x][y] = currentChunk.getType(
// 0, 0,
// localCoord1, localCoord1,
// localCoord2 localCoord2
// ); );
// } break; } break;
// case Y_POSITIVE: { case Y_POSITIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint( ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i( new Vector3i(
// worldPos.x + worldCoordOffset1, worldPos.x + worldCoordOffset1,
// worldPos.y + (17 * mainSpacing) / ChunkData.CHUNK_SIZE, worldPos.y + mainSpacing,
// worldPos.z + worldCoordOffset2 worldPos.z + worldCoordOffset2
// ), ),
// ChunkData.NO_STRIDE higherLOD
// ); );
// if(currentChunk == null){ if(currentChunk == null){
// return false; return false;
// } }
// faceWeights[x][y] = currentChunk.getWeight( faceWeights[x][y] = currentChunk.getWeight(
// localCoord1, localCoord1,
// 0, 0,
// localCoord2 localCoord2
// ); );
// faceTypes[x][y] = currentChunk.getType( faceTypes[x][y] = currentChunk.getType(
// localCoord1, localCoord1,
// 0, 0,
// localCoord2 localCoord2
// ); );
// } break; } break;
// case Y_NEGATIVE: { case Y_NEGATIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint( ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i( new Vector3i(
// worldPos.x + worldCoordOffset1, worldPos.x + worldCoordOffset1,
// worldPos.y, worldPos.y,
// worldPos.z + worldCoordOffset2 worldPos.z + worldCoordOffset2
// ), ),
// ChunkData.NO_STRIDE higherLOD
// ); );
// if(currentChunk == null){ if(currentChunk == null){
// return false; return false;
// } }
// faceWeights[x][y] = currentChunk.getWeight( faceWeights[x][y] = currentChunk.getWeight(
// localCoord1, localCoord1,
// 0, 0,
// localCoord2 localCoord2
// ); );
// faceTypes[x][y] = currentChunk.getType( faceTypes[x][y] = currentChunk.getType(
// localCoord1, localCoord1,
// 0, 0,
// localCoord2 localCoord2
// ); );
// } break; } break;
// case Z_POSITIVE: { case Z_POSITIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint( ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i( new Vector3i(
// worldPos.x + worldCoordOffset1, worldPos.x + worldCoordOffset1,
// worldPos.y + worldCoordOffset2, worldPos.y + worldCoordOffset2,
// worldPos.z + (17 * mainSpacing) / ChunkData.CHUNK_SIZE worldPos.z + mainSpacing
// ), ),
// ChunkData.NO_STRIDE higherLOD
// ); );
// if(currentChunk == null){ if(currentChunk == null){
// return false; return false;
// } }
// faceWeights[x][y] = currentChunk.getWeight( faceWeights[x][y] = currentChunk.getWeight(
// localCoord1, localCoord1,
// localCoord2, localCoord2,
// 0 0
// ); );
// faceTypes[x][y] = currentChunk.getType( faceTypes[x][y] = currentChunk.getType(
// localCoord1, localCoord1,
// localCoord2, localCoord2,
// 0 0
// ); );
// } break; } break;
// case Z_NEGATIVE: { case Z_NEGATIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint( ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i( new Vector3i(
// worldPos.x + worldCoordOffset1, worldPos.x + worldCoordOffset1,
// worldPos.y + worldCoordOffset2, worldPos.y + worldCoordOffset2,
// worldPos.z worldPos.z
// ), ),
// ChunkData.NO_STRIDE higherLOD
// ); );
// if(currentChunk == null){ if(currentChunk == null){
// return false; return false;
// } }
// faceWeights[x][y] = currentChunk.getWeight( faceWeights[x][y] = currentChunk.getWeight(
// localCoord1, localCoord1,
// localCoord2, localCoord2,
// 0 0
// ); );
// faceTypes[x][y] = currentChunk.getType( faceTypes[x][y] = currentChunk.getType(
// localCoord1, localCoord1,
// localCoord2, localCoord2,
// 0 0
// ); );
// } break; } break;
// } }
// // Vector3i sampleChunkWorldPos = new Vector3i( // Vector3i sampleChunkWorldPos = new Vector3i(
// // worldPos.x + (x * higherResSpacing) / ChunkData.CHUNK_SIZE, // worldPos.x + (x * higherResSpacing) / ChunkData.CHUNK_SIZE,
// // worldPos.y + (y * higherResSpacing) / ChunkData.CHUNK_SIZE, // worldPos.y + (y * higherResSpacing) / ChunkData.CHUNK_SIZE,
// // worldPos.z + (z * spacingFactor) / ChunkData.CHUNK_SIZE // worldPos.z + (z * spacingFactor) / ChunkData.CHUNK_SIZE
// // ); // );
// // ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(sampleChunkWorldPos); // ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(sampleChunkWorldPos);
// // if(currentChunk == null){ // if(currentChunk == null){
// // throw new Error("Chunk is null! " + worldPos); // throw new Error("Chunk is null! " + worldPos);
// // } // }
// // weights[x][y][z] = currentChunk.getWeight( // weights[x][y][z] = currentChunk.getWeight(
// // (x * higherResSpacing) % ChunkData.CHUNK_SIZE, // (x * higherResSpacing) % ChunkData.CHUNK_SIZE,
// // (y * higherResSpacing) % ChunkData.CHUNK_SIZE, // (y * higherResSpacing) % ChunkData.CHUNK_SIZE,
// // (z * spacingFactor) % ChunkData.CHUNK_SIZE // (z * spacingFactor) % ChunkData.CHUNK_SIZE
// // ); // );
// // types[x][y][z] = currentChunk.getType( // types[x][y][z] = currentChunk.getType(
// // (x * higherResSpacing) % ChunkData.CHUNK_SIZE, // (x * higherResSpacing) % ChunkData.CHUNK_SIZE,
// // (y * higherResSpacing) % ChunkData.CHUNK_SIZE, // (y * higherResSpacing) % ChunkData.CHUNK_SIZE,
// // (z * spacingFactor) % ChunkData.CHUNK_SIZE // (z * spacingFactor) % ChunkData.CHUNK_SIZE
// // ); // );
// } }
// } }
// switch(higherLODFace){ switch(higherLODFace){
// case X_POSITIVE: { case X_POSITIVE: {
// chunkData.addXPositiveEdge(faceWeights, faceTypes); chunkData.addXPositiveEdge(faceWeights, faceTypes);
// } break; } break;
// case X_NEGATIVE: { case X_NEGATIVE: {
// chunkData.addXNegativeEdge(faceWeights, faceTypes); chunkData.addXNegativeEdge(faceWeights, faceTypes);
// } break; } break;
// case Y_POSITIVE: { case Y_POSITIVE: {
// chunkData.addYPositiveEdge(faceWeights, faceTypes); chunkData.addYPositiveEdge(faceWeights, faceTypes);
// } break; } break;
// case Y_NEGATIVE: { case Y_NEGATIVE: {
// chunkData.addYNegativeEdge(faceWeights, faceTypes); chunkData.addYNegativeEdge(faceWeights, faceTypes);
// } break; } break;
// case Z_POSITIVE: { case Z_POSITIVE: {
// chunkData.addZPositiveEdge(faceWeights, faceTypes); chunkData.addZPositiveEdge(faceWeights, faceTypes);
// } break; } break;
// case Z_NEGATIVE: { case Z_NEGATIVE: {
// chunkData.addZNegativeEdge(faceWeights, faceTypes); chunkData.addZNegativeEdge(faceWeights, faceTypes);
// } break; } break;
// } }
return true; return true;
} }

View File

@ -1335,7 +1335,7 @@ public class TransvoxelModelGeneration {
chunkData.yNegativeEdgeAtlas[(x+0)*2+0][(z+0)*2+0], chunkData.yNegativeEdgeAtlas[(x+1)*2+0][(z+0)*2+0], chunkData.yNegativeEdgeAtlas[(x+0)*2+0][(z+0)*2+0], chunkData.yNegativeEdgeAtlas[(x+1)*2+0][(z+0)*2+0],
chunkData.yNegativeEdgeAtlas[(x+0)*2+0][(z+1)*2+0], chunkData.yNegativeEdgeAtlas[(x+1)*2+0][(z+1)*2+0] chunkData.yNegativeEdgeAtlas[(x+0)*2+0][(z+1)*2+0], chunkData.yNegativeEdgeAtlas[(x+1)*2+0][(z+1)*2+0]
); );
polygonizeTransition(currentTransitionCell, TerrainChunkModelGeneration.MIN_ISO_VALUE, triangles, samplerTriangles, vertMap, verts, normals, trianglesSharingVert, false); polygonizeTransition(currentTransitionCell, TerrainChunkModelGeneration.MIN_ISO_VALUE, triangles, samplerTriangles, vertMap, verts, normals, trianglesSharingVert, true);
// //
//Generate the normal cell with half width //Generate the normal cell with half width
@ -1349,7 +1349,7 @@ public class TransvoxelModelGeneration {
chunkData.yNegativeEdgeAtlas[(x+0)*2+0][(z+0)*2+0], chunkData.yNegativeEdgeAtlas[(x+0)*2+0][(z+1)*2+0], chunkData.yNegativeEdgeAtlas[(x+1)*2+0][(z+1)*2+0], chunkData.yNegativeEdgeAtlas[(x+1)*2+0][(z+0)*2+0] chunkData.yNegativeEdgeAtlas[(x+0)*2+0][(z+0)*2+0], chunkData.yNegativeEdgeAtlas[(x+0)*2+0][(z+1)*2+0], chunkData.yNegativeEdgeAtlas[(x+1)*2+0][(z+1)*2+0], chunkData.yNegativeEdgeAtlas[(x+1)*2+0][(z+0)*2+0]
); );
//polygonize the current gridcell //polygonize the current gridcell
polygonize(currentCell, TerrainChunkModelGeneration.MIN_ISO_VALUE, triangles, samplerTriangles, vertMap, verts, normals, trianglesSharingVert, false); polygonize(currentCell, TerrainChunkModelGeneration.MIN_ISO_VALUE, triangles, samplerTriangles, vertMap, verts, normals, trianglesSharingVert, true);
} }
} }
} else { } else {