From ab7ed9a4c54e26d9e93fdc1cfd2af048e0ecf391 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Thu, 26 Aug 2021 20:13:32 +0200 Subject: [PATCH] Optimized getDataToGenerate --- .../seibel/lod/builders/LodBufferBuilder.java | 12 +- .../seibel/lod/objects/LevelPos/LevelPos.java | 24 ++- .../com/seibel/lod/objects/LodDimension.java | 8 +- .../com/seibel/lod/objects/LodRegion.java | 156 +++--------------- 4 files changed, 47 insertions(+), 153 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 8bb59b44d..af164cefd 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -188,16 +188,6 @@ public class LodBufferBuilder for (byte detail = detailLevel; detail <= LodUtil.REGION_DETAIL_LEVEL; detail++) { detailToRender = detail; - zFix = true; - /* - detailToRender = (byte) 4; - if(detail > detailToRender){ - zFix = false; - }else{ - detailToRender = detail; - zFix = true; - } - */ setOfPosToRender.addAll(lodDim.getDataToRender( regionPos, playerBlockPosRounded.getX(), @@ -205,7 +195,7 @@ public class LodBufferBuilder DetailDistanceUtil.getDistanceRendering(detail), DetailDistanceUtil.getDistanceRendering(detail + 1), detailToRender, - zFix)); + true)); } diff --git a/src/main/java/com/seibel/lod/objects/LevelPos/LevelPos.java b/src/main/java/com/seibel/lod/objects/LevelPos/LevelPos.java index 1a5429d1a..32efbea38 100644 --- a/src/main/java/com/seibel/lod/objects/LevelPos/LevelPos.java +++ b/src/main/java/com/seibel/lod/objects/LevelPos/LevelPos.java @@ -245,18 +245,24 @@ public class LevelPos implements Cloneable, ImmutableLevelPos, MutableLevelPos } } - public static LevelPosComparator getPosComparator() + public static LevelPosComparator getPosComparator(int playerPosX, int playerPosZ) { - return new LevelPosComparator(); + return new LevelPosComparator(playerPosX,playerPosZ); } - public static LevelPosDetailComparator getPosAndDetailComparator() + public static LevelPosDetailComparator getPosAndDetailComparator(int playerPosX, int playerPosZ) { - return new LevelPosDetailComparator(); + return new LevelPosDetailComparator(playerPosX,playerPosZ); } - public static class LevelPosComparator implements Comparator> + public static class LevelPosComparator implements Comparator { + int playerPosX; + int playerPosZ; + public LevelPosComparator(int playerPosX, int playerPosZ){ + this.playerPosX = playerPosX; + this.playerPosZ = playerPosZ; + } @Override public int compare(Map.Entry first, Map.Entry second) @@ -265,8 +271,14 @@ public class LevelPos implements Cloneable, ImmutableLevelPos, MutableLevelPos } } - public static class LevelPosDetailComparator implements Comparator> + public static class LevelPosDetailComparator implements Comparator { + int playerPosX; + int playerPosZ; + public LevelPosDetailComparator(int playerPosX, int playerPosZ){ + this.playerPosX = playerPosX; + this.playerPosZ = playerPosZ; + } @Override public int compare(Map.Entry first, Map.Entry second) diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 5a5d481e1..9eb768056 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -447,7 +447,7 @@ public class LodDimension LodRegion region; RegionPos regionPos; LevelPos regionLevelPos; - List> listOfData = new ArrayList<>(); + List listOfData = new ArrayList<>(); for (int xRegion = 0; xRegion < n; xRegion++) { for (int zRegion = 0; zRegion < n; zRegion++) @@ -470,16 +470,16 @@ public class LodDimension } } - List> levelMinPosList = new ArrayList<>(); + List levelMinPosList = new ArrayList<>(); dataNumber = Math.min(dataNumber, listOfData.size()); for(int i=0; i min = Collections.min(listOfData, LevelPos.getPosComparator()); + LevelPos min = Collections.min(listOfData, LevelPos.getPosComparator(playerPosX,playerPosZ)); listOfData.remove(min); levelMinPosList.add(min); } - return levelMinPosList.stream().map(entry -> entry.getKey()).collect(Collectors.toList()).subList(0, dataNumber); + return levelMinPosList; } diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index 20e0fddf1..07d889eb4 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -193,16 +193,17 @@ public class LodRegion implements Serializable * * @return */ - public List> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber) + public List getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber) { LevelPos levelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, 0, 0); - List> levelPosList = getDataToGenerate(levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel); - List> levelMinPosList = new ArrayList<>(); + List levelPosList = getDataToGenerate(levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel); + List levelMinPosList = new ArrayList<>(); dataNumber = Math.min(dataNumber, levelPosList.size()); + LevelPos min; for (int i = 0; i < dataNumber; i++) { - Map.Entry min = Collections.min(levelPosList, LevelPos.getPosComparator()); + min = Collections.min(levelPosList, LevelPos.getPosComparator()); levelPosList.remove(min); levelMinPosList.add(min); } @@ -211,12 +212,11 @@ public class LodRegion implements Serializable } - private List> getDataToGenerate(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel) + private List getDataToGenerate(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel) { - List> levelPosList = new ArrayList<>(); + List levelPosList = new ArrayList<>(); - int size = (int) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel); - int width = (int) Math.pow(2, levelPos.detailLevel); + int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel); //here i calculate the the LevelPos is in range //This is important to avoid any kind of hole in the generation @@ -230,7 +230,7 @@ public class LodRegion implements Serializable int childPosX = levelPos.posX * 2; int childPosZ = levelPos.posZ * 2; - LevelPos childPos; + LevelPos childPos = new LevelPos(); int childSize = (int) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel + 1); //we have reached the target detail level @@ -238,10 +238,7 @@ public class LodRegion implements Serializable { if (generationType[levelPos.detailLevel][levelPos.posX][levelPos.posZ] < generation) { - levelPosList.add( - new AbstractMap.SimpleEntry( - new LevelPos(levelPos.detailLevel, levelPos.posX + regionPosX * size, levelPos.posZ + regionPosZ * size), - minDistance)); + levelPosList.add(new LevelPos(levelPos.detailLevel, levelPos.posX + regionPosX * size, levelPos.posZ + regionPosZ * size)); } } else { @@ -253,16 +250,11 @@ public class LodRegion implements Serializable { for (int z = 0; z <= 1; z++) { - childPos = new LevelPos((byte) (levelPos.detailLevel - 1), childPosX + x, childPosZ + z); - - minDistance = childPos.minDistance(playerPosX, playerPosZ, regionPosX, regionPosZ); + childPos.changeParameters((byte) (levelPos.detailLevel - 1), childPosX + x, childPosZ + z); if (generationType[childPos.detailLevel][childPos.posX][childPos.posZ] < generation || !doesDataExist(childPos)) { - levelPosList.add( - new AbstractMap.SimpleEntry( - new LevelPos(childPos.detailLevel, childPos.posX + regionPosX * childSize, childPos.posZ + regionPosZ * childSize), - minDistance)); + levelPosList.add(new LevelPos(childPos.detailLevel, childPos.posX + regionPosX * childSize, childPos.posZ + regionPosZ * childSize)); } } } @@ -274,28 +266,24 @@ public class LodRegion implements Serializable { for (int z = 0; z <= 1; z++) { - childPos = new LevelPos((byte) (levelPos.detailLevel - 1), childPosX + x, childPosZ + z); - levelPosList.addAll(getDataToGenerate(childPos, playerPosX, playerPosZ, start, end, generation, detailLevel)); + levelPosList.addAll(getDataToGenerate(new LevelPos((byte) (levelPos.detailLevel - 1), childPosX + x, childPosZ + z) + , playerPosX, playerPosZ, start, end, generation, detailLevel)); } } } } else //now we keep exploring the top right child { - childPos = levelPos.getConvertedLevelPos((byte) (levelPos.detailLevel - 1)); + childPos.changeParameters(levelPos.detailLevel, levelPos.posX, levelPos.posZ); + childPos.convert((byte) (levelPos.detailLevel - 1)); if (generationType[childPos.detailLevel][childPos.posX][childPos.posZ] < generation) { - minDistance = childPos.minDistance(playerPosX, playerPosZ, regionPosX, regionPosZ); - - levelPosList.add( - new AbstractMap.SimpleEntry( - new LevelPos(childPos.detailLevel, childPos.posX + regionPosX * childSize, childPos.posZ + regionPosZ * childSize), - minDistance)); + levelPosList.add(new LevelPos(childPos.detailLevel, childPos.posX + regionPosX * childSize, childPos.posZ + regionPosZ * childSize)); } else { if (childPos.detailLevel != detailLevel) { - levelPosList.addAll(getDataToGenerate(childPos, playerPosX, playerPosZ, start, end, generation, detailLevel)); + levelPosList.addAll(getDataToGenerate(childPos.clone(), playerPosX, playerPosZ, start, end, generation, detailLevel)); } } } @@ -379,6 +367,9 @@ public class LodRegion implements Serializable return levelPosList; } + /** + * @param levelPos + */ public void updateArea(LevelPos levelPos) { int width; @@ -406,6 +397,9 @@ public class LodRegion implements Serializable } } + /** + * @param levelPos + */ private void update(LevelPos levelPos) { levelPos.performRegionModule(); @@ -457,108 +451,6 @@ public class LodRegion implements Serializable } } - /** - * @param levelPos - *//* - public void updateArea(LevelPos levelPos) - { - levelPos.performRegionModule(); - int width; - int startX; - int startZ; - byte detailLevel = levelPos.detailLevel; - for (byte bottom = (byte) (minDetailLevel + 1); bottom <= detailLevel; bottom++) - { - levelPos.convert(bottom); - startX = levelPos.posX; - startZ = levelPos.posZ; - width = 1 << (detailLevel - bottom); - for (int x = 0; x < width; x++) - { - for (int z = 0; z < width; z++) - { - levelPos.changeParameters(bottom, startX + x, startZ + z); - update(levelPos); - } - } - } - byte tempLod = 0; - try - { - for (tempLod = (byte) (detailLevel + 1); tempLod <= LodUtil.REGION_DETAIL_LEVEL; tempLod++) - { - levelPos.convert(tempLod); - update(levelPos); - } - }catch (Exception e){ - System.out.println(tempLod); - System.out.println(levelPos); - e.printStackTrace(); - throw e; - } - }*/ - /** - * @param levelPos - *//* - private void update(LevelPos levelPos) - { - levelPos.performRegionModule(); - int numberOfChildren = 0; - - byte minGenerationType = 5; - int tempRed = 0; - int tempGreen = 0; - int tempBlue = 0; - int tempHeight = 0; - int tempDepth = 0; - int newPosX; - int newPosZ; - byte newDetailLevel; - LevelPos childPos; - byte detailLevel = levelPos.detailLevel; - int posX = levelPos.posX; - int posZ = levelPos.posZ; - try - { - if(detailLevel > 0) - { - for (int x = 0; x <= 1; x++) - { - for (int z = 0; z <= 1; z++) - { - newPosX = 2 * posX + x; - newPosZ = 2 * posZ + z; - newDetailLevel = (byte) (detailLevel - 1); - levelPos.changeParameters(newDetailLevel, newPosX, newPosZ); - if (hasDataBeenGenerated(levelPos)) - { - numberOfChildren++; - - tempRed += colors[newDetailLevel][newPosX][newPosZ][0]; - tempGreen += colors[newDetailLevel][newPosX][newPosZ][1]; - tempBlue += colors[newDetailLevel][newPosX][newPosZ][2]; - tempHeight += height[newDetailLevel][newPosX][newPosZ]; - tempDepth += depth[newDetailLevel][newPosX][newPosZ]; - minGenerationType = (byte) Math.min(minGenerationType, generationType[newDetailLevel][newPosX][newPosZ]); - } - } - } - if (numberOfChildren > 0) - { - colors[detailLevel][posX][posZ][0] = (byte) (tempRed / numberOfChildren); - colors[detailLevel][posX][posZ][1] = (byte) (tempGreen / numberOfChildren); - colors[detailLevel][posX][posZ][2] = (byte) (tempBlue / numberOfChildren); - height[detailLevel][posX][posZ] = (short) (tempHeight / numberOfChildren); - depth[detailLevel][posX][posZ] = (short) (tempDepth / numberOfChildren); - generationType[detailLevel][posX][posZ] = minGenerationType; - dataExistence[detailLevel][posX][posZ] = true; - } - } - }catch (Exception e){ - throw e; - } - }*/ - /** * @param levelPos * @return