diff --git a/src/main/java/com/seibel/lod/objects/PosToGenerateContainer.java b/src/main/java/com/seibel/lod/objects/PosToGenerateContainer.java index 2aaadab0f..f2d139166 100644 --- a/src/main/java/com/seibel/lod/objects/PosToGenerateContainer.java +++ b/src/main/java/com/seibel/lod/objects/PosToGenerateContainer.java @@ -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(); + } } diff --git a/src/main/java/com/seibel/lod/objects/PosToRenderContainer.java b/src/main/java/com/seibel/lod/objects/PosToRenderContainer.java index 5fbb19f61..7bf05c2b9 100644 --- a/src/main/java/com/seibel/lod/objects/PosToRenderContainer.java +++ b/src/main/java/com/seibel/lod/objects/PosToRenderContainer.java @@ -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(); + } }