From af4e30588f05cd751a9e9f0e9230d0a5cf44df4c Mon Sep 17 00:00:00 2001 From: Leonardo Date: Fri, 27 Aug 2021 18:27:37 +0200 Subject: [PATCH] new z fix --- .../seibel/lod/builders/LodBufferBuilder.java | 150 ++---------------- .../com/seibel/lod/objects/LodDimension.java | 5 +- .../com/seibel/lod/objects/LodRegion.java | 15 +- 3 files changed, 24 insertions(+), 146 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index ffad4ae8e..fa3eebd49 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -22,6 +22,7 @@ import java.util.concurrent.*; import java.util.concurrent.locks.ReentrantLock; import com.seibel.lod.objects.DataPoint; +import com.sun.org.apache.xpath.internal.operations.Bool; import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; @@ -158,12 +159,16 @@ public class LodBufferBuilder // =====================// // RENDERING PART // // =====================// - Object[][] nodeToRenderMatrix = new Object[lodDim.regions.length][lodDim.regions.length]; + + ConcurrentMap> nodeToRenderMap = new ConcurrentHashMap(); for (int xRegion = 0; xRegion < lodDim.regions.length; xRegion++) { for (int zRegion = 0; zRegion < lodDim.regions.length; zRegion++) { + final RegionPos regionPosIndex = new RegionPos( + xRegion, + zRegion); RegionPos regionPos = new RegionPos( xRegion + lodDim.getCenterX() - Math.floorDiv(lodDim.getWidth(), 2), zRegion + lodDim.getCenterZ() - Math.floorDiv(lodDim.getWidth(), 2)); @@ -177,145 +182,24 @@ public class LodBufferBuilder return; final int xR = xRegion; final int zR = zRegion; - nodeToRenderMatrix[xR][zR] = new ConcurrentSkipListSet(LevelPos.getComparator()); Callable dataToRenderThread = () -> { - byte detailToRender; - boolean zFix; + SortedSet nodeToRender = new TreeSet(); 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; - nodeToRenderMatrix[xR][zR] = lodDim.getDataToRender( - (ConcurrentSkipListSet) nodeToRenderMatrix[xR][zR], + lodDim.getDataToRender( + nodeToRender, regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), DetailDistanceUtil.getDistanceRendering(detail), DetailDistanceUtil.getDistanceRendering(detail + 1), - 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*/ + detail, + true); } // the thread executed successfully - return true; - };// buffer builder worker thread - - - nodeToRenderThreads.add(dataToRenderThread); - - }// region z - }// region z - - long renderStart = System.currentTimeMillis(); - // wait for all threads to finish - List> futures = bufferBuilderThreads.invokeAll(nodeToRenderThreads); - for (Future future : futures) - { - // the future will be false if its thread failed - if (!future.get()) - { - ClientProxy.LOGGER.warn("LodBufferBuilder ran into trouble and had to start over."); - closeBuffers(); - return; - } - } - 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++) - { - RegionPos regionPos = new RegionPos(xRegion + lodDim.getCenterX() - lodDim.getWidth() / 2, zRegion + lodDim.getCenterZ() - lodDim.getWidth() / 2); - - // local position in the vbo and bufferBuilder arrays - BufferBuilder currentBuffer = buildableBuffers[xRegion][zRegion]; - - // make sure the buffers weren't - // 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; - Callable bufferBuildingThread = () -> - { LevelPos adjPos = new LevelPos(); - for (LevelPos posToRender : (SortedSet) nodeToRenderMatrix[xR][zR]) + for (LevelPos posToRender : nodeToRender) { LevelPos chunkPos = posToRender.getConvertedLevelPos(LodUtil.CHUNK_DETAIL_LEVEL); // skip any chunks that Minecraft is going to render @@ -344,7 +228,6 @@ public class LodBufferBuilder if (!renderer.vanillaRenderedChunks.contains(adjPos.getChunkPos())) adjData[1][z] = lodDim.getData(adjPos); } - LodConfig.CLIENT.lodTemplate.get().template.addLodToBuffer(currentBuffer, playerBlockPos, lodData, adjData, posToRender, renderer.debugging); } @@ -360,14 +243,13 @@ public class LodBufferBuilder };// buffer builder worker thread - builderThreads.add(bufferBuildingThread); + nodeToRenderThreads.add(dataToRenderThread); }// region z }// region z - - long renderBufferStart = System.currentTimeMillis(); + long renderStart = System.currentTimeMillis(); // wait for all threads to finish - List> futuresBuffer = bufferBuilderThreads.invokeAll(builderThreads); + List> futuresBuffer = bufferBuilderThreads.invokeAll(nodeToRenderThreads); for (Future future : futuresBuffer) { // the future will be false if its thread failed @@ -378,7 +260,7 @@ public class LodBufferBuilder return; } } - long renderBufferEnd = System.currentTimeMillis(); + long renderEnd = System.currentTimeMillis(); // finish the buffer building diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index a02625040..5841980ac 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -522,7 +522,7 @@ public class LodDimension * * @return list of nodes */ - public ConcurrentSkipListSet getDataToRender(ConcurrentSkipListSet dataToRender, RegionPos regionPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix) + public void getDataToRender(SortedSet 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 @@ -532,9 +532,6 @@ public class LodDimension } catch (Exception e) { e.printStackTrace(); - }finally - { - return dataToRender; } } diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index 092130a2b..0b983ea17 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -303,21 +303,21 @@ public class LodRegion implements Serializable /** * @return */ - public ConcurrentSkipListSet getDataToRender(ConcurrentSkipListSet dataToRender, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix) + public void getDataToRender(SortedSet dataToRender, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix) { LevelPos levelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, 0, 0); - return getDataToRender(dataToRender, levelPos, playerPosX, playerPosZ, start, end, detailLevel, zFix); + getDataToRender(dataToRender, levelPos, playerPosX, playerPosZ, start, end, detailLevel, zFix); } /** * @return */ - private ConcurrentSkipListSet getDataToRender(ConcurrentSkipListSet dataToRender, LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte targetDetailLevel, boolean zFix) + private void getDataToRender(SortedSet dataToRender, LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte targetDetailLevel, boolean zFix) { if (dataToRender.contains(levelPos)) { - return dataToRender; + return; } @@ -334,13 +334,13 @@ public class LodRegion implements Serializable if (detailLevel == targetDetailLevel + 1 && end <= maxDistance && minDistance <= end && zFix) { - return dataToRender; + return; } //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 dataToRender; + return; //we have reached the target detail level if (targetDetailLevel == detailLevel) @@ -376,7 +376,7 @@ public class LodRegion implements Serializable dataToRender.add(new LevelPos(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size)); } } - return dataToRender; + return; } /** @@ -579,7 +579,6 @@ public class LodRegion implements Serializable return (generationType[levelPos.detailLevel][levelPos.posX][levelPos.posZ] != 0); } catch (Exception e) { - System.out.println(levelPos); e.printStackTrace(); throw e; }