temporary z fix
This commit is contained in:
@@ -17,10 +17,7 @@
|
||||
*/
|
||||
package com.seibel.lod.builders;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.*;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
@@ -167,8 +164,9 @@ public class LodBufferBuilder
|
||||
{
|
||||
for (int zRegion = 0; zRegion < lodDim.regions.length; zRegion++)
|
||||
{
|
||||
nodeToRenderMatrix[xRegion][zRegion] = new ConcurrentSkipListMap<>(LevelPos.getComparator());
|
||||
RegionPos regionPos = new RegionPos(xRegion + lodDim.getCenterX() - lodDim.getWidth() / 2, zRegion + lodDim.getCenterZ() - lodDim.getWidth() / 2);
|
||||
RegionPos regionPos = new RegionPos(
|
||||
xRegion + lodDim.getCenterX() - Math.floorDiv(lodDim.getWidth(), 2),
|
||||
zRegion + lodDim.getCenterZ() - Math.floorDiv(lodDim.getWidth(), 2));
|
||||
|
||||
// local position in the vbo and bufferBuilder arrays
|
||||
BufferBuilder currentBuffer = buildableBuffers[xRegion][zRegion];
|
||||
@@ -177,27 +175,38 @@ public class LodBufferBuilder
|
||||
// changed while we were running this method
|
||||
if (currentBuffer == null || (currentBuffer != null && !currentBuffer.building()))
|
||||
return;
|
||||
|
||||
byte detailLevel = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel;
|
||||
final int xR = xRegion;
|
||||
final int zR = zRegion;
|
||||
nodeToRenderMatrix[xR][zR] = new ConcurrentSkipListSet(LevelPos.getComparator());
|
||||
Callable<Boolean> dataToRenderThread = () ->
|
||||
{
|
||||
byte detailToRender;
|
||||
boolean zFix;
|
||||
|
||||
for (byte detail = detailLevel; detail <= LodUtil.REGION_DETAIL_LEVEL; detail++)
|
||||
for (byte detail = LodUtil.REGION_DETAIL_LEVEL; detail >= LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detail--)
|
||||
{
|
||||
|
||||
detailToRender = (byte) 4;
|
||||
if (detail < detailToRender)
|
||||
{
|
||||
zFix = true;
|
||||
} else
|
||||
{
|
||||
detailToRender = detail;
|
||||
zFix = false;
|
||||
}
|
||||
|
||||
detailToRender = detail;
|
||||
lodDim.getDataToRender(
|
||||
(ConcurrentSkipListMap<LevelPos, List<Integer>>) nodeToRenderMatrix[xR][zR],
|
||||
nodeToRenderMatrix[xR][zR] = lodDim.getDataToRender(
|
||||
(ConcurrentSkipListSet<LevelPos>) nodeToRenderMatrix[xR][zR],
|
||||
regionPos,
|
||||
playerBlockPosRounded.getX(),
|
||||
playerBlockPosRounded.getZ(),
|
||||
DetailDistanceUtil.getDistanceRendering(detail),
|
||||
DetailDistanceUtil.getDistanceRendering(detail + 1),
|
||||
detailToRender,
|
||||
true);
|
||||
DetailDistanceUtil.getLodDetail(detail).detailLevel,
|
||||
zFix);
|
||||
/**DetailDistanceUtil.getLodDetail(detail).detailLevel has to be used otherwise the zfix won't work
|
||||
* i'll fix this in the future*/
|
||||
}
|
||||
// the thread executed successfully
|
||||
return true;
|
||||
@@ -224,6 +233,66 @@ public class LodBufferBuilder
|
||||
}
|
||||
long renderEnd = System.currentTimeMillis();
|
||||
|
||||
|
||||
/**THIS SHOULD AVOID Z-FIGHTING AND BLANK SPOT*/
|
||||
/**TODO it could be improved*/
|
||||
/*
|
||||
ConcurrentNavigableMap<LevelPos, List<List<Integer>>> adjMap = new ConcurrentSkipListMap<>();
|
||||
LevelPos tempPos;
|
||||
LevelPos tempAdj;
|
||||
for (byte tempDetailLevel = LodConfig.CLIENT.maxDrawDetail.get().detailLevel; tempDetailLevel <= LodUtil.REGION_DETAIL_LEVEL; tempDetailLevel++)
|
||||
{
|
||||
for (int xRegion = 0; xRegion < lodDim.regions.length; xRegion++)
|
||||
{
|
||||
for (int zRegion = 0; zRegion < lodDim.regions.length; zRegion++)
|
||||
{
|
||||
byte detailLevel;
|
||||
int posX;
|
||||
int posZ;
|
||||
boolean contain;
|
||||
SortedSet<LevelPos> set = (SortedSet<LevelPos>) nodeToRenderMatrix[xRegion][zRegion];
|
||||
while (detailLevel != set.first().detailLevel)
|
||||
{
|
||||
tempPos = set.first();
|
||||
detailLevel = tempPos.detailLevel;
|
||||
posX = tempPos.posX;
|
||||
posZ = tempPos.posZ;
|
||||
contain = false;
|
||||
/**First step, check if there is any bigger block in same position*/
|
||||
/*
|
||||
for (byte higherLevel = (byte) (detailLevel + 1); higherLevel <= LodUtil.REGION_DETAIL_LEVEL; higherLevel++)
|
||||
{
|
||||
tempPos.convert(higherLevel);
|
||||
if (set.contains(tempPos)){
|
||||
contain = true;
|
||||
}
|
||||
}
|
||||
if(!contain)
|
||||
adjMap.put(tempPos,null);
|
||||
else
|
||||
set.remove(tempPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
((SortedSet<LevelPos>) nodeToRenderMatrix[xRegion][zRegion])
|
||||
LevelPos adjLevelPos;
|
||||
for(LevelPos levelPos : adjMap.keySet()){
|
||||
if(adjMap.get(levelPos) == null){
|
||||
for (int x : new int[]{0, 1})
|
||||
{
|
||||
adjLevelPos.changeParameters(posToRender.detailLevel, posToRender.posX + x * 2 - 1, posToRender.posZ);
|
||||
if (!renderer.vanillaRenderedChunks.contains(adjPos.getChunkPos()))
|
||||
adjData[0][x] = lodDim.getData(adjLevelPos);
|
||||
}
|
||||
|
||||
for (int z : new int[]{0, 1})
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
for (int xRegion = 0; xRegion < lodDim.regions.length; xRegion++)
|
||||
{
|
||||
for (int zRegion = 0; zRegion < lodDim.regions.length; zRegion++)
|
||||
@@ -246,7 +315,7 @@ public class LodBufferBuilder
|
||||
Callable<Boolean> bufferBuildingThread = () ->
|
||||
{
|
||||
LevelPos adjPos = new LevelPos();
|
||||
for (LevelPos posToRender : ((ConcurrentSkipListMap<LevelPos, List<Integer>>) nodeToRenderMatrix[xR][zR]).keySet())
|
||||
for (LevelPos posToRender : (SortedSet<LevelPos>) nodeToRenderMatrix[xR][zR])
|
||||
{
|
||||
LevelPos chunkPos = posToRender.getConvertedLevelPos(LodUtil.CHUNK_DETAIL_LEVEL);
|
||||
// skip any chunks that Minecraft is going to render
|
||||
|
||||
@@ -381,7 +381,6 @@ public class LodDimension
|
||||
int regionZ;
|
||||
LodRegion region;
|
||||
LevelPos levelPos = new LevelPos();
|
||||
List<Callable<Boolean>> genThreads = new ArrayList<>();
|
||||
for (int x = 0; x < regions.length; x++)
|
||||
{
|
||||
for (int z = 0; z < regions.length; z++)
|
||||
@@ -496,7 +495,7 @@ public class LodDimension
|
||||
if (end >= regionLevelPos.minDistance(playerPosX, playerPosZ) &&
|
||||
start <= regionLevelPos.maxDistance(playerPosX, playerPosZ))
|
||||
{
|
||||
region = getRegion(new LevelPos(LodUtil.REGION_DETAIL_LEVEL, regionPos.x, regionPos.z).getConvertedLevelPos(detailLevel));
|
||||
region = getRegion(regionPos);
|
||||
listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, start, end, generation, detailLevel, dataNumber));
|
||||
}
|
||||
} catch (Exception e)
|
||||
@@ -523,20 +522,19 @@ public class LodDimension
|
||||
*
|
||||
* @return list of nodes
|
||||
*/
|
||||
public void getDataToRender(ConcurrentNavigableMap<LevelPos, List<Integer>> dataToRender, RegionPos regionPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix)
|
||||
public ConcurrentSkipListSet<LevelPos> getDataToRender(ConcurrentSkipListSet<LevelPos> dataToRender, RegionPos regionPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix)
|
||||
{
|
||||
LevelPos regionLevelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, regionPos.x, regionPos.z);
|
||||
try
|
||||
{
|
||||
if (end >= regionLevelPos.minDistance(playerPosX, playerPosZ) &&
|
||||
start <= regionLevelPos.maxDistance(playerPosX, playerPosZ))
|
||||
{
|
||||
LodRegion region = getRegion(new LevelPos(LodUtil.REGION_DETAIL_LEVEL, regionPos.x, regionPos.z).getConvertedLevelPos(detailLevel));
|
||||
region.getDataToRender(dataToRender, playerPosX, playerPosZ, start, end, detailLevel, zFix);
|
||||
}
|
||||
LodRegion region = getRegion(regionPos);
|
||||
region.getDataToRender(dataToRender, playerPosX, playerPosZ, start, end, detailLevel, zFix);
|
||||
} catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}finally
|
||||
{
|
||||
return dataToRender;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -719,7 +717,7 @@ public class LodDimension
|
||||
public void setRegionWidth(int newWidth)
|
||||
{
|
||||
width = newWidth;
|
||||
halfWidth = (int) Math.floor(width / 2);
|
||||
halfWidth = (int) Math.floorDiv(width, 2);
|
||||
|
||||
regions = new LodRegion[width][width];
|
||||
isRegionDirty = new boolean[width][width];
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.seibel.lod.objects;
|
||||
import java.io.Serializable;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentNavigableMap;
|
||||
import java.util.concurrent.ConcurrentSkipListSet;
|
||||
|
||||
import com.seibel.lod.builders.LodBuilder;
|
||||
import com.seibel.lod.enums.DistanceGenerationMode;
|
||||
@@ -302,21 +303,26 @@ public class LodRegion implements Serializable
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public void getDataToRender(ConcurrentNavigableMap<LevelPos, List<Integer>> dataToRender, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix)
|
||||
public ConcurrentSkipListSet<LevelPos> getDataToRender(ConcurrentSkipListSet<LevelPos> dataToRender, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix)
|
||||
{
|
||||
LevelPos levelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, 0, 0);
|
||||
getDataToRender(dataToRender, levelPos, playerPosX, playerPosZ, start, end, detailLevel, zFix);
|
||||
return getDataToRender(dataToRender, levelPos, playerPosX, playerPosZ, start, end, detailLevel, zFix);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
private void getDataToRender(ConcurrentNavigableMap<LevelPos, List<Integer>> dataToRender, LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte targetDetailLevel, boolean zFix)
|
||||
private ConcurrentSkipListSet<LevelPos> getDataToRender(ConcurrentSkipListSet<LevelPos> dataToRender, LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte targetDetailLevel, boolean zFix)
|
||||
{
|
||||
|
||||
int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel);
|
||||
if (dataToRender.contains(levelPos))
|
||||
{
|
||||
return dataToRender;
|
||||
}
|
||||
|
||||
|
||||
int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel);
|
||||
|
||||
int posX = levelPos.posX;
|
||||
int posZ = levelPos.posZ;
|
||||
byte detailLevel = levelPos.detailLevel;
|
||||
@@ -326,22 +332,20 @@ public class LodRegion implements Serializable
|
||||
int maxDistance = levelPos.maxDistance(playerPosX, playerPosZ, regionPosX, regionPosZ);
|
||||
int minDistance = levelPos.minDistance(playerPosX, playerPosZ, regionPosX, regionPosZ);
|
||||
|
||||
//To avoid z fighting: if the pos is touching the end radius at detailLevel + 1 then we stop
|
||||
//cause this area will be occupied by bigger block
|
||||
if (detailLevel == targetDetailLevel + 1 && end <= maxDistance && minDistance <= end && zFix)
|
||||
{
|
||||
return;
|
||||
return dataToRender;
|
||||
}
|
||||
//To avoid z fighting: if the pos is touching the end radius at detailLevel + 1 then we stop
|
||||
//cause this area will be occupied by bigger block
|
||||
|
||||
if (!(start <= maxDistance && minDistance < end) || detailLevel < targetDetailLevel)
|
||||
{
|
||||
return;
|
||||
}
|
||||
return dataToRender;
|
||||
|
||||
//we have reached the target detail level
|
||||
if (targetDetailLevel == detailLevel)
|
||||
{
|
||||
dataToRender.put(new LevelPos(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size), new ArrayList<>());
|
||||
dataToRender.add(new LevelPos(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size));
|
||||
} else
|
||||
{
|
||||
int childPosX = posX * 2;
|
||||
@@ -369,10 +373,10 @@ public class LodRegion implements Serializable
|
||||
}
|
||||
} else
|
||||
{
|
||||
dataToRender.put(new LevelPos(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size), new ArrayList<>());
|
||||
dataToRender.add(new LevelPos(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size));
|
||||
}
|
||||
}
|
||||
return;
|
||||
return dataToRender;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -160,7 +160,7 @@ public class ClientProxy
|
||||
LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.FULL);
|
||||
|
||||
LodConfig.CLIENT.fogDistance.set(FogDistance.FAR);
|
||||
LodConfig.CLIENT.fogDrawOverride.set(FogDrawOverride.ALWAYS_DRAW_FOG_FANCY);
|
||||
LodConfig.CLIENT.fogDrawOverride.set(FogDrawOverride.NEVER_DRAW_FOG);
|
||||
LodConfig.CLIENT.shadingMode.set(ShadingMode.DARKEN_SIDES);
|
||||
LodConfig.CLIENT.brightnessMultiplier.set(1.0);
|
||||
LodConfig.CLIENT.saturationMultiplier.set(1.0);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.seibel.lod.util;
|
||||
|
||||
import com.seibel.lod.enums.DistanceGenerationMode;
|
||||
import com.seibel.lod.enums.LodCorner;
|
||||
import com.seibel.lod.enums.LodDetail;
|
||||
import com.seibel.lod.handlers.LodConfig;
|
||||
import net.minecraft.client.Minecraft;
|
||||
@@ -13,32 +14,9 @@ public class DetailDistanceUtil
|
||||
private static int minDetail = 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;
|
||||
private static int maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16 * 2;
|
||||
|
||||
|
||||
private static DistanceGenerationMode[] distancesGenerators = {
|
||||
DistanceGenerationMode.SURFACE,
|
||||
DistanceGenerationMode.SURFACE,
|
||||
DistanceGenerationMode.SURFACE,
|
||||
DistanceGenerationMode.SURFACE,
|
||||
DistanceGenerationMode.SURFACE,
|
||||
DistanceGenerationMode.SURFACE,
|
||||
DistanceGenerationMode.SURFACE,
|
||||
DistanceGenerationMode.SURFACE,
|
||||
DistanceGenerationMode.SURFACE,
|
||||
DistanceGenerationMode.SURFACE};
|
||||
|
||||
/*private static DistanceGenerationMode[] distancesGenerators = {
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT,
|
||||
DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT};*/
|
||||
|
||||
private static LodDetail[] lodDetails = {
|
||||
LodDetail.FULL,
|
||||
@@ -53,19 +31,6 @@ public class DetailDistanceUtil
|
||||
LodDetail.SINGLE,
|
||||
LodDetail.SINGLE};
|
||||
|
||||
private static LodDetail[] lodDetailsCut = {
|
||||
LodDetail.FULL,
|
||||
LodDetail.HALF,
|
||||
LodDetail.QUAD,
|
||||
LodDetail.DOUBLE,
|
||||
LodDetail.SINGLE,
|
||||
LodDetail.SINGLE,
|
||||
LodDetail.SINGLE,
|
||||
LodDetail.SINGLE,
|
||||
LodDetail.SINGLE,
|
||||
LodDetail.SINGLE,
|
||||
LodDetail.SINGLE};
|
||||
|
||||
public static int getDistanceRendering(int detail)
|
||||
{
|
||||
int initial;
|
||||
@@ -73,9 +38,9 @@ public class DetailDistanceUtil
|
||||
if (detail <= minDetail)
|
||||
return minDistance;
|
||||
if (detail == maxDetail)
|
||||
return maxDistance * 2;
|
||||
return maxDistance;
|
||||
if (detail == maxDetail + 1)
|
||||
return maxDistance * 3;
|
||||
return maxDistance;
|
||||
switch (LodConfig.CLIENT.lodDistanceCalculatorType.get())
|
||||
{
|
||||
case LINEAR:
|
||||
@@ -122,7 +87,7 @@ public class DetailDistanceUtil
|
||||
|
||||
public static DistanceGenerationMode getDistanceGenerationMode(int detail)
|
||||
{
|
||||
return distancesGenerators[detail];
|
||||
return LodConfig.CLIENT.distanceGenerationMode.get();
|
||||
}
|
||||
|
||||
public static LodDetail getLodDetail(int detail)
|
||||
@@ -141,13 +106,13 @@ public class DetailDistanceUtil
|
||||
{
|
||||
if (detail < minDetail)
|
||||
{
|
||||
return lodDetailsCut[minDetail].detailLevel;
|
||||
return lodDetails[minDetail].detailLevel;
|
||||
} else if (detail == maxDetail)
|
||||
{
|
||||
return LodUtil.REGION_DETAIL_LEVEL;
|
||||
} else
|
||||
{
|
||||
return lodDetailsCut[detail].detailLevel;
|
||||
return lodDetails[detail].detailLevel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user