diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 5b0b3f9c3..0ee11a3ed 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -230,7 +230,7 @@ public class LodBufferBuilder // skip any chunks that Minecraft is going to render chunkXdist = posToRender.getChunkPosX() - playerChunkPos.x; chunkZdist = posToRender.getChunkPosZ() - playerChunkPos.z; - if(gameChunkRenderDistance >= Math.abs(chunkXdist) && gameChunkRenderDistance >= Math.abs(chunkZdist)) + if(gameChunkRenderDistance >= Math.abs(chunkXdist) && gameChunkRenderDistance >= Math.abs(chunkZdist) && posToRender.detailLevel <= LodUtil.CHUNK_DETAIL_LEVEL) { if (renderer.vanillaRenderedChunks[chunkXdist + gameChunkRenderDistance + 1][chunkZdist + gameChunkRenderDistance + 1]) { diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java index c57c2e0d5..623c7fd63 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java @@ -180,7 +180,7 @@ public class LodWorldGenerator // playerBlockPosRounded.getX(), // playerBlockPosRounded.getZ()); //circle = DetailDistanceUtil.getDistanceGenerationInverse(maxDistance); - generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(levelPos.detailLevel), DetailDistanceUtil.getLodDetail(levelPos.detailLevel))); + generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(levelPos.detailLevel), DetailDistanceUtil.getLodGenDetail(levelPos.detailLevel))); requesting--; if (requestingFar > 0 && !nodeToGenerateListFar.isEmpty()) { @@ -192,7 +192,7 @@ public class LodWorldGenerator { //maxDistance = levelPos.maxDistance( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ()); //circle = DetailDistanceUtil.getDistanceGenerationInverse(maxDistance); - generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(levelPos.detailLevel), DetailDistanceUtil.getLodDetail(levelPos.detailLevel))); + generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(levelPos.detailLevel), DetailDistanceUtil.getLodGenDetail(levelPos.detailLevel))); requestingFar--; requesting--; } diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index bf00ec13c..ad10a7b99 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -405,7 +405,7 @@ public class LodDimension levelPos.changeParameters(LodUtil.REGION_DETAIL_LEVEL, regionX, regionZ); minDistance = levelPos.minDistance(playerPosX, playerPosZ); detail = DetailDistanceUtil.getDistanceTreeGenInverse(minDistance); - levelToGen = DetailDistanceUtil.getLodDetail(detail).detailLevel; + levelToGen = DetailDistanceUtil.getLodGenDetail(detail).detailLevel; if (region == null || region.getGenerationMode() != generationMode) { //First case, region has to be initialized diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index ffba56c32..4a28be739 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -1,10 +1,7 @@ package com.seibel.lod.objects; import java.io.Serializable; -import java.util.*; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ConcurrentNavigableMap; -import java.util.concurrent.ConcurrentSkipListSet; import com.seibel.lod.builders.LodBuilder; import com.seibel.lod.enums.DistanceGenerationMode; @@ -12,8 +9,6 @@ import com.seibel.lod.objects.LevelPos.LevelPos; import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.util.LodUtil; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; import org.apache.commons.lang3.mutable.MutableBoolean; /** @@ -257,7 +252,7 @@ public class LodRegion implements Serializable } else //now we keep exploring the top right child { - if (DetailDistanceUtil.getLodDetail(childDetailLevel).detailLevel <= (childDetailLevel)) + if (DetailDistanceUtil.getLodGenDetail(childDetailLevel).detailLevel <= (childDetailLevel)) { levelPos.changeParameters(detailLevel, posX, posZ); levelPos.convert(childDetailLevel); @@ -305,7 +300,7 @@ public class LodRegion implements Serializable //This is important to avoid any kind of hole in the rendering int maxDistance = levelPos.maxDistance(playerPosX, playerPosZ, regionPosX, regionPosZ); - byte supposedLevel = DetailDistanceUtil.getDistanceRenderingInverse(maxDistance); + byte supposedLevel = DetailDistanceUtil.getLodDrawDetail(DetailDistanceUtil.getDistanceRenderingInverse(maxDistance)); if (supposedLevel > detailLevel) return; else if (supposedLevel == detailLevel) diff --git a/src/main/java/com/seibel/lod/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java index 0ed4b62f2..94b6cea83 100644 --- a/src/main/java/com/seibel/lod/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/render/LodRenderer.java @@ -23,6 +23,7 @@ import java.nio.FloatBuffer; import java.util.HashSet; import java.util.Iterator; +import com.seibel.lod.util.DetailDistanceUtil; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.NVFogDistance; @@ -780,6 +781,7 @@ public class LodRenderer || mc.options.renderDistance != prevRenderDistance || prevFogDistance != LodConfig.CLIENT.fogDistance.get()) { + DetailDistanceUtil.updateSettings(); fullRegen = true; previousPos.changeParameters((byte) 4, mc.player.xChunk, mc.player.zChunk); prevFogDistance = LodConfig.CLIENT.fogDistance.get(); diff --git a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java index c62b96150..53f310abd 100644 --- a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java +++ b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java @@ -14,7 +14,8 @@ public class DetailDistanceUtil private static double genMultiplier = 1.0; private static double treeGenMultiplier = 1.0; private static double treeCutMultiplier = 1.0; - private static int minDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; + private static int minGenDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; + private static int minDrawDetail = Math.max(LodConfig.CLIENT.maxDrawDetail.get().detailLevel,LodConfig.CLIENT.maxGenerationDetail.get().detailLevel); private static int maxDetail = LodUtil.REGION_DETAIL_LEVEL + 1; private static int minDistance = 0; private static int maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16 * 2; @@ -36,7 +37,8 @@ public class DetailDistanceUtil public static void updateSettings(){ - minDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; + minGenDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; + minDrawDetail = Math.max(LodConfig.CLIENT.maxDrawDetail.get().detailLevel,LodConfig.CLIENT.maxGenerationDetail.get().detailLevel); maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16 * 2; } @@ -44,7 +46,7 @@ public class DetailDistanceUtil { int initial; int distance = 0; - if (detail <= minDetail) + if (detail <= minGenDetail) return minDistance; if (detail == maxDetail) return maxDistance; @@ -73,7 +75,7 @@ public class DetailDistanceUtil return distance; } - public static byte getDistanceRenderingInverse(int distance) + public static byte baseInverse(int distance, int minDetail) { int initial; byte detail = 0; @@ -98,20 +100,25 @@ public class DetailDistanceUtil return (byte) Math.min(detail, LodUtil.REGION_DETAIL_LEVEL); } + public static byte getDistanceRenderingInverse(int distance) + { + return baseInverse(distance, minDrawDetail); + } + public static byte getDistanceGenerationInverse(int distance) { - return getDistanceRenderingInverse((int) (distance * genMultiplier)); + return baseInverse((int) (distance * genMultiplier), minGenDetail); } public static byte getDistanceTreeCutInverse(int distance) { - return getDistanceRenderingInverse((int) (distance * treeCutMultiplier)); + return baseInverse((int) (distance * treeCutMultiplier), minGenDetail); } public static byte getDistanceTreeGenInverse(int distance) { - return getDistanceRenderingInverse((int) (distance * treeGenMultiplier)); + return baseInverse((int) (distance * treeGenMultiplier), minGenDetail); } public static int getDistanceGeneration(int detail) @@ -140,11 +147,16 @@ public class DetailDistanceUtil return LodConfig.CLIENT.distanceGenerationMode.get(); } - public static LodDetail getLodDetail(int detail) + public static byte getLodDrawDetail(int detail) { - if (detail < minDetail) + return (byte) Math.max(detail, minDrawDetail); + } + + public static LodDetail getLodGenDetail(int detail) + { + if (detail < minGenDetail) { - return lodDetails[minDetail]; + return lodDetails[minGenDetail]; } else { return lodDetails[detail]; @@ -154,9 +166,9 @@ public class DetailDistanceUtil public static byte getCutLodDetail(int detail) { - if (detail < minDetail) + if (detail < minGenDetail) { - return lodDetails[minDetail].detailLevel; + return lodDetails[minGenDetail].detailLevel; } else if (detail == maxDetail) { return LodUtil.REGION_DETAIL_LEVEL;