From 31cb684bec28ae9e62310f37eb8e1392e79dc0e8 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sun, 22 Aug 2021 19:54:10 +0200 Subject: [PATCH] Added different generation detail option --- .../com/seibel/lod/builders/LodBufferBuilder.java | 10 +++++----- .../java/com/seibel/lod/builders/LodBuilder.java | 5 +++-- src/main/java/com/seibel/lod/enums/LodDetail.java | 4 ++-- .../lod/handlers/LodDimensionFileHandler.java | 4 ++-- .../java/com/seibel/lod/objects/LodDimension.java | 13 +++++++------ src/main/java/com/seibel/lod/proxy/ClientProxy.java | 6 +++--- src/main/java/com/seibel/lod/util/DetailUtil.java | 12 ++++++------ 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 84cfdd5f0..c7cb88909 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -210,7 +210,7 @@ public class LodBufferBuilder if (currentBuffer == null || (currentBuffer != null && !currentBuffer.building())) return; - for (byte detail = LodUtil.BLOCK_DETAIL_LEVEL; detail <= LodUtil.REGION_DETAIL_LEVEL; detail++) + for (byte detail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detail <= LodUtil.REGION_DETAIL_LEVEL; detail++) { posListToRender.addAll(lodDim.getDataToRender( regionPos, @@ -290,7 +290,7 @@ public class LodBufferBuilder int requesting = maxChunkGenRequests; //we firstly make sure that the world is filled with half region wide block - for (byte detailGen = LodUtil.BLOCK_DETAIL_LEVEL; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++) + for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++) { if (requesting == 0) break; posListToGenerate.addAll(lodDim.getDataToGenerate( @@ -305,7 +305,7 @@ public class LodBufferBuilder } //we then fill the world with the rest of the block - for (byte detailGen = LodUtil.BLOCK_DETAIL_LEVEL; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++) + for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++) { if (requesting == 0) break; posListToGenerate.addAll(lodDim.getDataToGenerate( @@ -314,7 +314,7 @@ public class LodBufferBuilder DetailUtil.getDistanceGeneration(detailGen), DetailUtil.getDistanceGeneration(detailGen + 1), LodConfig.CLIENT.distanceGenerationMode.get().complexity, - (byte) 0, + LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, maxChunkGenRequests)); requesting = maxChunkGenRequests - posListToGenerate.size(); } @@ -409,7 +409,7 @@ public class LodBufferBuilder positionWaitingToBeGenerated.add(chunkPos); numberOfChunksWaitingToGenerate.addAndGet(1); - LodNodeGenWorker genWorker = new LodNodeGenWorker(chunkPos, LodConfig.CLIENT.distanceGenerationMode.get(), LodDetail.FULL, renderer, LodQuadTreeNodeBuilder, this, lodDim, serverWorld); + LodNodeGenWorker genWorker = new LodNodeGenWorker(chunkPos, LodConfig.CLIENT.distanceGenerationMode.get(), LodConfig.CLIENT.maxGenerationDetail.get(), renderer, LodQuadTreeNodeBuilder, this, lodDim, serverWorld); WorldWorkerManager.addWorker(genWorker); } } diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index dee3cdd51..ce472a984 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -23,6 +23,7 @@ import java.util.concurrent.Executors; import com.seibel.lod.enums.DistanceGenerationMode; import com.seibel.lod.enums.LodDetail; +import com.seibel.lod.handlers.LodConfig; import com.seibel.lod.objects.LevelPos; import com.seibel.lod.objects.LodDataPoint; import com.seibel.lod.objects.LodDimension; @@ -106,7 +107,7 @@ public class LodBuilder lodDim = lodWorld.getLodDimension(dim); } - generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode), LodDetail.FULL); + generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode), LodConfig.CLIENT.maxGenerationDetail.get()); } catch (IllegalArgumentException | NullPointerException e) { e.printStackTrace(); @@ -177,7 +178,7 @@ public class LodBuilder chunk.getPos().x * 16 + startX, chunk.getPos().z * 16 + startZ); data = new LodDataPoint(height, depth, color); - lodDim.addData(levelPos.convert((byte) detail.detailLevel), + lodDim.addData(levelPos.convert(detail.detailLevel), data, config.distanceGenerationMode, true, diff --git a/src/main/java/com/seibel/lod/enums/LodDetail.java b/src/main/java/com/seibel/lod/enums/LodDetail.java index 136f18ac4..0bbeeaf9f 100644 --- a/src/main/java/com/seibel/lod/enums/LodDetail.java +++ b/src/main/java/com/seibel/lod/enums/LodDetail.java @@ -54,7 +54,7 @@ public enum LodDetail public final int dataPointWidth; /** This is the same as detailLevel in LodQuadTreeNode, * lowest is 0 highest is 9 */ - public final int detailLevel; + public final byte detailLevel; /* Start/End X/Z give the block positions * for each individual dataPoint in a LodChunk */ @@ -80,7 +80,7 @@ public enum LodDetail private LodDetail(int newLengthCount, int newDetailLevel) { - detailLevel = newDetailLevel; + detailLevel = (byte) newDetailLevel; dataPointLengthCount = newLengthCount; dataPointWidth = 16 / dataPointLengthCount; diff --git a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java index fef560f41..8cf85b474 100644 --- a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java @@ -317,7 +317,7 @@ public class LodDimensionFileHandler fw.write(LOD_FILE_VERSION_PREFIX + " " + LOD_SAVE_FILE_VERSION + "\n"); // add each LodChunk to the file - fw.write(region.getLevel((byte) 0).toString()); + fw.write(region.getLevel(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel).toString()); fw.close(); // overwrite the old file with the new one @@ -353,7 +353,7 @@ public class LodDimensionFileHandler // ".\Super Flat\DIM-1\data" // or // ".\Super Flat\data" - return dimensionDataSaveFolder.getCanonicalPath() + File.separatorChar + + return dimensionDataSaveFolder.getCanonicalPath() + File.separatorChar + LodConfig.CLIENT.maxGenerationDetail.get().detailLevel + File.separatorChar + FILE_NAME_PREFIX + "." + regionX + "." + regionZ + FILE_EXTENSION; } catch (IOException | SecurityException e) diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 1919811df..0a41067ef 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.stream.Collectors; import com.seibel.lod.enums.DistanceGenerationMode; +import com.seibel.lod.handlers.LodConfig; import com.seibel.lod.handlers.LodDimensionFileHandler; import com.seibel.lod.proxy.ClientProxy; import com.seibel.lod.util.LodUtil; @@ -244,7 +245,7 @@ public class LodDimension if (regions[xIndex][zIndex] == null) { /**TODO the value is currently 0 but should be determinated by the distance of the player)*/ - regions[xIndex][zIndex] = new LodRegion((byte) 0, regionPos); + regions[xIndex][zIndex] = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos); } } @@ -291,7 +292,7 @@ public class LodDimension if (region == null) { // if no region exists, create it - region = new LodRegion((byte) 0, regionPos); + region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos); addOrOverwriteRegion(region); } } @@ -319,7 +320,7 @@ public class LodDimension if (region == null) { // if no region exists, create it - region = new LodRegion((byte) 0, regionPos); + region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos); addOrOverwriteRegion(region); } boolean nodeAdded = region.setData(levelPos, lodDataPoint, generationMode.complexity, true); @@ -379,7 +380,7 @@ public class LodDimension region = getRegion(regionPos); if (region == null) { - region = new LodRegion((byte) 0, regionPos); + region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos); addOrOverwriteRegion(region); } listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, start, end, generation, detailLevel, dataNumber)); @@ -421,7 +422,7 @@ public class LodDimension region = getRegion(regionPos); if (region == null) { - region = new LodRegion((byte) 0, regionPos); + region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos); addOrOverwriteRegion(region); } else { @@ -445,7 +446,7 @@ public class LodDimension { try { - region = new LodRegion((byte) 0, regionPos); + region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos); addOrOverwriteRegion(region); } catch (ArrayIndexOutOfBoundsException e) diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index e749b58e2..843f9f0fb 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -139,10 +139,10 @@ public class ClientProxy // LodConfig.CLIENT.drawLODs.set(true); LodConfig.CLIENT.debugMode.set(false); - LodConfig.CLIENT.maxDrawDetail.set(LodDetail.FULL); - LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.FULL); + LodConfig.CLIENT.maxDrawDetail.set(LodDetail.SINGLE); + LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.SINGLE); - LodConfig.CLIENT.fogDistance.set(FogDistance.FAR); + LodConfig.CLIENT.fogDistance.set(FogDistance.NEAR); LodConfig.CLIENT.fogDrawOverride.set(FogDrawOverride.ALWAYS_DRAW_FOG_FANCY); LodConfig.CLIENT.shadingMode.set(ShadingMode.DARKEN_SIDES); // LodConfig.CLIENT.brightnessMultiplier.set(1.0); diff --git a/src/main/java/com/seibel/lod/util/DetailUtil.java b/src/main/java/com/seibel/lod/util/DetailUtil.java index 6070ac0d8..f0a2334e9 100644 --- a/src/main/java/com/seibel/lod/util/DetailUtil.java +++ b/src/main/java/com/seibel/lod/util/DetailUtil.java @@ -6,6 +6,7 @@ import com.seibel.lod.handlers.LodConfig; public class DetailUtil { private static double genMultiplier = 1.5; + private static final int minDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; private static final int maxDetail = LodUtil.REGION_DETAIL_LEVEL + 1; private static final int minDistance = 0; private static final int maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16; @@ -26,18 +27,17 @@ public class DetailUtil { int distance = 0; int initial = LodConfig.CLIENT.lodQuality.get() * 256; + if(detail == minDetail) + return minDistance; + if(detail == maxDetail) + distance = maxDistance; switch (LodConfig.CLIENT.lodDistanceCalculatorType.get()) { case LINEAR: distance = (detail * initial); break; case QUADRATIC: - if (detail == 0) - distance = minDistance; - else if(detail == maxDetail) - distance = maxDistance; - else - distance = (int) (Math.pow(2, detail) * initial); + distance = (int) (Math.pow(2, detail) * initial); break; } return distance;