Now nodeToRender is fully automatic

This commit is contained in:
Leonardo
2021-08-27 23:05:37 +02:00
parent dd018f90d3
commit 8db782a406
6 changed files with 68 additions and 51 deletions
@@ -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<Boolean> dataToRenderThread = () ->
{
SortedSet<LevelPos> 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)
@@ -522,13 +522,13 @@ public class LodDimension
*
* @return list of nodes
*/
public void getDataToRender(SortedSet<LevelPos> dataToRender, RegionPos regionPos, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix)
public void getDataToRender(SortedSet<LevelPos> 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();
@@ -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<LevelPos> dataToRender, int playerPosX, int playerPosZ, int start, int end, byte detailLevel, boolean zFix)
public void getDataToRender(SortedSet<LevelPos> 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<LevelPos> dataToRender, LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte targetDetailLevel, boolean zFix)
private void getDataToRender(SortedSet<LevelPos> 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
@@ -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);
@@ -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
@@ -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;
}
}