diff options
Diffstat (limited to 'src/main/java')
5 files changed, 164 insertions, 7 deletions
diff --git a/src/main/java/io/polyfrost/oneconfig/OneConfig.java b/src/main/java/io/polyfrost/oneconfig/OneConfig.java index 3c867b9..dedf6b8 100644 --- a/src/main/java/io/polyfrost/oneconfig/OneConfig.java +++ b/src/main/java/io/polyfrost/oneconfig/OneConfig.java @@ -6,6 +6,7 @@ import io.polyfrost.oneconfig.config.core.ConfigCore; import io.polyfrost.oneconfig.config.data.Mod; import io.polyfrost.oneconfig.config.data.ModType; import io.polyfrost.oneconfig.hud.HudCore; +import io.polyfrost.oneconfig.lwjgl.BlurHandler; import io.polyfrost.oneconfig.lwjgl.RenderManager; import io.polyfrost.oneconfig.lwjgl.font.Fonts; import io.polyfrost.oneconfig.lwjgl.image.Images; @@ -46,6 +47,7 @@ public class OneConfig { @net.minecraftforge.fml.common.Mod.EventHandler public void onFMLInitialization(FMLInitializationEvent event) { + BlurHandler.INSTANCE.load(); testConfig = new TestConfig(); ClientCommandHandler.instance.registerCommand(new OneConfigCommand()); MinecraftForge.EVENT_BUS.register(this); diff --git a/src/main/java/io/polyfrost/oneconfig/config/interfaces/Config.java b/src/main/java/io/polyfrost/oneconfig/config/interfaces/Config.java index f511ae3..cbba2e0 100644 --- a/src/main/java/io/polyfrost/oneconfig/config/interfaces/Config.java +++ b/src/main/java/io/polyfrost/oneconfig/config/interfaces/Config.java @@ -43,7 +43,7 @@ public class Config { mod.config = this; generateOptionList(this.getClass(), mod.defaultPage, mod); ConfigCore.oneConfigMods.add(mod); - this.mod = mod; + Config.mod = mod; } /** diff --git a/src/main/java/io/polyfrost/oneconfig/lwjgl/BlurHandler.java b/src/main/java/io/polyfrost/oneconfig/lwjgl/BlurHandler.java new file mode 100644 index 0000000..86e4e20 --- /dev/null +++ b/src/main/java/io/polyfrost/oneconfig/lwjgl/BlurHandler.java @@ -0,0 +1,159 @@ +package io.polyfrost.oneconfig.lwjgl; + +import io.polyfrost.oneconfig.gui.OneConfigGui; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.shader.Shader; +import net.minecraft.client.shader.ShaderUniform; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.GuiOpenEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +/** + * An implementation of the BlurMC mod by tterrag1098. + * + * For the original source see https://github.com/tterrag1098/Blur/blob/1.8.9/src/main/java/com/tterrag/blur/Blur.java + * For the public license, see https://github.com/tterrag1098/Blur/blob/1.8.9/LICENSE + * + * License available under https://github.com/boomboompower/ToggleChat/blob/master/src/main/resources/licenses/BlurMC-License.txt + * + * @author tterrag1098, boomboompower + * + * Taken from ToggleChat + * https://github.com/boomboompower/ToggleChat/blob/master/LICENSE + */ +public class BlurHandler { + private final ResourceLocation blurShader = new ResourceLocation("shaders/post/fade_in_blur.json"); + private final Logger logger = LogManager.getLogger("OneConfig - Blur"); + private final Minecraft mc = Minecraft.getMinecraft(); + + private long start; + private float lastProgress = 0; + + public static BlurHandler INSTANCE = new BlurHandler(); + + /** + * Simply initializes the blur mod so events are properly handled by forge. + */ + public void load() { + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + public void onGuiChange(GuiOpenEvent event) { + reloadBlur(event.gui); + } + + @SubscribeEvent + public void onRenderTick(final TickEvent.RenderTickEvent event) { + this.mc.mcProfiler.startSection("blur"); + + if (event.phase != TickEvent.Phase.END) { + this.mc.mcProfiler.endSection(); + return; + } + + // Only blur on our own menus + if (this.mc.currentScreen == null) { + this.mc.mcProfiler.endSection(); + return; + } + + // Only update the shader if one is active + if (!this.mc.entityRenderer.isShaderActive()) { + this.mc.mcProfiler.endSection(); + return; + } + + float progress = getBlurStrengthProgress(); + + // If the new progress value matches the old one this + // will skip the frame update, which (hopefully) resolves the issue + // with the heavy computations after the "animation" is complete. + if (progress == this.lastProgress) { + this.mc.mcProfiler.endSection(); + return; + } + + // Store it for the next iteration! + this.lastProgress = progress; + + // This is hilariously bad, and could cause frame issues on low-end computers. + // Why is this being computed every tick? Surely there is a better way? + // This needs to be optimized. + try { + final List<Shader> listShaders = this.mc.entityRenderer.getShaderGroup().listShaders; + + // Should not happen. Something bad happened. + if (listShaders == null) { + this.mc.mcProfiler.endSection(); + return; + } + + // Iterate through the list of shaders. + for (Shader shader : listShaders) { + ShaderUniform su = shader.getShaderManager().getShaderUniform("Progress"); + + if (su == null) { + continue; + } + + // All this for this. + su.set(progress); + } + } catch (IllegalArgumentException ex) { + this.logger.error("An error occurred while updating ToggleChat's blur. Please report this!", ex); + } + + this.mc.mcProfiler.endSection(); + } + + /** + * Activates/deactivates the blur in the current world if + * one of many conditions are met, such as no current other shader + * is being used, we actually have the blur setting enabled + */ + public void reloadBlur(GuiScreen gui) { + // Don't do anything if no world is loaded + if (this.mc.theWorld == null) { + return; + } + + EntityRenderer er = this.mc.entityRenderer; + + // If a shader is not already active and the UI is + // a one of ours, we should load our own blur! + if (!er.isShaderActive() && gui instanceof OneConfigGui) { + this.mc.entityRenderer.loadShader(this.blurShader); + + this.start = System.currentTimeMillis(); + + // If a shader is active and the incoming UI is null or we have blur disabled, stop using the shader. + } else if (er.isShaderActive() && (gui == null)) { + String name = er.getShaderGroup().getShaderGroupName(); + + // Only stop our specific blur ;) + if (!name.endsWith("fade_in_blur.json")) { + return; + } + + er.stopUseShader(); + } + } + + /** + * Returns the strength of the blur as determined by the duration the effect of the blur. + * + * The strength of the blur does not go below 5.0F. + */ + private float getBlurStrengthProgress() { + return Math.min((System.currentTimeMillis() - this.start) / 50F, 5.0F); + } +} diff --git a/src/main/java/io/polyfrost/oneconfig/lwjgl/IOUtil.java b/src/main/java/io/polyfrost/oneconfig/lwjgl/IOUtil.java index de0f3d7..63026e6 100644 --- a/src/main/java/io/polyfrost/oneconfig/lwjgl/IOUtil.java +++ b/src/main/java/io/polyfrost/oneconfig/lwjgl/IOUtil.java @@ -21,7 +21,6 @@ public final class IOUtil { * Taken from legui under MIT License * <a href="https://github.com/SpinyOwl/legui/blob/develop/LICENSE">https://github.com/SpinyOwl/legui/blob/develop/LICENSE</a> */ - @SuppressWarnings("RedundantCast") public static ByteBuffer resourceToByteBuffer(String path) throws IOException { byte[] bytes; path = path.trim(); diff --git a/src/main/java/io/polyfrost/oneconfig/utils/TickDelay.java b/src/main/java/io/polyfrost/oneconfig/utils/TickDelay.java index b28a20a..0babff1 100644 --- a/src/main/java/io/polyfrost/oneconfig/utils/TickDelay.java +++ b/src/main/java/io/polyfrost/oneconfig/utils/TickDelay.java @@ -1,13 +1,12 @@ package io.polyfrost.oneconfig.utils; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; public class TickDelay { - int delay; - Runnable function; + private int delay; + private final Runnable function; public TickDelay(Runnable functionName, int ticks) { register(); @@ -27,12 +26,10 @@ public class TickDelay { } } - @EventHandler() private void destroy() { MinecraftForge.EVENT_BUS.unregister(this); } - @EventHandler() private void register() { MinecraftForge.EVENT_BUS.register(this); } |