diff --git a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java
index e300f245d..88005eff7 100644
--- a/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java
+++ b/src/main/java/com/seibel/lod/builders/LodNodeBufferBuilder.java
@@ -150,6 +150,9 @@ public class LodNodeBufferBuilder
int minChunkDist = Integer.MAX_VALUE;
ChunkPos playerChunkPos = new ChunkPos((int)playerX / LodUtil.CHUNK_WIDTH, (int)playerZ / LodUtil.CHUNK_WIDTH);
+ // numbChunksWide / 2 = radius
+ // * 16 = to block coordinates
+ int maxDistance = (numbChunksWide / 2) * 16;
// generate our new buildable buffers
buildableNearBuffer.begin(GL11.GL_QUADS, LodNodeRenderer.LOD_VERTEX_FORMAT);
@@ -165,7 +168,8 @@ public class LodNodeBufferBuilder
// skip any chunks that Minecraft is going to render
if (isCoordInCenterArea(i, j, (numbChunksWide / 2))
- && renderer.vanillaRenderedChunks.contains(new ChunkPos(chunkX, chunkZ))) {
+ && renderer.vanillaRenderedChunks.contains(new ChunkPos(chunkX, chunkZ)))
+ {
continue;
}
@@ -272,30 +276,10 @@ public class LodNodeBufferBuilder
currentBuffer = buildableFarBuffer;
- // what detail level should this LOD be drawn at?
- int distance = (int) Math.sqrt(Math.pow((mc.player.getX() - lod.startBlockPos.getX()),2) + Math.pow((mc.player.getZ() - lod.startBlockPos.getZ()),2));
- LodDetail detail;
+ // determine detail level should this LOD be drawn at
+ int distance = (int) Math.sqrt(Math.pow((mc.player.getX() - lod.center.getX()),2) + Math.pow((mc.player.getZ() - lod.center.getZ()),2));
+ LodDetail detail = LodDetail.getDetailForDistance(LodConfig.CLIENT.maxDrawDetail.get(), distance, maxDistance);
- if(distance < (numbChunksWide / 2) * 16 * 0.2)
- {
- detail = LodDetail.FULL;
- }
- else if(distance < (numbChunksWide / 2) * 16 * 0.4)
- {
- detail = LodDetail.HALF;
- }
- else if(distance < (numbChunksWide / 2) * 16 * 0.6)
- {
- detail = LodDetail.QUAD;
- }
- else if(distance < (numbChunksWide / 2) * 16 * 0.8)
- {
- detail = LodDetail.DOUBLE;
- }
- else
- {
- detail = LodDetail.SINGLE;
- }
// get the desired LodTemplate and
// add this LOD to the buffer
diff --git a/src/main/java/com/seibel/lod/enums/LodDetail.java b/src/main/java/com/seibel/lod/enums/LodDetail.java
index d0da70d06..136f18ac4 100644
--- a/src/main/java/com/seibel/lod/enums/LodDetail.java
+++ b/src/main/java/com/seibel/lod/enums/LodDetail.java
@@ -17,13 +17,17 @@
*/
package com.seibel.lod.enums;
+import java.util.ArrayList;
+import java.util.Collections;
+
import com.seibel.lod.objects.LodDataPoint;
+import com.seibel.lod.util.LodUtil;
/**
* single, double, quad, half, full
*
* @author James Seibel
- * @version 8-10-2021
+ * @version 8-11-2021
*/
public enum LodDetail
{
@@ -48,7 +52,8 @@ public enum LodDetail
public final int dataPointLengthCount;
/** How wide each LOD DataPoint is */
public final int dataPointWidth;
- /** This is the same as detailLevel in LodQuadTreeNode */
+ /** This is the same as detailLevel in LodQuadTreeNode,
+ * lowest is 0 highest is 9 */
public final int detailLevel;
/* Start/End X/Z give the block positions
@@ -63,6 +68,15 @@ public enum LodDetail
* when creating a LodChunk with this detail level */
public final int lodChunkStringDelimiterCount;
+ /**
+ * 1st dimension: LodDetail.detailLevel
+ * 2nd dimension: An array of all LodDetails that are less than or
+ * equal to that detailLevel
+ */
+ private static LodDetail[][] lowerDetailArrays;
+
+
+
private LodDetail(int newLengthCount, int newDetailLevel)
{
@@ -96,4 +110,57 @@ public enum LodDetail
lodChunkStringDelimiterCount = 2 + (dataPointLengthCount * dataPointLengthCount * LodDataPoint.NUMBER_OF_DELIMITERS);
}// constructor
+
+
+
+
+
+
+ /**
+ * Returns an array of all LodDetails that have a detail level
+ * that is less than or equal to the given LodDetail
+ */
+ public static LodDetail[] getSelfAndLowerDetails(LodDetail detail)
+ {
+ if (lowerDetailArrays == null)
+ {
+ // run first time setup
+ lowerDetailArrays = new LodDetail[LodDetail.values().length][];
+
+ // go through each LodDetail
+ for(LodDetail currentDetail : LodDetail.values())
+ {
+ ArrayList lowerDetails = new ArrayList<>();
+
+ // find the details lower than currentDetail
+ for(LodDetail compareDetail : LodDetail.values())
+ {
+ if (currentDetail.detailLevel <= compareDetail.detailLevel)
+ {
+ lowerDetails.add(compareDetail);
+ }
+ }
+
+ // have the highest detail item first in the list
+ Collections.sort(lowerDetails);
+ Collections.reverse(lowerDetails);
+
+ lowerDetailArrays[currentDetail.detailLevel] = lowerDetails.toArray(new LodDetail[lowerDetails.size()]);
+ }
+ }
+
+ return lowerDetailArrays[detail.detailLevel];
+ }
+
+ /** Returns what detail level should be used at a given distance and maxDistance. */
+ public static LodDetail getDetailForDistance(LodDetail maxDetailLevel, int distance, int maxDistance)
+ {
+ LodDetail[] lowerDetails = getSelfAndLowerDetails(maxDetailLevel);
+ int distaneBetweenDetails = maxDistance / lowerDetails.length;
+ int index = LodUtil.clamp(0, distance / distaneBetweenDetails, lowerDetails.length - 1);
+
+ return lowerDetails[index];
+
+ }
+
}
diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java
index 2362fbb2b..d63a10055 100644
--- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java
+++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java
@@ -48,17 +48,12 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
* and is the starting point for most of this program.
*
* @author James_Seibel
- * @version 8-8-2021
+ * @version 8-11-2021
*/
public class ClientProxy
{
public static final Logger LOGGER = LogManager.getLogger("LOD");
-// private static LodWorld lodWorld = new LodWorld();
-// private static LodChunkBuilder lodChunkBuilder = new LodChunkBuilder();
-// private static LodBufferBuilder lodBufferBuilder = new LodBufferBuilder(lodChunkBuilder);
-// private static LodRenderer renderer = new LodRenderer(lodBufferBuilder);
-
private static LodQuadTreeWorld lodWorld = new LodQuadTreeWorld();
private static LodNodeBuilder lodNodeBuilder = new LodNodeBuilder();
private static LodNodeBufferBuilder lodBufferBuilder = new LodNodeBufferBuilder(lodNodeBuilder);
@@ -157,8 +152,8 @@ public class ClientProxy
// LodConfig.CLIENT.drawLODs.set(true);
// LodConfig.CLIENT.debugMode.set(false);
- LodConfig.CLIENT.maxDrawDetail.set(LodDetail.QUAD);
- LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.QUAD);
+ LodConfig.CLIENT.maxDrawDetail.set(LodDetail.FULL);
+ LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.FULL);
LodConfig.CLIENT.lodChunkRadiusMultiplier.set(12);
LodConfig.CLIENT.fogDistance.set(FogDistance.FAR);