From 5cce4eabaf687eac95914099cb35018494a7d094 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 27 Apr 2025 10:45:45 -0500 Subject: [PATCH] new ui elements --- .../saturnclient/modules/mods/Crosshair.java | 6 +- .../saturnclient/SaturnClient.java | 2 +- .../java/org/saturnclient/ui2/Element.java | 12 ++-- .../org/saturnclient/ui2/RenderScope.java | 31 +++++++--- .../org/saturnclient/ui2/SaturnScreen.java | 1 + .../ui2/elements/ClickableTexture.java | 42 +++++++++++++ .../ui2/elements/ImageTexture.java | 22 +++++++ .../org/saturnclient/ui2/elements/Text.java | 7 ++- .../ui2/elements/TextureButton.java | 59 +++++++++++++++++++ .../saturnclient/ui2/screens/ShiftMenu.java | 23 +++++++- 10 files changed, 185 insertions(+), 20 deletions(-) create mode 100644 src/main/java/org/saturnclient/ui2/elements/ClickableTexture.java create mode 100644 src/main/java/org/saturnclient/ui2/elements/ImageTexture.java create mode 100644 src/main/java/org/saturnclient/ui2/elements/TextureButton.java diff --git a/src/main/java/org/saturnclient/modules/mods/Crosshair.java b/src/main/java/org/saturnclient/modules/mods/Crosshair.java index 260fbda..829c337 100644 --- a/src/main/java/org/saturnclient/modules/mods/Crosshair.java +++ b/src/main/java/org/saturnclient/modules/mods/Crosshair.java @@ -25,10 +25,10 @@ public class Crosshair extends Module { int scaledWidth = 15; int scaledHeight = 15; - scope.drawTexture(RenderLayer::getCrosshair, Textures.CROSSHAIR_RANGE, + scope.setRenderLayer(RenderLayer::getCrosshair); + scope.drawTexture(Textures.CROSSHAIR_RANGE, (scope.getScaledWindowWidth() - scaledWidth) / 2, - (scope.getScaledWindowHeight() - scaledHeight) / 2, 0.0F, 0.0F, scaledWidth, scaledHeight, - scaledWidth, scaledHeight); + (scope.getScaledWindowHeight() - scaledHeight) / 2, 0.0F, 0.0F, scaledWidth, scaledHeight); } } diff --git a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java index e142df8..199b9f6 100644 --- a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java +++ b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java @@ -38,7 +38,7 @@ public class SaturnClient implements ModInitializer { ThemeManager.load(); ConfigManager.load(); - ClientLifecycleEvents.CLIENT_STOPPING.register(_o -> {ConfigManager.save(); ThemeManager.save();}); + ClientLifecycleEvents.CLIENT_STOPPING.register(_o -> ConfigManager.save()); ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> { if (SaturnClientConfig.saturnTitleScreen.value && screen instanceof TitleScreen && !(screen instanceof SaturnMenu)) { diff --git a/src/main/java/org/saturnclient/ui2/Element.java b/src/main/java/org/saturnclient/ui2/Element.java index 28ce456..d87923d 100644 --- a/src/main/java/org/saturnclient/ui2/Element.java +++ b/src/main/java/org/saturnclient/ui2/Element.java @@ -3,8 +3,8 @@ package org.saturnclient.ui2; public class Element { protected int x; protected int y; - protected int width; - protected int height; + public int width; + public int height; public boolean focused; public void render(RenderScope renderScope, RenderContext ctx) { @@ -13,14 +13,18 @@ public class Element { public void click(int mouseX, int mouseY) { } - public final void dimensions(int width, int height) { + public final Element dimensions(int width, int height) { this.width = width; this.height = height; + + return this; } - public final void position(int x, int y) { + public final Element position(int x, int y) { this.x = x; this.y = y; + + return this; } public final Element center(int w, int h) { diff --git a/src/main/java/org/saturnclient/ui2/RenderScope.java b/src/main/java/org/saturnclient/ui2/RenderScope.java index 2160bf0..f42e4df 100644 --- a/src/main/java/org/saturnclient/ui2/RenderScope.java +++ b/src/main/java/org/saturnclient/ui2/RenderScope.java @@ -19,6 +19,7 @@ import net.minecraft.util.math.RotationAxis; public class RenderScope { public MatrixStack matrices; public VertexConsumerProvider.Immediate vertexConsumers; + private Function renderLayers; private int opacity = 255 << 24; public RenderScope(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers) { @@ -34,6 +35,10 @@ public class RenderScope { return opacity | (color & 0x00FFFFFF); } + public void setRenderLayer(Function renderLayers) { + this.renderLayers = renderLayers; + } + public void drawRect(int x, int y, int width, int height, int color) { color = getColor(color); Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); @@ -220,23 +225,30 @@ public class RenderScope { public int getScaledWindowHeight() { return SaturnClient.client.getWindow().getScaledHeight(); } - public void drawTexture(Function renderLayers, Identifier sprite, int x, int y, float u, float v, int width, int height, int textureWidth, int textureHeight, int color) { - this.drawTexture(renderLayers, sprite, x, y, u, v, width, height, width, height, textureWidth, textureHeight, color); + public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height, int color) { + this.drawTexture(sprite, x, y, u, v, width, height, width, height, width, height, color); } - public void drawTexture(Function renderLayers, Identifier sprite, int x, int y, float u, float v, int width, int height, int textureWidth, int textureHeight) { - this.drawTexture(renderLayers, sprite, x, y, u, v, width, height, width, height, textureWidth, textureHeight); + public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height) { + this.drawTexture(sprite, x, y, u, v, width, height, width, height, width, height); } - public void drawTexture(Function renderLayers, Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWith, int regionHeight, int textureWidth, int textureHeight) { - this.drawTexture(renderLayers, sprite, x, y, u, v, width, height, regionWith, regionHeight, textureWidth, textureHeight, -1); + public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWith, int regionHeight, int textureWidth, int textureHeight) { + this.drawTexture(sprite, x, y, u, v, width, height, regionWith, regionHeight, textureWidth, textureHeight, -1); } - public void drawTexture(Function renderLayers, Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWidth, int regionHeight, int textureWidth, int textureHeight, int color) { - this.drawTexturedQuad(renderLayers, sprite, x, x + width, y, y + height, (u + 0.0F) / (float)textureWidth, (u + (float)regionWidth) / (float)textureWidth, (v + 0.0F) / (float)textureHeight, (v + (float)regionHeight) / (float)textureHeight, color); + public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWidth, int regionHeight, int textureWidth, int textureHeight, int color) { + this.drawTexturedQuad(sprite, x, x + width, y, y + height, (u + 0.0F) / (float)textureWidth, (u + (float)regionWidth) / (float)textureWidth, (v + 0.0F) / (float)textureHeight, (v + (float)regionHeight) / (float)textureHeight, color); } - private void drawTexturedQuad(Function renderLayers, Identifier sprite, int x1, int x2, int y1, int y2, float u1, float u2, float v1, float v2, int color) { + private void drawTexturedQuad(Identifier sprite, int x1, int x2, int y1, int y2, float u1, float u2, float v1, float v2, int color) { + x1 *= 4; + x2 *= 4; + y1 *= 4; + y2 *= 4; + + matrices.push(); + matrices.scale(0.25f, 0.25f, 1.0f); RenderSystem.setShaderTexture(0, sprite); RenderLayer renderLayer = (RenderLayer)renderLayers.apply(sprite); Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); @@ -245,5 +257,6 @@ public class RenderScope { vertexConsumer.vertex(matrix4f, (float)x1, (float)y2, 0.0F).texture(u1, v2).color(color); vertexConsumer.vertex(matrix4f, (float)x2, (float)y2, 0.0F).texture(u2, v2).color(color); vertexConsumer.vertex(matrix4f, (float)x2, (float)y1, 0.0F).texture(u2, v1).color(color); + matrices.pop(); } } diff --git a/src/main/java/org/saturnclient/ui2/SaturnScreen.java b/src/main/java/org/saturnclient/ui2/SaturnScreen.java index a115183..a025886 100644 --- a/src/main/java/org/saturnclient/ui2/SaturnScreen.java +++ b/src/main/java/org/saturnclient/ui2/SaturnScreen.java @@ -46,6 +46,7 @@ public class SaturnScreen extends Screen { renderScope.matrices.translate(element.x, element.y, 0); element.render(renderScope, new RenderContext(mouseX, mouseY, element)); renderScope.matrices.pop(); + renderScope.setRenderLayer(null); } renderScope.matrices.pop(); diff --git a/src/main/java/org/saturnclient/ui2/elements/ClickableTexture.java b/src/main/java/org/saturnclient/ui2/elements/ClickableTexture.java new file mode 100644 index 0000000..019792b --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/elements/ClickableTexture.java @@ -0,0 +1,42 @@ +package org.saturnclient.ui2.elements; + +import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.ThemeManager; +import org.saturnclient.ui2.Element; +import org.saturnclient.ui2.RenderContext; +import org.saturnclient.ui2.RenderScope; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.util.Identifier; + +public class ClickableTexture extends Element { + private static ThemeManager theme = new ThemeManager("ClickableTexture", "hovering"); + private static Property fgColor = theme.property("fg-color", new Property(0xFFFFFFFF)); + + Identifier sprite; + private Runnable onClick; + + public ClickableTexture(Identifier sprite, Runnable onClick) { + this.sprite = sprite; + this.onClick = onClick; + } + + @Override + public void render(RenderScope renderScope, RenderContext ctx) { + if (ctx.isHovering()) { + theme.setState("hovering"); + } else { + theme.setState(null); + } + + renderScope.setRenderLayer(RenderLayer::getGuiTextured); + renderScope.drawTexture(sprite, 0, 0, 0, 0, width, height, fgColor.value); + } + + @Override + public void click(int mouseX, int mouseY) { + if (onClick != null) { + onClick.run(); + } + } +} diff --git a/src/main/java/org/saturnclient/ui2/elements/ImageTexture.java b/src/main/java/org/saturnclient/ui2/elements/ImageTexture.java new file mode 100644 index 0000000..a9b815f --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/elements/ImageTexture.java @@ -0,0 +1,22 @@ +package org.saturnclient.ui2.elements; + +import org.saturnclient.ui2.Element; +import org.saturnclient.ui2.RenderContext; +import org.saturnclient.ui2.RenderScope; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.util.Identifier; + +public class ImageTexture extends Element { + Identifier sprite; + + public ImageTexture(Identifier sprite) { + this.sprite = sprite; + } + + @Override + public void render(RenderScope renderScope, RenderContext ctx) { + renderScope.setRenderLayer(RenderLayer::getGuiTextured); + renderScope.drawTexture(sprite, 0, 0, 0, 0, width, height); + } +} diff --git a/src/main/java/org/saturnclient/ui2/elements/Text.java b/src/main/java/org/saturnclient/ui2/elements/Text.java index 70e8d9d..b3c3a32 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Text.java +++ b/src/main/java/org/saturnclient/ui2/elements/Text.java @@ -1,10 +1,15 @@ package org.saturnclient.ui2.elements; +import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.ThemeManager; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.RenderContext; import org.saturnclient.ui2.RenderScope; public class Text extends Element { + private static ThemeManager theme = new ThemeManager("Text"); + private static Property fgColor = theme.property("fg-color", new Property(0xFFFFFFFF)); + private String text; public Text(String text) { @@ -13,6 +18,6 @@ public class Text extends Element { @Override public void render(RenderScope renderScope, RenderContext ctx) { - renderScope.drawText(this.text, this.x, this.y, false, 0xFFFFFFFF); + renderScope.drawText(this.text, this.x, this.y, false, fgColor.value); } } diff --git a/src/main/java/org/saturnclient/ui2/elements/TextureButton.java b/src/main/java/org/saturnclient/ui2/elements/TextureButton.java new file mode 100644 index 0000000..340fb97 --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/elements/TextureButton.java @@ -0,0 +1,59 @@ +package org.saturnclient.ui2.elements; + +import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.ThemeManager; +import org.saturnclient.ui2.Element; +import org.saturnclient.ui2.RenderContext; +import org.saturnclient.ui2.RenderScope; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.util.Identifier; + +public class TextureButton extends Element { + private static ThemeManager theme = new ThemeManager("TextureButton", "hovering"); + private static Property bgColor = theme.property("bg-color", new Property(0xFF000000)); + private static Property fgColor = theme.property("fg-color", new Property(0xFFFFFFFF)); + private static Property borderColor = theme.property("border-color", new Property(0xFFFFFFFF)); + private static Property border = theme.property("border", new Property(1)); + private static Property cornerRadius = theme.property("corner-radius", new Property(10)); + + + static { + theme.propertyStateDefault("hovering", "fg-color", 0xFFFF0000); + theme.propertyStateDefault("hovering", "border-color", 0xFFFF0000); + } + + Identifier sprite; + private Runnable onClick; + + public TextureButton(Identifier sprite, Runnable onClick) { + this.sprite = sprite; + this.onClick = onClick; + } + + @Override + public void render(RenderScope renderScope, RenderContext ctx) { + if (ctx.isHovering()) { + theme.setState("hovering"); + } else { + theme.setState(null); + } + + renderScope.drawRoundedRectangle(0, 0, width, height, cornerRadius.value, bgColor.value); + renderScope.drawRoundedBorder(width, height, border.value, cornerRadius.value, borderColor.value); + + renderScope.setRenderLayer(RenderLayer::getGuiTextured); + + int texWidth = width - 4; + int texHeight = height - 4; + + renderScope.drawTexture(sprite, 2, 2, 0, 0, texWidth, texHeight, fgColor.value); + } + + @Override + public void click(int mouseX, int mouseY) { + if (onClick != null) { + onClick.run(); + } + } +} diff --git a/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java b/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java index b8a631f..509e69d 100644 --- a/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java @@ -1,9 +1,15 @@ package org.saturnclient.ui2.screens; import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.saturnclient.menus.CloaksMenu; +import org.saturnclient.saturnclient.menus.HudEditor; import org.saturnclient.saturnclient.menus.ModMenu; +import org.saturnclient.ui.Textures; +import org.saturnclient.ui2.Element; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.elements.Button; +import org.saturnclient.ui2.elements.ImageTexture; +import org.saturnclient.ui2.elements.TextureButton; public class ShiftMenu extends SaturnScreen { public ShiftMenu() { @@ -12,8 +18,21 @@ public class ShiftMenu extends SaturnScreen { @Override public void ui() { - draw(new Button("Settings", () -> { + draw(new ImageTexture(Textures.LOGO).dimensions(49, 49).centerOffset(width, height, 0, -45)); + draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(49, 8).centerOffset(width, height, 0, -23)); + + Element button = new Button("Settings", () -> { SaturnClient.client.setScreen(new ModMenu()); - }).center(width, height)); + }).center(width, height); + + draw(button); + + draw(new TextureButton(Textures.COSMETICS, () -> { + client.setScreen(new CloaksMenu()); + }).dimensions(button.height, button.height).centerOffset(width, height, (button.width / 2) + (button.height / 2) + 4, 0)); + + draw(new TextureButton(Textures.HUD_ICON, () -> { + client.setScreen(new HudEditor()); + }).dimensions(button.height, button.height).centerOffset(width, height, -((button.width / 2) + (button.height / 2) + 4), 0)); } }