aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/polyfrost/oneconfig/themes/textures
diff options
context:
space:
mode:
authornextdaydelivery <12willettsh@gmail.com>2022-02-20 12:13:58 +0000
committernextdaydelivery <12willettsh@gmail.com>2022-02-20 12:14:29 +0000
commitdfa65f6236c226eb88f4e3761e10e80e5f37c22b (patch)
tree33937f0cadf5fb012aae57e6db87e56a32b4e265 /src/main/java/io/polyfrost/oneconfig/themes/textures
parent4f8e90571e3a270b54244d0fef985d5e0ca04b40 (diff)
downloadOneConfig-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')
-rw-r--r--src/main/java/io/polyfrost/oneconfig/themes/textures/TextureManager.java98
-rw-r--r--src/main/java/io/polyfrost/oneconfig/themes/textures/ThemeElement.java48
-rw-r--r--src/main/java/io/polyfrost/oneconfig/themes/textures/TickableTexture.java91
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;
+ }
+}