Fixed a small loading bug,

made the getDataToGenerate fully automatic, added an option to update the DetailDistanceUtil values
This commit is contained in:
Leonardo
2021-08-28 10:38:44 +02:00
parent 49cdd5702f
commit d8bd4e2347
6 changed files with 84 additions and 90 deletions
@@ -104,9 +104,6 @@ public class LodWorldGenerator
// generation
int minChunkDist = Integer.MAX_VALUE;
List<LevelPos> levelPosListToGen;
List<GenerationRequest> generationRequestList = new ArrayList<>();
ArrayList<GenerationRequest> chunksToGen = new ArrayList<>(maxChunkGenRequests);
// if we don't have a full number of chunks to generate in chunksToGen
// we can top it off from this reserve
@@ -116,72 +113,67 @@ public class LodWorldGenerator
int requesting = maxChunkGenRequests;
/** TODO can give a totally different generation */
/*
* for (byte detail = LodUtil.BLOCK_DETAIL_LEVEL; detail <=
* LodUtil.REGION_DETAIL_LEVEL; detail++) { if (!posListToGenerate.isEmpty())
* break; for (byte detailGen = LodUtil.BLOCK_DETAIL_LEVEL; detailGen <=
* LodUtil.REGION_DETAIL_LEVEL; detailGen++) { if (!posListToGenerate.isEmpty())
* break; posListToGenerate.addAll(lodDim.getDataToGenerate(
* playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), (int)
* (distancesLinear[detailGen]*1.5), (int) (distancesLinear[detailGen+1]*1.5),
* (byte) distancesGenerators[detailGen].complexity, detail, 16));
* System.out.println("HERE"); } }
*/
//=======================================//
// create the generation Request objects //
//=======================================//
List<LevelPos> farLevelPosListToGen;
List<LevelPos> nearLevelPosListToGen;
List<GenerationRequest> generationRequestList = new ArrayList<>();
// start by generating half-region sized blocks...
int farRequesting = maxChunkGenRequests / 4;
byte maxDetailFar = (byte) 8;
//we firstly make sure that the world is filled with half region wide block
for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++)
{
if (farRequesting <= 0)
{
break;
}
levelPosListToGen = lodDim.getDataToGenerate(
playerBlockPosRounded.getX(),
playerBlockPosRounded.getZ(),
DetailDistanceUtil.getDistanceGeneration(detailGen),
DetailDistanceUtil.getDistanceGeneration(detailGen + 1),
DetailDistanceUtil.getDistanceGenerationMode(detailGen).complexity,
(byte) 8,
farRequesting);
for (LevelPos levelPos : levelPosListToGen)
{
generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(detailGen), DetailDistanceUtil.getLodDetail(detailGen)));
}
farRequesting = farRequesting - levelPosListToGen.size();
farLevelPosListToGen = lodDim.getDataToGenerate(
playerBlockPosRounded.getX(),
playerBlockPosRounded.getZ(),
DetailDistanceUtil.getDistanceGenerationMode(maxDetailFar).complexity,
maxDetailFar,
farRequesting);
farRequesting = farRequesting - farLevelPosListToGen.size();
}
// ...then once the world is filled with half-region sized blocks
// ...then once the world is filled with big sized blocks
// fill in the rest
int t = generationRequestList.size();
int nearRequesting = maxChunkGenRequests - maxChunkGenRequests / 4 + farRequesting;
//we then fill the world with the rest of the block
for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++)
{
if (nearRequesting <= 0) break;
levelPosListToGen = lodDim.getDataToGenerate(
playerBlockPosRounded.getX(),
playerBlockPosRounded.getZ(),
DetailDistanceUtil.getDistanceGeneration(detailGen),
DetailDistanceUtil.getDistanceGeneration(detailGen + 1),
DetailDistanceUtil.getDistanceGenerationMode(detailGen).complexity,
DetailDistanceUtil.getLodDetail(detailGen).detailLevel,
nearRequesting);
for (LevelPos levelPos : levelPosListToGen)
nearLevelPosListToGen = lodDim.getDataToGenerate(
playerBlockPosRounded.getX(),
playerBlockPosRounded.getZ(),
DetailDistanceUtil.getDistanceGenerationMode(0).complexity,
DetailDistanceUtil.getLodDetail(0).detailLevel,
nearRequesting);
byte minDetail;
int maxDistance;
byte circle;
LevelPos levelPos;
//We alternate the generation between fast and near to make everything more smooth
while(!nearLevelPosListToGen.isEmpty() && !farLevelPosListToGen.isEmpty()){
if(!farLevelPosListToGen.isEmpty())
{
generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(detailGen), DetailDistanceUtil.getLodDetail(detailGen)));
levelPos = farLevelPosListToGen.get(0);
farLevelPosListToGen.remove(0);
minDetail = maxDetailFar;
maxDistance = levelPos.maxDistance(
playerBlockPosRounded.getX(),
playerBlockPosRounded.getZ());
circle = DetailDistanceUtil.getDistanceGenerationInverse(maxDistance, minDetail);
generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(circle), DetailDistanceUtil.getLodDetail(circle)));
}
if(!nearLevelPosListToGen.isEmpty())
{
levelPos = nearLevelPosListToGen.get(0);
nearLevelPosListToGen.remove(0);
minDetail = (byte) 0;
maxDistance = levelPos.maxDistance(
playerBlockPosRounded.getX(),
playerBlockPosRounded.getZ());
circle = DetailDistanceUtil.getDistanceGenerationInverse(maxDistance, minDetail);
generationRequestList.add(new GenerationRequest(levelPos, DetailDistanceUtil.getDistanceGenerationMode(circle), DetailDistanceUtil.getLodDetail(circle)));
}
nearRequesting = nearRequesting - levelPosListToGen.size();
}
@@ -173,7 +173,7 @@ public class LodConfig
lodChunkRenderDistance = builder
.comment("\n\n"
+ " This is the render distance of the mod \n")
.defineInRange("lodChunkRenderDistane", 128, 32, 256);
.defineInRange("lodChunkRenderDistane", 128, 32, 512);
distanceGenerationMode = builder
.comment("\n\n"
@@ -476,7 +476,7 @@ public class LodDimension
*
* @return list of quadTrees
*/
public List<LevelPos> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber)
public List<LevelPos> getDataToGenerate(int playerPosX, int playerPosZ, byte generation, byte detailLevel, int dataNumber)
{
int n = regions.length;
@@ -484,7 +484,6 @@ public class LodDimension
int zIndex;
LodRegion region;
RegionPos regionPos;
LevelPos regionLevelPos = new LevelPos();
List<LevelPos> listOfData = new ArrayList<>();
for (int xRegion = 0; xRegion < n; xRegion++)
{
@@ -495,13 +494,9 @@ public class LodDimension
xIndex = (xRegion + center.x) - halfWidth;
zIndex = (zRegion + center.z) - halfWidth;
regionPos = new RegionPos(xIndex, zIndex);
regionLevelPos.changeParameters(LodUtil.REGION_DETAIL_LEVEL, regionPos.x, regionPos.z);
if (end >= regionLevelPos.minDistance(playerPosX, playerPosZ) &&
start <= regionLevelPos.maxDistance(playerPosX, playerPosZ))
{
region = getRegion(regionPos);
listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, start, end, generation, detailLevel, dataNumber));
}
region = getRegion(regionPos);
listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, generation, detailLevel, dataNumber));
} catch (Exception e)
{
//e.printStackTrace();
@@ -526,7 +521,7 @@ public class LodDimension
*
* @return list of nodes
*/
public void getDataToRender(Set<LevelPos> dataToRender, RegionPos regionPos, int playerPosX, int playerPosZ)
public void getDataToRender(Set<LevelPos> dataToRender, RegionPos regionPos, int playerPosX, int playerPosZ)
{
LevelPos regionLevelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, regionPos.x, regionPos.z);
try
@@ -197,11 +197,11 @@ public class LodRegion implements Serializable
*
* @return
*/
public List<LevelPos> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber)
public List<LevelPos> getDataToGenerate(int playerPosX, int playerPosZ, byte generation, byte detailLevel, int dataNumber)
{
LevelPos levelPos = new LevelPos(LodUtil.REGION_DETAIL_LEVEL, 0, 0);
List<LevelPos> levelPosList = new ArrayList<>();
getDataToGenerate(levelPosList, levelPos, playerPosX, playerPosZ, start, end, generation, detailLevel);
getDataToGenerate(levelPosList, levelPos, playerPosX, playerPosZ, generation, detailLevel);
List<LevelPos> levelMinPosList = new ArrayList<>();
dataNumber = Math.min(dataNumber, levelPosList.size());
@@ -217,30 +217,29 @@ public class LodRegion implements Serializable
}
private void getDataToGenerate(List<LevelPos> levelPosList, LevelPos levelPos, int playerPosX, int playerPosZ, int start, int end, byte generation, byte targetDetailLevel)
private void getDataToGenerate(List<LevelPos> levelPosList, LevelPos levelPos, int playerPosX, int playerPosZ, byte generation, byte targetDetailLevel)
{
int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel);
//here i calculate the the LevelPos is in range
//This is important to avoid any kind of hole in the generation
int maxDistance = levelPos.maxDistance(playerPosX, playerPosZ, regionPosX, regionPosZ);
int minDistance = levelPos.minDistance(playerPosX, playerPosZ, regionPosX, regionPosZ);
if (!(start <= maxDistance && minDistance < end) || levelPos.detailLevel < targetDetailLevel)
{
return;
}
int posX = levelPos.posX;
int posZ = levelPos.posZ;
byte detailLevel = levelPos.detailLevel;
int childPosX = posX * 2;
int childPosZ = posZ * 2;
LevelPos childPos = new LevelPos();
int childSize = 1 << (LodUtil.REGION_DETAIL_LEVEL - levelPos.detailLevel + 1);
//we have reached the target detail level
if (targetDetailLevel == levelPos.detailLevel)
if (DetailDistanceUtil.getDistanceGenerationInverse(maxDistance,targetDetailLevel) > detailLevel)
{
return;
}
else if (DetailDistanceUtil.getDistanceGenerationInverse(maxDistance,targetDetailLevel) == levelPos.detailLevel)
{
if (generationType[detailLevel][posX][posZ] < generation)
{
@@ -275,8 +274,8 @@ public class LodRegion implements Serializable
for (int z = 0; z <= 1; z++)
{
levelPos.changeParameters((byte) (detailLevel - 1), childPosX + x, childPosZ + z);
getDataToGenerate(levelPosList, levelPos
, playerPosX, playerPosZ, start, end, generation, targetDetailLevel);
getDataToGenerate(levelPosList, levelPos,
playerPosX, playerPosZ, generation, targetDetailLevel);
}
}
}
@@ -292,7 +291,7 @@ public class LodRegion implements Serializable
{
if (levelPos.detailLevel != targetDetailLevel)
{
getDataToGenerate(levelPosList, levelPos, playerPosX, playerPosZ, start, end, generation, targetDetailLevel);
getDataToGenerate(levelPosList, levelPos, playerPosX, playerPosZ, generation, targetDetailLevel);
}
}
}
@@ -633,11 +632,6 @@ public class LodRegion implements Serializable
{
if (detailLevel < minDetailLevel)
{
for (byte tempLod = minDetailLevel; tempLod < LodUtil.REGION_DETAIL_LEVEL; tempLod++)
{
int size = (short) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - tempLod);
generationType[tempLod] = new byte[size][size];
}
for (byte tempLod = detailLevel; tempLod < minDetailLevel; tempLod++)
{
int size = (short) Math.pow(2, LodUtil.REGION_DETAIL_LEVEL - tempLod);
@@ -17,6 +17,7 @@
*/
package com.seibel.lod.proxy;
import com.seibel.lod.util.DetailDistanceUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -100,6 +101,7 @@ public class ClientProxy
*/
public void renderLods(float partialTicks)
{
DetailDistanceUtil.updateSettings();
if (mc == null || mc.player == null || !lodWorld.getIsWorldLoaded())
return;
@@ -119,7 +121,7 @@ public class ClientProxy
// comment out when creating a release
applyConfigOverrides();
//applyConfigOverrides();
// Note to self:
@@ -294,6 +296,7 @@ public class ClientProxy
recalculateWidths = false;
//LOGGER.info("new dimension width in regions: " + newWidth + "\t potential: " + newWidth );
}
DetailDistanceUtil.updateSettings();
}
@@ -14,12 +14,10 @@ public class DetailDistanceUtil
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 minDetail = LodConfig.CLIENT.maxGenerationDetail.get().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 = 128 * 16 * 2;
private static int maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16 * 2;
private static int base = 2;
private static double logBase = Math.log(2);
@@ -36,6 +34,12 @@ public class DetailDistanceUtil
LodDetail.SINGLE,
LodDetail.SINGLE};
public static void updateSettings(){
minDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel;
maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16 * 2;
}
public static int getDistanceRendering(int detail)
{
int initial;
@@ -94,6 +98,12 @@ public class DetailDistanceUtil
return (byte) Math.min(detail, LodUtil.REGION_DETAIL_LEVEL);
}
public static byte getDistanceGenerationInverse(int distance, byte minDetailLevel)
{
return (byte) Math.max(getDistanceRenderingInverse((int) (distance * genMultiplier))
,minDetailLevel);
}
public static int getDistanceGeneration(int detail)
{
if (detail == maxDetail)
@@ -147,7 +157,7 @@ public class DetailDistanceUtil
}
public static boolean regionInView(int playerPosX, int playerPosY, int playerPosZ, int alpha, int beta, int fov, RegionPos regionPos)
public static boolean regionInView(int playerPosX, int playerPosY, int playerPosZ, int xRot, int yRot, int fov, RegionPos regionPos)
{
//System.out.println(Math.floorMod((int) mc.player.xRot,360) + " " + Math.floorMod((int) mc.player.yRot,360) + " " + mc.options.fov);