diff --git a/src/main/java/backsun/lod/objects/LoadedRegions.java b/src/main/java/backsun/lod/objects/LoadedRegions.java index 3170afdf7..2e2d962e1 100644 --- a/src/main/java/backsun/lod/objects/LoadedRegions.java +++ b/src/main/java/backsun/lod/objects/LoadedRegions.java @@ -167,6 +167,7 @@ public class LoadedRegions if (xIndex < 0 || xIndex >= width || zIndex < 0 || zIndex >= width) // out of range + // TODO, should this throw an exception? return; regions[xIndex][zIndex] = newRegion; @@ -179,29 +180,28 @@ public class LoadedRegions public void addLod(LodChunk lod) { - int x = lod.x / 16; - int z = lod.z / 16; + int regionX = (lod.x + centerX) / LodRegion.SIZE; + int regionZ = (lod.z + centerZ) / LodRegion.SIZE; // prevent issues if X/Z is negative and less than 16 if (lod.x < 0) { - x = (Math.abs(x) * -1) - 1; + regionX = (Math.abs(regionX) * -1) - 1; } if (lod.z < 0) { - z = (Math.abs(z) * -1) - 1; + regionZ = (Math.abs(regionZ) * -1) - 1; } - LodRegion region = getRegion(x, z); + LodRegion region = getRegion(regionX, regionZ); if (region == null) { // if no region exists, create it - region = new LodRegion(x, z); + region = new LodRegion(regionX, regionZ); setRegion(region); } - // TODO check what should be happening here region.addLod(lod); } @@ -209,27 +209,23 @@ public class LoadedRegions /** * Returns null if the LodChunk isn't loaded */ - public LodChunk getChunkFromCoordinates(int chunkX, int chunkZ) + public LodChunk getLodFromCoordinates(int chunkX, int chunkZ) { // (chunkX + centerX) % width - int xIndex = (chunkX + centerX) / LodRegion.SIZE; - int zIndex = (chunkZ + centerZ) / LodRegion.SIZE; + int regionX = (chunkX + centerX) / LodRegion.SIZE; + int regionZ = (chunkZ + centerZ) / LodRegion.SIZE; // prevent issues if chunkX/Z is negative and less than width if (chunkX < 0) { - xIndex = (Math.abs(xIndex) * -1) - 1; + regionX = (Math.abs(regionX) * -1) - 1; } if (chunkZ < 0) { - zIndex = (Math.abs(zIndex) * -1) - 1; + regionZ = (Math.abs(regionZ) * -1) - 1; } - LodRegion region = getRegion(xIndex, zIndex); - - // TODO should abs be used here? - //if(chunkX < 0 || chunkZ < 0) - // return null; + LodRegion region = getRegion(regionX, regionZ); if(region == null) return null; diff --git a/src/main/java/backsun/lod/objects/LodRegion.java b/src/main/java/backsun/lod/objects/LodRegion.java index 0af7431c7..a0ac30e5b 100644 --- a/src/main/java/backsun/lod/objects/LodRegion.java +++ b/src/main/java/backsun/lod/objects/LodRegion.java @@ -37,8 +37,8 @@ public class LodRegion // the region will negative first, therefore we don't have to // store the LOD chunks at negative indexes since we search // LOD the region first - int xIndex = Math.abs(lod.x % LodChunk.WIDTH); - int zIndex = Math.abs(lod.z % LodChunk.WIDTH); + int xIndex = Math.abs(lod.x % SIZE); + int zIndex = Math.abs(lod.z % SIZE); chunks[xIndex][zIndex] = lod; } @@ -47,8 +47,8 @@ public class LodRegion public LodChunk getLod(int x, int z) { // since we add LOD's with ABS, we get them the same way - x = Math.abs(x); - z = Math.abs(z); + x = Math.abs(x % SIZE); + z = Math.abs(z % SIZE); if(x >= SIZE || z >= SIZE) return null; diff --git a/src/main/java/backsun/lod/renderer/LodRenderer.java b/src/main/java/backsun/lod/renderer/LodRenderer.java index 85599e8f6..925de275e 100644 --- a/src/main/java/backsun/lod/renderer/LodRenderer.java +++ b/src/main/java/backsun/lod/renderer/LodRenderer.java @@ -149,10 +149,10 @@ public class LodRenderer startX; // offset so the center LOD block is centered underneath the player double zOffset = -cameraZ + (LOD_WIDTH * j) + startZ; - int chunkX = ((LOD_WIDTH * i) + startX) / MINECRAFT_CHUNK_WIDTH; - int chunkZ = ((LOD_WIDTH * j) + startZ) / MINECRAFT_CHUNK_WIDTH; + int chunkX = i + (startX / MINECRAFT_CHUNK_WIDTH); + int chunkZ = j + (startZ / MINECRAFT_CHUNK_WIDTH); - LodChunk lod = regions.getChunkFromCoordinates(chunkX, chunkZ); + LodChunk lod = regions.getLodFromCoordinates(chunkX, chunkZ); if (lod == null) { @@ -165,7 +165,6 @@ public class LodRenderer double yOffset = -cameraY; - // if debugging draw the squares as a black and white checker board if (debugging) {