From 2289826363a76c8d0af3d544bc6ca5eb5557c9eb Mon Sep 17 00:00:00 2001 From: cola98765 Date: Sun, 28 Nov 2021 14:32:08 +0100 Subject: [PATCH] implemented VERTICAL_OFFSET (-64) and change WORLD_HEIGHT (1024). those numbers mean the same as 1.17 "min_y" and "height" world settings. TODO check if it's not significantly worse in performance. --- .../com/seibel/lod/core/api/EventApi.java | 2 +- .../lodTemplates/CubicLodTemplate.java | 2 +- .../core/builders/lodBuilding/LodBuilder.java | 8 +-- .../handlers/LodDimensionFileHandler.java | 16 ++++- .../objects/lod/VerticalLevelContainer.java | 71 ++++++++++++++----- .../seibel/lod/core/util/DataPointUtil.java | 6 +- .../com/seibel/lod/core/util/LodUtil.java | 2 + .../seibel/lod/core/util/ThreadMapUtil.java | 2 +- 8 files changed, 79 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/seibel/lod/core/api/EventApi.java b/src/main/java/com/seibel/lod/core/api/EventApi.java index 96e4d381a..33695a42a 100644 --- a/src/main/java/com/seibel/lod/core/api/EventApi.java +++ b/src/main/java/com/seibel/lod/core/api/EventApi.java @@ -103,7 +103,7 @@ public class EventApi /** This is also called when a new dimension loads */ public void worldLoadEvent(IWorldWrapper world) { - DataPointUtil.worldHeight = world.getHeight(); + DataPointUtil.WORLD_HEIGHT = world.getHeight(); //LodNodeGenWorker.restartExecutorService(); //ThreadMapUtil.clearMaps(); diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java index 29e3fda66..01f586800 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java @@ -130,7 +130,7 @@ public class CubicLodTemplate extends AbstractLodTemplate color = ColorUtil.applyLightValue(color, skyLight, blockLight); addPosAndColor(buffer, box.getX(lodDirection, vertexIndex), - box.getY(lodDirection, vertexIndex, verticalFaceIndex), + box.getY(lodDirection, vertexIndex, verticalFaceIndex) + LodUtil.VERTICAL_OFFSET, box.getZ(lodDirection, vertexIndex), color); } diff --git a/src/main/java/com/seibel/lod/core/builders/lodBuilding/LodBuilder.java b/src/main/java/com/seibel/lod/core/builders/lodBuilding/LodBuilder.java index 2dda190f6..49c5ba8a4 100644 --- a/src/main/java/com/seibel/lod/core/builders/lodBuilding/LodBuilder.java +++ b/src/main/java/com/seibel/lod/core/builders/lodBuilding/LodBuilder.java @@ -196,7 +196,7 @@ public class LodBuilder long[] data; long[] dataToMergeVertical = createVerticalDataToMerge(detail, chunk, config, startX, startZ); - data = DataPointUtil.mergeMultiData(dataToMergeVertical, DataPointUtil.worldHeight / 2 + 1, DetailDistanceUtil.getMaxVerticalData(detailLevel)); + data = DataPointUtil.mergeMultiData(dataToMergeVertical, DataPointUtil.WORLD_HEIGHT / 2 + 1, DetailDistanceUtil.getMaxVerticalData(detailLevel)); //lodDim.clear(detailLevel, posX, posZ); @@ -217,7 +217,7 @@ public class LodBuilder int size = 1 << detail.detailLevel; long[] dataToMerge = ThreadMapUtil.getBuilderVerticalArray(detail.detailLevel); - int verticalData = DataPointUtil.worldHeight / 2 + 1; + int verticalData = DataPointUtil.WORLD_HEIGHT / 2 + 1; AbstractChunkPosWrapper chunkPos = chunk.getPos(); int height; @@ -247,7 +247,7 @@ public class LodBuilder zAbs = chunkPos.getMinBlockZ() + zRel; //Calculate the height of the lod - yAbs = DataPointUtil.worldHeight + 1; + yAbs = DataPointUtil.WORLD_HEIGHT + 1; int count = 0; boolean topBlock = true; while (yAbs > 0) @@ -284,7 +284,7 @@ public class LodBuilder lightSky = (light >> 4) & 0b1111; isDefault = ((light >> 8)) == 1; - dataToMerge[index * verticalData + count] = DataPointUtil.createDataPoint(height, depth, color, lightSky, lightBlock, generation, isDefault); + dataToMerge[index * verticalData + count] = DataPointUtil.createDataPoint(height - LodUtil.VERTICAL_OFFSET, depth - LodUtil.VERTICAL_OFFSET, color, lightSky, lightBlock, generation, isDefault); topBlock = false; yAbs = depth - 1; count++; diff --git a/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java b/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java index 87ab42002..9e4a6149f 100644 --- a/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java @@ -77,7 +77,7 @@ public class LodDimensionFileHandler * file handler, older versions (smaller numbers) will be deleted and overwritten, * newer versions (larger numbers) will be ignored and won't be read. */ - public static final int LOD_SAVE_FILE_VERSION = 6; + public static final int LOD_SAVE_FILE_VERSION = 7; /** * Allow saving asynchronously, but never try to save multiple regions @@ -169,7 +169,7 @@ public class LodDimensionFileHandler fileVersion = inputStream.read(); // check if this file can be read by this file handler - if (fileVersion < LOD_SAVE_FILE_VERSION) + if (fileVersion < 6) { // the file we are reading is an older version, // close the reader and delete the file. @@ -195,6 +195,16 @@ public class LodDimensionFileHandler break; } + else if (fileVersion == 6) + { + //this is old, but readable version + byte[] data = ThreadMapUtil.getSaveContainer(tempDetailLevel); + inputStream.read(data); + inputStream.close(); + // add the data to our region + region.addLevelContainer(new VerticalLevelContainer(data, 6)); + break; + } // this file is a readable version, @@ -205,7 +215,7 @@ public class LodDimensionFileHandler // add the data to our region - region.addLevelContainer(new VerticalLevelContainer(data)); + region.addLevelContainer(new VerticalLevelContainer(data, LOD_SAVE_FILE_VERSION)); } catch (IOException ioEx) { diff --git a/src/main/java/com/seibel/lod/core/objects/lod/VerticalLevelContainer.java b/src/main/java/com/seibel/lod/core/objects/lod/VerticalLevelContainer.java index 7938f5790..f7d6807ad 100644 --- a/src/main/java/com/seibel/lod/core/objects/lod/VerticalLevelContainer.java +++ b/src/main/java/com/seibel/lod/core/objects/lod/VerticalLevelContainer.java @@ -122,25 +122,62 @@ public class VerticalLevelContainer implements LevelContainer return DataPointUtil.doesItExist(getSingleData(posX, posZ)); } - public VerticalLevelContainer(byte[] inputData) + public VerticalLevelContainer(byte[] inputData, int version) { - int tempIndex; - int index = 0; - long newData; - detailLevel = inputData[index]; - index++; - maxVerticalData = inputData[index] & 0b01111111; - index++; - size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); - int x = size * size * maxVerticalData; - this.dataContainer = new long[x]; - for (int i = 0; i < x; i++) + if (version == 6) { - newData = 0; - for (tempIndex = 0; tempIndex < 8; tempIndex++) - newData += (((long) inputData[index + tempIndex]) & 0xff) << (8 * tempIndex); - index += 8; - dataContainer[i] = newData; + int tempIndex; + int index = 0; + long newData; + detailLevel = inputData[index]; + index++; + maxVerticalData = inputData[index] & 0b01111111; + index++; + size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); + int x = size * size * maxVerticalData; + this.dataContainer = new long[x]; + for (int i = 0; i < x; i++) + { + newData = 0; + for (tempIndex = 0; tempIndex < 8; tempIndex++) + newData += (((long) inputData[index + tempIndex]) & 0xff) << (8 * tempIndex); + index += 8; + + newData = DataPointUtil.createDataPoint( + DataPointUtil.getAlpha(newData), + DataPointUtil.getRed(newData), + DataPointUtil.getGreen(newData), + DataPointUtil.getBlue(newData), + DataPointUtil.getHeight(newData) - LodUtil.VERTICAL_OFFSET, + DataPointUtil.getDepth(newData) - LodUtil.VERTICAL_OFFSET, + DataPointUtil.getLightSky(newData), + DataPointUtil.getLightBlock(newData), + DataPointUtil.getGenerationMode(newData), + DataPointUtil.getFlag(newData) + ); + dataContainer[i] = newData; + } + } + else //if (version == 7) + { + int tempIndex; + int index = 0; + long newData; + detailLevel = inputData[index]; + index++; + maxVerticalData = inputData[index] & 0b01111111; + index++; + size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); + int x = size * size * maxVerticalData; + this.dataContainer = new long[x]; + for (int i = 0; i < x; i++) + { + newData = 0; + for (tempIndex = 0; tempIndex < 8; tempIndex++) + newData += (((long) inputData[index + tempIndex]) & 0xff) << (8 * tempIndex); + index += 8; + dataContainer[i] = newData; + } } } diff --git a/src/main/java/com/seibel/lod/core/util/DataPointUtil.java b/src/main/java/com/seibel/lod/core/util/DataPointUtil.java index 3c59c6261..486d21a6d 100644 --- a/src/main/java/com/seibel/lod/core/util/DataPointUtil.java +++ b/src/main/java/com/seibel/lod/core/util/DataPointUtil.java @@ -58,7 +58,7 @@ public class DataPointUtil //public final static int MIN_DEPTH = -64; //public final static int MIN_HEIGHT = -64; public final static int EMPTY_DATA = 0; - public static int worldHeight = 256; + public static int WORLD_HEIGHT = 1024; public final static int ALPHA_DOWNSIZE_SHIFT = 4; @@ -267,7 +267,7 @@ public class DataPointUtil int size = dataToMerge.length / inputVerticalData; // We initialize the arrays that are going to be used - short[] heightAndDepth = ThreadMapUtil.getHeightAndDepth((worldHeight / 2 + 1) * 2); + short[] heightAndDepth = ThreadMapUtil.getHeightAndDepth((WORLD_HEIGHT / 2 + 1) * 2); long[] dataPoint = ThreadMapUtil.getVerticalDataArray(DetailDistanceUtil.getMaxVerticalData(0)); @@ -412,7 +412,7 @@ public class DataPointUtil int j = 0; while (count > maxVerticalData) { - ii = worldHeight; + ii = WORLD_HEIGHT; for (i = 0; i < count - 1; i++) { if (heightAndDepth[i * 2 + 1] - heightAndDepth[(i + 1) * 2] <= ii) diff --git a/src/main/java/com/seibel/lod/core/util/LodUtil.java b/src/main/java/com/seibel/lod/core/util/LodUtil.java index 84e745b92..7485cef92 100644 --- a/src/main/java/com/seibel/lod/core/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/core/util/LodUtil.java @@ -115,6 +115,8 @@ public class LodUtil */ public static final short BLOCK_WIDTH = 1; + public static final short VERTICAL_OFFSET = -64; + /** number of chunks wide */ public static final int REGION_WIDTH_IN_CHUNKS = REGION_WIDTH / CHUNK_WIDTH; diff --git a/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java b/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java index 03f311b87..cc179dffb 100644 --- a/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java +++ b/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java @@ -128,7 +128,7 @@ public class ThreadMapUtil for (int i = 0; i < 5; i++) { size = 1 << i; - array[i] = new long[size * size * (DataPointUtil.worldHeight / 2 + 1)]; + array[i] = new long[size * size * (DataPointUtil.WORLD_HEIGHT / 2 + 1)]; } threadBuilderVerticalArrayMap.put(Thread.currentThread().getName(), array); }