various fix to the new classes

This commit is contained in:
Leonardo
2021-09-04 12:48:22 +02:00
parent e46864431b
commit 1843f96526
2 changed files with 96 additions and 35 deletions
@@ -1,16 +1,18 @@
package com.seibel.lod.objects;
import org.lwjgl.system.CallbackI;
public class PosToGenerateContainer
{
public int playerPosX;
public int playerPosZ;
public byte farMinDetail;
public int maxSize;
public int maxNearSize;
public int maxFarSize;
public int nearSize;
public int farSize;
public int[][] posToGenerate;
private int playerPosX;
private int playerPosZ;
private byte farMinDetail;
private int maxSize;
private int maxNearSize;
private int maxFarSize;
private int nearSize;
private int farSize;
private int[][] posToGenerate;
public PosToGenerateContainer(byte farMinDetail, int maxDataToGenerate, int maxFarDataToGenerate, int playerPosX, int playerPosZ)
{
@@ -51,32 +53,26 @@ public class PosToGenerateContainer
maxNearSize--;
}
index = posToGenerate.length - farSize;
if (!(farSize == maxFarSize && LevelPosUtil.compareLevelAndDistance(tempPos, posToGenerate[index]) >= 0))
while (index < posToGenerate.length - 1 && LevelPosUtil.compareLevelAndDistance(tempPos, posToGenerate[index + 1]) <= 0)
{
while(index < posToGenerate.length - 1 && LevelPosUtil.compareLevelAndDistance(tempPos, posToGenerate[index + 1]) <= 0)
{
posToGenerate[index] = posToGenerate[index + 1];
index++;
}
if(index <= posToGenerate.length - 1)
posToGenerate[index] = tempPos;
posToGenerate[index] = posToGenerate[index + 1];
index++;
}
if (index <= posToGenerate.length - 1)
posToGenerate[index] = tempPos;
} else
{//We are introducing a position in the near array
if (nearSize < maxNearSize)
nearSize++;
index = nearSize - 1;
if(!(nearSize >= maxNearSize && LevelPosUtil.compareDistance(tempPos, posToGenerate[index]) >= 0)){
while(index > 0 && LevelPosUtil.compareDistance(tempPos, posToGenerate[index - 1]) <= 0)
{
posToGenerate[index] = posToGenerate[index - 1];
index--;
}
if(index >= 0)
posToGenerate[index] = tempPos;
while (index > 0 && LevelPosUtil.compareDistance(tempPos, posToGenerate[index - 1]) <= 0)
{
posToGenerate[index] = posToGenerate[index - 1];
index--;
}
if (index >= 0)
posToGenerate[index] = tempPos;
}
}
@@ -89,13 +85,56 @@ public class PosToGenerateContainer
public int[] getNthPos(int n)
{
int index;
if(n > farSize * 2)
if (n > farSize * 2)
index = n - farSize;
else if (n % 2 == 0)
index = n / 2;
else
if (n % 2 == 0)
index = n/2;
else
index = posToGenerate.length - n/2 - 1;
index = posToGenerate.length - n / 2 - 1;
return posToGenerate[index];
}
public String toString()
{
StringBuilder builder = new StringBuilder();
builder.append("Number of pos to generate ");
builder.append(farSize + nearSize);
builder.append('\n');
builder.append("Number of near pos to generate ");
builder.append(nearSize);
builder.append('\n');
builder.append("Number of far pos to generate ");
builder.append(farSize);
builder.append('\n');
builder.append('\n');
builder.append("near pos to generate");
builder.append('\n');
for (int i = 0; i < nearSize; i++)
{
builder.append(posToGenerate[i][0]);
builder.append(" ");
builder.append(posToGenerate[i][1]);
builder.append(" ");
builder.append(posToGenerate[i][2]);
builder.append(" ");
builder.append(posToGenerate[i][3]);
builder.append('\n');
}
builder.append('\n');
builder.append("far pos to generate");
builder.append('\n');
for (int i = maxSize - 1; i >= maxSize - farSize; i--)
{
builder.append(posToGenerate[i][0]);
builder.append(" ");
builder.append(posToGenerate[i][1]);
builder.append(" ");
builder.append(posToGenerate[i][2]);
builder.append(" ");
builder.append(posToGenerate[i][3]);
builder.append('\n');
}
builder.append('\n');
return builder.toString();
}
}
@@ -1,5 +1,7 @@
package com.seibel.lod.objects;
import com.seibel.lod.util.LodUtil;
import java.util.Arrays;
public class PosToRenderContainer
@@ -7,6 +9,7 @@ public class PosToRenderContainer
private byte minDetail;
private int numberOfPosToRender;
private int[][] posToRender;
/*TODO this population matrix could be converted to boolean to improve memory use*/
private byte[][] population;
public PosToRenderContainer(byte minDetail)
@@ -14,7 +17,8 @@ public class PosToRenderContainer
this.minDetail = minDetail;
this.numberOfPosToRender = 0;
posToRender = new int[1][4];
population = new byte[minDetail][minDetail];
int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - minDetail);
population = new byte[size][size];
}
public void addPosToRender(int[] levelPos)
@@ -23,13 +27,14 @@ public class PosToRenderContainer
posToRender = Arrays.copyOf(posToRender, posToRender.length*2);
posToRender[numberOfPosToRender] = levelPos;
numberOfPosToRender++;
int[] newLevelPos = LevelPosUtil.convert(levelPos, minDetail);
int[] newLevelPos = LevelPosUtil.getRegionModule(LevelPosUtil.convert(levelPos, minDetail));
population[LevelPosUtil.getPosZ(newLevelPos)][LevelPosUtil.getPosZ(newLevelPos)] = (byte) (LevelPosUtil.getDetailLevel(levelPos) + 1);
}
public boolean isToRender(int[] levelPos)
public boolean contains(int[] levelPos)
{
return (population[LevelPosUtil.getPosZ(levelPos)][LevelPosUtil.getPosZ(levelPos)] == (LevelPosUtil.getDetailLevel(levelPos) + 1));
int[] newLevelPos = LevelPosUtil.convert(LevelPosUtil.getRegionModule(levelPos), minDetail);
return (population[LevelPosUtil.getPosZ(newLevelPos)][LevelPosUtil.getPosZ(newLevelPos)] == (LevelPosUtil.getDetailLevel(levelPos) + 1));
}
public int getNumberOfPos()
@@ -41,4 +46,21 @@ public class PosToRenderContainer
{
return posToRender[n];
}
public String toString()
{
StringBuilder builder = new StringBuilder();
for(int i = 0; i < numberOfPosToRender; i++)
{
builder.append(posToRender[i][0]);
builder.append(" ");
builder.append(posToRender[i][1]);
builder.append(" ");
builder.append(posToRender[i][2]);
builder.append('\n');
}
builder.append('\n');
return builder.toString();
}
}