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

View File

@ -192,23 +192,23 @@ public class DrawCell {
for(int y = 0; y < ChunkData.CHUNK_DATA_GENERATOR_SIZE; y++){ for(int y = 0; y < ChunkData.CHUNK_DATA_GENERATOR_SIZE; y++){
for(int z = 0; z < ChunkData.CHUNK_DATA_GENERATOR_SIZE; z++){ for(int z = 0; z < ChunkData.CHUNK_DATA_GENERATOR_SIZE; z++){
ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint( ChunkData currentChunk = Globals.clientTerrainManager.getChunkDataAtWorldPoint(
worldPos.x + (x * spacingFactor) / ChunkData.CHUNK_SIZE, worldPos.x + x / ChunkData.CHUNK_SIZE * spacingFactor,
worldPos.y + (y * spacingFactor) / ChunkData.CHUNK_SIZE, worldPos.y + y / ChunkData.CHUNK_SIZE * spacingFactor,
worldPos.z + (z * spacingFactor) / ChunkData.CHUNK_SIZE, worldPos.z + z / ChunkData.CHUNK_SIZE * spacingFactor,
ChunkData.NO_STRIDE ChunkData.NO_STRIDE
); );
if(currentChunk == null){ if(currentChunk == null){
return false; return false;
} }
weights[x][y][z] = currentChunk.getWeight( weights[x][y][z] = currentChunk.getWeight(
(x * spacingFactor) % ChunkData.CHUNK_SIZE, x % ChunkData.CHUNK_SIZE,
(y * spacingFactor) % ChunkData.CHUNK_SIZE, y % ChunkData.CHUNK_SIZE,
(z * spacingFactor) % ChunkData.CHUNK_SIZE z % ChunkData.CHUNK_SIZE
); );
types[x][y][z] = currentChunk.getType( types[x][y][z] = currentChunk.getType(
(x * spacingFactor) % ChunkData.CHUNK_SIZE, x % ChunkData.CHUNK_SIZE,
(y * spacingFactor) % ChunkData.CHUNK_SIZE, y % ChunkData.CHUNK_SIZE,
(z * spacingFactor) % ChunkData.CHUNK_SIZE z % ChunkData.CHUNK_SIZE
); );
//checks to see if there is only one type of voxel in this chunk //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 * @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 higherResSpacing = (int)Math.pow(2,lod - 1);
float[][] faceWeights = new float[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS]; // float[][] faceWeights = new float[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS];
int[][] faceTypes = new int[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS]; // int[][] faceTypes = new int[TransvoxelModelGeneration.FACE_DATA_DIMENSIONS][TransvoxelModelGeneration.FACE_DATA_DIMENSIONS];
//allocate face array // //allocate face array
for(int x = 0; x < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; x++){ // for(int x = 0; x < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; x++){
for(int y = 0; y < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; y++){ // for(int y = 0; y < TransvoxelModelGeneration.FACE_DATA_DIMENSIONS; y++){
int worldCoordOffset1 = (x * higherResSpacing) / ChunkData.CHUNK_SIZE; // int worldCoordOffset1 = (x * higherResSpacing) / ChunkData.CHUNK_SIZE;
int worldCoordOffset2 = (y * higherResSpacing) / ChunkData.CHUNK_SIZE; // int worldCoordOffset2 = (y * higherResSpacing) / ChunkData.CHUNK_SIZE;
//solve coordinates relative to the face // //solve coordinates relative to the face
int localCoord1 = (x * higherResSpacing) % ChunkData.CHUNK_SIZE; // int localCoord1 = (x * higherResSpacing) % ChunkData.CHUNK_SIZE;
int localCoord2 = (y * higherResSpacing) % ChunkData.CHUNK_SIZE; // int localCoord2 = (y * higherResSpacing) % 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 + (17 * mainSpacing) / ChunkData.CHUNK_SIZE,
worldPos.y + worldCoordOffset1, // worldPos.y + worldCoordOffset1,
worldPos.z + worldCoordOffset2 // worldPos.z + worldCoordOffset2
), // ),
ChunkData.NO_STRIDE // ChunkData.NO_STRIDE
); // );
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 // ChunkData.NO_STRIDE
); // );
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 + (17 * mainSpacing) / ChunkData.CHUNK_SIZE,
worldPos.z + worldCoordOffset2 // worldPos.z + worldCoordOffset2
), // ),
ChunkData.NO_STRIDE // ChunkData.NO_STRIDE
); // );
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 // ChunkData.NO_STRIDE
); // );
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 + (17 * mainSpacing) / ChunkData.CHUNK_SIZE
), // ),
ChunkData.NO_STRIDE // ChunkData.NO_STRIDE
); // );
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 // ChunkData.NO_STRIDE
); // );
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;
} }