diff --git a/src/main/java/com/seibel/lod/objects/LodQuadTree.java b/src/main/java/com/seibel/lod/objects/LodQuadTree.java index e5f751620..1ef9ed594 100644 --- a/src/main/java/com/seibel/lod/objects/LodQuadTree.java +++ b/src/main/java/com/seibel/lod/objects/LodQuadTree.java @@ -143,12 +143,6 @@ public class LodQuadTree { short widthRatio = (short) (lodNode.width / (2 * newLodNode.width)); 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); } diff --git a/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java b/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java index 8bf307815..de93dcb01 100644 --- a/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java @@ -4,6 +4,7 @@ import com.seibel.lod.enums.DistanceGenerationMode; import com.seibel.lod.handlers.LodQuadTreeDimensionFileHandler; import com.seibel.lod.util.LodUtil; import net.minecraft.client.Minecraft; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.DimensionType; import net.minecraft.world.server.ServerChunkProvider; import net.minecraft.world.server.ServerWorld; @@ -264,8 +265,8 @@ public class LodQuadTreeDimension { public Boolean addNode(LodQuadTreeNode lodNode) { RegionPos pos = new RegionPos( - lodNode.getStartX() / 512, - lodNode.getStartZ() / 512 + Math.floorDiv(lodNode.getStartX(), 512), + Math.floorDiv(lodNode.getStartZ(), 512) ); // don't continue if the region can't be saved @@ -296,6 +297,19 @@ public class LodQuadTreeDimension { return coorectlyAdded; } + /** + */ + public LodQuadTreeNode getLodFromCoordinates(ChunkPos chunkPos) + { + return getLodFromCoordinates(chunkPos.x, chunkPos.z, LodQuadTreeNode.CHUNK_LEVEL); + } + + /** + */ + public LodQuadTreeNode getLodFromCoordinates(int chunkPosX, int chunkPosZ) + { + return getLodFromCoordinates(chunkPosX, chunkPosZ, LodQuadTreeNode.CHUNK_LEVEL); + } /** * Get the LodNodeData at the given X and Z position in the level * in this dimension. @@ -305,9 +319,11 @@ public class LodQuadTreeDimension { */ public LodQuadTreeNode getLodFromCoordinates(int posX, int posZ, byte level) { - LodQuadTree region = getRegion((int) (posX/(512/Math.pow(level,2))),(int) (posZ/(512/Math.pow(level,2)))); - if(region == null) + LodQuadTree region = getRegion((Math.floorDiv(posX, (int) (512/Math.pow(level,2)))),(Math.floorDiv(posZ, (int) (512/Math.pow(level,2))))); + if(region == null) { + System.out.println("THIS CASE"); return null; + } return region.getNodeAtLevelPosition(posX, posZ, level); /* RegionPos pos = LodUtil.convertChunkPosToRegionPos(new ChunkPos(chunkX, chunkZ)); diff --git a/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java b/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java index 7c089d68f..153b43177 100644 --- a/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java +++ b/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java @@ -146,9 +146,6 @@ public class LodQuadTreeNode { index = data.indexOf(DATA_DELIMITER, 0); this.level = (byte) Integer.parseInt(data.substring(0,index)); - lastIndex = index; - index = data.indexOf(DATA_DELIMITER, lastIndex+1); - this.complexity = DistanceGenerationMode.valueOf(data.substring(lastIndex+1,index)); lastIndex = index; index = data.indexOf(DATA_DELIMITER, lastIndex+1); @@ -158,6 +155,10 @@ public class LodQuadTreeNode { index = data.indexOf(DATA_DELIMITER, lastIndex+1); this.posZ = Integer.parseInt(data.substring(lastIndex+1,index)); + lastIndex = index; + index = data.indexOf(DATA_DELIMITER, lastIndex+1); + this.complexity = DistanceGenerationMode.valueOf(data.substring(lastIndex+1,index)); + lastIndex = index; index = data.indexOf(DATA_DELIMITER, lastIndex+1); short height = (short) Integer.parseInt(data.substring(lastIndex+1,index)); @@ -258,18 +259,18 @@ public class LodQuadTreeNode { * Outputs all data in a csv format */ public String toData(){ - String s = ((int) level) + DATA_DELIMITER + String s = Integer.toString((int) level) + DATA_DELIMITER + + Integer.toString(posX) + DATA_DELIMITER + + Integer.toString(posZ) + DATA_DELIMITER + complexity.toString() + DATA_DELIMITER - + posX + DATA_DELIMITER - + posZ + DATA_DELIMITER - + ((int) lodDataPoint.height) + DATA_DELIMITER - + ((int) lodDataPoint.depth) + DATA_DELIMITER - + lodDataPoint.color.getRed() + DATA_DELIMITER - + lodDataPoint.color.getGreen() + DATA_DELIMITER - + lodDataPoint.color.getBlue() + DATA_DELIMITER - + lodDataPoint.color.getAlpha() + DATA_DELIMITER; + + Integer.toString(((int) lodDataPoint.height)) + DATA_DELIMITER + + Integer.toString(((int) lodDataPoint.depth)) + DATA_DELIMITER + + Integer.toString(lodDataPoint.color.getRed()) + DATA_DELIMITER + + Integer.toString(lodDataPoint.color.getGreen()) + DATA_DELIMITER + + Integer.toString(lodDataPoint.color.getBlue()) + DATA_DELIMITER + + Integer.toString(lodDataPoint.color.getAlpha()) + DATA_DELIMITER; int val = voidNode ? 1 : 0; - s += val + DATA_DELIMITER; + s += Integer.toString(val) + DATA_DELIMITER; return s; } diff --git a/src/main/java/com/seibel/lod/objects/QuadTreeImage.java b/src/main/java/com/seibel/lod/objects/QuadTreeImage.java index 2b3ca9988..ffde537d4 100644 --- a/src/main/java/com/seibel/lod/objects/QuadTreeImage.java +++ b/src/main/java/com/seibel/lod/objects/QuadTreeImage.java @@ -29,7 +29,7 @@ import javax.swing.Timer; @SuppressWarnings("serial") public class QuadTreeImage extends JPanel { - private static final int PREF_W = 1000; + private static final int PREF_W = 1536; private static final int PREF_H = PREF_W; private List drawables = new ArrayList<>(); @@ -68,15 +68,6 @@ public class QuadTreeImage extends JPanel { } private static void createAndShowGui() { - int playerX = 32*512; - int playerZ = 32*512; - LodQuadTreeDimension dim = new LodQuadTreeDimension(null, null, 64); - System.out.println(dim.getRegion(0, 0)); - dim.move(Math.floorDiv(playerX,512),Math.floorDiv(playerZ,512)); - - System.out.println(dim.getCenterX()); - System.out.println(dim.getCenterZ()); - System.out.println(dim.getWidth()); final QuadTreeImage quadTreeImage = new QuadTreeImage(); @@ -90,83 +81,115 @@ public class QuadTreeImage extends JPanel { List> listOfList = new ArrayList<>(); OverworldBiomeSource biomeSource = new OverworldBiomeSource(MCVersion.v1_16_5, 1000); //EndBiomeSource biomeSource = new EndBiomeSource(MCVersion.v1_16_5, 1000); - 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++) { - List levelToGenerate = dim.getNodeToGenerate(playerX, playerZ, (byte) (9 - i), DistanceGenerationMode.SERVER , distances[i], 0); - //System.out.println(levelToGenerate); - for (LodQuadTree level : levelToGenerate) { - Color color; - int startX = level.getLodNodeData().startX; - int startZ = level.getLodNodeData().startZ; - int endX = level.getLodNodeData().endX; - int endZ = level.getLodNodeData().endZ; - int centerX = level.getLodNodeData().centerX; - int centerZ = level.getLodNodeData().centerZ; - int width = level.getLodNodeData().width; - byte otherLevel = LodQuadTreeNode.BLOCK_LEVEL; - int otherWidth = LodQuadTreeNode.BLOCK_WIDTH; + int sizeOfTheWorld = 16; - List posXs = new ArrayList<>(); - List posZs = new ArrayList<>(); - if (level.getLodNodeData().level == 0) { - posXs.add(Math.floorDiv(startX , otherWidth)); - posZs.add(Math.floorDiv(startZ , otherWidth)); - } else { - posXs.add(Math.floorDiv(startX , otherWidth)); - posXs.add(Math.floorDiv(centerX + 1, otherWidth)); - posZs.add(Math.floorDiv(startZ, otherWidth)); - posZs.add(Math.floorDiv(centerZ +1 , otherWidth)); - } + LodQuadTreeDimension dim = new LodQuadTreeDimension(null, null, sizeOfTheWorld); - //System.out.println(posXs); - //System.out.println(posZs); + //SIMULATING A PLAYER MOVING, + int[] playerXs = {0,100,200,300,400,500}; + int[] playerZs = {0,100,200,300,400,500}; + for(int pos=0; pos<6; pos++) { + int playerX= playerXs[pos]; + int playerZ= playerZs[pos]; - for (Integer posXI : posXs) { - for (Integer posZI : posZs) { - int posX = posXI.intValue(); - int posZ = posZI.intValue(); - //System.out.println(posX + " " + posZ); - color = BiomeColorsUtils.getColorFromBiomeManual(biomeSource.getBiome(posX, 0, posZ)); - //color = BiomeColorsUtils.getColorFromIdCB(biomeSource.getBiome(posZ, 0, posX).getId()); - LodQuadTreeNode node = new LodQuadTreeNode(otherLevel, posX, posZ, new LodDataPoint(0, 0, color) , DistanceGenerationMode.SERVER); - dim.addNode(node); + //int sizeOfTheWorld=512; //TRY THIS TO SEE A 250'000 BLOCK RENDER DISTANCE + dim.move(Math.floorDiv(playerX, 512), Math.floorDiv(playerZ, 512)); +/* + System.out.println(dim.getRegion(0, 0)); + System.out.println(dim.getCenterX()); + System.out.println(dim.getCenterZ()); + System.out.println(dim.getWidth()); + + System.out.println("GETTING LOD FROM COORDINATE BEFORE GENERETION"); + System.out.println(dim.getLodFromCoordinates(-6, -6)); +*/ + + 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++) { + List levelToGenerate = dim.getNodeToGenerate(playerX, playerZ, (byte) (9 - i), DistanceGenerationMode.SERVER, distances[i], 0); + //System.out.println(levelToGenerate); + for (LodQuadTree level : levelToGenerate) { + Color color; + int startX = level.getLodNodeData().startX; + int startZ = level.getLodNodeData().startZ; + int endX = level.getLodNodeData().endX; + int endZ = level.getLodNodeData().endZ; + int centerX = level.getLodNodeData().centerX; + int centerZ = level.getLodNodeData().centerZ; + int width = level.getLodNodeData().width; + byte otherLevel = LodQuadTreeNode.BLOCK_LEVEL; + int otherWidth = LodQuadTreeNode.BLOCK_WIDTH; + + List posXs = new ArrayList<>(); + List posZs = new ArrayList<>(); + if (level.getLodNodeData().level == 0) { + posXs.add(Math.floorDiv(startX, otherWidth)); + posZs.add(Math.floorDiv(startZ, otherWidth)); + } else { + posXs.add(Math.floorDiv(startX, otherWidth)); + posXs.add(Math.floorDiv(centerX + 1, otherWidth)); + posZs.add(Math.floorDiv(startZ, otherWidth)); + posZs.add(Math.floorDiv(centerZ + 1, otherWidth)); + } + + //System.out.println(posXs); + //System.out.println(posZs); + + for (Integer posXI : posXs) { + for (Integer posZI : posZs) { + int posX = posXI.intValue(); + int posZ = posZI.intValue(); + //System.out.println(posX + " " + posZ); + color = BiomeColorsUtils.getColorFromBiomeManual(biomeSource.getBiome(posX, 0, posZ)); + //color = BiomeColorsUtils.getColorFromIdCB(biomeSource.getBiome(posZ, 0, posX).getId()); + LodQuadTreeNode node = new LodQuadTreeNode(otherLevel, posX, posZ, new LodDataPoint(0, 0, color), DistanceGenerationMode.SERVER); + if (dim.addNode(node)) { + } + } } } } - } - /* - List lodList = new ArrayList<>(); - 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)); + + //Set complexityMask = new HashSet<>(); + //complexityMask.add(DistanceGenerationMode.SERVER); + //complexityMask.add(DistanceGenerationMode.FEATURES); + //complexityMask.add(DistanceGenerationMode.SURFACE); + //complexityMask.add(DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT); + //complexityMask.add(DistanceGenerationMode.BIOME_ONLY); + + Set complexityMask = LodQuadTreeDimension.FULL_COMPLEXITY_MASK; + + List lodList = new ArrayList<>(); + //The min and max distances should increase quadratically + + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 3, complexityMask, 250,0)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 4, complexityMask,500,250)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 5, complexityMask,1000,500)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 6, complexityMask,2000,1000)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 7, complexityMask,4000,2000)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 8, complexityMask,8000,4000)); + lodList.addAll(dim.getNodeToRender(playerX,playerZ,(byte) 9, complexityMask,100000,8000)); System.out.println(lodList.size()); - */ - Set complexityMask = new HashSet<>(); - complexityMask.add(DistanceGenerationMode.SERVER); - complexityMask.add(DistanceGenerationMode.FEATURES); - complexityMask.add(DistanceGenerationMode.SURFACE); - complexityMask.add(DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT); - complexityMask.add(DistanceGenerationMode.BIOME_ONLY); - List lodList = dim.getNodes(complexityMask,false,false); - // lodList.addAll(lodQuadTree.getNodeToRender(playerX, playerZ, (byte) 2, 100, 0)); - // lodList.addAll(lodQuadTree.getNodeToRender(playerX, playerZ, (byte) 3, 200, 100)); - // lodList.addAll(lodQuadTree.getNodeToRender(playerX, playerZ, (byte) 4, 400, 200)); - // lodList.addAll(lodQuadTree.getNodeToRender(playerX, playerZ, (byte) 5, 10000, 400)); - listOfList.add(lodList); + + + // List lodList = dim.getNodes(complexityMask, false, false); //USE THIS TO SEE AL THE LODS + listOfList.add(lodList); + } } + System.out.println("GETTING LOD FROM COORDINATE AFTER GENERETION"); + System.out.println(dim.getLodFromCoordinates(0,100, (byte) 1)); + //FROM THIS POINT ON THE CODE JUST CREATE THE IMAGE - - int timerDelay = 0; + int timerDelay = 200; System.out.println("STARTING"); System.out.println(dim.getWidth()); System.out.println(dim.getCenterX()); int xOffset = listOfList.stream().mapToInt(x -> x.stream().mapToInt(y -> y.startX).min().getAsInt()).min().getAsInt(); int zOffset = listOfList.stream().mapToInt(x -> x.stream().mapToInt(y -> y.startZ).min().getAsInt()).min().getAsInt(); + int maxX = listOfList.stream().mapToInt(x -> x.stream().mapToInt(y -> y.startX).max().getAsInt()).min().getAsInt(); + int maxZ = listOfList.stream().mapToInt(x -> x.stream().mapToInt(y -> y.startZ).max().getAsInt()).min().getAsInt(); + int maxSize = Math.max(maxX-xOffset,maxZ - zOffset)/512; System.out.println(xOffset); System.out.println(zOffset); new Timer(timerDelay, new ActionListener() { @@ -179,7 +202,7 @@ public class QuadTreeImage extends JPanel { } else { if(drawCount==0) quadTreeImage.clearAll(); final List myDrawables = new ArrayList<>(); - double amp = 0.025; + double amp = ((double) 3)/((double) sizeOfTheWorld); Collection lodList = listOfList.get(drawCount); for (LodQuadTreeNode data : lodList) { myDrawables.add(new MyDrawable(new Rectangle2D.Double( @@ -189,15 +212,19 @@ public class QuadTreeImage extends JPanel { data.width * amp), data.lodDataPoint.color, new BasicStroke(1))); } + /* myDrawables.add(new MyDrawable(new Rectangle2D.Double( (playerX - 10 - xOffset) * amp, (playerZ - 10 - zOffset) * amp, 20* amp, 20* amp), Color.yellow, new BasicStroke(1))); + + */ for (int k = 0; k < myDrawables.size(); k++) { quadTreeImage.addMyDrawable(myDrawables.get(k)); } + /* BufferedImage img = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g2d = img.createGraphics(); frame.printAll(g2d); @@ -207,6 +234,7 @@ public class QuadTreeImage extends JPanel { } catch (IOException ioException) { ioException.printStackTrace(); } + */ drawCount++; } }