diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index d39fc34f3..7f301dc90 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -25,7 +25,6 @@ import com.seibel.lod.enums.DistanceGenerationMode; import com.seibel.lod.enums.LodDetail; import com.seibel.lod.handlers.LodConfig; import com.seibel.lod.objects.DataPoint; -import com.seibel.lod.objects.LevelPosUtil; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodWorld; import com.seibel.lod.objects.LevelPos.LevelPos; @@ -164,7 +163,7 @@ public class LodBuilder short[] color; short height; short depth; - int[] levelPos; + LevelPos levelPos = new LevelPos((byte) 0, 0, 0); short[] data; try { @@ -187,23 +186,20 @@ public class LodBuilder startZ, endX, endZ); depth = 0; } - levelPos = LevelPosUtil.convert( - LevelPosUtil.createLevelPos((byte) 0, - chunk.getPos().x * 16 + startX, - chunk.getPos().z * 16 + startZ), - detail.detailLevel - ); + levelPos.changeParameters((byte) 0, + chunk.getPos().x * 16 + startX, + chunk.getPos().z * 16 + startZ); + levelPos.convert(detail.detailLevel); boolean isServer = config.distanceGenerationMode == DistanceGenerationMode.SERVER; data = DataPoint.createDataPoint(height, depth, color[0], color[1], color[2]); - boolean added = lodDim.addData(levelPos, + lodDim.addData(levelPos, data, false, isServer); - System.out.println(added); } //levelPos.changeParameters(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z); - lodDim.updateData(LevelPosUtil.createLevelPos(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z)); + lodDim.updateData(new LevelPos(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z)); } catch (Exception e) { //e.printStackTrace(); @@ -436,10 +432,12 @@ public class LodBuilder Color tmp = LodUtil.intToColor(biome.getGrassColor(x, z)); tmp = tmp.darker(); colorInt = LodUtil.colorToInt(tmp); - } else if (blockState == Blocks.STONE.defaultBlockState()) + } + else if (blockState == Blocks.STONE.defaultBlockState()) { colorInt = LodUtil.STONE_COLOR_INT; - } else if (blockState == Blocks.MYCELIUM.defaultBlockState()) + } + else if (blockState == Blocks.MYCELIUM.defaultBlockState()) { colorInt = LodUtil.MYCELIUM_COLOR_INT; } diff --git a/src/main/java/com/seibel/lod/objects/LevelPosUtil.java b/src/main/java/com/seibel/lod/objects/LevelPosUtil.java deleted file mode 100644 index e3c0758d2..000000000 --- a/src/main/java/com/seibel/lod/objects/LevelPosUtil.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.seibel.lod.objects; - -import com.seibel.lod.objects.LevelPos.ImmutableLevelPos; -import com.seibel.lod.objects.LevelPos.MutableLevelPos; -import com.seibel.lod.util.LodUtil; -import net.minecraft.util.math.ChunkPos; - -import java.util.Comparator; - -public class LevelPosUtil -{ - public static int[] convert(int[] levelPos, byte newDetailLevel) - { - return convert(getDetailLevel(levelPos), getPosX(levelPos), getPosZ(levelPos), newDetailLevel); - } - - public static int[] convert(byte detailLevel, int posX, int posZ, byte newDetailLevel) - { - int width; - if (newDetailLevel >= detailLevel) - { - width = 1 << (newDetailLevel - detailLevel); - return createLevelPos( - newDetailLevel, - Math.floorDiv(posX, width), - Math.floorDiv(posZ, width)); - } else - { - width = 1 << (detailLevel - newDetailLevel); - return createLevelPos( - newDetailLevel, - posX * width, - posZ * width); - } - } - - public static int[] createLevelPos(byte detailLevel, int posX, int posZ) - { - return new int[]{detailLevel, posX, posZ}; - } - - public static byte getDetailLevel(int[] levelPos) - { - return (byte) levelPos[0]; - } - - public static int getPosX(int[] levelPos) - { - return levelPos[1]; - } - - public static int getPosZ(int[] levelPos) - { - return levelPos[2]; - } - - public static int[] getRegionModule(int[] levelPos) - { - return getRegionModule(getDetailLevel(levelPos), getPosX(levelPos), getPosZ(levelPos)); - } - - public static int[] getRegionModule(byte detailLevel, int posX, int posZ) - { - int width = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); - return createLevelPos( - detailLevel, - Math.floorMod(posX, width), - Math.floorMod(posZ, width)); - } - - public static int[] applyOffset(int[] levelPos, int xOffset, int zOffset) - { - return createLevelPos( - getDetailLevel(levelPos), - getPosX(levelPos) + xOffset, - getPosZ(levelPos) + zOffset); - } - - public static int[] applyLevelOffset(int[] levelPos, byte detailOffset, int xOffset, int zOffset) - { - return createLevelPos( - getDetailLevel(levelPos), - getPosX(levelPos) + xOffset * (1 << detailOffset), - getPosZ(levelPos) + zOffset * (1 << detailOffset)); - } - - public static int getRegionPosX(int[] levelPos) - { - int width = 1 << (LodUtil.REGION_DETAIL_LEVEL - getDetailLevel(levelPos)); - return Math.floorDiv(getPosX(levelPos), width); - } - - public static int getRegionPosZ(int[] levelPos) - { - int width = 1 << (LodUtil.REGION_DETAIL_LEVEL - getDetailLevel(levelPos)); - return Math.floorDiv(getPosZ(levelPos), width); - } - - public static ChunkPos getChunkPos(int[] levelPos) - { - levelPos = convert(levelPos, LodUtil.CHUNK_DETAIL_LEVEL); - return new ChunkPos( - getPosX(levelPos), - getPosZ(levelPos)); - } - - public static int maxDistance(int[] levelPos, int playerPosX, int playerPosZ) - { - int width = 1 << getDetailLevel(levelPos); - - int startPosX = getPosX(levelPos) * width; - int startPosZ = getPosX(levelPos) * width; - int endPosX = startPosX + width; - int endPosZ = startPosZ + width; - - int maxDistance = (int) Math.sqrt(Math.pow(playerPosX - startPosX, 2) + Math.pow(playerPosZ - startPosZ, 2)); - maxDistance = Math.max(maxDistance, (int) Math.sqrt(Math.pow(playerPosX - startPosX, 2) + Math.pow(playerPosZ - endPosZ, 2))); - maxDistance = Math.max(maxDistance, (int) Math.sqrt(Math.pow(playerPosX - endPosX, 2) + Math.pow(playerPosZ - startPosZ, 2))); - maxDistance = Math.max(maxDistance, (int) Math.sqrt(Math.pow(playerPosX - endPosX, 2) + Math.pow(playerPosZ - endPosZ, 2))); - - return maxDistance; - } - - - public static int minDistance(int[] levelPos, int playerPosX, int playerPosZ) - { - int width = 1 << getDetailLevel(levelPos); - - int startPosX = getPosX(levelPos) * width; - int startPosZ = getPosX(levelPos) * width; - int endPosX = startPosX + width; - int endPosZ = startPosZ + width; - - boolean inXArea = playerPosX >= startPosX && playerPosX <= endPosX; - boolean inZArea = playerPosZ >= startPosZ && playerPosZ <= endPosZ; - if (inXArea && inZArea) - { - return 0; - } else if (inXArea) - { - return Math.min( - Math.abs(playerPosZ - startPosZ), - Math.abs(playerPosZ - endPosZ) - ); - } else if (inZArea) - { - return Math.min( - Math.abs(playerPosX - startPosX), - Math.abs(playerPosX - endPosX) - ); - } else - { - int minDistance = (int) Math.sqrt(Math.pow(playerPosX - startPosX, 2) + Math.pow(playerPosZ - startPosZ, 2)); - minDistance = Math.min(minDistance, (int) Math.sqrt(Math.pow(playerPosX - startPosX, 2) + Math.pow(playerPosZ - endPosZ, 2))); - minDistance = Math.min(minDistance, (int) Math.sqrt(Math.pow(playerPosX - endPosX, 2) + Math.pow(playerPosZ - startPosZ, 2))); - minDistance = Math.min(minDistance, (int) Math.sqrt(Math.pow(playerPosX - endPosX, 2) + Math.pow(playerPosZ - endPosZ, 2))); - return minDistance; - } - } - - public static int compareDistance(int posX, int posZ, int[] first, int[] second) - { - return Integer.compare( - minDistance(first, posX, posZ), - minDistance(second, posX, posZ)); - } - - public static int compareLevelAndDistance(int posX, int posZ, int[] first, int[] second) - { - int compareResult = Integer.compare(getDetailLevel(second), getDetailLevel(first)); - if (compareResult == 0) - { - compareResult = Integer.compare( - minDistance(first, posX, posZ), - minDistance(second, posX, posZ)); - } - return compareResult; - } - - public static String toString(int[] levelPos) - { - return (getDetailLevel(levelPos) + " " + getPosX(levelPos) + " " + getPosZ(levelPos)); - } -} diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index bd75700be..bf00ec13c 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -23,7 +23,6 @@ import java.security.InvalidParameterException; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.logging.Level; import org.apache.commons.lang3.mutable.MutableBoolean; @@ -285,27 +284,6 @@ public class LodDimension return regions[xIndex][zIndex]; } - /** - * Gets the region at the given X and Z - *
- * Returns null if the region doesn't exist - * or is outside the loaded area. - */ - public LodRegion getRegion(int[] levelPos) - { - - int xIndex = (LevelPosUtil.getRegionPosX(levelPos) - center.x) + halfWidth; - int zIndex = (LevelPosUtil.getRegionPosZ(levelPos) - center.z) + halfWidth; - - if (!regionIsInRange(LevelPosUtil.getRegionPosX(levelPos), LevelPosUtil.getRegionPosZ(levelPos))) - throw new ArrayIndexOutOfBoundsException("Region for level pos " + levelPos + " out of range"); - else if (regions[xIndex][zIndex] == null) - throw new InvalidParameterException("Region for level pos " + levelPos + " not currently initialized"); - else if (regions[xIndex][zIndex].getMinDetailLevel() > LevelPosUtil.getDetailLevel(levelPos)) - throw new InvalidParameterException("Region for level pos " + levelPos + " currently only reach level " + regions[xIndex][zIndex].getMinDetailLevel()); - return regions[xIndex][zIndex]; - } - /** * Gets the region at the given X and Z *
@@ -461,13 +439,12 @@ public class LodDimension * stored in the LOD. If an LOD already exists at the given * coordinates it will be overwritten. */ - public synchronized Boolean addData(int[] levelPos, short[] lodDataPoint, boolean dontSave, boolean serverQuality) + public synchronized Boolean addData(LevelPos levelPos, short[] lodDataPoint, boolean dontSave, boolean serverQuality) { // don't continue if the region can't be saved - int xRegion = LevelPosUtil.getRegionPosX(levelPos); - int zRegion = LevelPosUtil.getRegionPosZ(levelPos); - if (!regionIsInRange(xRegion, zRegion)) + RegionPos regionPos = levelPos.getRegionPos(); + if (!regionIsInRange(regionPos.x, regionPos.z)) { return false; } @@ -481,8 +458,8 @@ public class LodDimension try { // mark the region as dirty so it will be saved to disk - int xIndex = (xRegion - center.x) + halfWidth; - int zIndex = (zRegion - center.z) + halfWidth; + int xIndex = (regionPos.x - center.x) + halfWidth; + int zIndex = (regionPos.z - center.z) + halfWidth; isRegionDirty[xIndex][zIndex] = true; regen[xIndex][zIndex] = true; regenDimension = true; @@ -605,10 +582,10 @@ public class LodDimension * Returns null if the LodChunk doesn't exist or * is outside the loaded area. */ - public void updateData(int[] levelPos) + public void updateData(LevelPos levelPos) { - if (LevelPosUtil.getDetailLevel(levelPos) > LodUtil.REGION_DETAIL_LEVEL) - throw new IllegalArgumentException("getLodFromCoordinates given a level of \"" + LevelPosUtil.getDetailLevel(levelPos) + "\" when \"" + LodUtil.REGION_DETAIL_LEVEL + "\" is the max."); + if (levelPos.detailLevel > LodUtil.REGION_DETAIL_LEVEL) + throw new IllegalArgumentException("getLodFromCoordinates given a level of \"" + levelPos.detailLevel + "\" when \"" + LodUtil.REGION_DETAIL_LEVEL + "\" is the max."); LodRegion region = getRegion(levelPos); @@ -634,7 +611,7 @@ public class LodDimension return false; } - return region.doesDataExist(LevelPosUtil.createLevelPos(levelPos.detailLevel,levelPos.posX,levelPos.posZ)); + return region.doesDataExist(levelPos.clone()); } catch (Exception e) { return false; diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index 10354ac3c..ffba56c32 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -77,6 +77,7 @@ public class LodRegion implements Serializable dataExistence[lod] = new boolean[size][size]; } int width; + LevelPos levelPos = new LevelPos(); for (byte tempLod = (byte) (minDetailLevel + 1); tempLod <= LodUtil.REGION_DETAIL_LEVEL; tempLod++) { width = 1 << (LodUtil.REGION_DETAIL_LEVEL - tempLod); @@ -84,7 +85,8 @@ public class LodRegion implements Serializable { for (int z = 0; z < width; z++) { - update(LevelPosUtil.createLevelPos(tempLod, x, z)); + levelPos.changeParameters(tempLod, x, z); + update(levelPos); } } } @@ -125,25 +127,22 @@ public class LodRegion implements Serializable * @param dataPoint * @return */ - public boolean addData(int[] levelPos, short[] dataPoint, boolean serverQuality) + public boolean addData(LevelPos levelPos, short[] dataPoint, boolean serverQuality) { - levelPos = LevelPosUtil.getRegionModule(levelPos); - byte detailLevel = LevelPosUtil.getDetailLevel(levelPos); - int posX = LevelPosUtil.getPosX(levelPos); - int posZ = LevelPosUtil.getPosZ(levelPos); + levelPos.performRegionModule(); if (!doesDataExist(levelPos) || serverQuality) { //update the number of node present - if (this.dataExistence[detailLevel][posX][posZ]) numberOfPoints++; + if (this.dataExistence[levelPos.detailLevel][levelPos.posX][levelPos.posZ]) numberOfPoints++; //add the node data - this.height[detailLevel][posX][posZ] = DataPoint.getHeight(dataPoint); - this.depth[detailLevel][posX][posZ] = DataPoint.getDepth(dataPoint); - this.colors[detailLevel][posX][posZ][0] = (byte) (DataPoint.getRed(dataPoint) - 128); - this.colors[detailLevel][posX][posZ][1] = (byte) (DataPoint.getGreen(dataPoint) - 128); - this.colors[detailLevel][posX][posZ][2] = (byte) (DataPoint.getBlue(dataPoint) - 128); - this.dataExistence[detailLevel][posX][posZ] = true; + this.height[levelPos.detailLevel][levelPos.posX][levelPos.posZ] = DataPoint.getHeight(dataPoint); + this.depth[levelPos.detailLevel][levelPos.posX][levelPos.posZ] = DataPoint.getDepth(dataPoint); + this.colors[levelPos.detailLevel][levelPos.posX][levelPos.posZ][0] = (byte) (DataPoint.getRed(dataPoint) - 128); + this.colors[levelPos.detailLevel][levelPos.posX][levelPos.posZ][1] = (byte) (DataPoint.getGreen(dataPoint) - 128); + this.colors[levelPos.detailLevel][levelPos.posX][levelPos.posZ][2] = (byte) (DataPoint.getBlue(dataPoint) - 128); + this.dataExistence[levelPos.detailLevel][levelPos.posX][levelPos.posZ] = true; return true; } else { @@ -204,7 +203,7 @@ public class LodRegion implements Serializable return; } else if (DetailDistanceUtil.getDistanceGenerationInverse(minDistance) == detailLevel) { - if (!doesDataExist(LevelPosUtil.createLevelPos(levelPos.detailLevel, levelPos.posX, levelPos.posZ))) + if (!doesDataExist(levelPos)) { levelPos.changeParameters(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size); if (dataToGenerate.containsKey(levelPos)) @@ -228,7 +227,7 @@ public class LodRegion implements Serializable { levelPos.changeParameters((byte) (detailLevel - 1), childPosX + x, childPosZ + z); - if (!doesDataExist(LevelPosUtil.createLevelPos(levelPos.detailLevel, levelPos.posX, levelPos.posZ))) + if (!doesDataExist(levelPos)) { num++; levelPos.changeParameters((byte) (detailLevel - 1), childPosX + x + regionPosX * childSize, childPosZ + z + regionPosZ * childSize); @@ -262,7 +261,7 @@ public class LodRegion implements Serializable { levelPos.changeParameters(detailLevel, posX, posZ); levelPos.convert(childDetailLevel); - if (!doesDataExist(LevelPosUtil.createLevelPos(levelPos.detailLevel, levelPos.posX, levelPos.posZ))) + if (!doesDataExist(levelPos)) { levelPos.changeParameters(levelPos.detailLevel, levelPos.posX + regionPosX * childSize, levelPos.posZ + regionPosZ * childSize); if (dataToGenerate.containsKey(levelPos)) @@ -336,7 +335,7 @@ public class LodRegion implements Serializable for (int z = 0; z <= 1; z++) { levelPos.changeParameters((byte) (detailLevel - 1), childPosX + x, childPosZ + z); - if (doesDataExist(LevelPosUtil.createLevelPos(levelPos.detailLevel, levelPos.posX, levelPos.posZ))) childrenCount++; + if (doesDataExist(levelPos)) childrenCount++; } } @@ -372,36 +371,43 @@ public class LodRegion implements Serializable /** * @param levelPos */ - public void updateArea(int[] levelPos) + public void updateArea(LevelPos levelPos) { int width; - levelPos = LevelPosUtil.getRegionModule(levelPos); - int detailLevel = LevelPosUtil.getDetailLevel(levelPos); - int[] bottomLevelPos; + int startX; + int startZ; + byte detailLevel = levelPos.detailLevel; + int posX = levelPos.posX; + int posZ = levelPos.posZ; for (byte bottom = (byte) (minDetailLevel + 1); bottom <= detailLevel; bottom++) { - bottomLevelPos = LevelPosUtil.convert(levelPos, 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++) { - update(LevelPosUtil.applyOffset(bottomLevelPos, x, z)); + levelPos.changeParameters(bottom, startX + x, startZ + z); + update(levelPos); } } + levelPos.changeParameters(detailLevel, posX, posZ); } - for (byte up = (byte) (detailLevel + 1); up <= LodUtil.REGION_DETAIL_LEVEL; up++) + for (byte tempLod = (byte) (detailLevel + 1); tempLod <= LodUtil.REGION_DETAIL_LEVEL; tempLod++) { - update(LevelPosUtil.convert(levelPos, up)); + levelPos.convert(tempLod); + update(levelPos); } } /** * @param levelPos */ - private void update(int[] levelPos) + private void update(LevelPos levelPos) { - levelPos = LevelPosUtil.getRegionModule(levelPos); + levelPos.performRegionModule(); int numberOfChildren = 0; int numberOfVoidChildren = 0; @@ -413,9 +419,9 @@ public class LodRegion implements Serializable int newPosX; int newPosZ; byte newDetailLevel; - int detailLevel = LevelPosUtil.getDetailLevel(levelPos); - int posX = LevelPosUtil.getPosX(levelPos); - int posZ = LevelPosUtil.getPosZ(levelPos); + int detailLevel = levelPos.detailLevel; + int posX = levelPos.posX; + int posZ = levelPos.posZ; for (int x = 0; x <= 1; x++) { for (int z = 0; z <= 1; z++) @@ -423,7 +429,7 @@ public class LodRegion implements Serializable newPosX = 2 * posX + x; newPosZ = 2 * posZ + z; newDetailLevel = (byte) (detailLevel - 1); - levelPos = LevelPosUtil.createLevelPos(newDetailLevel, newPosX, newPosZ); + levelPos.changeParameters(newDetailLevel, newPosX, newPosZ); if (doesDataExist(levelPos)) { if (height[newDetailLevel][newPosX][newPosZ] != LodBuilder.DEFAULT_HEIGHT @@ -471,12 +477,12 @@ public class LodRegion implements Serializable * @param levelPos * @return */ - public boolean doesDataExist(int[] levelPos) + public boolean doesDataExist(LevelPos levelPos) { try { - levelPos = LevelPosUtil.getRegionModule(levelPos); - return dataExistence[LevelPosUtil.getDetailLevel(levelPos)][LevelPosUtil.getPosX(levelPos)][LevelPosUtil.getPosZ(levelPos)]; + levelPos = levelPos.getRegionModuleLevelPos(); + return dataExistence[levelPos.detailLevel][levelPos.posX][levelPos.posZ]; } catch (NullPointerException e) { return false; diff --git a/src/main/java/com/seibel/lod/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java index 0054b9baf..4753b0f93 100644 --- a/src/main/java/com/seibel/lod/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/render/LodRenderer.java @@ -773,7 +773,7 @@ public class LodRenderer //=============// // full regens // //=============// - + // check if the view distance changed if (ClientProxy.previousLodRenderDistance != LodConfig.CLIENT.lodChunkRenderDistance.get() || mc.options.renderDistance != prevRenderDistance @@ -787,7 +787,13 @@ public class LodRenderer //vanillaRenderedChunks.stream().filter(pos -> ((Math.abs(pos.x - player.xChunk) > mc.options.renderDistance) || (Math.abs(pos.z - player.zChunk) > mc.options.renderDistance))); vanillaRenderedChunks.clear(); } - + + // did the user change the debug setting? + if (LodConfig.CLIENT.debugMode.get() != previousDebugMode) + { + previousDebugMode = LodConfig.CLIENT.debugMode.get(); + fullRegen = true; + } long newTime = System.currentTimeMillis(); @@ -862,14 +868,6 @@ public class LodRenderer { vanillaRenderedChunks.clear(); } - - - // did the user change the debug setting? - if (LodConfig.CLIENT.debugMode.get() != previousDebugMode) - { - previousDebugMode = LodConfig.CLIENT.debugMode.get(); - fullRegen = true; - } } } \ No newline at end of file diff --git a/src/main/java/com/seibel/lod/render/RenderUtil.java b/src/main/java/com/seibel/lod/render/RenderUtil.java index 930ffd383..3b33623cf 100644 --- a/src/main/java/com/seibel/lod/render/RenderUtil.java +++ b/src/main/java/com/seibel/lod/render/RenderUtil.java @@ -121,7 +121,7 @@ public class RenderUtil { // convert the vbo position into a direction vector // starting from the player's position - Vector3d vboVec = new Vector3d(vboCenterPos.getX(), 64, vboCenterPos.getZ()); + Vector3d vboVec = new Vector3d(vboCenterPos.getX(), 0, vboCenterPos.getZ()); Vector3d playerVec = new Vector3d(playerBlockPos.getX(), playerBlockPos.getY(), playerBlockPos.getZ()); Vector3d vboCenterVec = vboVec.subtract(playerVec);