diff --git a/Readme.md b/Readme.md index ba593171f..668aca089 100644 --- a/Readme.md +++ b/Readme.md @@ -17,7 +17,7 @@ It should be automatically included when pulling the full mod. LZ4 for Java (data compression)\ https://github.com/lz4/lz4-java -Json & Toml for Java (config handling)\ +NightConfig for Json & Toml (config handling)\ https://github.com/TheElectronWill/night-config SVG Salamander for SVG's\ diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/config/client/IDhApiNoiseTextureConfig.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/config/client/IDhApiNoiseTextureConfig.java index fc0598b1d..bf490429d 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/config/client/IDhApiNoiseTextureConfig.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/config/client/IDhApiNoiseTextureConfig.java @@ -40,11 +40,9 @@ public interface IDhApiNoiseTextureConfig extends IDhApiConfigGroup IDhApiConfigValue noiseIntensity(); /** - * Defines how far should the noise texture render before it fades away.

- * - * 0.0 - the noise texture will render the entire LOD render distance.
- * 3.0 - the noise texture will fade away at 1/3 of the LOD render distance. + * Defines how far should the noise texture render before it fades away. (in blocks)
+ * Set to 0 to disable noise from fading away */ - IDhApiConfigValue noiseDropoff(); + IDhApiConfigValue noiseDropoff(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiNoiseTextureConfig.java b/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiNoiseTextureConfig.java index eff0162a2..a29637de8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiNoiseTextureConfig.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/config/client/DhApiNoiseTextureConfig.java @@ -45,7 +45,7 @@ public class DhApiNoiseTextureConfig implements IDhApiNoiseTextureConfig { return new DhApiConfigValue(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseIntensity); } @Override - public IDhApiConfigValue noiseDropoff() - { return new DhApiConfigValue(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseDropoff); } + public IDhApiConfigValue noiseDropoff() + { return new DhApiConfigValue(Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseDropoff); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java index b88fd43b5..2b1c68735 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java @@ -21,6 +21,7 @@ package com.seibel.distanthorizons.core.api.internal; import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelLoadEvent; import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelUnloadEvent; +import com.seibel.distanthorizons.core.generation.DhLightingEngine; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; import com.seibel.distanthorizons.core.level.IDhLevel; @@ -34,6 +35,9 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; import org.apache.logging.log4j.Logger; +import java.util.LinkedList; +import java.util.List; + /** * This holds the methods that should be called by the host mod loader (Fabric, * Forge, etc.). Specifically server events. @@ -148,6 +152,32 @@ public class ServerApi IDhLevel dhLevel = SharedApi.getAbstractDhWorld().getLevel(level); if (dhLevel != null) { + + // Save or populate the chunk wrapper's lighting + // this is done so we don't have to worry about MC unloading the lighting data for this chunk + if (chunk.isLightCorrect()) + { + try + { + chunk.bakeDhLightingUsingMcLightingEngine(); + chunk.setUseDhLighting(true); + } + catch (IllegalStateException e) + { + LOGGER.warn(e.getMessage(), e); + } + } + else + { + // generate the chunk's lighting, ignoring neighbors. + // not a perfect solution, but should prevent chunks from having completely broken lighting + List nearbyChunkList = new LinkedList<>(); + nearbyChunkList.add(chunk); + DhLightingEngine.INSTANCE.lightChunks(chunk, nearbyChunkList, level.hasSkyLight() ? 15 : 0); + chunk.setUseDhLighting(true); + } + + dhLevel.updateChunkAsync(chunk); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java index 3587be8a7..6fad187f2 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java @@ -30,16 +30,14 @@ import com.seibel.distanthorizons.core.config.eventHandlers.RenderCacheConfigEve import com.seibel.distanthorizons.core.config.eventHandlers.UnsafeValuesConfigListener; import com.seibel.distanthorizons.core.config.eventHandlers.presets.ThreadPresetConfigEventHandler; import com.seibel.distanthorizons.core.config.eventHandlers.presets.RenderQualityPresetConfigEventHandler; -import com.seibel.distanthorizons.core.config.types.ConfigCategory; -import com.seibel.distanthorizons.core.config.types.ConfigEntry; -import com.seibel.distanthorizons.core.config.types.ConfigLinkedEntry; -import com.seibel.distanthorizons.core.config.types.ConfigUIComment; +import com.seibel.distanthorizons.core.config.types.*; import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryAppearance; import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryPerformance; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.coreapi.ModInfo; import org.apache.logging.log4j.Logger; +import javax.swing.*; import java.util.*; @@ -468,14 +466,11 @@ public class Config + "How intense should the noise should be?") .build(); - public static ConfigEntry noiseDropoff = new ConfigEntry.Builder() // TODO: Make this a float (the ClassicConfigGUI doesn't support floats) - .setMinDefaultMax(0d, 3d, null) + public static ConfigEntry noiseDropoff = new ConfigEntry.Builder() // TODO: Make this a float (the ClassicConfigGUI doesn't support floats) + .setMinDefaultMax(0, 1024, null) .comment("" - + "How far should the noise texture render before it fades away? \n" - + "\n" - + "0.0 - the noise texture will render the entire LOD render distance. \n" - + "3.0 - the noise texture will fade away at 1/3 of the LOD render distance. \n" - + "") + + "Defines how far should the noise texture render before it fades away. (in blocks) \n" + + "Set to 0 to disable noise from fading away") .build(); } @@ -516,9 +511,9 @@ public class Config + "Distant Horizons' and Minecraft's near/far clip planes, \n" + "reducing overdraw. \n" + "\n" - + "Only tested in Minecraft 1.18.2.\n" + + "Only functional on Fabric.\n" + "Works best with an overdraw prevention setting of "+EOverdrawPrevention.MEDIUM+" or higher \n" - + " nd cave culling disabled. \n" + + " and cave culling is disabled. \n" + "") .setPerformance(EConfigEntryPerformance.NONE) .build(); @@ -1095,6 +1090,13 @@ public class Config + " will render their debug wireframes.") .build(); + public static ConfigEntry enableWhiteWorld = new ConfigEntry.Builder() + .set(false) + .comment("" + + "Stops vertex colors from being passed. \n" + + "Useful for debugging shaders") + .build(); + // Note: This will reset on game restart, and should have a warning on the tooltip public static ConfigEntry allowUnsafeValues = new ConfigEntry.Builder() .set(false) @@ -1109,6 +1111,8 @@ public class Config .build(); /** This class is used to debug the different features of the config GUI */ + // FIXME: WARNING: Some of the options in this class dont get show n in the default UI + // This will throw a warning when opened in the default ui to tell you about it not showing public static class ExampleConfigScreen { // Defined in the lang, just a note about this screen @@ -1137,7 +1141,7 @@ public class Config public static ConfigEntry longTest = new ConfigEntry.Builder() .set(42069L) .build(); - + public static ConfigEntry floatTest = new ConfigEntry.Builder() .set(0.42069f) .build(); @@ -1149,6 +1153,15 @@ public class Config public static ConfigEntry> listTest = new ConfigEntry.Builder>() .set(new ArrayList(Arrays.asList("option 1", "option 2", "option 3"))) .build(); + + public static ConfigEntry> mapTest = new ConfigEntry.Builder>() + .set(new HashMap()) + .build(); + + public static ConfigUIButton uiButtonTest = new ConfigUIButton(() -> { + System.setProperty("java.awt.headless", "false"); // Required to make it work + JOptionPane.showMessageDialog(null, "Button pressed!", "UITester dialog", JOptionPane.INFORMATION_MESSAGE); + }); public static ConfigCategory categoryTest = new ConfigCategory.Builder().set(CategoryTest.class).build(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandling.java b/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandling.java index 270ecda4c..e8ef1fef5 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandling.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandling.java @@ -112,9 +112,12 @@ public class ConfigFileHandling { @SuppressWarnings("unchecked") public void saveEntry(ConfigEntry entry, CommentedFileConfig workConfig) { if (!entry.getAppearance().showInFile) return; + if (entry.getTrueValue() == null) + throw new IllegalArgumentException("Entry ["+ entry.getNameWCategory() +"] is null, this may be a problem with ["+ configBase.modName +"]. Please contact the authors"); - if (ConfigTypeConverters.convertObjects.containsKey(entry.getType())) { - workConfig.set(entry.getNameWCategory(), ConfigTypeConverters.convertToString(entry.getType(), entry.getTrueValue())); + Class originalClass = ConfigTypeConverters.isClassConvertable(entry.getType()); + if (originalClass != null) { + workConfig.set(entry.getNameWCategory(), ConfigTypeConverters.convertToString(originalClass, entry.getTrueValue())); return; } workConfig.set(entry.getNameWCategory(), entry.getTrueValue()); @@ -139,8 +142,9 @@ public class ConfigFileHandling { entry.setWithoutSaving((T) ( workConfig.getEnum(entry.getNameWCategory(), (Class) entry.getType()))); return; } - if (ConfigTypeConverters.convertObjects.containsKey(entry.getType())) { - entry.setWithoutSaving((T) ConfigTypeConverters.convertFromString(entry.getType(), workConfig.get(entry.getNameWCategory()))); + Class originalClass = ConfigTypeConverters.isClassConvertable(entry.getType()); + if (originalClass != null) { + entry.setWithoutSaving((T) ConfigTypeConverters.convertFromString(originalClass, workConfig.get(entry.getNameWCategory()))); return; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigTypeConverters.java b/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigTypeConverters.java index b2da5f8a7..0ac53df7b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigTypeConverters.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigTypeConverters.java @@ -15,17 +15,25 @@ import java.util.Map; */ public class ConfigTypeConverters { // Once you've made a converter add it to here where the first value is the type you want to convert and the 2nd value is the converter - public static final Map convertObjects = new HashMap() {{ + public static final Map, ConverterBase> convertObjects = new HashMap, ConverterBase>() {{ put(Short.class, new ShortConverter()); put(Long.class, new LongConverter()); put(Float.class, new FloatConverter()); put(Byte.class, new ByteConverter()); put(Map.class, new MapConverter()); - put(HashMap.class, new MapConverter()); }}; - public static String convertToString(Class clazz, Object value) { + public static Class isClassConvertable(Class clazz) { + for (int i = 0; i < convertObjects.size(); i++) { + Class selectedClass = (Class) convertObjects.keySet().toArray()[i]; + if (selectedClass.isAssignableFrom(clazz)) + return selectedClass; + } + return null; + } + + public static String convertToString(Class clazz, Object value) { try { return convertObjects.get(clazz).convertToString(value); } catch (Exception e) { @@ -33,7 +41,7 @@ public class ConfigTypeConverters { return null; } } - public static Object convertFromString(Class clazz, String value) { + public static Object convertFromString(Class clazz, String value) { try { return convertObjects.get(clazz).convertFromString(value); } catch (Exception e) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/gui/standaloneTests/TestConfigMain.java b/core/src/main/java/com/seibel/distanthorizons/core/config/gui/standaloneTests/TestConfigMain.java deleted file mode 100644 index f7b893722..000000000 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/gui/standaloneTests/TestConfigMain.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.seibel.distanthorizons.core.config.gui.standaloneTests; - -import com.seibel.distanthorizons.core.config.gui.AbstractScreen; -import com.seibel.distanthorizons.core.config.gui.OpenGLConfigScreen; -import com.seibel.distanthorizons.core.pos.Pos2D; -import org.lwjgl.*; -import org.lwjgl.glfw.*; -import org.lwjgl.opengl.*; -import org.lwjgl.system.*; - -import java.nio.*; - -import static org.lwjgl.glfw.Callbacks.*; -import static org.lwjgl.glfw.GLFW.*; -import static org.lwjgl.opengl.GL11.*; -import static org.lwjgl.system.MemoryStack.*; -import static org.lwjgl.system.MemoryUtil.*; - -/** - * This just allows for a quicker testing of the config screen without loading up the whole game - * - * @author coolGi - */ -public class TestConfigMain { - // The window handle - private long window; - public AbstractScreen abstractScreen; - - - public static void main(String[] args) { - new TestConfigMain().run(); - } - - - public void run() { - abstractScreen = new OpenGLConfigScreen(); - System.out.println("Hello LWJGL version " + Version.getVersion()); - -// ClientApi.INSTANCE.rendererStartupEvent(); - init(); - - Pos2D windowDim = getWindowDimentions(window); - abstractScreen.width = windowDim.x; - abstractScreen.height = windowDim.y; - abstractScreen.init(); - loop(); - // Code isnt moved until loop is done (and it is only done if window is closed) - -// ClientApi.INSTANCE.rendererShutdownEvent(); - // Free the window callbacks and destroy the window - glfwFreeCallbacks(window); - glfwDestroyWindow(window); - - // Terminate GLFW and free the error callback - glfwTerminate(); - glfwSetErrorCallback(null).free(); - } - - private void init() { - // Setup an error callback. The default implementation - // will print the error message in System.err. - GLFWErrorCallback.createPrint(System.err).set(); - - // Initialize GLFW. Most GLFW functions will not work before doing this. - if ( !glfwInit() ) - throw new IllegalStateException("Unable to initialize GLFW"); - - // Configure GLFW - glfwDefaultWindowHints(); // optional, the current window hints are already the default - glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation - glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable - - // Create the window - window = glfwCreateWindow(640, 480, "DH Test config", NULL, NULL); - if ( window == NULL ) - throw new RuntimeException("Failed to create the GLFW window"); - - // Setup a key callback. It will be called every time a key is pressed, repeated or released. - // Is this really nessesery -// glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> { -// if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE ) -// glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop -// }); - - // Get the thread stack and push a new frame - try ( MemoryStack stack = stackPush() ) { - IntBuffer pWidth = stack.mallocInt(1); // int* - IntBuffer pHeight = stack.mallocInt(1); // int* - - // Get the window size passed to glfwCreateWindow - glfwGetWindowSize(window, pWidth, pHeight); - - // Get the resolution of the primary monitor - GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); - - // Center the window - glfwSetWindowPos( - window, - (vidmode.width() - pWidth.get(0)) / 2, - (vidmode.height() - pHeight.get(0)) / 2 - ); - } // the stack frame is popped automatically - - // Make the OpenGL context current - glfwMakeContextCurrent(window); - // Enable v-sync - glfwSwapInterval(1); - - // Make the window visible - glfwShowWindow(window); - GL.createCapabilities(); - } - - private void loop() { - // This line is critical for LWJGL's interoperation with GLFW's - // OpenGL context, or any context that is managed externally. - // LWJGL detects the context that is current in the current thread, - // creates the GLCapabilities instance and makes the OpenGL - // bindings available for use. - GL.createCapabilities(); - - // Set the clear color (if not set it would just be black) -// glClearColor(1.0f, 0.0f, 0.0f, 0.0f); - - // Set this so we can use it for the delta time - lastLoopTime = getTime(); - - // Run the rendering loop until the user has attempted to close - // the window or has pressed the ESCAPE key. - // (only works if glfwPollEvents() is called) - while ( !glfwWindowShouldClose(window) ) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer (will cause a ghosting effect if not called) - - // Poll for window events. (this allows the window to be closed) - glfwPollEvents(); - - Pos2D windowDim = getWindowDimentions(window); - abstractScreen.width = windowDim.x; - abstractScreen.height = windowDim.y; - - abstractScreen.render(getDelta()); - - - glfwSwapBuffers(window); // swap the color buffers - } - abstractScreen.onClose(); - } - - - - public Pos2D getWindowDimentions(long window) { - IntBuffer w = BufferUtils.createIntBuffer(1); - IntBuffer h = BufferUtils.createIntBuffer(1); - glfwGetWindowSize(window, w, h); - return new Pos2D(w.get(0), h.get(0)); - } - - - private double lastLoopTime; - private float timeCount; - public double getTime() { - return glfwGetTime(); - } - public float getDelta() { - double time = getTime(); - float delta = (float) (time - lastLoopTime); - lastLoopTime = time; - timeCount += delta; - return delta; - } -} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigCategory.java b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigCategory.java index cb282fc37..5197590f8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigCategory.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigCategory.java @@ -3,12 +3,13 @@ package com.seibel.distanthorizons.core.config.types; import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryAppearance; /** - * Adds a categoty to the config + * Adds a category to the config * See our config file for more information on how to use it * * @author coolGi */ public class ConfigCategory extends AbstractConfigType { + /** This should not be set by anything other than the config system itself */ public String destination; // Where the category goes to private ConfigCategory(EConfigEntryAppearance appearance, Class value, String destination) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigEntry.java b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigEntry.java index 4d1908490..218aacbd3 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigEntry.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigEntry.java @@ -7,12 +7,8 @@ import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryAppearance import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryPerformance; import com.seibel.distanthorizons.coreapi.interfaces.config.IConfigEntry; -import java.time.temporal.Temporal; import java.util.ArrayList; import java.util.Arrays; -import java.util.List; - -import static com.electronwill.nightconfig.core.NullObject.NULL_OBJECT; /** * Use for making the config variables @@ -44,29 +40,7 @@ public class ConfigEntry extends AbstractConfigType> implem private ConfigEntry(EConfigEntryAppearance appearance, T value, String comment, T min, T max, boolean allowApiOverride, EConfigEntryPerformance performance, ArrayList listenerList) { super(appearance, value); - - // runtime check to make sure the config value is supported by NightConfig, - // unfortunately we can't do this type of check statically without Java 16 - if (value == null) - { - throw new IllegalArgumentException("ConfigEntry setup failure. TOML doesn't support saving null values."); - } - // all of these types were taken from NightConfig's writing code - else if (!(value instanceof List) - && !(value instanceof CharSequence) // String - && !(value instanceof Enum) - && !(value instanceof Temporal) // Date or DateTime - && !(value instanceof Float || value instanceof Double) - && !(value instanceof Number) - && !(value instanceof Boolean) - // optional type that is specific to NightConfig, currently commented out so we aren't tied quite so tightly to NightConfig - //&& !(value instanceof Config) // NightConfig interface - ) - { - throw new IllegalArgumentException("ConfigEntry setup failure. Value type ["+value.getClass()+"] is not supported by NightConfig."); - } - - + this.defaultValue = value; this.comment = comment; this.min = min; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigUIButton.java b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigUIButton.java new file mode 100644 index 000000000..07f56fd77 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigUIButton.java @@ -0,0 +1,25 @@ +package com.seibel.distanthorizons.core.config.types; + +import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryAppearance; + +public class ConfigUIButton extends AbstractConfigType { + public ConfigUIButton(Runnable runnable) { + super(EConfigEntryAppearance.ONLY_IN_GUI, runnable); + } + + public void runAction() { + new Thread(this.value).start(); + } + + public static class Builder extends AbstractConfigType.Builder { + /** Appearance shouldn't be changed */ + @Override + public Builder setAppearance(EConfigEntryAppearance newAppearance) { + return this; + } + + public ConfigUIButton build() { + return new ConfigUIButton(this.tmpValue); + } + } +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigUIComment.java b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigUIComment.java index 75f8e075b..c0baf1e1d 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigUIComment.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigUIComment.java @@ -7,7 +7,7 @@ import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryAppearance * * @author coolGi */ -public class ConfigUIComment extends AbstractConfigType{ +public class ConfigUIComment extends AbstractConfigType { public ConfigUIComment() { super(EConfigEntryAppearance.ONLY_IN_GUI, ""); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/CompleteFullDataSource.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/CompleteFullDataSource.java index 808dd93ed..4c05a860f 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/CompleteFullDataSource.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/CompleteFullDataSource.java @@ -39,7 +39,7 @@ public class CompleteFullDataSource extends FullDataArrayAccessor implements IFu /** measured in dataPoints */ public static final int WIDTH = BitShiftUtil.powerOfTwo(SECTION_SIZE_OFFSET); - public static final byte DATA_FORMAT_VERSION = 1; + public static final byte DATA_FORMAT_VERSION = 2; /** written to the binary file to mark what {@link IFullDataSource} the binary file corresponds to */ public static final long TYPE_ID = "CompleteFullDataSource".hashCode(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/HighDetailIncompleteFullDataSource.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/HighDetailIncompleteFullDataSource.java index 535b10940..325e2316e 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/HighDetailIncompleteFullDataSource.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/HighDetailIncompleteFullDataSource.java @@ -52,7 +52,7 @@ public class HighDetailIncompleteFullDataSource implements IIncompleteFullDataSo /** aka max detail level */ public static final byte MAX_SECTION_DETAIL = SECTION_SIZE_OFFSET + SPARSE_UNIT_DETAIL; - public static final byte DATA_FORMAT_VERSION = 1; + public static final byte DATA_FORMAT_VERSION = 2; /** written to the binary file to mark what {@link IFullDataSource} the binary file corresponds to */ public static final long TYPE_ID = "HighDetailIncompleteFullDataSource".hashCode(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/LowDetailIncompleteFullDataSource.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/LowDetailIncompleteFullDataSource.java index e6c0c7233..86b2b738c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/LowDetailIncompleteFullDataSource.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/LowDetailIncompleteFullDataSource.java @@ -43,7 +43,7 @@ public class LowDetailIncompleteFullDataSource extends FullDataArrayAccessor imp /** measured in dataPoints */ public static final int WIDTH = BitShiftUtil.powerOfTwo(SECTION_SIZE_OFFSET); - public static final byte DATA_FORMAT_VERSION = 1; + public static final byte DATA_FORMAT_VERSION = 2; /** written to the binary file to mark what {@link IFullDataSource} the binary file corresponds to */ public static final long TYPE_ID = "LowDetailIncompleteFullDataSource".hashCode(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java index a9b0663a5..6fd140464 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/transformers/FullDataToRenderDataTransformer.java @@ -29,7 +29,8 @@ import com.seibel.distanthorizons.coreapi.util.BitShiftUtil; */ public class FullDataToRenderDataTransformer { - private static final IBlockStateWrapper AIR = SingletonInjector.INSTANCE.get(IWrapperFactory.class).getAirBlockStateWrapper(); + private static final IWrapperFactory WRAPPER_FACTORY = SingletonInjector.INSTANCE.get(IWrapperFactory.class); + private static final IBlockStateWrapper AIR = WRAPPER_FACTORY.getAirBlockStateWrapper(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataMetaFile.java b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataMetaFile.java index 168d04a28..bf7b6f91a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataMetaFile.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataMetaFile.java @@ -175,6 +175,7 @@ public class FullDataMetaFile extends AbstractMetaDataContainerFile implements I this.fullDataSourceLoader = AbstractFullDataSourceLoader.getLoader(this.baseMetaData.dataTypeId, this.baseMetaData.binaryDataFormatVersion); if (this.fullDataSourceLoader == null) { + // TODO add a hard coded dictionary of known ID name combos so we can easily see in the log if the ID is valid or if the data was corrupted/old throw new IOException("Invalid file: Data type loader not found: "+this.baseMetaData.dataTypeId+"(v"+this.baseMetaData.binaryDataFormatVersion +")"); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/jar/ModGitInfo.java b/core/src/main/java/com/seibel/distanthorizons/core/jar/ModGitInfo.java new file mode 100644 index 000000000..fabf0eb32 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/jar/ModGitInfo.java @@ -0,0 +1,29 @@ +package com.seibel.distanthorizons.core.jar; + +import com.electronwill.nightconfig.core.Config; +import com.electronwill.nightconfig.core.io.ParsingMode; +import com.electronwill.nightconfig.json.JsonFormat; + +/** + * Get info on the git for the mod
+ * Warning: Gets generated on runtime + * + * @author coolGi + */ +public final class ModGitInfo { + static { + // Warning: Atm, this file is in the common subproject as the processResources task in gradle doesnt work for core + String s = JarUtils.convertInputStreamToString(JarUtils.accessFile("build_info.json")); + + Config jsonObject = Config.inMemory(); + JsonFormat.minimalInstance().createParser().parse(s, jsonObject, ParsingMode.REPLACE); + + Git_Main_Commit = jsonObject.get("git_main_commit"); + Git_Core_Commit = jsonObject.get("git_core_commit"); + Git_Main_Branch = jsonObject.get("git_main_branch"); + } + + public static final String Git_Main_Commit; + public static final String Git_Core_Commit; + public static final String Git_Main_Branch; +} 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 546e860ab..344d792dd 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 @@ -59,7 +59,7 @@ public class BaseJFrame extends JFrame { // Creates a list with all the options in it List langsToChoose = new ArrayList<>(); try( - final InputStreamReader isr = new InputStreamReader(JarUtils.accessFile("assets/lod/lang"), StandardCharsets.UTF_8); + final InputStreamReader isr = new InputStreamReader(JarUtils.accessFile("assets/distanthorizons/lang"), StandardCharsets.UTF_8); final BufferedReader br = new BufferedReader(isr) ) { List col = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(br.lines().toArray()))); @@ -87,11 +87,11 @@ public class BaseJFrame extends JFrame { // Try to set the icons for them try { lightMode = new JButton(new ImageIcon( - new FlatSVGIcon(JarUtils.accessFile("assets/lod/textures/jar/themeLight.svg")).getImage() // Get the image + new FlatSVGIcon(JarUtils.accessFile("assets/distanthorizons/textures/jar/themeLight.svg")).getImage() // Get the image .getScaledInstance(themeButtonSize, themeButtonSize, Image.SCALE_DEFAULT) // Scale it to the correct size )); darkMode = new JButton(new ImageIcon( - new FlatSVGIcon(JarUtils.accessFile("assets/lod/textures/jar/themeDark.svg")).getImage() // Get the image + new FlatSVGIcon(JarUtils.accessFile("assets/distanthorizons/textures/jar/themeDark.svg")).getImage() // Get the image .getScaledInstance(themeButtonSize, themeButtonSize, Image.SCALE_DEFAULT) // Scale it to the correct size )); } catch (Exception e) {e.printStackTrace();} @@ -139,8 +139,7 @@ public class BaseJFrame extends JFrame { // This part of the code is taken from the official java docs at https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html // Specify the look and feel to use by defining the LOOKANDFEEL constant - // Valid values are: null (use the default), "Metal", "System", "Motif", - // and "GTK" + // Valid values are: null (use the default), "Metal", "System", "Motif", and "GTK" final static String LOOKANDFEEL = "GTK"; private static void initLookAndFeel() { String lookAndFeel = null; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/jar/installer/ModrinthGetter.java b/core/src/main/java/com/seibel/distanthorizons/core/jar/installer/ModrinthGetter.java index 097ae6f8b..8640c678f 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/jar/installer/ModrinthGetter.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/jar/installer/ModrinthGetter.java @@ -17,6 +17,7 @@ public class ModrinthGetter { public static final String projectID = "distanthorizons"; public static boolean initted = false; public static ArrayList projectRelease; + public static Map idToJson = new HashMap<>(); public static List releaseID = new ArrayList<>(); // This list contains the release ID's public static List mcVersions = new ArrayList<>(); // List of available Minecraft versions in the mod @@ -44,6 +45,7 @@ public class ModrinthGetter { String workingID = currentRelease.get("id").toString(); releaseID.add(workingID); + idToJson.put(workingID, currentRelease); releaseNames.put(workingID, currentRelease.get("name").toString().replaceAll(" - 1\\..*", "")); changeLogs.put(workingID, currentRelease.get("changelog").toString()); try { @@ -88,11 +90,9 @@ public class ModrinthGetter { return downloadUrl.get(mcVerToReleaseID.get(mcVer).get(0)); } public static String getLatestShaForVersion(String mcVer) { - return ((Config) - ((ArrayList) projectRelease.get( - mcVersions.indexOf(mcVer) - ).get("files")).get(0)) - .get("hashes.sha1") - .toString(); + return (((ArrayList) idToJson.get( + mcVerToReleaseID.get(mcVer).get(0) + ).get("files")).get(0).get("hashes.sha1") + .toString()); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/jar/updater/SelfUpdater.java b/core/src/main/java/com/seibel/distanthorizons/core/jar/updater/SelfUpdater.java index d08f3efa3..047ae3915 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/jar/updater/SelfUpdater.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/jar/updater/SelfUpdater.java @@ -10,6 +10,7 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; import org.apache.logging.log4j.Logger; +import javax.swing.*; import java.io.File; import java.net.URL; import java.nio.file.Files; @@ -107,6 +108,10 @@ public class SelfUpdater { deleteOldOnClose = true; LOGGER.info(ModInfo.READABLE_NAME + " successfully updated. It will apply on game's relaunch"); + new Thread(() -> { + System.setProperty("java.awt.headless", "false"); // Required to make it work + JOptionPane.showMessageDialog(null, ModInfo.READABLE_NAME+ " updated, this will be applied on game restart.", ModInfo.READABLE_NAME, JOptionPane.INFORMATION_MESSAGE); + }).start(); return true; } catch (Exception e) { LOGGER.warn("Failed to update "+ModInfo.READABLE_NAME+" to version "+ModrinthGetter.getLatestNameForVersion(minecraftVersion)); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java b/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java index 4d44bc0ba..8387d7979 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/fog/LodFogConfig.java @@ -57,10 +57,11 @@ public class LodFogConfig // TODO: Move these out of here public final int earthCurveRatio; + // Noise Values public final boolean noiseEnable; public final int noiseSteps; public final float noiseIntensity; - public final float noiseDropoff; + public final int noiseDropoff; public static LodFogConfig generateFogConfig() @@ -82,7 +83,7 @@ public class LodFogConfig noiseEnable = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseEnabled.get(); noiseSteps = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseSteps.get(); noiseIntensity = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseIntensity.get().floatValue(); - noiseDropoff = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseDropoff.get().floatValue(); + noiseDropoff = Config.Client.Advanced.Graphics.NoiseTextureSettings.noiseDropoff.get(); if (fogDrawMode != EFogDrawMode.FOG_DISABLED) 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 ad7e096f4..595ab0d4f 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 @@ -21,6 +21,7 @@ package com.seibel.distanthorizons.core.render.renderer; import java.awt.Color; +import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.render.glObject.GLProxy; import com.seibel.distanthorizons.core.render.glObject.shader.Shader; @@ -53,6 +54,7 @@ public class LodRenderProgram extends ShaderProgram public final int earthRadiusUniform; public final int lightMapUniform; + // Fog Uniforms public final int fogColorUniform; public final int fogScaleUniform; @@ -67,6 +69,9 @@ public class LodRenderProgram extends ShaderProgram public final int noiseIntensityUniform; public final int noiseDropoffUniform; + // Debug Uniform + public final int whiteWorldUniform; + public final LodFogConfig fogConfig; // This will bind VertexAttribute @@ -85,7 +90,7 @@ public class LodRenderProgram extends ShaderProgram lightMapUniform = getUniformLocation("lightMap"); - // Fog uniforms + // Fog Uniforms fullFogModeUniform = getUniformLocation("fullFogMode"); fogColorUniform = getUniformLocation("fogColor"); fogScaleUniform = tryGetUniformLocation("fogScale"); @@ -94,12 +99,16 @@ public class LodRenderProgram extends ShaderProgram nearFogStartUniform = tryGetUniformLocation("nearFogStart"); nearFogLengthUniform = tryGetUniformLocation("nearFogLength"); - // Noise uniforms + // Noise Uniforms noiseEnabledUniform = getUniformLocation("noiseEnabled"); noiseStepsUniform = getUniformLocation("noiseSteps"); noiseIntensityUniform = getUniformLocation("noiseIntensity"); noiseDropoffUniform = getUniformLocation("noiseDropoff"); + // Debug Uniform + whiteWorldUniform = getUniformLocation("whiteWorld"); + + // TODO: Add better use of the LODFormat thing int vertexByteCount = LodUtil.LOD_VERTEX_FORMAT.getByteSize(); if (GLProxy.getInstance().VertexAttributeBufferBindingSupported) @@ -122,6 +131,7 @@ public class LodRenderProgram extends ShaderProgram if (earthRadiusUniform != -1) setUniform(earthRadiusUniform, /*6371KM*/ 6371000.0f / fogConfig.earthCurveRatio); + // Noise Uniforms setUniform(noiseEnabledUniform, fogConfig.noiseEnable); setUniform(noiseStepsUniform, fogConfig.noiseSteps); setUniform(noiseIntensityUniform, fogConfig.noiseIntensity); @@ -178,6 +188,9 @@ public class LodRenderProgram extends ShaderProgram setUniform(fullFogModeUniform, fullFogMode ? 1 : 0); setUniform(fogColorUniform, fogColor); + // Debug + setUniform(whiteWorldUniform, Config.Client.Advanced.Debugging.enableWhiteWorld.get()); + float nearFogLen = vanillaDrawDistance * 0.2f / lodDrawDistance; float nearFogStart = vanillaDrawDistance * (VERSION_CONSTANTS.isVanillaRenderedChunkSquare() ? (float)Math.sqrt(2.) : 1.f) / lodDrawDistance; if (nearFogStartUniform != -1) setUniform(nearFogStartUniform, nearFogStart); 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 217318e82..02e84a119 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 @@ -161,8 +161,6 @@ public class LodRenderer drawSaveGLState.end("drawSaveGLState"); GLProxy glProxy = GLProxy.getInstance(); - if (Config.Client.Advanced.Graphics.Fog.disableVanillaFog.get()) - MC_RENDER.tryDisableVanillaFog(); //===================// // draw params setup // @@ -252,7 +250,7 @@ public class LodRenderer bufferHandler.renderOpaque(this); if (Config.Client.Advanced.Graphics.Quality.ssao.get()) { -// SSAOShader.INSTANCE.render(partialTicks); +// SSAOShader.INSTANCE.render(partialTicks); // For some reason this looks slightly different :/ SSAORenderer.INSTANCE.render(partialTicks); } { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/AbstractShaderRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/AbstractShaderRenderer.java index 43b6a1704..53932bdab 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/AbstractShaderRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/AbstractShaderRenderer.java @@ -29,7 +29,7 @@ public abstract class AbstractShaderRenderer { protected final ShaderProgram shader; protected final ShaderProgram applyShader; - protected GLVertexBuffer boxBuffer; + public GLVertexBuffer boxBuffer; protected VertexAttribute va; boolean init = false; @@ -46,9 +46,8 @@ public abstract class AbstractShaderRenderer { protected AbstractShaderRenderer(ShaderProgram shader, ShaderProgram applyShader) { this.shader = shader; this.applyShader = applyShader; - - } + private void init() { if (init) return; init = true; @@ -56,7 +55,7 @@ public abstract class AbstractShaderRenderer { va = VertexAttribute.create(); va.bind(); // Pos - va.setVertexAttribute(0, 0, VertexAttribute.VertexPointer.addVec2Pointer(false)); + setVertexAttributes(); va.completeAndCheck(Float.BYTES * 2); // Some shader stuff needs to be set a bit later than @@ -65,6 +64,10 @@ public abstract class AbstractShaderRenderer { createBuffer(); } + /** Sets all the vertex attributes */ + void setVertexAttributes() { + va.setVertexAttribute(0, 0, VertexAttribute.VertexPointer.addVec2Pointer(false)); + }; /** Overwrite this to apply uniforms to the shader */ void setShaderUniforms(float partialTicks) {}; /** Overwrite this to apply uniforms to the apply shader */ 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 87a5805f8..bc709d164 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 @@ -6,6 +6,7 @@ import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.render.fog.LodFogConfig; import com.seibel.distanthorizons.core.render.glObject.shader.Shader; import com.seibel.distanthorizons.core.render.glObject.shader.ShaderProgram; +import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.VertexAttribute; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; @@ -21,7 +22,10 @@ public class FogShader extends AbstractShaderRenderer { // public final int modelOffsetUniform; - public final int worldYOffsetUniform; +// public final int worldYOffsetUniform; + + public final int gProjUniform; + public final int gDepthMapUniform; // Fog Uniforms public final int fogColorUniform; @@ -36,13 +40,16 @@ public class FogShader extends AbstractShaderRenderer { // This code is just a temp fix so that it looks fine for the time being // and even with the jank soloution, i cannot get it to work super(new ShaderProgram( - () -> Shader.loadFile("shaders/fog/fog.vert", false, new StringBuilder()).toString(), + () -> Shader.loadFile("shaders/normal.vert", false, new StringBuilder()).toString(), () -> fogConfig.loadAndProcessFragShader("shaders/fog/fog.frag", false).toString(), - "fragColor", new String[] { "vPosition", "vPos", "color" } + "fragColor", new String[] { "vPosition" } )); // modelOffsetUniform = this.shader.getUniformLocation("modelOffset"); - worldYOffsetUniform = this.shader.getUniformLocation("worldYOffset"); +// worldYOffsetUniform = this.shader.tryGetUniformLocation("worldYOffset"); + + gProjUniform = this.shader.getUniformLocation("gProj"); + gDepthMapUniform = this.shader.getUniformLocation("gDepthMap"); // Fog uniforms fogColorUniform = this.shader.getUniformLocation("fogColor"); fullFogModeUniform = this.shader.getUniformLocation("fullFogMode"); @@ -53,6 +60,10 @@ public class FogShader extends AbstractShaderRenderer { nearFogLengthUniform = this.shader.tryGetUniformLocation("nearFogLength"); } + @Override + void setVertexAttributes() { + va.setVertexAttribute(0, 0, VertexAttribute.VertexPointer.addVec2Pointer(false)); + }; @Override void setShaderUniforms(float partialTicks) { @@ -62,8 +73,19 @@ public class FogShader extends AbstractShaderRenderer { vanillaDrawDistance += 32; // Give it a 2 chunk boundary for near fog. - this.shader.setUniform(worldYOffsetUniform, (float) MC.getWrappedClientWorld().getMinHeight()); + Mat4f perspective = Mat4f.perspective( + (float) MC_RENDER.getFov(partialTicks), + MC_RENDER.getTargetFrameBufferViewportWidth() / (float) MC_RENDER.getTargetFrameBufferViewportHeight(), + RenderUtil.getNearClipPlaneDistanceInBlocks(partialTicks), + (float) ((lodDrawDistance + LodUtil.REGION_WIDTH) * Math.sqrt(2))); + + +// if (worldYOffsetUniform != -1) this.shader.setUniform(worldYOffsetUniform, (float) MC.getWrappedClientWorld().getMinHeight()); + + + this.shader.setUniform(this.shader.getUniformLocation("gProj"), perspective); + GL32.glUniform1i(gDepthMapUniform, 0); // Fog this.shader.setUniform(fullFogModeUniform, MC_RENDER.isFogStateSpecial() ? 1 : 0); this.shader.setUniform(fogColorUniform, MC_RENDER.isFogStateSpecial() ? getSpecialFogColor(partialTicks) : getFogColor(partialTicks)); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAOShader.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAOShader.java index db7a18cf6..d7fb1e8d8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAOShader.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/shaders/SSAOShader.java @@ -1,6 +1,7 @@ package com.seibel.distanthorizons.core.render.renderer.shaders; import com.seibel.distanthorizons.core.render.glObject.shader.ShaderProgram; +import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.VertexAttribute; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.coreapi.util.math.Mat4f; @@ -16,9 +17,9 @@ public class SSAOShader extends AbstractShaderRenderer { public SSAOShader() { super( new ShaderProgram("shaders/normal.vert", "shaders/ssao/ao.frag", - "fragColor", new String[]{"vPos"}), + "fragColor", new String[]{"vPosition"}), new ShaderProgram("shaders/normal.vert", "shaders/ssao/apply-frag.frag", - "fragColor", new String[]{"vPos"}) + "fragColor", new String[]{"vPosition"}) ); } @@ -28,6 +29,11 @@ public class SSAOShader extends AbstractShaderRenderer { kernel = genKernel(); } + @Override + void setVertexAttributes() { + va.setVertexAttribute(0, 0, VertexAttribute.VertexPointer.addVec2Pointer(false)); + } + @Override void setShaderUniforms(float partialTicks) { Mat4f perspective = Mat4f.perspective( diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/chunk/IChunkWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/chunk/IChunkWrapper.java index f699a174f..c48299c66 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/chunk/IChunkWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/chunk/IChunkWrapper.java @@ -53,6 +53,7 @@ public interface IChunkWrapper extends IBindable long getLongChunkPos(); void setIsDhLightCorrect(boolean isDhLightCorrect); + void setUseDhLighting(boolean useDhLighting); boolean isLightCorrect(); @@ -65,6 +66,34 @@ public interface IChunkWrapper extends IBindable int getBlockLight(int relX, int relY, int relZ); int getSkyLight(int relX, int relY, int relZ); + /** + * Populates DH's saved lighting using MC's lighting engine. + * This is generally done in cases where MC's lighting is correct now, but may not be later (like when a chunk is unloading). + * + * @throws IllegalStateException if the chunk's lighting isn't valid. This is done to prevent accidentally baking broken lighting. + */ + default void bakeDhLightingUsingMcLightingEngine() throws IllegalStateException + { + if (!this.isLightCorrect()) + { + throw new IllegalStateException("Unable to bake lighting for for chunk ["+this.getChunkPos()+"], Minecraft lighting not valid."); + } + + // get the lighting for every relative block pos + for (int relX = 0; relX < LodUtil.CHUNK_WIDTH; relX++) + { + for (int relZ = 0; relZ < LodUtil.CHUNK_WIDTH; relZ++) + { + for (int y = this.getMinBuildHeight(); y < this.getMaxBuildHeight(); y++) + { + this.setDhSkyLight(relX, y, relZ, this.getSkyLight(relX, y, relZ)); + this.setDhBlockLight(relX, y, relZ, this.getBlockLight(relX, y, relZ)); + } + } + } + } + + List getBlockLightPosList(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java index d928cf8e7..f4e1c2a93 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java @@ -134,8 +134,5 @@ public interface IMinecraftRenderWrapper extends IBindable ILightMapWrapper getLightmapWrapper(); - // Try and disable vanilla fog. Return true if successful, or false if not able to. - boolean tryDisableVanillaFog(); - } diff --git a/core/src/main/resources/assets/distanthorizons/lang/en_us.json b/core/src/main/resources/assets/distanthorizons/lang/en_us.json index 36bd5c660..f14754785 100644 --- a/core/src/main/resources/assets/distanthorizons/lang/en_us.json +++ b/core/src/main/resources/assets/distanthorizons/lang/en_us.json @@ -224,7 +224,7 @@ "distanthorizons.config.client.advanced.graphics.noiseTextureSettings.noiseDropoff": "Noise Dropoff", "distanthorizons.config.client.advanced.graphics.noiseTextureSettings.noiseDropoff.@tooltip": - "How far should the noise texture render before it fades away? \n\n0.0 - the noise texture will render the entire LOD render distance. \n3.0 - the noise texture will fade away at 1/3 of the LOD render distance. ", + "Defines how far should the noise texture render before it fades away. (in blocks). \nSet to 0 to disable noise from fading away.", "distanthorizons.config.client.advanced.graphics.advancedGraphics": @@ -237,7 +237,7 @@ "distanthorizons.config.client.advanced.graphics.advancedGraphics.seamlessOverdraw": "(Experimental) Seamless Overdraw", "distanthorizons.config.client.advanced.graphics.advancedGraphics.seamlessOverdraw.@tooltip": - "Buggy experimental option that will attempt to match up \nDistant Horizons' and Minecraft's near/far clip planes, \nreducing overdraw.", + "Buggy experimental option that will attempt to match up \nDistant Horizons' and Minecraft's near/far clip planes, \nreducing overdraw. \n\nNote: only works with Fabric.", "distanthorizons.config.client.advanced.graphics.advancedGraphics.brightnessMultiplier": "Brightness Multiplier", "distanthorizons.config.client.advanced.graphics.advancedGraphics.brightnessMultiplier.@tooltip": @@ -383,7 +383,11 @@ "distanthorizons.config.client.advanced.debugging.debugWireframeRendering": "Enable Debug Wireframe Rendering", "distanthorizons.config.client.advanced.debugging.debugWireframeRendering.@tooltip": - "If enabled, various wireframes for debugging internal functions will be drawn.", + "If enabled, various wireframes for debugging internal functions will be drawn.", + "distanthorizons.config.client.advanced.debugging.enableWhiteWorld": + "Enable white world", + "distanthorizons.config.client.advanced.debugging.enableWhiteWorld.@tooltip": + "If enabled, vertex color will not be passed.\nUseful for debugging shaders.", "distanthorizons.config.client.advanced.debugging.allowUnsafeValues": "Allow Unsafe UI Values", "distanthorizons.config.client.advanced.debugging.allowUnsafeValues.@tooltip": @@ -460,6 +464,8 @@ "Float test", "distanthorizons.config.client.advanced.debugging.exampleConfigScreen.stringTest": "String test", + "distanthorizons.config.client.advanced.debugging.exampleConfigScreen.uiButtonTest": + "UI Button test", "distanthorizons.config.client.advanced.debugging.exampleConfigScreen.listTest": "List (ArrayList) test", "distanthorizons.config.client.advanced.debugging.exampleConfigScreen.mapTest": diff --git a/core/src/main/resources/shaders/flat_shaded.frag b/core/src/main/resources/shaders/flat_shaded.frag index 3d7632a2b..99a6b47ec 100644 --- a/core/src/main/resources/shaders/flat_shaded.frag +++ b/core/src/main/resources/shaders/flat_shaded.frag @@ -6,16 +6,18 @@ in vec4 vPos; out vec4 fragColor; +// Fog Uniforms uniform float fogScale; uniform float fogVerticalScale; uniform float nearFogStart; uniform float nearFogLength; uniform int fullFogMode; +// Noise Uniforms uniform bool noiseEnabled; uniform int noiseSteps; uniform float noiseIntensity; -uniform float noiseDropoff; +uniform int noiseDropoff; /* ========MARCO DEFINED BY RUNTIME CODE GEN========= @@ -84,20 +86,80 @@ vec3 HSV2RGB(vec3 c) { } -/** + +/** * Fragment Shader - * + * * author: James Seibel * author: coolGi * version: 7-2-2023 */ void main() { - vec4 returnColor; + fragColor = vertexColor; + // TODO: Move into its own function instead of in an if statement + if (noiseEnabled) { + vec3 vertexNormal = normalize(cross(dFdx(vPos.xyz), dFdy(vPos.xyz))); + // This bit of code is required to fix the vertex position problem cus of floats in the verted world position varuable + vec3 fixedVPos = vec3( + vPos.x - vertexNormal.x * 0.001, + vPos.y - vertexNormal.y * 0.001, + vPos.z - vertexNormal.z * 0.001 + ); + + + float noiseAmplification = noiseIntensity / 100; + noiseAmplification = (-1 * pow(2*((fragColor.x + fragColor.y + fragColor.z) / 3) - 1, 2) + 1) * noiseAmplification; // Lessen the effect on depending on how dark the object is, equasion for this is -(2x-1)^{2}+1 + noiseAmplification *= fragColor.w; // The effect would lessen on transparent objects + + // Random value for each position + float randomValue = rand(vec3( + quantize(fixedVPos.x, noiseSteps), + quantize(fixedVPos.y, noiseSteps), + quantize(fixedVPos.z, noiseSteps) + )) + * 2. * noiseAmplification - noiseAmplification; + + + // Modifies the color + // A value of 0 on the randomValue will result in the original color, while a value of 1 will result in a fully bright color + vec3 newCol = fragColor.rgb + (vec3(1.0) - fragColor.rgb) * randomValue; + + // Clamps it and turns it back into a vec4 + if (noiseDropoff == 0) + fragColor = vec4( + clamp(newCol.r, 0., 1.), + clamp(newCol.g, 0., 1.), + clamp(newCol.b, 0., 1.), + fragColor.w + ); + else + fragColor = mix( + vec4( + clamp(newCol.r, 0., 1.), + clamp(newCol.g, 0., 1.), + clamp(newCol.b, 0., 1.), + fragColor.w + ), fragColor, + clamp(length(vertexWorldPos) / noiseDropoff, 0., 1.) // The further away it gets, the less noise gets applied + ); + + // For testing + // if (fragColor.r != 69420.) { + // fragColor = vec4( + // mod(fixedVPos.x, 1), + // mod(fixedVPos.y, 1), + // mod(fixedVPos.z, 1), + // fragColor.w); + // } + } + + // TODO: Move into its own function instead of in an if statement + // This is so that it can apply after the SSAO (work for this has started in the FogShader file and fog/fog.frag shader) if (fullFogMode != 0) { - returnColor = vec4(fogColor.rgb, 1.0); + fragColor = vec4(fogColor.rgb, 1.0); } else { // TODO: add a white texture to support Optifine shaders //vec4 textureColor = texture(texImage, textureCoord); @@ -115,59 +177,8 @@ void main() float mixedFogThickness = clamp(mixFogThickness( nearFogThickness, farFogThickness, heightFogThickness), 0.0, 1.0); - returnColor = mix(vertexColor, vec4(fogColor.rgb, 1.0), mixedFogThickness); - } - - if (noiseEnabled) { - // This bit of code is required to fix the vertex position problem cus of floats in the verted world position varuable - vec3 vertexNormal = normalize(cross(dFdx(vPos.xyz), dFdy(vPos.xyz))); - vec3 fixedVPos = vec3( - vPos.x - vertexNormal.x * 0.001, - vPos.y - vertexNormal.y * 0.001, - vPos.z - vertexNormal.z * 0.001 - ); - - - float noiseAmplification = noiseIntensity / 100; - noiseAmplification = (-1 * pow(2*((returnColor.x + returnColor.y + returnColor.z) / 3) - 1, 2) + 1) * noiseAmplification; // Lessen the effect on depending on how dark the object is, equasion for this is -(2x-1)^{2}+1 - noiseAmplification *= returnColor.w; // The effect would lessen on transparent objects - - // Random value for each position - float randomValue = rand(vec3( - quantize(fixedVPos.x, noiseSteps), - quantize(fixedVPos.y, noiseSteps), - quantize(fixedVPos.z, noiseSteps) - )) - * 2. * noiseAmplification - noiseAmplification; - - - // Modifies the color - // A value of 0 on the randomValue will result in the original color, while a value of 1 will result in a fully bright color - vec3 newCol = returnColor.rgb + (vec3(1.0) - returnColor.rgb) * randomValue; - - // Clamps it and turns it back into a vec4 - returnColor = mix( - vec4( - clamp(newCol.r, 0., 1.), - clamp(newCol.g, 0., 1.), - clamp(newCol.b, 0., 1.), - returnColor.w - ), returnColor, - clamp(length(vertexWorldPos) * fogScale * noiseDropoff, 0., 1.) // The further away it gets, the less noise gets applied - ); - - // For testing -// if (returnColor.r != 69420.) { -// returnColor = vec4( -// mod(fixedVPos.x, 1), -// mod(fixedVPos.y, 1), -// mod(fixedVPos.z, 1), -// returnColor.w); -// } + fragColor = mix(fragColor, vec4(fogColor.rgb, 1.0), mixedFogThickness); } - - // If "w" is just set to just 1. then it would crash - fragColor = returnColor; } @@ -179,13 +190,13 @@ float linearFog(float x, float fogStart, float fogLength, float fogMin, float fo } float exponentialFog(float x, float fogStart, float fogLength, - float fogMin, float fogRange, float fogDensity) { +float fogMin, float fogRange, float fogDensity) { x = max((x-fogStart)/fogLength, 0.0) * fogDensity; return fogMin + fogRange - fogRange/exp(x); } float exponentialSquaredFog(float x, float fogStart, float fogLength, - float fogMin, float fogRange, float fogDensity) { +float fogMin, float fogRange, float fogDensity) { x = max((x-fogStart)/fogLength, 0.0) * fogDensity; return fogMin + fogRange - fogRange/exp(x*x); } \ No newline at end of file diff --git a/core/src/main/resources/shaders/fog/fog.frag b/core/src/main/resources/shaders/fog/fog.frag index d4a5a4653..d19f59906 100644 --- a/core/src/main/resources/shaders/fog/fog.frag +++ b/core/src/main/resources/shaders/fog/fog.frag @@ -1,10 +1,12 @@ -in vec3 vertexWorldPos; -in float vertexYPos; -//in vec2 TexCoord; +in vec2 TexCoord; + +//in float vertexYPos; out vec4 fragColor; +uniform sampler2D gDepthMap; +uniform mat4 gProj; uniform float fogScale; uniform float fogVerticalScale; @@ -15,6 +17,20 @@ uniform int fullFogMode; uniform vec4 fogColor; +/* ========MARCO DEFINED BY RUNTIME CODE GEN========= + +float farFogStart; +float farFogLength; +float farFogMin; +float farFogRange; +float farFogDensity; + +float heightFogStart; +float heightFogLength; +float heightFogMin; +float heightFogRange; +float heightFogDensity; +*/ // method definitions // ==== The below 5 methods will be run-time generated. ==== @@ -42,6 +58,20 @@ float mod(float x, int y) { } +vec3 calcViewPosition(vec2 coords) { + float fragmentDepth = texture(gDepthMap, coords).r; + + vec4 ndc = vec4( + coords.x * 2.0 - 1.0, + coords.y * 2.0 - 1.0, + fragmentDepth * 2.0 - 1.0, + 1.0 + ); + + vec4 vs_pos = inverse(gProj) * ndc; + vs_pos.xyz = vs_pos.xyz / vs_pos.w; + return vs_pos.xyz; +} /** * Fragment shader for fog. @@ -50,6 +80,9 @@ float mod(float x, int y) { * version: 2023-6-21 */ void main() { + float vertexYPos = 100f; + vec3 vertexWorldPos = calcViewPosition(TexCoord); + if (fullFogMode != 0) { fragColor = vec4(fogColor.r, fogColor.g, fogColor.b, 1.); } else { @@ -70,16 +103,10 @@ void main() { // Testing // if (fragColor.r != 6969.) { // This line is so that the compiler doesnt delete the previos code -//// fragColor = vec4( -//// mod(vertexWorldPos.x, 1), -//// mod(vertexWorldPos.y, 1), -//// mod(vertexWorldPos.z, 1), -//// 1. -//// ); // fragColor = vec4( -// mod(vertexYPos, 1), -// mod(vertexYPos, 1), -// mod(vertexYPos, 1), +// mod(texture(gDepthMap, TexCoord).x, 1), +// mod(texture(gDepthMap, TexCoord).y, 1), +// mod(texture(gDepthMap, TexCoord).z, 1), // 1. // ); // } diff --git a/core/src/main/resources/shaders/fog/fog.vert b/core/src/main/resources/shaders/fog/fog.vert deleted file mode 100644 index 463249402..000000000 --- a/core/src/main/resources/shaders/fog/fog.vert +++ /dev/null @@ -1,19 +0,0 @@ -#version 150 core - - -//uniform vec3 modelOffset; -uniform float worldYOffset; - -in vec2 vPos; -in uvec4 vPosition; -out vec3 vertexWorldPos; -out float vertexYPos; - - -void main() -{ -// vertexWorldPos = vPosition.xyz + modelOffset; - vertexYPos = vPosition.y + worldYOffset; - - gl_Position = vec4(vPos, 1.0, 1.0); -} \ No newline at end of file diff --git a/core/src/main/resources/shaders/normal.vert b/core/src/main/resources/shaders/normal.vert index 1485baf0e..fe4bfe03b 100644 --- a/core/src/main/resources/shaders/normal.vert +++ b/core/src/main/resources/shaders/normal.vert @@ -1,11 +1,11 @@ #version 150 core -in vec2 vPos; +in vec2 vPosition; out vec2 TexCoord; void main() { - gl_Position = vec4(vPos, 1.0, 1.0); - TexCoord = vPos.xy * 0.5 + 0.5; + gl_Position = vec4(vPosition, 1.0, 1.0); + TexCoord = vPosition.xy * 0.5 + 0.5; } \ No newline at end of file diff --git a/core/src/main/resources/shaders/ssao/ao.frag b/core/src/main/resources/shaders/ssao/ao.frag index d8d77ccf0..15f648764 100644 --- a/core/src/main/resources/shaders/ssao/ao.frag +++ b/core/src/main/resources/shaders/ssao/ao.frag @@ -1,7 +1,6 @@ #version 150 core in vec2 TexCoord; -in vec2 ViewRay; out vec4 fragColor; diff --git a/core/src/main/resources/shaders/standard.vert b/core/src/main/resources/shaders/standard.vert index 88904a744..ffa41f9db 100644 --- a/core/src/main/resources/shaders/standard.vert +++ b/core/src/main/resources/shaders/standard.vert @@ -8,6 +8,8 @@ out vec4 vertexColor; out vec3 vertexWorldPos; out float vertexYPos; +uniform bool whiteWorld; + uniform mat4 combinedMatrix; uniform vec3 modelOffset; uniform float worldYOffset; @@ -51,7 +53,9 @@ void main() float light2 = (mod(float(lights), 16.0)+0.5) / 16.0; float light = (float(lights/16u)+0.5) / 16.0; - vertexColor = color * vec4(texture(lightMap, vec2(light, light2)).xyz, 1.0); + vertexColor = vec4(texture(lightMap, vec2(light, light2)).xyz, 1.0); + if (!whiteWorld) + vertexColor *= color; gl_Position = combinedMatrix * vec4(vertexWorldPos + vec3(mx, 0, mz), 1.0); }