From c81dc83bb188b9c2f7e2dad6ce965d256a9c8475 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 19 May 2026 19:18:04 -0500 Subject: [PATCH] clean up config menu, remove fake transparency --- .../enums/rendering/EDhApiTransparency.java | 18 +- .../config/client/DhApiGraphicsConfig.java | 4 +- .../distanthorizons/core/config/Config.java | 2072 +++++++++-------- .../render/bufferBuilding/ColumnBox.java | 24 +- .../FullDataToRenderDataTransformer.java | 4 +- .../render/QuadTree/LodRenderSection.java | 3 +- .../core/render/renderer/LodRenderer.java | 5 +- .../assets/distanthorizons/lang/en_us.json | 116 +- 8 files changed, 1086 insertions(+), 1160 deletions(-) diff --git a/api/src/main/java/com/seibel/distanthorizons/api/enums/rendering/EDhApiTransparency.java b/api/src/main/java/com/seibel/distanthorizons/api/enums/rendering/EDhApiTransparency.java index 5f6a25539..3f140a6b6 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/enums/rendering/EDhApiTransparency.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/enums/rendering/EDhApiTransparency.java @@ -21,25 +21,13 @@ package com.seibel.distanthorizons.api.enums.rendering; /** * DISABLED,
- * FAKE,
* COMPLETE,
* * @since API 2.0.0 - * @version 2024-4-6 + * @version 2026-05-19 */ public enum EDhApiTransparency { - DISABLED(false, false), - FAKE(true, true), - COMPLETE(true, false); - - public final boolean transparencyEnabled; - public final boolean fakeTransparencyEnabled; - - EDhApiTransparency(boolean transparencyEnabled, boolean fakeTransparencyEnabled) - { - this.transparencyEnabled = transparencyEnabled; - this.fakeTransparencyEnabled = fakeTransparencyEnabled; - } - + DISABLED, + COMPLETE; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiGraphicsConfig.java b/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiGraphicsConfig.java index 71e5f1e13..2cc2363e0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiGraphicsConfig.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiGraphicsConfig.java @@ -91,11 +91,11 @@ public class DhApiGraphicsConfig implements IDhApiGraphicsConfig @Override public IDhApiConfigValue blocksToAvoid() - { return new DhApiConfigValue(Config.Client.Advanced.Graphics.Quality.blocksToIgnore); } + { return new DhApiConfigValue(Config.Client.Advanced.Graphics.Culling.blocksToIgnore); } @Override public IDhApiConfigValue tintWithAvoidedBlocks() - { return new DhApiConfigValue(Config.Client.Advanced.Graphics.Quality.tintWithAvoidedBlocks); } + { return new DhApiConfigValue(Config.Client.Advanced.Graphics.Culling.tintWithAvoidedBlocks); } @Override public IDhApiConfigValue getBiomeBlending() 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 aea2acc82..ed90bc6a7 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 @@ -44,7 +44,6 @@ import java.util.List; * This handles any configuration the user has access to. * * @author coolGi - * * @see ConfigHandler */ @SuppressWarnings("ConcatenationWithEmptyString") @@ -59,43 +58,24 @@ public class Config public static class Client { public static ConfigEntry quickEnableRendering = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If true, Distant Horizons will render LODs beyond the vanilla render distance." - + "") - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .build(); + .set(true) + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .build(); public static ConfigUiLinkedEntry quickLodChunkRenderDistance = new ConfigUiLinkedEntry(Client.Advanced.Graphics.Quality.lodChunkRenderDistanceRadius); public static ConfigEntry qualityPresetSetting = new ConfigEntry.Builder() - .set(EDhApiQualityPreset.MEDIUM) // the default value is set via the listener when accessed - .comment("" - + "Changing this setting will modify a number of different settings that will change the \n" - + "visual fidelity of the rendered LODs.\n" - + "\n" - + "Higher settings will improve the graphical quality while increasing GPU and memory use.\n" - + "") - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(RenderQualityPresetConfigEventHandler.INSTANCE) - .build(); + .set(EDhApiQualityPreset.MEDIUM) // the default value is set via the listener when accessed + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(RenderQualityPresetConfigEventHandler.INSTANCE) + .build(); public static ConfigEntry threadPresetSetting = new ConfigEntry.Builder() - .setChatCommandName("common.threadPreset") - .set(EDhApiThreadPreset.BALANCED) // the default value is set via the listener when accessed - .comment("" - + "Changing this setting will modify a number of different settings that will change \n" - + "the load that Distant Horizons is allowed to put on your CPU. \n" - + "\n" - + "Higher options will improve LOD generation and loading speed, \n" - + "but will increase CPU load and may introduce stuttering.\n" - + "\n" - + "Note: This is a CPU relative setting. \n" - + "It should put an equal amount of strain on a 2 core CPU as a 64 core CPU.\n" - + "") - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(ThreadPresetConfigEventHandler.INSTANCE) - .build(); + .setChatCommandName("common.threadPreset") + .set(EDhApiThreadPreset.BALANCED) // the default value is set via the listener when accessed + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(ThreadPresetConfigEventHandler.INSTANCE) + .build(); public static ConfigUiLinkedEntry quickEnableWorldGenerator = new ConfigUiLinkedEntry(Common.WorldGenerator.enableDistantGeneration); public static ConfigUiLinkedEntry quickEnableServerGeneration = new ConfigUiLinkedEntry(Server.enableServerGeneration); @@ -105,11 +85,11 @@ public class Config public static ConfigUiLinkedEntry quickLodCloudRendering = new ConfigUiLinkedEntry(Advanced.Graphics.GenericRendering.enableCloudRendering); public static ConfigEntry showDhOptionsButtonInMinecraftUi = new ConfigEntry.Builder() - .set(true) - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) - .comment("" + - "Should Distant Horizon's config button appear in Minecraft's options screen next to the fov slider?") - .build(); + .set(true) + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) + .comment("" + + "Should Distant Horizon's config button appear in Minecraft's options screen next to the fov slider?") + .build(); public static ConfigCategory advanced = new ConfigCategory.Builder().set(Advanced.class).build(); @@ -191,171 +171,162 @@ public class Config public static ConfigUIComment qualityHeader = new ConfigUIComment.Builder().setParentConfigClass(Quality.class).build(); public static ConfigEntry lodChunkRenderDistanceRadius = new ConfigEntry.Builder() - .setMinDefaultMax(32, 256, 4096) - .comment("" + - "The radius of the mod's render distance. (measured in chunks)\n" + - "") - .build(); + .setMinDefaultMax(32, 256, 4096) + .comment("" + + "The radius of the mod's render distance. (measured in chunks)\n" + + "\n" + + "Note: this is a best effort number. \n" + + "The actual render distance may be above or below this number \n" + + "depending on your other graphic settings. \n" + + "") + .build(); + + public static ConfigUISpacer qualityDropoffSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry horizontalQuality = new ConfigEntry.Builder() - .set(EDhApiHorizontalQuality.MEDIUM) - .comment("" - + "This indicates how quickly LODs decrease in quality the further away they are. \n" - + "Higher settings will render higher quality fake chunks farther away, \n" - + "but will increase memory and GPU usage.") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .set(EDhApiHorizontalQuality.MEDIUM) + .comment("" + + "This indicates how far apart drops in LOD quality are. \n" + + "\n" + + "Higher settings will increase the distance between drops \n" + + "but will increase memory and GPU usage.") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); public static ConfigEntry maxHorizontalResolution = new ConfigEntry.Builder() - .set(EDhApiMaxHorizontalResolution.BLOCK) - .comment("" - + "What is the maximum detail LODs should be drawn at? \n" - + "Higher settings will increase memory and GPU usage. \n" - + "\n" - + EDhApiMaxHorizontalResolution.CHUNK + ": render 1 LOD for each Chunk. \n" - + EDhApiMaxHorizontalResolution.HALF_CHUNK + ": render 4 LODs for each Chunk. \n" - + EDhApiMaxHorizontalResolution.FOUR_BLOCKS + ": render 16 LODs for each Chunk. \n" - + EDhApiMaxHorizontalResolution.TWO_BLOCKS + ": render 64 LODs for each Chunk. \n" - + EDhApiMaxHorizontalResolution.BLOCK + ": render 256 LODs for each Chunk (width of one block). \n" - + "\n" - + "Lowest Quality: " + EDhApiMaxHorizontalResolution.CHUNK + "\n" - + "Highest Quality: " + EDhApiMaxHorizontalResolution.BLOCK) - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .set(EDhApiMaxHorizontalResolution.BLOCK) + .comment("" + + "What is the maximum detail LODs can render at? \n" + + "Higher settings will increase memory and GPU usage. \n" + + "\n" + + EDhApiMaxHorizontalResolution.CHUNK + ": render 1 LOD for each Chunk. \n" + + EDhApiMaxHorizontalResolution.HALF_CHUNK + ": render 4 LODs for each Chunk. \n" + + EDhApiMaxHorizontalResolution.FOUR_BLOCKS + ": render 16 LODs for each Chunk. \n" + + EDhApiMaxHorizontalResolution.TWO_BLOCKS + ": render 64 LODs for each Chunk. \n" + + EDhApiMaxHorizontalResolution.BLOCK + ": render 256 LODs for each Chunk (width of one block). \n" + + "\n" + + "Fastest: " + EDhApiMaxHorizontalResolution.CHUNK + "\n" + + "Fanciest: " + EDhApiMaxHorizontalResolution.BLOCK) + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); public static ConfigEntry verticalQuality = new ConfigEntry.Builder() - .set(EDhApiVerticalQuality.MEDIUM) - .comment("" - + "This indicates how well LODs will represent \n" - + "overhangs, caves, floating islands, etc. \n" - + "Higher options will make the world more accurate, but" - + "will increase memory and GPU usage. \n" - + "\n" - + "Lowest Quality: " + EDhApiVerticalQuality.HEIGHT_MAP + "\n" - + "Highest Quality: " + EDhApiVerticalQuality.EXTREME) - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .set(EDhApiVerticalQuality.MEDIUM) + .comment("" + + "This indicates how well LODs will represent \n" + + "overhangs, caves, floating islands, etc. \n" + + "Higher options will make the world more accurate, but" + + "will increase memory and GPU usage. \n" + + "\n" + + "Lowest Quality: " + EDhApiVerticalQuality.HEIGHT_MAP + "\n" + + "Highest Quality: " + EDhApiVerticalQuality.PIXEL_ART) + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); + + public static ConfigUISpacer qualitySpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry transparency = new ConfigEntry.Builder() - .set(EDhApiTransparency.COMPLETE) - .comment("" - + "How should LOD transparency be handled. \n" - + "\n" - + EDhApiTransparency.COMPLETE + ": LODs will render transparent. \n" - + EDhApiTransparency.FAKE + ": LODs will be opaque, but shaded to match the blocks underneath. \n" - + EDhApiTransparency.DISABLED + ": LODs will be opaque. \n" - + "") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); - - public static ConfigEntry blocksToIgnore = new ConfigEntry.Builder() - .set(EDhApiBlocksToAvoid.NON_COLLIDING) - .comment("" - + "What blocks shouldn't be rendered as LODs? \n" - + "\n" - + EDhApiBlocksToAvoid.NONE + ": Represent all blocks in the LODs \n" - + EDhApiBlocksToAvoid.NON_COLLIDING + ": Only represent solid blocks in the LODs (tall grass, torches, etc. won't count for a LOD's height) \n" - + "") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); - - public static ConfigEntry tintWithAvoidedBlocks = new ConfigEntry.Builder() - .set(true) - .comment("" - + "Should the blocks underneath avoided blocks gain the color of the avoided block? \n" - + "\n" - + "True: a red flower will tint the grass below it red. \n" - + "False: skipped blocks will not change color of surface below them. " - + "") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .set(EDhApiTransparency.COMPLETE) + .comment("" + + "How should LOD transparency be handled. \n" + + "\n" + + EDhApiTransparency.COMPLETE + ": LODs will render transparent. \n" + + EDhApiTransparency.DISABLED + ": LODs will be opaque. \n" + + "") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); public static ConfigEntry lodShading = new ConfigEntry.Builder() - .set(EDhApiLodShading.AUTO) - .comment("" - + "How should LODs be shaded? \n" - + "\n" - + EDhApiLodShading.AUTO + ": Uses the same side shading as vanilla Minecraft blocks. \n" - + EDhApiLodShading.ENABLED + ": Simulates Minecraft's block shading for LODs. \n" - + " Can be used to force LOD shading when using some shaders. \n" - + EDhApiLodShading.DISABLED + ": All LOD sides will be rendered with the same brightness. \n" - + "") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .set(EDhApiLodShading.AUTO) + .comment("" + + "How should LODs be shaded? \n" + + "\n" + + EDhApiLodShading.AUTO + ": Uses the same side shading as vanilla Minecraft blocks. \n" + + EDhApiLodShading.ENABLED + ": Simulates Minecraft's block shading for LODs. \n" + + " Can be used to force LOD shading when using some shaders. \n" + + EDhApiLodShading.DISABLED + ": All LOD sides will be rendered with the same brightness. \n" + + "") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); public static ConfigEntry grassSideRendering = new ConfigEntry.Builder() - .set(EDhApiGrassSideRendering.FADE_TO_DIRT) - .comment("" - + "How should the sides and bottom of grass block LODs render? \n" - + "\n" - + EDhApiGrassSideRendering.AS_GRASS + ": all sides of dirt LOD's render using the top (green) color. \n" - + EDhApiGrassSideRendering.FADE_TO_DIRT + ": sides fade from grass to dirt. \n" - + EDhApiGrassSideRendering.AS_DIRT + ": sides render entirely as dirt. \n" - + "") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .set(EDhApiGrassSideRendering.FADE_TO_DIRT) + .comment("" + + "How should the sides and bottom of grass block LODs render? \n" + + "\n" + + EDhApiGrassSideRendering.AS_GRASS + ": all sides of dirt LOD's render using the top (green) color. \n" + + EDhApiGrassSideRendering.FADE_TO_DIRT + ": sides fade from grass to dirt. \n" + + EDhApiGrassSideRendering.AS_DIRT + ": sides render entirely as dirt. \n" + + "") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); + + public static ConfigUISpacer fadeSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry ditherDhFade = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If true LODs will fade away as you get closer to them. \n" - + "If false LODs will cut off abruptly at a set distance from the camera. \n" - + "This setting is affected by the vanilla overdraw prevention config. \n" - + "") - .build(); + .set(true) + .comment("" + + "If true LODs will fade away as you get closer to them. \n" + + "If false LODs will cut off abruptly at a set distance from the camera. \n" + + "This setting is affected by the vanilla overdraw prevention config. \n" + + "") + .build(); public static ConfigEntry vanillaFadeMode = new ConfigEntry.Builder() - .set(EDhApiMcRenderingFadeMode.DOUBLE_PASS) - .comment("" - + "How should vanilla Minecraft fade into Distant Horizons LODs? \n" - + "\n" - + EDhApiMcRenderingFadeMode.NONE + ": Fastest, there will be a pronounced border between DH and MC rendering. \n" - + EDhApiMcRenderingFadeMode.SINGLE_PASS + ": Fades after MC's transparent pass, opaque blocks underwater won't be faded. \n" - + EDhApiMcRenderingFadeMode.DOUBLE_PASS + ": Slowest, fades after both MC's opaque and transparent passes, provides the smoothest transition. \n" - + "") - .build(); + .set(EDhApiMcRenderingFadeMode.DOUBLE_PASS) + .comment("" + + "How should vanilla Minecraft fade into Distant Horizons LODs? \n" + + "\n" + + EDhApiMcRenderingFadeMode.NONE + ": Fastest, there will be a pronounced border between DH and MC rendering. \n" + + EDhApiMcRenderingFadeMode.SINGLE_PASS + ": Fades after MC's transparent pass, opaque blocks underwater won't be faded. \n" + + EDhApiMcRenderingFadeMode.DOUBLE_PASS + ": Slowest, fades after both MC's opaque and transparent passes, provides the smoothest transition. \n" + + "") + .build(); public static ConfigEntry dhFadeFarClipPlane = new ConfigEntry.Builder() - .set(true) - .comment("" - + "Should DH fade out before reaching the far clip plane? \n" - + "This is helpful to prevent DH clouds from cutting off in the distance. \n" - + "") - .build(); - - public static ConfigEntry brightnessMultiplier = new ConfigEntry.Builder() - .set(1.0f) - .comment("" - + "How bright LOD colors are. \n" - + "\n" - + "0 = black \n" - + "1 = normal \n" - + "2 = near white") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); - - public static ConfigEntry saturationMultiplier = new ConfigEntry.Builder() - .set(1.0f) - .comment("" - + "How saturated LOD colors are. \n" - + "\n" - + "0 = black and white \n" - + "1 = normal \n" - + "2 = very saturated") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .set(true) + .comment("" + + "Should DH fade out before reaching the far clip plane? \n" + + "This is helpful to prevent DH clouds from cutting off in the distance. \n" + + "") + .build(); public static ConfigEntry lodBiomeBlending = new ConfigEntry.Builder() - .setMinDefaultMax(0,3,3) // going higher than 3 causes banding issues for blending across LOD borders and an exponential increase in load times - .comment("" - + "This is the same as vanilla Biome Blending settings for Lod area. \n" - + " Note that anything other than '0' will greatly effect Lod building time. \n" - + "\n" - + " '0' equals to Vanilla Biome Blending of '1x1' or 'OFF', \n" - + " '1' equals to Vanilla Biome Blending of '3x3', \n" - + " '2' equals to Vanilla Biome Blending of '5x5'...") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .setMinDefaultMax(0, 3, 3) // going higher than 3 causes banding issues for blending across LOD borders and an exponential increase in load times + .comment("" + + "This is the same as vanilla Biome Blending settings for Lod area. \n" + + " Note: anything above '0' will slow down LOD loading time. \n" + + "\n" + + " '0' equals to Vanilla Biome Blending of '1x1' or 'OFF', \n" + + " '1' equals to Vanilla Biome Blending of '3x3', \n" + + " '2' equals to Vanilla Biome Blending of '5x5'...") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); + + public static ConfigUISpacer multiplierSpacer = new ConfigUISpacer.Builder().build(); + + public static ConfigEntry brightnessMultiplier = new ConfigEntry.Builder() + .set(1.0f) + .comment("" + + "How bright LOD colors are. \n" + + "\n" + + "0 = black \n" + + "1 = normal \n" + + "2 = near white") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); + + public static ConfigEntry saturationMultiplier = new ConfigEntry.Builder() + .set(1.0f) + .comment("" + + "How saturated LOD colors are. \n" + + "\n" + + "0 = black and white \n" + + "1 = normal \n" + + "2 = very saturated") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); + } public static class GenericRendering @@ -363,31 +334,31 @@ public class Config public static ConfigUIComment genericRendererHeader = new ConfigUIComment.Builder().setParentConfigClass(GenericRendering.class).build(); public static ConfigEntry enableGenericRendering = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If true non terrain objects will be rendered in DH's terrain. \n" - + "This includes beacon beams and clouds. \n" - + "") - .build(); + .set(true) + .comment("" + + "If true non terrain objects will be rendered by DH. \n" + + "i.e. beacon beams and clouds. \n" + + "") + .build(); public static ConfigEntry enableBeaconRendering = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If true LOD beacon beams will be rendered. \n" - + "") - .build(); + .set(true) + .comment("" + + "If true LOD beacon beams will be rendered. \n" + + "") + .build(); public static ConfigEntry beaconRenderHeight = new ConfigEntry.Builder() - .setMinDefaultMax(1, 6000, 6_000_000) - .comment("" - + "Sets the maximum height at which beacons will render." - + "This will only affect new beacons coming into LOD render distance." - + "Beacons currently visible in LOD chunks will not be affected." - + "") - .build(); + .setMinDefaultMax(1, 6000, 6_000_000) + .comment("" + + "Sets the maximum height beacons will render up to. \n" + + "\n" + + "Requires a world re-load to take affect. \n" + + "") + .build(); public static ConfigEntry expandDistantBeacons = new ConfigEntry.Builder() - .set(true) + .set(true) .comment("" + "If true LOD beacon beams will be rendered wider at extreme distances, \n" + "making them easier to see. \n" @@ -396,11 +367,11 @@ public class Config .build(); public static ConfigEntry enableCloudRendering = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If true LOD clouds will be rendered. \n" - + "") - .build(); + .set(true) + .comment("" + + "If true LOD clouds will be rendered. \n" + + "") + .build(); public static ConfigEntry dimensionEnabledCloudRenderingCsv = new ConfigEntry.Builder() .set("minecraft:overworld") @@ -410,99 +381,100 @@ public class Config + "\n" + "Example: \"minecraft:overworld,minecraft:the_end\"\n" + "\n" - + "Changes will only be seen when the world is re-loaded.\n" + + "Changes require a world re-load.\n" + "") .build(); + } public static class Fog { private static final Float FOG_RANGE_MIN = 0.0f; - private static final Float FOG_RANGE_MAX = (float)Math.sqrt(2.0); + private static final Float FOG_RANGE_MAX = (float) Math.sqrt(2.0); public static ConfigUIComment fogHeader = new ConfigUIComment.Builder().setParentConfigClass(Fog.class).build(); public static ConfigEntry enableDhFog = new ConfigEntry.Builder() - .set(true) - .comment("" - + "Determines if fog is drawn on DH LODs. \n" - + "") - .build(); + .set(true) + .comment("" + + "Determines if fog is drawn on DH LODs. \n" + + "") + .build(); public static ConfigEntry colorMode = new ConfigEntry.Builder() - .set(EDhApiFogColorMode.USE_WORLD_FOG_COLOR) - .comment("" - + "What color should fog use? \n" - + "\n" - + EDhApiFogColorMode.USE_WORLD_FOG_COLOR + ": Use the world's fog color. \n" - + EDhApiFogColorMode.USE_SKY_COLOR + ": Use the sky's color.") - .build(); + .set(EDhApiFogColorMode.USE_WORLD_FOG_COLOR) + .comment("" + + "What color should fog use? \n" + + "\n" + + EDhApiFogColorMode.USE_WORLD_FOG_COLOR + ": Use the world's fog color. \n" + + EDhApiFogColorMode.USE_SKY_COLOR + ": Use the sky's color.") + .build(); public static ConfigEntry enableVanillaFog = new ConfigEntry.Builder() - .set(false) - .comment("" - + "Should Minecraft's fog render? \n" - + "Note: Other mods may conflict with this setting. \n" - + "") - .build(); + .set(false) + .comment("" + + "Should Minecraft's fog render? \n" + + "Note: Other mods may conflict with this setting. \n" + + "") + .build(); public static ConfigEntry farFogStart = new ConfigEntry.Builder() - .setMinDefaultMax(FOG_RANGE_MIN, 0.4f, FOG_RANGE_MAX) - .comment("" - + "At what distance should the far fog start? \n" - + "\n" - + "0.0: Fog starts at the player's position. \n" - + "1.0: Fog starts at the closest edge of the vanilla render distance. \n" - + "1.414: Fog starts at the corner of the vanilla render distance.") - .build(); + .setMinDefaultMax(FOG_RANGE_MIN, 0.4f, FOG_RANGE_MAX) + .comment("" + + "At what distance should the far fog start? \n" + + "\n" + + "0.0: Fog starts at the player's position. \n" + + "1.0: Fog starts at the closest edge of the vanilla render distance. \n" + + "1.414: Fog starts at the corner of the vanilla render distance.") + .build(); public static ConfigEntry farFogEnd = new ConfigEntry.Builder() - .setMinDefaultMax(FOG_RANGE_MIN, 1.0f, FOG_RANGE_MAX) - .comment("" - + "Where should the far fog end? \n" - + "\n" - + "0.0: Fog ends at player's position.\n" - + "1.0: Fog ends at the closest edge of the vanilla render distance. \n" - + "1.414: Fog ends at the corner of the vanilla render distance.") - .build(); + .setMinDefaultMax(FOG_RANGE_MIN, 1.0f, FOG_RANGE_MAX) + .comment("" + + "Where should the far fog end? \n" + + "\n" + + "0.0: Fog ends at player's position.\n" + + "1.0: Fog ends at the closest edge of the vanilla render distance. \n" + + "1.414: Fog ends at the corner of the vanilla render distance.") + .build(); public static ConfigEntry farFogMin = new ConfigEntry.Builder() - .setMinDefaultMax(-5.0f, 0.0f, FOG_RANGE_MAX) - .comment("" - + "What is the minimum fog thickness? \n" - + "\n" - + "0.0: No fog. \n" - + "1.0: Fully opaque fog.") - .build(); + .setMinDefaultMax(-5.0f, 0.0f, FOG_RANGE_MAX) + .comment("" + + "What is the minimum fog thickness? \n" + + "\n" + + "0.0: No fog. \n" + + "1.0: Fully opaque fog.") + .build(); public static ConfigEntry farFogMax = new ConfigEntry.Builder() - .setMinDefaultMax(FOG_RANGE_MIN, 1.0f, 5.0f) - .comment("" - + "What is the maximum fog thickness? \n" - + "\n" - + "0.0: No fog. \n" - + "1.0: Fully opaque fog.") - .build(); + .setMinDefaultMax(FOG_RANGE_MIN, 1.0f, 5.0f) + .comment("" + + "What is the maximum fog thickness? \n" + + "\n" + + "0.0: No fog. \n" + + "1.0: Fully opaque fog.") + .build(); public static ConfigEntry farFogFalloff = new ConfigEntry.Builder() - .set(EDhApiFogFalloff.EXPONENTIAL_SQUARED) - .comment("" - + "How should the fog thickness should be calculated? \n" - + "\n" - + EDhApiFogFalloff.LINEAR + ": Linear based on distance (will ignore 'density')\n" - + EDhApiFogFalloff.EXPONENTIAL + ": 1/(e^(distance*density)) \n" - + EDhApiFogFalloff.EXPONENTIAL_SQUARED + ": 1/(e^((distance*density)^2)") - .build(); + .set(EDhApiFogFalloff.EXPONENTIAL_SQUARED) + .comment("" + + "How should the fog thickness should be calculated? \n" + + "\n" + + EDhApiFogFalloff.LINEAR + ": Linear based on distance (will ignore 'density')\n" + + EDhApiFogFalloff.EXPONENTIAL + ": 1/(e^(distance*density)) \n" + + EDhApiFogFalloff.EXPONENTIAL_SQUARED + ": 1/(e^((distance*density)^2)") + .build(); public static ConfigEntry farFogDensity = new ConfigEntry.Builder() - .setMinDefaultMax(0.01f, 2.5f, 50.0f) - .comment("" - + "Used in conjunction with the Fog Falloff.") - .build(); + .setMinDefaultMax(0.01f, 2.5f, 50.0f) + .comment("" + + "Used in conjunction with the Fog Falloff.") + .build(); public static ConfigCategory heightFog = new ConfigCategory.Builder().set(HeightFog.class).build(); @@ -513,93 +485,93 @@ public class Config public static ConfigUIComment heightFogHeader = new ConfigUIComment.Builder().setParentConfigClass(HeightFog.class).build(); public static ConfigEntry heightFogMixMode = new ConfigEntry.Builder() - .set(EDhApiHeightFogMixMode.SPHERICAL) - .comment("" - + "How should height effect the fog thickness? \n" - + "Note: height fog is combined with the other fog settings. \n" - + "\n" - + EDhApiHeightFogMixMode.SPHERICAL + ": Fog is calculated based on camera distance. \n" - + EDhApiHeightFogMixMode.CYLINDRICAL + ": Ignore height, fog is calculated based on horizontal distance. \n" - + "\n" - + EDhApiHeightFogMixMode.MAX + ": max(heightFog, farFog) \n" - + EDhApiHeightFogMixMode.ADDITION + ": heightFog + farFog \n" - + EDhApiHeightFogMixMode.MULTIPLY + ": heightFog * farFog \n" - + EDhApiHeightFogMixMode.INVERSE_MULTIPLY + ": 1 - (1-heightFog) * (1-farFog) \n" - + EDhApiHeightFogMixMode.LIMITED_ADDITION + ": farFog + max(farFog, heightFog) \n" - + EDhApiHeightFogMixMode.MULTIPLY_ADDITION + ": farFog + farFog * heightFog \n" - + EDhApiHeightFogMixMode.INVERSE_MULTIPLY_ADDITION + ": farFog + 1 - (1-heightFog) * (1-farFog) \n" - + EDhApiHeightFogMixMode.AVERAGE + ": farFog*0.5 + heightFog*0.5 \n" - + "\n") - .build(); + .set(EDhApiHeightFogMixMode.SPHERICAL) + .comment("" + + "How should height effect the fog thickness? \n" + + "Note: height fog is combined with the other fog settings. \n" + + "\n" + + EDhApiHeightFogMixMode.SPHERICAL + ": Fog is calculated based on camera distance. \n" + + EDhApiHeightFogMixMode.CYLINDRICAL + ": Ignore height, fog is calculated based on horizontal distance. \n" + + "\n" + + EDhApiHeightFogMixMode.MAX + ": max(heightFog, farFog) \n" + + EDhApiHeightFogMixMode.ADDITION + ": heightFog + farFog \n" + + EDhApiHeightFogMixMode.MULTIPLY + ": heightFog * farFog \n" + + EDhApiHeightFogMixMode.INVERSE_MULTIPLY + ": 1 - (1-heightFog) * (1-farFog) \n" + + EDhApiHeightFogMixMode.LIMITED_ADDITION + ": farFog + max(farFog, heightFog) \n" + + EDhApiHeightFogMixMode.MULTIPLY_ADDITION + ": farFog + farFog * heightFog \n" + + EDhApiHeightFogMixMode.INVERSE_MULTIPLY_ADDITION + ": farFog + 1 - (1-heightFog) * (1-farFog) \n" + + EDhApiHeightFogMixMode.AVERAGE + ": farFog*0.5 + heightFog*0.5 \n" + + "\n") + .build(); public static ConfigEntry heightFogDirection = new ConfigEntry.Builder() - .set(EDhApiHeightFogDirection.BELOW_SET_HEIGHT) - .comment("" - + "Where should the height fog start? \n" - + "\n" - + EDhApiHeightFogDirection.ABOVE_CAMERA + ": Height fog starts at the camera and goes towards the sky \n" - + EDhApiHeightFogDirection.BELOW_CAMERA + ": Height fog starts at the camera and goes towards the void \n" - + EDhApiHeightFogDirection.ABOVE_AND_BELOW_CAMERA + ": Height fog starts from the camera to goes towards both the sky and void \n" - + EDhApiHeightFogDirection.ABOVE_SET_HEIGHT + ": Height fog starts from a set height and goes towards the sky \n" - + EDhApiHeightFogDirection.BELOW_SET_HEIGHT + ": Height fog starts from a set height and goes towards the void \n" - + EDhApiHeightFogDirection.ABOVE_AND_BELOW_SET_HEIGHT + ": Height fog starts from a set height and goes towards both the sky and void") - .build(); + .set(EDhApiHeightFogDirection.BELOW_SET_HEIGHT) + .comment("" + + "Where should the height fog start? \n" + + "\n" + + EDhApiHeightFogDirection.ABOVE_CAMERA + ": Height fog starts at the camera and goes towards the sky \n" + + EDhApiHeightFogDirection.BELOW_CAMERA + ": Height fog starts at the camera and goes towards the void \n" + + EDhApiHeightFogDirection.ABOVE_AND_BELOW_CAMERA + ": Height fog starts from the camera to goes towards both the sky and void \n" + + EDhApiHeightFogDirection.ABOVE_SET_HEIGHT + ": Height fog starts from a set height and goes towards the sky \n" + + EDhApiHeightFogDirection.BELOW_SET_HEIGHT + ": Height fog starts from a set height and goes towards the void \n" + + EDhApiHeightFogDirection.ABOVE_AND_BELOW_SET_HEIGHT + ": Height fog starts from a set height and goes towards both the sky and void") + .build(); public static ConfigEntry heightFogBaseHeight = new ConfigEntry.Builder() - .setMinDefaultMax(-3_000_000.0f, 80.0f, 3_000_000.0f) - .comment("If the height fog is calculated around a set height, what is that height position?") - .build(); + .setMinDefaultMax(-3_000_000.0f, 80.0f, 3_000_000.0f) + .comment("If the height fog is calculated around a set height, what is that height position?") + .build(); public static ConfigEntry heightFogStart = new ConfigEntry.Builder() - .setMinDefaultMax(FOG_RANGE_MIN, 0.0f, FOG_RANGE_MAX) - .comment("" - + "Should the start of the height fog be offset? \n" - + "\n" - + "0.0: Fog start with no offset.\n" - + "1.0: Fog start with offset of the entire world's height. (Includes depth)") - .build(); + .setMinDefaultMax(FOG_RANGE_MIN, 0.0f, FOG_RANGE_MAX) + .comment("" + + "Should the start of the height fog be offset? \n" + + "\n" + + "0.0: Fog start with no offset.\n" + + "1.0: Fog start with offset of the entire world's height. (Includes depth)") + .build(); public static ConfigEntry heightFogEnd = new ConfigEntry.Builder() - .setMinDefaultMax(FOG_RANGE_MIN, 0.6f, FOG_RANGE_MAX) - .comment("" - + "Should the end of the height fog be offset? \n" - + "\n" - + "0.0: Fog end with no offset.\n" - + "1.0: Fog end with offset of the entire world's height. (Include depth)") - .build(); + .setMinDefaultMax(FOG_RANGE_MIN, 0.6f, FOG_RANGE_MAX) + .comment("" + + "Should the end of the height fog be offset? \n" + + "\n" + + "0.0: Fog end with no offset.\n" + + "1.0: Fog end with offset of the entire world's height. (Include depth)") + .build(); public static ConfigEntry heightFogMin = new ConfigEntry.Builder() - .setMinDefaultMax(0.0f, 0.0f, FOG_RANGE_MAX) - .comment("" - + "What is the minimum fog thickness? \n" - + "\n" - + "0.0: No fog. \n" - + "1.0: Fully opaque fog.") - .build(); + .setMinDefaultMax(0.0f, 0.0f, FOG_RANGE_MAX) + .comment("" + + "What is the minimum fog thickness? \n" + + "\n" + + "0.0: No fog. \n" + + "1.0: Fully opaque fog.") + .build(); public static ConfigEntry heightFogMax = new ConfigEntry.Builder() - .setMinDefaultMax(FOG_RANGE_MIN, 1.0f, 5.0f) - .comment("" - + "What is the maximum fog thickness? \n" - + "\n" - + "0.0: No fog. \n" - + "1.0: Fully opaque fog.") - .build(); + .setMinDefaultMax(FOG_RANGE_MIN, 1.0f, 5.0f) + .comment("" + + "What is the maximum fog thickness? \n" + + "\n" + + "0.0: No fog. \n" + + "1.0: Fully opaque fog.") + .build(); public static ConfigEntry heightFogFalloff = new ConfigEntry.Builder() - .set(EDhApiFogFalloff.EXPONENTIAL_SQUARED) - .comment("" - + "How should the height fog thickness should be calculated? \n" - + "\n" - + EDhApiFogFalloff.LINEAR + ": Linear based on height (will ignore 'density')\n" - + EDhApiFogFalloff.EXPONENTIAL + ": 1/(e^(height*density)) \n" - + EDhApiFogFalloff.EXPONENTIAL_SQUARED + ": 1/(e^((height*density)^2)") - .build(); + .set(EDhApiFogFalloff.EXPONENTIAL_SQUARED) + .comment("" + + "How should the height fog thickness should be calculated? \n" + + "\n" + + EDhApiFogFalloff.LINEAR + ": Linear based on height (will ignore 'density')\n" + + EDhApiFogFalloff.EXPONENTIAL + ": 1/(e^(height*density)) \n" + + EDhApiFogFalloff.EXPONENTIAL_SQUARED + ": 1/(e^((height*density)^2)") + .build(); public static ConfigEntry heightFogDensity = new ConfigEntry.Builder() - .setMinDefaultMax(0.01f, 20.0f, 50.0f) - .comment("What is the height fog's density?") - .build(); + .setMinDefaultMax(0.01f, 20.0f, 50.0f) + .comment("What is the height fog's density?") + .build(); } @@ -610,34 +582,34 @@ public class Config public static ConfigUIComment noiseTextureHeader = new ConfigUIComment.Builder().setParentConfigClass(NoiseTexture.class).build(); public static ConfigEntry enableNoiseTexture = new ConfigEntry.Builder() - .set(true) - .comment("" - + "Should a noise texture be applied to LODs? \n" - + "\n" - + "This is done to simulate textures and make the LODs appear more detailed. \n" - + "") - .build(); + .set(true) + .comment("" + + "Should a noise texture be applied to LODs? \n" + + "\n" + + "This is done to simulate textures and make the LODs appear more detailed. \n" + + "") + .build(); public static ConfigEntry noiseSteps = new ConfigEntry.Builder() - .setMinDefaultMax(1, 4, null) - .comment("" - + "How many steps of noise should be applied to LODs?" - + "") - .build(); + .setMinDefaultMax(1, 4, null) + .comment("" + + "How many steps of noise should be applied to LODs?" + + "") + .build(); public static ConfigEntry noiseIntensity = new ConfigEntry.Builder() - .setMinDefaultMax(0f, 0.05f, 1f) - .comment("" - + "How intense should the noise should be?") - .build(); + .setMinDefaultMax(0f, 0.05f, 1f) + .comment("" + + "How intense should the noise should be?") + .build(); public static ConfigEntry noiseDropoff = new ConfigEntry.Builder() - .setMinDefaultMax(0, 1024, null) - .comment("" - + "Defines how far should the noise texture render before it fades away. (in blocks) \n" - + "Set to 0 to disable noise from fading away \n" - + "") - .build(); + .setMinDefaultMax(0, 1024, null) + .comment("" + + "Defines how far should the noise texture render before it fades away. (in blocks) \n" + + "Set to 0 to disable noise from fading away \n" + + "") + .build(); } @@ -646,20 +618,20 @@ public class Config public static ConfigUIComment cullingHeader = new ConfigUIComment.Builder().setParentConfigClass(Culling.class).build(); public static ConfigEntry overdrawPrevention = new ConfigEntry.Builder() - .setMinDefaultMax(-1.0f, -1.0f, 1.0f) - .comment("" - + "Determines how far from the camera Distant Horizons will start rendering. \n" - + "Measured as a percentage of the vanilla render distance.\n" - + "\n" - + "-1 = auto, overdraw will change based on the vanilla render distance.\n" - + "\n" - + "Higher values will prevent LODs from rendering behind vanilla blocks at a higher distance,\n" - + "but may cause holes in the world. \n" - + "Holes are most likely to appear when flying through unloaded terrain. \n" - + "\n" - + "Increasing the vanilla render distance increases the effectiveness of this setting." - + "") - .build(); + .setMinDefaultMax(-1.0f, -1.0f, 1.0f) + .comment("" + + "Determines how far from the camera Distant Horizons will start rendering. \n" + + "Measured as a percentage of the vanilla render distance.\n" + + "\n" + + "-1 = auto, overdraw will change based on the vanilla render distance.\n" + + "\n" + + "Higher values will prevent LODs from rendering behind vanilla blocks at a higher distance,\n" + + "but may cause holes in the world. \n" + + "Holes are most likely to appear when flying through unloaded terrain. \n" + + "\n" + + "Increasing the vanilla render distance increases the effectiveness of this setting." + + "") + .build(); public static ConfigEntry reduceOverdrawWithFastMovement = new ConfigEntry.Builder() .set(true) @@ -672,89 +644,93 @@ public class Config + "") .build(); + public static ConfigUISpacer speedSpacer = new ConfigUISpacer.Builder().build(); + public static ConfigEntry enableCaveCulling = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If enabled caves won't be rendered. \n" - + "\n" - + " Note: for some world types this can cause \n" - + " overhangs or walls for floating objects. \n" - + " Tweaking the caveCullingHeight, can resolve some \n" - + " of those issues. \n" - + "") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .set(true) + .comment("" + + "If enabled caves won't be rendered. \n" + + "\n" + + " Note: for some world types this can cause \n" + + " overhangs or walls for floating objects. \n" + + " Tweaking the caveCullingHeight, can resolve some \n" + + " of those issues. \n" + + "") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); public static ConfigEntry caveCullingHeight = new ConfigEntry.Builder() - .setMinDefaultMax(-4096, 60, 4096) - .comment("" - + "At what Y value should cave culling start? \n" - + "Lower this value if you get walls for areas with 0 light.") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .setMinDefaultMax(-4096, 60, 4096) + .comment("" + + "At what Y value should cave culling start? \n" + + "Lower this value if you get walls for areas with 0 light.") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); + + public static ConfigUISpacer caveCullingSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry disableBeaconDistanceCulling = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If false all beacons near the camera won't be drawn to prevent vanilla overdraw. \n" - + "If true all beacons will be rendered. \n" - + "\n" - + "Generally this should be left as true. It's main purpose is for debugging\n" - + "beacon updating/rendering.\n" - + "") - .build(); + .set(true) + .comment("" + + "If false all beacons near the camera won't be drawn to prevent vanilla overdraw. \n" + + "If true all beacons will be rendered. \n" + + "\n" + + "Generally this should be left as true. It's main purpose is for debugging\n" + + "beacon updating/rendering.\n" + + "") + .build(); public static ConfigEntry disableFrustumCulling = new ConfigEntry.Builder() - .set(false) - .comment("" - + "If true LODs outside the player's camera \n" - + "aren't drawn, increasing GPU performance. \n" - + "\n" - + "If false all LODs are drawn, even those behind \n" - + "the player's camera, decreasing GPU performance. \n" - + "\n" - + "Disable this if you see LODs disappearing at the corners of your vision.") - .build(); + .set(false) + .comment("" + + "If true LODs outside the player's camera \n" + + "aren't drawn, increasing GPU performance. \n" + + "\n" + + "If false all LODs are drawn, even those behind \n" + + "the player's camera, decreasing GPU performance. \n" + + "\n" + + "Disable this if you see LODs disappearing at the corners of your vision.") + .build(); public static ConfigEntry disableShadowPassFrustumCulling = new ConfigEntry.Builder() - .set(false) - .comment("" - + "Identical to the other frustum culling option\n" - + "only used when a shader mod is present using the DH API\n" - + "and the shadow pass is being rendered.\n" - + "\n" - + "Disable this if shadows render incorrectly.") - .build(); + .set(false) + .comment("" + + "Identical to the other frustum culling option\n" + + "only used when a shader mod is present using the DH API\n" + + "and the shadow pass is being rendered.\n" + + "\n" + + "Disable this if shadows render incorrectly.") + .build(); public static ConfigUISpacer ignoreCsvStartSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry ignoredRenderBlockCsv = new ConfigEntry.Builder() - .set("minecraft:barrier,minecraft:structure_void,minecraft:light,minecraft:tripwire,minecraft:brown_mushroom") - .setAppearance(EConfigEntryAppearance.ALL) + .set("minecraft:barrier,minecraft:structure_void,minecraft:light,minecraft:tripwire,minecraft:brown_mushroom") + .setAppearance(EConfigEntryAppearance.ALL) .addListener(RenderBlockCacheCsvHandler.INSTANCE) - .comment("" - + "A comma separated list of block resource locations that won't be rendered by DH. \n" - + "Air is always included in this list. \n" - + "\n" - + "Note:\n" - + "If you see gaps, or holes you may have to change\n" - + "worldCompression to ["+EDhApiWorldCompressionMode.MERGE_SAME_BLOCKS+"] and re-generate the LODs.\n" - + "") - .build(); + .comment("" + + "A comma separated list of block resource locations that won't be rendered by DH. \n" + + "Air is always included in this list. \n" + + "\n" + + "Note:\n" + + "If you see gaps, or holes you may have to change\n" + + "worldCompression to [" + EDhApiWorldCompressionMode.MERGE_SAME_BLOCKS + "] and re-generate the LODs.\n" + + "") + .build(); public static ConfigEntry ignoredRenderCaveBlockCsv = new ConfigEntry.Builder() - .set("") - .setAppearance(EConfigEntryAppearance.ALL) + .set("") + .setAppearance(EConfigEntryAppearance.ALL) .addListener(RenderBlockCacheCsvHandler.INSTANCE) - .comment("" - + "A comma separated list of block resource locations that shouldn't be rendered \n" - + "if they are in a 0 sky light underground area. \n" - + "Air is always included in this list. \n" - + "\n" - + "Defaults to an empty list since most cave blocks will be automatically ignored due to being: \n" - + "transparent, non-solid, or liquids, but new blocks can be added here if needed.\n" - + "") - .build(); + .comment("" + + "A comma separated list of block resource locations that shouldn't be rendered \n" + + "if they are in a 0 sky light underground area. \n" + + "Air is always included in this list. \n" + + "\n" + + "Defaults to an empty list since most cave blocks will be automatically ignored due to being: \n" + + "transparent, non-solid, or liquids, but new blocks can be added here if needed.\n" + + "") + .build(); public static ConfigEntry waterSubSurfaceBlockReplacementCsv = new ConfigEntry.Builder() .set("minecraft:kelp,minecraft:tall_seagrass,minecraft:seagrass") @@ -776,6 +752,29 @@ public class Config + "") .build(); + public static ConfigUISpacer blockSpacer = new ConfigUISpacer.Builder().build(); + + public static ConfigEntry blocksToIgnore = new ConfigEntry.Builder() + .set(EDhApiBlocksToAvoid.NON_COLLIDING) + .comment("" + + "Defines what blocks should be rendered as LODs. \n" + + "\n" + + EDhApiBlocksToAvoid.NONE + ": Include all blocks in the LODs \n" + + EDhApiBlocksToAvoid.NON_COLLIDING + ": Only render solid blocks in the LODs (tall grass, torches, etc. will be ignored) \n" + + "") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); + public static ConfigEntry tintWithAvoidedBlocks = new ConfigEntry.Builder() + .set(true) + .comment("" + + "Should the blocks underneath avoided blocks gain the color of the avoided block? \n" + + "\n" + + "True: a red flower will tint the grass below it red. \n" + + "False: skipped blocks will not change color of surface below them. " + + "") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); + } public static class Experimental @@ -783,21 +782,21 @@ public class Config public static ConfigUIComment experimentalHeader = new ConfigUIComment.Builder().setParentConfigClass(Experimental.class).build(); public static ConfigEntry earthCurveRatio = new ConfigEntry.Builder() - .setMinDefaultMax(-5000, 0, 5000) - .comment("" - + "This is the earth size ratio when applying the curvature shader effect. \n" - + "Note: Enabling this feature may cause rendering bugs. \n" - + "\n" - + "0 = flat/disabled \n" - + "1 = 1 to 1 (6,371,000 blocks) \n" - + "100 = 1 to 100 (63,710 blocks) \n" - + "10000 = 1 to 10000 (637.1 blocks) \n" - + "\n" - + "Note: Due to current limitations, the min value is ["+WorldCurvatureConfigEventHandler.MIN_VALID_CURVE_VALUE+"] \n" - + "and the max value is 5000. Any values outside this range \n" - + "will be set to 0 (disabled).") - .addListener(WorldCurvatureConfigEventHandler.INSTANCE) - .build(); + .setMinDefaultMax(-5000, 0, 5000) + .comment("" + + "This is the earth size ratio when applying the curvature shader effect. \n" + + "Note: Enabling this feature may cause rendering bugs. \n" + + "\n" + + "0 = flat/disabled \n" + + "1 = 1 to 1 (6,371,000 blocks) \n" + + "100 = 1 to 100 (63,710 blocks) \n" + + "10000 = 1 to 10000 (637.1 blocks) \n" + + "\n" + + "Note: Due to current limitations, the min value is [" + WorldCurvatureConfigEventHandler.MIN_VALID_CURVE_VALUE + "] \n" + + "and the max value is 5000. Any values outside this range \n" + + "will be set to 0 (disabled).") + .addListener(WorldCurvatureConfigEventHandler.INSTANCE) + .build(); public static ConfigEntry ignoredDimensionCsv = new ConfigEntry.Builder() .set("") @@ -814,7 +813,7 @@ public class Config .build(); public static ConfigEntry renderingApi = new ConfigEntry.Builder() - .set(EDhApiRenderApi.AUTO) + .set(EDhApiRenderApi.AUTO) .comment("" + "Requires a restart to change. \n" + " \n" @@ -835,28 +834,29 @@ public class Config public static ConfigUIComment autoUpdaterHeader = new ConfigUIComment.Builder().setParentConfigClass(AutoUpdater.class).build(); public static ConfigEntry enableAutoUpdater = new ConfigEntry.Builder() - .set(!isRunningInDevEnvironment()) - .comment("" - + "Automatically check for updates on game launch? \n" - + "") - .build(); + .set(!isRunningInDevEnvironment()) + .comment("" + + "Automatically check for updates on game launch? \n" + + "") + .build(); public static ConfigEntry enableSilentUpdates = new ConfigEntry.Builder() - .set(false) - .comment("" - + "Should Distant Horizons silently, automatically download and install new versions? \n" - + "This setting is force disabled on dedicated servers for stability reasons. \n" - + "") - .build(); + .set(false) + .comment("" + + "Should Distant Horizons silently, automatically download and install new versions? \n" + + "This setting is force disabled on dedicated servers for stability reasons. \n" + + "") + .build(); public static ConfigEntry updateBranch = new ConfigEntry.Builder() - .set(EDhApiUpdateBranch.AUTO) - .comment("" - + "If DH should use the nightly (provided by Gitlab), or stable (provided by Modrinth) build. \n" - + "If ["+EDhApiUpdateBranch.AUTO+"] is selected DH will update to new stable releases if the current jar is a stable jar \n" - + "and will update to new nightly builds if the current jar is a nightly jar (IE the version number ends in '-dev')." - + "") - .build(); + .set(EDhApiUpdateBranch.AUTO) + .comment("" + + "If DH should use the nightly (provided by Gitlab), or stable (provided by Modrinth) build. \n" + + "If [" + EDhApiUpdateBranch.AUTO + "] is selected DH will update to new stable releases if the current jar is a stable jar \n" + + "and will update to new nightly builds if the current jar is a nightly jar (IE the version number ends in '-dev')." + + "") + .build(); + } public static class Multiplayer @@ -864,16 +864,16 @@ public class Config public static ConfigUIComment multiplayerHeader = new ConfigUIComment.Builder().setParentConfigClass(Multiplayer.class).build(); public static ConfigEntry serverFolderNameMode = new ConfigEntry.Builder() - .set(EDhApiServerFolderNameMode.NAME_ONLY) - .comment("" - + "How should multiplayer save folders should be named? \n" - + "\n" - + EDhApiServerFolderNameMode.NAME_ONLY + ": Example: \"Minecraft Server\" \n" - + EDhApiServerFolderNameMode.IP_ONLY + ": Example: \"192.168.1.40\" \n" - + EDhApiServerFolderNameMode.NAME_IP + ": Example: \"Minecraft Server IP 192.168.1.40\" \n" - + EDhApiServerFolderNameMode.NAME_IP_PORT + ": Example: \"Minecraft Server IP 192.168.1.40:25565\"" - + EDhApiServerFolderNameMode.NAME_IP_PORT_MC_VERSION + ": Example: \"Minecraft Server IP 192.168.1.40:25565 GameVersion 1.16.5\"") - .build(); + .set(EDhApiServerFolderNameMode.NAME_ONLY) + .comment("" + + "How should multiplayer save folders should be named? \n" + + "\n" + + EDhApiServerFolderNameMode.NAME_ONLY + ": Example: \"Minecraft Server\" \n" + + EDhApiServerFolderNameMode.IP_ONLY + ": Example: \"192.168.1.40\" \n" + + EDhApiServerFolderNameMode.NAME_IP + ": Example: \"Minecraft Server IP 192.168.1.40\" \n" + + EDhApiServerFolderNameMode.NAME_IP_PORT + ": Example: \"Minecraft Server IP 192.168.1.40:25565\"" + + EDhApiServerFolderNameMode.NAME_IP_PORT_MC_VERSION + ": Example: \"Minecraft Server IP 192.168.1.40:25565 GameVersion 1.16.5\"") + .build(); } @@ -882,27 +882,29 @@ public class Config public static ConfigUIComment debuggingHeader = new ConfigUIComment.Builder().setParentConfigClass(Debugging.class).build(); public static ConfigEntry rendererMode = new ConfigEntry.Builder() - .set(EDhApiRendererMode.DEFAULT) - .comment("" - + "What renderer is active? \n" - + "\n" - + EDhApiRendererMode.DEFAULT + ": Default lod renderer \n" - + EDhApiRendererMode.DEBUG_TRIANGLE + ": Debug testing renderer \n" - + EDhApiRendererMode.DISABLED + ": Disable rendering") - .build(); + .set(EDhApiRendererMode.DEFAULT) + .comment("" + + "What renderer is active? \n" + + "\n" + + EDhApiRendererMode.DEFAULT + ": Default lod renderer \n" + + EDhApiRendererMode.DEBUG_TRIANGLE + ": Debug testing renderer \n" + + EDhApiRendererMode.DISABLED + ": Disable rendering") + .build(); public static ConfigEntry debugRenderingColors = new ConfigEntry.Builder() - .set(EDhApiDebugRendering.OFF) - .comment("" - + "Should specialized colors/rendering modes be used? \n" - + "\n" - + EDhApiDebugRendering.OFF + ": LODs will be drawn with their normal colors. \n" - + EDhApiDebugRendering.SHOW_DETAIL + ": LODs' color will be based on their detail level. \n" - + EDhApiDebugRendering.SHOW_BLOCK_MATERIAL + ": LODs' color will be based on their material. \n" - + EDhApiDebugRendering.SHOW_OVERLAPPING_QUADS + ": LODs will be drawn with total white, but overlapping quads will be drawn with red. \n" - + "") - .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) - .build(); + .set(EDhApiDebugRendering.OFF) + .comment("" + + "Should specialized colors/rendering modes be used? \n" + + "\n" + + EDhApiDebugRendering.OFF + ": LODs will be drawn with their normal colors. \n" + + EDhApiDebugRendering.SHOW_DETAIL + ": LODs' color will be based on their detail level. \n" + + EDhApiDebugRendering.SHOW_BLOCK_MATERIAL + ": LODs' color will be based on their material. \n" + + EDhApiDebugRendering.SHOW_OVERLAPPING_QUADS + ": LODs will be drawn with total white, but overlapping quads will be drawn with red. \n" + + "") + .addListener(ReloadLodsConfigEventHandler.DELAYED_INSTANCE) + .build(); + + public static ConfigUISpacer debugRenderingSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry enableWhiteWorld = new ConfigEntry.Builder() .set(false) @@ -912,21 +914,31 @@ public class Config .build(); public static ConfigEntry lodOnlyMode = new ConfigEntry.Builder() - .set(false) - .comment("" - + "If enabled this will disable (most) vanilla Minecraft rendering. \n" - + "\n" - + "NOTE: Do not report any issues when this mode is on! \n" - + " This setting is only for fun and debugging. \n" - + " Mod compatibility is not guaranteed.") - .build(); + .set(false) + .comment("" + + "If enabled this will disable (most) vanilla Minecraft rendering. \n" + + "\n" + + "NOTE: Do not report any issues when this mode is on! \n" + + " This setting is only for fun and debugging. \n" + + " Mod compatibility is not guaranteed.") + .build(); public static ConfigEntry renderWireframe = new ConfigEntry.Builder() - .set(false) - .comment("" - + "If enabled the LODs will render as wireframe." - + "") - .build(); + .set(false) + .comment("" + + "If enabled the LODs will render as wireframe." + + "") + .build(); + + public static ConfigEntry showOverlappingQuadErrors = new ConfigEntry.Builder() + .set(false) + .comment("" + + "If true overlapping quads will be rendered as bright red for easy identification. \n" + + "If false the quads will be rendered normally. \n" + + "") + .build(); + + public static ConfigUISpacer miscSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry enableDebugKeybindings = new ConfigEntry.Builder() .set(false) @@ -938,28 +950,24 @@ public class Config + "") .build(); - public static ConfigEntry showOverlappingQuadErrors = new ConfigEntry.Builder() - .set(false) - .comment("" - + "If true overlapping quads will be rendered as bright red for easy identification. \n" - + "If false the quads will be rendered normally. \n" - + "") - .build(); - public static ConfigEntry logBufferGarbageCollection = new ConfigEntry.Builder() - .set(false) - .comment("" - + "If true OpenGL Buffer garbage collection will be logged \n" - + "this also includes the number of live buffers. \n" - + "") - .build(); + .set(false) + .comment("" + + "If true OpenGL Buffer garbage collection will be logged \n" + + "this also includes the number of live buffers. \n" + + "") + .build(); + + public static ConfigUISpacer unsafeSpacer = new ConfigUISpacer.Builder().build(); // Note: This will reset on game restart, and should have a warning on the tooltip public static ConfigEntry allowUnsafeValues = new ConfigEntry.Builder() - .set(false) - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(UnsafeValuesConfigListener.INSTANCE) - .build(); + .set(false) + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(UnsafeValuesConfigListener.INSTANCE) + .build(); + + public static ConfigUISpacer categorySpacer = new ConfigUISpacer.Builder().build(); public static ConfigCategory debugWireframe = new ConfigCategory.Builder().set(DebugWireframe.class).build(); public static ConfigCategory openGl = new ConfigCategory.Builder().set(OpenGl.class).build(); @@ -975,40 +983,42 @@ public class Config public static ConfigUIComment debugWireframeHeader = new ConfigUIComment.Builder().setParentConfigClass(DebugWireframe.class).build(); public static ConfigEntry enableRendering = new ConfigEntry.Builder() - .set(false) - .comment("" - + "If enabled, various wireframes for debugging internal functions will be drawn. \n" - + "\n" - + "NOTE: There WILL be performance hit! \n" - + " Additionally, only stuff that's loaded after you enable this \n" - + " will render their debug wireframes. \n" - + "") - .build(); + .set(false) + .comment("" + + "If enabled, various wireframes for debugging internal functions will be drawn. \n" + + "\n" + + "NOTE: There WILL be performance hit! \n" + + " Additionally, only stuff that's loaded after you enable this \n" + + " will render their debug wireframes. \n" + + "") + .build(); + + public static ConfigUISpacer wireframeOptionSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry showWorldGenQueue = new ConfigEntry.Builder() - .set(false) - .comment("Render queued world gen tasks?") - .build(); + .set(false) + .comment("Render queued world gen tasks?") + .build(); public static ConfigEntry showNetworkSyncOnLoadQueue = new ConfigEntry.Builder() - .set(false) - .comment("Render queued network sync on load tasks?") - .build(); + .set(false) + .comment("Render queued network sync on load tasks?") + .build(); public static ConfigEntry showRenderSectionStatus = new ConfigEntry.Builder() - .set(false) - .comment("Render LOD section status?") - .build(); + .set(false) + .comment("Render LOD section status?") + .build(); public static ConfigEntry showQuadTreeRenderStatus = new ConfigEntry.Builder() - .set(false) - .comment("Render Quad Tree Rendering status?") - .build(); + .set(false) + .comment("Render Quad Tree Rendering status?") + .build(); public static ConfigEntry showFullDataUpdateStatus = new ConfigEntry.Builder() - .set(false) - .comment("Render full data update/lock status?") - .build(); + .set(false) + .comment("Render full data update/lock status?") + .build(); } @@ -1017,39 +1027,39 @@ public class Config public static ConfigUIComment openGlHeader = new ConfigUIComment.Builder().setParentConfigClass(OpenGl.class).build(); public static ConfigEntry overrideVanillaGLLogger = new ConfigEntry.Builder() - .set(true) - .comment("" - + "Defines how OpenGL errors are handled. \n " - + "Requires rebooting Minecraft to change. \n" - + "Will catch OpenGL errors thrown by other mods. \n" - + "") - .build(); + .set(true) + .comment("" + + "Defines how OpenGL errors are handled. \n " + + "Requires rebooting Minecraft to change. \n" + + "Will catch OpenGL errors thrown by other mods. \n" + + "") + .build(); public static ConfigEntry onlyLogGlErrorsOnce = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If true each Open GL error will only be logged once. \n" - + "Enabling this may cause some error logs to be missed. \n" - + "Does nothing if overrideVanillaGLLogger is set to false. \n" - + " \n" - + "Generally this can be kept as 'true' to prevent log spam. \n" - + "However, Please set this to 'false' if a developer needs your log to debug a GL issue. \n" - + "") - .build(); + .set(true) + .comment("" + + "If true each Open GL error will only be logged once. \n" + + "Enabling this may cause some error logs to be missed. \n" + + "Does nothing if overrideVanillaGLLogger is set to false. \n" + + " \n" + + "Generally this can be kept as 'true' to prevent log spam. \n" + + "However, Please set this to 'false' if a developer needs your log to debug a GL issue. \n" + + "") + .build(); public static ConfigEntry glErrorHandlingMode = new ConfigEntry.Builder() - .set(ModInfo.IS_DEV_BUILD ? EDhApiGLErrorHandlingMode.LOG : EDhApiGLErrorHandlingMode.IGNORE) - .comment("" - + "Defines how OpenGL errors are handled. \n" - + "May incorrectly catch OpenGL errors thrown by other mods. \n" - + "\n" - + EDhApiGLErrorHandlingMode.IGNORE + ": Do nothing. \n" - + EDhApiGLErrorHandlingMode.LOG + ": write an error to the log. \n" - + EDhApiGLErrorHandlingMode.LOG_THROW + ": write to the log and throw an exception. \n" - + " Warning: this should only be enabled when debugging the LOD renderer \n" - + " as it may break Minecraft's renderer when an exception is thrown. \n" - + "") - .build(); + .set(ModInfo.IS_DEV_BUILD ? EDhApiGLErrorHandlingMode.LOG : EDhApiGLErrorHandlingMode.IGNORE) + .comment("" + + "Defines how OpenGL errors are handled. \n" + + "May incorrectly catch OpenGL errors thrown by other mods. \n" + + "\n" + + EDhApiGLErrorHandlingMode.IGNORE + ": Do nothing. \n" + + EDhApiGLErrorHandlingMode.LOG + ": write an error to the log. \n" + + EDhApiGLErrorHandlingMode.LOG_THROW + ": write to the log and throw an exception. \n" + + " Warning: this should only be enabled when debugging the LOD renderer \n" + + " as it may break Minecraft's renderer when an exception is thrown. \n" + + "") + .build(); } @@ -1058,48 +1068,50 @@ public class Config public static ConfigUIComment columnBuilderDebuggingHeader = new ConfigUIComment.Builder().setParentConfigClass(ColumnBuilderDebugging.class).build(); public static ConfigEntry columnBuilderDebugEnable = new ConfigEntry.Builder() - .set(false) - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) - .build(); + .set(false) + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) + .build(); public static ConfigEntry columnBuilderDebugDetailLevel = new ConfigEntry.Builder() - .set((int) DhSectionPos.SECTION_MINIMUM_DETAIL_LEVEL) - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) - .build(); + .set((int) DhSectionPos.SECTION_MINIMUM_DETAIL_LEVEL) + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) + .build(); public static ConfigEntry columnBuilderDebugXPos = new ConfigEntry.Builder() - .set(0) - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) - .build(); + .set(0) + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) + .build(); public static ConfigEntry columnBuilderDebugZPos = new ConfigEntry.Builder() - .set(0) - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) - .build(); + .set(0) + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) + .build(); + + public static ConfigUISpacer subLodSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry columnBuilderDebugXRow = new ConfigEntry.Builder() - .set(-1) - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) - .build(); + .set(-1) + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) + .build(); public static ConfigEntry columnBuilderDebugZRow = new ConfigEntry.Builder() - .set(-1) - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) - .build(); + .set(-1) + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) + .build(); public static ConfigEntry columnBuilderDebugColumnIndex = new ConfigEntry.Builder() - .set(-1) - .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) - .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) - .build(); + .set(-1) + .setAppearance(EConfigEntryAppearance.ONLY_IN_GUI) + .addListener(ReloadLodsConfigEventHandler.INSTANT_INSTANCE) + .build(); } public static class PositionFinder { //public static ConfigUIComment positionFinderHeader = new ConfigUIComment.Builder().setParentConfigClass(ColumnBuilderDebugging.class).build(); - + public static ConfigEntry positionFinderEnable = new ConfigEntry.Builder() .set(false) .build(); @@ -1133,50 +1145,50 @@ public class Config public static ConfigUIComment f3ScreenHeader = new ConfigUIComment.Builder().setParentConfigClass(F3Screen.class).build(); public static ConfigEntry showPlayerPos = new ConfigEntry.Builder() - .set(true) - .comment("Shows the player's LOD position.") - .build(); + .set(true) + .comment("Shows the player's LOD position.") + .build(); public static ConfigEntry playerPosSectionDetailLevel = new ConfigEntry.Builder() - .setMinDefaultMax(6, 6, 16) - .comment("" + - "Defines what internal detail level the player position will be shown as. \n" + - "Internal detail level means: 6 = 1x1 block, 7 = 2x2 blocks, etc. \n" + - "") - .build(); + .setMinDefaultMax(6, 6, 16) + .comment("" + + "Defines what internal detail level the player position will be shown as. \n" + + "Internal detail level means: 6 = 1x1 block, 7 = 2x2 blocks, etc. \n" + + "") + .build(); public static ConfigEntry showThreadPools = new ConfigEntry.Builder() - .set(true) - .comment("Shows info about each thread pool.") - .build(); + .set(true) + .comment("Shows info about each thread pool.") + .build(); public static ConfigEntry showRenderThreadTasks = new ConfigEntry.Builder() - .set(false) - .comment("Shows info about the render thread tasks.") - .build(); + .set(false) + .comment("Shows info about the render thread tasks.") + .build(); public static ConfigEntry showCombinedObjectPools = new ConfigEntry.Builder() - .set(false) - .comment("Shows the combined memory use and array counts for all DH pooled objects.") - .build(); + .set(false) + .comment("Shows the combined memory use and array counts for all DH pooled objects.") + .build(); public static ConfigEntry showSeparatedObjectPools = new ConfigEntry.Builder() - .set(false) - .comment("Shows the memory use and array counts for each DH object pool.") - .build(); + .set(false) + .comment("Shows the memory use and array counts for each DH object pool.") + .build(); public static ConfigEntry showQueuedChunkUpdateCount = new ConfigEntry.Builder() - .set(true) - .comment("Shows how many chunks are queued for processing and the max count that can be queued.") - .build(); + .set(true) + .comment("Shows how many chunks are queued for processing and the max count that can be queued.") + .build(); public static ConfigEntry showLevelStatus = new ConfigEntry.Builder() - .set(true) - .comment("Shows what levels are loaded and world gen/rendering info about those levels.") - .build(); + .set(true) + .comment("Shows what levels are loaded and world gen/rendering info about those levels.") + .build(); public static ConfigEntry onlyShowRenderingLevels = new ConfigEntry.Builder() - .set(true) - .comment("Only show levels that DH is actively rendering.") - .build(); + .set(true) + .comment("Only show levels that DH is actively rendering.") + .build(); } @@ -1191,50 +1203,50 @@ public class Config public static ConfigUIComment debugConfigScreenNote = new ConfigUIComment.Builder().setTextPosition(EConfigCommentTextPosition.CENTER_OF_SCREEN).build(); public static ConfigEntry boolTest = new ConfigEntry.Builder() - .set(false) - .build(); + .set(false) + .build(); public static ConfigEntry byteTest = new ConfigEntry.Builder() - .set((byte) 8) - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently - .build(); + .set((byte) 8) + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently + .build(); public static ConfigEntry intTest = new ConfigEntry.Builder() - .set(69420) - .build(); + .set(69420) + .build(); public static ConfigEntry doubleTest = new ConfigEntry.Builder() - .set(420.69d) - .build(); + .set(420.69d) + .build(); public static ConfigEntry shortTest = new ConfigEntry.Builder() - .set((short) 69) - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently - .build(); + .set((short) 69) + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently + .build(); public static ConfigEntry longTest = new ConfigEntry.Builder() - .set(42069L) - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently - .build(); + .set(42069L) + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently + .build(); public static ConfigEntry floatTest = new ConfigEntry.Builder() - .set(0.42069f) - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently - .build(); + .set(0.42069f) + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently + .build(); public static ConfigEntry stringTest = new ConfigEntry.Builder() - .set("Test input box") - .build(); + .set("Test input box") + .build(); public static ConfigEntry> listTest = new ConfigEntry.Builder>() - .set(new ArrayList(Arrays.asList("option 1", "option 2", "option 3"))) - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently - .build(); + .set(new ArrayList(Arrays.asList("option 1", "option 2", "option 3"))) + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently + .build(); public static ConfigEntry> mapTest = new ConfigEntry.Builder>() - .set(new HashMap()) - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently - .build(); + .set(new HashMap()) + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // no GUI renderer set up currently + .build(); public static ConfigUIButton uiButtonTest = new ConfigUIButton(() -> { @@ -1253,8 +1265,8 @@ public class Config public static ConfigCategory categoryTest = new ConfigCategory.Builder().set(CategoryTest.class).build(); public static ConfigEntry linkableTest = new ConfigEntry.Builder() - .set(420) - .build(); + .set(420) + .build(); public static class CategoryTest @@ -1263,10 +1275,13 @@ public class Config public static ConfigUiLinkedEntry linkableTest = new ConfigUiLinkedEntry(ExampleConfigScreen.linkableTest); } + } } + } + } public static class Common @@ -1276,93 +1291,95 @@ public class Config public static ConfigUIComment worldGeneratorHeader = new ConfigUIComment.Builder().setParentConfigClass(WorldGenerator.class).build(); public static ConfigEntry enableDistantGeneration = new ConfigEntry.Builder() - .setChatCommandName("generation.enable") - .set(true) - .comment("" - + " Should Distant Horizons slowly generate LODs \n" - + " outside the vanilla render distance? \n" - + "Depending on the generator mode, this will import existing chunks \n" - + "and/or generating missing chunks." - + "") - .build(); + .setChatCommandName("generation.enable") + .set(true) + .comment("" + + " Should Distant Horizons slowly generate LODs \n" + + " outside the vanilla render distance? \n" + + "Depending on the generator mode, this will import existing chunks \n" + + "and/or generating missing chunks." + + "") + .build(); public static ConfigEntry distantGeneratorMode = new ConfigEntry.Builder() - .setChatCommandName("generation.mode") - .set(EDhApiDistantGeneratorMode.FEATURES) - .comment("" - + "How detailed should LODs be generated outside the vanilla render distance? \n" - + "\n" - + EDhApiDistantGeneratorMode.PRE_EXISTING_ONLY + " \n" - + "Only create LOD data for already generated chunks. \n" - + "\n" - //not currently implemented - //+ EDhApiDistantGeneratorMode.BIOME_ONLY + " \n" - //+ "Only generate the biomes and use the biome's \n" - //+ "grass color, water color, or snow color. \n" - //+ "Doesn't generate height, everything is shown at sea level. \n" - //+ "- Fastest \n" - //+ "\n" - //+ EDhApiDistantGeneratorMode.BIOME_ONLY_SIMULATE_HEIGHT + " \n" - //+ "Same as " + EDhApiDistantGeneratorMode.BIOME_ONLY + ", except instead \n" - //+ "of always using sea level as the LOD height \n" - //+ "different biome types (mountain, ocean, forest, etc.) \n" - //+ "use predetermined heights to simulate having height data. \n" - //+ "- Fastest \n" - + "\n" - + EDhApiDistantGeneratorMode.SURFACE + " \n" - + "Generate the world surface, \n" - + "this does NOT include trees, \n" - + "or structures. \n" - + "\n" - + EDhApiDistantGeneratorMode.FEATURES + " \n" - + "Generate everything except structures. \n" - + "WARNING: This may cause world generator bugs or instability when paired with certain world generator mods. \n" - + "\n" - + EDhApiDistantGeneratorMode.INTERNAL_SERVER + " \n" - + "Ask the local server to generate/load each chunk. \n" - + "This is the most compatible and will generate structures correctly, \n" - + "but may cause server/simulation lag. \n" - + "Note: unlike other modes this option DOES save generated chunks to \n" - + "Minecraft's region files. \n" - + "") - .build(); + .setChatCommandName("generation.mode") + .set(EDhApiDistantGeneratorMode.FEATURES) + .comment("" + + "How detailed should LODs be generated outside the vanilla render distance? \n" + + "\n" + + EDhApiDistantGeneratorMode.PRE_EXISTING_ONLY + " \n" + + "Only create LOD data for already generated chunks. \n" + + "\n" + //not currently implemented + //+ EDhApiDistantGeneratorMode.BIOME_ONLY + " \n" + //+ "Only generate the biomes and use the biome's \n" + //+ "grass color, water color, or snow color. \n" + //+ "Doesn't generate height, everything is shown at sea level. \n" + //+ "- Fastest \n" + //+ "\n" + //+ EDhApiDistantGeneratorMode.BIOME_ONLY_SIMULATE_HEIGHT + " \n" + //+ "Same as " + EDhApiDistantGeneratorMode.BIOME_ONLY + ", except instead \n" + //+ "of always using sea level as the LOD height \n" + //+ "different biome types (mountain, ocean, forest, etc.) \n" + //+ "use predetermined heights to simulate having height data. \n" + //+ "- Fastest \n" + + "\n" + + EDhApiDistantGeneratorMode.SURFACE + " \n" + + "Generate the world surface, \n" + + "this does NOT include trees, \n" + + "or structures. \n" + + "\n" + + EDhApiDistantGeneratorMode.FEATURES + " \n" + + "Generate everything except structures. \n" + + "WARNING: This may cause world generator bugs or instability when paired with certain world generator mods. \n" + + "\n" + + EDhApiDistantGeneratorMode.INTERNAL_SERVER + " \n" + + "Ask the local server to generate/load each chunk. \n" + + "This is the most compatible and will generate structures correctly, \n" + + "but may cause server/simulation lag. \n" + + "Note: unlike other modes this option DOES save generated chunks to \n" + + "Minecraft's region files. \n" + + "") + .build(); + + public static ConfigUISpacer genProgressSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry showGenerationProgress = new ConfigEntry.Builder() - .set(EDhApiDistantGeneratorProgressDisplayLocation.DISABLED) - .comment("" - + "How should distant generator progress be displayed? \n" - + "\n" - + EDhApiDistantGeneratorProgressDisplayLocation.OVERLAY + ": may be the same as "+EDhApiDistantGeneratorProgressDisplayLocation.CHAT+" for some Minecraft versions \n" - + EDhApiDistantGeneratorProgressDisplayLocation.CHAT + " \n" - + EDhApiDistantGeneratorProgressDisplayLocation.LOG + " \n" - + EDhApiDistantGeneratorProgressDisplayLocation.DISABLED + " \n" - + "") - .build(); + .set(EDhApiDistantGeneratorProgressDisplayLocation.DISABLED) + .comment("" + + "How should distant generator progress be displayed? \n" + + "\n" + + EDhApiDistantGeneratorProgressDisplayLocation.OVERLAY + ": may be the same as " + EDhApiDistantGeneratorProgressDisplayLocation.CHAT + " for some Minecraft versions \n" + + EDhApiDistantGeneratorProgressDisplayLocation.CHAT + " \n" + + EDhApiDistantGeneratorProgressDisplayLocation.LOG + " \n" + + EDhApiDistantGeneratorProgressDisplayLocation.DISABLED + " \n" + + "") + .build(); public static ConfigEntry generationProgressDisplayIntervalInSeconds = new ConfigEntry.Builder() - .setChatCommandName("generation.logInterval") - .setMinDefaultMax(1, 2, 60 * 60 * 4) // max = 4 hours - .comment("" - + "How often should the distant generator progress be displayed? \n" - + "") - .build(); + .setChatCommandName("generation.logInterval") + .setMinDefaultMax(1, 2, 60 * 60 * 4) // max = 4 hours + .comment("" + + "How often should the distant generator progress be displayed? \n" + + "") + .build(); public static ConfigEntry generationProgressDisableMessageDisplayTimeInSeconds = new ConfigEntry.Builder() - .setMinDefaultMax(0, 20, 60 * 60) // max = 1 hour - .comment("" - + "For how many seconds should instructions for disabling the distant generator progress be displayed? \n" - + "Setting this to 0 hides the instructional message so the world gen progress is shown immediately when it starts. \n" - + "") - .build(); + .setMinDefaultMax(0, 20, 60 * 60) // max = 1 hour + .comment("" + + "For how many seconds should instructions for disabling the distant generator progress be displayed? \n" + + "Setting this to 0 hides the instructional message so the world gen progress is shown immediately when it starts. \n" + + "") + .build(); public static ConfigEntry generationProgressIncludeChunksPerSecond = new ConfigEntry.Builder() - .set(true) - .comment("" - + "When logging generation progress also include the rate at which chunks \n" - + "are being generated. \n" - + "This can be useful for troubleshooting performance. \n" - + "") - .build(); + .set(true) + .comment("" + + "When logging generation progress also include the rate at which chunks \n" + + "are being generated. \n" + + "This can be useful for troubleshooting performance. \n" + + "") + .build(); public static ConfigEntry generationCenterChunkX = new ConfigEntry.Builder() .setChatCommandName("generation.bounds.centerChunk.x") @@ -1402,48 +1419,48 @@ public class Config public static ConfigUIComment lodBuildingHeader = new ConfigUIComment.Builder().setParentConfigClass(LodBuilding.class).build(); public static ConfigEntry disableUnchangedChunkCheck = new ConfigEntry.Builder() - .set(false) - // enabling this can be quite detrimental to performance, - // so hiding it in the config file should reduce people accidentally enabling it - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) - .comment("" - + "Enabling this will drastically increase chunk processing time\n" - + "and you may need to increase your CPU load to handle it.\n" - + "\n" - + "Normally DH will attempt to skip creating LODs for chunks it's already seen\n" - + "and that haven't changed.\n" - + "\n" - + "However sometimes that logic incorrectly prevents LODs from being updated.\n" - + "Disabling this check may fix issues where LODs aren't updated after\n" - + "blocks have been changed.\n" - + "") - .build(); + .set(false) + // enabling this can be quite detrimental to performance, + // so hiding it in the config file should reduce people accidentally enabling it + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) + .comment("" + + "Enabling this will drastically increase chunk processing time\n" + + "and you may need to increase your CPU load to handle it.\n" + + "\n" + + "Normally DH will attempt to skip creating LODs for chunks it's already seen\n" + + "and that haven't changed.\n" + + "\n" + + "However sometimes that logic incorrectly prevents LODs from being updated.\n" + + "Disabling this check may fix issues where LODs aren't updated after\n" + + "blocks have been changed.\n" + + "") + .build(); public static ConfigEntry dataCompression = new ConfigEntry.Builder() - .set(EDhApiDataCompressionMode.Z_STD_BLOCK) - // only visible via the API since there is no reason to use any compressor except ZStandard as of 2025-11-24 - .setAppearance(EConfigEntryAppearance.ONLY_IN_API) - .build(); + .set(EDhApiDataCompressionMode.Z_STD_BLOCK) + // only visible via the API since there is no reason to use any compressor except ZStandard as of 2025-11-24 + .setAppearance(EConfigEntryAppearance.ONLY_IN_API) + .build(); public static ConfigEntry worldCompression = new ConfigEntry.Builder() - .set(EDhApiWorldCompressionMode.VISUALLY_EQUAL) - .comment("" - + "How should block data be compressed when creating LOD data? \n" - + "This setting will only affect new or updated LOD data, \n" - + "any data already generated when this setting is changed will be\n" - + "unaffected until it is modified or re-loaded.\n" - + "\n" - + EDhApiWorldCompressionMode.MERGE_SAME_BLOCKS + " \n" - + "Every block/biome change is recorded in the database. \n" - + "This is what DH 2.0 and 2.0.1 all used by default and will store a lot of data. \n" - + "Expected Compression Ratio: 1.0\n" - + "\n" - + EDhApiWorldCompressionMode.VISUALLY_EQUAL + " \n" - + "Only visible block/biome changes are recorded in the database. \n" - + "Hidden blocks (IE ores) are ignored. \n" - + "Expected Compression Ratio: 0.7\n" - + "") - .build(); + .set(EDhApiWorldCompressionMode.VISUALLY_EQUAL) + .comment("" + + "How should block data be compressed when creating LOD data? \n" + + "This setting will only affect new or updated LOD data, \n" + + "any data already generated when this setting is changed will be\n" + + "unaffected until it is modified or re-loaded.\n" + + "\n" + + EDhApiWorldCompressionMode.MERGE_SAME_BLOCKS + " \n" + + "Every block/biome change is recorded in the database. \n" + + "This is what DH 2.0 and 2.0.1 all used by default and will store a lot of data. \n" + + "Expected Compression Ratio: 1.0\n" + + "\n" + + EDhApiWorldCompressionMode.VISUALLY_EQUAL + " \n" + + "Only visible block/biome changes are recorded in the database. \n" + + "Hidden blocks (IE ores) are ignored. \n" + + "Expected Compression Ratio: 0.7\n" + + "") + .build(); public static ConfigCategory experimental = new ConfigCategory.Builder().set(Experimental.class).build(); @@ -1454,21 +1471,22 @@ public class Config public static ConfigUIComment experimentalHeader = new ConfigUIComment.Builder().setParentConfigClass(Experimental.class).build(); public static ConfigEntry upsampleLowerDetailLodsToFillHoles = new ConfigEntry.Builder() - .set(false) - .comment("" - + "When active DH will attempt to fill missing LOD data \n" - + "with any data that is present in the tree, preventing holes when moving \n" - + "when a N-sized generator (or server) is active. \n" - + "\n" - + "This is only used when N-sized world generation is available \n" - + "and/or when on a server where [generateOnlyInHighestDetail] is false. \n" - + "\n" - + "Experimental:\n" - + "Enabling this option will increase CPU and harddrive use\n" - + "and may cause rendering bugs.\n" - + "\n" - + "") - .build(); + .set(false) + .comment("" + + "When active DH will attempt to fill missing LOD data \n" + + "with any data that is present in the tree, preventing holes when moving \n" + + "when a N-sized generator (or server) is active. \n" + + "\n" + + "This is only used when N-sized world generation is available \n" + + "and/or when on a server where [generateOnlyInHighestDetail] is false. \n" + + "\n" + + "Experimental:\n" + + "Enabling this option will increase CPU and harddrive use\n" + + "and may cause rendering bugs.\n" + + "\n" + + "") + .build(); + } } @@ -1478,27 +1496,27 @@ public class Config public static ConfigUIComment multiThreadingHeader = new ConfigUIComment.Builder().setParentConfigClass(MultiThreading.class).build(); public static final ConfigEntry numberOfThreads = new ConfigEntry.Builder() - .setChatCommandName("threading.numberOfThreads") - .setMinDefaultMax(1, - ThreadPresetConfigEventHandler.getDefaultThreadCount(), - Runtime.getRuntime().availableProcessors()) - .comment("" - + "How many threads should be used by Distant Horizons? \n" - + "") - .build(); + .setChatCommandName("threading.numberOfThreads") + .setMinDefaultMax(1, + ThreadPresetConfigEventHandler.getDefaultThreadCount(), + Runtime.getRuntime().availableProcessors()) + .comment("" + + "How many threads should be used by Distant Horizons? \n" + + "") + .build(); public static final ConfigEntry threadRunTimeRatio = new ConfigEntry.Builder() - .setChatCommandName("threading.threadRunTimeRatio") - .setMinDefaultMax(0.01, ThreadPresetConfigEventHandler.getDefaultRunTimeRatio(), 1.0) - .comment("" - + "A value between 1.0 and 0.0 that represents the percentage \n" - + "of time each thread can run before going idle. \n" - + "\n" - + "This can be used to reduce CPU usage if the thread count \n" - + "is already set to 1 for the given option, or more finely \n" - + "tune CPU performance. \n" + - "") - .build(); + .setChatCommandName("threading.threadRunTimeRatio") + .setMinDefaultMax(0.01, ThreadPresetConfigEventHandler.getDefaultRunTimeRatio(), 1.0) + .comment("" + + "A value between 1.0 and 0.0 that represents the percentage \n" + + "of time each thread can run before going idle. \n" + + "\n" + + "This can be used to reduce CPU usage if the thread count \n" + + "is already set to 1 for the given option, or more finely \n" + + "tune CPU performance. \n" + + "") + .build(); public static final ConfigEntry threadPriority = new ConfigEntry.Builder() .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) // only in file since this requires a MC reboot to change @@ -1523,76 +1541,78 @@ public class Config public static ConfigEntry globalFileMaxLevel = new ConfigEntry.Builder() - .setChatCommandName("logging.globalFileMaxLevel") - .set(EDhApiLoggerLevel.INFO) - .comment("" - + "" - + "") - .build(); + .setChatCommandName("logging.globalFileMaxLevel") + .set(EDhApiLoggerLevel.INFO) + .comment("" + + "" + + "") + .build(); public static ConfigEntry globalChatMaxLevel = new ConfigEntry.Builder() - .setChatCommandName("logging.globalChatMaxLevel") - .set(EDhApiLoggerLevel.ERROR) - .comment("" - + "" - + "") - .build(); + .setChatCommandName("logging.globalChatMaxLevel") + .set(EDhApiLoggerLevel.ERROR) + .comment("" + + "" + + "") + .build(); public static ConfigUISpacer globalLoggingSpacer = new ConfigUISpacer.Builder().build(); public static ConfigEntry logWorldGenEventToFile = new ConfigEntry.Builder() - .setChatCommandName("logging.logWorldGenEvent") - .set(EDhApiLoggerLevel.INFO) - .comment("" - + "If enabled, the mod will log information about the world generation process. \n" - + "This can be useful for debugging.") - .build(); + .setChatCommandName("logging.logWorldGenEvent") + .set(EDhApiLoggerLevel.INFO) + .comment("" + + "If enabled, the mod will log information about the world generation process. \n" + + "This can be useful for debugging.") + .build(); public static ConfigEntry logWorldGenChunkLoadEventToFile = new ConfigEntry.Builder() - .setChatCommandName("logging.logWorldGenLoadEvent") - .set(EDhApiLoggerLevel.INFO) - .comment("" - + "If enabled, the mod will log information about the world generation process. \n" - + "This can be useful for debugging.") - .build(); + .setChatCommandName("logging.logWorldGenLoadEvent") + .set(EDhApiLoggerLevel.INFO) + .comment("" + + "If enabled, the mod will log information about the world generation process. \n" + + "This can be useful for debugging.") + .build(); public static ConfigEntry logRendererEventToFile = new ConfigEntry.Builder() - .set(EDhApiLoggerLevel.INFO) - .comment("" - + "If enabled, the mod will log information about the renderer setup, cleanup, and any issues it may encounter. \n" - + "This can be useful for debugging.") - .build(); + .set(EDhApiLoggerLevel.INFO) + .comment("" + + "If enabled, the mod will log information about the renderer setup, cleanup, and any issues it may encounter. \n" + + "This can be useful for debugging.") + .build(); public static ConfigEntry logRendererGLEventToFile = new ConfigEntry.Builder() - .set(EDhApiLoggerLevel.INFO) - .comment("" - + "If enabled, the mod will log information about the renderer OpenGL process. \n" - + "This can be useful for debugging.") - .build(); + .set(EDhApiLoggerLevel.INFO) + .comment("" + + "If enabled, the mod will log information about the renderer OpenGL process. \n" + + "This can be useful for debugging.") + .build(); public static ConfigEntry logRendererGLEventToChat = new ConfigEntry.Builder() - .set(EDhApiLoggerLevel.ERROR) - .comment("" - + "If enabled, the mod will log information about the renderer OpenGL process. \n" - + "This can be useful for debugging.") - .build(); + .set(EDhApiLoggerLevel.ERROR) + .comment("" + + "If enabled, the mod will log information about the renderer OpenGL process. \n" + + "This can be useful for debugging.") + .build(); public static ConfigEntry logNetworkEventToFile = new ConfigEntry.Builder() - .setChatCommandName("logging.logNetworkEvent") - .set(EDhApiLoggerLevel.INFO) - .comment("" - + "If enabled, the mod will log information about network operations. \n" - + "This can be useful for debugging.") - .build(); + .setChatCommandName("logging.logNetworkEvent") + .set(EDhApiLoggerLevel.INFO) + .comment("" + + "If enabled, the mod will log information about network operations. \n" + + "This can be useful for debugging.") + .build(); public static ConfigEntry logConnectionConfigChangesToFile = new ConfigEntry.Builder() - .setChatCommandName("logging.logConnectionConfigChanges") - .set(EDhApiLoggerLevel.WARN) - .comment("" - + "If enabled, config changes sent by the server will be logged. \n" - + "") - .build(); + .setChatCommandName("logging.logConnectionConfigChanges") + .set(EDhApiLoggerLevel.WARN) + .comment("" + + "If enabled, config changes sent by the server will be logged. \n" + + "") + .build(); + + public static ConfigUISpacer warningSpacer = new ConfigUISpacer.Builder().build(); public static ConfigCategory warning = new ConfigCategory.Builder().set(Warning.class).build(); @@ -1603,60 +1623,60 @@ public class Config public static ConfigUIComment warningHeader = new ConfigUIComment.Builder().setParentConfigClass(Warning.class).build(); public static ConfigEntry showLowMemoryWarningOnStartup = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If enabled, a chat message will be displayed if Java doesn't have enough \n" - + "memory allocated to run DH well. \n" - + "") - .build(); + .set(true) + .comment("" + + "If enabled, a chat message will be displayed if Java doesn't have enough \n" + + "memory allocated to run DH well. \n" + + "") + .build(); public static ConfigEntry showPoolInsufficientMemoryWarning = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If enabled, a chat message will be displayed if DH detects \n" - + "that any pooled objects have been garbage collected. \n" - + "") - .build(); + .set(true) + .comment("" + + "If enabled, a chat message will be displayed if DH detects \n" + + "that any pooled objects have been garbage collected. \n" + + "") + .build(); public static ConfigEntry showHighVanillaRenderDistanceWarning = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If enabled, a chat message will be displayed if vanilla MC's \n" - + "render distance is higher than the recommended amount. \n" - + "") - .build(); + .set(true) + .comment("" + + "If enabled, a chat message will be displayed if vanilla MC's \n" + + "render distance is higher than the recommended amount. \n" + + "") + .build(); public static ConfigEntry showReplayWarningOnStartup = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If enabled, a chat message will be displayed when a replay is started \n" - + "giving some basic information about how DH will function. \n" - + "") - .build(); + .set(true) + .comment("" + + "If enabled, a chat message will be displayed when a replay is started \n" + + "giving some basic information about how DH will function. \n" + + "") + .build(); public static ConfigEntry showUpdateQueueOverloadedChatWarning = new ConfigEntry.Builder() - .set(false) - .comment("" - + "If enabled, a chat message will be displayed when DH has too many chunks \n" - + "queued for updating. \n" - + "") - .build(); + .set(false) + .comment("" + + "If enabled, a chat message will be displayed when DH has too many chunks \n" + + "queued for updating. \n" + + "") + .build(); public static ConfigEntry showSlowWorldGenSettingWarnings = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If enabled, a chat message will be displayed when DH has too many chunks \n" - + "queued for updating. \n" - + "") - .build(); + .set(true) + .comment("" + + "If enabled, a chat message will be displayed when DH has too many chunks \n" + + "queued for updating. \n" + + "") + .build(); public static ConfigEntry showModCompatibilityWarningsOnStartup = new ConfigEntry.Builder() - .set(true) - .comment("" - + "If enabled, a chat message will be displayed when a potentially problematic \n" - + "mod is installed alongside DH. \n" - + "") - .build(); + .set(true) + .comment("" + + "If enabled, a chat message will be displayed when a potentially problematic \n" + + "mod is installed alongside DH. \n" + + "") + .build(); public static ConfigEntry logGarbageCollectorWarning = new ConfigEntry.Builder() .set(true) @@ -1677,6 +1697,7 @@ public class Config .build(); } + } } @@ -1685,46 +1706,46 @@ public class Config { // Level keys public static ConfigEntry sendLevelKeys = new ConfigEntry.Builder() - .setChatCommandName("levelKeys.send") - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) - .set(true) - .comment("" - + "Makes the server send level keys for each world.\n" - + "Disable this if you use alternative ways to send level keys.\n" - + "") - .build(); + .setChatCommandName("levelKeys.send") + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) + .set(true) + .comment("" + + "Makes the server send level keys for each world.\n" + + "Disable this if you use alternative ways to send level keys.\n" + + "") + .build(); public static ConfigEntry serverId = new ConfigEntry.Builder() - .set(new Random().nextInt()) - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) - .comment("" - + "DO NOT CHANGE UNLESS YOU KNOW WHAT YOU'RE DOING.\n" - + "Autogenerated ID used to prevent multiple independent servers from accidentally\n" - + "writing over each other's LODs when the same serverKey is set on both.\n" - + "") - .build(); + .set(new Random().nextInt()) + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) + .comment("" + + "DO NOT CHANGE UNLESS YOU KNOW WHAT YOU'RE DOING.\n" + + "Autogenerated ID used to prevent multiple independent servers from accidentally\n" + + "writing over each other's LODs when the same serverKey is set on both.\n" + + "") + .build(); public static ConfigEntry serverKey = new ConfigEntry.Builder() - .setChatCommandName("levelKeys.serverKey") - .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) - .set("") - .comment("" - + "Custom server key used which can be used to always reuse the same LOD data folder,\n" - + "for cases when the server doesn't have a static IP for some reason.\n" - + "If this value is empty, the client itself decides which folder name to use.\n" - + "Requires rejoining the server to apply after changing.\n" - + "") - .build(); + .setChatCommandName("levelKeys.serverKey") + .setAppearance(EConfigEntryAppearance.ONLY_IN_FILE) + .set("") + .comment("" + + "Custom server key used which can be used to always reuse the same LOD data folder,\n" + + "for cases when the server doesn't have a static IP for some reason.\n" + + "If this value is empty, the client itself decides which folder name to use.\n" + + "Requires rejoining the server to apply after changing.\n" + + "") + .build(); public static ConfigEntry levelKeyPrefix = new ConfigEntry.Builder() - .setChatCommandName("levelKeys.prefix") - .set("") - .comment("" - + "Prefix of the level keys sent to the clients.\n" - + "If the mod is running behind a proxy, each backend should use a unique value.\n" - + "If this value is empty, level key will be based on the server's seed hash.\n" - + "") - .build(); + .setChatCommandName("levelKeys.prefix") + .set("") + .comment("" + + "Prefix of the level keys sent to the clients.\n" + + "If the mod is running behind a proxy, each backend should use a unique value.\n" + + "If this value is empty, level key will be based on the server's seed hash.\n" + + "") + .build(); // Generation @@ -1738,94 +1759,94 @@ public class Config .build(); public static ConfigEntry generationRequestRateLimit = new ConfigEntry.Builder() - .setChatCommandName("generation.requestRateLimit") - .setMinDefaultMax(1, 20, 100) - .comment("" - + "How many LOD generation requests per second should a client send? \n" - + "Also limits the number of client requests allowed to stay in the server's queue." - + "") - .build(); + .setChatCommandName("generation.requestRateLimit") + .setMinDefaultMax(1, 20, 100) + .comment("" + + "How many LOD generation requests per second should a client send? \n" + + "Also limits the number of client requests allowed to stay in the server's queue." + + "") + .build(); public static ConfigEntry maxGenerationRequestDistance = new ConfigEntry.Builder() - .setChatCommandName("generation.maxRequestDistance") - .setMinDefaultMax(256, 4096, 4096) - .comment("" + - "Defines the distance allowed to generate around the player." + - "") - .build(); + .setChatCommandName("generation.maxRequestDistance") + .setMinDefaultMax(256, 4096, 4096) + .comment("" + + "Defines the distance allowed to generate around the player." + + "") + .build(); // Real-time updates public static ConfigEntry enableRealTimeUpdates = new ConfigEntry.Builder() - .setChatCommandName("realTimeUpdates.enable") - .set(true) - .comment("" - + "If true, clients will receive real-time LOD updates for chunks outside the client's render distance." - + "") - .build(); + .setChatCommandName("realTimeUpdates.enable") + .set(true) + .comment("" + + "If true, clients will receive real-time LOD updates for chunks outside the client's render distance." + + "") + .build(); public static ConfigEntry realTimeUpdateDistanceRadiusInChunks = new ConfigEntry.Builder() - .setChatCommandName("realTimeUpdates.playerDistance") - .setMinDefaultMax(32, 256, 4096) - .comment("" + - "Defines the distance the player will receive updates around." + - "") - .build(); + .setChatCommandName("realTimeUpdates.playerDistance") + .setMinDefaultMax(32, 256, 4096) + .comment("" + + "Defines the distance the player will receive updates around." + + "") + .build(); // Sync on load public static ConfigEntry synchronizeOnLoad = new ConfigEntry.Builder() - .setChatCommandName("syncOnLoad.enable") - .set(true) - .comment("" - + "If true, clients will receive updated LODs when joining or loading new LODs. \n" - + "") - .build(); + .setChatCommandName("syncOnLoad.enable") + .set(true) + .comment("" + + "If true, clients will receive updated LODs when joining or loading new LODs. \n" + + "") + .build(); public static ConfigEntry syncOnLoadRateLimit = new ConfigEntry.Builder() - .setChatCommandName("syncOnLoad.rateLimit") - .setMinDefaultMax(1, 50, 100) - .comment("" - + "How many LOD sync requests per second should a client send? \n" - + "Also limits the amount of player's requests allowed to stay in the server's queue." - + "") - .build(); + .setChatCommandName("syncOnLoad.rateLimit") + .setMinDefaultMax(1, 50, 100) + .comment("" + + "How many LOD sync requests per second should a client send? \n" + + "Also limits the amount of player's requests allowed to stay in the server's queue." + + "") + .build(); public static ConfigEntry maxSyncOnLoadRequestDistance = new ConfigEntry.Builder() - .setChatCommandName("syncOnLoad.maxRequestDistance") - .setMinDefaultMax(256, 4096, 4096) - .comment("" + - "Defines the distance allowed to be synchronized around the player. \n" + - "Should be the same or larger than maxGenerationRequestDistance in most cases." + - "") - .build(); + .setChatCommandName("syncOnLoad.maxRequestDistance") + .setMinDefaultMax(256, 4096, 4096) + .comment("" + + "Defines the distance allowed to be synchronized around the player. \n" + + "Should be the same or larger than maxGenerationRequestDistance in most cases." + + "") + .build(); // Common public static ConfigEntry playerBandwidthLimit = new ConfigEntry.Builder() - .setChatCommandName("common.playerBandwidthLimit") - .setMinDefaultMax(0, 500, 1000000 /* 1 GB/s */) - .comment("" - + "Maximum per-player speed for uploading LODs to the clients, in KB/s.\n" - + "Value of 0 disables the limit." - + "") - .build(); + .setChatCommandName("common.playerBandwidthLimit") + .setMinDefaultMax(0, 500, 1000000 /* 1 GB/s */) + .comment("" + + "Maximum per-player speed for uploading LODs to the clients, in KB/s.\n" + + "Value of 0 disables the limit." + + "") + .build(); public static ConfigEntry globalBandwidthLimit = new ConfigEntry.Builder() - .setChatCommandName("common.globalBandwidthLimit") - .setMinDefaultMax(0, 0, 10000000 /* 10 GB/s */) - .comment("" - + "Maximum global speed for uploading LODs to the clients, in KB/s.\n" - + "Value of 0 disables the limit." - + "") - .build(); + .setChatCommandName("common.globalBandwidthLimit") + .setMinDefaultMax(0, 0, 10000000 /* 10 GB/s */) + .comment("" + + "Maximum global speed for uploading LODs to the clients, in KB/s.\n" + + "Value of 0 disables the limit." + + "") + .build(); public static ConfigEntry enableAdaptiveTransferSpeed = new ConfigEntry.Builder() - .set(false) - .comment("" - + "Enables adaptive transfer speed based on client performance.\n" - + "If true, DH will automatically adjust transfer rate to minimize connection lag.\n" - + "If false, transfer speed will remain fixed.\n" - + "") - .build(); + .set(false) + .comment("" + + "Enables adaptive transfer speed based on client performance.\n" + + "If true, DH will automatically adjust transfer rate to minimize connection lag.\n" + + "If false, transfer speed will remain fixed.\n" + + "") + .build(); public static ConfigCategory experimental = new ConfigCategory.Builder().set(Experimental.class).build(); @@ -1835,14 +1856,15 @@ public class Config public static class Experimental { public static ConfigEntry enableNSizedGeneration = new ConfigEntry.Builder() - .setChatCommandName("generation.nSized") - .set(false) - .comment("" - + "When enabled on the client, this allows loading lower detail levels as needed to speed up terrain generation.\n" - + "This must also be enabled on the server; otherwise, it will have no effect.\n" - + "For better performance when switching LOD detail levels, enabling [upsampleLowerDetailLodsToFillHoles] is recommended.\n" - + "") - .build(); + .setChatCommandName("generation.nSized") + .set(false) + .comment("" + + "When enabled on the client, this allows loading lower detail levels as needed to speed up terrain generation.\n" + + "This must also be enabled on the server; otherwise, it will have no effect.\n" + + "For better performance when switching LOD detail levels, enabling [upsampleLowerDetailLodsToFillHoles] is recommended.\n" + + "") + .build(); + } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java index c0e1c8727..0bc9d726e 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding; +import com.seibel.distanthorizons.api.enums.rendering.EDhApiTransparency; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dataObjects.render.ColumnRenderSource; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; @@ -67,8 +68,7 @@ public class ColumnBox byte skyLightTop = skyLight; byte skyLightBot = RenderDataPointUtil.doesDataPointExist(bottomData) ? RenderDataPointUtil.getLightSky(bottomData) : 0; - boolean transparencyEnabled = Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled; - boolean fakeOceanFloor = Config.Client.Advanced.Graphics.Quality.transparency.get().fakeTransparencyEnabled; + boolean transparencyEnabled = Config.Client.Advanced.Graphics.Quality.transparency.get() == EDhApiTransparency.COMPLETE; boolean isTransparent = ColorUtil.getAlpha(color) < 255 && transparencyEnabled; boolean overVoid = !RenderDataPointUtil.doesDataPointExist(bottomData); @@ -93,24 +93,6 @@ public class ColumnBox } - // fake ocean transparency - if (transparencyEnabled && fakeOceanFloor) - { - if (!isTransparent && isTopTransparent && RenderDataPointUtil.doesDataPointExist(topData)) - { - skyLightTop = (byte) MathUtil.clamp(0, 15 - (RenderDataPointUtil.getYMax(topData) - minY), 15); - yHeight = (short) (RenderDataPointUtil.getYMax(topData) - minY - 1); - } - else if (isTransparent && !isBottomTransparent && RenderDataPointUtil.doesDataPointExist(bottomData)) - { - minY = (short) (minY + yHeight - 1); - yHeight = 1; - } - - maxY = (short) (minY + yHeight); - } - - //==========================// // add top and bottom faces // @@ -279,7 +261,7 @@ public class ColumnBox // determine face visibility/light // //=================================// - boolean transparencyEnabled = Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled; + boolean transparencyEnabled = Config.Client.Advanced.Graphics.Quality.transparency.get() == EDhApiTransparency.COMPLETE; boolean inputTransparent = ColorUtil.getAlpha(color) < 255 && transparencyEnabled; short yMax = (short) (yMin + ySize); 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 ef0725889..6c3628eb6 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 @@ -193,8 +193,8 @@ public class FullDataToRenderDataTransformer // config values // //===============// - boolean ignoreNonCollidingBlocks = (Config.Client.Advanced.Graphics.Quality.blocksToIgnore.get() == EDhApiBlocksToAvoid.NON_COLLIDING); - boolean colorBelowWithAvoidedBlocks = Config.Client.Advanced.Graphics.Quality.tintWithAvoidedBlocks.get(); + boolean ignoreNonCollidingBlocks = (Config.Client.Advanced.Graphics.Culling.blocksToIgnore.get() == EDhApiBlocksToAvoid.NON_COLLIDING); + boolean colorBelowWithAvoidedBlocks = Config.Client.Advanced.Graphics.Culling.tintWithAvoidedBlocks.get(); final ObjectOpenHashSet blockStatesToIgnore = WRAPPER_FACTORY.getRendererIgnoredBlocks(levelWrapper); final ObjectOpenHashSet caveBlockStatesToIgnore = WRAPPER_FACTORY.getRendererIgnoredCaveBlocks(levelWrapper); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodRenderSection.java b/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodRenderSection.java index fea3d51da..89995b45c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodRenderSection.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodRenderSection.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.core.render.QuadTree; +import com.seibel.distanthorizons.api.enums.rendering.EDhApiTransparency; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2; import com.seibel.distanthorizons.core.dataObjects.render.ColumnRenderSource; @@ -223,7 +224,7 @@ public class LodRenderSection implements IDebugRenderable, AutoCloseable } - boolean enableTransparency = Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled; + boolean enableTransparency = Config.Client.Advanced.Graphics.Quality.transparency.get() == EDhApiTransparency.COMPLETE; LodQuadBuilder lodQuadBuilder = new LodQuadBuilder(enableTransparency, this.clientLevel.getClientLevelWrapper()); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java index eca76f816..fbddcb82f 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.core.render.renderer; +import com.seibel.distanthorizons.api.enums.rendering.EDhApiTransparency; import com.seibel.distanthorizons.api.methods.events.abstractEvents.*; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodBufferContainer; @@ -253,7 +254,7 @@ public class LodRenderer // combined pass transparent rendering if (!deferTransparentRendering - && Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled) + && Config.Client.Advanced.Graphics.Quality.transparency.get() == EDhApiTransparency.COMPLETE) { profiler.popPush("LOD Transparent"); this.renderTerrain(this.terrainRenderer, renderBufferHandler, renderParams, /*opaquePass*/ false, profiler); @@ -326,7 +327,7 @@ public class LodRenderer // deferred rendering // //====================// - if (Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled) + if (Config.Client.Advanced.Graphics.Quality.transparency.get() == EDhApiTransparency.COMPLETE) { profiler.popPush("LOD Transparent"); this.renderTerrain(this.terrainRenderer, renderBufferHandler, renderParams, /*opaquePass*/ false, profiler); diff --git a/core/src/main/resources/assets/distanthorizons/lang/en_us.json b/core/src/main/resources/assets/distanthorizons/lang/en_us.json index 17450f6c9..cc1e65dd6 100644 --- a/core/src/main/resources/assets/distanthorizons/lang/en_us.json +++ b/core/src/main/resources/assets/distanthorizons/lang/en_us.json @@ -37,9 +37,9 @@ "distanthorizons.updater.title": "Distant Horizons auto updater", - "distanthorizons.updater.text1": + "distanthorizons.updater.updateAvailable": "§lNew update available!", - "distanthorizons.updater.text2": + "distanthorizons.updater.updateConfirmation": "§fDo you want to update from %s§f to %s§f?", "distanthorizons.updater.later": "Not now", @@ -67,7 +67,7 @@ "distanthorizons.config.client.quickEnableRendering": "Enable Rendering", "distanthorizons.config.client.quickEnableRendering.@tooltip": - "Determines if Distant Horizons Renders LODs.", + "If true, Distant Horizons will render LODs beyond the vanilla render distance.", "distanthorizons.config.client.quickShowWorldGenProgress": "Show LOD Gen/Import Progress", @@ -81,7 +81,7 @@ "distanthorizons.config.client.threadPresetSetting": "CPU Load", "distanthorizons.config.client.threadPresetSetting.@tooltip": - "Modifies how many threads Distant Horizons' will use. \n\nIncreasing this setting will improve the Distant Generator speed and LOD loading speed, \nbut will also increase CPU/memory usage and may introduce stuttering. \n\nNote: This is a CPU relative setting. \nIt should put an equal amount of strain on a 2 core CPU as a 64 core CPU.", + "Modifies how many threads Distant Horizons' will use. \n\nIncreasing this setting will increase the Distant Generator's speed and LOD loading speed, \nbut will also increase CPU/memory usage and may introduce stuttering. \n\nNote: This is a CPU relative setting. \nIt should put an equal amount of strain on a 2 core CPU as a 64 core CPU.", "distanthorizons.config.client.optionsButton": "Show The Options Button", @@ -114,15 +114,15 @@ "distanthorizons.config.client.advanced.graphics.quality.lodChunkRenderDistanceRadius": "LOD Chunk Render Distance Radius", "distanthorizons.config.client.advanced.graphics.quality.lodChunkRenderDistanceRadius.@tooltip": - "Distant Horizons' render distance, measured in chunks. \n\nNote: this is a best effort number. \nThe render distance may be above or below this number \ndepending on your other graphic settings.", + "Distant Horizons' render distance, measured in chunks. \n\nNote: this is a best effort number. \nThe actual render distance may be above or below this number \ndepending on your other graphic settings.", "distanthorizons.config.client.advanced.graphics.quality.horizontalQuality": "LOD Dropoff Distance", "distanthorizons.config.client.advanced.graphics.quality.horizontalQuality.@tooltip": - "How far apart drops in quality are.\n\nHigher settings will increase the distance between drops\nbut will increase memory and GPU usage.", + "This indicates how far apart drops in LOD quality are.\n\nHigher settings will increase the distance between drops\nbut will increase memory and GPU usage.", "distanthorizons.config.client.advanced.graphics.quality.maxHorizontalResolution": "Max Horizontal Resolution", "distanthorizons.config.client.advanced.graphics.quality.maxHorizontalResolution.@tooltip": - "The maximum detail LODs are rendered at.\n\n§6Fastest:§r Chunk\n§6Fanciest:§r Block", + "The maximum detail LODs can render at.\n\n§6Fastest:§r Chunk\n§6Fanciest:§r Block", "distanthorizons.config.client.advanced.graphics.quality.verticalQuality": "Vertical Quality", "distanthorizons.config.client.advanced.graphics.quality.verticalQuality.@tooltip": @@ -133,14 +133,6 @@ "How quickly LODs drop off in quality.\n\nLarger numbers will improve how distant terrain looks\nbut will increase memory and GPU usage.", "distanthorizons.config.client.advanced.graphics.quality.transparency": "Transparency", - "distanthorizons.config.client.advanced.graphics.quality.blocksToIgnore": - "Blocks To Ignore", - "distanthorizons.config.client.advanced.graphics.quality.blocksToIgnore.@tooltip": - "Defines the types of blocks to ignore when generating LODs.", - "distanthorizons.config.client.advanced.graphics.quality.tintWithAvoidedBlocks": - "Tint With Avoided Blocks", - "distanthorizons.config.client.advanced.graphics.quality.tintWithAvoidedBlocks.@tooltip": - "§4Note: makes snow, carpet, and trapdoors look really bad§r\nShould the blocks underneath avoided blocks gain the color of the avoided block?\n§6True:§r a red flower on grass will tint the grass below it red\n§6False:§r skipped blocks will not change color of surface below them", "distanthorizons.config.client.advanced.graphics.quality.lodShading": "LOD Shading", "distanthorizons.config.client.advanced.graphics.quality.lodShading.@tooltip": @@ -160,7 +152,7 @@ "distanthorizons.config.client.advanced.graphics.quality.dhFadeFarClipPlane": "Fade Before Far Clip Plane", "distanthorizons.config.client.advanced.graphics.quality.dhFadeFarClipPlane.@tooltip": - "Should DH fade out before reaching the far plane? \nThis is helpful to prevent DH clouds from cutting off in the distance.", + "Should DH fade out before reaching the far clip plane? \nThis is helpful to prevent DH clouds from cutting off in the distance.", "distanthorizons.config.client.advanced.graphics.quality.brightnessMultiplier": "Brightness Multiplier", "distanthorizons.config.client.advanced.graphics.quality.brightnessMultiplier.@tooltip": @@ -172,7 +164,7 @@ "distanthorizons.config.client.advanced.graphics.quality.lodBiomeBlending": "Biome Blending", "distanthorizons.config.client.advanced.graphics.quality.lodBiomeBlending.@tooltip": - "This is the same as vanilla Biome Blending settings for LOD area. \n\nNote that anything other than '0' will greatly effect Lod building time\nand increase triangle count. The cost on chunk generation speed is also \nquite large if set to too high.\n\n'0' equals to Vanilla Biome Blending of '1x1', \n'1' equals to Vanilla Biome Blending of '3x3', \n'2' equals to Vanilla Biome Blending of '5x5'... \n", + "This is the same as vanilla Biome Blending settings for LOD area. \n\nNote: anything above '0' will slow down LOD loading time.\n\n'0' equals to Vanilla Biome Blending of '1x1', \n'1' equals to Vanilla Biome Blending of '3x3', \n'2' equals to Vanilla Biome Blending of '5x5'... \n", @@ -188,13 +180,13 @@ "distanthorizons.config.client.advanced.graphics.genericRendering.enableGenericRendering": "Enable Generic Rendering", "distanthorizons.config.client.advanced.graphics.genericRendering.enableGenericRendering.@tooltip": - "If true non terrain objects will be rendered in DH's terrain. \nThis includes beacon beams and clouds.", + "If true non terrain objects will be rendered by DH. \ni.e. beacon beams and clouds.", "distanthorizons.config.client.advanced.graphics.genericRendering.enableBeaconRendering": "Enable Beacon Rendering", "distanthorizons.config.client.advanced.graphics.genericRendering.beaconRenderHeight": "Beacon render height", "distanthorizons.config.client.advanced.graphics.genericRendering.beaconRenderHeight.@tooltip": - "Sets the maximum height at which beacons will render. \nThis will only affect new beacons coming into LOD render distance. \nBeacons currently visible in LOD chunks will not be affected.", + "Sets the maximum height beacons will render up to. Requires a world re-load to take affect.", "distanthorizons.config.client.advanced.graphics.genericRendering.expandDistantBeacons": "Expand Distant Beacons", "distanthorizons.config.client.advanced.graphics.genericRendering.expandDistantBeacons.@tooltip": @@ -206,18 +198,10 @@ "distanthorizons.config.client.advanced.graphics.genericRendering.enableCloudRendering.@tooltip": "If true LOD clouds will be rendered.", "distanthorizons.config.client.advanced.graphics.genericRendering.dimensionEnabledCloudRenderingCsv": - "Enable Cloud Rendering", + "Cloud Enabled Dimension CSV List", "distanthorizons.config.client.advanced.graphics.genericRendering.dimensionEnabledCloudRenderingCsv.@tooltip": - "A comma separated separated list of dimension resource locations where DH clouds will render. \n\nExample: \"minecraft:overworld,minecraft:the_end\" \n\nChanges will only be seen when the world is re-loaded.", - "distanthorizons.config.client.advanced.graphics.genericRendering.enableUnexploredFogRendering": - "Enable Unexplored Fog Rendering", - "distanthorizons.config.client.advanced.graphics.genericRendering.enableUnexploredFogRendering.@tooltip": - "If true unexplored/ungenerated LODs will be rendered as large dark gray boxes.", - "distanthorizons.config.client.advanced.graphics.genericRendering.enableInstancedRendering": - "Enable Instanced Rendering", - "distanthorizons.config.client.advanced.graphics.genericRendering.enableInstancedRendering.@tooltip": - "Can be disabled to use much slower but more compatible direct rendering. \nDisabling this can be used to fix some crashes on Mac.", - + "A comma separated separated list of dimension resource locations where DH clouds will render. \n\nExample: \"minecraft:overworld,minecraft:the_end\" \n\nChanges require a world re-load.", + "distanthorizons.config.client.advanced.graphics.fog": @@ -376,6 +360,14 @@ "Water Surface Replacement", "distanthorizons.config.client.advanced.graphics.culling.waterSurfaceBlockReplacementCsv.@tooltip": "A comma separated list of block resource locations that will be removed \nwhen on top of water.", + "distanthorizons.config.client.advanced.graphics.culling.blocksToIgnore": + "Blocks To Ignore", + "distanthorizons.config.client.advanced.graphics.culling.blocksToIgnore.@tooltip": + "Defines what blocks should be rendered as LODs. \n\n§NONE:§r Include all blocks in the LODs\n§NON_COLLIDING:§r Only render solid blocks in the LODs (tall grass, torches, etc. will be ignored)", + "distanthorizons.config.client.advanced.graphics.culling.tintWithAvoidedBlocks": + "Tint With Avoided Blocks", + "distanthorizons.config.client.advanced.graphics.culling.tintWithAvoidedBlocks.@tooltip": + "§4Note: makes snow, carpet, and trapdoors look really bad§r\nShould the blocks underneath avoided blocks gain the color of the avoided block?\n§6True:§r a red flower on grass will tint the grass below it red\n§6False:§r skipped blocks will not change color of surface below them", "distanthorizons.config.client.advanced.graphics.overrideVanillaGraphicsSettings": "Override Vanilla Settings", @@ -505,14 +497,6 @@ "OpenGL Error Handling Mode", "distanthorizons.config.client.advanced.debugging.openGl.glErrorHandlingMode.@tooltip": "Defines how OpenGL errors are handled. \n Requires rebooting Minecraft to apply. \nMay incorrectly catch OpenGL errors thrown by other mods.", - "distanthorizons.config.client.advanced.debugging.openGl.validateBufferIdsBeforeRendering": - "Validate Buffer IDs Before Rendering", - "distanthorizons.config.client.advanced.debugging.openGl.validateBufferIdsBeforeRendering.@tooltip": - "Massively reduces FPS. \nShould only be used if mysterious EXCEPTION_ACCESS_VIOLATION crashes are happening in DH's rendering code and you're attempting to troubleshoot it.", - "distanthorizons.config.client.advanced.debugging.openGl.glUploadMode": - "Uploade Mode", - "distanthorizons.config.client.advanced.debugging.openGl.glUploadMode.@tooltip": - "Only for debugging", @@ -658,14 +642,6 @@ "Disable Unchanged Chunk Check", "distanthorizons.config.common.lodBuilding.disableUnchangedChunkCheck.@tooltip": "Disabling this check may fix issues where LODs aren't updated after\nblocks have been changed.\n", - "distanthorizons.config.common.lodBuilding.pullLightingForPregeneratedChunks": - "Pull Lighting For Pre-generated Chunks", - "distanthorizons.config.common.lodBuilding.pullLightingForPregeneratedChunks.@tooltip": - "If true LOD generation for pre-existing chunks will attempt to pull the lighting data \nsaved in Minecraft's Region files. \nIf false DH will pull in chunks without lighting and re-light them. \n\nSetting this to true will result in faster LOD generation \nfor already generated worlds, but is broken by most lighting mods. \n\nSet this to false if LODs are black.", - "distanthorizons.config.common.lodBuilding.assumePreExistingChunksAreFinished": - "Assume Pre-Existing Chunks Are Finished", - "distanthorizons.config.common.lodBuilding.assumePreExistingChunksAreFinished.@tooltip": - "Setting this to true may solve some issues when using DH with a pre-generated world.", "distanthorizons.config.common.lodBuilding.dataCompression": "Data Compression", "distanthorizons.config.common.lodBuilding.dataCompression.@tooltip": @@ -674,12 +650,6 @@ "Lossy World Compression", "distanthorizons.config.common.lodBuilding.worldCompression.@tooltip": "How should block data be compressed when creating LOD data? \nThis setting will only affect new or updated LOD data, \nany data already generated when this setting is changed will be \nunaffected until it is modified or re-loaded. \n\nMost Accurate: Merge Same Blocks \nHighest Compression: Visually Equal", - "distanthorizons.config.common.lodBuilding.recalculateChunkHeightmaps": - "Recalculate Chunk Heightmaps", - "distanthorizons.config.common.lodBuilding.recalculateChunkHeightmaps.@tooltip": - "True: Recalculate chunk height maps before chunks can be used by DH. This can fix problems with worlds created by external tools. \nFalse: Assume any height maps handled by Minecraft are correct. \n\nFastest: False\nMost Compatible: True", - "distanthorizons.config.common.lodBuilding.showMigrationChatWarning": - "Log Migration In Chat", "distanthorizons.config.common.lodBuilding.experimental": @@ -721,8 +691,6 @@ "distanthorizons.config.common.logging.logWorldGenEventToFile": "World Gen Events - File", - "distanthorizons.config.common.logging.logWorldGenPerformanceToFile": - "World Gen Performance - File", "distanthorizons.config.common.logging.logWorldGenChunkLoadEventToFile": "World Gen Load Events - File", "distanthorizons.config.common.logging.logRendererEventToFile": @@ -754,10 +722,10 @@ "Show Slow World Gen Warnings", "distanthorizons.config.common.logging.warning.showModCompatibilityWarningsOnStartup": "Show Mod Compatibility Warnings", - "distanthorizons.config.common.logging.warning.showGarbageCollectorWarning": - "Show Garbage Collector Warning", "distanthorizons.config.common.logging.warning.logGarbageCollectorWarning": "Log Garbage Collector Warning", + "distanthorizons.config.common.logging.warning.showGarbageCollectorWarning": + "Show Garbage Collector Warning", @@ -922,18 +890,9 @@ "distanthorizons.config.enum.EDhApiTransparency.DISABLED": "Disabled", - "distanthorizons.config.enum.EDhApiTransparency.FAKE": - "Fake", "distanthorizons.config.enum.EDhApiTransparency.COMPLETE": "Complete", - "distanthorizons.config.enum.EDhApiFogDrawMode.USE_OPTIFINE_SETTING": - "Use modded settings", - "distanthorizons.config.enum.EDhApiFogDrawMode.FOG_ENABLED": - "Enabled", - "distanthorizons.config.enum.EDhApiFogDrawMode.FOG_DISABLED": - "Disabled", - "distanthorizons.config.enum.EDhApiFogColorMode.USE_WORLD_FOG_COLOR": "Use world fog", "distanthorizons.config.enum.EDhApiFogColorMode.USE_SKY_COLOR": @@ -980,13 +939,6 @@ "distanthorizons.config.enum.EDhApiHeightFogDirection.ABOVE_AND_BELOW_SET_HEIGHT": "Above And Below Set Height", - "distanthorizons.config.enum.EDhApiVanillaOverdraw.NEVER": - "Never", - "distanthorizons.config.enum.EDhApiVanillaOverdraw.DYNAMIC": - "Dynamic", - "distanthorizons.config.enum.EDhApiVanillaOverdraw.ALWAYS": - "Always", - "distanthorizons.config.enum.EDhApiDistantGeneratorMode.NONE": "1. Existing Only", "distanthorizons.config.enum.EDhApiDistantGeneratorMode.PRE_EXISTING_ONLY": @@ -1070,13 +1022,6 @@ "distanthorizons.config.enum.EDhApiGLErrorHandlingMode.LOG_THROW": "Log-Throw", - "distanthorizons.config.enum.EDhApiGlProfileMode.CORE": - "Core", - "distanthorizons.config.enum.EDhApiGlProfileMode.COMPAT": - "Compat", - "distanthorizons.config.enum.EDhApiGlProfileMode.ANY": - "Any", - "distanthorizons.config.enum.EDhApiLoggerLevel.ALL": "1. All", "distanthorizons.config.enum.EDhApiLoggerLevel.DEBUG": @@ -1091,19 +1036,6 @@ "6. Disabled", - "distanthorizons.config.enum.EDhApiGpuUploadMethod.AUTO": - "Auto", - "distanthorizons.config.enum.EDhApiGpuUploadMethod.NONE": - "None", - "distanthorizons.config.enum.EDhApiGpuUploadMethod.BUFFER_STORAGE": - "Buffer storage", - "distanthorizons.config.enum.EDhApiGpuUploadMethod.SUB_DATA": - "Sub data", - "distanthorizons.config.enum.EDhApiGpuUploadMethod.BUFFER_MAPPING": - "Buffer mapping", - "distanthorizons.config.enum.EDhApiGpuUploadMethod.DATA": - "Data", - "distanthorizons.config.enum.EDhApiLodShading.AUTO": "Auto", "distanthorizons.config.enum.EDhApiLodShading.ENABLED":