Added different generation detail option

This commit is contained in:
Leonardo
2021-08-22 19:54:10 +02:00
parent d5112be385
commit 31cb684bec
7 changed files with 28 additions and 26 deletions
@@ -210,7 +210,7 @@ public class LodBufferBuilder
if (currentBuffer == null || (currentBuffer != null && !currentBuffer.building()))
return;
for (byte detail = LodUtil.BLOCK_DETAIL_LEVEL; detail <= LodUtil.REGION_DETAIL_LEVEL; detail++)
for (byte detail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detail <= LodUtil.REGION_DETAIL_LEVEL; detail++)
{
posListToRender.addAll(lodDim.getDataToRender(
regionPos,
@@ -290,7 +290,7 @@ public class LodBufferBuilder
int requesting = maxChunkGenRequests;
//we firstly make sure that the world is filled with half region wide block
for (byte detailGen = LodUtil.BLOCK_DETAIL_LEVEL; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++)
for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++)
{
if (requesting == 0) break;
posListToGenerate.addAll(lodDim.getDataToGenerate(
@@ -305,7 +305,7 @@ public class LodBufferBuilder
}
//we then fill the world with the rest of the block
for (byte detailGen = LodUtil.BLOCK_DETAIL_LEVEL; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++)
for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++)
{
if (requesting == 0) break;
posListToGenerate.addAll(lodDim.getDataToGenerate(
@@ -314,7 +314,7 @@ public class LodBufferBuilder
DetailUtil.getDistanceGeneration(detailGen),
DetailUtil.getDistanceGeneration(detailGen + 1),
LodConfig.CLIENT.distanceGenerationMode.get().complexity,
(byte) 0,
LodConfig.CLIENT.maxGenerationDetail.get().detailLevel,
maxChunkGenRequests));
requesting = maxChunkGenRequests - posListToGenerate.size();
}
@@ -409,7 +409,7 @@ public class LodBufferBuilder
positionWaitingToBeGenerated.add(chunkPos);
numberOfChunksWaitingToGenerate.addAndGet(1);
LodNodeGenWorker genWorker = new LodNodeGenWorker(chunkPos, LodConfig.CLIENT.distanceGenerationMode.get(), LodDetail.FULL, renderer, LodQuadTreeNodeBuilder, this, lodDim, serverWorld);
LodNodeGenWorker genWorker = new LodNodeGenWorker(chunkPos, LodConfig.CLIENT.distanceGenerationMode.get(), LodConfig.CLIENT.maxGenerationDetail.get(), renderer, LodQuadTreeNodeBuilder, this, lodDim, serverWorld);
WorldWorkerManager.addWorker(genWorker);
}
}
@@ -23,6 +23,7 @@ import java.util.concurrent.Executors;
import com.seibel.lod.enums.DistanceGenerationMode;
import com.seibel.lod.enums.LodDetail;
import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.objects.LevelPos;
import com.seibel.lod.objects.LodDataPoint;
import com.seibel.lod.objects.LodDimension;
@@ -106,7 +107,7 @@ public class LodBuilder
lodDim = lodWorld.getLodDimension(dim);
}
generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode), LodDetail.FULL);
generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode), LodConfig.CLIENT.maxGenerationDetail.get());
} catch (IllegalArgumentException | NullPointerException e)
{
e.printStackTrace();
@@ -177,7 +178,7 @@ public class LodBuilder
chunk.getPos().x * 16 + startX,
chunk.getPos().z * 16 + startZ);
data = new LodDataPoint(height, depth, color);
lodDim.addData(levelPos.convert((byte) detail.detailLevel),
lodDim.addData(levelPos.convert(detail.detailLevel),
data,
config.distanceGenerationMode,
true,
@@ -54,7 +54,7 @@ public enum LodDetail
public final int dataPointWidth;
/** This is the same as detailLevel in LodQuadTreeNode,
* lowest is 0 highest is 9 */
public final int detailLevel;
public final byte detailLevel;
/* Start/End X/Z give the block positions
* for each individual dataPoint in a LodChunk */
@@ -80,7 +80,7 @@ public enum LodDetail
private LodDetail(int newLengthCount, int newDetailLevel)
{
detailLevel = newDetailLevel;
detailLevel = (byte) newDetailLevel;
dataPointLengthCount = newLengthCount;
dataPointWidth = 16 / dataPointLengthCount;
@@ -317,7 +317,7 @@ public class LodDimensionFileHandler
fw.write(LOD_FILE_VERSION_PREFIX + " " + LOD_SAVE_FILE_VERSION + "\n");
// add each LodChunk to the file
fw.write(region.getLevel((byte) 0).toString());
fw.write(region.getLevel(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel).toString());
fw.close();
// overwrite the old file with the new one
@@ -353,7 +353,7 @@ public class LodDimensionFileHandler
// ".\Super Flat\DIM-1\data"
// or
// ".\Super Flat\data"
return dimensionDataSaveFolder.getCanonicalPath() + File.separatorChar +
return dimensionDataSaveFolder.getCanonicalPath() + File.separatorChar + LodConfig.CLIENT.maxGenerationDetail.get().detailLevel + File.separatorChar +
FILE_NAME_PREFIX + "." + regionX + "." + regionZ + FILE_EXTENSION;
}
catch (IOException | SecurityException e)
@@ -26,6 +26,7 @@ import java.util.Map;
import java.util.stream.Collectors;
import com.seibel.lod.enums.DistanceGenerationMode;
import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.handlers.LodDimensionFileHandler;
import com.seibel.lod.proxy.ClientProxy;
import com.seibel.lod.util.LodUtil;
@@ -244,7 +245,7 @@ public class LodDimension
if (regions[xIndex][zIndex] == null)
{
/**TODO the value is currently 0 but should be determinated by the distance of the player)*/
regions[xIndex][zIndex] = new LodRegion((byte) 0, regionPos);
regions[xIndex][zIndex] = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos);
}
}
@@ -291,7 +292,7 @@ public class LodDimension
if (region == null)
{
// if no region exists, create it
region = new LodRegion((byte) 0, regionPos);
region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos);
addOrOverwriteRegion(region);
}
}
@@ -319,7 +320,7 @@ public class LodDimension
if (region == null)
{
// if no region exists, create it
region = new LodRegion((byte) 0, regionPos);
region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos);
addOrOverwriteRegion(region);
}
boolean nodeAdded = region.setData(levelPos, lodDataPoint, generationMode.complexity, true);
@@ -379,7 +380,7 @@ public class LodDimension
region = getRegion(regionPos);
if (region == null)
{
region = new LodRegion((byte) 0, regionPos);
region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos);
addOrOverwriteRegion(region);
}
listOfData.addAll(region.getDataToGenerate(playerPosX, playerPosZ, start, end, generation, detailLevel, dataNumber));
@@ -421,7 +422,7 @@ public class LodDimension
region = getRegion(regionPos);
if (region == null)
{
region = new LodRegion((byte) 0, regionPos);
region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos);
addOrOverwriteRegion(region);
} else
{
@@ -445,7 +446,7 @@ public class LodDimension
{
try
{
region = new LodRegion((byte) 0, regionPos);
region = new LodRegion(LodConfig.CLIENT.maxGenerationDetail.get().detailLevel, regionPos);
addOrOverwriteRegion(region);
}
catch (ArrayIndexOutOfBoundsException e)
@@ -139,10 +139,10 @@ public class ClientProxy
// LodConfig.CLIENT.drawLODs.set(true);
LodConfig.CLIENT.debugMode.set(false);
LodConfig.CLIENT.maxDrawDetail.set(LodDetail.FULL);
LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.FULL);
LodConfig.CLIENT.maxDrawDetail.set(LodDetail.SINGLE);
LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.SINGLE);
LodConfig.CLIENT.fogDistance.set(FogDistance.FAR);
LodConfig.CLIENT.fogDistance.set(FogDistance.NEAR);
LodConfig.CLIENT.fogDrawOverride.set(FogDrawOverride.ALWAYS_DRAW_FOG_FANCY);
LodConfig.CLIENT.shadingMode.set(ShadingMode.DARKEN_SIDES);
// LodConfig.CLIENT.brightnessMultiplier.set(1.0);
@@ -6,6 +6,7 @@ import com.seibel.lod.handlers.LodConfig;
public class DetailUtil
{
private static double genMultiplier = 1.5;
private static final int minDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel;
private static final int maxDetail = LodUtil.REGION_DETAIL_LEVEL + 1;
private static final int minDistance = 0;
private static final int maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16;
@@ -26,18 +27,17 @@ public class DetailUtil
{
int distance = 0;
int initial = LodConfig.CLIENT.lodQuality.get() * 256;
if(detail == minDetail)
return minDistance;
if(detail == maxDetail)
distance = maxDistance;
switch (LodConfig.CLIENT.lodDistanceCalculatorType.get())
{
case LINEAR:
distance = (detail * initial);
break;
case QUADRATIC:
if (detail == 0)
distance = minDistance;
else if(detail == maxDetail)
distance = maxDistance;
else
distance = (int) (Math.pow(2, detail) * initial);
distance = (int) (Math.pow(2, detail) * initial);
break;
}
return distance;