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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user