diff options
author | Wyvest <45589059+Wyvest@users.noreply.github.com> | 2022-07-21 04:04:48 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-20 20:04:48 +0100 |
commit | f06946c01b2c8f210b398a16610c260eca093a8b (patch) | |
tree | 22bda7a5e9b0a1e7370ff2b1e74fc7c9e4035379 /src/main/java/cc/polyfrost/oneconfig/hud | |
parent | ff2ead62333e90b61e05c8cb6a91f692fcf30805 (diff) | |
download | OneConfig-f06946c01b2c8f210b398a16610c260eca093a8b.tar.gz OneConfig-f06946c01b2c8f210b398a16610c260eca093a8b.tar.bz2 OneConfig-f06946c01b2c8f210b398a16610c260eca093a8b.zip |
HUD Improvements, 1.16 port, fix NanoVG with ARM (#52)
* egg 1
* separate Hud from background stuff
* 1984
This reverts commit 9ae517d57bbd495d30d35cb1cbfe81a03556e6bd.
* hitboxes woo!!!!!
* Revert "hitboxes woo!!!!!"
This reverts commit 405d32d17df3c83f2e79eddf0de853f7279767a6.
* padding
* allow position to go slightly off the screen
* stop using ints for ABSOLUTELY EVERYTHING, DIAMOND ...
fix vigilance compat not setting color
* start on new pos system
* some stuff
* finish new position system
* api momento
* 1.16.2 fabric port
* start on hud gui
* temp remove 1.16.2 fabric since it doesn't compile
* fix fabric build
* hud gui stuff
* apiDump
* fix fabric build 2
* so true
* selecting stuff
* scaling + other small things
* More protecting
* fix nanovg not working with macOS ARM
move OneConfig.preLaunch to OneConfigInit
* clean up OneUIScreen
make kotlin version of TestNanoVGGui
* make keybinds have runnable by default
* rollback keybind things
* merge master into hud-improvements (#55)
* Release workflow (#53)
* release workflow
* update normal version to hash
* fix
* fix naming
* fix some stuff
* fix version thing
* switch to number from hash
* Release workflow (#54)
* release workflow
* update normal version to hash
* fix
* fix naming
* fix some stuff
* fix version thing
* switch to number from hash
* Maybe epic fixo
* gotta love those Java principles
* Revert "gotta love those Java principles", wrong branch
This reverts commit 333d8b2ad8941790c13c4bfe0777fbd203d463e5.
* start on snapping
* Finish snapping
* stop including mixin by default on legacy versions
this breaks builds if the mod itself does not use mixin
* merge draw and drawExample
* fix gradle publish
* Some fixes
* Api DUmpidy
* Help subcommand impovments (#59)
* Made the overall look of the "help" subcommand better + added the ability to change the colour for the command overall + each individual SubCommand
* Made the alliases show batter + added support for to show subcommand aliasses
* mr deliverer didnt reply but whatever, added a space between command/subcommand and alliasses
Co-authored-by: pinkulu <pinkulumc@gmail.com>
* fix file not overwriting
toJavaColor
* Fix full shadow not scaling correctly
Co-authored-by: DeDiamondPro <67508414+DeDiamondPro@users.noreply.github.com>
Co-authored-by: nxtdaydelivery <12willettsh@gmail.com>
Co-authored-by: pinkulu <56201697+pinkulu@users.noreply.github.com>
Co-authored-by: pinkulu <pinkulumc@gmail.com>
Diffstat (limited to 'src/main/java/cc/polyfrost/oneconfig/hud')
6 files changed, 533 insertions, 238 deletions
diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/BasicHud.java b/src/main/java/cc/polyfrost/oneconfig/hud/BasicHud.java new file mode 100644 index 0000000..cb8a2d4 --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/hud/BasicHud.java @@ -0,0 +1,116 @@ +package cc.polyfrost.oneconfig.hud; + +import cc.polyfrost.oneconfig.config.core.OneColor; +import cc.polyfrost.oneconfig.libs.universal.UMatrixStack; +import cc.polyfrost.oneconfig.renderer.RenderManager; + +public abstract class BasicHud extends Hud { + protected boolean rounded; + protected boolean border; + protected OneColor bgColor; + protected OneColor borderColor; + protected float cornerRadius; + protected float borderSize; + protected float paddingX; + protected float paddingY; + + /** + * @param enabled If the hud is enabled + * @param x X-coordinate of hud on a 1080p display + * @param y Y-coordinate of hud on a 1080p display + * @param scale Scale of the hud + * @param rounded If the corner is rounded or not + * @param cornerRadius Radius of the corner + * @param paddingX Horizontal background padding + * @param paddingY Vertical background padding + * @param bgColor Background color + * @param border If the hud has a border or not + * @param borderSize Thickness of the border + * @param borderColor The color of the border + */ + public BasicHud(boolean enabled, float x, float y, float scale, boolean rounded, float cornerRadius, float paddingX, float paddingY, OneColor bgColor, boolean border, float borderSize, OneColor borderColor) { + super(enabled, x, y, scale); + this.rounded = rounded; + this.cornerRadius = cornerRadius; + this.paddingX = paddingX; + this.paddingY = paddingY; + this.bgColor = bgColor; + this.border = border; + this.borderSize = borderSize; + this.borderColor = borderColor; + position.setSize(getWidth(scale, true) + paddingX * scale * 2f, getHeight(scale, true) + paddingY * scale * 2f); + } + + /** + * @param enabled If the hud is enabled + * @param x X-coordinate of hud on a 1080p display + * @param y Y-coordinate of hud on a 1080p display + * @param scale Scale of the hud + */ + public BasicHud(boolean enabled, float x, float y, float scale) { + this(enabled, x, y, scale, false, 2, 5, 5, new OneColor(0, 0, 0, 120), false, 2, new OneColor(0, 0, 0)); + } + + /** + * @param enabled If the hud is enabled + * @param x X-coordinate of hud on a 1080p display + * @param y Y-coordinate of hud on a 1080p display + */ + public BasicHud(boolean enabled, float x, float y) { + this(enabled, x, y, 1, false, 2, 5, 5, new OneColor(0, 0, 0, 120), false, 2, new OneColor(0, 0, 0)); + } + + /** + * @param enabled If the hud is enabled + */ + public BasicHud(boolean enabled) { + this(enabled, 0, 0, 1, false, 2, 5, 5, new OneColor(0, 0, 0, 120), false, 2, new OneColor(0, 0, 0)); + } + + public BasicHud() { + this(false, 0, 0, 1, false, 2, 5, 5, new OneColor(0, 0, 0, 120), false, 2, new OneColor(0, 0, 0)); + } + + @Override + public void drawAll(UMatrixStack matrices, boolean example) { + if (!example && !shouldShow()) return; + preRender(example); + position.setSize(getWidth(scale, example) + paddingX * scale * 2f, getHeight(scale, example) + paddingY * scale * 2f); + if (shouldDrawBackground()) + drawBackground(position.getX(), position.getY(), position.getWidth(), position.getHeight(), scale); + draw(matrices, position.getX() + paddingX * scale, position.getY() + paddingY * scale, scale, example); + } + + /** + * Set a new scale value + * + * @param scale The new scale + * @param example If the HUD is being rendered in example form + */ + @Override + public void setScale(float scale, boolean example) { + this.scale = scale; + position.updateSizePosition(getWidth(scale, example) + paddingX * scale * 2f, getHeight(scale, example) + paddingY * scale * 2f); + } + + /** + * @return If the background should be drawn + */ + protected boolean shouldDrawBackground() { + return true; + } + + protected void drawBackground(float x, float y, float width, float height, float scale) { + RenderManager.setupAndDraw(true, (vg) -> { + if (rounded) { + RenderManager.drawRoundedRect(vg, x, y, width, height, bgColor.getRGB(), cornerRadius * scale); + if (border) + RenderManager.drawHollowRoundRect(vg, x - borderSize * scale, y - borderSize * scale, width + borderSize * scale, height + borderSize * scale, borderColor.getRGB(), cornerRadius * scale, borderSize * scale); + } else { + RenderManager.drawRect(vg, x, y, width, height, bgColor.getRGB()); + if (border) + RenderManager.drawHollowRoundRect(vg, x - borderSize * scale, y - borderSize * scale, width + borderSize * scale, height + borderSize * scale, borderColor.getRGB(), 0, borderSize * scale); + } + }); + } +} diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/HUDUtils.java b/src/main/java/cc/polyfrost/oneconfig/hud/HUDUtils.java index a67177c..bff1b70 100644 --- a/src/main/java/cc/polyfrost/oneconfig/hud/HUDUtils.java +++ b/src/main/java/cc/polyfrost/oneconfig/hud/HUDUtils.java @@ -6,42 +6,52 @@ import cc.polyfrost.oneconfig.config.core.ConfigUtils; import cc.polyfrost.oneconfig.config.elements.BasicOption; import cc.polyfrost.oneconfig.config.elements.OptionPage; import cc.polyfrost.oneconfig.gui.elements.config.*; +import cc.polyfrost.oneconfig.hud.BasicHud; +import cc.polyfrost.oneconfig.hud.Hud; import cc.polyfrost.oneconfig.internal.hud.HudCore; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; public class HUDUtils { public static void addHudOptions(OptionPage page, Field field, Object instance, Config config) { HUD hudAnnotation = field.getAnnotation(HUD.class); + field.setAccessible(true); Hud hud = (Hud) ConfigUtils.getField(field, instance); if (hud == null) return; hud.setConfig(config); HudCore.huds.add(hud); String category = hudAnnotation.category(); String subcategory = hudAnnotation.subcategory(); - ArrayList<BasicOption> options = ConfigUtils.getSubCategory(page, hudAnnotation.category(), hudAnnotation.subcategory()).options; + ArrayList<BasicOption> options = new ArrayList<>(); try { + ArrayList<Field> fieldArrayList = ConfigUtils.getClassFields(hud.getClass()); + HashMap<String, Field> fields = new HashMap<>(); + for (Field f : fieldArrayList) fields.put(f.getName(), f); options.add(new ConfigHeader(field, hud, hudAnnotation.name(), category, subcategory, 2)); - options.add(new ConfigSwitch(hud.getClass().getField("enabled"), hud, "Enabled", category, subcategory, 2)); + options.add(new ConfigSwitch(fields.get("enabled"), hud, "Enabled", category, subcategory, 2)); options.addAll(ConfigUtils.getClassOptions(hud)); - options.add(new ConfigCheckbox(hud.getClass().getField("rounded"), hud, "Rounded corners", category, subcategory, 1)); - options.get(options.size() - 1).addDependency(hud::isEnabled); - options.add(new ConfigCheckbox(hud.getClass().getField("border"), hud, "Outline/border", category, subcategory, 1)); - options.get(options.size() - 1).addDependency(hud::isEnabled); - options.add(new ConfigColorElement(hud.getClass().getField("bgColor"), hud, "Background color:", category, subcategory, 1, true)); - options.get(options.size() - 1).addDependency(hud::isEnabled); - options.add(new ConfigColorElement(hud.getClass().getField("borderColor"), hud, "Border color:", category, subcategory, 1, true)); - options.get(options.size() - 1).addDependency(() -> hud.isEnabled() && hud.border); - options.add(new ConfigSlider(hud.getClass().getField("cornerRadius"), hud, "Corner radius:", category, subcategory, 0, 10, 0)); - options.get(options.size() - 1).addDependency(() -> hud.isEnabled() && hud.rounded); - options.add(new ConfigSlider(hud.getClass().getField("borderSize"), hud, "Border thickness:", category, subcategory, 0, 10, 0)); - options.get(options.size() - 1).addDependency(() -> hud.isEnabled() && hud.border); - options.add(new ConfigSlider(hud.getClass().getField("paddingX"), hud, "X-Padding", category, subcategory, 0, 50, 0)); - options.get(options.size() - 1).addDependency(hud::isEnabled); - options.add(new ConfigSlider(hud.getClass().getField("paddingY"), hud, "Y-Padding", category, subcategory, 0, 50, 0)); - options.get(options.size() - 1).addDependency(hud::isEnabled); - } catch (NoSuchFieldException ignored) { + if (hud instanceof BasicHud) { + options.add(new ConfigCheckbox(fields.get("rounded"), hud, "Rounded corners", category, subcategory, 1)); + options.add(new ConfigCheckbox(fields.get("border"), hud, "Outline/border", category, subcategory, 1)); + options.add(new ConfigColorElement(fields.get("bgColor"), hud, "Background color:", category, subcategory, 1, true)); + options.add(new ConfigColorElement(fields.get("borderColor"), hud, "Border color:", category, subcategory, 1, true)); + options.get(options.size() - 1).addDependency(() -> ((BasicHud) hud).border); + options.add(new ConfigSlider(fields.get("cornerRadius"), hud, "Corner radius:", category, subcategory, 0, 10, 0)); + options.get(options.size() - 1).addDependency(() -> ((BasicHud) hud).rounded); + options.add(new ConfigSlider(fields.get("borderSize"), hud, "Border thickness:", category, subcategory, 0, 10, 0)); + options.get(options.size() - 1).addDependency(() -> ((BasicHud) hud).border); + options.add(new ConfigSlider(fields.get("paddingX"), hud, "X-Padding", category, subcategory, 0, 50, 0)); + options.add(new ConfigSlider(fields.get("paddingY"), hud, "Y-Padding", category, subcategory, 0, 50, 0)); + } + for (BasicOption option : options) { + if (option.name.equals("Enabled")) continue; + option.addDependency(hud::isEnabled); + } + } catch (Exception ignored) { } + ConfigUtils.getSubCategory(page, hudAnnotation.category(), hudAnnotation.subcategory()).options.addAll(options); } } diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/Hud.java b/src/main/java/cc/polyfrost/oneconfig/hud/Hud.java index 05a4f76..a8c51bd 100644 --- a/src/main/java/cc/polyfrost/oneconfig/hud/Hud.java +++ b/src/main/java/cc/polyfrost/oneconfig/hud/Hud.java @@ -2,11 +2,9 @@ package cc.polyfrost.oneconfig.hud; import cc.polyfrost.oneconfig.config.Config; import cc.polyfrost.oneconfig.config.annotations.Switch; -import cc.polyfrost.oneconfig.config.core.OneColor; import cc.polyfrost.oneconfig.gui.OneConfigGui; import cc.polyfrost.oneconfig.libs.universal.UMatrixStack; import cc.polyfrost.oneconfig.platform.Platform; -import cc.polyfrost.oneconfig.renderer.RenderManager; /** * Represents a HUD element in OneConfig. @@ -15,7 +13,7 @@ import cc.polyfrost.oneconfig.renderer.RenderManager; * If you simply want to display text, extend {@link TextHud} or {@link SingleTextHud}, * whichever applies to the use case. Then, override the required methods. * <p> - * If you want to display something else, extend this class and override {@link Hud#getWidth(float)}, {@link Hud#getHeight(float)}, and {@link Hud#draw(UMatrixStack, int, int, float)} with the width, height, and the drawing code respectively. + * If you want to display something else, extend this class and override {@link Hud#getWidth(float, boolean)}, {@link Hud#getHeight(float, boolean)}, and {@link Hud#draw(UMatrixStack, float, float, float, boolean)} with the width, height, and the drawing code respectively. * </p> * <p> * It should also be noted that additional options to the HUD can be added simply by declaring them. @@ -39,50 +37,10 @@ import cc.polyfrost.oneconfig.renderer.RenderManager; * * }</pre> */ public abstract class Hud { - public boolean enabled; + protected boolean enabled; transient private Config config; - public boolean rounded; - public boolean border; - public OneColor bgColor; - public OneColor borderColor; - public float cornerRadius; - public float borderSize; - public double xUnscaled; - public double yUnscaled; - public float scale; - public float paddingX; - public float paddingY; - - /** - * @param enabled If the hud is enabled - * @param x X-coordinate of hud on a 1080p display - * @param y Y-coordinate of hud on a 1080p display - * @param scale Scale of the hud - * @param rounded If the corner is rounded or not - * @param cornerRadius Radius of the corner - * @param paddingX Horizontal background padding - * @param paddingY Vertical background padding - * @param bgColor Background color - * @param border If the hud has a border or not - * @param borderSize Thickness of the border - * @param borderColor The color of the border - */ - public Hud(boolean enabled, int x, int y, float scale, boolean rounded, int cornerRadius, int paddingX, int paddingY, OneColor bgColor, boolean border, float borderSize, OneColor borderColor) { - this.enabled = enabled; - this.scale = scale; - this.rounded = rounded; - this.cornerRadius = cornerRadius; - this.paddingX = paddingX; - this.paddingY = paddingY; - this.bgColor = bgColor; - this.border = border; - this.borderSize = borderSize; - this.borderColor = borderColor; - if (x / 1920d <= 0.5d) xUnscaled = x / 1920d; - else xUnscaled = (x + getWidth(scale)) / 1920d; - if (y / 1080d <= 0.5d) yUnscaled = y / 1080d; - else yUnscaled = (y + getHeight(scale)) / 1090d; - } + public final Position position; + protected float scale; /** * @param enabled If the hud is enabled @@ -90,8 +48,10 @@ public abstract class Hud { * @param y Y-coordinate of hud on a 1080p display * @param scale Scale of the hud */ - public Hud(boolean enabled, int x, int y, int scale) { - this(enabled, x, y, scale, false, 2, 5, 5, new OneColor(0, 0, 0, 120), false, 2, new OneColor(0, 0, 0)); + public Hud(boolean enabled, float x, float y, float scale) { + this.enabled = enabled; + this.scale = scale; + position = new Position(x, y, getWidth(scale, true), getHeight(scale, true)); } /** @@ -99,153 +59,103 @@ public abstract class Hud { * @param x X-coordinate of hud on a 1080p display * @param y Y-coordinate of hud on a 1080p display */ - public Hud(boolean enabled, int x, int y) { - this(enabled, x, y, 1, false, 2, 5, 5, new OneColor(0, 0, 0, 120), false, 2, new OneColor(0, 0, 0)); + public Hud(boolean enabled, float x, float y) { + this(enabled, x, y, 1); } /** * @param enabled If the hud is enabled */ public Hud(boolean enabled) { - this(enabled, 0, 0, 1, false, 2, 5, 5, new OneColor(0, 0, 0, 120), false, 2, new OneColor(0, 0, 0)); + this(enabled, 0, 0, 1); } - /** - * Function called when drawing the hud - * - * @param x Top left x-coordinate of the hud - * @param y Top left y-coordinate of the hud - * @param scale Scale of the hud - */ - public abstract void draw(UMatrixStack matrices, int x, int y, float scale); + public Hud() { + this(false, 0, 0, 1); + } /** - * Function called when drawing the example version of the hud. - * This is used in for example, the hud editor gui. + * Function called when drawing the hud * - * @param x Top left x-coordinate of the hud - * @param y Top left y-coordinate of the hud - * @param scale Scale of the hud + * @param matrices The UMatrixStack used for rendering in higher versions + * @param x Top left x-coordinate of the hud + * @param y Top left y-coordinate of the hud + * @param scale Scale of the hud + * @param example If the HUD is being rendered in example form */ - public void drawExample(UMatrixStack matrices, int x, int y, float scale) { - draw(matrices, x, y, scale); - } + protected abstract void draw(UMatrixStack matrices, float x, float y, float scale, boolean example); /** - * @param scale Scale of the hud + * @param scale Scale of the hud + * @param example If the HUD is being rendered in example form * @return The width of the hud */ - public abstract int getWidth(float scale); + protected abstract float getWidth(float scale, boolean example); /** - * @param scale Scale of the hud + * @param scale Scale of the hud + * @param example If the HUD is being rendered in example form * @return The height of the hud */ - public abstract int getHeight(float scale); - - /** - * @param scale Scale of the hud - * @return The width of the example version of the hud - */ - public int getExampleWidth(float scale) { - return getWidth(scale); - } - - /** - * @param scale Scale of the hud - * @return The height of the example version of the hud - */ - public int getExampleHeight(float scale) { - return getHeight(scale); - } + protected abstract float getHeight(float scale, boolean example); /** - * @return If the background should be drawn + * Function to do things before rendering anything + * + * @param example If the HUD is being rendered in example form */ - public boolean drawBackground() { - return true; + protected void preRender(boolean example) { } /** * Draw the background, the hud and all childed huds, used by HudCore - * - * @param x X-coordinate - * @param y Y-coordinate - * @param scale Scale of the hud - * @param background If background should be drawn or not */ - public void drawAll(UMatrixStack matrices, float x, float y, float scale, boolean background) { - if (!showInGuis && Platform.getGuiPlatform().getCurrentScreen() != null && !(Platform.getGuiPlatform().getCurrentScreen() instanceof OneConfigGui)) return; - if (!showInChat && Platform.getGuiPlatform().isInChat()) return; - if (!showInDebug && Platform.getGuiPlatform().isInDebug()) return; - if (background && drawBackground()) drawBackground(x, y, getWidth(scale), getHeight(scale), scale); - draw(matrices, (int) (x + paddingX * scale / 2f), (int) (y + paddingY * scale / 2f), scale); + public void drawAll(UMatrixStack matrices, boolean example) { + if (!example && !shouldShow()) return; + preRender(example); + position.setSize(getWidth(scale, example), getHeight(scale, example)); + draw(matrices, position.getX(), position.getY(), scale, example); } - /** - * Draw example version of the background, the hud and all childed huds, used by HudGui - * - * @param x X-coordinate - * @param y Y-coordinate - * @param scale Scale of the hud - * @param background If background should be drawn or not - */ - public void drawExampleAll(UMatrixStack matrices, float x, float y, float scale, boolean background) { - if (background) drawBackground(x, y, getWidth(scale), getHeight(scale), scale); - drawExample(matrices, (int) (x + paddingX * scale / 2f), (int) (y + paddingY * scale / 2f), scale); + protected boolean shouldShow() { + if (!showInGuis && Platform.getGuiPlatform().getCurrentScreen() != null && !(Platform.getGuiPlatform().getCurrentScreen() instanceof OneConfigGui)) + return false; + if (!showInChat && Platform.getGuiPlatform().isInChat()) return false; + return showInDebug || !Platform.getGuiPlatform().isInDebug(); } /** - * Draw example version of the background, the hud and all childed huds, used by HudGui - * - * @param x X-coordinate - * @param y Y-coordinate - * @param width Width of the hud - * @param height Height of the hud - * @param scale Scale of the hud + * @return If the hud is enabled */ - private void drawBackground(float x, float y, float width, float height, float scale) { - RenderManager.setupAndDraw(true, (vg) -> { - if (rounded) { - RenderManager.drawRoundedRect(vg, x, y, (width + paddingX * scale), (height + paddingY * scale), bgColor.getRGB(), cornerRadius * scale); - if (border) - RenderManager.drawHollowRoundRect(vg, x - borderSize * scale, y - borderSize * scale, (width + paddingX * scale) + borderSize * scale, (height + paddingY * scale) + borderSize * scale, borderColor.getRGB(), cornerRadius * scale, borderSize * scale); - } else { - RenderManager.drawRect(vg, x, y, (width + paddingX * scale), (height + paddingY * scale), bgColor.getRGB()); - if (border) - RenderManager.drawHollowRoundRect(vg, x - borderSize * scale, y - borderSize * scale, (width + paddingX * scale) + borderSize * scale, (height + paddingY * scale) + borderSize * scale, borderColor.getRGB(), 0, borderSize * scale); - } - }); + public boolean isEnabled() { + return enabled && (config == null || config.enabled); } /** - * @param screenWidth width of the screen - * @return X-coordinate of the hud + * Set the config to disable accordingly, intended for internal use + * + * @param config The config instance */ - public float getXScaled(int screenWidth) { - if (xUnscaled <= 0.5) - return (int) (screenWidth * xUnscaled); - return (float) (screenWidth - (1d - xUnscaled) * screenWidth - (getWidth(scale) + paddingX * scale)); + public void setConfig(Config config) { + this.config = config; } /** - * @param screenHeight height of the screen - * @return Y-coordinate of the hud + * @return The scale of the Hud */ - public float getYScaled(int screenHeight) { - if (yUnscaled <= 0.5) return (int) (screenHeight * yUnscaled); - return (float) (screenHeight - (1d - yUnscaled) * screenHeight - (getHeight(scale) + paddingY * scale)); + public float getScale() { + return scale; } /** - * @return If the hud is enabled + * Set a new scale value + * + * @param scale The new scale + * @param example If the HUD is being rendered in example form */ - public boolean isEnabled() { - return enabled && (config == null || config.enabled); - } - - public void setConfig(Config config) { - this.config = config; + public void setScale(float scale, boolean example) { + this.scale = scale; + position.updateSizePosition(getWidth(scale, example), getHeight(scale, example)); } @Switch( diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/Position.java b/src/main/java/cc/polyfrost/oneconfig/hud/Position.java new file mode 100644 index 0000000..1b3bbb7 --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/hud/Position.java @@ -0,0 +1,279 @@ +package cc.polyfrost.oneconfig.hud; + +import cc.polyfrost.oneconfig.config.annotations.Exclude; +import cc.polyfrost.oneconfig.libs.universal.UResolution; +import com.google.gson.annotations.SerializedName; + +public class Position { + private AnchorPosition anchor; + private float x; + private float y; + @Exclude + private float width; + @Exclude + private float height; + + /** + * Position object used for huds + * + * @param x The X coordinate + * @param y The Y coordinate + * @param width The width of the HUD + * @param height The height of the HUD + * @param screenWidth The width of the screen to initialize the position width + * @param screenHeight The height of the screen to initialize the position width + */ + public Position(float x, float y, float width, float height, float screenWidth, float screenHeight) { + setSize(width, height); + setPosition(x, y, screenWidth, screenHeight); + } + + /** + * Position object used for huds + * + * @param x The X coordinate + * @param y The Y coordinate + * @param width The width of the HUD + * @param height The height of the HUD + */ + public Position(float x, float y, float width, float height) { + this(x, y, width, height, 1920, 1080); + } + + /** + * Set the position + * + * @param x The X coordinate + * @param y The Y coordinate + * @param screenWidth The screen width + * @param screenHeight The screen height + */ + public void setPosition(float x, float y, float screenWidth, float screenHeight) { + float rightX = x + width; + float bottomY = y + height; + + if (x <= screenWidth / 3f && y <= screenHeight / 3f) + this.anchor = AnchorPosition.TOP_LEFT; + else if (rightX >= screenWidth / 3f * 2f && y <= screenHeight / 3f) + this.anchor = AnchorPosition.TOP_RIGHT; + else if (x <= screenWidth / 3f && bottomY >= screenHeight / 3f * 2f) + this.anchor = AnchorPosition.BOTTOM_LEFT; + else if (rightX >= screenWidth / 3f * 2f && bottomY >= screenHeight / 3f * 2f) + this.anchor = AnchorPosition.BOTTOM_RIGHT; + else if (y <= screenHeight / 3f) + this.anchor = AnchorPosition.TOP_CENTER; + else if (x <= screenWidth / 3f) + this.anchor = AnchorPosition.MIDDLE_LEFT; + else if (rightX >= screenWidth / 3f * 2f) + this.anchor = AnchorPosition.MIDDLE_RIGHT; + else if (bottomY >= screenHeight / 3f * 2f) + this.anchor = AnchorPosition.BOTTOM_CENTER; + else + this.anchor = AnchorPosition.MIDDLE_CENTER; + + this.x = x - getAnchorX(screenWidth) + getAnchorX(width); + this.y = y - getAnchorY(screenHeight) + getAnchorY(height); + } + + /** + * Set the position + * + * @param x The X coordinate + * @param y The Y coordinate + */ + public void setPosition(float x, float y) { + setPosition(x, y, UResolution.getScaledWidth(), UResolution.getScaledHeight()); + } + + /** + * Set the size of the position + * + * @param width The width + * @param height The height + */ + public void setSize(float width, float height) { + this.width = width; + this.height = height; + } + + /** + * Update the position so the top left corner stays in the same spot + * + * @param width The width + * @param height The height + */ + public void updateSizePosition(float width, float height) { + float x = getX(); + float y = getY(); + setSize(width, height); + setPosition(x, y); + } + + /** + * Get the X coordinate scaled to the size of the screen + * + * @param screenWidth The width of the screen + * @return The X coordinate + */ + public float getX(float screenWidth) { + return x + getAnchorX(screenWidth) - getAnchorX(width); + } + + /** + * Get the X coordinate scaled to the size of the screen + * + * @return The X coordinate + */ + public float getX() { + return getX(UResolution.getScaledWidth()); + } + + /** + * Get the Y coordinate scaled to the size of the screen + * + * @param screenHeight The height of the screen + * @return The Y coordinate + */ + public float getY(float screenHeight) { + return y + getAnchorY(screenHeight) - getAnchorY(height); + } + + /** + * Get the Y coordinate scaled to the size of the screen + * + * @return The Y coordinate + */ + public float getY() { + return getY(UResolution.getScaledHeight()); + } + + /** + * Get the X coordinate scaled to the size of the screen of the right corner + * + * @param screenWidth The width of the screen + * @return The X coordinate of the right corner + */ + public float getRightX(float screenWidth) { + return getX(screenWidth) + width; + } + + /** + * Get the X coordinate scaled to the size of the screen of the right corner + * + * @return The X coordinate of the right corner + */ + public float getRightX() { + return getRightX(UResolution.getScaledWidth()); + } + + /** + * Get the Y coordinate scaled to the size of the screen of the bottom corner + * + * @param screenHeight The width of the screen + * @return The Y coordinate of the bottom corner + */ + public float getBottomY(float screenHeight) { + return getY(screenHeight) + height; + } + + /** + * Get the Y coordinate scaled to the size of the screen of the bottom corner + * + * @return The Y coordinate of the bottom corner + */ + public float getBottomY() { + return getBottomY(UResolution.getScaledHeight()); + } + + /** + * Get the center X coordinate + * + * @param screenWidth The width of the screen + * @return The center X coordinate + */ + public float getCenterX(float screenWidth) { + return getX(screenWidth) + width / 2f; + } + + /** + * Get the center X coordinate + * + * @return The center X coordinate + */ + public float getCenterX() { + return getCenterX(UResolution.getScaledWidth()); + } + + /** + * Get the center Y coordinate + * + * @param screenHeight The width of the screen + * @return The center Y coordinate + */ + public float getCenterY(float screenHeight) { + return getY(screenHeight) + height / 2f; + } + + /** + * Get the center Y coordinate + * + * @return The center Y coordinate + */ + public float getCenterY() { + return getCenterY(UResolution.getScaledHeight()); + } + + /** + * @return The width of the position + */ + public float getWidth() { + return width; + } + + /** + * @return The height of the position + */ + public float getHeight() { + return height; + } + + private float getAnchorX(float value) { + return value * anchor.x; + } + + private float getAnchorY(float value) { + return value * anchor.y; + } + + /** + * Position of the anchors were the position is relative too + */ + public enum AnchorPosition { + @SerializedName("0") + TOP_LEFT(0f, 0f), + @SerializedName("1") + TOP_CENTER(0.5f, 0f), + @SerializedName("2") + TOP_RIGHT(1f, 0f), + @SerializedName("3") + MIDDLE_LEFT(0f, 0.5f), + @SerializedName("4") + MIDDLE_CENTER(0.5f, 0.5f), + @SerializedName("5") + MIDDLE_RIGHT(1f, 0.5f), + @SerializedName("6") + BOTTOM_LEFT(0f, 1f), + @SerializedName("7") + BOTTOM_CENTER(0.5f, 1f), + @SerializedName("8") + BOTTOM_RIGHT(1f, 1f); + + public final float x; + public final float y; + + AnchorPosition(float x, float y) { + this.x = x; + this.y = y; + } + } +} diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/SingleTextHud.java b/src/main/java/cc/polyfrost/oneconfig/hud/SingleTextHud.java index d3ce8f2..5380be5 100644 --- a/src/main/java/cc/polyfrost/oneconfig/hud/SingleTextHud.java +++ b/src/main/java/cc/polyfrost/oneconfig/hud/SingleTextHud.java @@ -22,56 +22,25 @@ public abstract class SingleTextHud extends TextHud { * * @return The new text */ - protected abstract String getText(); + protected abstract String getText(boolean example); /** * This function is called every frame * * @return The new text, null to use the cached value */ - protected String getTextFrequent() { + protected String getTextFrequent(boolean example) { return null; } - /** - * This function is called every tick in the move GUI - * - * @return The new text - */ - protected String getExampleText() { - return getText(); - } - - /** - * This function is called every frame in the move GUI - * - * @return The new text, null to use the cached value - */ - protected String getExampleTextFrequent() { - return getTextFrequent(); - } - - @Override - protected void getLines(List<String> lines) { - lines.add(getCompleteText(getText())); - } - - @Override - protected void getLinesFrequent(List<String> lines) { - String text = getTextFrequent(); - if (text == null) return; - lines.clear(); - lines.add(getCompleteText(text)); - } - @Override - protected void getExampleLines(List<String> lines) { - lines.add(getCompleteText(getExampleText())); + protected void getLines(List<String> lines, boolean example) { + lines.add(getCompleteText(getText(example))); } @Override - protected void getExampleLinesFrequent(List<String> lines) { - String text = getExampleTextFrequent(); + protected void getLinesFrequent(List<String> lines, boolean example) { + String text = getTextFrequent(example); if (text == null) return; lines.clear(); lines.add(getCompleteText(text)); @@ -104,16 +73,16 @@ public abstract class SingleTextHud extends TextHud { @Switch( name = "Brackets" ) - public boolean brackets = false; + protected boolean brackets = false; @Text( name = "Title" ) - public String title; + protected String title; @Dropdown( name = "Title Location", options = {"Left", "Right"} ) - public int titleLocation = 0; + protected int titleLocation = 0; }
\ No newline at end of file diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java b/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java index 8dd8ac3..b4857d8 100644 --- a/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java +++ b/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java @@ -15,21 +15,20 @@ import cc.polyfrost.oneconfig.renderer.RenderManager; import java.util.ArrayList; import java.util.List; -public abstract class TextHud extends Hud { +public abstract class TextHud extends BasicHud { protected transient List<String> lines = new ArrayList<>(); private transient int width; - private transient int height; @Color( name = "Text Color" ) - public OneColor color = new OneColor(255, 255, 255); + protected OneColor color = new OneColor(255, 255, 255); @Dropdown( name = "Text Type", options = {"No Shadow", "Shadow", "Full Shadow"} ) - public int textType = 0; + protected int textType = 0; public TextHud(boolean enabled, int x, int y) { super(enabled, x, y); @@ -45,59 +44,72 @@ public abstract class TextHud extends Hud { * * @param lines Empty ArrayList to add your hud text too */ - protected abstract void getLines(List<String> lines); + protected abstract void getLines(List<String> lines, boolean example); /** * This function is called every frame * * @param lines The current lines of the hud */ - protected void getLinesFrequent(List<String> lines) { + protected void getLinesFrequent(List<String> lines, boolean example) { + } + + @Override + public void draw(UMatrixStack matrices, float x, float y, float scale, boolean example) { + if (lines == null || lines.size() == 0) return; + float textY = y; + for (String line : lines) { + drawLine(line, x, textY, scale); + textY += 12 * scale; + } } /** - * This function is called every tick in the move GUI + * Function that can be overwritten to implement different behavior easily * - * @param lines Empty ArrayList to add your hud text too + * @param line The line + * @param x The X coordinate + * @param y The Y coordinate + * @param scale The scale */ - protected void getExampleLines(List<String> lines) { - getLines(lines); + protected void drawLine(String line, float x, float y, float scale) { + RenderManager.drawScaledString(line, x, y, color.getRGB(), RenderManager.TextType.toType(textType), scale); } /** - * This function is called every frame in the move GUI + * Function that can be overwritten to implement different behavior easily * - * @param lines The current lines of the hud + * @param line The line + * @return The width of the line (scaled accordingly) */ - protected void getExampleLinesFrequent(List<String> lines) { - getLinesFrequent(lines); + protected float getLineWidth(String line, float scale) { + return Platform.getGLPlatform().getStringWidth(line) * scale; } @Override - public void draw(UMatrixStack matrices, int x, int y, float scale) { - if (!HudCore.editing) getLinesFrequent(lines); - else getExampleLinesFrequent(lines); - if (lines == null) return; + protected void preRender(boolean example) { + getLinesFrequent(lines, example); + } - int textY = y; - width = 0; + @Override + protected float getWidth(float scale, boolean example) { + if (lines == null) return 0; + float width = 0; for (String line : lines) { - RenderManager.drawScaledString(line, x, textY, color.getRGB(), RenderManager.TextType.toType(textType), scale); - width = Math.max(width, Platform.getGLPlatform().getStringWidth(line)); - textY += 12 * scale; + width = Math.max(width, getLineWidth(line, scale)); } - height = (int) ((textY - y) / scale - 3); + return width; } @Override - public int getWidth(float scale) { - return (int) (width * scale); + protected float getHeight(float scale, boolean example) { + return lines == null ? 0 : (lines.size() * 12 - 4) * scale; } @Override - public int getHeight(float scale) { - return (int) (height * scale); + public boolean shouldDrawBackground() { + return super.shouldDrawBackground() && lines != null && lines.size() > 0; } private class TickHandler { @@ -105,8 +117,7 @@ public abstract class TextHud extends Hud { private void onTick(TickEvent event) { if (event.stage != Stage.START || !isEnabled()) return; lines.clear(); - if (!HudCore.editing) getLines(lines); - else getExampleLines(lines); + getLines(lines, HudCore.editing); } } }
\ No newline at end of file |