diff --git a/src/main/java/com/seibel/lod/core/builders/worldGeneration/LodWorldGenerator.java b/src/main/java/com/seibel/lod/core/builders/worldGeneration/LodWorldGenerator.java index 57b2ae7d0..aa28609a5 100644 --- a/src/main/java/com/seibel/lod/core/builders/worldGeneration/LodWorldGenerator.java +++ b/src/main/java/com/seibel/lod/core/builders/worldGeneration/LodWorldGenerator.java @@ -30,7 +30,6 @@ import com.seibel.lod.core.builders.lodBuilding.LodBuilder; import com.seibel.lod.core.enums.config.DistanceGenerationMode; import com.seibel.lod.core.objects.PosToGenerateContainer; import com.seibel.lod.core.objects.lod.LodDimension; -import com.seibel.lod.core.util.DetailDistanceUtil; import com.seibel.lod.core.util.LevelPosUtil; import com.seibel.lod.core.util.LodThreadFactory; import com.seibel.lod.core.util.LodUtil; @@ -66,14 +65,6 @@ public class LodWorldGenerator /** we only want to queue up one generator thread at a time */ private boolean generatorThreadRunning = false; - /** - * How many chunks to generate outside the player's view distance at one - * time. (or more specifically how many requests to make at one time). I - * multiply by 8 to make sure there is always a buffer of chunk requests, to - * make sure the CPU is always busy, and we can generate LODs as quickly as - * possible. - */ - public int maxChunkGenRequests; /** * This keeps track of how many chunk generation requests are on going. This is @@ -98,15 +89,30 @@ public class LodWorldGenerator */ public void queueGenerationRequests(LodDimension lodDim, LodBuilder lodBuilder) { - if (CONFIG.client().worldGenerator().getDistanceGenerationMode() != DistanceGenerationMode.NONE + // TODO: This currently doesn't use the DetailDistanceUtil.getDistanceGenerationMode(int detail) to get the mode. + // This is fine currently since DistanceGenerationMode doesn't care about the detail level for now. + // However, If that was to be changed, This will need to be fixed. + DistanceGenerationMode mode = CONFIG.client().worldGenerator().getDistanceGenerationMode(); + + if (mode != DistanceGenerationMode.NONE && !generatorThreadRunning && MC.hasSinglePlayerServer()) { // the thread is now running, don't queue up another thread generatorThreadRunning = true; - - // just in case the config changed - maxChunkGenRequests = CONFIG.client().advanced().threading().getNumberOfWorldGenerationThreads() * 8; + + /** + * How many chunks to generate outside the player's view distance at one + * time. (or more specifically how many requests to make at one time). I + * multiply by 8 to make sure there is always a buffer of chunk requests, to + * make sure the CPU is always busy, and we can generate LODs as quickly as + * possible. + */ + int genRequestPerThread = VERSION_CONSTANTS.getWorldGenerationCountPerThread(); + int maxChunkGenRequests; + if (VERSION_CONSTANTS.isWorldGeneratorSingleThreaded(mode)) + maxChunkGenRequests = CONFIG.client().advanced().threading().getNumberOfWorldGenerationThreads() * genRequestPerThread; + else maxChunkGenRequests = genRequestPerThread; Runnable generatorFunc = (() -> { @@ -128,7 +134,6 @@ public class LodWorldGenerator playerPosX, playerPosZ); - byte detailLevel; int posX; int posZ; @@ -160,7 +165,7 @@ public class LodWorldGenerator positionsWaitingToBeGenerated.add(chunkPos); numberOfChunksWaitingToGenerate.addAndGet(1); - queueWork(chunkPos, DetailDistanceUtil.getDistanceGenerationMode(detailLevel), lodBuilder, lodDim, serverWorld); + queueWork(chunkPos, mode, lodBuilder, lodDim, serverWorld); } @@ -185,12 +190,12 @@ public class LodWorldGenerator positionsWaitingToBeGenerated.add(chunkPos); numberOfChunksWaitingToGenerate.addAndGet(1); - queueWork(chunkPos, DetailDistanceUtil.getDistanceGenerationMode(detailLevel), lodBuilder, lodDim, serverWorld); + queueWork(chunkPos, mode, lodBuilder, lodDim, serverWorld); } } } - catch (Exception e) + catch (RuntimeException e) { // this shouldn't ever happen, but just in case e.printStackTrace(); @@ -201,7 +206,7 @@ public class LodWorldGenerator } }); - if (VERSION_CONSTANTS.isWorldGeneratorSingleThreaded(CONFIG.client().worldGenerator().getDistanceGenerationMode())) + if (VERSION_CONSTANTS.isWorldGeneratorSingleThreaded(mode)) { generatorFunc.run(); } diff --git a/src/main/java/com/seibel/lod/core/util/DetailDistanceUtil.java b/src/main/java/com/seibel/lod/core/util/DetailDistanceUtil.java index 3976a46c7..cc5340e44 100644 --- a/src/main/java/com/seibel/lod/core/util/DetailDistanceUtil.java +++ b/src/main/java/com/seibel/lod/core/util/DetailDistanceUtil.java @@ -19,7 +19,6 @@ package com.seibel.lod.core.util; -import com.seibel.lod.core.enums.config.DistanceGenerationMode; import com.seibel.lod.core.enums.config.HorizontalQuality; import com.seibel.lod.core.enums.config.HorizontalResolution; import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton; @@ -134,10 +133,14 @@ public class DetailDistanceUtil return baseInverseFunction((int) (distance * treeGenMultiplier), minGenDetail, true); } + + // NOTE: The recent LodWorldGenerator changes assumes that this value doesn't change with 'detail'. + // If this is changed, LodWorldGenerator needs to be fixed! + /* public static DistanceGenerationMode getDistanceGenerationMode(int detail) { return CONFIG.client().worldGenerator().getDistanceGenerationMode(); - } + }*/ public static byte getLodDrawDetail(byte detail) { diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/IVersionConstants.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/IVersionConstants.java index 8f5f3f578..1a04b2a62 100644 --- a/src/main/java/com/seibel/lod/core/wrapperInterfaces/IVersionConstants.java +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/IVersionConstants.java @@ -21,4 +21,12 @@ public interface IVersionConstants * False if the generation must be run on Minecraft's server thread. */ boolean isWorldGeneratorSingleThreaded(DistanceGenerationMode distanceGenerationMode); + + /** + * @Returns the number of generations call per thread. + */ + default int getWorldGenerationCountPerThread() { + return 8; + } + }