From 82639855db21e4e9359f376e4d8766818c7021ee Mon Sep 17 00:00:00 2001 From: tterrag1098 Date: Tue, 30 May 2017 01:01:08 -0400 Subject: [PATCH] Add caching of resourcepack data, to prevent excessive disk I/O --- src/main/java/com/tterrag/blur/Blur.java | 24 ++- .../tterrag/blur/util/ShaderResourcePack.java | 156 ++++++++++-------- 2 files changed, 107 insertions(+), 73 deletions(-) diff --git a/src/main/java/com/tterrag/blur/Blur.java b/src/main/java/com/tterrag/blur/Blur.java index 019f914..d94c165 100644 --- a/src/main/java/com/tterrag/blur/Blur.java +++ b/src/main/java/com/tterrag/blur/Blur.java @@ -4,16 +4,20 @@ import java.io.File; import java.lang.reflect.Field; import java.util.List; +import javax.annotation.Nonnull; + import org.apache.commons.lang3.ArrayUtils; import com.google.common.base.Throwables; import com.tterrag.blur.util.ShaderResourcePack; import static com.tterrag.blur.Blur.*; + import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiChat; import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.resources.IResourcePack; +import net.minecraft.client.resources.SimpleReloadableResourceManager; import net.minecraft.client.shader.Shader; import net.minecraft.client.shader.ShaderGroup; import net.minecraft.client.shader.ShaderUniform; @@ -49,20 +53,26 @@ public class Blur { private long start; private int fadeTime; - public int radius; + public int radius; // Store default so we don't trigger an extra reload private int colorFirst, colorSecond; + @Nonnull + private ShaderResourcePack dummyPack = new ShaderResourcePack(); + + @SuppressWarnings("unchecked") @EventHandler public void preInit(FMLPreInitializationEvent event) { MinecraftForge.EVENT_BUS.register(this); // Add our dummy resourcepack - ((List)ReflectionHelper.getPrivateValue(Minecraft.class, Minecraft.getMinecraft(), "field_110449_ao", "defaultResourcePacks")).add(new ShaderResourcePack()); + ((List)ReflectionHelper.getPrivateValue(Minecraft.class, Minecraft.getMinecraft(), "field_110449_ao", "defaultResourcePacks")).add(dummyPack); + ((SimpleReloadableResourceManager)Minecraft.getMinecraft().getResourceManager()).registerReloadListener(dummyPack); config = new Configuration(new File(event.getModConfigurationDirectory(), "blur.cfg")); saveConfig(); } + @SuppressWarnings("null") private void saveConfig() { blurExclusions = config.getStringList("guiExclusions", Configuration.CATEGORY_GENERAL, new String[] { @@ -71,7 +81,15 @@ public class Blur { fadeTime = config.getInt("fadeTime", Configuration.CATEGORY_GENERAL, 200, 0, Integer.MAX_VALUE, "The time it takes for the blur to fade in, in ms."); - radius = config.getInt("radius", Configuration.CATEGORY_GENERAL, 12, 1, 100, "The radius of the blur effect. This controls how \"strong\" the blur is."); + int r = config.getInt("radius", Configuration.CATEGORY_GENERAL, 12, 1, 100, "The radius of the blur effect. This controls how \"strong\" the blur is."); + if (r != radius) { + radius = r; + dummyPack.onResourceManagerReload(Minecraft.getMinecraft().getResourceManager()); + if (Minecraft.getMinecraft().world != null) { + Minecraft.getMinecraft().entityRenderer.stopUseShader(); + } + } + colorFirst = Integer.parseUnsignedInt( config.getString("gradientStartColor", Configuration.CATEGORY_GENERAL, "75000000", "The start color of the background gradient. Given in ARGB hex."), 16 diff --git a/src/main/java/com/tterrag/blur/util/ShaderResourcePack.java b/src/main/java/com/tterrag/blur/util/ShaderResourcePack.java index f186a50..98697fa 100644 --- a/src/main/java/com/tterrag/blur/util/ShaderResourcePack.java +++ b/src/main/java/com/tterrag/blur/util/ShaderResourcePack.java @@ -1,70 +1,86 @@ -package com.tterrag.blur.util; - -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Scanner; -import java.util.Set; - -import net.minecraft.client.resources.IResourcePack; -import net.minecraft.client.resources.data.IMetadataSection; -import net.minecraft.client.resources.data.MetadataSerializer; -import net.minecraft.util.ResourceLocation; - -import com.google.common.collect.ImmutableSet; -import com.tterrag.blur.Blur; - -public class ShaderResourcePack implements IResourcePack { - - protected boolean validPath(ResourceLocation location) { - return location.getResourceDomain().equals("minecraft") && location.getResourcePath().startsWith("shaders/"); - } - - @Override - public InputStream getInputStream(ResourceLocation location) throws IOException { - if (validPath(location)) { - InputStream in = Blur.class.getResourceAsStream("/" + location.getResourcePath()); - StringBuilder data = new StringBuilder(); - Scanner scan = new Scanner(in); - try { - while (scan.hasNextLine()) { - data.append(scan.nextLine().replaceAll("@radius@", Integer.toString(Blur.instance.radius))).append('\n'); - } - } finally { - scan.close(); - } - - return new ByteArrayInputStream(data.toString().getBytes()); - } - return null; - } - - @Override - public boolean resourceExists(ResourceLocation location) { - return validPath(location) && Blur.class.getResource("/" + location.getResourcePath()) != null; - } - - @Override - public Set getResourceDomains() { - return ImmutableSet.of("minecraft"); - } - - @Override - public T getPackMetadata( - MetadataSerializer metadataSerializer, String metadataSectionName) - throws IOException { - return null; - } - - @Override - public BufferedImage getPackImage() throws IOException { - return null; - } - - @Override - public String getPackName() { - return "Blur dummy resource pack"; - } - -} +package com.tterrag.blur.util; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; + +import com.google.common.collect.ImmutableSet; +import com.tterrag.blur.Blur; + +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.IResourceManagerReloadListener; +import net.minecraft.client.resources.IResourcePack; +import net.minecraft.client.resources.data.IMetadataSection; +import net.minecraft.client.resources.data.MetadataSerializer; +import net.minecraft.client.resources.data.PackMetadataSection; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextComponentString; + +public class ShaderResourcePack implements IResourcePack, IResourceManagerReloadListener { + + protected boolean validPath(ResourceLocation location) { + return location.getResourceDomain().equals("minecraft") && location.getResourcePath().startsWith("shaders/"); + } + + private final Map loadedData = new HashMap<>(); + + @Override + public InputStream getInputStream(ResourceLocation location) throws IOException { + if (validPath(location)) { + String s = loadedData.computeIfAbsent(location, loc -> { + InputStream in = Blur.class.getResourceAsStream("/" + location.getResourcePath()); + StringBuilder data = new StringBuilder(); + Scanner scan = new Scanner(in); + try { + while (scan.hasNextLine()) { + data.append(scan.nextLine().replaceAll("@radius@", Integer.toString(Blur.instance.radius))).append('\n'); + } + } finally { + scan.close(); + } + return data.toString(); + }); + + return new ByteArrayInputStream(s.getBytes()); + } + throw new FileNotFoundException(location.toString()); + } + + @Override + public boolean resourceExists(ResourceLocation location) { + return validPath(location) && Blur.class.getResource("/" + location.getResourcePath()) != null; + } + + @Override + public Set getResourceDomains() { + return ImmutableSet.of("minecraft"); + } + + @SuppressWarnings("unchecked") + @Override + public T getPackMetadata(MetadataSerializer metadataSerializer, String metadataSectionName) throws IOException { + return (T) new PackMetadataSection(new TextComponentString("Blur's default shaders"), 3); + } + + @Override + public BufferedImage getPackImage() throws IOException { + throw new FileNotFoundException("pack.png"); + } + + @Override + public String getPackName() { + return "Blur dummy resource pack"; + } + + @Override + public void onResourceManagerReload(IResourceManager resourceManager) { + loadedData.clear(); + } + +}