diff --git a/core/src/main/java/com/seibel/distanthorizons/core/Initializer.java b/core/src/main/java/com/seibel/distanthorizons/core/Initializer.java index b55b4aa8f..4a1d48fcf 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/Initializer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/Initializer.java @@ -20,6 +20,7 @@ package com.seibel.distanthorizons.core; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.sql.DatabaseUpdater; import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.world.DhApiWorldProxy; @@ -35,6 +36,8 @@ import net.jpountz.lz4.LZ4Compressor; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.io.InputStream; + /** Handles first time Core setup. */ public class Initializer { @@ -57,6 +60,21 @@ public class Initializer throw e; } + // confirm the resource directory is present + try + { + int scriptCount = DatabaseUpdater.getAutoUpdateScriptCount(); + if (scriptCount == 0) + { + throw new NullPointerException("No auto update scripts found, but no error thrown. This might mean the script list file is corrupted or empty."); + } + } + catch (Exception e) + { + LOGGER.fatal("Critical programmer error: Can't read SQL Scripts resource folder is either missing or malformed. Error: [" + e.getMessage() + "]."); + throw new RuntimeException(e); + } + CompleteFullDataSourceLoader unused2 = new CompleteFullDataSourceLoader(); // Auto register into the loader system diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataFileHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataFileHandler.java index 7cf65631d..9b8cb54e0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataFileHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataFileHandler.java @@ -31,6 +31,7 @@ import com.seibel.distanthorizons.core.level.IDhLevel; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.render.renderer.DebugRenderer; +import com.seibel.distanthorizons.core.render.renderer.IDebugRenderable; import com.seibel.distanthorizons.core.sql.AbstractDataSourceRepo; import com.seibel.distanthorizons.core.sql.FullDataRepo; import com.seibel.distanthorizons.core.sql.DataSourceDto; @@ -46,7 +47,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -public class FullDataFileHandler extends AbstractDataSourceHandler implements IFullDataSourceProvider +public class FullDataFileHandler + extends AbstractDataSourceHandler + implements IFullDataSourceProvider, IDebugRenderable { private static final Logger LOGGER = DhLoggerBuilder.getLogger(); @@ -71,7 +74,12 @@ public class FullDataFileHandler extends AbstractDataSourceHandler { renderer.renderBox(new DebugRenderer.Box(pos, -32f, 128f, 0.15f, Color.cyan)); }); + + } + + } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/jar/gui/BaseJFrame.java b/core/src/main/java/com/seibel/distanthorizons/core/jar/gui/BaseJFrame.java index 023ada081..25c2908de 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/jar/gui/BaseJFrame.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/jar/gui/BaseJFrame.java @@ -29,7 +29,6 @@ import java.awt.*; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.InputStreamReader; -import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.List; @@ -58,7 +57,7 @@ public class BaseJFrame extends JFrame setTitle(SingletonInjector.INSTANCE.get(ILangWrapper.class).getLang("lod.title")); try { - setIconImage(ImageIO.read(JarUtils.accessFile("icon.png"))); + setIconImage(ImageIO.read(JarUtils.accessFile("assets/distanthorizons/icon.png"))); } catch (Exception e) { @@ -165,7 +164,7 @@ public class BaseJFrame extends JFrame super.paintComponent(g); try { - BufferedImage image = ImageIO.read(JarUtils.accessFile("logo.png")); + BufferedImage image = ImageIO.read(JarUtils.accessFile("assets/distanthorizons/logo.png")); int logoWidth = (int) ((double) logoHeight * ((double) image.getWidth() / (double) image.getHeight())); // Calculate the aspect ratio and set the height correctly to not stretch it g.drawImage(image, (getWidth() / 2) - (logoWidth / 2), 0, logoWidth, logoHeight, this); // Resize image and draw it } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java index 8fb1da7a4..a66d3c028 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java @@ -385,15 +385,23 @@ public class RenderBufferHandler implements AutoCloseable public void renderOpaque(LodRenderer renderContext, DhApiRenderParam renderEventParam) { - this.loadedNearToFarBuffers.forEach(loadedBuffer -> loadedBuffer.buffer.renderOpaque(renderContext, renderEventParam)); + // TODO why can these sometimes be null when teleporting between multiverses + if (this.loadedNearToFarBuffers != null) + { + this.loadedNearToFarBuffers.forEach(loadedBuffer -> loadedBuffer.buffer.renderOpaque(renderContext, renderEventParam)); + } } public void renderTransparent(LodRenderer renderContext, DhApiRenderParam renderEventParam) { - ListIterator iter = this.loadedNearToFarBuffers.listIterator(this.loadedNearToFarBuffers.size()); - while (iter.hasPrevious()) + // TODO why can these sometimes be null when teleporting between multiverses + if (this.loadedNearToFarBuffers != null) { - LoadedRenderBuffer loadedBuffer = iter.previous(); - loadedBuffer.buffer.renderTransparent(renderContext, renderEventParam); + ListIterator iter = this.loadedNearToFarBuffers.listIterator(this.loadedNearToFarBuffers.size()); + while (iter.hasPrevious()) + { + LoadedRenderBuffer loadedBuffer = iter.previous(); + loadedBuffer.buffer.renderTransparent(renderContext, renderEventParam); + } } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java index 255653c6a..d044b149d 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java @@ -187,6 +187,10 @@ public class LodRenderProgram extends ShaderProgram implements IDhApiShaderProgr // Clip Uniform float dhNearClipDistance = RenderUtil.getNearClipPlaneDistanceInBlocks(renderParameters.partialTicks); + // TODO a different multiplier might be necessary + // this is to try and allow the fragment culling to go farther than the near clip plane. + // Currently this only works for certain FOV/screen ratio combos. + dhNearClipDistance *= 2.0f; setUniform(clipDistanceUniform, dhNearClipDistance); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java index 6f2148976..bd3e4eea1 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java @@ -392,7 +392,11 @@ public class LodRenderer if (Config.Client.Advanced.Graphics.Fog.drawMode.get() != EFogDrawMode.FOG_DISABLED) { profiler.popPush("LOD Fog"); - FogShader.INSTANCE.setModelViewProjectionMatrix(renderEventParam.dhModelViewMatrix); + + Mat4f combinedMatrix = new Mat4f(renderEventParam.dhProjectionMatrix); + combinedMatrix.multiply(renderEventParam.dhModelViewMatrix); + + FogShader.INSTANCE.setModelViewProjectionMatrix(combinedMatrix); FogShader.INSTANCE.render(renderEventParam.partialTicks); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/FogShader.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/FogShader.java index f9725c10b..2d5a3491c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/FogShader.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/FogShader.java @@ -96,7 +96,7 @@ public class FogShader extends AbstractShaderRenderer { this.shader.setUniform(this.gInvertedModelViewProjectionUniform, this.inverseMvmProjMatrix); - int lodDrawDistance = RenderUtil.getFarClipPlaneDistanceInBlocks(); + int lodDrawDistance = Config.Client.Advanced.Graphics.Quality.lodChunkRenderDistanceRadius.get() * LodUtil.CHUNK_WIDTH; int vanillaDrawDistance = MC_RENDER.getRenderDistance() * LodUtil.CHUNK_WIDTH; vanillaDrawDistance += LodUtil.CHUNK_WIDTH * 2; // Give it a 2 chunk boundary for near fog. diff --git a/core/src/main/java/com/seibel/distanthorizons/core/sql/DatabaseUpdater.java b/core/src/main/java/com/seibel/distanthorizons/core/sql/DatabaseUpdater.java index 131fb92a8..d41c3cdc1 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/sql/DatabaseUpdater.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/sql/DatabaseUpdater.java @@ -222,6 +222,18 @@ public class DatabaseUpdater + //====================// + // startup validation // + //====================// + + /** + * Can be used to confirm the auto update scripts are in their expected folder. + * Will throw an exception if the scripts are missing or malformed. + */ + public static int getAutoUpdateScriptCount() throws NullPointerException, IOException { return getAutoUpdateScripts().size(); } + + + //================// // helper classes // //================// diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/RenderUtil.java b/core/src/main/java/com/seibel/distanthorizons/core/util/RenderUtil.java index 4f4352643..0ea8414ca 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/util/RenderUtil.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/util/RenderUtil.java @@ -186,13 +186,7 @@ public class RenderUtil public static float getNearClipPlaneDistanceInBlocks(float partialTicks) { int chunkRenderDistance = MC_RENDER.getRenderDistance(); - if (chunkRenderDistance % 2 == 0) - { - chunkRenderDistance += 1; - } - int vanillaBlockRenderedDistance = chunkRenderDistance * LodUtil.CHUNK_WIDTH; - vanillaBlockRenderedDistance *= 2; float nearClipPlane; if (Config.Client.Advanced.Debugging.lodOnlyMode.get()) @@ -220,6 +214,7 @@ public class RenderUtil double fov = MC_RENDER.getFov(partialTicks); double aspectRatio = (double) MC_RENDER.getScreenWidth() / MC_RENDER.getScreenHeight(); + // source: https://stackoverflow.com/questions/8101119/how-do-i-methodically-choose-the-near-clip-plane-distance-for-a-perspective-proj/8101234#8101234 return (float) (nearClipPlane / Math.sqrt(1d + MathUtil.pow2(Math.tan(fov / 180d * Math.PI / 2d)) * (MathUtil.pow2(aspectRatio) + 1d))); diff --git a/core/src/main/resources/icon.png b/core/src/main/resources/assets/distanthorizons/icon.png similarity index 100% rename from core/src/main/resources/icon.png rename to core/src/main/resources/assets/distanthorizons/icon.png diff --git a/core/src/main/resources/icon.svg b/core/src/main/resources/assets/distanthorizons/icon.svg similarity index 100% rename from core/src/main/resources/icon.svg rename to core/src/main/resources/assets/distanthorizons/icon.svg diff --git a/core/src/main/resources/iconLegacy.svg b/core/src/main/resources/assets/distanthorizons/iconLegacy.svg similarity index 100% rename from core/src/main/resources/iconLegacy.svg rename to core/src/main/resources/assets/distanthorizons/iconLegacy.svg diff --git a/core/src/main/resources/logo.png b/core/src/main/resources/assets/distanthorizons/logo.png similarity index 100% rename from core/src/main/resources/logo.png rename to core/src/main/resources/assets/distanthorizons/logo.png