diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 5469bcc88..2526f2a11 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -34,7 +34,7 @@ import org.lwjgl.opengl.GL15C; import com.seibel.lod.builders.lodTemplates.Box; import com.seibel.lod.config.LodConfig; -import com.seibel.lod.enums.LodQualityMode; +import com.seibel.lod.enums.VerticalQuality; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodRegion; import com.seibel.lod.objects.PosToRenderContainer; @@ -232,7 +232,7 @@ public class LodBufferBuilder // determine how many LODs we can stack vertically int maxVerticalData = 1; - if (LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == LodQualityMode.MULTI_LOD) + if (LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == VerticalQuality.MULTI_LOD) { maxVerticalData = DetailDistanceUtil.getMaxVerticalData(LodUtil.BLOCK_DETAIL_LEVEL); } diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index 7711e57e7..30bc8b7cc 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -27,8 +27,8 @@ import java.util.concurrent.Executors; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; -import com.seibel.lod.enums.LodResolution; -import com.seibel.lod.enums.LodQualityMode; +import com.seibel.lod.enums.HorizontalResolution; +import com.seibel.lod.enums.VerticalQuality; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodRegion; import com.seibel.lod.objects.LodWorld; @@ -198,14 +198,14 @@ public class LodBuilder int endZ; try { - LodResolution detail; + HorizontalResolution detail; LodRegion region = lodDim.getRegion(chunk.getPos().getRegionX(), chunk.getPos().getRegionZ()); if (region == null) return; byte minDetailLevel = region.getMinDetailLevel(); detail = DetailDistanceUtil.getLodGenDetail(minDetailLevel); - LodQualityMode lodQualityMode = LodConfig.CLIENT.worldGenerator.lodQualityMode.get(); + VerticalQuality verticalQuality = LodConfig.CLIENT.worldGenerator.lodQualityMode.get(); byte detailLevel = detail.detailLevel; int posX; int posZ; @@ -221,7 +221,7 @@ public class LodBuilder long[] data; boolean isServer = config.distanceGenerationMode == DistanceGenerationMode.SERVER; - switch (lodQualityMode) + switch (verticalQuality) { default: case HEIGHTMAP: @@ -266,7 +266,7 @@ public class LodBuilder } - private long[] createVerticalDataToMerge(LodResolution detail, IChunk chunk, LodBuilderConfig config, int startX, int startZ, int endX, int endZ) + private long[] createVerticalDataToMerge(HorizontalResolution detail, IChunk chunk, LodBuilderConfig config, int startX, int startZ, int endX, int endZ) { long[] dataToMerge = ThreadMapUtil.getBuilderVerticalArray()[detail.detailLevel]; int verticalData = DataPointUtil.WORLD_HEIGHT; @@ -423,7 +423,7 @@ public class LodBuilder return height; } - private long[] createSingleDataToMerge(LodResolution detail, IChunk chunk, LodBuilderConfig config, int startX, int startZ, int endX, int endZ) + private long[] createSingleDataToMerge(HorizontalResolution detail, IChunk chunk, LodBuilderConfig config, int startX, int startZ, int endX, int endZ) { long[] dataToMerge = ThreadMapUtil.getBuilderArray()[detail.detailLevel]; ChunkPos chunkPos = chunk.getPos(); diff --git a/src/main/java/com/seibel/lod/config/LodConfig.java b/src/main/java/com/seibel/lod/config/LodConfig.java index 72b94b193..e825ea3ac 100644 --- a/src/main/java/com/seibel/lod/config/LodConfig.java +++ b/src/main/java/com/seibel/lod/config/LodConfig.java @@ -20,21 +20,13 @@ package com.seibel.lod.config; import java.nio.file.Path; import java.nio.file.Paths; +import com.seibel.lod.enums.*; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import com.electronwill.nightconfig.core.file.CommentedFileConfig; import com.electronwill.nightconfig.core.io.WritingMode; import com.seibel.lod.ModInfo; -import com.seibel.lod.enums.DebugMode; -import com.seibel.lod.enums.DistanceCalculatorType; -import com.seibel.lod.enums.DistanceGenerationMode; -import com.seibel.lod.enums.FogDistance; -import com.seibel.lod.enums.FogDrawOverride; -import com.seibel.lod.enums.LodResolution; -import com.seibel.lod.enums.LodQualityMode; -import com.seibel.lod.enums.LodTemplate; -import com.seibel.lod.enums.ShadingMode; import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -51,169 +43,150 @@ import net.minecraftforge.fml.config.ModConfig; public class LodConfig { public static class Client - { - public final Graphics graphics; - public final WorldGenerator worldGenerator; - public final Threading threading; - public final Debugging debugging; - public final Buffers buffers; - - public Client(ForgeConfigSpec.Builder builder) - { - builder.push("client"); - { - graphics = new Graphics(builder); - worldGenerator = new WorldGenerator(builder); - threading = new Threading(builder); - debugging = new Debugging(builder); - buffers = new Buffers(builder); - } - builder.pop(); - } - } - - - - //================// - // Client Configs // - //================// - - public static class Graphics { - public ForgeConfigSpec.BooleanValue drawLODs; - - public ForgeConfigSpec.EnumValue fogDistance; - public ForgeConfigSpec.EnumValue fogDrawOverride; - - public ForgeConfigSpec.EnumValue lodTemplate; - - public ForgeConfigSpec.EnumValue maxDrawDetail; - - public ForgeConfigSpec.EnumValue shadingMode; - - public ForgeConfigSpec.IntValue lodQuality; - - public ForgeConfigSpec.IntValue lodChunkRenderDistance; - - public ForgeConfigSpec.BooleanValue disableDirectionalCulling; - - public ForgeConfigSpec.DoubleValue brightnessMultiplier; - public ForgeConfigSpec.DoubleValue saturationMultiplier; - - - Graphics(ForgeConfigSpec.Builder builder) + public final Graphics graphics; + public final WorldGenerator worldGenerator; + public final Threading threading; + public final Debugging debugging; + public final Buffers buffers; + + public Client(ForgeConfigSpec.Builder builder) { - builder.comment("These settings control how the LODs look.").push(this.getClass().getSimpleName()); - - drawLODs = builder - .comment("\n\n" - + " If false LODs will not be drawn, \n" - + " however they will still be generated \n" - + " and saved to file for later use. \n") - .define("drawLODs", true); - - fogDistance = builder - .comment("\n\n" - + " At what distance should Fog be drawn on the LODs? \n" - + " If the fog cuts off ubruptly or you are using Optifine's \"fast\" fog option \n" - + " set this to " + FogDistance.NEAR + " or " + FogDistance.FAR + ". \n") - .defineEnum("fogDistance", FogDistance.NEAR_AND_FAR); - - fogDrawOverride = builder - .comment("\n\n" - + " When should fog be drawn? \n" - + " " + FogDrawOverride.USE_OPTIFINE_FOG_SETTING + ": Use whatever Fog setting Optifine is using. If Optifine isn't installed this defaults to " + FogDrawOverride.ALWAYS_DRAW_FOG_FANCY + ". \n" - + " " + FogDrawOverride.NEVER_DRAW_FOG + ": Never draw fog on the LODs \n" - + " " + FogDrawOverride.ALWAYS_DRAW_FOG_FAST + ": Always draw fast fog on the LODs \n" - + " " + FogDrawOverride.ALWAYS_DRAW_FOG_FANCY + ": Always draw fancy fog on the LODs (if your graphics card supports it) \n") - .defineEnum("fogDrawOverride", FogDrawOverride.USE_OPTIFINE_FOG_SETTING); - - lodTemplate = builder - .comment("\n\n" - + " How should the LODs be drawn? \n" - + " NOTE: Currently only " + LodTemplate.CUBIC + " is implemented! \n" - + " \n" - + " " + LodTemplate.CUBIC + ": LOD Chunks are drawn as rectangular prisms (boxes). \n" - + " " + LodTemplate.TRIANGULAR + ": LOD Chunks smoothly transition between other. \n" - + " " + LodTemplate.DYNAMIC + ": LOD Chunks smoothly transition between other, \n" - + " " + " unless a neighboring chunk is at a significantly different height. \n") - .defineEnum("lodTemplate", LodTemplate.CUBIC); - - maxDrawDetail = builder - .comment("\n\n" - + " What is the maximum detail level that LODs should be drawn at? \n" - + " " + LodResolution.CHUNK + ": render 1 LOD for each Chunk. \n" - + " " + LodResolution.HALF_CHUNK + ": render 4 LODs for each Chunk. \n" - + " " + LodResolution.FOUR_BLOCKS + ": render 16 LODs for each Chunk. \n" - + " " + LodResolution.TWO_BLOCKS + ": render 64 LODs for each Chunk. \n" - + " " + LodResolution.BLOCK + ": render 256 LODs for each Chunk. \n") - .defineEnum("lodDrawQuality", LodResolution.BLOCK); - - lodQuality = builder - .comment("\n\n" - + " this value is multiplied by 128 and determine \n" - + " how much the quality decrease over distance \n") - .defineInRange("lodQuality", 1, 1, 4); - - lodChunkRenderDistance = builder - .comment("\n\n" - + " This is the render distance of the mod \n") - .defineInRange("lodChunkRenderDistance", 64, 32, 512); - - disableDirectionalCulling = builder - .comment("\n\n" - + " If false LODs that are behind the player's camera \n" - + " aren't drawn, increasing performance. \n\n" - + "" - + " If true all LODs are drawn, even those behind \n" - + " the player's camera, decreasing performance. \n\n" - + "" - + " Disable this if you see LODs disapearing. \n" - + " (This may happen if you are using a camera mod) \n") - .define("disableDirectionalCulling", false); - - shadingMode = builder - .comment("\n\n" - + " What kind of shading should the LODs have? \n" - + " \n" - + " " + ShadingMode.NONE + " \n" - + " " + "LODs will have the same lighting on every side. \n" - + " " + "Can make large similarly colored areas hard to differentiate. \n" - + "\n" - + " " + ShadingMode.DARKEN_SIDES + " \n" - + " " + "LODs will have darker sides and bottoms to simulate Minecraft's flat lighting.") - .defineEnum("lightingMode", ShadingMode.DARKEN_SIDES); - - brightnessMultiplier = builder - .comment("\n\n" - + " Change how bright LOD colors are. \n" - + " 0 = black \n" - + " 1 = normal color value \n" - + " 2 = washed out colors \n") - .defineInRange("brightnessMultiplier", 1.0, 0, 2); - - saturationMultiplier = builder - .comment("\n\n" - + " Change how saturated LOD colors are. \n" - + " 0 = black and white \n" - + " 1 = normal saturation \n" - + " 2 = very saturated \n") - .defineInRange("saturationMultiplier", 1.0, 0, 2); - - + builder.push("client"); + { + graphics = new Graphics(builder); + worldGenerator = new WorldGenerator(builder); + threading = new Threading(builder); + debugging = new Debugging(builder); + buffers = new Buffers(builder); + } builder.pop(); } } - + + + //================// + // Client Configs // + //================// + + public static class Graphics + { + public ForgeConfigSpec.BooleanValue drawLODs; + + public ForgeConfigSpec.EnumValue fogDistance; + public ForgeConfigSpec.EnumValue fogDrawOverride; + + public ForgeConfigSpec.EnumValue lodTemplate; + + public ForgeConfigSpec.EnumValue drawResolution; + + public ForgeConfigSpec.EnumValue shadingMode; + + public ForgeConfigSpec.EnumValue horizontalQuality; + + public ForgeConfigSpec.IntValue lodChunkRenderDistance; + + public ForgeConfigSpec.BooleanValue disableDirectionalCulling; + + + Graphics(ForgeConfigSpec.Builder builder) + { + builder.comment("These settings control how the LODs look.").push(this.getClass().getSimpleName()); + + drawLODs = builder + .comment("\n\n" + + " If false LODs will not be drawn, \n" + + " however they will still be generated \n" + + " and saved to file for later use. \n") + .define("drawLODs", true); + + fogDistance = builder + .comment("\n\n" + + " At what distance should Fog be drawn on the LODs? \n" + + " If the fog cuts off ubruptly or you are using Optifine's \"fast\" fog option \n" + + " set this to " + FogDistance.NEAR + " or " + FogDistance.FAR + ". \n") + .defineEnum("fogDistance", FogDistance.NEAR_AND_FAR); + + fogDrawOverride = builder + .comment("\n\n" + + " When should fog be drawn? \n" + + " " + FogDrawOverride.USE_OPTIFINE_FOG_SETTING + ": Use whatever Fog setting Optifine is using. If Optifine isn't installed this defaults to " + FogDrawOverride.ALWAYS_DRAW_FOG_FANCY + ". \n" + + " " + FogDrawOverride.NEVER_DRAW_FOG + ": Never draw fog on the LODs \n" + + " " + FogDrawOverride.ALWAYS_DRAW_FOG_FAST + ": Always draw fast fog on the LODs \n" + + " " + FogDrawOverride.ALWAYS_DRAW_FOG_FANCY + ": Always draw fancy fog on the LODs (if your graphics card supports it) \n") + .defineEnum("fogDrawOverride", FogDrawOverride.ALWAYS_DRAW_FOG_FANCY); + + lodTemplate = builder + .comment("\n\n" + + " How should the LODs be drawn? \n" + + " NOTE: Currently only " + LodTemplate.CUBIC + " is implemented! \n" + + " \n" + + " " + LodTemplate.CUBIC + ": LOD Chunks are drawn as rectangular prisms (boxes). \n" + + " " + LodTemplate.TRIANGULAR + ": LOD Chunks smoothly transition between other. \n" + + " " + LodTemplate.DYNAMIC + ": LOD Chunks smoothly transition between other, \n" + + " " + " unless a neighboring chunk is at a significantly different height. \n") + .defineEnum("lodTemplate", LodTemplate.CUBIC); + + drawResolution = builder + .comment("\n\n" + + " What is the maximum detail level that LODs should be drawn at? \n" + + " " + HorizontalResolution.CHUNK + ": render 1 LOD for each Chunk. \n" + + " " + HorizontalResolution.HALF_CHUNK + ": render 4 LODs for each Chunk. \n" + + " " + HorizontalResolution.FOUR_BLOCKS + ": render 16 LODs for each Chunk. \n" + + " " + HorizontalResolution.TWO_BLOCKS + ": render 64 LODs for each Chunk. \n" + + " " + HorizontalResolution.BLOCK + ": render 256 LODs for each Chunk. \n") + .defineEnum("Draw resolution", HorizontalResolution.BLOCK); + + horizontalQuality = builder + .comment("\n\n" + + " This indicate the unit for the \n" + + " " + HorizontalQuality.LOW + ": Base distance 4 chunks. \n" + + " " + HorizontalQuality.MEDIUM + ": Base distance 8 chunks. \n" + + " " + HorizontalQuality.HIGH + ": Base distance 16 chunks. \n") + .defineEnum("lodDrawQuality", HorizontalQuality.LOW); + + lodChunkRenderDistance = builder + .comment("\n\n" + + " This is the render distance of the mod \n") + .defineInRange("lodChunkRenderDistance", 64, 32, 1024); + + disableDirectionalCulling = builder + .comment("\n\n" + + " If false LODs that are behind the player's camera \n" + + " aren't drawn, increasing performance. \n\n" + + "" + + " If true all LODs are drawn, even those behind \n" + + " the player's camera, decreasing performance. \n\n" + + "" + + " Disable this if you see LODs disapearing. \n" + + " (This may happen if you are using a camera mod) \n") + .define("disableDirectionalCulling", false); + + shadingMode = builder + .comment("\n\n" + + " What kind of shading should the LODs have? \n" + + " \n" + + " " + ShadingMode.NONE + " \n" + + " " + "LODs will have the same lighting on every side. \n" + + " " + "Can make large similarly colored areas hard to differentiate. \n" + + "\n" + + " " + ShadingMode.GAME_SHADING + " \n" + + " " + "LODs will have darker sides and bottoms to simulate Minecraft's flat lighting.") + .defineEnum("lightingMode", ShadingMode.GAME_SHADING); + + builder.pop(); + } + } + public static class WorldGenerator { - public ForgeConfigSpec.EnumValue lodQualityMode; - public ForgeConfigSpec.EnumValue maxGenerationDetail; + public ForgeConfigSpec.EnumValue lodQualityMode; + public ForgeConfigSpec.EnumValue generationResolution; public ForgeConfigSpec.EnumValue distanceGenerationMode; public ForgeConfigSpec.BooleanValue allowUnstableFeatureGeneration; - public ForgeConfigSpec.EnumValue lodDistanceCalculatorType; - - + public ForgeConfigSpec.EnumValue lodDistanceCalculatorType; + + WorldGenerator(ForgeConfigSpec.Builder builder) { builder.comment("These settings control how LODs outside your normal view range are generated.").push(this.getClass().getSimpleName()); @@ -221,238 +194,232 @@ public class LodConfig lodQualityMode = builder .comment("\n\n" + " Use 3d lods or 2d lods? \n" - + " " + LodQualityMode.HEIGHTMAP + ": enable 2d lods with heightmap \n" - + " " + LodQualityMode.MULTI_LOD + ": enable 3d lods with heightmap \n") - .defineEnum("lodQualityMode", LodQualityMode.HEIGHTMAP); + + " " + VerticalQuality.HEIGHTMAP + ": enable 2d lods with heightmap \n" + + " " + VerticalQuality.MULTI_LOD + ": enable 3d lods with heightmap \n") + .defineEnum("lodQualityMode", VerticalQuality.HEIGHTMAP); + + generationResolution = builder + .comment("\n\n" + + " What is the maximum detail level that LODs should be generated at? \n" + + " " + HorizontalResolution.CHUNK + ": render 1 LOD for each Chunk. \n" + + " " + HorizontalResolution.HALF_CHUNK + ": render 4 LODs for each Chunk. \n" + + " " + HorizontalResolution.FOUR_BLOCKS + ": render 16 LODs for each Chunk. \n" + + " " + HorizontalResolution.TWO_BLOCKS + ": render 64 LODs for each Chunk. \n" + + " " + HorizontalResolution.BLOCK + ": render 256 LODs for each Chunk. \n") + .defineEnum("Generation Resolution", HorizontalResolution.BLOCK); - maxGenerationDetail = builder - .comment("\n\n" - + " What is the maximum detail level that LODs should be generated at? \n" - + " " + LodResolution.CHUNK + ": render 1 LOD for each Chunk. \n" - + " " + LodResolution.HALF_CHUNK + ": render 4 LODs for each Chunk. \n" - + " " + LodResolution.FOUR_BLOCKS + ": render 16 LODs for each Chunk. \n" - + " " + LodResolution.TWO_BLOCKS + ": render 64 LODs for each Chunk. \n" - + " " + LodResolution.BLOCK + ": render 256 LODs for each Chunk. \n") - .defineEnum("lodGenerationQuality", LodResolution.TWO_BLOCKS); - lodDistanceCalculatorType = builder - .comment("\n\n" - + " " + DistanceCalculatorType.LINEAR + " \n" - + " with LINEAR calculator the quality of block decrease \n" - + " linearly to the distance of the player \n" - - + "\n" - + " " + DistanceCalculatorType.QUADRATIC + " \n" - + " with LINEAR calculator the quality of block decrease \n" - + " quadratically to the distance of the player \n") - .defineEnum("lodDistanceComputation", DistanceCalculatorType.LINEAR); - - distanceGenerationMode = builder - .comment("\n\n" - + " Note: The times listed here are the amount of time it took \n" - + " the developer's PC to generate 1 chunk, \n" - + " and are included so you can compare the \n" - + " different generation options. Your mileage may vary. \n" - + "\n" + .comment("\n\n" + + " " + DistanceQualityDropOff.LINEAR + " \n" + + " with LINEAR calculator the quality of block decrease \n" + + " linearly to the distance of the player \n" + + + "\n" + + " " + DistanceQualityDropOff.QUADRATIC + " \n" + + " with LINEAR calculator the quality of block decrease \n" + + " quadratically to the distance of the player \n") + .defineEnum("lodDistanceComputation", DistanceQualityDropOff.LINEAR); + + distanceGenerationMode = builder + .comment("\n\n" + + " Note: The times listed here are the amount of time it took \n" + + " the developer's PC to generate 1 chunk, \n" + + " and are included so you can compare the \n" + + " different generation options. Your mileage may vary. \n" + + "\n" + + + " " + DistanceGenerationMode.NONE + " \n" + + " Don't run the distance generator. \n" + + + " " + DistanceGenerationMode.BIOME_ONLY + " \n" + + " Only generate the biomes and use biome \n" + + " grass/foliage color, water color, or snow color \n" + + " to generate the color. \n" + + " Doesn't generate height, everything is shown at sea level. \n" + + " Multithreaded - Fastest (2-5 ms) \n" + + + "\n" + + " " + DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT + " \n" + + " Same as 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" + + " Multithreaded - Fastest (2-5 ms) \n" + + + "\n" + + " " + DistanceGenerationMode.SURFACE + " \n" + + " Generate the world surface, \n" + + " this does NOT include caves, trees, \n" + + " or structures. \n" + + " Multithreaded - Faster (10-20 ms) \n" + + + "\n" + + " " + DistanceGenerationMode.FEATURES + " \n" + + " Generate everything except structures. \n" + + " WARNING: This may cause world generation bugs or instability! \n" + + " Multithreaded - Fast (15-20 ms) \n" + + + "\n" + + " " + DistanceGenerationMode.SERVER + " \n" + + " Ask the server to generate/load each chunk. \n" + + " This is the most compatible, but causes server/simulation lag. \n" + + " This will also show player made structures if you \n" + + " are adding the mod to a pre-existing world. \n" + + " Singlethreaded - Slow (15-50 ms, with spikes up to 200 ms) \n") + .defineEnum("distanceGenerationMode", DistanceGenerationMode.SURFACE); - + " " + DistanceGenerationMode.NONE + " \n" - + " Don't run the distance generator. \n" - - + " " + DistanceGenerationMode.BIOME_ONLY + " \n" - + " Only generate the biomes and use biome \n" - + " grass/foliage color, water color, or snow color \n" - + " to generate the color. \n" - + " Doesn't generate height, everything is shown at sea level. \n" - + " Multithreaded - Fastest (2-5 ms) \n" - - + "\n" - + " " + DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT + " \n" - + " Same as 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" - + " Multithreaded - Fastest (2-5 ms) \n" - - + "\n" - + " " + DistanceGenerationMode.SURFACE + " \n" - + " Generate the world surface, \n" - + " this does NOT include caves, trees, \n" - + " or structures. \n" - + " Multithreaded - Faster (10-20 ms) \n" - - + "\n" - + " " + DistanceGenerationMode.FEATURES + " \n" - + " Generate everything except structures. \n" - + " WARNING: This may cause world generation bugs or instability! \n" - + " Multithreaded - Fast (15-20 ms) \n" - - + "\n" - + " " + DistanceGenerationMode.SERVER + " \n" - + " Ask the server to generate/load each chunk. \n" - + " This is the most compatible, but causes server/simulation lag. \n" - + " This will also show player made structures if you \n" - + " are adding the mod to a pre-existing world. \n" - + " Singlethreaded - Slow (15-50 ms, with spikes up to 200 ms) \n") - .defineEnum("distanceGenerationMode", DistanceGenerationMode.SURFACE); - allowUnstableFeatureGeneration = builder - .comment("\n\n" - + " When using the " + DistanceGenerationMode.FEATURES + " generation mode \n" - + " some features may not be thread safe, which could \n" - + " cause instability and crashes. \n" - + " By default (false) those features are skipped, \n" - + " improving stability, but decreasing how many features are \n" - + " actually generated. \n" - + " (for example: some tree generation is unstable, \n" - + " so some trees may not be generated.) \n" - + " By setting this to true, all features will be generated, \n" - + " but your game will be more unstable and crashes may occur. \n" - + " \n" - + " I would love to remove this option and always generate everything, \n" - + " but I'm not sure how to do that. \n" - + " If you are a Java wizard, check out the git issue here: \n" - + " https://gitlab.com/jeseibel/minecraft-lod-mod/-/issues/35 \n") - .define("allowUnstableFeatureGeneration", false); - - + .comment("\n\n" + + " When using the " + DistanceGenerationMode.FEATURES + " generation mode \n" + + " some features may not be thread safe, which could \n" + + " cause instability and crashes. \n" + + " By default (false) those features are skipped, \n" + + " improving stability, but decreasing how many features are \n" + + " actually generated. \n" + + " (for example: some tree generation is unstable, \n" + + " so some trees may not be generated.) \n" + + " By setting this to true, all features will be generated, \n" + + " but your game will be more unstable and crashes may occur. \n" + + " \n" + + " I would love to remove this option and always generate everything, \n" + + " but I'm not sure how to do that. \n" + + " If you are a Java wizard, check out the git issue here: \n" + + " https://gitlab.com/jeseibel/minecraft-lod-mod/-/issues/35 \n") + .define("allowUnstableFeatureGeneration", false); + + builder.pop(); } } - + public static class Threading { public ForgeConfigSpec.IntValue numberOfWorldGenerationThreads; public ForgeConfigSpec.IntValue numberOfBufferBuilderThreads; - + Threading(ForgeConfigSpec.Builder builder) { builder.comment("These settings control how many CPU threads the mod uses for different tasks.").push(this.getClass().getSimpleName()); - + numberOfWorldGenerationThreads = builder - .comment("\n\n" - + " This is how many threads are used when generating LODs outside \n" - + " the normal render distance. \n" - + " If you experience stuttering when generating distant LODs, decrease \n" - + " this number. If you want to increase LOD generation speed, \n" - + " increase this number. \n" - + " \n" - + " The maximum value is the number of processors on your CPU. \n" - + " Requires a restart to take effect. \n") - .defineInRange("numberOfWorldGenerationThreads", Runtime.getRuntime().availableProcessors() / 2, 1, Runtime.getRuntime().availableProcessors()); - + .comment("\n\n" + + " This is how many threads are used when generating LODs outside \n" + + " the normal render distance. \n" + + " If you experience stuttering when generating distant LODs, decrease \n" + + " this number. If you want to increase LOD generation speed, \n" + + " increase this number. \n" + + " \n" + + " The maximum value is the number of processors on your CPU. \n" + + " Requires a restart to take effect. \n") + .defineInRange("numberOfWorldGenerationThreads", Runtime.getRuntime().availableProcessors() / 2, 1, Runtime.getRuntime().availableProcessors()); + numberOfBufferBuilderThreads = builder - .comment("\n\n" - + " This is how many threads are used when building vertex buffers \n" - + " (The things sent to your GPU to draw the LODs). \n" - + " If you experience high CPU useage when NOT generating distant \n" - + " LODs, lower this number. \n" - + " \n" - + " The maximum value is the number of processors on your CPU. \n" - + " Requires a restart to take effect. \n") - .defineInRange("numberOfBufferBuilderThreads", Runtime.getRuntime().availableProcessors(), 1, Runtime.getRuntime().availableProcessors()); - + .comment("\n\n" + + " This is how many threads are used when building vertex buffers \n" + + " (The things sent to your GPU to draw the LODs). \n" + + " If you experience high CPU useage when NOT generating distant \n" + + " LODs, lower this number. \n" + + " \n" + + " The maximum value is the number of processors on your CPU. \n" + + " Requires a restart to take effect. \n") + .defineInRange("numberOfBufferBuilderThreads", Runtime.getRuntime().availableProcessors(), 1, Runtime.getRuntime().availableProcessors()); + builder.pop(); } } - + public static class Debugging { public ForgeConfigSpec.EnumValue debugMode; public ForgeConfigSpec.BooleanValue enableDebugKeybinding; - + Debugging(ForgeConfigSpec.Builder builder) { builder.comment("These settings can be used by to look for bugs, or see how certain parts of the mod are working.").push(this.getClass().getSimpleName()); - + debugMode = builder - .comment("\n\n" - + " " + DebugMode.OFF + ": LODs will draw with their normal colors. \n" - + " " + DebugMode.SHOW_DETAIL + ": LOD colors will be based on their detail. \n" - + " " + DebugMode.SHOW_DETAIL_WIREFRAME + ": LOD colors will be based on their detail, drawn with wireframe. \n") - .defineEnum("debugMode", DebugMode.OFF); - + .comment("\n\n" + + " " + DebugMode.OFF + ": LODs will draw with their normal colors. \n" + + " " + DebugMode.SHOW_DETAIL + ": LOD colors will be based on their detail. \n" + + " " + DebugMode.SHOW_DETAIL_WIREFRAME + ": LOD colors will be based on their detail, drawn with wireframe. \n") + .defineEnum("debugMode", DebugMode.OFF); + enableDebugKeybinding = builder - .comment("\n\n" - + " If true the F4 key can be used to cycle through the different debug modes. \n") - .define("enableDebugKeybinding", false); - + .comment("\n\n" + + " If true the F4 key can be used to cycle through the different debug modes. \n") + .define("enableDebugKeybinding", false); + builder.pop(); } } - + public static class Buffers { public ForgeConfigSpec.IntValue bufferRebuildPlayerMoveTimeout; public ForgeConfigSpec.IntValue bufferRebuildChunkChangeTimeout; public ForgeConfigSpec.IntValue bufferRebuildLodChangeTimeout; - + Buffers(ForgeConfigSpec.Builder builder) { builder.comment("These settings affect when Vertex Buffers are built.").push(this.getClass().getSimpleName()); - + bufferRebuildPlayerMoveTimeout = builder - .comment("\n\n" - + " How long in milliseconds should we wait to \n" - + " rebuild the vertex buffers when the player moves \n" - + " a chunk or more? \n") - .defineInRange("bufferRebuildPlayerMoveTimeout", 2000, 1, 60000); - + .comment("\n\n" + + " How long in milliseconds should we wait to \n" + + " rebuild the vertex buffers when the player moves \n" + + " a chunk or more? \n") + .defineInRange("bufferRebuildPlayerMoveTimeout", 2000, 1, 60000); + bufferRebuildChunkChangeTimeout = builder - .comment("\n\n" - + " How long in milliseconds should we wait to \n" - + " rebuild the vertex buffers when the vanilla rendered \n" - + " chunks change? \n") - .defineInRange("bufferRebuildChunkChangeTimeout", 1000, 1, 60000); - + .comment("\n\n" + + " How long in milliseconds should we wait to \n" + + " rebuild the vertex buffers when the vanilla rendered \n" + + " chunks change? \n") + .defineInRange("bufferRebuildChunkChangeTimeout", 1000, 1, 60000); + bufferRebuildLodChangeTimeout = builder - .comment("\n\n" - + " How long in milliseconds should we wait to \n" - + " rebuild the vertex buffers when the LOD regions change? \n") - .defineInRange("bufferRebuildLodChangeTimeout", 5000, 1, 60000); - - + .comment("\n\n" + + " How long in milliseconds should we wait to \n" + + " rebuild the vertex buffers when the LOD regions change? \n") + .defineInRange("bufferRebuildLodChangeTimeout", 5000, 1, 60000); + + builder.pop(); } } - - - - - - - - + + /** * {@link Path} to the configuration file of this mod */ private static final Path CONFIG_PATH = Paths.get("config", ModInfo.MODID + ".toml"); - + public static final ForgeConfigSpec CLIENT_SPEC; public static final Client CLIENT; - + static { final Pair specPair = new ForgeConfigSpec.Builder().configure(Client::new); CLIENT_SPEC = specPair.getRight(); CLIENT = specPair.getLeft(); CommentedFileConfig clientConfig = CommentedFileConfig.builder(CONFIG_PATH) - .writingMode(WritingMode.REPLACE) - .build(); + .writingMode(WritingMode.REPLACE) + .build(); clientConfig.load(); clientConfig.save(); CLIENT_SPEC.setConfig(clientConfig); } - + @SubscribeEvent public static void onLoad(final ModConfig.Loading configEvent) { LogManager.getLogger().debug(ModInfo.MODNAME, "Loaded forge config file {}", configEvent.getConfig().getFileName()); } - + @SubscribeEvent public static void onFileChange(final ModConfig.Reloading configEvent) { LogManager.getLogger().debug(ModInfo.MODNAME, "Forge config just got changed on the file system!"); } - + } diff --git a/src/main/java/com/seibel/lod/enums/DistanceCalculatorType.java b/src/main/java/com/seibel/lod/enums/DistanceQualityDropOff.java similarity index 88% rename from src/main/java/com/seibel/lod/enums/DistanceCalculatorType.java rename to src/main/java/com/seibel/lod/enums/DistanceQualityDropOff.java index a455bffb9..d10f48d4e 100644 --- a/src/main/java/com/seibel/lod/enums/DistanceCalculatorType.java +++ b/src/main/java/com/seibel/lod/enums/DistanceQualityDropOff.java @@ -4,7 +4,7 @@ package com.seibel.lod.enums; * @author Leonardo Amato * @version 22-08-2021 */ -public enum DistanceCalculatorType +public enum DistanceQualityDropOff { /** * different Lod detail render and generate linearly to the distance diff --git a/src/main/java/com/seibel/lod/enums/HorizontalQuality.java b/src/main/java/com/seibel/lod/enums/HorizontalQuality.java new file mode 100644 index 000000000..587ebee94 --- /dev/null +++ b/src/main/java/com/seibel/lod/enums/HorizontalQuality.java @@ -0,0 +1,46 @@ +/* + * This file is part of the LOD Mod, licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.seibel.lod.enums; + +/** + * USE_OPTIFINE_FOG_SETTING,
+ * NEVER_DRAW_FOG,
+ * ALWAYS_DRAW_FOG_FAST,
+ * ALWAYS_DRAW_FOG_FANCY
+ * + * @author James Seibel + * @version 7-03-2021 + */ +public enum HorizontalQuality +{ + /** Lods are 2D with heightMap */ + LOW(64), + + /** Lods expand in three dimension */ + MEDIUM(128), + + /** Lods expand in three dimension */ + HIGH(256); + + public int distanceUnit; + + HorizontalQuality(int distanceUnit) + { + this.distanceUnit = distanceUnit; + } +} \ No newline at end of file diff --git a/src/main/java/com/seibel/lod/enums/LodResolution.java b/src/main/java/com/seibel/lod/enums/HorizontalResolution.java similarity index 81% rename from src/main/java/com/seibel/lod/enums/LodResolution.java rename to src/main/java/com/seibel/lod/enums/HorizontalResolution.java index 756495587..d3d77da2d 100644 --- a/src/main/java/com/seibel/lod/enums/LodResolution.java +++ b/src/main/java/com/seibel/lod/enums/HorizontalResolution.java @@ -28,7 +28,7 @@ import com.seibel.lod.util.LodUtil; * @author James Seibel * @version 8-11-2021 */ -public enum LodResolution +public enum HorizontalResolution { /** render 1 LOD for each chunk */ CHUNK(1, 4), @@ -68,12 +68,12 @@ public enum LodResolution * 2nd dimension: An array of all LodDetails that are less than or
* equal to that detailLevel */ - private static LodResolution[][] lowerDetailArrays; + private static HorizontalResolution[][] lowerDetailArrays; - private LodResolution(int newLengthCount, int newDetailLevel) + private HorizontalResolution(int newLengthCount, int newDetailLevel) { detailLevel = (byte) newDetailLevel; dataPointLengthCount = newLengthCount; @@ -112,20 +112,20 @@ public enum LodResolution * Returns an array of all LodDetails that have a detail level * that is less than or equal to the given LodDetail */ - public static LodResolution[] getSelfAndLowerDetails(LodResolution detail) + public static HorizontalResolution[] getSelfAndLowerDetails(HorizontalResolution detail) { if (lowerDetailArrays == null) { // run first time setup - lowerDetailArrays = new LodResolution[LodResolution.values().length][]; + lowerDetailArrays = new HorizontalResolution[HorizontalResolution.values().length][]; // go through each LodDetail - for(LodResolution currentDetail : LodResolution.values()) + for(HorizontalResolution currentDetail : HorizontalResolution.values()) { - ArrayList lowerDetails = new ArrayList<>(); + ArrayList lowerDetails = new ArrayList<>(); // find the details lower than currentDetail - for(LodResolution compareDetail : LodResolution.values()) + for(HorizontalResolution compareDetail : HorizontalResolution.values()) { if (currentDetail.detailLevel <= compareDetail.detailLevel) { @@ -137,7 +137,7 @@ public enum LodResolution Collections.sort(lowerDetails); Collections.reverse(lowerDetails); - lowerDetailArrays[currentDetail.detailLevel] = lowerDetails.toArray(new LodResolution[lowerDetails.size()]); + lowerDetailArrays[currentDetail.detailLevel] = lowerDetails.toArray(new HorizontalResolution[lowerDetails.size()]); } } @@ -145,9 +145,9 @@ public enum LodResolution } /** Returns what detail level should be used at a given distance and maxDistance. */ - public static LodResolution getDetailForDistance(LodResolution maxDetailLevel, int distance, int maxDistance) + public static HorizontalResolution getDetailForDistance(HorizontalResolution maxDetailLevel, int distance, int maxDistance) { - LodResolution[] lowerDetails = getSelfAndLowerDetails(maxDetailLevel); + HorizontalResolution[] lowerDetails = getSelfAndLowerDetails(maxDetailLevel); int distaneBetweenDetails = maxDistance / lowerDetails.length; int index = LodUtil.clamp(0, distance / distaneBetweenDetails, lowerDetails.length - 1); diff --git a/src/main/java/com/seibel/lod/enums/ShadingMode.java b/src/main/java/com/seibel/lod/enums/ShadingMode.java index 96950a0ef..f552f70a0 100644 --- a/src/main/java/com/seibel/lod/enums/ShadingMode.java +++ b/src/main/java/com/seibel/lod/enums/ShadingMode.java @@ -14,5 +14,5 @@ public enum ShadingMode /** LODs will have darker sides and bottoms to simulate top down lighting. Fastest */ - DARKEN_SIDES; + GAME_SHADING; } \ No newline at end of file diff --git a/src/main/java/com/seibel/lod/enums/LodQualityMode.java b/src/main/java/com/seibel/lod/enums/VerticalQuality.java similarity index 97% rename from src/main/java/com/seibel/lod/enums/LodQualityMode.java rename to src/main/java/com/seibel/lod/enums/VerticalQuality.java index c14625aa0..f40d7f5ba 100644 --- a/src/main/java/com/seibel/lod/enums/LodQualityMode.java +++ b/src/main/java/com/seibel/lod/enums/VerticalQuality.java @@ -26,7 +26,7 @@ package com.seibel.lod.enums; * @author James Seibel * @version 7-03-2021 */ -public enum LodQualityMode +public enum VerticalQuality { /** Lods are 2D with heightMap */ HEIGHTMAP, diff --git a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java index b9531d511..87b336bf5 100644 --- a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java @@ -31,7 +31,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.seibel.lod.enums.DistanceGenerationMode; -import com.seibel.lod.enums.LodQualityMode; +import com.seibel.lod.enums.VerticalQuality; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodRegion; import com.seibel.lod.objects.RegionPos; @@ -116,14 +116,14 @@ public class LodDimensionFileHandler * Return the LodRegion region at the given coordinates. * (null if the file doesn't exist) */ - public LodRegion loadRegionFromFile(byte detailLevel, RegionPos regionPos, DistanceGenerationMode generationMode, LodQualityMode lodQualityMode) + public LodRegion loadRegionFromFile(byte detailLevel, RegionPos regionPos, DistanceGenerationMode generationMode, VerticalQuality verticalQuality) { int regionX = regionPos.x; int regionZ = regionPos.z; - LodRegion region = new LodRegion(LodUtil.REGION_DETAIL_LEVEL,regionPos, generationMode, lodQualityMode); + LodRegion region = new LodRegion(LodUtil.REGION_DETAIL_LEVEL,regionPos, generationMode, verticalQuality); for (byte tempDetailLevel = LodUtil.REGION_DETAIL_LEVEL; tempDetailLevel >= detailLevel; tempDetailLevel--) { - String fileName = getFileNameAndPathForRegion(regionX, regionZ, generationMode, tempDetailLevel, lodQualityMode); + String fileName = getFileNameAndPathForRegion(regionX, regionZ, generationMode, tempDetailLevel, verticalQuality); try { @@ -337,7 +337,7 @@ public class LodDimensionFileHandler *

* Returns null if there is an IO Exception. */ - private String getFileNameAndPathForRegion(int regionX, int regionZ, DistanceGenerationMode generationMode, byte detailLevel, LodQualityMode lodQualityMode) + private String getFileNameAndPathForRegion(int regionX, int regionZ, DistanceGenerationMode generationMode, byte detailLevel, VerticalQuality verticalQuality) { try { @@ -346,7 +346,7 @@ public class LodDimensionFileHandler // or // ".\Super Flat\data" return dimensionDataSaveFolder.getCanonicalPath() + File.separatorChar + - lodQualityMode + File.separatorChar + + verticalQuality + File.separatorChar + generationMode.toString() + File.separatorChar + DETAIL_FOLDER_NAME_PREFIX + detailLevel + File.separatorChar + FILE_NAME_PREFIX + "." + regionX + "." + regionZ + FILE_EXTENSION; diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 5b0479b69..272ffca2d 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -24,7 +24,7 @@ import java.util.concurrent.Executors; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; -import com.seibel.lod.enums.LodQualityMode; +import com.seibel.lod.enums.VerticalQuality; import com.seibel.lod.handlers.LodDimensionFileHandler; import com.seibel.lod.util.DataPointUtil; import com.seibel.lod.util.DetailDistanceUtil; @@ -389,7 +389,7 @@ public class LodDimension { DistanceGenerationMode generationMode = LodConfig.CLIENT.worldGenerator.distanceGenerationMode.get(); ChunkPos newPlayerChunk = new ChunkPos(LevelPosUtil.getChunkPos((byte) 0, playerPosX), LevelPosUtil.getChunkPos((byte) 0, playerPosZ)); - LodQualityMode lodQualityMode = LodConfig.CLIENT.worldGenerator.lodQualityMode.get(); + VerticalQuality verticalQuality = LodConfig.CLIENT.worldGenerator.lodQualityMode.get(); if (lastGenChunk == null) lastGenChunk = new ChunkPos(newPlayerChunk.x + 1, newPlayerChunk.z - 1); @@ -422,12 +422,12 @@ public class LodDimension //First case, region has to be initialized //We check if there is a file at the target level - regions[x][z] = getRegionFromFile(regionPos, levelToGen, generationMode, lodQualityMode); + regions[x][z] = getRegionFromFile(regionPos, levelToGen, generationMode, verticalQuality); //if there is no file we initialize the region if (regions[x][z] == null) { - regions[x][z] = new LodRegion(levelToGen, regionPos, generationMode, lodQualityMode); + regions[x][z] = new LodRegion(levelToGen, regionPos, generationMode, verticalQuality); } regionNeedsRegen[x][z] = true; regenDimension = true; @@ -692,10 +692,10 @@ public class LodDimension * Get the region at the given X and Z coordinates from the * RegionFileHandler. */ - public LodRegion getRegionFromFile(RegionPos regionPos, byte detailLevel, DistanceGenerationMode generationMode, LodQualityMode lodQualityMode) + public LodRegion getRegionFromFile(RegionPos regionPos, byte detailLevel, DistanceGenerationMode generationMode, VerticalQuality verticalQuality) { if (fileHandler != null) - return fileHandler.loadRegionFromFile(detailLevel, regionPos, generationMode, lodQualityMode); + return fileHandler.loadRegionFromFile(detailLevel, regionPos, generationMode, verticalQuality); else return null; } diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index ab864a329..f1d3855e7 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -2,7 +2,7 @@ package com.seibel.lod.objects; import com.seibel.lod.enums.DistanceGenerationMode; -import com.seibel.lod.enums.LodQualityMode; +import com.seibel.lod.enums.VerticalQuality; import com.seibel.lod.proxy.ClientProxy; import com.seibel.lod.util.DataPointUtil; import com.seibel.lod.util.DetailDistanceUtil; @@ -33,7 +33,7 @@ public class LodRegion private DistanceGenerationMode generationMode; - private LodQualityMode lodQualityMode; + private VerticalQuality verticalQuality; public final int regionPosX; public final int regionPosZ; @@ -46,12 +46,12 @@ public class LodRegion dataContainer = new LevelContainer[POSSIBLE_LOD]; } - public LodRegion(byte minDetailLevel, RegionPos regionPos, DistanceGenerationMode generationMode, LodQualityMode lodQualityMode) + public LodRegion(byte minDetailLevel, RegionPos regionPos, DistanceGenerationMode generationMode, VerticalQuality verticalQuality) { this.minDetailLevel = minDetailLevel; this.regionPosX = regionPos.x; this.regionPosZ = regionPos.z; - this.lodQualityMode = lodQualityMode; + this.verticalQuality = verticalQuality; this.generationMode = generationMode; dataContainer = new LevelContainer[POSSIBLE_LOD]; @@ -59,7 +59,7 @@ public class LodRegion //Initialize all the different matrices for (byte lod = minDetailLevel; lod <= LodUtil.REGION_DETAIL_LEVEL; lod++) { - switch (lodQualityMode){ + switch (verticalQuality){ default: case HEIGHTMAP: dataContainer[lod] = new SingleLevelContainer(lod); @@ -70,9 +70,9 @@ public class LodRegion } } } - public LodQualityMode getLodQualityMode() + public VerticalQuality getLodQualityMode() { - return lodQualityMode; + return verticalQuality; } public DistanceGenerationMode getGenerationMode() { diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index 9ecc39341..54427f245 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -28,7 +28,7 @@ import com.seibel.lod.builders.worldGeneration.LodNodeGenWorker; import com.seibel.lod.builders.worldGeneration.LodWorldGenerator; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; -import com.seibel.lod.enums.LodResolution; +import com.seibel.lod.enums.HorizontalResolution; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodWorld; import com.seibel.lod.objects.RegionPos; @@ -144,7 +144,10 @@ public class ClientProxy profiler.pop(); // get out of "terrain" profiler.push("LOD"); - renderer.drawLODs(lodDim, mcMatrixStack, partialTicks, mc.getProfiler()); + if(LodConfig.CLIENT.graphics.drawLODs.get()) + { + renderer.drawLODs(lodDim, mcMatrixStack, partialTicks, mc.getProfiler()); + } profiler.pop(); // end LOD profiler.push("terrain"); // go back into "terrain" @@ -175,8 +178,8 @@ public class ClientProxy //LodConfig.CLIENT.debugMode.set(true); - LodConfig.CLIENT.graphics.maxDrawDetail.set(LodResolution.BLOCK); - LodConfig.CLIENT.worldGenerator.maxGenerationDetail.set(LodResolution.BLOCK); + LodConfig.CLIENT.graphics.drawResolution.set(HorizontalResolution.BLOCK); + LodConfig.CLIENT.worldGenerator.generationResolution.set(HorizontalResolution.BLOCK); // requires a world restart? // LodConfig.CLIENT.worldGenerator.lodQualityMode.set(LodQualityMode.HEIGHTMAP); @@ -290,9 +293,14 @@ public class ClientProxy { LodConfig.CLIENT.debugging.debugMode.set(LodConfig.CLIENT.debugging.debugMode.get().getNext()); } + + if(LodConfig.CLIENT.debugging.enableDebugKeybinding.get() + && event.getKey() == GLFW.GLFW_KEY_F6 && event.getAction() == GLFW.GLFW_PRESS) + { + LodConfig.CLIENT.graphics.drawLODs.set(!LodConfig.CLIENT.graphics.drawLODs.get()); + } } - //============// // LOD events // //============// diff --git a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java index 260b904b7..37967ce21 100644 --- a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java +++ b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java @@ -2,15 +2,15 @@ package com.seibel.lod.util; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; -import com.seibel.lod.enums.LodResolution; +import com.seibel.lod.enums.HorizontalResolution; public class DetailDistanceUtil { private static double genMultiplier = 1.0; private static double treeGenMultiplier = 1.0; private static double treeCutMultiplier = 1.0; - private static int minGenDetail = LodConfig.CLIENT.worldGenerator.maxGenerationDetail.get().detailLevel; - private static int minDrawDetail = Math.max(LodConfig.CLIENT.graphics.maxDrawDetail.get().detailLevel,LodConfig.CLIENT.worldGenerator.maxGenerationDetail.get().detailLevel); + private static int minGenDetail = LodConfig.CLIENT.worldGenerator.generationResolution.get().detailLevel; + private static int minDrawDetail = Math.max(LodConfig.CLIENT.graphics.drawResolution.get().detailLevel,LodConfig.CLIENT.worldGenerator.generationResolution.get().detailLevel); private static int maxDetail = LodUtil.REGION_DETAIL_LEVEL + 1; private static int minDistance = 0; private static int maxDistance = LodConfig.CLIENT.graphics.lodChunkRenderDistance.get() * 16 * 2; @@ -31,31 +31,30 @@ public class DetailDistanceUtil 1,}; - private static LodResolution[] lodGenDetails = { - LodResolution.BLOCK, - LodResolution.TWO_BLOCKS, - LodResolution.FOUR_BLOCKS, - LodResolution.HALF_CHUNK, - LodResolution.CHUNK, - LodResolution.CHUNK, - LodResolution.CHUNK, - LodResolution.CHUNK, - LodResolution.CHUNK, - LodResolution.CHUNK, - LodResolution.CHUNK}; + private static HorizontalResolution[] lodGenDetails = { + HorizontalResolution.BLOCK, + HorizontalResolution.TWO_BLOCKS, + HorizontalResolution.FOUR_BLOCKS, + HorizontalResolution.HALF_CHUNK, + HorizontalResolution.CHUNK, + HorizontalResolution.CHUNK, + HorizontalResolution.CHUNK, + HorizontalResolution.CHUNK, + HorizontalResolution.CHUNK, + HorizontalResolution.CHUNK, + HorizontalResolution.CHUNK}; public static void updateSettings(){ - minGenDetail = LodConfig.CLIENT.worldGenerator.maxGenerationDetail.get().detailLevel; - minDrawDetail = Math.max(LodConfig.CLIENT.graphics.maxDrawDetail.get().detailLevel,LodConfig.CLIENT.worldGenerator.maxGenerationDetail.get().detailLevel); + minGenDetail = LodConfig.CLIENT.worldGenerator.generationResolution.get().detailLevel; + minDrawDetail = Math.max(LodConfig.CLIENT.graphics.drawResolution.get().detailLevel,LodConfig.CLIENT.worldGenerator.generationResolution.get().detailLevel); maxDistance = LodConfig.CLIENT.graphics.lodChunkRenderDistance.get() * 16 * 2; } public static int baseDistanceFunction(int detail) { - int initial; - int distance = 0; + int distanceUnit = LodConfig.CLIENT.graphics.horizontalQuality.get().distanceUnit; if (detail <= minGenDetail) return minDistance; if (detail == maxDetail) @@ -64,19 +63,17 @@ public class DetailDistanceUtil return maxDistance; switch (LodConfig.CLIENT.worldGenerator.lodDistanceCalculatorType.get()) { - case LINEAR: - initial = LodConfig.CLIENT.graphics.lodQuality.get() * 128; - return (detail * initial); + case LINEAR:; + return (detail * distanceUnit); + default: case QUADRATIC: - initial = LodConfig.CLIENT.graphics.lodQuality.get() * 128; - return (int) (Math.pow(base, detail) * initial); + return (int) (Math.pow(base, detail) * distanceUnit); } - return distance; } public static byte baseInverseFunction(int distance, int minDetail) { - int initial; + int distanceUnit = LodConfig.CLIENT.graphics.horizontalQuality.get().distanceUnit; byte detail = 0; if (distance == 0) detail = (byte) minDetail; @@ -85,12 +82,10 @@ public class DetailDistanceUtil switch (LodConfig.CLIENT.worldGenerator.lodDistanceCalculatorType.get()) { case LINEAR: - initial = LodConfig.CLIENT.graphics.lodQuality.get() * 128; - detail = (byte) Math.floorDiv(distance, initial); + detail = (byte) Math.floorDiv(distance, distanceUnit); break; case QUADRATIC: - initial = LodConfig.CLIENT.graphics.lodQuality.get() * 128; - detail = (byte) (Math.log(Math.floorDiv(distance, initial))/logBase); + detail = (byte) (Math.log(Math.floorDiv(distance, distanceUnit))/logBase); break; } return (byte) Math.min(detail, LodUtil.REGION_DETAIL_LEVEL); @@ -133,7 +128,7 @@ public class DetailDistanceUtil } } - public static LodResolution getLodGenDetail(int detail) + public static HorizontalResolution getLodGenDetail(int detail) { if (detail < minGenDetail) {