diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java index 920165e1b..915d375ab 100644 --- a/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java @@ -242,8 +242,8 @@ public class LodBufferBuilder if (lodDim.doesRegionNeedBufferRegen(xRegion, zRegion) || fullRegen) { RegionPos regionPos = new RegionPos( - xRegion + lodDim.getCenterRegionPosX() - Math.floorDiv(lodDim.getWidth(), 2), - zRegion + lodDim.getCenterRegionPosZ() - Math.floorDiv(lodDim.getWidth(), 2)); + xRegion + lodDim.getCenterRegionPosX() - lodDim.getWidth() / 2, + zRegion + lodDim.getCenterRegionPosZ() - lodDim.getWidth() / 2); // local position in the vbo and bufferBuilder arrays BufferBuilder[] currentBuffers = buildableBuffers[xRegion][zRegion]; @@ -310,7 +310,7 @@ public class LodBufferBuilder for (int index = 0; index < posToRender.getNumberOfPos(); index++) { - bufferIndex = Math.floorMod(index, currentBuffers.length); + bufferIndex = index % currentBuffers.length; detailLevel = posToRender.getNthDetailLevel(index); posX = posToRender.getNthPosX(index); posZ = posToRender.getNthPosZ(index); diff --git a/src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilder.java b/src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilder.java index 9f9baebe3..dcd301c81 100644 --- a/src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilder.java @@ -34,6 +34,7 @@ import com.seibel.lod.enums.VerticalQuality; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodRegion; import com.seibel.lod.objects.LodWorld; +import com.seibel.lod.proxy.ClientProxy; import com.seibel.lod.util.ColorUtil; import com.seibel.lod.util.DataPointUtil; import com.seibel.lod.util.DetailDistanceUtil; @@ -216,13 +217,12 @@ public class LodBuilder return; // determine how many LODs to generate horizontally - HorizontalResolution detail; byte minDetailLevel = region.getMinDetailLevel(); - detail = DetailDistanceUtil.getLodGenDetail(minDetailLevel); + HorizontalResolution detail = DetailDistanceUtil.getLodGenDetail(minDetailLevel); // determine how many LODs to generate vertically - VerticalQuality verticalQuality = LodConfig.CLIENT.graphics.qualityOption.verticalQuality.get(); + //VerticalQuality verticalQuality = LodConfig.CLIENT.graphics.qualityOption.verticalQuality.get(); byte detailLevel = detail.detailLevel; @@ -236,18 +236,18 @@ public class LodBuilder endX = detail.endX[i]; endZ = detail.endZ[i]; - posX = LevelPosUtil.convert((byte) 0, chunk.getPos().x * 16 + startX, detail.detailLevel); - posZ = LevelPosUtil.convert((byte) 0, chunk.getPos().z * 16 + startZ, detail.detailLevel); - - long[] data; long[] dataToMergeVertical = createVerticalDataToMerge(detail, chunk, config, startX, startZ, endX, endZ); - data = DataPointUtil.mergeMultiData(dataToMergeVertical, DataPointUtil.worldHeight, DetailDistanceUtil.getMaxVerticalData(detailLevel)); + data = DataPointUtil.mergeMultiData(dataToMergeVertical, DataPointUtil.worldHeight / 2 + 1, DetailDistanceUtil.getMaxVerticalData(detailLevel)); //lodDim.clear(detailLevel, posX, posZ); if (data != null && data.length != 0) - lodDim.addVerticalData(detailLevel, posX, posZ, data,false); + { + posX = LevelPosUtil.convert((byte) 0, chunk.getPos().x * 16 + startX, detail.detailLevel); + posZ = LevelPosUtil.convert((byte) 0, chunk.getPos().z * 16 + startZ, detail.detailLevel); + lodDim.addVerticalData(detailLevel, posX, posZ, data, false); + } } lodDim.updateData(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z); } @@ -260,7 +260,7 @@ public class LodBuilder long[] dataToMerge = ThreadMapUtil.getBuilderVerticalArray(detail.detailLevel); - int verticalData = DataPointUtil.worldHeight; + int verticalData = DataPointUtil.worldHeight / 2 + 1; ChunkPos chunkPos = chunk.getPos(); int height; @@ -284,8 +284,8 @@ public class LodBuilder for (index = 0; index < size * size; index++) { - xRel = Math.floorMod(index, size) + startX; - zRel = Math.floorDiv(index, size) + startZ; + xRel = startX + index % size; + zRel = startZ + index / size; xAbs = chunkPos.getMinBlockX() + xRel; zAbs = chunkPos.getMinBlockZ() + zRel; diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 60a98a6c0..6043ae051 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -437,6 +437,7 @@ public class LodDimension } /** + * Use addVerticalData when possible. * Add the given LOD to this dimension at the coordinate * stored in the LOD. If an LOD already exists at the given * coordinate it will be overwritten. @@ -866,7 +867,7 @@ public class LodDimension public void setRegionWidth(int newWidth) { width = newWidth; - halfWidth = Math.floorDiv(width, 2); + halfWidth = width/ 2; regions = new LodRegion[width][width]; isRegionDirty = new boolean[width][width]; diff --git a/src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java b/src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java index 162d171ac..f692baa1d 100644 --- a/src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java +++ b/src/main/java/com/seibel/lod/objects/VerticalLevelContainer.java @@ -56,7 +56,6 @@ public class VerticalLevelContainer implements LevelContainer @Override public void clear(int posX, int posZ) { - posX = LevelPosUtil.getRegionModule(detailLevel, posX); posZ = LevelPosUtil.getRegionModule(detailLevel, posZ); for (int verticalIndex = 0; verticalIndex < maxVerticalData; verticalIndex++) @@ -68,7 +67,6 @@ public class VerticalLevelContainer implements LevelContainer @Override public boolean addData(long data, int posX, int posZ, int verticalIndex) { - posX = LevelPosUtil.getRegionModule(detailLevel, posX); posZ = LevelPosUtil.getRegionModule(detailLevel, posZ); dataContainer[posX * size * maxVerticalData + posZ * maxVerticalData + verticalIndex] = data; @@ -78,7 +76,6 @@ public class VerticalLevelContainer implements LevelContainer @Override public boolean addVerticalData(long[] data, int posX, int posZ) { - posX = LevelPosUtil.getRegionModule(detailLevel, posX); posZ = LevelPosUtil.getRegionModule(detailLevel, posZ); for (int verticalIndex = 0; verticalIndex < maxVerticalData; verticalIndex++) @@ -134,7 +131,7 @@ public class VerticalLevelContainer implements LevelContainer index++; maxVerticalData = inputData[index]; index++; - size = (int) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - detailLevel); + size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); int x = size * size * maxVerticalData; this.dataContainer = new long[x]; for (int i = 0; i < x; i++) @@ -177,13 +174,7 @@ public class VerticalLevelContainer implements LevelContainer } data = DataPointUtil.mergeMultiData(dataToMerge, lowerMaxVertical, getMaxVerticalData()); - for (int verticalIndex = 0; (verticalIndex < data.length) && (verticalIndex < maxVerticalData); verticalIndex++) - { - addData(data[verticalIndex], - posX, - posZ, - verticalIndex); - } + addVerticalData(data, posX, posZ); } @Override @@ -217,7 +208,7 @@ public class VerticalLevelContainer implements LevelContainer { /* StringBuilder stringBuilder = new StringBuilder(); - int size = (int) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - detailLevel); + int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); stringBuilder.append(detailLevel); stringBuilder.append(DATA_DELIMITER); for (int x = 0; x < size; x++) diff --git a/src/main/java/com/seibel/lod/util/DataPointUtil.java b/src/main/java/com/seibel/lod/util/DataPointUtil.java index 25d707e5d..f94a9e7e7 100644 --- a/src/main/java/com/seibel/lod/util/DataPointUtil.java +++ b/src/main/java/com/seibel/lod/util/DataPointUtil.java @@ -282,7 +282,7 @@ public class DataPointUtil int size = dataToMerge.length / inputVerticalData; // We initialize the arrays that are going to be used - short[] heightAndDepth = ThreadMapUtil.getHeightAndDepth((worldHeight + 1) * 2); + short[] heightAndDepth = ThreadMapUtil.getHeightAndDepth((worldHeight / 2 + 1) * 2); long[] dataPoint = ThreadMapUtil.getVerticalDataArray(DetailDistanceUtil.getMaxVerticalData(0)); diff --git a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java index e096dbea3..f99e2b00c 100644 --- a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java +++ b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java @@ -97,12 +97,13 @@ public class DetailDistanceUtil return (byte) minDetail; int distanceUnit = LodConfig.CLIENT.graphics.qualityOption.horizontalScale.get().distanceUnit; if (LodConfig.CLIENT.graphics.qualityOption.horizontalQuality.get() == HorizontalQuality.LOWEST) - detail = (byte) Math.floorDiv(distance, distanceUnit); + detail = (byte) distance / distanceUnit; else { double base = LodConfig.CLIENT.graphics.qualityOption.horizontalQuality.get().quadraticBase; double logBase = Math.log(base); - detail = (byte) (Math.log(Math.floorDiv(distance, distanceUnit)) / logBase); + //noinspection IntegerDivisionInFloatingPointContext + detail = (byte) (Math.log(distance / distanceUnit) / logBase); } return (byte) LodUtil.clamp(minDetail, detail, maxDetail - 1); } @@ -119,14 +120,11 @@ public class DetailDistanceUtil public static byte getTreeCutDetailFromDistance(int distance) { - return baseInverseFunction((int) (distance * treeCutMultiplier), minGenDetail, true); } - public static byte getTreeGenDetailFromDistance(int distance) { - return baseInverseFunction((int) (distance * treeGenMultiplier), minGenDetail, true); } @@ -156,30 +154,20 @@ public class DetailDistanceUtil public static HorizontalResolution getLodGenDetail(int detail) { if (detail < minGenDetail) - { return lodGenDetails[minGenDetail]; - } else - { return lodGenDetails[detail]; - } } public static byte getCutLodDetail(int detail) { if (detail < minGenDetail) - { return lodGenDetails[minGenDetail].detailLevel; - } else if (detail == maxDetail) - { return LodUtil.REGION_DETAIL_LEVEL; - } else - { return lodGenDetails[detail].detailLevel; - } } public static int getMaxVerticalData(int detail) diff --git a/src/main/java/com/seibel/lod/util/LevelPosUtil.java b/src/main/java/com/seibel/lod/util/LevelPosUtil.java index aea601fb2..11cbfc4f4 100644 --- a/src/main/java/com/seibel/lod/util/LevelPosUtil.java +++ b/src/main/java/com/seibel/lod/util/LevelPosUtil.java @@ -149,6 +149,10 @@ public class LevelPosUtil return convert(detailLevel, pos, LodUtil.CHUNK_DETAIL_LEVEL); } + public static int myPow2(int x) + { + return x*x; + } public static int maxDistance(byte detailLevel, int posX, int posZ, int playerPosX, int playerPosZ) { @@ -156,13 +160,15 @@ public class LevelPosUtil int startPosX = posX * width; int startPosZ = posZ * width; - int endPosX = startPosX + width; - int endPosZ = startPosZ + width; + int endPosX = myPow2(playerPosX - startPosX - width); + int endPosZ = myPow2(playerPosZ - startPosZ - width); + startPosX = myPow2(playerPosX - startPosX); + startPosZ = myPow2(playerPosZ - startPosZ); - 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))); + int maxDistance = (int) Math.sqrt(startPosX + startPosZ); + maxDistance = Math.max(maxDistance, (int) Math.sqrt(startPosX + endPosZ)); + maxDistance = Math.max(maxDistance, (int) Math.sqrt(endPosX + startPosZ)); + maxDistance = Math.max(maxDistance, (int) Math.sqrt(endPosX + endPosZ)); return maxDistance; } @@ -205,10 +211,15 @@ public class LevelPosUtil } 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))); + startPosX = myPow2(playerPosX - startPosX); + startPosZ = myPow2(playerPosZ - startPosZ); + endPosX = myPow2(playerPosX - endPosX); + endPosZ = myPow2(playerPosZ - endPosZ); + + int minDistance = (int) Math.sqrt(startPosX + startPosZ); + minDistance = Math.min(minDistance, (int) Math.sqrt(startPosX + endPosZ)); + minDistance = Math.min(minDistance, (int) Math.sqrt(endPosX + startPosZ)); + minDistance = Math.min(minDistance, (int) Math.sqrt(endPosX + endPosZ)); return minDistance; } } diff --git a/src/main/java/com/seibel/lod/util/LodUtil.java b/src/main/java/com/seibel/lod/util/LodUtil.java index b5d8472ff..30e132379 100644 --- a/src/main/java/com/seibel/lod/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/util/LodUtil.java @@ -201,8 +201,8 @@ public class LodUtil /** Convert a 2D absolute position into a quad tree relative position. */ public static RegionPos convertGenericPosToRegionPos(int x, int z, int detailLevel) { - int relativePosX = Math.floorDiv(x, (int) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - detailLevel)); - int relativePosZ = Math.floorDiv(z, (int) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - detailLevel)); + int relativePosX = Math.floorDiv(x, 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel)); + int relativePosZ = Math.floorDiv(z, 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel)); return new RegionPos(relativePosX, relativePosZ); } @@ -210,7 +210,7 @@ public class LodUtil /** Convert a 2D absolute position into a quad tree relative position. */ public static int convertLevelPos(int pos, int currentDetailLevel, int targetDetailLevel) { - return Math.floorDiv(pos, (int) Math.pow(2, targetDetailLevel - currentDetailLevel)); + return pos / (1 << (targetDetailLevel - currentDetailLevel)); } /** @@ -224,9 +224,7 @@ public class LodUtil for (ChunkSection section : blockStorage) { if (section != null && !section.isEmpty()) - { return true; - } } return false; @@ -492,20 +490,9 @@ public class LodUtil { tempX = x + Box.DIRECTION_NORMAL_MAP.get(direction).getX(); tempZ = z + Box.DIRECTION_NORMAL_MAP.get(direction).getZ(); - if (!(tempX < 0 || tempZ < 0 || tempX >= vanillaRenderedChunks.length || tempZ >= vanillaRenderedChunks[0].length)) - { - if (!vanillaRenderedChunks[tempX][tempZ]) - { - return true; - } - } - else - { - if (vanillaRenderedChunks[x][z]) - { - return true; - } - } + if (vanillaRenderedChunks[x][z] || (!(tempX < 0 || tempZ < 0 || tempX >= vanillaRenderedChunks.length || tempZ >= vanillaRenderedChunks[0].length) + && !vanillaRenderedChunks[tempX][tempZ])) + return true; } return false; } diff --git a/src/main/java/com/seibel/lod/util/ThreadMapUtil.java b/src/main/java/com/seibel/lod/util/ThreadMapUtil.java index d3df265fe..d70dbc0e8 100644 --- a/src/main/java/com/seibel/lod/util/ThreadMapUtil.java +++ b/src/main/java/com/seibel/lod/util/ThreadMapUtil.java @@ -128,7 +128,7 @@ public class ThreadMapUtil int size = 1; for (int i = 0; i < 5; i++) { - array[i] = new long[size * size * DataPointUtil.worldHeight + 1]; + array[i] = new long[size * size * DataPointUtil.worldHeight / 2 + 1]; size = size << 1; } threadBuilderVerticalArrayMap.put(Thread.currentThread().getName(), array);