diff options
| author | nextdaydelivery <12willettsh@gmail.com> | 2022-02-20 12:13:58 +0000 |
|---|---|---|
| committer | nextdaydelivery <12willettsh@gmail.com> | 2022-02-20 12:14:29 +0000 |
| commit | dfa65f6236c226eb88f4e3761e10e80e5f37c22b (patch) | |
| tree | 33937f0cadf5fb012aae57e6db87e56a32b4e265 /src/main/java/io/polyfrost/oneconfig/themes/textures | |
| parent | 4f8e90571e3a270b54244d0fef985d5e0ca04b40 (diff) | |
| download | OneConfig-dfa65f6236c226eb88f4e3761e10e80e5f37c22b.tar.gz OneConfig-dfa65f6236c226eb88f4e3761e10e80e5f37c22b.tar.bz2 OneConfig-dfa65f6236c226eb88f4e3761e10e80e5f37c22b.zip | |
package moves and a split string renderer
Diffstat (limited to 'src/main/java/io/polyfrost/oneconfig/themes/textures')
3 files changed, 237 insertions, 0 deletions
diff --git a/src/main/java/io/polyfrost/oneconfig/themes/textures/TextureManager.java b/src/main/java/io/polyfrost/oneconfig/themes/textures/TextureManager.java new file mode 100644 index 0000000..5825fb1 --- /dev/null +++ b/src/main/java/io/polyfrost/oneconfig/themes/textures/TextureManager.java @@ -0,0 +1,98 @@ +package io.polyfrost.oneconfig.themes.textures; + +import io.polyfrost.oneconfig.themes.Theme; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.crash.CrashReport; +import net.minecraft.util.ReportedException; +import net.minecraft.util.ResourceLocation; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static io.polyfrost.oneconfig.themes.Themes.themeLog; + +public class TextureManager { + private static final Minecraft mc = Minecraft.getMinecraft(); + private final List<ResourceLocation> resources = new ArrayList<>(); + private final List<TickableTexture> tickableTextures = new ArrayList<>(); + + /** + * Create a new texture manager for this theme, used for drawing of icons, etc. + */ + public TextureManager(Theme theme) { + for (ThemeElement element : ThemeElement.values()) { + BufferedImage img; + try { + img = ImageIO.read(theme.getResource(element.location)); + } catch (Exception e) { + themeLog.error("failed to get themed texture: " + element.location + ", having to fallback to default one. Is pack invalid?"); + try { + img = ImageIO.read(mc.getResourceManager().getResource(new ResourceLocation("oneconfig", element.location)).getInputStream()); + } catch (IOException ex) { + themeLog.fatal("failed to get fallback texture: " + element.location + ", game will crash :("); + throw new ReportedException(new CrashReport("TextureManager failure: FALLBACK_ERROR_OR_MISSING", ex)); + } + } + ResourceLocation location = mc.getTextureManager().getDynamicTextureLocation(element.location, new DynamicTexture(img)); + resources.add(location); + if (img.getWidth() != element.size) { + themeLog.warn("Theme element " + element.name() + " with size " + img.getWidth() + "px is not recommended, expected " + element.size + "px. Continuing anyway."); + } + if(element.ordinal() < 26) { + if (img.getWidth() != img.getHeight()) { + themeLog.info("found tickable animated texture (" + element.name() + "). Loading texture"); + try { + tickableTextures.add(new TickableTexture(element)); + } catch (IOException e) { + themeLog.error("failed to create TickableTexture " + element.location + ". Just going to load it as a normal texture, this may break things!"); + e.printStackTrace(); + } + } + } else { + if(element.ordinal() < 29) { + if(img.getHeight() != 144 || img.getWidth() != 758) { + themeLog.warn("found badly sized button texture " + element.location); + } + } + } + } + } + + /** + * Draw the specified icon at the coordinates, scaled to the width and height. + * + * @param element element to draw + * @param x x coordinate (top left) + * @param y y coordinate (top left) + * @param width width of the image + * @param height height of the image + */ + public void draw(ThemeElement element, int x, int y, int width, int height) { + GlStateManager.enableBlend(); + GlStateManager.color(1f, 1f, 1f, 1f); + ResourceLocation location = resources.get(element.ordinal()); + mc.getTextureManager().bindTexture(location); + try { + if(!tickableTextures.isEmpty()) { + for (TickableTexture texture : tickableTextures) { + if (texture.getElement().equals(element)) { + texture.draw(x, y); + } else { + Gui.drawScaledCustomSizeModalRect(x, y, 0, 0, width, height, width, height, width, height); + } + } + } else { + Gui.drawScaledCustomSizeModalRect(x, y, 0, 0, width, height, width, height, width, height); + } + GlStateManager.disableBlend(); + } catch (Exception e) { + themeLog.error("Error occurred drawing texture " + element.name() + ", is theme invalid?", e); + } + } +} diff --git a/src/main/java/io/polyfrost/oneconfig/themes/textures/ThemeElement.java b/src/main/java/io/polyfrost/oneconfig/themes/textures/ThemeElement.java new file mode 100644 index 0000000..096b2aa --- /dev/null +++ b/src/main/java/io/polyfrost/oneconfig/themes/textures/ThemeElement.java @@ -0,0 +1,48 @@ +package io.polyfrost.oneconfig.themes.textures; + +public enum ThemeElement { + DISCORD("textures/icons/discord.png", 128), + DOCS("textures/icons/docs.png", 128), + FEEDBACK("textures/icons/feedback.png", 128), + GUIDE("textures/icons/guide.png", 128), + HUD_SETTINGS("textures/icons/hudsettings.png", 128), + MOD_SETTINGS("textures/icons/modsettings.png", 128), + STORE("textures/icons/store.png", 128), + THEMES("textures/icons/themes.png", 128), + UPDATE("textures/icons/update.png", 128), + + BACK_ARROW("textures/smallicons/backarrow.png", 32), + FORWARD_ARROW("textures/smallicons/forward.png", 32), + HOME("textures/smallicons/home.png", 32), + SEARCH("textures/smallicons/search.png", 32), + MAGNIFY("textures/smallicons/magnify.png", 64), + MINIMIZE("textures/smallicons/minimize.png", 64), + CLOSE("textures/smallicons/close.png", 64), + + ALL_MODS("textures/mod/allmods.png", 32), + HUD_MODS("textures/mod/hudmods.png", 32), + QOL_MODS("textures/mod/qolmods.png", 32), + HYPIXEL("textures/mod/hypixel.png", 32), + PERFORMANCE("textures/mod/performance.png", 32), + PVP("textures/mod/pvp.png", 32), + SKYBLOCK("textures/mod/skyblock.png", 32), + UTILITIES("textures/mod/utilities.png", 32), + + LOGO("textures/logos/logo.png", 128), + SMALL_LOGO("textures/logos/logo_small.png", 64), + + BUTTON_OFF("textures/window/button_off.png", 758), + BUTTON_HOVER("textures/window/button_hover.png", 758), + BUTTON_CLICK("textures/window/button_click.png", 758), + + BACKGROUND("textures/window/background.png", 1600); + + + public final String location; + public final int size; + + ThemeElement(String location, int size) { + this.location = location; + this.size = size; + } +} diff --git a/src/main/java/io/polyfrost/oneconfig/themes/textures/TickableTexture.java b/src/main/java/io/polyfrost/oneconfig/themes/textures/TickableTexture.java new file mode 100644 index 0000000..b9882d0 --- /dev/null +++ b/src/main/java/io/polyfrost/oneconfig/themes/textures/TickableTexture.java @@ -0,0 +1,91 @@ +package io.polyfrost.oneconfig.themes.textures; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import io.polyfrost.oneconfig.themes.textures.ThemeElement; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.util.ResourceLocation; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import static io.polyfrost.oneconfig.themes.Themes.getActiveTheme; +import static io.polyfrost.oneconfig.themes.Themes.themeLog; + +@SuppressWarnings("unused") +public class TickableTexture { + private final int framesToSkip; + private final BufferedImage image; + private final int sizeX, sizeY, frames; + private int tick; + private int tick2; + private final ThemeElement thisElement; + private final ResourceLocation location; + + public TickableTexture(ThemeElement element) throws IOException { + thisElement = element; + InputStream inputStream = getActiveTheme().getResource(element.location); + image = ImageIO.read(inputStream); + location = Minecraft.getMinecraft().getTextureManager().getDynamicTextureLocation(element.location, new DynamicTexture(image)); + sizeX = image.getWidth(); + sizeY = image.getHeight(); + frames = sizeY / sizeX; + int frametime; + try { + JsonObject jsonObject = new JsonParser().parse(new InputStreamReader(getActiveTheme().getResource(element.location + ".json"))).getAsJsonObject(); + frametime = jsonObject.get("frametime").getAsInt(); + if (frametime == 0) { + frametime = 1; + themeLog.warn("You cannot have a frame tick time of 0. This will mean there is no animation as it will happen way too fast. Defaulting to 1, as we assume you wanted it fast."); + } + } catch (Exception e) { + themeLog.error("failed to load metadata for tickable texture (" + element.location + "). Setting default (5)"); + frametime = 5; + } + framesToSkip = frametime; + } + + public void draw(int x, int y) { + GlStateManager.enableBlend(); + GlStateManager.color(1f,1f,1f,1f); + Minecraft.getMinecraft().getTextureManager().bindTexture(location); + if (tick < frames) { + Gui.drawModalRectWithCustomSizedTexture(x, y, 0, (tick * sizeX), sizeX, sizeX, sizeX, sizeX); + tick2++; + if (tick2 == framesToSkip) { + tick2 = 0; + tick++; + } + } + if (tick == frames) { + tick = 0; + } + GlStateManager.disableBlend(); + } + + public BufferedImage getImage() { + return image; + } + + public int getFrameTime() { + return framesToSkip; + } + + public int getSizeX() { + return sizeX; + } + + public int getSizeY() { + return sizeY; + } + + public ThemeElement getElement() { + return thisElement; + } +} |
