From 8db782a40660bb85a1f557d9b70d6e864d6d4b37 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Fri, 27 Aug 2021 23:05:37 +0200 Subject: [PATCH] Now nodeToRender is fully automatic --- .../seibel/lod/builders/LodBufferBuilder.java | 21 ++----- .../com/seibel/lod/objects/LodDimension.java | 4 +- .../com/seibel/lod/objects/LodRegion.java | 33 +++-------- .../com/seibel/lod/proxy/ClientProxy.java | 2 +- .../com/seibel/lod/render/LodRenderer.java | 2 +- .../seibel/lod/util/DetailDistanceUtil.java | 57 ++++++++++++++++--- 6 files changed, 68 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index eee49d018..9452aa8c1 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -116,7 +116,7 @@ public class LodBufferBuilder * swapped with the drawable buffers in the LodRenderer to be drawn. */ public void generateLodBuffersAsync(LodRenderer renderer, LodDimension lodDim, - BlockPos playerBlockPos, int numbChunksWide) + BlockPos playerBlockPos, int xAngle, int yAngle, int numbChunksWide) { // only allow one generation process to happen at a time if (generatingBuffers) @@ -174,20 +174,11 @@ public class LodBufferBuilder Callable dataToRenderThread = () -> { SortedSet nodeToRender = new TreeSet(); - for (byte detail = LodUtil.REGION_DETAIL_LEVEL; detail >= LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detail--) - { - lodDim.getDataToRender( - nodeToRender, - regionPos, - playerBlockPosRounded.getX(), - playerBlockPosRounded.getZ(), - DetailDistanceUtil.getDistanceRendering(detail), - DetailDistanceUtil.getDistanceRendering(detail + 1), - detail, - true); - if(regionPos.x == 0 && regionPos.z == 0) - System.out.println(nodeToRender); - } + lodDim.getDataToRender( + nodeToRender, + regionPos, + playerBlockPosRounded.getX(), + playerBlockPosRounded.getZ()); LevelPos adjPos = new LevelPos(); for (LevelPos posToRender : nodeToRender) diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 5841980ac..c4ea3ba88 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -522,13 +522,13 @@ public class LodDimension * * @return list of nodes */ - public void getDataToRender(SortedSet 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) { LevelPos regionLevelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, regionPos.x, regionPos.z); try { LodRegion region = getRegion(regionPos); - region.getDataToRender(dataToRender, playerPosX, playerPosZ, start, end, detailLevel, zFix); + region.getDataToRender(dataToRender, playerPosX, playerPosZ); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index 0b983ea17..a07b79c46 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -8,6 +8,7 @@ import java.util.concurrent.ConcurrentSkipListSet; import com.seibel.lod.builders.LodBuilder; import com.seibel.lod.enums.DistanceGenerationMode; 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; @@ -303,24 +304,17 @@ public class LodRegion implements Serializable /** * @return */ - public void getDataToRender(SortedSet dataToRender, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix) + public void getDataToRender(SortedSet dataToRender, int playerPosX, int playerPosZ) { LevelPos levelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, 0, 0); - getDataToRender(dataToRender, levelPos, playerPosX, playerPosZ, start, end, detailLevel, zFix); + getDataToRender(dataToRender, levelPos, playerPosX, playerPosZ); } /** * @return */ - private void getDataToRender(SortedSet 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) { - - if (dataToRender.contains(levelPos)) - { - return; - } - - int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel); int posX = levelPos.posX; @@ -330,23 +324,14 @@ public class LodRegion implements Serializable //here i calculate the the LevelPos is in range //This is important to avoid any kind of hole in the rendering int maxDistance = levelPos.maxDistance(playerPosX, playerPosZ, regionPosX, regionPosZ); - int minDistance = levelPos.minDistance(playerPosX, playerPosZ, regionPosX, regionPosZ); - if (detailLevel == targetDetailLevel + 1 && end <= maxDistance && minDistance <= end && zFix) - { + byte supposedLevel = DetailDistanceUtil.getDistanceRenderingInverse(maxDistance); + if (supposedLevel > detailLevel) 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; - - //we have reached the target detail level - if (targetDetailLevel == detailLevel) + else if (supposedLevel == detailLevel) { dataToRender.add(new LevelPos(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size)); - } else + } else //case where (detailLevel > supposedLevel) { int childPosX = posX * 2; int childPosZ = posZ * 2; @@ -368,7 +353,7 @@ public class LodRegion implements Serializable for (int z = 0; z <= 1; z++) { levelPos.changeParameters((byte) (detailLevel - 1), childPosX + x, childPosZ + z); - getDataToRender(dataToRender, levelPos, playerPosX, playerPosZ, start, end, targetDetailLevel, zFix); + getDataToRender(dataToRender, levelPos, playerPosX, playerPosZ); } } } else diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index b36a87d30..8809cd937 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.NEVER_DRAW_FOG); + LodConfig.CLIENT.fogDrawOverride.set(FogDrawOverride.ALWAYS_DRAW_FOG_FANCY); 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/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java index b773d5c78..22375940b 100644 --- a/src/main/java/com/seibel/lod/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/render/LodRenderer.java @@ -253,7 +253,7 @@ public class LodRenderer if (regen && !lodBufferBuilder.generatingBuffers && !lodBufferBuilder.newBuffersAvaliable()) { // generate the LODs on a separate thread to prevent stuttering or freezing - lodBufferBuilder.generateLodBuffersAsync(this, lodDim, player.blockPosition(), numbChunksWide); + lodBufferBuilder.generateLodBuffersAsync(this, lodDim, player.blockPosition(), Math.floorMod((int) player.xRot,360), Math.floorMod((int) player.yRot,360), numbChunksWide); // the regen process has been started, // it will be done when lodBufferBuilder.newBuffersAvaliable diff --git a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java index dac87045a..9936e6505 100644 --- a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java +++ b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java @@ -1,22 +1,27 @@ package com.seibel.lod.util; +import com.ibm.icu.util.IslamicCalendar; +import com.seibel.lod.enums.DistanceCalculatorType; 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 com.seibel.lod.objects.RegionPos; import net.minecraft.client.Minecraft; public class DetailDistanceUtil { - private static double genMultiplier = 1.25; - private static double treeGenMultiplier = 1.5; - private static double treeCutMultiplier = 1.25; - private static int minDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; + 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 minDetail = LodDetail.FULL.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; - - + //private static int maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16 * 2; + private static int maxDistance = 128 * 16 * 2; + private static int base = 2; + private static double logBase = Math.log(2); private static LodDetail[] lodDetails = { LodDetail.FULL, @@ -48,7 +53,7 @@ public class DetailDistanceUtil return (detail * initial); case QUADRATIC: initial = LodConfig.CLIENT.lodQuality.get() * 128; - return (int) (Math.pow(2, detail) * initial); + return (int) (Math.pow(base, detail) * initial); case RENDER_DEPENDANT: int realRenderDistance = Minecraft.getInstance().options.renderDistance * 16; int border = 64; @@ -64,6 +69,31 @@ public class DetailDistanceUtil return distance; } + public static byte getDistanceRenderingInverse(int distance) + { + int initial; + byte detail = 0; + if (distance == 0) + detail = (byte) minDetail; + if (distance > maxDistance) + detail = (byte) (maxDetail-1); + switch (LodConfig.CLIENT.lodDistanceCalculatorType.get()) + { + case LINEAR: + initial = LodConfig.CLIENT.lodQuality.get() * 128; + detail = (byte) Math.floorDiv(distance, initial); + break; + case QUADRATIC: + initial = LodConfig.CLIENT.lodQuality.get() * 128; + detail = (byte) (Math.log(Math.floorDiv(distance, initial))/logBase); + break; + case RENDER_DEPENDANT: + detail = (byte) 9; + break; + } + return (byte) Math.min(detail, LodUtil.REGION_DETAIL_LEVEL); + } + public static int getDistanceGeneration(int detail) { if (detail == maxDetail) @@ -115,4 +145,15 @@ public class DetailDistanceUtil return lodDetails[detail].detailLevel; } } + + + public static boolean regionInView(int playerPosX, int playerPosY, int playerPosZ, int alpha, int beta, int fov, RegionPos regionPos) + { + + //System.out.println(Math.floorMod((int) mc.player.xRot,360) + " " + Math.floorMod((int) mc.player.yRot,360) + " " + mc.options.fov); + //System.out.println(mc.player.xRotO + " " + mc.player.yRotO); + //mc.options.fov; + return false; + } + }