From aa7ea85cde4b5825bcfde1976f5fbc002077d7c6 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sun, 22 Aug 2021 14:34:02 +0200 Subject: [PATCH] New config --- .../seibel/lod/builders/LodBufferBuilder.java | 13 +++----- .../com/seibel/lod/handlers/LodConfig.java | 32 +++++++++++++++---- .../com/seibel/lod/objects/LodRegion.java | 2 ++ .../com/seibel/lod/proxy/ClientProxy.java | 10 +++--- .../com/seibel/lod/render/LodRenderer.java | 12 +++---- .../java/com/seibel/lod/util/DetailUtil.java | 12 ++++--- 6 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 8674c46a7..6d81b3718 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -219,11 +219,9 @@ public class LodBufferBuilder for (LevelPos pos : posListToRender) { LevelPos chunkPos = pos.convert(LodUtil.CHUNK_DETAIL_LEVEL); - int chunkX = chunkPos.posX; - int chunkZ = chunkPos.posZ; // skip any chunks that Minecraft is going to render - if (isCoordInCenterArea(chunkPos.posX, chunkPos.posZ, (numbChunksWide / 2)) || renderer.vanillaRenderedChunks.contains(new ChunkPos(chunkX, chunkZ))) + if (renderer.vanillaRenderedChunks.contains(new ChunkPos( chunkPos.posX, chunkPos.posZ))) { continue; } @@ -315,7 +313,6 @@ public class LodBufferBuilder requesting = maxChunkGenRequests - posListToGenerate.size(); } - if (LodConfig.CLIENT.distanceGenerationMode.get() != DistanceGenerationMode.NONE) { // determine which points in the posListToGenerate @@ -463,11 +460,11 @@ public class LodBufferBuilder */ private boolean isCoordInCenterArea(int i, int j, int centerCoordinate) { - return (i >= centerCoordinate - mc.options.renderDistance - && i <= centerCoordinate + mc.options.renderDistance) + return (i >= centerCoordinate - (mc.options.renderDistance + 2) + && i <= centerCoordinate + (mc.options.renderDistance + 2)) && - (j >= centerCoordinate - mc.options.renderDistance - && j <= centerCoordinate + mc.options.renderDistance); + (j >= centerCoordinate - (mc.options.renderDistance + 2) + && j <= centerCoordinate + (mc.options.renderDistance + 2)); } diff --git a/src/main/java/com/seibel/lod/handlers/LodConfig.java b/src/main/java/com/seibel/lod/handlers/LodConfig.java index aa0d91cbe..f77b1d387 100644 --- a/src/main/java/com/seibel/lod/handlers/LodConfig.java +++ b/src/main/java/com/seibel/lod/handlers/LodConfig.java @@ -20,18 +20,13 @@ package com.seibel.lod.handlers; 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.DistanceGenerationMode; -import com.seibel.lod.enums.FogDistance; -import com.seibel.lod.enums.FogDrawOverride; -import com.seibel.lod.enums.LodDetail; -import com.seibel.lod.enums.LodTemplate; -import com.seibel.lod.enums.ShadingMode; import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -77,6 +72,8 @@ public class LodConfig */ public ForgeConfigSpec.IntValue lodChunkRadiusMultiplier; + public ForgeConfigSpec.EnumValue lodDistanceCalculatorType; + public ForgeConfigSpec.IntValue lodQuality; public ForgeConfigSpec.IntValue lodChunkRenderDistane; @@ -160,6 +157,29 @@ public class LodConfig + " of LODs in each cardinal direction. \n") .defineInRange("lodChunkRadiusMultiplier", 8, 2, 16); + 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); + + lodQuality = builder + .comment("\n\n" + + " this value is multiplied by 128 and determine \n" + + " how much the quality decrease over distance \n") + .defineInRange("lodChunkRadiusMultiplier", 1, 1, 4); + + lodChunkRenderDistane = builder + .comment("\n\n" + + " This is the render distance of the mod \n") + .defineInRange("lodChunkRadiusMultiplier", 128, 32, 128); + distanceGenerationMode = builder .comment("\n\n" + " Note: The times listed here are the amount of time it took \n" diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index b0ee10f38..886c761c8 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -205,6 +205,8 @@ public class LodRegion implements Serializable } /** + * This method will return all the levelPos that are renderable according to the requisite given in input + * * @return */ public List> getDataToGenerate(int playerPosX, int playerPosZ, int start, int end, byte generation, byte detailLevel, int dataNumber) diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index 4d68a98c9..d10a61b11 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -17,17 +17,13 @@ */ package com.seibel.lod.proxy; +import com.seibel.lod.enums.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.seibel.lod.builders.LodBufferBuilder; import com.seibel.lod.builders.LodBuilder; import com.seibel.lod.builders.worldGeneration.LodNodeGenWorker; -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; @@ -151,6 +147,10 @@ public class ClientProxy LodConfig.CLIENT.distanceGenerationMode.set(DistanceGenerationMode.FEATURES); LodConfig.CLIENT.allowUnstableFeatureGeneration.set(false); + LodConfig.CLIENT.lodChunkRenderDistane.set(96); + LodConfig.CLIENT.lodDistanceCalculatorType.set(DistanceCalculatorType.LINEAR); + LodConfig.CLIENT.lodQuality.set(1); + LodConfig.CLIENT.allowUnstableFeatureGeneration.set(false); // has to be set in the config file // LodConfig.CLIENT.numberOfWorldGenerationThreads.set(16); diff --git a/src/main/java/com/seibel/lod/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java index 1b14b98d2..73e1ee615 100644 --- a/src/main/java/com/seibel/lod/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/render/LodRenderer.java @@ -229,11 +229,11 @@ public class LodRenderer // determine how far the game's render distance is currently set //farPlaneBlockDistance = mc.options.renderDistance * LodUtil.CHUNK_WIDTH; - farPlaneBlockDistance = 8 * LodUtil.CHUNK_WIDTH; + farPlaneBlockDistance = LodConfig.CLIENT.lodChunkRenderDistane.get() * LodUtil.CHUNK_WIDTH; // set how how far the LODs will go //int numbChunksWide = mc.options.renderDistance * 2 * LodConfig.CLIENT.lodChunkRadiusMultiplier.get(); - int numbChunksWide = 8 * 2 * LodConfig.CLIENT.lodChunkRadiusMultiplier.get() + 1; + int numbChunksWide =LodConfig.CLIENT.lodChunkRenderDistane.get() * 2; // determine which LODs should not be rendered close to the player HashSet chunkPosToSkip = getNearbyLodChunkPosToSkip(lodDim, player.blockPosition()); @@ -461,12 +461,12 @@ public class LodRenderer { if (fogQuality == FogQuality.FANCY) { - RenderSystem.fogStart(farPlaneBlockDistance * 0.85f * LodConfig.CLIENT.lodChunkRadiusMultiplier.get()); - RenderSystem.fogEnd(farPlaneBlockDistance * 1.0f * LodConfig.CLIENT.lodChunkRadiusMultiplier.get()); + RenderSystem.fogStart(farPlaneBlockDistance * 0.85f); + RenderSystem.fogEnd(farPlaneBlockDistance * 1.0f); } else if (fogQuality == FogQuality.FAST) { - RenderSystem.fogStart(farPlaneBlockDistance * 0.5f * LodConfig.CLIENT.lodChunkRadiusMultiplier.get()); - RenderSystem.fogEnd(farPlaneBlockDistance * 0.75f * LodConfig.CLIENT.lodChunkRadiusMultiplier.get()); + RenderSystem.fogStart(farPlaneBlockDistance * 0.5f); + RenderSystem.fogEnd(farPlaneBlockDistance * 0.75f); } } diff --git a/src/main/java/com/seibel/lod/util/DetailUtil.java b/src/main/java/com/seibel/lod/util/DetailUtil.java index aff640076..3877d2106 100644 --- a/src/main/java/com/seibel/lod/util/DetailUtil.java +++ b/src/main/java/com/seibel/lod/util/DetailUtil.java @@ -2,15 +2,15 @@ package com.seibel.lod.util; import com.seibel.lod.enums.DistanceCalculatorType; import com.seibel.lod.enums.DistanceGenerationMode; +import com.seibel.lod.enums.LodQuality; +import com.seibel.lod.handlers.LodConfig; public class DetailUtil { - private static int initial = 200; private static double genMultiplier = 1.5; - private static DistanceCalculatorType calculator = DistanceCalculatorType.LINEAR; - private static final int maxDetail = 10; + private static final int maxDetail = LodUtil.REGION_DETAIL_LEVEL + 1; private static final int minDistance = 0; - private static final int maxDistance = 1000000; + private static final int maxDistance = LodConfig.CLIENT.lodChunkRenderDistane.get() * 16; private static DistanceGenerationMode[] distancesGenerators = { DistanceGenerationMode.SURFACE, DistanceGenerationMode.SURFACE, @@ -23,10 +23,12 @@ public class DetailUtil DistanceGenerationMode.SURFACE, DistanceGenerationMode.SURFACE}; + public static int getDistanceRendering(int detail) { int distance = 0; - switch (calculator) + int initial = LodConfig.CLIENT.lodQuality.get() * 128; + switch (LodConfig.CLIENT.lodDistanceCalculatorType.get()) { case LINEAR: distance = (detail * initial);