diff --git a/api/src/main/java/com/seibel/lod/api/enums/config/EOverdrawPrevention.java b/api/src/main/java/com/seibel/lod/api/enums/config/EOverdrawPrevention.java
new file mode 100644
index 000000000..49b7326a2
--- /dev/null
+++ b/api/src/main/java/com/seibel/lod/api/enums/config/EOverdrawPrevention.java
@@ -0,0 +1,39 @@
+/*
+ * This file is part of the Distant Horizons mod (formerly the LOD Mod),
+ * licensed under the GNU LGPL v3 License.
+ *
+ * Copyright (C) 2020-2022 James Seibel
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.seibel.lod.api.enums.config;
+
+/**
+ * NONE
+ * LIGHT
+ * MEDIUM
+ * HEAVY
+ */
+public enum EOverdrawPrevention
+{
+ // Reminder:
+ // when adding items up the API minor version
+ // when removing items up the API major version
+
+ NONE,
+ LIGHT,
+ MEDIUM,
+ HEAVY;
+
+}
diff --git a/core/src/main/java/com/seibel/lod/core/api/external/methods/config/client/DhApiGraphicsConfig.java b/core/src/main/java/com/seibel/lod/core/api/external/methods/config/client/DhApiGraphicsConfig.java
index 6abc59fd2..95afd0601 100644
--- a/core/src/main/java/com/seibel/lod/core/api/external/methods/config/client/DhApiGraphicsConfig.java
+++ b/core/src/main/java/com/seibel/lod/core/api/external/methods/config/client/DhApiGraphicsConfig.java
@@ -24,7 +24,6 @@ import com.seibel.lod.api.interfaces.config.IDhApiConfigValue;
import com.seibel.lod.api.interfaces.config.client.IDhApiGraphicsConfig;
import com.seibel.lod.api.objects.config.DhApiConfigValue;
import com.seibel.lod.coreapi.util.converters.RenderModeEnabledConverter;
-import com.seibel.lod.core.config.Config;
import com.seibel.lod.api.enums.rendering.ERendererMode;
import com.seibel.lod.core.config.Config.Client.Advanced.Graphics.Quality;
import com.seibel.lod.core.config.Config.Client.Advanced.Debugging;
@@ -94,7 +93,7 @@ public class DhApiGraphicsConfig implements IDhApiGraphicsConfig
@Override
public IDhApiConfigValue getUseExtendedNearClipPlane()
- { return new DhApiConfigValue<>(AdvancedGraphics.useExtendedNearClipPlane); }
+ { return new DhApiConfigValue<>(AdvancedGraphics.overdrawPrevention); }
@Override
public IDhApiConfigValue getBrightnessMultiplier()
diff --git a/core/src/main/java/com/seibel/lod/core/config/Config.java b/core/src/main/java/com/seibel/lod/core/config/Config.java
index e7aa5f769..932d6be87 100644
--- a/core/src/main/java/com/seibel/lod/core/config/Config.java
+++ b/core/src/main/java/com/seibel/lod/core/config/Config.java
@@ -497,12 +497,18 @@ public class Config
// + "Disable this if you see LODs disappearing at the corners of your vision.")
// .build();
- // TODO replace with better options
- public static ConfigEntry useExtendedNearClipPlane = new ConfigEntry.Builder()
- .set(true)
+ public static ConfigEntry overdrawPrevention = new ConfigEntry.Builder()
+ .set(EOverdrawPrevention.MEDIUM)
.comment(""
- + "Will prevent some overdraw issues, but may cause nearby fake chunks to render incorrectly \n"
- + " especially when in/near an ocean.")
+ + "Determines how far Distant Horizon's near clip plane will render. \n"
+ + "\n"
+ + "Higher values will prevent LODs from rendering behind vanilla blocks at a higher distance,\n"
+ + "but may cause holes to appear in the LODs. \n"
+ + "Holes are most likely at the left and right edges of the screen \n"
+ + "when flying through unloaded terrain. \n"
+ + "\n"
+ + "Increasing the vanilla render distance increases the effectiveness of these options."
+ + "")
.setPerformance(EConfigEntryPerformance.NONE)
.build();
@@ -526,7 +532,6 @@ public class Config
+ "2 = very saturated")
.build();
- // TODO replace with better options
public static ConfigEntry enableCaveCulling = new ConfigEntry.Builder()
.set(true)
.comment(""
diff --git a/core/src/main/java/com/seibel/lod/core/util/RenderUtil.java b/core/src/main/java/com/seibel/lod/core/util/RenderUtil.java
index dc57e8a4a..05ef287f8 100644
--- a/core/src/main/java/com/seibel/lod/core/util/RenderUtil.java
+++ b/core/src/main/java/com/seibel/lod/core/util/RenderUtil.java
@@ -19,6 +19,7 @@
package com.seibel.lod.core.util;
+import com.seibel.lod.api.enums.config.EOverdrawPrevention;
import com.seibel.lod.core.level.IDhClientLevel;
import com.seibel.lod.core.world.IDhClientWorld;
import com.seibel.lod.core.api.internal.SharedApi;
@@ -176,20 +177,48 @@ public class RenderUtil
public static float getNearClipPlaneDistanceInBlocks(float partialTicks)
{
- int vanillaBlockRenderedDistance = MC_RENDER.getRenderDistance() * LodUtil.CHUNK_WIDTH;
+ int chunkRenderDistance = MC_RENDER.getRenderDistance();
+ if (chunkRenderDistance % 2 == 0)
+ {
+ chunkRenderDistance += 1;
+ }
+
+ int vanillaBlockRenderedDistance = chunkRenderDistance * LodUtil.CHUNK_WIDTH;
+ vanillaBlockRenderedDistance *= 2;
float nearClipPlane;
if (Config.Client.Advanced.Debugging.lodOnlyMode.get())
{
nearClipPlane = 0.1f;
}
- else if (Config.Client.Advanced.Graphics.AdvancedGraphics.useExtendedNearClipPlane.get())
+ else
{
- nearClipPlane = Math.min(vanillaBlockRenderedDistance - LodUtil.CHUNK_WIDTH, (float) 8 * LodUtil.CHUNK_WIDTH); // allow a max near clip plane of 8 chunks
- }
- else
- {
- nearClipPlane = 16f;
+ // TODO make this option dependent on player speed.
+ // if the player is flying quickly, lower the near clip plane to account for slow chunk loading.
+ // If the player is moving quickly they are less likely to notice overdraw.
+
+ EOverdrawPrevention clipPlaneDistance = Config.Client.Advanced.Graphics.AdvancedGraphics.overdrawPrevention.get();
+ switch (clipPlaneDistance)
+ {
+ default: // shouldn't be necessary, just here to make the compiler happy
+ case NONE:
+ nearClipPlane = 0.1f;
+ break;
+
+ case LIGHT:
+ nearClipPlane = vanillaBlockRenderedDistance * 0.25f;
+ break;
+
+ case MEDIUM:
+ nearClipPlane = vanillaBlockRenderedDistance * 0.4f;
+ break;
+
+
+ case HEAVY:
+ // recommend render distance ot 6 or higher, otherwise holes may appear
+ nearClipPlane = vanillaBlockRenderedDistance * 0.6f;
+ break;
+ }
}
// modify the based on the player's FOV
diff --git a/core/src/main/resources/assets/lod/lang/en_us.json b/core/src/main/resources/assets/lod/lang/en_us.json
index 43934928e..596436670 100644
--- a/core/src/main/resources/assets/lod/lang/en_us.json
+++ b/core/src/main/resources/assets/lod/lang/en_us.json
@@ -225,9 +225,9 @@
"lod.config.client.advanced.graphics.advancedGraphics":
"Advanced Graphics Options",
- "lod.config.client.advanced.graphics.advancedGraphics.useExtendedNearClipPlane":
- "Use extended near clip plane",
- "lod.config.client.advanced.graphics.advancedGraphics.useExtendedNearClipPlane.@tooltip":
+ "lod.config.client.advanced.graphics.advancedGraphics.overdrawPrevention":
+ "Overdraw Prevention",
+ "lod.config.client.advanced.graphics.advancedGraphics.overdrawPrevention.@tooltip":
"Enabling this will prevent some overdraw issues,\nbut may cause nearby LODs to render incorrectly, especially when near fancy leaves or non-full blocks.\nLess noticeable with a longer vanilla render distance.",
"lod.config.client.advanced.graphics.advancedGraphics.brightnessMultiplier":
"Brightness Multiplier",
@@ -598,6 +598,15 @@
"lod.config.enum.EBlocksToAvoid.NON_COLLIDING":
"Non-Colliding",
+ "lod.config.enum.EOverdrawPrevention.NONE":
+ "None",
+ "lod.config.enum.EOverdrawPrevention.LIGHT":
+ "Light",
+ "lod.config.enum.EOverdrawPrevention.MEDIUM":
+ "Medium",
+ "lod.config.enum.EOverdrawPrevention.HEAVY":
+ "Heavy",
+
"lod.config.enum.EServerFolderNameMode.NAME_ONLY":
"Name Only",
"lod.config.enum.EServerFolderNameMode.NAME_IP":