From 2630d50147eada10d8a7ada7303430bb5c62bd38 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Fri, 27 Aug 2021 17:43:17 +0200 Subject: [PATCH] temporary z fix --- .../seibel/lod/builders/LodBufferBuilder.java | 99 ++++++++++++++++--- .../com/seibel/lod/objects/LodDimension.java | 18 ++-- .../com/seibel/lod/objects/LodRegion.java | 30 +++--- .../com/seibel/lod/proxy/ClientProxy.java | 2 +- .../seibel/lod/util/DetailDistanceUtil.java | 49 ++------- 5 files changed, 117 insertions(+), 81 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 58abd84b1..ffad4ae8e 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -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 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>) nodeToRenderMatrix[xR][zR], + nodeToRenderMatrix[xR][zR] = lodDim.getDataToRender( + (ConcurrentSkipListSet) 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>> 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 set = (SortedSet) 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) 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 bufferBuildingThread = () -> { LevelPos adjPos = new LevelPos(); - for (LevelPos posToRender : ((ConcurrentSkipListMap>) nodeToRenderMatrix[xR][zR]).keySet()) + for (LevelPos posToRender : (SortedSet) nodeToRenderMatrix[xR][zR]) { LevelPos chunkPos = posToRender.getConvertedLevelPos(LodUtil.CHUNK_DETAIL_LEVEL); // skip any chunks that Minecraft is going to render diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 344cc4467..a02625040 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -381,7 +381,6 @@ public class LodDimension int regionZ; LodRegion region; LevelPos levelPos = new LevelPos(); - List> 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> dataToRender, RegionPos regionPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix) + public ConcurrentSkipListSet getDataToRender(ConcurrentSkipListSet 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]; diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index 6307106b7..092130a2b 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -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> dataToRender, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix) + public ConcurrentSkipListSet getDataToRender(ConcurrentSkipListSet 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> dataToRender, LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte targetDetailLevel, boolean zFix) + private ConcurrentSkipListSet getDataToRender(ConcurrentSkipListSet 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; } /** diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index 8809cd937..b36a87d30 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -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); diff --git a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java index a94405331..dac87045a 100644 --- a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java +++ b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java @@ -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; } } }