diff --git a/src/main/java/com/seibel/lod/objects/quadTree/LodQuadTree.java b/src/main/java/com/seibel/lod/objects/quadTree/LodQuadTree.java index 8edcf81e8..4e3961e40 100644 --- a/src/main/java/com/seibel/lod/objects/quadTree/LodQuadTree.java +++ b/src/main/java/com/seibel/lod/objects/quadTree/LodQuadTree.java @@ -133,11 +133,19 @@ public class LodQuadTree { byte targetLevel = newLodNodeData.level; byte currentLevel = lodNodeData.level; if (targetLevel < currentLevel) { - int posX = Math.abs(newLodNodeData.posX); - int posZ = Math.abs(newLodNodeData.posZ); + int posX = newLodNodeData.posX; + int posZ = newLodNodeData.posZ; short widthRatio = (short) (lodNodeData.width / (2 * newLodNodeData.width)); - int WE = Math.abs((posX / widthRatio) % 2); - int NS = Math.abs((posZ / widthRatio) % 2); + int WE = Math.abs(Math.floorDiv(posX , widthRatio) % 2); + int NS = Math.abs(Math.floorDiv(posZ , widthRatio) % 2); + //These two if fix the negative coordinate problema + //I don't know why, there is some problem with the %2 operation + /* + if(posX<0) WE = 1 - WE; + if(posZ<0) NS = 1 - NS; + + */ + if (getChild(NS, WE) == null) { setChild(NS, WE); } @@ -170,9 +178,9 @@ public class LodQuadTree { if (targetLevel == currentLevel) { return lodNodeData; } else if (targetLevel < currentLevel) { - short widthRatio = (short) (lodNodeData.width / Math.pow(2, level)); - int WE = Math.abs((posX / widthRatio) % lodNodeData.posX); - int NS = Math.abs((posZ / widthRatio) % lodNodeData.posZ); + short widthRatio = (short) (lodNodeData.width / (2 * Math.pow(2, level))); + int WE = Math.abs(Math.floorDiv(posX , widthRatio) % 2); + int NS = Math.abs(Math.floorDiv(posZ , widthRatio) % 2); if (getChild(NS, WE) == null) { return null; } @@ -311,7 +319,7 @@ public class LodQuadTree { if (targetLevel > lodNodeData.level) { return nodeList; } - if ((min > maxDistance || max < minDistance) && !isCoordinateInLevel(x,z)){ + if ((min > maxDistance || max < minDistance) /*&& !isCoordinateInLevel(x,z)*/){ return nodeList; } if (targetLevel == lodNodeData.level || !isNodeFull()) { @@ -325,7 +333,7 @@ public class LodQuadTree { } else { for (int NS = 0; NS <= 1; NS++) { for (int WE = 0; WE <= 1; WE++) { - LodQuadTree child = children[NS][WE]; + LodQuadTree child = getChild(NS,WE); if (child != null) { nodeList.addAll(child.getNodeToRender(x, z, targetLevel, maxDistance, minDistance)); } @@ -368,10 +376,10 @@ public class LodQuadTree { if (targetLevel != lodNodeData.level) { for (int NS = 0; NS <= 1; NS++) { for (int WE = 0; WE <= 1; WE++) { - if (children[NS][WE] == null) { + if (getChild(NS,WE) == null) { setChild(NS,WE); } - LodQuadTree child = children[NS][WE]; + LodQuadTree child = getChild(NS,WE); nodeList.addAll(child.getLevelToGenerate(x, z, targetLevel, maxDistance, minDistance)); } } diff --git a/src/main/java/com/seibel/lod/objects/quadTree/QuadTreeImage.java b/src/main/java/com/seibel/lod/objects/quadTree/QuadTreeImage.java index bf09f9f17..8450cbf5f 100644 --- a/src/main/java/com/seibel/lod/objects/quadTree/QuadTreeImage.java +++ b/src/main/java/com/seibel/lod/objects/quadTree/QuadTreeImage.java @@ -75,11 +75,13 @@ public class QuadTreeImage extends JPanel { } private static void createAndShowGui() { - int playerX =-0*511; - int playerZ =-0*511; + int playerX =-40; + int playerZ =-250; LodQuadTreeDimension dim = new LodQuadTreeDimension(null, null, 16); System.out.println(dim.getRegion(0, 0)); - dim.move(playerX/512,playerZ/512); + dim.move(Math.floorDiv(playerX,512),Math.floorDiv(playerZ,512)); + + System.out.println(playerX/512 + " " + playerZ/512); System.out.println(dim.getCenterX()); System.out.println(dim.getCenterZ()); System.out.println(dim.getWidth()); @@ -98,12 +100,6 @@ public class QuadTreeImage extends JPanel { int[] distances = {100000,8000,4000,2000,1000,500,250,100,50,25}; for (int i = 0; i <= (9 - 2); i++) { for (int j = 0; j < 1; j++) { - int dist; - if (i == 0) { - dist = 2000; - } else { - dist = 32; - } List levelToGenerate = dim.getNodeToGenerate(playerX, playerZ, (byte) (9 - i), distances[i], 0); System.out.println(levelToGenerate); for (LodQuadTree level : levelToGenerate) { @@ -135,7 +131,7 @@ public class QuadTreeImage extends JPanel { int posX = posXI.intValue(); int posZ = posZI.intValue(); //System.out.println(posX + " " + posZ); - color = BiomeColorsUtils.getColorFromBiomeManual(biomeSource.getBiome(posZ, 0, posX)); + color = BiomeColorsUtils.getColorFromBiomeManual(biomeSource.getBiome(posX, 0, posZ)); //color = BiomeColorsUtils.getColorFromIdCB(biomeSource.getBiome(posZ, 0, posX).getId()); LodNodeData node = new LodNodeData(otherLevel, posX, posZ, 0, 0, color, true); dim.addNode(node); @@ -144,13 +140,13 @@ public class QuadTreeImage extends JPanel { } } List lodList = new ArrayList<>(); - lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 9, 100000,8000)); - lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 8, 8000,4000)); - lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 7, 4000,2000)); - lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 6, 2000,1000)); - lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 5, 1000,500)); - lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 4, 500,250)); lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 3, 250,0)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 4, 500,250)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 5, 1000,500)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 6, 2000,1000)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 7, 4000,2000)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 8, 8000,4000)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 9, 100000,8000)); System.out.println(lodList.size()); //Collection lodList = dim.getNodes(false,false,false); // lodList.addAll(lodQuadTree.getNodeToRender(playerX, playerZ, (byte) 2, 100, 0));