Now nodeToRender is fully automatic
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user