diff --git a/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiVerticalQuality.java b/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiVerticalQuality.java
index d11dcb90c..3149174f7 100644
--- a/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiVerticalQuality.java
+++ b/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiVerticalQuality.java
@@ -26,7 +26,9 @@ import com.seibel.distanthorizons.coreapi.util.MathUtil;
* LOW
* MEDIUM
* HIGH
+ * VERY_HIGH
* EXTREME
+ * PIXEL_ART
*
* @author Leonardo Amato
* @version 2024-4-6
@@ -40,7 +42,11 @@ public enum EDhApiVerticalQuality
HIGH( new int[]{16, 8, 4, 3, 3, 3, 3, 3, 3, 3, 1}),
VERY_HIGH( new int[]{32, 16, 8, 4, 4, 3, 3, 3, 3, 3, 1}),
EXTREME( new int[]{64, 32, 8, 4, 4, 3, 3, 3, 3, 3, 1}),
- PIXEL_ART( new int[]{512, 64, 16, 8, 4, 3, 3, 3, 3, 3, 1});
+ PIXEL_ART( new int[]{512, 64, 16, 8, 4, 3, 3, 3, 3, 3, 1}),
+
+ /** This is only intended for use while DH is in development and shouldn't be included in the release build */
+ @Deprecated
+ CUSTOM( new int[0]);
/** represents how many LODs can be rendered in a single vertical slice */
public final int[] maxVerticalData;
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java
index 211a6b59a..3fac2d16c 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java
@@ -193,6 +193,22 @@ public class Config
.addListener(ReloadLodsConfigEventHandler.INSTANCE)
.build();
+ @Deprecated
+ public static ConfigEntry customVerticalQualityCsv = new ConfigEntry.Builder()
+ .set("16,8,4,3,3,3,3,3,3,3,1")
+ .comment(" "
+ + "Each CSV value represents a single horizontal quality drop \n"
+ + "IE: \n"
+ + "- value 1 = detail level 0 \n"
+ + "- value 2 = detail level 1 \n"
+ + "The last value will be used for all subsequent \n"
+ + "detail levels. \n"
+ + "If parsing fails this defaults to 1 (IE ${EDhApiVerticalQuality.HEIGHT_MAP}). \n"
+ + "")
+ .setPerformance(EConfigEntryPerformance.VERY_HIGH)
+ .addListener(ReloadLodsConfigEventHandler.INSTANCE)
+ .build();
+
public static ConfigEntry horizontalQuality = new ConfigEntry.Builder()
.set(EDhApiHorizontalQuality.MEDIUM)
.comment(""
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/eventHandlers/RenderCacheConfigEventHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/config/eventHandlers/RenderCacheConfigEventHandler.java
index 24b613e9b..e4ccd6ca4 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/config/eventHandlers/RenderCacheConfigEventHandler.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/config/eventHandlers/RenderCacheConfigEventHandler.java
@@ -44,6 +44,7 @@ public class RenderCacheConfigEventHandler
// previous values used to check if a watched setting was actually modified
private final ConfigChangeListener horizontalResolutionChangeListener;
private final ConfigChangeListener verticalQualityChangeListener;
+ private final ConfigChangeListener customVerticalQualityChangeListener;
private final ConfigChangeListener transparencyChangeListener;
private final ConfigChangeListener blocksToIgnoreChangeListener;
private final ConfigChangeListener tintWithAvoidedBlocksChangeListener;
@@ -76,6 +77,7 @@ public class RenderCacheConfigEventHandler
{
this.horizontalResolutionChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.maxHorizontalResolution, (newValue) -> this.refreshRenderDataAfterTimeout());
this.verticalQualityChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.verticalQuality, (newValue) -> this.refreshRenderDataAfterTimeout());
+ this.customVerticalQualityChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.customVerticalQualityCsv, (newValue) -> this.refreshRenderDataAfterTimeout());
this.transparencyChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.transparency, (newValue) -> this.refreshRenderDataAfterTimeout());
this.blocksToIgnoreChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.blocksToIgnore, (newValue) -> this.refreshRenderDataAfterTimeout());
this.tintWithAvoidedBlocksChangeListener = new ConfigChangeListener<>(Config.Client.Advanced.Graphics.Quality.tintWithAvoidedBlocks, (newValue) -> this.refreshRenderDataAfterTimeout());
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java
index ba6cb67fe..1aeae45f5 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java
@@ -20,6 +20,7 @@
package com.seibel.distanthorizons.core.dataObjects.transformers;
import com.seibel.distanthorizons.api.enums.config.EDhApiBlocksToAvoid;
+import com.seibel.distanthorizons.api.enums.config.EDhApiVerticalQuality;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dataObjects.fullData.FullDataPointIdMap;
import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2;
@@ -39,10 +40,12 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrappe
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.distanthorizons.coreapi.util.BitShiftUtil;
+import com.seibel.distanthorizons.coreapi.util.MathUtil;
import it.unimi.dsi.fastutil.longs.LongArrayList;
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import org.apache.logging.log4j.Logger;
+import java.text.ParseException;
import java.util.HashSet;
/**
@@ -103,7 +106,35 @@ public class FullDataToRenderDataTransformer
{
final long pos = fullDataSource.getPos();
final byte dataDetail = fullDataSource.getDataDetailLevel();
- final int vertSize = Config.Client.Advanced.Graphics.Quality.verticalQuality.get().calculateMaxVerticalData(fullDataSource.getDataDetailLevel());
+
+ int tempVertSize = 1;
+ if (Config.Client.Advanced.Graphics.Quality.verticalQuality.get() != EDhApiVerticalQuality.CUSTOM)
+ {
+ tempVertSize = Config.Client.Advanced.Graphics.Quality.verticalQuality.get().calculateMaxVerticalData(fullDataSource.getDataDetailLevel());
+ }
+ else
+ {
+ // temporary code while we test additional vertical quality options
+ String verticalQualityCsv = Config.Client.Advanced.Graphics.Quality.customVerticalQualityCsv.get();
+ if (verticalQualityCsv != null)
+ {
+ String[] possibleVerticalValues = verticalQualityCsv.split(",");
+
+ // for detail levels lower than what the enum defines, use the lowest quality item
+ int index = MathUtil.clamp(0, dataDetail, possibleVerticalValues.length - 1);
+ String verticalValueString = possibleVerticalValues[index];
+
+ try
+ {
+ tempVertSize = Integer.parseInt(verticalValueString);
+ }
+ catch (NumberFormatException ignore) { }
+ }
+ }
+ final int vertSize = tempVertSize;
+
+
+
final ColumnRenderSource columnSource = ColumnRenderSource.getPooledRenderSource(pos, vertSize, level.getMinY(), true);
if (fullDataSource.isEmpty)
{