diff --git a/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java b/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java index 933e88e49..a1b3d0416 100644 --- a/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java +++ b/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java @@ -568,17 +568,15 @@ public class LodDimension // use FAR_FIRST on local worlds and NEAR_FIRST on servers GenerationPriority generationPriority = CONFIG.client().worldGenerator().getGenerationPriority(); if (generationPriority == GenerationPriority.AUTO) - generationPriority = MC.hasSinglePlayerServer() ? GenerationPriority.FAR_FIRST : GenerationPriority.NEAR_FIRST; + generationPriority = MC.hasSinglePlayerServer() ? GenerationPriority.FAR_FIRST : GenerationPriority.BALANCED; DropoffQuality dropoffQuality = CONFIG.client().graphics().quality().getDropoffQuality(); if (dropoffQuality == DropoffQuality.AUTO) dropoffQuality = CONFIG.client().graphics().quality().getLodChunkRenderDistance() < 128 ? DropoffQuality.SMOOTH_DROPOFF : DropoffQuality.PERFORMANCE_FOCUSED; - boolean requireCorrectDetailLevel = generationPriority == GenerationPriority.NEAR_FIRST; - if (region != null) - region.getPosToRender(posToRender, playerPosX, playerPosZ, requireCorrectDetailLevel, dropoffQuality); + region.getPosToRender(posToRender, playerPosX, playerPosZ, generationPriority, dropoffQuality); } /** diff --git a/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java b/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java index bc250484d..85830f493 100644 --- a/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java +++ b/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java @@ -238,6 +238,7 @@ public class LodRegion { byte targetDetailLevel = DetailDistanceUtil.getDetailLevelFromDistance(minDistance); int farModeSwitchLevel = (priority == GenerationPriority.NEAR_FIRST) ? -1 : calculateFarModeSwitch(targetDetailLevel); + if (priority == GenerationPriority.FAR_FIRST) farModeSwitchLevel = 8; boolean doesDataExist = doesDataExist(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size, testerGenMode); boolean isFarModeSwitchEdge = needFarPos && detailLevel <= farModeSwitchLevel; @@ -274,16 +275,18 @@ public class LodRegion { * understand */ public void getPosToRender(PosToRenderContainer posToRender, int playerPosX, int playerPosZ, - boolean requireCorrectDetailLevel, DropoffQuality dropoffQuality) { + GenerationPriority priority, DropoffQuality dropoffQuality) { int minDistance = LevelPosUtil.minDistance(LodUtil.REGION_DETAIL_LEVEL, regionPosX, regionPosZ, playerPosX, playerPosZ); byte targetLevel = DetailDistanceUtil.getDetailLevelFromDistance(minDistance); - // FarModeSwitchLevel or above is the level where a giant block of lod is not acceptable even if not all child data exist. - byte farModeSwitchLevel = requireCorrectDetailLevel ? 0 : calculateFarModeSwitch(targetLevel); - if (requireCorrectDetailLevel) farModeSwitchLevel = 0; if (targetLevel <= dropoffQuality.fastModeSwitch) { getPosToRender(posToRender, LodUtil.REGION_DETAIL_LEVEL, 0, 0, playerPosX, playerPosZ, - requireCorrectDetailLevel); + priority); } else { + // FarModeSwitchLevel or above is the level where a giant block of lod is not acceptable even if not all child data exist. + int maxDistance = LevelPosUtil.maxDistance(LodUtil.REGION_DETAIL_LEVEL, regionPosX, regionPosZ, playerPosX, playerPosZ); + byte farModeSwitchLevel = (priority == GenerationPriority.NEAR_FIRST) ? 0 : + calculateFarModeSwitch(DetailDistanceUtil.getDetailLevelFromDistance(maxDistance)); + if (priority == GenerationPriority.FAR_FIRST) farModeSwitchLevel = 8; getPosToRenderFlat(posToRender, LodUtil.REGION_DETAIL_LEVEL, 0, 0, targetLevel, farModeSwitchLevel); } } @@ -297,7 +300,7 @@ public class LodRegion { * out part of it */ private void getPosToRender(PosToRenderContainer posToRender, byte detailLevel, int offsetPosX, int offsetPosZ, int playerPosX, - int playerPosZ, boolean requireCorrectDetailLevel) { + int playerPosZ, GenerationPriority priority) { // equivalent to 2^(...) int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); @@ -305,7 +308,8 @@ public class LodRegion { int minDistance = LevelPosUtil.minDistance(detailLevel, offsetPosX + regionPosX*size, offsetPosZ + regionPosZ*size, playerPosX, playerPosZ); byte minLevel = DetailDistanceUtil.getDetailLevelFromDistance(minDistance); // FarModeSwitchLevel or above is the level where a giant block of lod is not acceptable even if not all child data exist. - byte farModeSwitchLevel = requireCorrectDetailLevel ? 0 : calculateFarModeSwitch(minLevel); + byte farModeSwitchLevel = (priority == GenerationPriority.NEAR_FIRST) ? 0 : calculateFarModeSwitch(minLevel); + if (priority == GenerationPriority.FAR_FIRST) farModeSwitchLevel = 8; if (detailLevel <= minLevel) { posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size); @@ -321,7 +325,7 @@ public class LodRegion { for (int z = 0; z <= 1; z++) { if (doesDataExist(childDetailLevel, childPosX + x, childPosZ + z, DistanceGenerationMode.NONE)) { getPosToRender(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, playerPosX, - playerPosZ, requireCorrectDetailLevel); + playerPosZ, priority); } } } @@ -340,7 +344,7 @@ public class LodRegion { for (int x = 0; x <= 1; x++) for (int z = 0; z <= 1; z++) getPosToRender(posToRender, childDetailLevel, offsetPosX*2 + x, offsetPosZ*2 + z, playerPosX, - playerPosZ, requireCorrectDetailLevel); + playerPosZ, priority); } else { posToRender.addPosToRender(detailLevel, offsetPosX + regionPosX * size, offsetPosZ + regionPosZ * size); } diff --git a/src/main/resources/assets/lod/lang/en_us.json b/src/main/resources/assets/lod/lang/en_us.json index 8dbd5ca30..f150c1efb 100644 --- a/src/main/resources/assets/lod/lang/en_us.json +++ b/src/main/resources/assets/lod/lang/en_us.json @@ -113,6 +113,7 @@ "DistantHorizons.config.enum.VanillaOverdraw.BORDER": "Border", "DistantHorizons.config.enum.GenerationPriority.AUTO": "Auto", "DistantHorizons.config.enum.GenerationPriority.NEAR_FIRST": "Near first", + "DistantHorizons.config.enum.GenerationPriority.BALANCED": "Balanced", "DistantHorizons.config.enum.GenerationPriority.FAR_FIRST": "Far first", "DistantHorizons.config.enum.DistanceGenerationMode.NONE": "None", "DistantHorizons.config.enum.DistanceGenerationMode.BIOME_ONLY": "Biome only",