From 00f50a2e6074a38825329d4a6c20c1b645176df1 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Fri, 20 Aug 2021 19:46:46 +0200 Subject: [PATCH] Added getNodeToGenerate to the buffer builder --- .../lod/builders/LodNodeBufferBuilder.java | 56 +++++++++++++------ .../seibel/lod/builders/LodNodeBuilder.java | 9 ++- .../worldGeneration/LodNodeGenWorker.java | 21 ++++--- .../com/seibel/lod/proxy/ClientProxy.java | 2 +- 4 files changed, 57 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java index ddc958234..5991823ff 100644 --- a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java @@ -24,6 +24,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; +import com.seibel.lod.enums.DistanceGenerationMode; import kaptainwutax.mathutils.decomposition.LUDecomposition; import org.lwjgl.opengl.GL11; @@ -163,7 +164,12 @@ public class LodNodeBufferBuilder // if we don't have a full number of chunks to generate in chunksToGen // we can top it off from the reserve ChunkPos[] chunksToGenReserve = new ChunkPos[maxChunkGenRequests]; - + + LevelPos[] levelPosToGen = new LevelPos[maxChunkGenRequests]; + // if we don't have a full number of chunks to generate in chunksToGen + // we can top it off from the reserve + LevelPos[] levelPosToGenReserve = new LevelPos[maxChunkGenRequests]; + // Used when determining what detail level to use at what distance int maxBlockDistance = (numbChunksWide / 2) * 16; @@ -172,7 +178,7 @@ public class LodNodeBufferBuilder // used when determining which chunks are closer when queuing distance // generation int minChunkDist = Integer.MAX_VALUE; - + /* // x axis for (int i = 0; i < numbChunksWide; i++) { @@ -289,7 +295,6 @@ public class LodNodeBufferBuilder continue; } // lod null or empty - /* BufferBuilder currentBuffer = null; try { @@ -330,12 +335,12 @@ public class LodNodeBufferBuilder posX, yOffset, posZ, renderer.debugging, (byte) detail.detailLevel); } - */ } } + */ int width; - List posList = new ArrayList<>(); + List posListToRender = new ArrayList<>(); LodDataPoint lodData; for (int xRegion = 0; xRegion < lodDim.regions.length; xRegion++) { @@ -353,13 +358,13 @@ public class LodNodeBufferBuilder e.printStackTrace(); continue; } - posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 200, (byte) 0)); - posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 200, 400, (byte) 1)); - posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 400, 600, (byte) 2)); - posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 600, 800, (byte) 3)); - posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 800, 1000, (byte) 4)); - posList.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 1000, 10000000, (byte) 5)); - for(LevelPos pos : posList){ + posListToRender.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 200, (byte) 0)); + posListToRender.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 200, 400, (byte) 1)); + posListToRender.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 400, 600, (byte) 2)); + posListToRender.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 600, 800, (byte) 3)); + posListToRender.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 800, 1000, (byte) 4)); + posListToRender.addAll(lodDim.getDataToRender(regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 1000, 10000000, (byte) 5)); + for(LevelPos pos : posListToRender){ LevelPos chunkPos = pos.convert((byte) 3); int chunkX = chunkPos.posX + startChunkPos.x; int chunkZ = chunkPos.posZ + startChunkPos.z; @@ -383,10 +388,24 @@ public class LodNodeBufferBuilder } } - posList.clear(); + posListToRender.clear(); } } - + + + List posListToGenerate = new ArrayList<>(); + + posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 10000000, (byte) DistanceGenerationMode.SURFACE.complexity, (byte) 0, 14)); + posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 0, 10000000, (byte) DistanceGenerationMode.SURFACE.complexity, (byte) 9, 2)); + /* + posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 200, 400, (byte) DistanceGenerationMode.SURFACE.complexity, (byte) 1, 2)); + posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 400, 600, (byte) DistanceGenerationMode.SURFACE.complexity, (byte) 2, 2)); + posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 600, 800, (byte) DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT.complexity, (byte) 3, 2)); + posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 800, 1000, (byte) DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT.complexity, (byte) 4, 2)); + posListToGenerate.addAll(lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), 1000, 10000000, (byte) DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT.complexity, (byte) 5, 2));*/ + + + // issue #19 // TODO add a way for a server side mod to generate chunks requested here if (mc.hasSingleplayerServer()) @@ -401,10 +420,13 @@ public class LodNodeBufferBuilder chunksToGen[i] = chunksToGenReserve[j]; } } - + LevelPos levelPos; + ChunkPos chunkPos; // start chunk generation - for (ChunkPos chunkPos : chunksToGen) + for (LevelPos pos : posListToGenerate) { + levelPos = pos.convert((byte) 3); + chunkPos = new ChunkPos(levelPos.posX, levelPos.posZ); // don't add null chunkPos (which shouldn't happen anyway) // or add more to the generation queue if (chunkPos == null || numberOfChunksWaitingToGenerate.get() >= maxChunkGenRequests) @@ -415,7 +437,7 @@ public class LodNodeBufferBuilder numberOfChunksWaitingToGenerate.addAndGet(1); - LodNodeGenWorker genWorker = new LodNodeGenWorker(chunkPos, renderer, LodQuadTreeNodeBuilder, this, lodDim, serverWorld); + LodNodeGenWorker genWorker = new LodNodeGenWorker(chunkPos, DistanceGenerationMode.FEATURES, LodDetail.FULL, renderer, LodQuadTreeNodeBuilder, this, lodDim, serverWorld); WorldWorkerManager.addWorker(genWorker); } } diff --git a/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java b/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java index be91e4605..f70d7f46e 100644 --- a/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodNodeBuilder.java @@ -107,7 +107,7 @@ public class LodNodeBuilder lodDim = lodWorld.getLodDimension(dim); } - generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode)); + generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode), LodDetail.FULL); } catch (IllegalArgumentException | NullPointerException e) { e.printStackTrace(); @@ -126,9 +126,9 @@ public class LodNodeBuilder * * @throws IllegalArgumentException thrown if either the chunk or world is null. */ - public void generateLodNodeFromChunk(LodDimension lodDim, IChunk chunk) throws IllegalArgumentException + public void generateLodNodeFromChunk(LodDimension lodDim, IChunk chunk, LodDetail detailLevel) throws IllegalArgumentException { - generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig()); + generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(),detailLevel); } /** @@ -136,10 +136,9 @@ public class LodNodeBuilder * * @throws IllegalArgumentException thrown if either the chunk or world is null. */ - public void generateLodNodeFromChunk(LodDimension lodDim, IChunk chunk, LodBuilderConfig config) + public void generateLodNodeFromChunk(LodDimension lodDim, IChunk chunk, LodBuilderConfig config, LodDetail detail) throws IllegalArgumentException { - LodDetail detail = LodConfig.CLIENT.maxGenerationDetail.get(); if (chunk == null) throw new IllegalArgumentException("generateLodFromChunk given a null chunk"); diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java index 49c0fb87f..d5cf89473 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java @@ -30,6 +30,7 @@ import com.seibel.lod.builders.LodBuilderConfig; import com.seibel.lod.builders.LodNodeBufferBuilder; import com.seibel.lod.builders.LodNodeBuilder; import com.seibel.lod.enums.DistanceGenerationMode; +import com.seibel.lod.enums.LodDetail; import com.seibel.lod.handlers.LodConfig; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.proxy.ClientProxy; @@ -86,7 +87,7 @@ public class LodNodeGenWorker implements IWorker - public LodNodeGenWorker(ChunkPos newPos, LodNodeRenderer newLodRenderer, + public LodNodeGenWorker(ChunkPos newPos, DistanceGenerationMode newGenerationMode, LodDetail newDetaillevel, LodNodeRenderer newLodRenderer, LodNodeBuilder newLodBuilder, LodNodeBufferBuilder newLodBufferBuilder, LodDimension newLodDimension, ServerWorld newServerWorld) { @@ -111,7 +112,7 @@ public class LodNodeGenWorker implements IWorker - thread = new LodChunkGenThread(newPos, newLodRenderer, + thread = new LodChunkGenThread(newPos, newGenerationMode, newDetaillevel, newLodRenderer, newLodBuilder, newLodBufferBuilder, newLodDimension, newServerWorld); } @@ -160,17 +161,21 @@ public class LodNodeGenWorker implements IWorker { public final ServerWorld serverWorld; public final LodDimension lodDim; + public final DistanceGenerationMode generationMode; + public final LodDetail detailLevel; public final LodNodeBuilder lodNodeBuilder; public final LodNodeRenderer lodRenderer; private LodNodeBufferBuilder lodBufferBuilder; private ChunkPos pos; - public LodChunkGenThread(ChunkPos newPos, LodNodeRenderer newLodRenderer, + public LodChunkGenThread(ChunkPos newPos, DistanceGenerationMode newGenerationMode, LodDetail newDetailLevel, LodNodeRenderer newLodRenderer, LodNodeBuilder newLodBuilder, LodNodeBufferBuilder newLodBufferBuilder, LodDimension newLodDimension, ServerWorld newServerWorld) { pos = newPos; + generationMode = newGenerationMode; + detailLevel = newDetailLevel; lodRenderer = newLodRenderer; lodNodeBuilder = newLodBuilder; lodBufferBuilder = newLodBufferBuilder; @@ -189,7 +194,7 @@ public class LodNodeGenWorker implements IWorker { // long startTime = System.currentTimeMillis(); - switch(LodConfig.CLIENT.distanceGenerationMode.get()) + switch(generationMode) { case NONE: // don't generate @@ -342,14 +347,14 @@ public class LodNodeGenWorker implements IWorker if (!inTheEnd) { - lodNodeBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(true, true, false)); + lodNodeBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(true, true, false), detailLevel); } else { // if we are in the end, don't generate any chunks. // Since we don't know where the islands are, everything // generates the same and it looks really bad. - lodNodeBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(true, true, false)); + lodNodeBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(true, true, false), detailLevel); } @@ -386,7 +391,7 @@ public class LodNodeGenWorker implements IWorker IceAndSnowFeature snowFeature = new IceAndSnowFeature(NoFeatureConfig.CODEC); snowFeature.place(lodServerWorld, chunkGen, serverWorld.random, chunk.getPos().getWorldPosition(), null); - lodNodeBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(DistanceGenerationMode.SURFACE)); + lodNodeBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(DistanceGenerationMode.SURFACE), detailLevel); } @@ -512,7 +517,7 @@ public class LodNodeGenWorker implements IWorker // generate a Lod like normal - lodNodeBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(DistanceGenerationMode.FEATURES)); + lodNodeBuilder.generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(DistanceGenerationMode.FEATURES), detailLevel); } diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index 8f592024a..ccec024df 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -152,7 +152,7 @@ public class ClientProxy LodConfig.CLIENT.distanceGenerationMode.set(DistanceGenerationMode.FEATURES); LodConfig.CLIENT.allowUnstableFeatureGeneration.set(false); - LodConfig.CLIENT.numberOfWorldGenerationThreads.set(10); + LodConfig.CLIENT.numberOfWorldGenerationThreads.set(16); }