alter index lookups on client side
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-11-05 15:38:26 -05:00
parent 8ca29e4b40
commit bf292f29c6
2 changed files with 257 additions and 269 deletions

View File

@ -491,31 +491,18 @@ public class ClientDrawCellManager {
throw new Error("Unimplemented");
}
/**
* Checks if the terrain cache has a chunk at a given world point
* @param worldX the x coordinate
* @param worldY the y coordinate
* @param worldZ the z coordinate
* @return true if the chunk data exists, false otherwise
*/
boolean containsChunkDataAtWorldPoint(int worldX, int worldY, int worldZ){
if(Globals.clientTerrainManager != null){
return Globals.clientTerrainManager.containsChunkDataAtWorldPoint(worldX,worldY,worldZ,ChunkData.NO_STRIDE);
}
return true;
}
/**
* Requests all chunks for a given draw cell
* @param cell The cell
*/
private void requestChunks(WorldOctTree.FloatingChunkTreeNode<DrawCell> node){
DrawCell cell = node.getData();
int lodMultiplitier = this.chunkTree.getMaxLevel() - node.getLevel() + 1;
for(int i = 0; i < 2 * lodMultiplitier; i++){
for(int j = 0; j < 2 * lodMultiplitier; j++){
for(int k = 0; k < 2 * lodMultiplitier; k++){
Vector3i posToCheck = new Vector3i(cell.getWorldPos()).add(i,j,k);
int lod = this.chunkTree.getMaxLevel() - node.getLevel();
int spacingFactor = (int)Math.pow(2,lod);
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++){
for(int k = 0; k < 2; k++){
Vector3i posToCheck = new Vector3i(cell.getWorldPos()).add(i*spacingFactor,j*spacingFactor,k*spacingFactor);
if(
posToCheck.x >= 0 &&
posToCheck.x < Globals.clientWorldData.getWorldDiscreteSize() &&
@ -542,11 +529,12 @@ public class ClientDrawCellManager {
*/
private boolean containsDataToGenerate(WorldOctTree.FloatingChunkTreeNode<DrawCell> node, List<DrawCellFace> highResFaces){
DrawCell cell = node.getData();
int lodMultiplitier = this.chunkTree.getMaxLevel() - node.getLevel() + 1;
for(int i = 0; i < 2 * lodMultiplitier; i++){
for(int j = 0; j < 2 * lodMultiplitier; j++){
for(int k = 0; k < 2 * lodMultiplitier; k++){
Vector3i posToCheck = new Vector3i(cell.getWorldPos()).add(i,j,k);
int lod = this.chunkTree.getMaxLevel() - node.getLevel();
int spacingFactor = (int)Math.pow(2,lod);
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++){
for(int k = 0; k < 2; k++){
Vector3i posToCheck = new Vector3i(cell.getWorldPos()).add(i*spacingFactor,j*spacingFactor,k*spacingFactor);
if(
posToCheck.x >= 0 &&
posToCheck.x < Globals.clientWorldData.getWorldDiscreteSize() &&
@ -561,48 +549,48 @@ public class ClientDrawCellManager {
}
}
}
if(highResFaces != null){
for(DrawCellFace highResFace : highResFaces){
//x & y are in face-space
for(int x = 0; x < 2 * lodMultiplitier; x++){
for(int y = 0; y < 2 * lodMultiplitier; y++){
Vector3i posToCheck = null;
//implicitly performing transforms to adapt from face-space to world space
switch(highResFace){
case X_POSITIVE: {
posToCheck = new Vector3i(cell.getWorldPos()).add(lodMultiplitier,x,y);
} break;
case X_NEGATIVE: {
posToCheck = new Vector3i(cell.getWorldPos()).add(-1,x,y);
} break;
case Y_POSITIVE: {
posToCheck = new Vector3i(cell.getWorldPos()).add(x,lodMultiplitier,y);
} break;
case Y_NEGATIVE: {
posToCheck = new Vector3i(cell.getWorldPos()).add(x,-1,y);
} break;
case Z_POSITIVE: {
posToCheck = new Vector3i(cell.getWorldPos()).add(x,y,lodMultiplitier);
} break;
case Z_NEGATIVE: {
posToCheck = new Vector3i(cell.getWorldPos()).add(x,y,-1);
} break;
}
if(
posToCheck.x >= 0 &&
posToCheck.x < Globals.clientWorldData.getWorldDiscreteSize() &&
posToCheck.y >= 0 &&
posToCheck.y < Globals.clientWorldData.getWorldDiscreteSize() &&
posToCheck.z >= 0 &&
posToCheck.z < Globals.clientWorldData.getWorldDiscreteSize() &&
!Globals.clientTerrainManager.containsChunkDataAtWorldPoint(posToCheck.x, posToCheck.y, posToCheck.z, ChunkData.NO_STRIDE)
){
return false;
}
}
}
}
}
// if(highResFaces != null){
// for(DrawCellFace highResFace : highResFaces){
// //x & y are in face-space
// for(int x = 0; x < 4; x++){
// for(int y = 0; y < 4; y++){
// Vector3i posToCheck = null;
// //implicitly performing transforms to adapt from face-space to world space
// switch(highResFace){
// case X_POSITIVE: {
// posToCheck = new Vector3i(cell.getWorldPos()).add(lodMultiplitier,x,y);
// } break;
// case X_NEGATIVE: {
// posToCheck = new Vector3i(cell.getWorldPos()).add(-1,x,y);
// } break;
// case Y_POSITIVE: {
// posToCheck = new Vector3i(cell.getWorldPos()).add(x,lodMultiplitier,y);
// } break;
// case Y_NEGATIVE: {
// posToCheck = new Vector3i(cell.getWorldPos()).add(x,-1,y);
// } break;
// case Z_POSITIVE: {
// posToCheck = new Vector3i(cell.getWorldPos()).add(x,y,lodMultiplitier);
// } break;
// case Z_NEGATIVE: {
// posToCheck = new Vector3i(cell.getWorldPos()).add(x,y,-1);
// } break;
// }
// if(
// posToCheck.x >= 0 &&
// posToCheck.x < Globals.clientWorldData.getWorldDiscreteSize() &&
// posToCheck.y >= 0 &&
// posToCheck.y < Globals.clientWorldData.getWorldDiscreteSize() &&
// posToCheck.z >= 0 &&
// posToCheck.z < Globals.clientWorldData.getWorldDiscreteSize() &&
// !Globals.clientTerrainManager.containsChunkDataAtWorldPoint(posToCheck.x, posToCheck.y, posToCheck.z, ChunkData.NO_STRIDE)
// ){
// return false;
// }
// }
// }
// }
// }
return true;
}

View File

@ -192,23 +192,23 @@ public class DrawCell {
for(int y = 0; y < ChunkData.CHUNK_DATA_GENERATOR_SIZE; y++){
for(int z = 0; z < ChunkData.CHUNK_DATA_GENERATOR_SIZE; z++){
ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
worldPos.x + (x * spacingFactor) / ChunkData.CHUNK_SIZE,
worldPos.y + (y * spacingFactor) / ChunkData.CHUNK_SIZE,
worldPos.z + (z * spacingFactor) / ChunkData.CHUNK_SIZE,
worldPos.x + x / ChunkData.CHUNK_SIZE * spacingFactor,
worldPos.y + y / ChunkData.CHUNK_SIZE * spacingFactor,
worldPos.z + z / ChunkData.CHUNK_SIZE * spacingFactor,
ChunkData.NO_STRIDE
);
if(currentChunk == null){
return false;
}
weights[x][y][z] = currentChunk.getWeight(
(x * spacingFactor) % ChunkData.CHUNK_SIZE,
(y * spacingFactor) % ChunkData.CHUNK_SIZE,
(z * spacingFactor) % ChunkData.CHUNK_SIZE
x % ChunkData.CHUNK_SIZE,
y % ChunkData.CHUNK_SIZE,
z % ChunkData.CHUNK_SIZE
);
types[x][y][z] = currentChunk.getType(
(x * spacingFactor) % ChunkData.CHUNK_SIZE,
(y * spacingFactor) % ChunkData.CHUNK_SIZE,
(z * spacingFactor) % ChunkData.CHUNK_SIZE
x % ChunkData.CHUNK_SIZE,
y % ChunkData.CHUNK_SIZE,
z % ChunkData.CHUNK_SIZE
);
//checks to see if there is only one type of voxel in this chunk
@ -233,201 +233,201 @@ public class DrawCell {
* @return true if successfully filled in data, false otherwise
*/
private boolean fillInFaceData(TransvoxelChunkData chunkData, DrawCellFace higherLODFace, int lod){
int mainSpacing = (int)Math.pow(2,lod);
int higherResSpacing = (int)Math.pow(2,lod - 1);
float[][] faceWeights = new float[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS];
int[][] faceTypes = new int[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS];
//allocate face array
for(int x = 0; x < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; x++){
for(int y = 0; y < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; y++){
int worldCoordOffset1 = (x * higherResSpacing) / ChunkData.CHUNK_SIZE;
int worldCoordOffset2 = (y * higherResSpacing) / ChunkData.CHUNK_SIZE;
//solve coordinates relative to the face
int localCoord1 = (x * higherResSpacing) % ChunkData.CHUNK_SIZE;
int localCoord2 = (y * higherResSpacing) % ChunkData.CHUNK_SIZE;
// int mainSpacing = (int)Math.pow(2,lod);
// int higherResSpacing = (int)Math.pow(2,lod - 1);
// float[][] faceWeights = new float[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS];
// int[][] faceTypes = new int[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS];
// //allocate face array
// for(int x = 0; x < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; x++){
// for(int y = 0; y < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; y++){
// int worldCoordOffset1 = (x * higherResSpacing) / ChunkData.CHUNK_SIZE;
// int worldCoordOffset2 = (y * higherResSpacing) / ChunkData.CHUNK_SIZE;
// //solve coordinates relative to the face
// int localCoord1 = (x * higherResSpacing) % ChunkData.CHUNK_SIZE;
// int localCoord2 = (y * higherResSpacing) % ChunkData.CHUNK_SIZE;
//implicitly performing transforms to adapt from face-space to world & local space
switch(higherLODFace){
case X_POSITIVE: {
ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
new Vector3i(
worldPos.x + (17 * mainSpacing) / ChunkData.CHUNK_SIZE,
worldPos.y + worldCoordOffset1,
worldPos.z + worldCoordOffset2
),
ChunkData.NO_STRIDE
);
if(currentChunk == null){
return false;
}
faceWeights[x][y] = currentChunk.getWeight(
0,
localCoord1,
localCoord2
);
faceTypes[x][y] = currentChunk.getType(
0,
localCoord1,
localCoord2
);
} break;
case X_NEGATIVE: {
ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
new Vector3i(
worldPos.x,
worldPos.y + worldCoordOffset1,
worldPos.z + worldCoordOffset2
),
ChunkData.NO_STRIDE
);
if(currentChunk == null){
return false;
}
faceWeights[x][y] = currentChunk.getWeight(
0,
localCoord1,
localCoord2
);
faceTypes[x][y] = currentChunk.getType(
0,
localCoord1,
localCoord2
);
} break;
case Y_POSITIVE: {
ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
new Vector3i(
worldPos.x + worldCoordOffset1,
worldPos.y + (17 * mainSpacing) / ChunkData.CHUNK_SIZE,
worldPos.z + worldCoordOffset2
),
ChunkData.NO_STRIDE
);
if(currentChunk == null){
return false;
}
faceWeights[x][y] = currentChunk.getWeight(
localCoord1,
0,
localCoord2
);
faceTypes[x][y] = currentChunk.getType(
localCoord1,
0,
localCoord2
);
} break;
case Y_NEGATIVE: {
ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
new Vector3i(
worldPos.x + worldCoordOffset1,
worldPos.y,
worldPos.z + worldCoordOffset2
),
ChunkData.NO_STRIDE
);
if(currentChunk == null){
return false;
}
faceWeights[x][y] = currentChunk.getWeight(
localCoord1,
0,
localCoord2
);
faceTypes[x][y] = currentChunk.getType(
localCoord1,
0,
localCoord2
);
} break;
case Z_POSITIVE: {
ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
new Vector3i(
worldPos.x + worldCoordOffset1,
worldPos.y + worldCoordOffset2,
worldPos.z + (17 * mainSpacing) / ChunkData.CHUNK_SIZE
),
ChunkData.NO_STRIDE
);
if(currentChunk == null){
return false;
}
faceWeights[x][y] = currentChunk.getWeight(
localCoord1,
localCoord2,
0
);
faceTypes[x][y] = currentChunk.getType(
localCoord1,
localCoord2,
0
);
} break;
case Z_NEGATIVE: {
ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
new Vector3i(
worldPos.x + worldCoordOffset1,
worldPos.y + worldCoordOffset2,
worldPos.z
),
ChunkData.NO_STRIDE
);
if(currentChunk == null){
return false;
}
faceWeights[x][y] = currentChunk.getWeight(
localCoord1,
localCoord2,
0
);
faceTypes[x][y] = currentChunk.getType(
localCoord1,
localCoord2,
0
);
} break;
}
// Vector3i sampleChunkWorldPos = new Vector3i(
// worldPos.x + (x * higherResSpacing) / ChunkData.CHUNK_SIZE,
// worldPos.y + (y * higherResSpacing) / ChunkData.CHUNK_SIZE,
// worldPos.z + (z * spacingFactor) / ChunkData.CHUNK_SIZE
// );
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(sampleChunkWorldPos);
// if(currentChunk == null){
// throw new Error("Chunk is null! " + worldPos);
// }
// weights[x][y][z] = currentChunk.getWeight(
// (x * higherResSpacing) % ChunkData.CHUNK_SIZE,
// (y * higherResSpacing) % ChunkData.CHUNK_SIZE,
// (z * spacingFactor) % ChunkData.CHUNK_SIZE
// );
// types[x][y][z] = currentChunk.getType(
// (x * higherResSpacing) % ChunkData.CHUNK_SIZE,
// (y * higherResSpacing) % ChunkData.CHUNK_SIZE,
// (z * spacingFactor) % ChunkData.CHUNK_SIZE
// );
}
}
switch(higherLODFace){
case X_POSITIVE: {
chunkData.addXPositiveEdge(faceWeights, faceTypes);
} break;
case X_NEGATIVE: {
chunkData.addXNegativeEdge(faceWeights, faceTypes);
} break;
case Y_POSITIVE: {
chunkData.addYPositiveEdge(faceWeights, faceTypes);
} break;
case Y_NEGATIVE: {
chunkData.addYNegativeEdge(faceWeights, faceTypes);
} break;
case Z_POSITIVE: {
chunkData.addZPositiveEdge(faceWeights, faceTypes);
} break;
case Z_NEGATIVE: {
chunkData.addZNegativeEdge(faceWeights, faceTypes);
} break;
}
// //implicitly performing transforms to adapt from face-space to world & local space
// switch(higherLODFace){
// case X_POSITIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i(
// worldPos.x + (17 * mainSpacing) / ChunkData.CHUNK_SIZE,
// worldPos.y + worldCoordOffset1,
// worldPos.z + worldCoordOffset2
// ),
// ChunkData.NO_STRIDE
// );
// if(currentChunk == null){
// return false;
// }
// faceWeights[x][y] = currentChunk.getWeight(
// 0,
// localCoord1,
// localCoord2
// );
// faceTypes[x][y] = currentChunk.getType(
// 0,
// localCoord1,
// localCoord2
// );
// } break;
// case X_NEGATIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i(
// worldPos.x,
// worldPos.y + worldCoordOffset1,
// worldPos.z + worldCoordOffset2
// ),
// ChunkData.NO_STRIDE
// );
// if(currentChunk == null){
// return false;
// }
// faceWeights[x][y] = currentChunk.getWeight(
// 0,
// localCoord1,
// localCoord2
// );
// faceTypes[x][y] = currentChunk.getType(
// 0,
// localCoord1,
// localCoord2
// );
// } break;
// case Y_POSITIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i(
// worldPos.x + worldCoordOffset1,
// worldPos.y + (17 * mainSpacing) / ChunkData.CHUNK_SIZE,
// worldPos.z + worldCoordOffset2
// ),
// ChunkData.NO_STRIDE
// );
// if(currentChunk == null){
// return false;
// }
// faceWeights[x][y] = currentChunk.getWeight(
// localCoord1,
// 0,
// localCoord2
// );
// faceTypes[x][y] = currentChunk.getType(
// localCoord1,
// 0,
// localCoord2
// );
// } break;
// case Y_NEGATIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i(
// worldPos.x + worldCoordOffset1,
// worldPos.y,
// worldPos.z + worldCoordOffset2
// ),
// ChunkData.NO_STRIDE
// );
// if(currentChunk == null){
// return false;
// }
// faceWeights[x][y] = currentChunk.getWeight(
// localCoord1,
// 0,
// localCoord2
// );
// faceTypes[x][y] = currentChunk.getType(
// localCoord1,
// 0,
// localCoord2
// );
// } break;
// case Z_POSITIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i(
// worldPos.x + worldCoordOffset1,
// worldPos.y + worldCoordOffset2,
// worldPos.z + (17 * mainSpacing) / ChunkData.CHUNK_SIZE
// ),
// ChunkData.NO_STRIDE
// );
// if(currentChunk == null){
// return false;
// }
// faceWeights[x][y] = currentChunk.getWeight(
// localCoord1,
// localCoord2,
// 0
// );
// faceTypes[x][y] = currentChunk.getType(
// localCoord1,
// localCoord2,
// 0
// );
// } break;
// case Z_NEGATIVE: {
// ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
// new Vector3i(
// worldPos.x + worldCoordOffset1,
// worldPos.y + worldCoordOffset2,
// worldPos.z
// ),
// ChunkData.NO_STRIDE
// );
// if(currentChunk == null){
// return false;
// }
// faceWeights[x][y] = currentChunk.getWeight(
// localCoord1,
// localCoord2,
// 0
// );
// faceTypes[x][y] = currentChunk.getType(
// localCoord1,
// localCoord2,
// 0
// );
// } break;
// }
// // Vector3i sampleChunkWorldPos = new Vector3i(
// // worldPos.x + (x * higherResSpacing) / ChunkData.CHUNK_SIZE,
// // worldPos.y + (y * higherResSpacing) / ChunkData.CHUNK_SIZE,
// // worldPos.z + (z * spacingFactor) / ChunkData.CHUNK_SIZE
// // );
// // ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(sampleChunkWorldPos);
// // if(currentChunk == null){
// // throw new Error("Chunk is null! " + worldPos);
// // }
// // weights[x][y][z] = currentChunk.getWeight(
// // (x * higherResSpacing) % ChunkData.CHUNK_SIZE,
// // (y * higherResSpacing) % ChunkData.CHUNK_SIZE,
// // (z * spacingFactor) % ChunkData.CHUNK_SIZE
// // );
// // types[x][y][z] = currentChunk.getType(
// // (x * higherResSpacing) % ChunkData.CHUNK_SIZE,
// // (y * higherResSpacing) % ChunkData.CHUNK_SIZE,
// // (z * spacingFactor) % ChunkData.CHUNK_SIZE
// // );
// }
// }
// switch(higherLODFace){
// case X_POSITIVE: {
// chunkData.addXPositiveEdge(faceWeights, faceTypes);
// } break;
// case X_NEGATIVE: {
// chunkData.addXNegativeEdge(faceWeights, faceTypes);
// } break;
// case Y_POSITIVE: {
// chunkData.addYPositiveEdge(faceWeights, faceTypes);
// } break;
// case Y_NEGATIVE: {
// chunkData.addYNegativeEdge(faceWeights, faceTypes);
// } break;
// case Z_POSITIVE: {
// chunkData.addZPositiveEdge(faceWeights, faceTypes);
// } break;
// case Z_NEGATIVE: {
// chunkData.addZNegativeEdge(faceWeights, faceTypes);
// } break;
// }
return true;
}