Optimized getDataToGenerate

This commit is contained in:
Leonardo
2021-08-26 20:13:32 +02:00
parent 120e8e5f6d
commit ab7ed9a4c5
4 changed files with 47 additions and 153 deletions
@@ -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));
}
@@ -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<Map.Entry<LevelPos, Integer>>
public static class LevelPosComparator implements Comparator<LevelPos>
{
int playerPosX;
int playerPosZ;
public LevelPosComparator(int playerPosX, int playerPosZ){
this.playerPosX = playerPosX;
this.playerPosZ = playerPosZ;
}
@Override
public int compare(Map.Entry<LevelPos, Integer> first, Map.Entry<LevelPos, Integer> second)
@@ -265,8 +271,14 @@ public class LevelPos implements Cloneable, ImmutableLevelPos, MutableLevelPos
}
}
public static class LevelPosDetailComparator implements Comparator<Map.Entry<LevelPos, Integer>>
public static class LevelPosDetailComparator implements Comparator<LevelPos>
{
int playerPosX;
int playerPosZ;
public LevelPosDetailComparator(int playerPosX, int playerPosZ){
this.playerPosX = playerPosX;
this.playerPosZ = playerPosZ;
}
@Override
public int compare(Map.Entry<LevelPos, Integer> first, Map.Entry<LevelPos, Integer> second)
@@ -447,7 +447,7 @@ public class LodDimension
LodRegion region;
RegionPos regionPos;
LevelPos regionLevelPos;
List<Map.Entry<LevelPos, Integer>> listOfData = new ArrayList<>();
List<LevelPos> 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<Map.Entry<LevelPos,Integer>> levelMinPosList = new ArrayList<>();
List<LevelPos> levelMinPosList = new ArrayList<>();
dataNumber = Math.min(dataNumber, listOfData.size());
for(int i=0; i<dataNumber; i++)
{
Map.Entry<LevelPos,Integer> 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;
}
@@ -193,16 +193,17 @@ public class LodRegion implements Serializable
*
* @return
*/
public List<Map.Entry<LevelPos, Integer>> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber)
public List<LevelPos> 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<Map.Entry<LevelPos, Integer>> levelPosList = getDataToGenerate(levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel);
List<Map.Entry<LevelPos, Integer>> levelMinPosList = new ArrayList<>();
List<LevelPos> levelPosList = getDataToGenerate(levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel);
List<LevelPos> levelMinPosList = new ArrayList<>();
dataNumber = Math.min(dataNumber, levelPosList.size());
LevelPos min;
for (int i = 0; i < dataNumber; i++)
{
Map.Entry<LevelPos, Integer> 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<Map.Entry<LevelPos, Integer>> getDataToGenerate(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel)
private List<LevelPos> getDataToGenerate(LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel)
{
List<Map.Entry<LevelPos, Integer>> levelPosList = new ArrayList<>();
List<LevelPos> 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<LevelPos, Integer>(
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<LevelPos, Integer>(
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<LevelPos, Integer>(
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