diff --git a/src/main/java/com/seibel/lod/LodMain.java b/src/main/java/com/seibel/lod/LodMain.java
index d4b133041..801ca6a21 100644
--- a/src/main/java/com/seibel/lod/LodMain.java
+++ b/src/main/java/com/seibel/lod/LodMain.java
@@ -17,7 +17,7 @@
*/
package com.seibel.lod;
-import com.seibel.lod.handlers.LodConfig;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.proxy.ClientProxy;
import net.minecraftforge.common.MinecraftForge;
@@ -49,7 +49,7 @@ public class LodMain
private void init(final FMLCommonSetupEvent event)
{
- ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, LodConfig.clientSpec);
+ ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, LodConfig.CLIENT_SPEC);
}
diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java
index 1b85cf646..71cac492f 100644
--- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java
+++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java
@@ -30,7 +30,7 @@ import java.util.concurrent.locks.ReentrantLock;
import org.apache.commons.lang3.mutable.MutableBoolean;
import org.lwjgl.opengl.GL11;
-import com.seibel.lod.handlers.LodConfig;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.objects.LodDimension;
import com.seibel.lod.objects.RegionPos;
import com.seibel.lod.objects.LevelPos.LevelPos;
@@ -60,7 +60,7 @@ public class LodBufferBuilder
/**
* This holds the threads used to generate buffers.
*/
- private ExecutorService bufferBuilderThreads = Executors.newFixedThreadPool(LodConfig.CLIENT.numberOfBufferBuilderThreads.get(), new LodThreadFactory(this.getClass().getSimpleName() + " - builder"));
+ private ExecutorService bufferBuilderThreads = Executors.newFixedThreadPool(LodConfig.CLIENT.threading.numberOfBufferBuilderThreads.get(), new LodThreadFactory(this.getClass().getSimpleName() + " - builder"));
/**
* The buffers that are used to create LODs using far fog
@@ -294,7 +294,7 @@ public class LodBufferBuilder
}
posToRender.changeParameters(detailLevel, posX, posZ);
- LodConfig.CLIENT.lodTemplate.get().template.addLodToBuffer(currentBuffer, playerBlockPos, lodData, adjData,
+ LodConfig.CLIENT.graphics.lodTemplate.get().template.addLodToBuffer(currentBuffer, playerBlockPos, lodData, adjData,
posToRender, renderer.previousDebugMode);
}
} catch (ArrayIndexOutOfBoundsException e)
diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java
index 7f301dc90..5ca442234 100644
--- a/src/main/java/com/seibel/lod/builders/LodBuilder.java
+++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java
@@ -21,9 +21,9 @@ import java.awt.Color;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.DistanceGenerationMode;
import com.seibel.lod.enums.LodDetail;
-import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.objects.DataPoint;
import com.seibel.lod.objects.LodDimension;
import com.seibel.lod.objects.LodWorld;
@@ -117,7 +117,7 @@ public class LodBuilder
lodDim = lodWorld.getLodDimension(dim);
}
- generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode), LodConfig.CLIENT.maxGenerationDetail.get());
+ generateLodNodeFromChunk(lodDim, chunk, new LodBuilderConfig(generationMode), LodConfig.CLIENT.worldGenerator.maxGenerationDetail.get());
} catch (IllegalArgumentException | NullPointerException e)
{
System.out.println("Chunk pos " + chunk.getPos());
diff --git a/src/main/java/com/seibel/lod/builders/lodTemplates/CubicLodTemplate.java b/src/main/java/com/seibel/lod/builders/lodTemplates/CubicLodTemplate.java
index 83830669b..dff5e5c0f 100644
--- a/src/main/java/com/seibel/lod/builders/lodTemplates/CubicLodTemplate.java
+++ b/src/main/java/com/seibel/lod/builders/lodTemplates/CubicLodTemplate.java
@@ -17,9 +17,9 @@
*/
package com.seibel.lod.builders.lodTemplates;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.DebugMode;
import com.seibel.lod.enums.ShadingMode;
-import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.objects.DataPoint;
import com.seibel.lod.objects.LevelPos.LevelPos;
import com.seibel.lod.util.ColorUtil;
@@ -102,7 +102,7 @@ public class CubicLodTemplate extends AbstractLodTemplate
int eastColor = c;
// darken the bottom and side colors if requested
- if (LodConfig.CLIENT.shadingMode.get() == ShadingMode.DARKEN_SIDES)
+ if (LodConfig.CLIENT.graphics.shadingMode.get() == ShadingMode.DARKEN_SIDES)
{
// the side colors are different because
// when using fast lighting in Minecraft the north/south
@@ -118,8 +118,8 @@ public class CubicLodTemplate extends AbstractLodTemplate
}
// apply the user specified saturation and brightness
- float saturationMultiplier = LodConfig.CLIENT.saturationMultiplier.get().floatValue();
- float brightnessMultiplier = LodConfig.CLIENT.brightnessMultiplier.get().floatValue();
+ float saturationMultiplier = LodConfig.CLIENT.graphics.saturationMultiplier.get().floatValue();
+ float brightnessMultiplier = LodConfig.CLIENT.graphics.brightnessMultiplier.get().floatValue();
if (saturationMultiplier != 1 || brightnessMultiplier != 1)
{
diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java
index 56289b6bc..654761a60 100644
--- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java
+++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java
@@ -28,9 +28,9 @@ import java.util.function.Supplier;
import com.seibel.lod.builders.LodBuilder;
import com.seibel.lod.builders.LodBuilderConfig;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.DistanceGenerationMode;
import com.seibel.lod.enums.LodDetail;
-import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.objects.LodDimension;
import com.seibel.lod.proxy.ClientProxy;
import com.seibel.lod.render.LodRenderer;
@@ -74,7 +74,7 @@ import net.minecraftforge.common.WorldWorkerManager.IWorker;
*/
public class LodNodeGenWorker implements IWorker
{
- public static ExecutorService genThreads = Executors.newFixedThreadPool(LodConfig.CLIENT.numberOfWorldGenerationThreads.get(), new LodThreadFactory(LodNodeGenWorker.class.getSimpleName()));
+ public static ExecutorService genThreads = Executors.newFixedThreadPool(LodConfig.CLIENT.threading.numberOfWorldGenerationThreads.get(), new LodThreadFactory(LodNodeGenWorker.class.getSimpleName()));
private boolean threadStarted = false;
private LodChunkGenThread thread;
@@ -119,7 +119,7 @@ public class LodNodeGenWorker implements IWorker
{
if (!threadStarted)
{
- if (LodConfig.CLIENT.distanceGenerationMode.get() == DistanceGenerationMode.SERVER)
+ if (LodConfig.CLIENT.worldGenerator.distanceGenerationMode.get() == DistanceGenerationMode.SERVER)
{
// if we are using SERVER generation that has to be done
// synchronously to prevent crashing and harmful
@@ -448,7 +448,7 @@ public class LodNodeGenWorker implements IWorker
}
}
- boolean allowUnstableFeatures = LodConfig.CLIENT.allowUnstableFeatureGeneration.get();
+ boolean allowUnstableFeatures = LodConfig.CLIENT.worldGenerator.allowUnstableFeatureGeneration.get();
// generate all the features related to this chunk.
// this may or may not be thread safe
@@ -636,7 +636,7 @@ public class LodNodeGenWorker implements IWorker
{
genThreads.shutdownNow();
}
- genThreads = Executors.newFixedThreadPool(LodConfig.CLIENT.numberOfWorldGenerationThreads.get(), new LodThreadFactory(LodNodeGenWorker.class.getSimpleName()));
+ genThreads = Executors.newFixedThreadPool(LodConfig.CLIENT.threading.numberOfWorldGenerationThreads.get(), new LodThreadFactory(LodNodeGenWorker.class.getSimpleName()));
}
diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java
index 623c7fd63..16e873136 100644
--- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java
+++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java
@@ -17,8 +17,8 @@ import org.apache.commons.lang3.mutable.MutableBoolean;
import com.seibel.lod.builders.GenerationRequest;
import com.seibel.lod.builders.LodBuilder;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.DistanceGenerationMode;
-import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.objects.LodDimension;
import com.seibel.lod.objects.LevelPos.LevelPos;
import com.seibel.lod.render.LodRenderer;
@@ -93,7 +93,7 @@ public class LodWorldGenerator
*/
public void queueGenerationRequests(LodDimension lodDim, LodRenderer renderer, LodBuilder lodBuilder)
{
- if (LodConfig.CLIENT.distanceGenerationMode.get() != DistanceGenerationMode.NONE
+ if (LodConfig.CLIENT.worldGenerator.distanceGenerationMode.get() != DistanceGenerationMode.NONE
&& !generatorThreadRunning
&& mc.hasSingleplayerServer())
{
@@ -101,7 +101,7 @@ public class LodWorldGenerator
generatorThreadRunning = true;
// just in case the config changed
- maxChunkGenRequests = LodConfig.CLIENT.numberOfWorldGenerationThreads.get() * 8;
+ maxChunkGenRequests = LodConfig.CLIENT.threading.numberOfWorldGenerationThreads.get() * 8;
Thread generatorThread = new Thread(() ->
{
diff --git a/src/main/java/com/seibel/lod/handlers/LodConfig.java b/src/main/java/com/seibel/lod/config/LodConfig.java
similarity index 85%
rename from src/main/java/com/seibel/lod/handlers/LodConfig.java
rename to src/main/java/com/seibel/lod/config/LodConfig.java
index 283d916de..1deaf71bf 100644
--- a/src/main/java/com/seibel/lod/handlers/LodConfig.java
+++ b/src/main/java/com/seibel/lod/config/LodConfig.java
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.seibel.lod.handlers;
+package com.seibel.lod.config;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -44,41 +44,52 @@ import net.minecraftforge.fml.config.ModConfig;
* This handles any configuration the user has access to.
*
* @author James Seibel
- * @version 8-30-2021
+ * @version 9-1-2021
*/
@Mod.EventBusSubscriber
public class LodConfig
{
- // TODO break this up into multiple classes,
- // there are way to many options here
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 debugMode;
-
- public ForgeConfigSpec.BooleanValue enableDebugKeybinding;
-
public ForgeConfigSpec.EnumValue lodTemplate;
public ForgeConfigSpec.EnumValue maxDrawDetail;
- public ForgeConfigSpec.EnumValue maxGenerationDetail;
-
- public ForgeConfigSpec.EnumValue distanceGenerationMode;
-
- public ForgeConfigSpec.BooleanValue allowUnstableFeatureGeneration;
-
- public ForgeConfigSpec.IntValue numberOfWorldGenerationThreads;
- public ForgeConfigSpec.IntValue numberOfBufferBuilderThreads;
public ForgeConfigSpec.EnumValue shadingMode;
- public ForgeConfigSpec.EnumValue lodDistanceCalculatorType;
-
public ForgeConfigSpec.IntValue lodQuality;
public ForgeConfigSpec.IntValue lodChunkRenderDistance;
@@ -86,14 +97,10 @@ public class LodConfig
public ForgeConfigSpec.DoubleValue brightnessMultiplier;
public ForgeConfigSpec.DoubleValue saturationMultiplier;
- public ForgeConfigSpec.IntValue bufferRebuildPlayerMoveTimeout;
- public ForgeConfigSpec.IntValue bufferRebuildChunkChangeTimeout;
- public ForgeConfigSpec.IntValue bufferRebuildLodChangeTimeout;
-
- Client(ForgeConfigSpec.Builder builder)
+ Graphics(ForgeConfigSpec.Builder builder)
{
- builder.comment(ModInfo.MODNAME + " configuration settings").push("client");
+ builder.comment("These settings control how the LODs look.").push(this.getClass().getSimpleName());
drawLODs = builder
.comment("\n\n"
@@ -118,18 +125,6 @@ public class LodConfig
+ " " + FogDrawOverride.ALWAYS_DRAW_FOG_FANCY.toString() + ": Always draw fancy fog on the LODs (if your graphics card supports it) \n")
.defineEnum("fogDrawOverride", FogDrawOverride.USE_OPTIFINE_FOG_SETTING);
- debugMode = builder
- .comment("\n\n"
- + " " + DebugMode.OFF.toString() + ": LODs will draw with their normal colors. \n"
- + " " + DebugMode.SHOW_DETAIL.toString() + ": LOD colors will be based on their detail. \n"
- + " " + DebugMode.SHOW_DETAIL_WIREFRAME.toString() + ": 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);
-
lodTemplate = builder
.comment("\n\n"
+ " How should the LODs be drawn? \n"
@@ -151,6 +146,62 @@ public class LodConfig
+ " " + LodDetail.FULL.toString() + ": render 256 LODs for each Chunk. \n")
.defineEnum("lodDrawQuality", LodDetail.FULL);
+ 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("lodChunkRenderDistane", 64, 32, 512);
+
+ shadingMode = builder
+ .comment("\n\n"
+ + " What kind of shading should the LODs have? \n"
+ + " \n"
+ + " " + ShadingMode.NONE.toString() + " \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.toString() + " \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.pop();
+ }
+ }
+
+ public static class WorldGenerator
+ {
+ public ForgeConfigSpec.EnumValue maxGenerationDetail;
+ public ForgeConfigSpec.EnumValue distanceGenerationMode;
+ public ForgeConfigSpec.BooleanValue allowUnstableFeatureGeneration;
+ 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());
+
maxGenerationDetail = builder
.comment("\n\n"
+ " What is the maximum detail level that LODs should be generated at? \n"
@@ -178,17 +229,6 @@ public class LodConfig
+ " quadratically to the distance of the player \n")
.defineEnum("lodDistanceComputation", DistanceCalculatorType.LINEAR);
- 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("lodChunkRenderDistane", 64, 32, 512);
-
distanceGenerationMode = builder
.comment("\n\n"
+ " Note: The times listed here are the amount of time it took \n"
@@ -256,6 +296,20 @@ public class LodConfig
+ " 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"
@@ -271,60 +325,71 @@ public class LodConfig
numberOfBufferBuilderThreads = builder
.comment("\n\n"
+ " This is how many threads are used when building vertex buffers \n"
- + " (The things I send to the GPU to draw the LODs). \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"
+ + " 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());
- shadingMode = builder
- .comment("\n\n"
- + " What kind of shading should the LODs have? \n"
- + " \n"
- + " " + ShadingMode.NONE.toString() + " \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.toString() + " \n"
- + " " + "LODs will have darker sides and bottoms to simulate Minecraft's flat lighting.")
- .defineEnum("lightingMode", ShadingMode.DARKEN_SIDES);
+ 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());
- brightnessMultiplier = builder
+ debugMode = 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);
+ + " " + DebugMode.OFF.toString() + ": LODs will draw with their normal colors. \n"
+ + " " + DebugMode.SHOW_DETAIL.toString() + ": LOD colors will be based on their detail. \n"
+ + " " + DebugMode.SHOW_DETAIL_WIREFRAME.toString() + ": LOD colors will be based on their detail, drawn with wireframe. \n")
+ .defineEnum("debugMode", DebugMode.OFF);
- saturationMultiplier = builder
+ enableDebugKeybinding = 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);
+ + " 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 buffers when the player moves \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 buffers when the vanilla rendered \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 buffers when the LOD regions change? \n")
+ + " rebuild the vertex buffers when the LOD regions change? \n")
.defineInRange("bufferRebuildLodChangeTimeout", 5000, 1, 60000);
@@ -332,27 +397,32 @@ public class LodConfig
}
}
+
+
+
+
+
+
+
/**
* {@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 clientSpec;
+ public static final ForgeConfigSpec CLIENT_SPEC;
public static final Client CLIENT;
static
{
final Pair specPair = new ForgeConfigSpec.Builder().configure(Client::new);
- clientSpec = specPair.getRight();
+ CLIENT_SPEC = specPair.getRight();
CLIENT = specPair.getLeft();
-
- // setup the config file
- CommentedFileConfig config = CommentedFileConfig.builder(CONFIG_PATH)
+ CommentedFileConfig clientConfig = CommentedFileConfig.builder(CONFIG_PATH)
.writingMode(WritingMode.REPLACE)
.build();
- config.load();
- config.save();
- clientSpec.setConfig(config);
+ clientConfig.load();
+ clientConfig.save();
+ CLIENT_SPEC.setConfig(clientConfig);
}
@SubscribeEvent
diff --git a/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java b/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java
index aad326f2d..61497a4c4 100644
--- a/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java
+++ b/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java
@@ -24,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.seibel.lod.LodMain;
-import com.seibel.lod.handlers.LodConfig;
+import com.seibel.lod.config.LodConfig;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.WorldRenderer;
@@ -56,7 +56,7 @@ public class MixinWorldRenderer
{
// only render if LODs are enabled and
// only render before solid blocks
- if (LodConfig.CLIENT.drawLODs.get() && renderType.equals(RenderType.solid()))
+ if (LodConfig.CLIENT.graphics.drawLODs.get() && renderType.equals(RenderType.solid()))
LodMain.client_proxy.renderLods(previousPartialTicks);
}
}
diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java
index ad10a7b99..de1733141 100644
--- a/src/main/java/com/seibel/lod/objects/LodDimension.java
+++ b/src/main/java/com/seibel/lod/objects/LodDimension.java
@@ -26,8 +26,8 @@ import java.util.concurrent.Executors;
import org.apache.commons.lang3.mutable.MutableBoolean;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.DistanceGenerationMode;
-import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.handlers.LodDimensionFileHandler;
import com.seibel.lod.objects.LevelPos.LevelPos;
import com.seibel.lod.util.DetailDistanceUtil;
@@ -374,7 +374,7 @@ public class LodDimension
*/
public void treeGenerator(int playerPosX, int playerPosZ)
{
- DistanceGenerationMode generationMode = LodConfig.CLIENT.distanceGenerationMode.get();
+ DistanceGenerationMode generationMode = LodConfig.CLIENT.worldGenerator.distanceGenerationMode.get();
ChunkPos newPlayerChunk = (new LevelPos((byte) 0, playerPosX, playerPosZ)).getChunkPos();
if (lastGenChunk == null)
diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java
index 505719ffa..0a869c453 100644
--- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java
+++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java
@@ -25,13 +25,13 @@ import com.seibel.lod.builders.LodBufferBuilder;
import com.seibel.lod.builders.LodBuilder;
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.DistanceCalculatorType;
import com.seibel.lod.enums.DistanceGenerationMode;
import com.seibel.lod.enums.FogDistance;
import com.seibel.lod.enums.FogDrawOverride;
import com.seibel.lod.enums.LodDetail;
import com.seibel.lod.enums.ShadingMode;
-import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.objects.LodDimension;
import com.seibel.lod.objects.LodWorld;
import com.seibel.lod.objects.RegionPos;
@@ -142,7 +142,7 @@ public class ClientProxy
// these can't be set until after the buffers are built (in renderer.drawLODs)
// otherwise the buffers may be set to the wrong size, or not changed at all
previousChunkRenderDistance = mc.options.renderDistance;
- previousLodRenderDistance = LodConfig.CLIENT.lodChunkRenderDistance.get();
+ previousLodRenderDistance = LodConfig.CLIENT.graphics.lodChunkRenderDistance.get();
}
@@ -158,26 +158,26 @@ public class ClientProxy
//LodConfig.CLIENT.drawLODs.set(true);
//LodConfig.CLIENT.debugMode.set(true);
- LodConfig.CLIENT.maxDrawDetail.set(LodDetail.FULL);
- LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.FULL);
+ LodConfig.CLIENT.graphics.maxDrawDetail.set(LodDetail.FULL);
+ LodConfig.CLIENT.worldGenerator.maxGenerationDetail.set(LodDetail.FULL);
- LodConfig.CLIENT.fogDistance.set(FogDistance.FAR);
- LodConfig.CLIENT.fogDrawOverride.set(FogDrawOverride.ALWAYS_DRAW_FOG_FANCY);
- LodConfig.CLIENT.shadingMode.set(ShadingMode.DARKEN_SIDES);
- LodConfig.CLIENT.brightnessMultiplier.set(1.0);
- LodConfig.CLIENT.saturationMultiplier.set(1.0);
+ LodConfig.CLIENT.graphics.fogDistance.set(FogDistance.FAR);
+ LodConfig.CLIENT.graphics.fogDrawOverride.set(FogDrawOverride.ALWAYS_DRAW_FOG_FANCY);
+ LodConfig.CLIENT.graphics.shadingMode.set(ShadingMode.DARKEN_SIDES);
+ LodConfig.CLIENT.graphics.brightnessMultiplier.set(1.0);
+ LodConfig.CLIENT.graphics.saturationMultiplier.set(1.0);
- LodConfig.CLIENT.distanceGenerationMode.set(DistanceGenerationMode.SURFACE);
- LodConfig.CLIENT.lodChunkRenderDistance.set(256);
- LodConfig.CLIENT.lodDistanceCalculatorType.set(DistanceCalculatorType.LINEAR);
- LodConfig.CLIENT.lodQuality.set(3);
- LodConfig.CLIENT.allowUnstableFeatureGeneration.set(false);
+ LodConfig.CLIENT.worldGenerator.distanceGenerationMode.set(DistanceGenerationMode.SURFACE);
+ LodConfig.CLIENT.graphics.lodChunkRenderDistance.set(256);
+ LodConfig.CLIENT.worldGenerator.lodDistanceCalculatorType.set(DistanceCalculatorType.LINEAR);
+ LodConfig.CLIENT.graphics.lodQuality.set(3);
+ LodConfig.CLIENT.worldGenerator.allowUnstableFeatureGeneration.set(false);
- LodConfig.CLIENT.bufferRebuildPlayerMoveTimeout.set(2000); // 2000
- LodConfig.CLIENT.bufferRebuildChunkChangeTimeout.set(1000); // 1000
- LodConfig.CLIENT.bufferRebuildLodChangeTimeout.set(50); // 5000
+ LodConfig.CLIENT.buffers.bufferRebuildPlayerMoveTimeout.set(2000); // 2000
+ LodConfig.CLIENT.buffers.bufferRebuildChunkChangeTimeout.set(1000); // 1000
+ LodConfig.CLIENT.buffers.bufferRebuildLodChangeTimeout.set(50); // 5000
- LodConfig.CLIENT.enableDebugKeybinding.set(true);
+ LodConfig.CLIENT.debugging.enableDebugKeybinding.set(true);
}
@@ -261,10 +261,10 @@ public class ClientProxy
@SubscribeEvent
public void onKeyInput(InputEvent.KeyInputEvent event)
{
- if(LodConfig.CLIENT.enableDebugKeybinding.get()
+ if(LodConfig.CLIENT.debugging.enableDebugKeybinding.get()
&& event.getKey() == GLFW.GLFW_KEY_F4 && event.getAction() == GLFW.GLFW_PRESS)
{
- LodConfig.CLIENT.debugMode.set(LodConfig.CLIENT.debugMode.get().getNext());
+ LodConfig.CLIENT.debugging.debugMode.set(LodConfig.CLIENT.debugging.debugMode.get().getNext());
}
}
@@ -297,7 +297,7 @@ public class ClientProxy
private void viewDistanceChangedEvent()
{
// calculate how wide the dimension(s) should be in regions
- int chunksWide = LodConfig.CLIENT.lodChunkRenderDistance.get() * 2 + 1;
+ int chunksWide = LodConfig.CLIENT.graphics.lodChunkRenderDistance.get() * 2 + 1;
int newWidth = (int) Math.ceil(chunksWide / (float) LodUtil.REGION_WIDTH_IN_CHUNKS);
newWidth = (newWidth % 2 == 0) ? (newWidth += 1) : (newWidth += 2); // make sure we have a odd number of regions
diff --git a/src/main/java/com/seibel/lod/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java
index 68d948d18..219c0a307 100644
--- a/src/main/java/com/seibel/lod/render/LodRenderer.java
+++ b/src/main/java/com/seibel/lod/render/LodRenderer.java
@@ -23,7 +23,6 @@ import java.nio.FloatBuffer;
import java.util.HashSet;
import java.util.Iterator;
-import com.seibel.lod.util.DetailDistanceUtil;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.NVFogDistance;
@@ -32,17 +31,18 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.seibel.lod.builders.LodBufferBuilder;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.DebugMode;
import com.seibel.lod.enums.FogDistance;
import com.seibel.lod.enums.FogDrawOverride;
import com.seibel.lod.enums.FogQuality;
-import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.handlers.ReflectionHandler;
import com.seibel.lod.objects.LodDimension;
import com.seibel.lod.objects.NearFarFogSettings;
import com.seibel.lod.objects.RegionPos;
import com.seibel.lod.objects.LevelPos.LevelPos;
import com.seibel.lod.proxy.ClientProxy;
+import com.seibel.lod.util.DetailDistanceUtil;
import com.seibel.lod.util.LodUtil;
import net.minecraft.client.Minecraft;
@@ -60,7 +60,6 @@ import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
-import org.lwjgl.system.CallbackI;
/**
@@ -244,7 +243,7 @@ public class LodRenderer
// set the required open GL settings
- if (LodConfig.CLIENT.debugMode.get() == DebugMode.SHOW_DETAIL_WIREFRAME)
+ if (LodConfig.CLIENT.debugging.debugMode.get() == DebugMode.SHOW_DETAIL_WIREFRAME)
GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
else
GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
@@ -266,7 +265,7 @@ public class LodRenderer
Matrix4f modelViewMatrix = generateModelViewMatrix(partialTicks);
// required for setupFog and setupProjectionMatrix
- farPlaneBlockDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * LodUtil.CHUNK_WIDTH;
+ farPlaneBlockDistance = LodConfig.CLIENT.graphics.lodChunkRenderDistance.get() * LodUtil.CHUNK_WIDTH;
setupProjectionMatrix(partialTicks);
setupLighting(lodDim, partialTicks);
@@ -663,7 +662,7 @@ public class LodRenderer
FogQuality quality = reflectionHandler.getFogQuality();
- FogDrawOverride override = LodConfig.CLIENT.fogDrawOverride.get();
+ FogDrawOverride override = LodConfig.CLIENT.graphics.fogDrawOverride.get();
if (quality == FogQuality.OFF)
@@ -707,7 +706,7 @@ public class LodRenderer
fogSettings.near.quality = FogQuality.FANCY;
fogSettings.far.quality = FogQuality.FANCY;
- switch (LodConfig.CLIENT.fogDistance.get())
+ switch (LodConfig.CLIENT.graphics.fogDistance.get())
{
case NEAR_AND_FAR:
fogSettings.near.distance = FogDistance.NEAR;
@@ -734,7 +733,7 @@ public class LodRenderer
// fog, since the LODs are separated into a near
// and far portion; and fast fog is rendered from the
// frustrum's perspective instead of the camera
- switch (LodConfig.CLIENT.fogDistance.get())
+ switch (LodConfig.CLIENT.graphics.fogDistance.get())
{
case NEAR_AND_FAR:
fogSettings.near.distance = FogDistance.NEAR;
@@ -778,23 +777,23 @@ public class LodRenderer
// full regens //
//=============//
// check if the view distance changed
- if (ClientProxy.previousLodRenderDistance != LodConfig.CLIENT.lodChunkRenderDistance.get()
+ if (ClientProxy.previousLodRenderDistance != LodConfig.CLIENT.graphics.lodChunkRenderDistance.get()
|| mc.options.renderDistance != prevRenderDistance
- || prevFogDistance != LodConfig.CLIENT.fogDistance.get())
+ || prevFogDistance != LodConfig.CLIENT.graphics.fogDistance.get())
{
DetailDistanceUtil.updateSettings();
fullRegen = true;
previousPos.changeParameters((byte) 4, mc.player.xChunk, mc.player.zChunk);
- prevFogDistance = LodConfig.CLIENT.fogDistance.get();
+ prevFogDistance = LodConfig.CLIENT.graphics.fogDistance.get();
prevRenderDistance = mc.options.renderDistance;
//should use this when it's ready
vanillaRenderedChunks = new boolean[renderDistance*2+2][renderDistance*2+2];
}
// did the user change the debug setting?
- if (LodConfig.CLIENT.debugMode.get() != previousDebugMode)
+ if (LodConfig.CLIENT.debugging.debugMode.get() != previousDebugMode)
{
- previousDebugMode = LodConfig.CLIENT.debugMode.get();
+ previousDebugMode = LodConfig.CLIENT.debugging.debugMode.get();
fullRegen = true;
}
@@ -802,7 +801,7 @@ public class LodRenderer
long newTime = System.currentTimeMillis();
// check if the player has moved
- if (newTime - prevPlayerPosTime > LodConfig.CLIENT.bufferRebuildPlayerMoveTimeout.get())
+ if (newTime - prevPlayerPosTime > LodConfig.CLIENT.buffers.bufferRebuildPlayerMoveTimeout.get())
{
if (previousPos.detailLevel == 0
|| mc.player.xChunk != previousPos.posX
@@ -824,7 +823,7 @@ public class LodRenderer
// check if the vanilla rendered chunks changed
- if (newTime - prevVanillaChunkTime > LodConfig.CLIENT.bufferRebuildChunkChangeTimeout.get())
+ if (newTime - prevVanillaChunkTime > LodConfig.CLIENT.buffers.bufferRebuildChunkChangeTimeout.get())
{
if (vanillaRenderedChunksChanged)
{
@@ -837,7 +836,7 @@ public class LodRenderer
// check if there is any newly generated terrain to show
- if (newTime - prevChunkTime > LodConfig.CLIENT.bufferRebuildLodChangeTimeout.get())
+ if (newTime - prevChunkTime > LodConfig.CLIENT.buffers.bufferRebuildLodChangeTimeout.get())
{
if (lodDim.regenDimension)
{
diff --git a/src/main/java/com/seibel/lod/render/RenderUtil.java b/src/main/java/com/seibel/lod/render/RenderUtil.java
index 3b33623cf..2cc40ec79 100644
--- a/src/main/java/com/seibel/lod/render/RenderUtil.java
+++ b/src/main/java/com/seibel/lod/render/RenderUtil.java
@@ -17,8 +17,8 @@
*/
package com.seibel.lod.render;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.LodTemplate;
-import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.util.LodUtil;
import net.minecraft.client.Minecraft;
@@ -97,7 +97,7 @@ public class RenderUtil
{
// calculate the max amount of buffer memory needed (in bytes)
return LodUtil.REGION_WIDTH_IN_CHUNKS * LodUtil.REGION_WIDTH_IN_CHUNKS *
- LodConfig.CLIENT.lodTemplate.get().getBufferMemoryForSingleLod();
+ LodConfig.CLIENT.graphics.lodTemplate.get().getBufferMemoryForSingleLod();
}
/**
diff --git a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java
index 53f310abd..a2d09628f 100644
--- a/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java
+++ b/src/main/java/com/seibel/lod/util/DetailDistanceUtil.java
@@ -1,12 +1,10 @@
package com.seibel.lod.util;
-import com.ibm.icu.util.IslamicCalendar;
-import com.seibel.lod.enums.DistanceCalculatorType;
+import com.seibel.lod.config.LodConfig;
import com.seibel.lod.enums.DistanceGenerationMode;
-import com.seibel.lod.enums.LodCorner;
import com.seibel.lod.enums.LodDetail;
-import com.seibel.lod.handlers.LodConfig;
import com.seibel.lod.objects.RegionPos;
+
import net.minecraft.client.Minecraft;
public class DetailDistanceUtil
@@ -14,11 +12,11 @@ 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.maxGenerationDetail.get().detailLevel;
- private static int minDrawDetail = Math.max(LodConfig.CLIENT.maxDrawDetail.get().detailLevel,LodConfig.CLIENT.maxGenerationDetail.get().detailLevel);
+ 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 maxDetail = LodUtil.REGION_DETAIL_LEVEL + 1;
private static int minDistance = 0;
- private static int maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16 * 2;
+ private static int maxDistance = LodConfig.CLIENT.graphics.lodChunkRenderDistance.get() * 16 * 2;
private static int base = 2;
private static double logBase = Math.log(2);
@@ -37,9 +35,9 @@ public class DetailDistanceUtil
public static void updateSettings(){
- minGenDetail = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel;
- minDrawDetail = Math.max(LodConfig.CLIENT.maxDrawDetail.get().detailLevel,LodConfig.CLIENT.maxGenerationDetail.get().detailLevel);
- maxDistance = LodConfig.CLIENT.lodChunkRenderDistance.get() * 16 * 2;
+ minGenDetail = LodConfig.CLIENT.worldGenerator.maxGenerationDetail.get().detailLevel;
+ minDrawDetail = Math.max(LodConfig.CLIENT.graphics.maxDrawDetail.get().detailLevel,LodConfig.CLIENT.worldGenerator.maxGenerationDetail.get().detailLevel);
+ maxDistance = LodConfig.CLIENT.graphics.lodChunkRenderDistance.get() * 16 * 2;
}
public static int getDistanceRendering(int detail)
@@ -52,13 +50,13 @@ public class DetailDistanceUtil
return maxDistance;
if (detail == maxDetail + 1)
return maxDistance;
- switch (LodConfig.CLIENT.lodDistanceCalculatorType.get())
+ switch (LodConfig.CLIENT.worldGenerator.lodDistanceCalculatorType.get())
{
case LINEAR:
- initial = LodConfig.CLIENT.lodQuality.get() * 128;
+ initial = LodConfig.CLIENT.graphics.lodQuality.get() * 128;
return (detail * initial);
case QUADRATIC:
- initial = LodConfig.CLIENT.lodQuality.get() * 128;
+ initial = LodConfig.CLIENT.graphics.lodQuality.get() * 128;
return (int) (Math.pow(base, detail) * initial);
case RENDER_DEPENDANT:
int realRenderDistance = Minecraft.getInstance().options.renderDistance * 16;
@@ -83,14 +81,14 @@ public class DetailDistanceUtil
detail = (byte) minDetail;
if (distance > maxDistance)
detail = (byte) (maxDetail-1);
- switch (LodConfig.CLIENT.lodDistanceCalculatorType.get())
+ switch (LodConfig.CLIENT.worldGenerator.lodDistanceCalculatorType.get())
{
case LINEAR:
- initial = LodConfig.CLIENT.lodQuality.get() * 128;
+ initial = LodConfig.CLIENT.graphics.lodQuality.get() * 128;
detail = (byte) Math.floorDiv(distance, initial);
break;
case QUADRATIC:
- initial = LodConfig.CLIENT.lodQuality.get() * 128;
+ initial = LodConfig.CLIENT.graphics.lodQuality.get() * 128;
detail = (byte) (Math.log(Math.floorDiv(distance, initial))/logBase);
break;
case RENDER_DEPENDANT:
@@ -144,7 +142,7 @@ public class DetailDistanceUtil
public static DistanceGenerationMode getDistanceGenerationMode(int detail)
{
- return LodConfig.CLIENT.distanceGenerationMode.get();
+ return LodConfig.CLIENT.worldGenerator.distanceGenerationMode.get();
}
public static byte getLodDrawDetail(int detail)