From bd9c3bba3f179f76f7f319c64854cceb8b21ec43 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Fri, 20 Aug 2021 16:07:27 +0200 Subject: [PATCH] added getDataTeRender --- .../com/seibel/lod/objects/LodDimension.java | 46 ++++++++ .../com/seibel/lod/objects/LodRegion.java | 101 ++++++++++++++---- 2 files changed, 128 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 63e88a046..c35732b61 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -28,6 +28,7 @@ import net.minecraft.world.server.ServerWorld; import java.io.File; import java.io.IOException; +import java.util.List; /** * This object holds all loaded LOD regions @@ -347,6 +348,51 @@ public class LodDimension return getData(levelPos); } + + /** + * 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 getDataToGenerate(int x, int z, byte level, DistanceGenerationMode complexity, int maxDistance, int minDistance){ + + int n = regions.length; + int xIndex; + int zIndex; + LodQuadTree region; + List> listOfQuadTree = new ArrayList<>(); + for(int xRegion=0; xRegion entry.getKey()).collect(Collectors.toList()); + } + + + /** + * method to get all the nodes that have to be rendered based on the position of the player + * @return list of nodes + */ + public List getNodeToRender(int x, int z, byte level, Set complexityMask, int maxDistance, int minDistance){ + int n = regions.length; + List listOfData = new ArrayList<>(); + for(int i=0; i getDataToGenerate(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel) { - List levelPosList = new ArrayList<>(); int size = (int) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel); @@ -231,8 +230,8 @@ public class LodRegion implements Serializable { for (int z = 0; z <= 1; z++) { - posX = regionPosX * 512 + playerPosX * width + width*x; - posZ = regionPosZ * 512 + playerPosZ * width + width*z; + posX = regionPosX * 512 + playerPosX * width + width * x; + posZ = regionPosZ * 512 + playerPosZ * width + width * z; distance = (int) Math.sqrt(Math.pow(playerPosX - posX, 2) + Math.pow(playerPosZ - posZ, 2)); minDistance = Math.min(minDistance, distance); maxDistance = Math.max(maxDistance, distance); @@ -289,9 +288,10 @@ public class LodRegion implements Serializable if (generationType[childPos.detailLevel][childPos.posX][childPos.posZ] < generation) { levelPosList.add(new LevelPos(childPos.detailLevel, childPos.posX + regionPosX * childSize, childPos.posZ + regionPosZ * childSize)); - }else + } else { - if(childPos.detailLevel != detailLevel){ + if (childPos.detailLevel != detailLevel) + { levelPosList.addAll(getDataToGenerate(childPos, playerPosX, playerPosZ, start, end, generation, detailLevel)); } } @@ -300,27 +300,90 @@ public class LodRegion implements Serializable return levelPosList; } + /** * @return - *//* + */ public List getDataToRender(int playerPosX, int playerPosZ, int start, int end, byte detailLevel) { - if(detailLevel < minDetailLevel) detailLevel = minDetailLevel; - int size; - int width; - int posX; - int posZ; - for(int tempLod = detailLevel; tempLod <= LodUtil.REGION_DETAIL_LEVEL; tempLod++){ - size = (int) Math.pow(2,LodUtil.REGION_DETAIL_LEVEL-tempLod); - width = (int) Math.pow(2,tempLod); - for(int x = 0; x < size; x++){ - for(int z = 0; z < size; z++){ - dataExistence[][] - } + LevelPos levelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, 0, 0); + return getDataToRender(levelPos, playerPosX, playerPosZ, start, end, detailLevel); + } + + /** + * @return + */ + public List getDataToRender(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel) + { + List levelPosList = new ArrayList<>(); + + int size = (int) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel); + int width = (int) Math.pow(2, levelPos.detailLevel); + + //here i calculate the the LevelPos is in range + //This is important to avoid any kind of hole in the rendering + int posX = regionPosX * 512 + playerPosX * width + width / 2; + int posZ = regionPosZ * 512 + playerPosZ * width + width / 2; + int distance = (int) Math.sqrt(Math.pow(playerPosX - posX, 2) + Math.pow(playerPosZ - posZ, 2)); + int maxDistance = distance; + int minDistance = distance; + for (int x = 0; x <= 1; x++) + { + for (int z = 0; z <= 1; z++) + { + posX = regionPosX * 512 + playerPosX * width + width * x; + posZ = regionPosZ * 512 + playerPosZ * width + width * z; + distance = (int) Math.sqrt(Math.pow(playerPosX - posX, 2) + Math.pow(playerPosZ - posZ, 2)); + minDistance = Math.min(minDistance, distance); + maxDistance = Math.max(maxDistance, distance); } } + + if (minDistance < start || distance > maxDistance || levelPos.detailLevel < detailLevel) + { + System.out.println(levelPos); + return levelPosList; + } + + int childPosX = levelPos.posX * 2; + int childPosZ = levelPos.posZ * 2; + LevelPos childPos; + int childrenCount; + int childSize = (int) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel + 1); + //we have reached the target detail level + if (detailLevel == levelPos.detailLevel) + { + levelPosList.add(new LevelPos(levelPos.detailLevel, levelPos.posX + regionPosX * size, levelPos.posZ + regionPosZ * size)); + } else + { + childrenCount=0; + for (int x = 0; x <= 1; x++) + { + for (int z = 0; z <= 1; z++) + { + childPos = new LevelPos((byte) (levelPos.detailLevel - 1), childPosX + x, childPosZ + z); + if(doesDataExist(childPos)) childrenCount++; + } + } + + //If all the four children exist we go deeper + if (childrenCount == 4) + { + levelPosList.clear(); + for (int x = 0; x <= 1; x++) + { + for (int z = 0; z <= 1; z++) + { + childPos = new LevelPos((byte) (levelPos.detailLevel - 1), childPosX + x, childPosZ + z); + levelPosList.addAll(getDataToRender(childPos, playerPosX, playerPosZ, start, end, detailLevel)); + } + } + }else{ + levelPosList.add(new LevelPos(levelPos.detailLevel, levelPos.posX + regionPosX * size, levelPos.posZ + regionPosZ * size)); + } + } + return levelPosList; } - */ /**TODO a method to update a whole area, to be used as a single big update*/ /**