diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java index eb42a0194..327140d12 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java @@ -151,23 +151,23 @@ public class LodWorldGenerator byte circle; LevelPos levelPos; //We alternate the generation between fast and near to make everything more smooth - while(!nearLevelPosListToGen.isEmpty() && !farLevelPosListToGen.isEmpty()){ - if(!farLevelPosListToGen.isEmpty()) + while(!nearLevelPosListToGen.isEmpty() || !farLevelPosListToGen.isEmpty()){ + if(!nearLevelPosListToGen.isEmpty()) { - levelPos = farLevelPosListToGen.get(0); - farLevelPosListToGen.remove(0); - minDetail = maxDetailFar; + levelPos = nearLevelPosListToGen.get(0); + nearLevelPosListToGen.remove(0); + minDetail = (byte) 0; maxDistance = levelPos.maxDistance( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ()); circle = DetailDistanceUtil.getDistanceGenerationInverse(maxDistance, minDetail); generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(circle), DetailDistanceUtil.getLodDetail(circle))); } - if(!nearLevelPosListToGen.isEmpty()) + if(!farLevelPosListToGen.isEmpty()) { - levelPos = nearLevelPosListToGen.get(0); - nearLevelPosListToGen.remove(0); - minDetail = (byte) 0; + levelPos = farLevelPosListToGen.get(0); + farLevelPosListToGen.remove(0); + minDetail = maxDetailFar; maxDistance = levelPos.maxDistance( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ()); diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index b5fb858c4..58e8af8c3 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -328,6 +328,9 @@ public class LodDimension { int regionX; int regionZ; + int minDistance; + byte detail; + byte levelToCut; LevelPos levelPos = new LevelPos(); for (int x = 0; x < regions.length; x++) @@ -336,28 +339,21 @@ public class LodDimension { regionX = (x + center.x) - halfWidth; regionZ = (z + center.z) - halfWidth; - levelPos.changeParameters(LodUtil.REGION_DETAIL_LEVEL, regionX, regionZ); //we start checking from the first circle. If the whole region is in the circle //we proceed to cut all the level lower than the level of circle 1 and we break //if this is not the case w - for (byte index = LodUtil.BLOCK_DETAIL_LEVEL; index <= LodUtil.DETAIL_OPTIONS; index++) + if (regions[x][z] != null) { - if (DetailDistanceUtil.getDistanceTreeCut(index + 1) > levelPos.minDistance(playerPosX, playerPosZ)) + levelPos.changeParameters(LodUtil.REGION_DETAIL_LEVEL, regionX, regionZ); + minDistance = levelPos.minDistance(playerPosX, playerPosZ); + detail = DetailDistanceUtil.getDistanceTreeCutInverse(minDistance); + levelToCut = DetailDistanceUtil.getCutLodDetail(detail); + if (regions[x][z].getMinDetailLevel() > levelToCut) { - - byte cutDetailLevel = DetailDistanceUtil.getCutLodDetail(index); - - if (regions[x][z] != null) - { - if (regions[x][z].getMinDetailLevel() > cutDetailLevel) - { - regions[x][z].cutTree(cutDetailLevel); - } - } - //once we - break; + regions[x][z].cutTree(levelToCut); } } + }// region z }// region z @@ -384,6 +380,9 @@ public class LodDimension int regionX; int regionZ; LodRegion region; + int minDistance; + byte detail; + byte levelToGen; LevelPos levelPos = new LevelPos(); for (int x = 0; x < regions.length; x++) { @@ -393,42 +392,34 @@ public class LodDimension regionZ = (z + center.z) - halfWidth; levelPos.changeParameters(LodUtil.REGION_DETAIL_LEVEL, regionX, regionZ); final RegionPos regionPos = new RegionPos(regionX, regionZ); - for (byte index = LodUtil.BLOCK_DETAIL_LEVEL; index <= LodUtil.REGION_DETAIL_LEVEL; index++) + region = regions[x][z]; + //We require that the region we are checking is loaded with at least this level + + levelPos.changeParameters(LodUtil.REGION_DETAIL_LEVEL, regionX, regionZ); + minDistance = levelPos.minDistance(playerPosX, playerPosZ); + detail = DetailDistanceUtil.getDistanceTreeGenInverse(minDistance); + levelToGen = DetailDistanceUtil.getLodDetail(detail).detailLevel; + if (region == null) { + //First case, region has to be initialized - //As soon as we find in which circle the region should be we analyze it - if (DetailDistanceUtil.getDistanceTreeGen(index + 1) > levelPos.minDistance(playerPosX, playerPosZ)) + //We check if there is a file at the target level + regions[x][z] = getRegionFromFile(regionPos, levelToGen); + + //if there is no file we initialize the region + if (regions[x][z] == null) { - - region = regions[x][z]; - //We require that the region we are checking is loaded with at least this level - byte targetDetailLevel = DetailDistanceUtil.getLodDetail(index).detailLevel; - - if (region == null) - { - //First case, region has to be initialized - - //We check if there is a file at the target level - regions[x][z] = getRegionFromFile(regionPos, targetDetailLevel); - - //if there is no file we initialize the region - if (regions[x][z] == null) - { - regions[x][z] = new LodRegion(targetDetailLevel, regionPos); - } - - } else if (region.getMinDetailLevel() > targetDetailLevel) - { - //Second case, region has been initialized but at a higher level - //We expand the region by introducing the missing layer - region.expand(targetDetailLevel); - } - break; + regions[x][z] = new LodRegion(levelToGen, regionPos); } + + } else if (region.getMinDetailLevel() > levelToGen) + { + //Second case, region has been initialized but at a higher level + //We expand the region by introducing the missing layer + region.expand(levelToGen); } } } - ; }); cutAndGenThreads.execute(thread); } diff --git a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java index 5cae77c0f..a995399e0 100644 --- a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java +++ b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java @@ -104,6 +104,18 @@ public class DetailDistanceUtil ,minDetailLevel); } + + public static byte getDistanceTreeCutInverse(int distance) + { + return getDistanceRenderingInverse((int) (distance * treeCutMultiplier)); + } + + + public static byte getDistanceTreeGenInverse(int distance) + { + return getDistanceRenderingInverse((int) (distance * treeGenMultiplier)); + } + public static int getDistanceGeneration(int detail) { if (detail == maxDetail)