diff --git a/src/main/java/com/seibel/lod/LodMain.java b/src/main/java/com/seibel/lod/LodMain.java index b96661de8..711340f3d 100644 --- a/src/main/java/com/seibel/lod/LodMain.java +++ b/src/main/java/com/seibel/lod/LodMain.java @@ -1,7 +1,7 @@ package com.seibel.lod; +import com.seibel.lod.handlers.LodConfigHandler; import com.seibel.lod.proxy.ClientProxy; -import com.seibel.lod.util.LodConfig; import net.minecraft.client.Minecraft; import net.minecraftforge.common.MinecraftForge; @@ -34,7 +34,7 @@ public class LodMain private void init(final FMLCommonSetupEvent event) { Minecraft.getInstance().getFramebuffer().enableStencil(); - ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, LodConfig.clientSpec); + ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, LodConfigHandler.clientSpec); } diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index ba51e4bcd..d7868c472 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -4,11 +4,11 @@ import java.util.concurrent.Executors; import org.lwjgl.opengl.GL11; +import com.seibel.lod.handlers.LodConfigHandler; import com.seibel.lod.objects.LodChunk; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.NearFarBuffer; import com.seibel.lod.render.LodRender; -import com.seibel.lod.util.LodConfig; import com.seibel.lod.util.LodUtils; import net.minecraft.client.Minecraft; @@ -191,7 +191,7 @@ public class LodBufferBuilder // get the desired LodTemplate and // add this LOD to the buffer - LodConfig.CLIENT.lodTemplate.get(). + LodConfigHandler.CLIENT.lodTemplate.get(). template.addLodToBuffer(currentBuffer, lodDim, lod, xOffset, yOffset, zOffset, renderer.debugging); } diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index 4c9612703..9a134d18d 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -6,11 +6,11 @@ import java.util.concurrent.Executors; import com.seibel.lod.enums.ColorDirection; import com.seibel.lod.enums.LodDetail; +import com.seibel.lod.handlers.LodConfigHandler; import com.seibel.lod.objects.LodChunk; import com.seibel.lod.objects.LodDataPoint; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodWorld; -import com.seibel.lod.util.LodConfig; import com.seibel.lod.util.LodUtils; import net.minecraft.block.BlockState; @@ -123,7 +123,7 @@ public class LodBuilder throw new IllegalArgumentException("generateLodFromChunk given a null chunk"); - LodDetail detail = LodConfig.CLIENT.lodDetail.get(); + LodDetail detail = LodConfigHandler.CLIENT.lodDetail.get(); LodDataPoint[][] dataPoints = new LodDataPoint[detail.lengthCount][detail.lengthCount]; for(int i = 0; i < detail.lengthCount * detail.lengthCount; i++) 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 8ac0c8ae4..9a2ebb32f 100644 --- a/src/main/java/com/seibel/lod/builders/lodTemplates/CubicLodTemplate.java +++ b/src/main/java/com/seibel/lod/builders/lodTemplates/CubicLodTemplate.java @@ -4,9 +4,9 @@ import java.awt.Color; import com.seibel.lod.enums.ColorDirection; import com.seibel.lod.enums.LodDetail; +import com.seibel.lod.handlers.LodConfigHandler; import com.seibel.lod.objects.LodChunk; import com.seibel.lod.objects.LodDimension; -import com.seibel.lod.util.LodConfig; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.util.math.AxisAlignedBB; @@ -36,7 +36,7 @@ public class CubicLodTemplate extends AbstractLodTemplate // Add this LOD to the BufferBuilder // using the quality setting set by the config - LodDetail detail = LodConfig.CLIENT.lodDetail.get(); + LodDetail detail = LodConfigHandler.CLIENT.lodDetail.get(); int halfWidth = detail.width / 2; diff --git a/src/main/java/com/seibel/lod/util/LodConfig.java b/src/main/java/com/seibel/lod/handlers/LodConfigHandler.java similarity index 98% rename from src/main/java/com/seibel/lod/util/LodConfig.java rename to src/main/java/com/seibel/lod/handlers/LodConfigHandler.java index c0fb26fac..59c397491 100644 --- a/src/main/java/com/seibel/lod/util/LodConfig.java +++ b/src/main/java/com/seibel/lod/handlers/LodConfigHandler.java @@ -1,4 +1,4 @@ -package com.seibel.lod.util; +package com.seibel.lod.handlers; import java.nio.file.Path; import java.nio.file.Paths; @@ -24,7 +24,7 @@ import net.minecraftforge.fml.config.ModConfig; * @version 6-17-2021 */ @Mod.EventBusSubscriber -public class LodConfig +public class LodConfigHandler { public static class Client { diff --git a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java index 5b75f8260..e5dde6e39 100644 --- a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java @@ -13,7 +13,6 @@ import com.seibel.lod.objects.LodChunk; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodRegion; import com.seibel.lod.proxy.ClientProxy; -import com.seibel.lod.util.LodConfig; /** * This object handles creating LodRegions @@ -84,7 +83,7 @@ public class LodDimensionFileHandler public LodRegion loadRegionFromFile(int regionX, int regionZ) { - String fileName = getFileNameAndPathForRegion(regionX, regionZ, LodConfig.CLIENT.lodDetail.get()); + String fileName = getFileNameAndPathForRegion(regionX, regionZ, LodConfigHandler.CLIENT.lodDetail.get()); File f = new File(fileName); @@ -159,7 +158,7 @@ public class LodDimensionFileHandler try { // convert each line into an LOD object and add it to the region - LodChunk lod = new LodChunk(s, LodConfig.CLIENT.lodDetail.get()); + LodChunk lod = new LodChunk(s, LodConfigHandler.CLIENT.lodDetail.get()); region.addLod(lod); } @@ -235,7 +234,7 @@ public class LodDimensionFileHandler int x = region.x; int z = region.z; - File f = new File(getFileNameAndPathForRegion(x, z, LodConfig.CLIENT.lodDetail.get())); + File f = new File(getFileNameAndPathForRegion(x, z, LodConfigHandler.CLIENT.lodDetail.get())); try { diff --git a/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java b/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java index d88340216..6aeba3cd7 100644 --- a/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java +++ b/src/main/java/com/seibel/lod/mixin/MixinWorldRenderer.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.matrix.MatrixStack; import com.seibel.lod.LodMain; -import com.seibel.lod.util.LodConfig; +import com.seibel.lod.handlers.LodConfigHandler; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.WorldRenderer; @@ -39,7 +39,7 @@ public class MixinWorldRenderer { // only render if LODs are enabled and // only render before solid blocks - if (LodConfig.CLIENT.drawLODs.get() && renderType.equals(RenderType.getSolid())) + if (LodConfigHandler.CLIENT.drawLODs.get() && renderType.equals(RenderType.getSolid())) LodMain.client_proxy.renderLods(previousPartialTicks); } } diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index 4235a278d..03281386e 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -5,12 +5,12 @@ import org.apache.logging.log4j.Logger; import com.seibel.lod.builders.LodBufferBuilder; import com.seibel.lod.builders.LodBuilder; +import com.seibel.lod.handlers.LodConfigHandler; import com.seibel.lod.objects.LodChunk; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodRegion; import com.seibel.lod.objects.LodWorld; import com.seibel.lod.render.LodRender; -import com.seibel.lod.util.LodConfig; import com.seibel.lod.util.LodUtils; import net.minecraft.client.Minecraft; @@ -63,7 +63,7 @@ public class ClientProxy // update each regions' width to match the new render distance int newWidth = Math.max(4, // TODO is this logic good? - (mc.gameSettings.renderDistanceChunks * LodChunk.WIDTH * 2 * LodConfig.CLIENT.lodChunkRadiusMultiplier.get()) / LodRegion.SIZE + (mc.gameSettings.renderDistanceChunks * LodChunk.WIDTH * 2 * LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.get()) / LodRegion.SIZE ); if (lodBuilder.regionWidth != newWidth) { diff --git a/src/main/java/com/seibel/lod/render/LodRender.java b/src/main/java/com/seibel/lod/render/LodRender.java index 96c84d693..ddf7d1481 100644 --- a/src/main/java/com/seibel/lod/render/LodRender.java +++ b/src/main/java/com/seibel/lod/render/LodRender.java @@ -13,15 +13,13 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.seibel.lod.builders.LodBufferBuilder; import com.seibel.lod.enums.FogDistance; import com.seibel.lod.enums.FogQuality; -import com.seibel.lod.enums.LodDetail; -import com.seibel.lod.enums.LodTemplate; +import com.seibel.lod.handlers.LodConfigHandler; import com.seibel.lod.handlers.ReflectionHandler; import com.seibel.lod.objects.LodChunk; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.NearFarBuffer; import com.seibel.lod.objects.NearFarFogSetting; import com.seibel.lod.proxy.ClientProxy; -import com.seibel.lod.util.LodConfig; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; @@ -158,14 +156,14 @@ public class LodRender if ((int)player.getPosX() / LodChunk.WIDTH != prevChunkX || (int)player.getPosZ() / LodChunk.WIDTH != prevChunkZ || previousChunkRenderDistance != mc.gameSettings.renderDistanceChunks || - prevFogDistance != LodConfig.CLIENT.fogDistance.get()) + prevFogDistance != LodConfigHandler.CLIENT.fogDistance.get()) { // yes regen = true; prevChunkX = (int)player.getPosX() / LodChunk.WIDTH; prevChunkZ = (int)player.getPosZ() / LodChunk.WIDTH; - prevFogDistance = LodConfig.CLIENT.fogDistance.get(); + prevFogDistance = LodConfigHandler.CLIENT.fogDistance.get(); } else { @@ -175,9 +173,9 @@ public class LodRender } // did the user change the debug setting? - if (LodConfig.CLIENT.debugMode.get() != debugging) + if (LodConfigHandler.CLIENT.debugMode.get() != debugging) { - debugging = LodConfig.CLIENT.debugMode.get(); + debugging = LodConfigHandler.CLIENT.debugMode.get(); regen = true; } @@ -187,7 +185,7 @@ public class LodRender farPlaneDistance = renderDistWidth * LodChunk.WIDTH; // set how big the LODs will be and how far they will go - int totalLength = (int) farPlaneDistance * LodConfig.CLIENT.lodChunkRadiusMultiplier.get() * 2; + int totalLength = (int) farPlaneDistance * LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.get() * 2; int numbChunksWide = (totalLength / LodChunk.WIDTH); // see if the chunks Minecraft is going to render are the @@ -411,13 +409,13 @@ public class LodRender { if (fogQuality == FogQuality.FANCY) { - RenderSystem.fogStart(farPlaneDistance * 0.85f * LodConfig.CLIENT.lodChunkRadiusMultiplier.get()); - RenderSystem.fogEnd(farPlaneDistance * 1.0f * LodConfig.CLIENT.lodChunkRadiusMultiplier.get()); + RenderSystem.fogStart(farPlaneDistance * 0.85f * LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.get()); + RenderSystem.fogEnd(farPlaneDistance * 1.0f * LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.get()); } else if(fogQuality == FogQuality.FAST) { - RenderSystem.fogStart(farPlaneDistance * 0.5f * LodConfig.CLIENT.lodChunkRadiusMultiplier.get()); - RenderSystem.fogEnd(farPlaneDistance * 0.75f * LodConfig.CLIENT.lodChunkRadiusMultiplier.get()); + RenderSystem.fogStart(farPlaneDistance * 0.5f * LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.get()); + RenderSystem.fogEnd(farPlaneDistance * 0.75f * LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.get()); } } @@ -497,7 +495,7 @@ public class LodRender getFov(partialTicks, true), (float)this.mc.getMainWindow().getFramebufferWidth() / (float)this.mc.getMainWindow().getFramebufferHeight(), 0.5F, - this.farPlaneDistance * LodConfig.CLIENT.lodChunkRadiusMultiplier.get() * 2); + this.farPlaneDistance * LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.get() * 2); // add the screen space distortions projectionMatrix.mul(matrixStack.getLast().getMatrix()); @@ -531,24 +529,24 @@ public class LodRender private void setupBuffers(int numbChunksWide) { // calculate the max amount of memory needed (in bytes) - int bufferMemory = getBufferMemoryForRadiusMultiplier(LodConfig.CLIENT.lodChunkRadiusMultiplier.get()); + int bufferMemory = RenderUtil.getBufferMemoryForRadiusMultiplier(LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.get()); // if the required memory is greater than the // MAX_ALOCATEABLE_DIRECT_MEMORY lower the lodChunkRadiusMultiplier // to fit. if (bufferMemory > MAX_ALOCATEABLE_DIRECT_MEMORY) { - int maxRadiusMultiplier = getMaxRadiusMultiplierWithAvaliableMemory(LodConfig.CLIENT.lodTemplate.get(), LodConfig.CLIENT.lodDetail.get()); + int maxRadiusMultiplier = RenderUtil.getMaxRadiusMultiplierWithAvaliableMemory(LodConfigHandler.CLIENT.lodTemplate.get(), LodConfigHandler.CLIENT.lodDetail.get()); ClientProxy.LOGGER.warn("The lodChunkRadiusMultiplier was set too high " + "and had to be lowered to fit memory constraints " - + "from " + LodConfig.CLIENT.lodChunkRadiusMultiplier.get() + " " + + "from " + LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.get() + " " + "to " + maxRadiusMultiplier); - LodConfig.CLIENT.lodChunkRadiusMultiplier.set( + LodConfigHandler.CLIENT.lodChunkRadiusMultiplier.set( maxRadiusMultiplier); - bufferMemory = getBufferMemoryForRadiusMultiplier(maxRadiusMultiplier); + bufferMemory = RenderUtil.getBufferMemoryForRadiusMultiplier(maxRadiusMultiplier); } drawableNearBuffer = new BufferBuilder(bufferMemory); @@ -557,32 +555,6 @@ public class LodRender lodBufferBuilder.setupBuffers(bufferMemory); } - /** - * Get how much buffer memory would be required for the given radius multiplier - */ - public int getBufferMemoryForRadiusMultiplier(int radiusMultiplier) - { - int numbChunksWide = mc.gameSettings.renderDistanceChunks * - radiusMultiplier * 2; - - // calculate the max amount of buffer memory needed (in bytes) - return numbChunksWide * numbChunksWide * - LodConfig.CLIENT.lodTemplate.get(). - getBufferMemoryForSingleLod(LodConfig.CLIENT.lodDetail.get()); - } - - /** - * Returns the maxViewDistanceMultiplier for the given LodTemplate - * at the given LodDetail level. - */ - public int getMaxRadiusMultiplierWithAvaliableMemory(LodTemplate lodTemplate, LodDetail lodDetail) - { - int maxNumberOfLods = MAX_ALOCATEABLE_DIRECT_MEMORY / lodTemplate.getBufferMemoryForSingleLod(lodDetail); - int numbLodsWide = (int) Math.sqrt(maxNumberOfLods); - - return numbLodsWide / (2 * mc.gameSettings.renderDistanceChunks); - } - @@ -649,7 +621,7 @@ public class LodRender { case FANCY: - switch(LodConfig.CLIENT.fogDistance.get()) + switch(LodConfigHandler.CLIENT.fogDistance.get()) { case NEAR_AND_FAR: fogSetting.nearFogSetting = FogDistance.NEAR; @@ -674,7 +646,7 @@ public class LodRender // and far portion; and fast fog is rendered from the // frustrum's perspective instead of the camera - switch(LodConfig.CLIENT.fogDistance.get()) + switch(LodConfigHandler.CLIENT.fogDistance.get()) { case NEAR_AND_FAR: fogSetting.nearFogSetting = FogDistance.NEAR; diff --git a/src/main/java/com/seibel/lod/render/RenderUtil.java b/src/main/java/com/seibel/lod/render/RenderUtil.java index 3c0842afc..229a9afe6 100644 --- a/src/main/java/com/seibel/lod/render/RenderUtil.java +++ b/src/main/java/com/seibel/lod/render/RenderUtil.java @@ -1,5 +1,9 @@ package com.seibel.lod.render; +import com.seibel.lod.enums.LodDetail; +import com.seibel.lod.enums.LodTemplate; +import com.seibel.lod.handlers.LodConfigHandler; + import net.minecraft.client.Minecraft; /** @@ -7,10 +11,12 @@ import net.minecraft.client.Minecraft; * to be used in the rendering process. * * @author James Seibel - * @version 2-13-2021 + * @version 6-17-2021 */ public class RenderUtil { + private static final Minecraft mc = Minecraft.getInstance(); + /** * Returns if the given coordinate is in the loaded area of the world. * @param centerCoordinate the center of the loaded world @@ -42,4 +48,30 @@ public class RenderUtil && j <= lodRadius + halfRadius); } + + /** + * Get how much buffer memory would be required for the given radius multiplier + */ + public static int getBufferMemoryForRadiusMultiplier(int radiusMultiplier) + { + int numbChunksWide = mc.gameSettings.renderDistanceChunks * + radiusMultiplier * 2; + + // calculate the max amount of buffer memory needed (in bytes) + return numbChunksWide * numbChunksWide * + LodConfigHandler.CLIENT.lodTemplate.get(). + getBufferMemoryForSingleLod(LodConfigHandler.CLIENT.lodDetail.get()); + } + + /** + * Returns the maxViewDistanceMultiplier for the given LodTemplate + * at the given LodDetail level. + */ + public static int getMaxRadiusMultiplierWithAvaliableMemory(LodTemplate lodTemplate, LodDetail lodDetail) + { + int maxNumberOfLods = LodRender.MAX_ALOCATEABLE_DIRECT_MEMORY / lodTemplate.getBufferMemoryForSingleLod(lodDetail); + int numbLodsWide = (int) Math.sqrt(maxNumberOfLods); + + return numbLodsWide / (2 * mc.gameSettings.renderDistanceChunks); + } }