From 01b9a3f3b045004721fffc5b892e51793e3ef960 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Mon, 20 Sep 2021 11:35:20 +0200 Subject: [PATCH] Fixed culling --- .../seibel/lod/builders/LodBufferBuilder.java | 69 +++++++++---------- .../seibel/lod/builders/lodTemplates/Box.java | 32 ++++++--- 2 files changed, 57 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 392a3f173..582a17d3e 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -294,48 +294,45 @@ public class LodBufferBuilder } // skip any chunks that Minecraft is going to render - try + for (Direction direction : Box.ADJ_DIRECTIONS) { - for (Direction direction : Box.ADJ_DIRECTIONS) - { - xAdj = posX + direction.getNormal().getX(); - zAdj = posZ + direction.getNormal().getZ(); - chunkXdist = LevelPosUtil.getChunkPos(detailLevel, xAdj) - playerChunkPos.x; - chunkZdist = LevelPosUtil.getChunkPos(detailLevel, zAdj) - playerChunkPos.z; - boolean performFaceCulling = false; - if (performFaceCulling - && posToRender.contains(detailLevel, xAdj, zAdj) - && (gameChunkRenderDistance < Math.abs(chunkXdist) + xAdj = posX + direction.getNormal().getX(); + zAdj = posZ + direction.getNormal().getZ(); + chunkXdist = LevelPosUtil.getChunkPos(detailLevel, xAdj) - playerChunkPos.x; + chunkZdist = LevelPosUtil.getChunkPos(detailLevel, zAdj) - playerChunkPos.z; + boolean performFaceCulling = true; + if (performFaceCulling + && posToRender.contains(detailLevel, xAdj, zAdj) + /*&& (gameChunkRenderDistance < Math.abs(chunkXdist) || gameChunkRenderDistance < Math.abs(chunkZdist) - || !vanillaRenderedChunks[chunkXdist + gameChunkRenderDistance + 1][chunkZdist + gameChunkRenderDistance + 1])) - { - if (!adjData.containsKey(direction) || adjData.get(direction)==null) - adjData.put(direction, new long[maxVerticalData]); - for (int verticalIndex = 0; verticalIndex < lodDim.getMaxVerticalData(detailLevel, xAdj, zAdj); verticalIndex++) - adjData.get(direction)[verticalIndex] = lodDim.getData(detailLevel, xAdj, zAdj, verticalIndex); - } else - { - adjData.put(direction, null); - } - } - - long data; - for (int verticalIndex = 0; verticalIndex < lodDim.getMaxVerticalData(detailLevel, posX, posZ); verticalIndex++) + || !vanillaRenderedChunks[chunkXdist + gameChunkRenderDistance + 1][chunkZdist + gameChunkRenderDistance + 1])*/) { - data = lodDim.getData(detailLevel, posX, posZ, verticalIndex); - if (DataPointUtil.isItVoid(data) || !DataPointUtil.doesItExist(data)) - break; - LodConfig.CLIENT.graphics.lodTemplate.get().template.addLodToBuffer(currentBuffer, playerBlockPosRounded, data, adjData, - detailLevel, posX, posZ, boxCache[xR][zR], renderer.previousDebugMode, renderer.lightMap); + if (!adjData.containsKey(direction) || adjData.get(direction) == null) + adjData.put(direction, new long[maxVerticalData]); + for (int verticalIndex = 0; verticalIndex < lodDim.getMaxVerticalData(detailLevel, xAdj, zAdj); verticalIndex++) + { + long data = lodDim.getData(detailLevel, xAdj, zAdj, verticalIndex); + if(!DataPointUtil.isItVoid(data) && DataPointUtil.doesItExist(data)) + System.out.println(DataPointUtil.toString(data)); + adjData.get(direction)[verticalIndex] = data; + } + } else + { + adjData.put(direction, null); } - - - } catch (ArrayIndexOutOfBoundsException e) - { - e.printStackTrace(); - return false; } + long data; + for (int verticalIndex = 0; verticalIndex < lodDim.getMaxVerticalData(detailLevel, posX, posZ); verticalIndex++) + { + data = lodDim.getData(detailLevel, posX, posZ, verticalIndex); + if (DataPointUtil.isItVoid(data) || !DataPointUtil.doesItExist(data)) + break; + LodConfig.CLIENT.graphics.lodTemplate.get().template.addLodToBuffer(currentBuffer, playerBlockPosRounded, data, adjData, + detailLevel, posX, posZ, boxCache[xR][zR], renderer.previousDebugMode, renderer.lightMap); + } + + } // for pos to in list to render // the thread executed successfully return true; diff --git a/src/main/java/com/seibel/lod/builders/lodTemplates/Box.java b/src/main/java/com/seibel/lod/builders/lodTemplates/Box.java index 46840a8db..c301cfbb2 100644 --- a/src/main/java/com/seibel/lod/builders/lodTemplates/Box.java +++ b/src/main/java/com/seibel/lod/builders/lodTemplates/Box.java @@ -7,11 +7,14 @@ import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DebugMode; import com.seibel.lod.util.ColorUtil; import com.seibel.lod.util.DataPointUtil; +import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.wrappers.MinecraftWrapper; import net.minecraft.util.Direction; import net.minecraft.util.math.vector.Vector3d; +import javax.xml.crypto.Data; + public class Box { @@ -100,6 +103,7 @@ public class Box }}; public int[][] box; + public long[] order; public Map colorMap; public int color; public Map adjHeightAndDepth; @@ -109,7 +113,7 @@ public class Box public Box() { box = new int[2][3]; - //order = new long[32]; + order = new long[DetailDistanceUtil.getMaxVerticalData(0)]; colorMap = new HashMap() {{ put(Direction.UP, new int[1]); @@ -172,6 +176,8 @@ public class Box colorMap.get(direction)[0] = 0; } + for(int i = 0; i < order.length; i++) + order[i] = DataPointUtil.EMPTY_DATA; for (Direction direction : ADJ_DIRECTIONS) { if(isCulled(direction)){ @@ -234,27 +240,37 @@ public class Box //We order the adj list /**TODO remove this if the order is maintained naturally*/ - /* order[0] = 0; + int count = 0; for (int i = 0; i < dataPoint.length; i++) { int j = i - 1; - while (j >= 0 && DataPointUtil.getHeight(order[j]) > DataPointUtil.getHeight(dataPoint[i])) { + if(DataPointUtil.isItVoid(dataPoint[i]) || !DataPointUtil.doesItExist(dataPoint[i])) + { + continue; + } + while (j >= 0 && DataPointUtil.getHeight(order[j]) < DataPointUtil.getHeight(dataPoint[i])) + { order[j + 1] = order[j]; j = j - 1; } order[j + 1] = dataPoint[i]; - }*/ + count++; + } int i; int faceToDraw = 0; boolean firstFace = true; boolean toFinish = false; - for (i = dataPoint.length - 1; i >= 0; i--) + /*for (i = dataPoint.length - 1; i >= 0; i--) { - long singleDataPoint = dataPoint[i]; - height = DataPointUtil.getHeight(singleDataPoint); - depth = DataPointUtil.getDepth(singleDataPoint); + long singleDataPoint = dataPoint[i];*/ + long singleAdjDataPoint; + for (i = 0; i < count; i++) + { + singleAdjDataPoint = order[i]; + height = DataPointUtil.getHeight(singleAdjDataPoint); + depth = DataPointUtil.getDepth(singleAdjDataPoint); if (depth > maxY) {//the adj data is higher than the current data