package cc.polyfrost.oneconfig.lwjgl; import cc.polyfrost.oneconfig.gui.OneConfigGui; import cc.polyfrost.oneconfig.libs.universal.UMinecraft; import cc.polyfrost.oneconfig.libs.universal.UScreen; import cc.polyfrost.oneconfig.mixin.ShaderGroupAccessor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; 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 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) {
if (event.phase != TickEvent.Phase.END) {
return;
}
// Only blur on our own menus
if (UScreen.getCurrentScreen() == null) {
return;
}
// Only update the shader if one is active
if (!UMinecraft.getMinecraft().entityRenderer.isShaderActive()) {
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) {
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
* The strength of the blur does not go below 5.0F.
*/
private float getBlurStrengthProgress() {
return Math.min((System.currentTimeMillis() - this.start) / 50F, 5.0F);
}
}