diff --git a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java index a99371552..54c29988e 100644 --- a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java @@ -130,7 +130,7 @@ public class LodNodeBufferBuilder List lodToRender = new ArrayList<>(); - lodToRender.addAll(lodDim.getNodeToRender((int) playerX,(int)playerZ,(byte) 0, 100000,0)); + lodToRender.addAll(lodDim.getNodeToRender((int) playerX,(int)playerZ,(byte) 0, LodQuadTreeDimension.FULL_COMPLEXITY_MASK, 100000,0)); /* lodToRender.addAll(lodDim.getNodeToRender((int) playerX,(int)playerZ,(byte) 9, 100000,8000)); lodToRender.addAll(lodDim.getNodeToRender((int)playerX,(int)playerZ,(byte) 8, 8000,4000)); diff --git a/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java b/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java index ed66c6965..fbc1b3314 100644 --- a/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java @@ -1,5 +1,7 @@ package com.seibel.lod.builders; +import com.seibel.lod.enums.DistanceGenerationMode; +import com.seibel.lod.objects.LodDataPoint; import com.seibel.lod.objects.LodQuadTreeNode; import com.seibel.lod.objects.LodQuadTreeDimension; import com.seibel.lod.objects.LodQuadTreeWorld; @@ -134,7 +136,7 @@ public class LodNodeBuilder { depth = determineBottomPointForArea(chunk.getSections(), startX, startZ, endX, endZ); - return new LodQuadTreeNode(LodQuadTreeNode.CHUNK_LEVEL, chunk.getPos().x, chunk.getPos().z, height, depth, color, true); + return new LodQuadTreeNode(LodQuadTreeNode.CHUNK_LEVEL, chunk.getPos().x, chunk.getPos().z, new LodDataPoint(height, depth, color) , DistanceGenerationMode.SERVER); } diff --git a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/CubicLodNodeTemplate.java b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/CubicLodNodeTemplate.java index 230f74470..374644803 100644 --- a/src/main/java/com/seibel/lod/builders/lodNodeTemplates/CubicLodNodeTemplate.java +++ b/src/main/java/com/seibel/lod/builders/lodNodeTemplates/CubicLodNodeTemplate.java @@ -42,15 +42,15 @@ public class CubicLodNodeTemplate extends AbstractLodNodeTemplate { // returns null if the lod is empty at the given location bbox = generateBoundingBox( - lod.height, - lod.height, + lod.lodDataPoint.height, + lod.lodDataPoint.height, detail.dataPointWidth, xOffset - (halfWidth / 2) + startX, yOffset, zOffset - (halfWidth / 2) + startZ); if (bbox != null) { - addBoundingBoxToBuffer(buffer, bbox, lod.color); + addBoundingBoxToBuffer(buffer, bbox, lod.lodDataPoint.color); } } diff --git a/src/main/java/com/seibel/lod/enums/DistanceGenerationMode.java b/src/main/java/com/seibel/lod/enums/DistanceGenerationMode.java index dabf794ed..6b7fa36b5 100644 --- a/src/main/java/com/seibel/lod/enums/DistanceGenerationMode.java +++ b/src/main/java/com/seibel/lod/enums/DistanceGenerationMode.java @@ -14,6 +14,9 @@ package com.seibel.lod.enums; */ public enum DistanceGenerationMode { + /** No generation has be used*/ + NONE, + /** Only generate the biomes and use biome * grass/foliage color, water color, or ice color * to generate the color. diff --git a/src/main/java/com/seibel/lod/handlers/LodQuadTreeDimensionFileHandler.java b/src/main/java/com/seibel/lod/handlers/LodQuadTreeDimensionFileHandler.java index 569ee74ed..886e19312 100644 --- a/src/main/java/com/seibel/lod/handlers/LodQuadTreeDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/handlers/LodQuadTreeDimensionFileHandler.java @@ -275,7 +275,7 @@ public class LodQuadTreeDimensionFileHandler { fw.write(LOD_FILE_VERSION_PREFIX + " " + LOD_SAVE_FILE_VERSION + "\n"); // add each LodChunk to the file - for(LodQuadTreeNode lodQuadTreeNode : Collections.unmodifiableList(region.getNodeList(false, true, true))) { + for(LodQuadTreeNode lodQuadTreeNode : Collections.unmodifiableList(region.getNodeList(LodQuadTreeDimension.FULL_COMPLEXITY_MASK , true, true))) { fw.write(lodQuadTreeNode.toData() + "\n"); lodQuadTreeNode.dirty = false; } diff --git a/src/main/java/com/seibel/lod/objects/LodQuadTree.java b/src/main/java/com/seibel/lod/objects/LodQuadTree.java index a9f2bb637..e5f751620 100644 --- a/src/main/java/com/seibel/lod/objects/LodQuadTree.java +++ b/src/main/java/com/seibel/lod/objects/LodQuadTree.java @@ -149,14 +149,11 @@ public class LodQuadTree { if(posX<0) WE = 1 - WE; if(posZ<0) NS = 1 - NS; */ - if(posX<0) System.out.println(WE); - if(posZ<0) System.out.println(NS); - if (getChild(NS, WE) == null) { setChild(NS, WE); } LodQuadTree child = getChild(NS, WE); - if (lodNode.compareComplexity(newLodNode) < 0) { + if (lodNode.compareComplexity(newLodNode) > 0) { //the node we want to introduce is less complex than the current node //we don't want to override higher complexity with lower complexity return false; @@ -318,7 +315,7 @@ public class LodQuadTree { */ public List getNodeToRender(int x, int z, byte targetLevel, Set complexityMask, int maxDistance, int minDistance) { List distances = new ArrayList(); - distances.add((int) Math.sqrt(Math.pow(x - lodNode.getCenterX(), 2) + Math.pow(z - lodNode.getCenterX(), 2))); + distances.add((int) Math.sqrt(Math.pow(x - lodNode.getCenterX(), 2) + Math.pow(z - lodNode.getCenterZ(), 2))); distances.add((int) Math.sqrt(Math.pow(x - lodNode.getStartX(), 2) + Math.pow(z - lodNode.getStartZ(), 2))); distances.add((int) Math.sqrt(Math.pow(x - lodNode.getStartX(), 2) + Math.pow(z - lodNode.getEndZ(), 2))); distances.add((int) Math.sqrt(Math.pow(x - lodNode.getEndX(), 2) + Math.pow(z - lodNode.getStartZ(), 2))); @@ -362,7 +359,7 @@ public class LodQuadTree { public List> getLevelToGenerate(int x, int z, byte targetLevel, DistanceGenerationMode complexityToGenerate, int maxDistance, int minDistance) { List distances = new ArrayList(); - distances.add((int) Math.sqrt(Math.pow(x - lodNode.getCenterX(), 2) + Math.pow(z - lodNode.getCenterX(), 2))); + distances.add((int) Math.sqrt(Math.pow(x - lodNode.getCenterX(), 2) + Math.pow(z - lodNode.getCenterZ(), 2))); distances.add((int) Math.sqrt(Math.pow(x - lodNode.getStartX(), 2) + Math.pow(z - lodNode.getStartZ(), 2))); distances.add((int) Math.sqrt(Math.pow(x - lodNode.getStartX(), 2) + Math.pow(z - lodNode.getEndZ(), 2))); distances.add((int) Math.sqrt(Math.pow(x - lodNode.getEndX(), 2) + Math.pow(z - lodNode.getStartZ(), 2))); @@ -389,7 +386,7 @@ public class LodQuadTree { }else{ if(this.lodNode.getComplexity().compareTo(complexityToGenerate) > 0) { //we want to regenerate a level only if we ask for higher complexity - nodeList.add(new AbstractMap.SimpleEntry<>(this, min) + nodeList.add(new AbstractMap.SimpleEntry<>(this, min)); } } } else { diff --git a/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java b/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java index bc317fad7..8bf307815 100644 --- a/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodQuadTreeDimension.java @@ -7,6 +7,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.world.DimensionType; import net.minecraft.world.server.ServerChunkProvider; import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.api.distmarker.Dist; import java.io.File; import java.io.IOException; @@ -20,6 +21,14 @@ public class LodQuadTreeDimension { private volatile int halfWidth; public long seed; + public static final Set FULL_COMPLEXITY_MASK = new HashSet(){{ + add(DistanceGenerationMode.BIOME_ONLY); + add(DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT); + add(DistanceGenerationMode.SURFACE); + add(DistanceGenerationMode.FEATURES); + add(DistanceGenerationMode.SERVER); + }}; + public volatile LodQuadTree regions[][]; public volatile boolean isRegionDirty[][]; @@ -316,7 +325,7 @@ public class LodQuadTreeDimension { */ public boolean hasThisPositionBeenGenerated(int posX, int posZ, byte level) { - return getLodFromCoordinates(posX,posZ,level).level == level + return getLodFromCoordinates(posX,posZ,level).level == level; } /** @@ -338,7 +347,7 @@ public class LodQuadTreeDimension { * method to get all the quadtree level that have to be generated based on the position of the player * @return list of quadTrees */ - public List getNodeToGenerate(int x, int z, byte level, int maxDistance, int minDistance){ + public List getNodeToGenerate(int x, int z, byte level, DistanceGenerationMode complexity, int maxDistance, int minDistance){ int n = regions.length; int xIndex; @@ -354,7 +363,7 @@ public class LodQuadTreeDimension { region = new LodQuadTree(xIndex, zIndex); setRegion(region); } - listOfQuadTree.addAll(region.getLevelToGenerate(x,z,level,maxDistance,minDistance)); + listOfQuadTree.addAll(region.getLevelToGenerate(x,z,level,complexity,maxDistance,minDistance)); } } Collections.sort(listOfQuadTree,Map.Entry.comparingByValue()); @@ -438,10 +447,9 @@ public class LodQuadTreeDimension { if(region == null) continue; - numbLods= region.getNodeList(false,false,true).size(); + numbLods= region.getNodeList(FULL_COMPLEXITY_MASK,false,true).size(); } } - return numbLods; } diff --git a/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java b/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java index 288390f38..7c089d68f 100644 --- a/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java +++ b/src/main/java/com/seibel/lod/objects/LodQuadTreeNode.java @@ -81,7 +81,7 @@ public class LodQuadTreeNode { centerX = startX + width/2; centerZ = startZ + width/2; lodDataPoint = new LodDataPoint(); - complexity = null; + complexity = DistanceGenerationMode.NONE; dirty = true; voidNode = true; } @@ -221,11 +221,11 @@ public class LodQuadTreeNode { //the new complexity equal to the lowest complexity of the list DistanceGenerationMode minComplexity = DistanceGenerationMode.SERVER; - dataList.forEach(x -> { - if (minComplexity.compareTo(x.complexity) < 0){ - minComplexity = x.complexity; + for(LodQuadTreeNode node: dataList){ + if (minComplexity.compareTo(node.complexity) < 0){ + minComplexity = node.complexity; } - }); + } complexity = minComplexity; voidNode = dataList.stream().filter(x -> !x.voidNode).count() == 0; diff --git a/src/main/java/com/seibel/lod/objects/QuadTreeImage.java b/src/main/java/com/seibel/lod/objects/QuadTreeImage.java index 7396dd319..2b3ca9988 100644 --- a/src/main/java/com/seibel/lod/objects/QuadTreeImage.java +++ b/src/main/java/com/seibel/lod/objects/QuadTreeImage.java @@ -68,28 +68,16 @@ public class QuadTreeImage extends JPanel { } private static void createAndShowGui() { - int playerX = 0; - int playerZ = 0; - LodQuadTreeDimension dim = new LodQuadTreeDimension(null, null, 4); + 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()); - LodQuadTree level2 = dim.getRegion( - -1, - -1 - ); - int startX2 = level2.getLodNodeData().startX; - int startZ2 = level2.getLodNodeData().startZ; - int endX2 = level2.getLodNodeData().endX; - int endZ2 = level2.getLodNodeData().endZ; - int centerX2 = level2.getLodNodeData().centerX; - int centerZ2 = level2.getLodNodeData().centerZ; - int width2 = level2.getLodNodeData().width; - System.out.println(startX2+" "+startZ2+" "+centerX2+" "+centerZ2); final QuadTreeImage quadTreeImage = new QuadTreeImage(); @@ -105,7 +93,7 @@ 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++) { - List levelToGenerate = dim.getNodeToGenerate(playerX, playerZ, (byte) (9 - i), distances[i], 0); + List levelToGenerate = dim.getNodeToGenerate(playerX, playerZ, (byte) (9 - i), DistanceGenerationMode.SERVER , distances[i], 0); //System.out.println(levelToGenerate); for (LodQuadTree level : levelToGenerate) { Color color; @@ -141,7 +129,7 @@ public class QuadTreeImage extends JPanel { //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, 0, 0, color, true); + LodQuadTreeNode node = new LodQuadTreeNode(otherLevel, posX, posZ, new LodDataPoint(0, 0, color) , DistanceGenerationMode.SERVER); dim.addNode(node); } } @@ -191,7 +179,7 @@ public class QuadTreeImage extends JPanel { } else { if(drawCount==0) quadTreeImage.clearAll(); final List myDrawables = new ArrayList<>(); - double amp = 0.4; + double amp = 0.025; Collection lodList = listOfList.get(drawCount); for (LodQuadTreeNode data : lodList) { myDrawables.add(new MyDrawable(new Rectangle2D.Double( @@ -199,7 +187,7 @@ public class QuadTreeImage extends JPanel { ((data.startZ - zOffset) * amp), data.width * amp, data.width * amp), - data.color, new BasicStroke(1))); + data.lodDataPoint.color, new BasicStroke(1))); } myDrawables.add(new MyDrawable(new Rectangle2D.Double( (playerX - 10 - xOffset) * amp, @@ -277,9 +265,9 @@ class MyDrawable { Stroke oldStroke = g2.getStroke(); g2.setColor(color); - //g2.fill(shape); + g2.fill(shape); - g2.setStroke(stroke); + //g2.setStroke(stroke); g2.draw(shape); g2.setColor(oldColor); diff --git a/src/main/java/com/seibel/lod/render/LodNodeRenderer.java b/src/main/java/com/seibel/lod/render/LodNodeRenderer.java index ea881d746..cde90623e 100644 --- a/src/main/java/com/seibel/lod/render/LodNodeRenderer.java +++ b/src/main/java/com/seibel/lod/render/LodNodeRenderer.java @@ -128,7 +128,7 @@ public class LodNodeRenderer * Besides drawing the LODs this method also starts * the async process of generating the Buffers that hold those LODs. * - * @param newDimension The dimension to draw, if null doesn't replace the current dimension. + * @param newDim The dimension to draw, if null doesn't replace the current dimension. * @param partialTicks how far into the current tick this method was called. */ public void drawLODs(LodQuadTreeDimension lodDim, float partialTicks, IProfiler newProfiler) @@ -788,7 +788,7 @@ public class LodNodeRenderer LodQuadTreeNode lod = lodDim.getLodFromCoordinates(x, z, (byte) 4); if (lod != null) { - short lodHighestPoint = lod.height; + short lodHighestPoint = lod.lodDataPoint.height; if (playerPos.getY() < lodHighestPoint) {