fixed a small generation errore,

Now cut and gen tree are automatic
This commit is contained in:
Leonardo
2021-08-28 11:15:34 +02:00
parent d8bd4e2347
commit e1a425dbcc
3 changed files with 56 additions and 53 deletions
@@ -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());
@@ -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);
}
@@ -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)