Max draw detail now works correctly and node bigger than a chunk do not disappear if you touch a border

This commit is contained in:
Leonardo
2021-09-01 18:11:01 +02:00
parent 32e587d536
commit 91ba48ad4a
6 changed files with 32 additions and 23 deletions
@@ -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])
{
@@ -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--;
}
@@ -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
@@ -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)
@@ -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();
@@ -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;