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) {