diff --git a/src/main/java/cloudburst/rejects/MeteorRejectsAddon.java b/src/main/java/cloudburst/rejects/MeteorRejectsAddon.java index 93d8515..f67c55a 100644 --- a/src/main/java/cloudburst/rejects/MeteorRejectsAddon.java +++ b/src/main/java/cloudburst/rejects/MeteorRejectsAddon.java @@ -1,6 +1,8 @@ package cloudburst.rejects; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; import minegame159.meteorclient.MeteorAddon; +import minegame159.meteorclient.gui.GuiThemes; import minegame159.meteorclient.systems.commands.Commands; import minegame159.meteorclient.systems.modules.Category; import minegame159.meteorclient.systems.modules.Modules; @@ -64,6 +66,8 @@ public class MeteorRejectsAddon extends MeteorAddon { hud.elements.add(new AppleHud(hud)); hud.elements.add(new CrystalHud(hud)); hud.elements.add(new ExpHud(hud)); + + GuiThemes.add(new MeteorRoundedGuiTheme()); } @Override diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/MeteorRoundedGuiTheme.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/MeteorRoundedGuiTheme.java new file mode 100644 index 0000000..fcf7108 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/MeteorRoundedGuiTheme.java @@ -0,0 +1,344 @@ +package cloudburst.rejects.gui.themes.rounded; + +import minegame159.meteorclient.gui.DefaultSettingsWidgetFactory; +import minegame159.meteorclient.gui.GuiTheme; +import minegame159.meteorclient.gui.WidgetScreen; +import minegame159.meteorclient.gui.renderer.packer.GuiTexture; +import cloudburst.rejects.gui.themes.rounded.widgets.*; +import cloudburst.rejects.gui.themes.rounded.widgets.input.WMeteorDropdown; +import cloudburst.rejects.gui.themes.rounded.widgets.input.WMeteorSlider; +import cloudburst.rejects.gui.themes.rounded.widgets.input.WMeteorTextBox; +import cloudburst.rejects.gui.themes.rounded.widgets.pressable.*; +import minegame159.meteorclient.gui.utils.AlignmentX; +import minegame159.meteorclient.gui.utils.CharFilter; +import minegame159.meteorclient.gui.widgets.*; +import minegame159.meteorclient.gui.widgets.containers.WSection; +import minegame159.meteorclient.gui.widgets.containers.WView; +import minegame159.meteorclient.gui.widgets.containers.WWindow; +import minegame159.meteorclient.gui.widgets.input.WDropdown; +import minegame159.meteorclient.gui.widgets.input.WSlider; +import minegame159.meteorclient.gui.widgets.input.WTextBox; +import minegame159.meteorclient.gui.widgets.pressable.*; +import minegame159.meteorclient.rendering.text.TextRenderer; +import minegame159.meteorclient.settings.*; +import minegame159.meteorclient.systems.accounts.Account; +import minegame159.meteorclient.systems.modules.Module; +import minegame159.meteorclient.utils.render.color.Color; +import minegame159.meteorclient.utils.render.color.SettingColor; + +import static minegame159.meteorclient.utils.Utils.mc; + +public class MeteorRoundedGuiTheme extends GuiTheme { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgColors = settings.createGroup("Colors"); + private final SettingGroup sgTextColors = settings.createGroup("Text"); + private final SettingGroup sgBackgroundColors = settings.createGroup("Background"); + private final SettingGroup sgOutline = settings.createGroup("Outline"); + private final SettingGroup sgSeparator = settings.createGroup("Separator"); + private final SettingGroup sgScrollbar = settings.createGroup("Scrollbar"); + private final SettingGroup sgSlider = settings.createGroup("Slider"); + + // General + + public final Setting scale = sgGeneral.add(new DoubleSetting.Builder() + .name("scale") + .description("Scale of the GUI.") + .defaultValue(1) + .min(0.75) + .sliderMin(0.75) + .sliderMax(4) + .onSliderRelease() + .onChanged(aDouble -> { + if (mc.currentScreen instanceof WidgetScreen) ((WidgetScreen) mc.currentScreen).invalidate(); + }) + .build() + ); + + public final Setting moduleAlignment = sgGeneral.add(new EnumSetting.Builder() + .name("module-alignment") + .description("How module titles are aligned.") + .defaultValue(AlignmentX.Center) + .build() + ); + + public final Setting categoryIcons = sgGeneral.add(new BoolSetting.Builder() + .name("category-icons") + .description("Adds item icons to module categories.") + .defaultValue(false) + .build() + ); + + public final Setting blur = sgGeneral.add(new BoolSetting.Builder() + .name("blur") + .description("Apply blur behind the GUI.") + .defaultValue(false) + .build() + ); + + public final Setting hideHUD = sgGeneral.add(new BoolSetting.Builder() + .name("hide-HUD") + .description("Hide HUD when in GUI.") + .defaultValue(false) + .onChanged(v -> { + if (mc.currentScreen instanceof WidgetScreen) mc.options.hudHidden = v; + }) + .build() + ); + + public final Setting round = sgGeneral.add(new IntSetting.Builder() + .name("round") + .description("How much windows should be rounded") + .defaultValue(0) + .min(0) + .max(20) + .sliderMin(0) + .sliderMax(15) + .build() + ); + + // Colors + + public final Setting accentColor = color("accent", "Main color of the GUI.", new SettingColor(135, 0, 255)); + public final Setting checkboxColor = color("checkbox", "Color of checkbox.", new SettingColor(135, 0, 255)); + public final Setting plusColor = color("plus", "Color of plus button.", new SettingColor(255, 255, 255)); + public final Setting minusColor = color("minus", "Color of minus button.", new SettingColor(255, 255, 255)); + + // Text + + public final Setting textColor = color(sgTextColors, "text", "Color of text.", new SettingColor(255, 255, 255)); + public final Setting textSecondaryColor = color(sgTextColors, "text-secondary-text", "Color of secondary text.", new SettingColor(150, 150, 150)); + public final Setting titleTextColor = color(sgTextColors, "title-text", "Color of title text.", new SettingColor(255, 255, 255)); + public final Setting loggedInColor = color(sgTextColors, "logged-in-text", "Color of logged in account name.", new SettingColor(45, 225, 45)); + + // Background + + public final ThreeStateColorSetting backgroundColor = new ThreeStateColorSetting( + sgBackgroundColors, + "background", + new SettingColor(20, 20, 20, 200), + new SettingColor(30, 30, 30, 200), + new SettingColor(40, 40, 40, 200) + ); + + public final Setting moduleBackground = color(sgBackgroundColors, "module-background", "Color of module background when active.", new SettingColor(50, 50, 50)); + + // Outline + + public final ThreeStateColorSetting outlineColor = new ThreeStateColorSetting( + sgOutline, + "outline", + new SettingColor(0, 0, 0), + new SettingColor(10, 10, 10), + new SettingColor(20, 20, 20) + ); + + // Separator + + public final Setting separatorText = color(sgSeparator, "separator-text", "Color of separator text", new SettingColor(255, 255, 255)); + public final Setting separatorCenter = color(sgSeparator, "separator-center", "Center color of separators.", new SettingColor(255, 255, 255)); + public final Setting separatorEdges = color(sgSeparator, "separator-edges", "Color of separator edges.", new SettingColor(225, 225, 225, 150)); + + // Scrollbar + + public final ThreeStateColorSetting scrollbarColor = new ThreeStateColorSetting( + sgScrollbar, + "Scrollbar", + new SettingColor(30, 30, 30, 200), + new SettingColor(40, 40, 40, 200), + new SettingColor(50, 50, 50, 200) + ); + + // Slider + + public final ThreeStateColorSetting sliderHandle = new ThreeStateColorSetting( + sgSlider, + "slider-handle", + new SettingColor(0, 255, 180), + new SettingColor(0, 240, 165), + new SettingColor(0, 225, 150) + ); + + public final Setting sliderLeft = color(sgSlider, "slider-left", "Color of slider left part.", new SettingColor(0, 150, 80)); + public final Setting sliderRight = color(sgSlider, "slider-right", "Color of slider right part.", new SettingColor(50, 50, 50)); + + public MeteorRoundedGuiTheme() { + super("Meteor Rounded"); + + settingsFactory = new DefaultSettingsWidgetFactory(this); + } + + private Setting color(SettingGroup group, String name, String description, SettingColor color) { + return group.add(new ColorSetting.Builder() + .name(name + "-color") + .description(description) + .defaultValue(color) + .build()); + } + private Setting color(String name, String description, SettingColor color) { + return color(sgColors, name, description, color); + } + + // Widgets + + @Override + public WWindow window(String title) { + return w(new WMeteorWindow(title)); + } + + @Override + public WLabel label(String text, boolean title, double maxWidth) { + if (maxWidth == 0) return w(new WMeteorLabel(text, title)); + return w(new WMeteorMultiLabel(text, title, maxWidth)); + } + + @Override + public WHorizontalSeparator horizontalSeparator(String text) { + return w(new WMeteorHorizontalSeparator(text)); + } + + @Override + public WVerticalSeparator verticalSeparator() { + return w(new WMeteorVerticalSeparator()); + } + + @Override + protected WButton button(String text, GuiTexture texture) { + return w(new WMeteorButton(text, texture)); + } + + @Override + public WMinus minus() { + return w(new WMeteorMinus()); + } + + @Override + public WPlus plus() { + return w(new WMeteorPlus()); + } + + @Override + public WCheckbox checkbox(boolean checked) { + return w(new WMeteorCheckbox(checked)); + } + + @Override + public WSlider slider(double value, double min, double max) { + return w(new WMeteorSlider(value, min, max)); + } + + @Override + public WTextBox textBox(String text, CharFilter filter) { + return w(new WMeteorTextBox(text, filter)); + } + + @Override + public WDropdown dropdown(T[] values, T value) { + return w(new WMeteorDropdown<>(values, value)); + } + + @Override + public WTriangle triangle() { + return w(new WMeteorTriangle()); + } + + @Override + public WTooltip tooltip(String text) { + return w(new WMeteorTooltip(text)); + } + + @Override + public WView view() { + return w(new WMeteorView()); + } + + @Override + public WSection section(String title, boolean expanded, WWidget headerWidget) { + return w(new WMeteorSection(title, expanded, headerWidget)); + } + + @Override + public WAccount account(WidgetScreen screen, Account account) { + return w(new WMeteorAccount(screen, account)); + } + + @Override + public WWidget module(Module module) { + return w(new WMeteorModule(module)); + } + + @Override + public WQuad quad(Color color) { + return w(new WMeteorQuad(color)); + } + + @Override + public WTopBar topBar() { + return w(new WMeteorTopBar()); + } + + // Colors + + @Override + public Color textColor() { + return textColor.get(); + } + + @Override + public Color textSecondaryColor() { + return textSecondaryColor.get(); + } + + // Other + + @Override + public TextRenderer textRenderer() { + return TextRenderer.get(); + } + + @Override + public double scale(double value) { + return value * scale.get(); + } + + @Override + public boolean categoryIcons() { + return categoryIcons.get(); + } + + @Override + public boolean blur() { + return blur.get(); + } + + @Override + public boolean hideHUD() { + return hideHUD.get(); + } + + public int roundAmount() { + return round.get(); + } + + public class ThreeStateColorSetting { + private final Setting normal, hovered, pressed; + + public ThreeStateColorSetting(SettingGroup group, String name, SettingColor c1, SettingColor c2, SettingColor c3) { + normal = color(group, name, "Color of " + name + ".", c1); + hovered = color(group, "hovered-" + name, "Color of " + name + " when hovered.", c2); + pressed = color(group, "pressed-" + name, "Color of " + name + " when pressed.", c3); + } + + public SettingColor get() { + return normal.get(); + } + + public SettingColor get(boolean pressed, boolean hovered, boolean bypassDisableHoverColor) { + if (pressed) return this.pressed.get(); + return (hovered && (bypassDisableHoverColor || !disableHoverColor)) ? this.hovered.get() : this.normal.get(); + } + + public SettingColor get(boolean pressed, boolean hovered) { + return get(pressed, hovered, false); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/MeteorWidget.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/MeteorWidget.java new file mode 100644 index 0000000..620d5c5 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/MeteorWidget.java @@ -0,0 +1,26 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded; + +import cloudburst.rejects.utils.gui.GuiUtils; +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import minegame159.meteorclient.gui.utils.BaseWidget; +import minegame159.meteorclient.gui.widgets.WWidget; +import minegame159.meteorclient.utils.render.color.Color; + +public interface MeteorWidget extends BaseWidget { + default MeteorRoundedGuiTheme theme() { + return (MeteorRoundedGuiTheme) getTheme(); + } + + default void renderBackground(GuiRenderer renderer, WWidget widget, boolean pressed, boolean mouseOver) { + MeteorRoundedGuiTheme theme = theme(); + int r = theme.roundAmount(); + Color outlineColor = theme.outlineColor.get(pressed, mouseOver); + GuiUtils.quadRounded(renderer, widget, theme.backgroundColor.get(pressed, mouseOver), r); + GuiUtils.quadOutlineRounded(renderer, widget, outlineColor, r, theme.scale(2)); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorAccount.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorAccount.java new file mode 100644 index 0000000..6a6c929 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorAccount.java @@ -0,0 +1,28 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import minegame159.meteorclient.gui.WidgetScreen; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.WAccount; +import minegame159.meteorclient.systems.accounts.Account; +import minegame159.meteorclient.utils.render.color.Color; + +public class WMeteorAccount extends WAccount implements MeteorWidget { + public WMeteorAccount(WidgetScreen screen, Account account) { + super(screen, account); + } + + @Override + protected Color loggedInColor() { + return theme().loggedInColor.get(); + } + + @Override + protected Color accountTypeColor() { + return theme().textSecondaryColor.get(); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorHorizontalSeparator.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorHorizontalSeparator.java new file mode 100644 index 0000000..14f5f23 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorHorizontalSeparator.java @@ -0,0 +1,47 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.WHorizontalSeparator; + +public class WMeteorHorizontalSeparator extends WHorizontalSeparator implements MeteorWidget { + public WMeteorHorizontalSeparator(String text) { + super(text); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + if (text == null) renderWithoutText(renderer); + else renderWithText(renderer); + } + + private void renderWithoutText(GuiRenderer renderer) { + MeteorRoundedGuiTheme theme = theme(); + double s = theme.scale(1); + double w = width / 2; + + renderer.quad(x, y + s, w, s, theme.separatorEdges.get(), theme.separatorCenter.get()); + renderer.quad(x + w, y + s, w, s, theme.separatorCenter.get(), theme.separatorEdges.get()); + } + + private void renderWithText(GuiRenderer renderer) { + MeteorRoundedGuiTheme theme = theme(); + double s = theme.scale(2); + double h = theme.scale(1); + + double textStart = Math.round(width / 2.0 - textWidth / 2.0 - s); + double textEnd = s + textStart + textWidth + s; + + double offsetY = Math.round(height / 2.0); + + renderer.quad(x, y + offsetY, textStart, h, theme.separatorEdges.get(), theme.separatorCenter.get()); + renderer.text(text, x + textStart + s, y, theme.separatorText.get(), false); + renderer.quad(x + textEnd, y + offsetY, width - textEnd, h, theme.separatorCenter.get(), theme.separatorEdges.get()); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorLabel.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorLabel.java new file mode 100644 index 0000000..89fc51f --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorLabel.java @@ -0,0 +1,23 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.WLabel; + +public class WMeteorLabel extends WLabel implements MeteorWidget { + public WMeteorLabel(String text, boolean title) { + super(text, title); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + if (!text.isEmpty()) { + renderer.text(text, x, y, color != null ? color : (title ? theme().titleTextColor.get() : theme().textColor.get()), title); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorModule.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorModule.java new file mode 100644 index 0000000..c69fd1d --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorModule.java @@ -0,0 +1,92 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.utils.AlignmentX; +import minegame159.meteorclient.gui.widgets.pressable.WPressable; +import minegame159.meteorclient.systems.modules.Module; +import minegame159.meteorclient.utils.Utils; + +import static minegame159.meteorclient.utils.Utils.mc; +import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; +import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT; + +public class WMeteorModule extends WPressable implements MeteorWidget { + private final Module module; + + private double titleWidth; + + private double animationProgress1; + + private double animationProgress2; + + public WMeteorModule(Module module) { + this.module = module; + + if (module.isActive()) { + animationProgress1 = 1; + animationProgress2 = 1; + } else { + animationProgress1 = 0; + animationProgress2 = 0; + } + } + + @Override + public double pad() { + return theme.scale(4); + } + + @Override + protected void onCalculateSize() { + double pad = pad(); + + if (titleWidth == 0) titleWidth = theme.textWidth(module.title); + + width = pad + titleWidth + pad; + height = pad + theme.textHeight() + pad; + } + + @Override + protected void onPressed(int button) { + if (button == GLFW_MOUSE_BUTTON_LEFT) module.toggle(Utils.canUpdate()); + else if (button == GLFW_MOUSE_BUTTON_RIGHT) mc.openScreen(theme.moduleScreen(module)); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + MeteorRoundedGuiTheme theme = theme(); + double pad = pad(); + + animationProgress1 += delta * 4 * ((module.isActive() || mouseOver) ? 1 : -1); + animationProgress1 = Utils.clamp(animationProgress1, 0, 1); + + animationProgress2 += delta * 6 * (module.isActive() ? 1 : -1); + animationProgress2 = Utils.clamp(animationProgress2, 0, 1); + + if (animationProgress1 > 0) { + renderer.quad(x, y, width * animationProgress1, height, theme.moduleBackground.get()); + } + if (animationProgress2 > 0) { + renderer.quad(x, y + height * (1 - animationProgress2), theme.scale(2), height * animationProgress2, theme.accentColor.get()); + } + + double x = this.x + pad; + double w = width - pad * 2; + + if (theme.moduleAlignment.get() == AlignmentX.Center) { + x += w / 2 - titleWidth / 2; + } + else if (theme.moduleAlignment.get() == AlignmentX.Right) { + x += w - titleWidth; + } + + renderer.text(module.title, x, y + pad, theme.textColor.get(), false); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorMultiLabel.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorMultiLabel.java new file mode 100644 index 0000000..087da40 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorMultiLabel.java @@ -0,0 +1,27 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.WMultiLabel; +import minegame159.meteorclient.utils.render.color.Color; + +public class WMeteorMultiLabel extends WMultiLabel implements MeteorWidget { + public WMeteorMultiLabel(String text, boolean title, double maxWidth) { + super(text, title, maxWidth); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + double h = theme.textHeight(title); + Color color = theme().textColor.get(); + + for (int i = 0; i < lines.size(); i++) { + renderer.text(lines.get(i), x, y + h * i, color, false); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorQuad.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorQuad.java new file mode 100644 index 0000000..37cdeb7 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorQuad.java @@ -0,0 +1,23 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.utils.gui.GuiUtils; +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import minegame159.meteorclient.gui.widgets.WQuad; +import minegame159.meteorclient.utils.render.color.Color; + +public class WMeteorQuad extends WQuad { + public WMeteorQuad(Color color) { + super(color); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + GuiUtils.quadRounded(renderer, x, y, width, height, color, ((MeteorRoundedGuiTheme)theme).roundAmount()); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorSection.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorSection.java new file mode 100644 index 0000000..3659eed --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorSection.java @@ -0,0 +1,56 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.WWidget; +import minegame159.meteorclient.gui.widgets.containers.WSection; +import minegame159.meteorclient.gui.widgets.pressable.WTriangle; + +public class WMeteorSection extends WSection { + public WMeteorSection(String title, boolean expanded, WWidget headerWidget) { + super(title, expanded, headerWidget); + } + + @Override + protected WHeader createHeader() { + return new WMeteorHeader(title); + } + + protected class WMeteorHeader extends WHeader { + private WTriangle triangle; + + public WMeteorHeader(String title) { + super(title); + } + + @Override + public void init() { + add(theme.horizontalSeparator(title)).expandX(); + + if (headerWidget != null) add(headerWidget); + + triangle = new WHeaderTriangle(); + triangle.theme = theme; + triangle.action = this::onClick; + + add(triangle); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + triangle.rotation = (1 - animProgress) * -90; + } + } + + protected static class WHeaderTriangle extends WTriangle implements MeteorWidget { + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + renderer.rotatedQuad(x, y, width, height, rotation, GuiRenderer.TRIANGLE, theme().textColor.get()); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorTooltip.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorTooltip.java new file mode 100644 index 0000000..a91c3cc --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorTooltip.java @@ -0,0 +1,21 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.WTooltip; + +public class WMeteorTooltip extends WTooltip implements MeteorWidget { + public WMeteorTooltip(String text) { + super(text); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + renderer.quad(this, theme().backgroundColor.get()); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorTopBar.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorTopBar.java new file mode 100644 index 0000000..5259f5e --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorTopBar.java @@ -0,0 +1,22 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.WTopBar; +import minegame159.meteorclient.utils.render.color.Color; + +public class WMeteorTopBar extends WTopBar implements MeteorWidget { + @Override + protected Color getButtonColor(boolean pressed, boolean hovered) { + return theme().backgroundColor.get(pressed, hovered); + } + + @Override + protected Color getNameColor() { + return theme().textColor.get(); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorVerticalSeparator.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorVerticalSeparator.java new file mode 100644 index 0000000..cd8a604 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorVerticalSeparator.java @@ -0,0 +1,27 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.WVerticalSeparator; +import minegame159.meteorclient.utils.render.color.Color; + +public class WMeteorVerticalSeparator extends WVerticalSeparator implements MeteorWidget { + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + MeteorRoundedGuiTheme theme = theme(); + Color colorEdges = theme.separatorEdges.get(); + Color colorCenter = theme.separatorCenter.get(); + + double s = theme.scale(1); + double offsetX = Math.round(width / 2.0); + + renderer.quad(x + offsetX, y, s, height / 2, colorEdges, colorEdges, colorCenter, colorCenter); + renderer.quad(x + offsetX, y + height / 2, s, height / 2, colorCenter, colorCenter, colorEdges, colorEdges); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorView.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorView.java new file mode 100644 index 0000000..07612e6 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorView.java @@ -0,0 +1,19 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.containers.WView; + +public class WMeteorView extends WView implements MeteorWidget { + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + if (canScroll && hasScrollBar) { + renderer.quad(handleX(), handleY(), handleWidth(), handleHeight(), theme().scrollbarColor.get(handlePressed, handleMouseOver)); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorWindow.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorWindow.java new file mode 100644 index 0000000..698eb6a --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/WMeteorWindow.java @@ -0,0 +1,37 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets; + +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.utils.gui.GuiUtils; +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.containers.WWindow; + +public class WMeteorWindow extends WWindow implements MeteorWidget { + public WMeteorWindow(String title) { + super(title); + } + + @Override + protected WHeader header() { + return new WMeteorHeader(); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + if (expanded || animProgress > 0) { + GuiUtils.quadRounded(renderer,x , y + header.height / 2, width, height - header.height / 2, theme().backgroundColor.get(), ((MeteorRoundedGuiTheme)theme).roundAmount(), false); + } + } + + private class WMeteorHeader extends WHeader { + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + GuiUtils.quadRounded(renderer, this, theme().accentColor.get(), ((MeteorRoundedGuiTheme)theme).roundAmount()); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/input/WMeteorDropdown.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/input/WMeteorDropdown.java new file mode 100644 index 0000000..36381c5 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/input/WMeteorDropdown.java @@ -0,0 +1,83 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets.input; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.input.WDropdown; +import minegame159.meteorclient.utils.render.color.Color; + +public class WMeteorDropdown extends WDropdown implements MeteorWidget { + public WMeteorDropdown(T[] values, T value) { + super(values, value); + } + + @Override + protected WDropdownRoot createRootWidget() { + return new WRoot(); + } + + @Override + protected WDropdownValue createValueWidget() { + return new WValue(); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + MeteorRoundedGuiTheme theme = theme(); + double pad = pad(); + double s = theme.textHeight(); + + renderBackground(renderer, this, pressed, mouseOver); + + String text = get().toString(); + double w = theme.textWidth(text); + renderer.text(text, x + pad + maxValueWidth / 2 - w / 2, y + pad, theme.textColor.get(), false); + + renderer.rotatedQuad(x + pad + maxValueWidth + pad, y + pad, s, s, 0, GuiRenderer.TRIANGLE, theme.textColor.get()); + } + + private static class WRoot extends WDropdownRoot implements MeteorWidget { + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + MeteorRoundedGuiTheme theme = theme(); + double s = theme.scale(2); + Color c = theme.outlineColor.get(); + + renderer.quad(x, y + height - s, width, s, c); + renderer.quad(x, y, s, height - s, c); + renderer.quad(x + width - s, y, s, height - s, c); + } + } + + private class WValue extends WDropdownValue implements MeteorWidget { + @Override + protected void onCalculateSize() { + double pad = pad(); + + width = pad + theme.textWidth(value.toString()) + pad; + height = pad + theme.textHeight() + pad; + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + MeteorRoundedGuiTheme theme = theme(); + + Color color = theme.backgroundColor.get(pressed, mouseOver, true); + int preA = color.a; + color.a += color.a / 2; + color.validate(); + + renderer.quad(this, color); + + color.a = preA; + + String text = value.toString(); + renderer.text(text, x + width / 2 - theme.textWidth(text) / 2, y + pad(), theme.textColor.get(), false); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/input/WMeteorSlider.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/input/WMeteorSlider.java new file mode 100644 index 0000000..d8a5917 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/input/WMeteorSlider.java @@ -0,0 +1,45 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets.input; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.input.WSlider; + +public class WMeteorSlider extends WSlider implements MeteorWidget { + public WMeteorSlider(double value, double min, double max) { + super(value, min, max); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + double valueWidth = valueWidth(); + + renderBar(renderer, valueWidth); + renderHandle(renderer, valueWidth); + } + + private void renderBar(GuiRenderer renderer, double valueWidth) { + MeteorRoundedGuiTheme theme = theme(); + + double s = theme.scale(3); + double handleSize = handleSize(); + + double x = this.x + handleSize / 2; + double y = this.y + height / 2 - s / 2; + + renderer.quad(x, y, valueWidth, s, theme.sliderLeft.get()); + renderer.quad(x + valueWidth, y, width - valueWidth - handleSize, s, theme.sliderRight.get()); + } + + private void renderHandle(GuiRenderer renderer, double valueWidth) { + MeteorRoundedGuiTheme theme = theme(); + double s = handleSize(); + + renderer.quad(x + valueWidth, y, s, s, GuiRenderer.CIRCLE, theme.sliderHandle.get(dragging, handleMouseOver)); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/input/WMeteorTextBox.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/input/WMeteorTextBox.java new file mode 100644 index 0000000..57efff6 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/input/WMeteorTextBox.java @@ -0,0 +1,66 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets.input; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.utils.CharFilter; +import minegame159.meteorclient.gui.widgets.input.WTextBox; +import minegame159.meteorclient.utils.Utils; + +public class WMeteorTextBox extends WTextBox implements MeteorWidget { + private boolean cursorVisible; + private double cursorTimer; + + private double animProgress; + + public WMeteorTextBox(String text, CharFilter filter) { + super(text, filter); + } + + @Override + protected void onCursorChanged() { + cursorVisible = true; + cursorTimer = 0; + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + if (cursorTimer >= 1) { + cursorVisible = !cursorVisible; + cursorTimer = 0; + } + else { + cursorTimer += delta * 1.75; + } + + renderBackground(renderer, this, false, false); + renderTextAndCursor(renderer, delta); + } + + private void renderTextAndCursor(GuiRenderer renderer, double delta) { + MeteorRoundedGuiTheme theme = theme(); + double pad = pad(); + + double overflowWidth = getOverflowWidthForRender(); + + if (!text.isEmpty()) { + renderer.scissorStart(x + pad, y + pad, width - pad * 2, height - pad * 2); + renderer.text(text, x + pad - overflowWidth, y + pad, theme.textColor.get(), false); + renderer.scissorEnd(); + } + + animProgress += delta * 10 * (focused && cursorVisible ? 1 : -1); + animProgress = Utils.clamp(animProgress, 0, 1); + + if ((focused && cursorVisible) || animProgress > 0) { + renderer.setAlpha(animProgress); + renderer.quad(x + pad + getCursorTextWidth() - overflowWidth, y + pad, theme.scale(1), theme.textHeight(), theme.textColor.get()); + renderer.setAlpha(1); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorButton.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorButton.java new file mode 100644 index 0000000..bad38e0 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorButton.java @@ -0,0 +1,34 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets.pressable; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import minegame159.meteorclient.gui.renderer.packer.GuiTexture; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.pressable.WButton; + +public class WMeteorButton extends WButton implements MeteorWidget { + public WMeteorButton(String text, GuiTexture texture) { + super(text, texture); + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + MeteorRoundedGuiTheme theme = theme(); + double pad = pad(); + + renderBackground(renderer, this, pressed, mouseOver); + + if (text != null) { + renderer.text(text, x + width / 2 - textWidth / 2, y + pad, theme.textColor.get(), false); + } + else { + double ts = theme.textHeight(); + renderer.quad(x + width / 2 - ts / 2, y + pad, ts, ts, texture, theme.textColor.get()); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorCheckbox.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorCheckbox.java new file mode 100644 index 0000000..4251fcd --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorCheckbox.java @@ -0,0 +1,37 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets.pressable; + +import cloudburst.rejects.utils.gui.GuiUtils; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.pressable.WCheckbox; +import minegame159.meteorclient.utils.Utils; + +public class WMeteorCheckbox extends WCheckbox implements MeteorWidget { + private double animProgress; + + public WMeteorCheckbox(boolean checked) { + super(checked); + animProgress = checked ? 1 : 0; + } + + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + MeteorRoundedGuiTheme theme = theme(); + + animProgress += (checked ? 1 : -1) * delta * 14; + animProgress = Utils.clamp(animProgress, 0, 1); + + renderBackground(renderer, this, pressed, mouseOver); + + if (animProgress > 0) { + double cs = (width - theme.scale(2)) / 1.75 * animProgress; + GuiUtils.quadRounded(renderer, x + (width - cs) / 2, y + (height - cs) / 2, cs, cs, theme.checkboxColor.get(), ((MeteorRoundedGuiTheme)theme).roundAmount()); + } + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorMinus.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorMinus.java new file mode 100644 index 0000000..67ad76e --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorMinus.java @@ -0,0 +1,21 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets.pressable; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.pressable.WMinus; + +public class WMeteorMinus extends WMinus implements MeteorWidget { + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + double pad = pad(); + double s = theme.scale(3); + + renderBackground(renderer, this, pressed, mouseOver); + renderer.quad(x + pad, y + height / 2 - s / 2, width - pad * 2, s, theme().minusColor.get()); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorPlus.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorPlus.java new file mode 100644 index 0000000..67ac26a --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorPlus.java @@ -0,0 +1,24 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets.pressable; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.pressable.WPlus; + +public class WMeteorPlus extends WPlus implements MeteorWidget { + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + MeteorRoundedGuiTheme theme = theme(); + double pad = pad(); + double s = theme.scale(3); + + renderBackground(renderer, this, pressed, mouseOver); + renderer.quad(x + pad, y + height / 2 - s / 2, width - pad * 2, s, theme.plusColor.get()); + renderer.quad(x + width / 2 - s / 2, y + pad, s, height - pad * 2, theme.plusColor.get()); + } +} diff --git a/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorTriangle.java b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorTriangle.java new file mode 100644 index 0000000..7750bbd --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/themes/rounded/widgets/pressable/WMeteorTriangle.java @@ -0,0 +1,17 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/). + * Copyright (c) 2021 Meteor Development. + */ + +package cloudburst.rejects.gui.themes.rounded.widgets.pressable; + +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import cloudburst.rejects.gui.themes.rounded.MeteorWidget; +import minegame159.meteorclient.gui.widgets.pressable.WTriangle; + +public class WMeteorTriangle extends WTriangle implements MeteorWidget { + @Override + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + renderer.rotatedQuad(x, y, width, height, rotation, GuiRenderer.TRIANGLE, theme().backgroundColor.get(pressed, mouseOver)); + } +} diff --git a/src/main/java/cloudburst/rejects/mixin/meteor/GuiRendererAccessor.java b/src/main/java/cloudburst/rejects/mixin/meteor/GuiRendererAccessor.java index 376b6e9..2c29559 100644 --- a/src/main/java/cloudburst/rejects/mixin/meteor/GuiRendererAccessor.java +++ b/src/main/java/cloudburst/rejects/mixin/meteor/GuiRendererAccessor.java @@ -8,5 +8,5 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(GuiRenderer.class) public interface GuiRendererAccessor { @Accessor("mb") - public MeshBuilder getMeshbuilder(); + MeshBuilder getMeshbuilder(); } diff --git a/src/main/java/cloudburst/rejects/utils/gui/GuiUtils.java b/src/main/java/cloudburst/rejects/utils/gui/GuiUtils.java new file mode 100644 index 0000000..fb4651a --- /dev/null +++ b/src/main/java/cloudburst/rejects/utils/gui/GuiUtils.java @@ -0,0 +1,42 @@ +package cloudburst.rejects.utils.gui; + +import cloudburst.rejects.mixin.meteor.GuiRendererAccessor; +import minegame159.meteorclient.gui.renderer.GuiRenderer; +import minegame159.meteorclient.gui.widgets.WWidget; +import minegame159.meteorclient.rendering.MeshBuilder; +import minegame159.meteorclient.utils.render.color.Color; + +public class GuiUtils { + public static void quadRounded(GuiRenderer renderer, double x, double y, double width, double height, Color color, int round, boolean roundTop) { + MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder(); + RoundedMeshBuilder.quadRounded(mb, x, y, width, height, color, round, roundTop); + } + public static void quadRounded(GuiRenderer renderer, double x, double y, double width, double height, Color color, int round) { + quadRounded(renderer, x, y, width, height, color, round, true); + } + public static void quadRounded(GuiRenderer renderer, WWidget widget, Color color, int round) { + quadRounded(renderer, widget.x, widget.y, widget.width, widget.height, color, round); + } + public static void quadOutlineRounded(GuiRenderer renderer, double x, double y, double width, double height, Color color, int round, double s) { + MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder(); + RoundedMeshBuilder.quadRoundedOutline(mb, x, y, width, height, color, round, s); + } + public static void quadOutlineRounded(GuiRenderer renderer, WWidget widget, Color color, int round, double s) { + quadOutlineRounded(renderer, widget.x, widget.y, widget.width, widget.height, color, round, s); + } + public static void quadRoundedSide(GuiRenderer renderer, double x, double y, double width, double height, Color color, int r, boolean right) { + MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder(); + RoundedMeshBuilder.quadRoundedSide(mb, x, y, width, height, color, r, right); + } + public static void quadRoundedSide(GuiRenderer renderer, WWidget widget, Color color, int round, boolean right) { + quadRoundedSide(renderer, widget.x, widget.y, widget.width, widget.height, color, round, right); + } + public static void circlePart(GuiRenderer renderer, double x, double y, double r, double startAngle, double angle, Color color) { + MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder(); + RoundedMeshBuilder.circlePart(mb, x, y, r, startAngle, angle, color); + } + public static void circlePartOutline(GuiRenderer renderer, double x, double y, double r, double startAngle, double angle, Color color, double outlineWidth) { + MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder(); + RoundedMeshBuilder.circlePartOutline(mb, x, y, r, startAngle, angle, color, outlineWidth); + } +} diff --git a/src/main/java/cloudburst/rejects/utils/gui/RoundedMeshBuilder.java b/src/main/java/cloudburst/rejects/utils/gui/RoundedMeshBuilder.java new file mode 100644 index 0000000..c8723b5 --- /dev/null +++ b/src/main/java/cloudburst/rejects/utils/gui/RoundedMeshBuilder.java @@ -0,0 +1,134 @@ +package cloudburst.rejects.utils.gui; + +import minegame159.meteorclient.rendering.MeshBuilder; +import minegame159.meteorclient.utils.render.color.Color; + +public class RoundedMeshBuilder { + + private static final double circleNone = 0; + private static final double circleQuarter = Math.PI / 2; + private static final double circleHalf = circleQuarter * 2; + private static final double circleThreeQuarter = circleQuarter * 3; + + public static void quadRoundedOutline(MeshBuilder mb, double x, double y, double width, double height, Color color, int r, double s) { + r = getR(r, width, height); + if (r == 0) { + mb.quad(x, y, width, s, color); + mb.quad(x, y + height - s, width, s, color); + mb.quad(x, y + s, s, height - s * 2, color); + mb.quad(x + width - s, y + s, s, height - s * 2, color); + } + else { + //top + circlePartOutline(mb, x + r, y + r, r, circleThreeQuarter, circleQuarter, color, s); + mb.quad(x + r, y, width - r * 2, s, color); + circlePartOutline(mb, x + width - r, y + r, r, circleNone, circleQuarter, color, s); + //middle + mb.quad(x, y + r, s, height - r * 2, color); + mb.quad(x + width - s, y + r, s, height - r * 2, color); + //bottom + circlePartOutline(mb, x + width - r, y + height - r, r, circleQuarter, circleQuarter, color, s); + mb.quad(x + r, y + height - s, width - r * 2, s, color); + circlePartOutline(mb, x + r, y + height - r, r, circleHalf, circleQuarter, color, s); + } + } + + public static void quadRounded(MeshBuilder mb, double x, double y, double width, double height, Color color, int r, boolean roundTop) { + r = getR(r, width, height); + if (r == 0) + mb.quad(x, y, width, height, color); + else { + if (roundTop) { + //top + circlePart(mb, x + r, y + r, r, circleThreeQuarter, circleQuarter, color); + mb.quad(x + r, y, width - 2 * r, r, color); + circlePart(mb, x + width - r, y + r, r, circleNone, circleQuarter, color); + //middle + mb.quad(x, y + r, width, height - 2 * r, color); + } + else { + //middle + mb.quad(x, y, width, height - r, color); + } + //bottom + circlePart(mb, x + width - r, y + height - r, r, circleQuarter, circleQuarter, color); + mb.quad(x + r, y + height - r, width - 2 * r, r, color); + circlePart(mb, x + r, y + height - r, r, circleHalf, circleQuarter, color); + } + } + + public static void quadRoundedSide(MeshBuilder mb, double x, double y, double width, double height, Color color, int r, boolean right) { + r = getR(r, width, height); + if (r == 0) + mb.quad(x, y, width, height, color); + else { + if (right) { + circlePart(mb, x + width - r, y + r, r, circleNone, circleQuarter, color); + circlePart(mb, x + width - r, y + height - r, r, circleQuarter, circleQuarter, color); + mb.quad(x, y, width - r, height, color); + mb.quad(x + width - r, y + r, r, height - r * 2, color); + } + else { + circlePart(mb, x + r, y + r, r, circleThreeQuarter, circleQuarter, color); + circlePart(mb, x + r, y + height - r, r, circleHalf, circleQuarter, color); + mb.quad(x + r, y, width - r, height, color); + mb.quad(x, y + r, r, height - r * 2, color); + } + } + } + + private static int getR(int r, double w, double h) { + if (r * 2 > h) { + r = (int)h / 2; + } + if (r * 2 > w) { + r = (int)w / 2; + } + return r; + } + + private static int getCirDepth(double r, double angle) { + return Math.max(1, (int)(angle * r / circleQuarter)); + } + + public static void circlePart(MeshBuilder mb, double x, double y, double r, double startAngle, double angle, Color color) { + int cirDepth = getCirDepth(r, angle); + double cirPart = angle / cirDepth; + vert2(mb,x + Math.sin(startAngle) * r, y - Math.cos(startAngle) * r, color); + for (int i = 1; i < cirDepth + 1; i++) { + vert2(mb, x, y, color); + double xV = x + Math.sin(startAngle + cirPart * i) * r; + double yV = y - Math.cos(startAngle + cirPart * i) * r; + vert2(mb, xV, yV, color); + if (i != cirDepth) + vert2(mb, xV, yV, color); + } + } + + public static void circlePartOutline(MeshBuilder mb, double x, double y, double r, double startAngle, double angle, Color color, double outlineWidth) { + int cirDepth = getCirDepth(r, angle); + double cirPart = angle / cirDepth; + for (int i = 0; i < cirDepth; i++) { + double xOC = x + Math.sin(startAngle + cirPart * i) * r; + double yOC = y - Math.cos(startAngle + cirPart * i) * r; + double xIC = x + Math.sin(startAngle + cirPart * i) * (r - outlineWidth); + double yIC = y - Math.cos(startAngle + cirPart * i) * (r - outlineWidth); + double xON = x + Math.sin(startAngle + cirPart * (i + 1)) * r; + double yON = y - Math.cos(startAngle + cirPart * (i + 1)) * r; + double xIN = x + Math.sin(startAngle + cirPart * (i + 1)) * (r - outlineWidth); + double yIN = y - Math.cos(startAngle + cirPart * (i + 1)) * (r - outlineWidth); + // + vert2(mb, xOC, yOC, color); + vert2(mb, xON, yON, color); + vert2(mb, xIC, yIC, color); + // + vert2(mb, xIC, yIC, color); + vert2(mb, xON, yON, color); + vert2(mb, xIN, yIN, color); + } + } + + public static void vert2(MeshBuilder mb, double x, double y, Color c) { + mb.pos(x, y, 0).color(c).endVertex(); + } +}