Fix splashoverlay and saturnmodule

This commit is contained in:
2026-02-21 20:59:07 +01:00
parent 6ee2fc3b0e
commit 4403a31c93
3 changed files with 121 additions and 42 deletions
@@ -60,18 +60,29 @@ public class Theme {
} }
/** /**
* Sets alpha using 0–255 range. * Multiplies existing alpha with 0–255 alpha.
*/ */
public static int withAlpha(int alpha, int color) { public static int withAlpha(int alpha, int color) {
alpha = Math.max(0, Math.min(255, alpha)); alpha = Math.max(0, Math.min(255, alpha));
return (color & 0x00FFFFFF) | (alpha << 24);
int originalAlpha = (color >>> 24) & 0xFF;
// Merge (multiply) alphas
int merged = (originalAlpha * alpha) / 255;
return (color & 0x00FFFFFF) | (merged << 24);
} }
/** /**
* Sets alpha using 0.0–1.0 range. * Multiplies existing alpha with 0.0–1.0 alpha.
*/ */
public static int withAlpha(float alpha, int color) { public static int withAlpha(float alpha, int color) {
alpha = Math.max(0f, Math.min(1f, alpha)); alpha = Math.max(0f, Math.min(1f, alpha));
return withAlpha((int) (alpha * 255f), color);
int originalAlpha = (color >>> 24) & 0xFF;
int merged = (int) (originalAlpha * alpha);
return (color & 0x00FFFFFF) | (merged << 24);
} }
} }
@@ -78,16 +78,16 @@ public abstract class SplashOverlayMixin {
renderCurrentScreen(context, mouseX, mouseY, delta); renderCurrentScreen(context, mouseX, mouseY, delta);
int overlayAlpha = computeOverlayAlpha(fadeOutProgress - 1f); int overlayAlpha = computeOverlayAlpha(fadeOutProgress - 1f);
scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight, scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight,
Theme.withAlpha(0xFFFFFFFF, overlayAlpha)); Theme.withAlpha(overlayAlpha, 0xFFFFFFFF));
} else if (reloading) { } else if (reloading) {
if (reloadProgress < 1.0F) { if (reloadProgress < 1.0F) {
renderCurrentScreen(context, mouseX, mouseY, delta); renderCurrentScreen(context, mouseX, mouseY, delta);
} }
scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight, scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight,
Theme.withAlpha(0xFFFFFFFF, alpha)); Theme.withAlpha(alpha, 0xFFFFFFFF));
} else { } else {
scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight, scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight,
Theme.withAlpha(0xFFFFFFFF, alpha)); Theme.withAlpha(alpha, 0xFFFFFFFF));
} }
float u = this.reload.getProgress(); float u = this.reload.getProgress();
@@ -115,19 +115,19 @@ public abstract class SplashOverlayMixin {
/** Draw the main logo centered */ /** Draw the main logo centered */
private void drawLogo(RenderScope scope, int screenWidth, int screenHeight, int alpha) { private void drawLogo(RenderScope scope, int screenWidth, int screenHeight, int alpha) {
scope.drawTexture(Textures.LOGO, (screenWidth - 60) / 2, ((screenHeight - 60) / 2) - 20, 0, 0, 60, 60, scope.drawTexture(Textures.LOGO, (screenWidth - 60) / 2, ((screenHeight - 60) / 2) - 20, 0, 0, 60, 60,
Theme.withAlpha(0xFFFFFFFF, alpha)); Theme.withAlpha(alpha, 0xFFFFFFFF));
} }
private void renderProgressBar(RenderScope scope, DrawContext context, int screenWidth, int screenHeight, private void renderProgressBar(RenderScope scope, DrawContext context, int screenWidth, int screenHeight,
int alpha) { int alpha) {
int progressY = ((screenHeight - 5) / 2) + 25; int progressY = ((screenHeight - 5) / 2) + 25;
context.drawBorder((screenWidth - 120) / 2, progressY, 120, 5, Theme.withAlpha(0xFFFFFFFF, alpha)); context.drawBorder((screenWidth - 120) / 2, progressY, 120, 5, Theme.withAlpha(alpha, 0xFFFFFFFF));
int progressWidth = Math.min((int) (progress * 120), 120); int progressWidth = Math.min((int) (progress * 120), 120);
int progressX = (screenWidth - 120) / 2; int progressX = (screenWidth - 120) / 2;
context.fill(progressX, progressY, progressX + progressWidth, progressY + 5, context.fill(progressX, progressY, progressX + progressWidth, progressY + 5,
Theme.withAlpha(0xFFFFFFFF, alpha)); Theme.withAlpha(alpha, 0xFFFFFFFF));
} }
/** Compute overlay alpha from fade progress */ /** Compute overlay alpha from fade progress */
@@ -14,14 +14,8 @@ import org.saturnclient.ui2.screens.ConfigEditor;
import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.RenderLayer;
public class SaturnModule extends Element { public class SaturnModule extends Element {
// TODO make these states
// static {
// theme.propertyStateDefault("enabled", "bg", 0xFF1d202d);
// theme.propertyStateDefault("enabled", "icon-bg", 0xFF845eee);
// theme.propertyStateDefault("hovering", "fg", 0xFF845eee);
// }
private Module mod; private final Module mod;
public SaturnModule(Module mod) { public SaturnModule(Module mod) {
this.mod = mod; this.mod = mod;
@@ -31,44 +25,111 @@ public class SaturnModule extends Element {
@Override @Override
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
int p = 10; int p = 10; // padding
int s = 14; int s = 14; // settings icon size
boolean settingsHover = false;
boolean hovered = ctx.isHovering();
boolean enabled = mod.isEnabled();
boolean settingsHover = Utils.isHovering(
ctx.mouseX - (width - s - p - 5),
ctx.mouseY - (height - s - p - 5),
s + 10,
s + 10,
1.0f);
renderScope.setRenderLayer(RenderLayer::getGuiTextured); renderScope.setRenderLayer(RenderLayer::getGuiTextured);
// TODO use this // Resolve theme colors
if (mod.isEnabled()) { int bgColor = Theme.PRIMARY.value;
} int fgColor = hovered && !settingsHover ? Theme.ACCENT.value : Theme.PRIMARY_FG.value;
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, Theme.PRIMARY.value); int iconBg = enabled ? Theme.ACCENT.value : Theme.PRIMARY.value;
int iconFg = enabled ? Theme.ACCENT_FG.value : fgColor;
int settingsColor = settingsHover
? Theme.ACCENT.value
: Theme.withAlpha(160, fgColor);
int h = height - (p * 2); int h = height - (p * 2);
renderScope.drawRoundedRectangle(p, p, h, h, Theme.WIDGET_RADIUS.value, Theme.PRIMARY.value); // Main background
renderScope.drawRoundedRectangle(
0, 0,
width, height,
Theme.WIDGET_RADIUS.value,
bgColor);
renderScope.drawTexture(mod.getIconTexture(), p + (p / 2), p + (p / 2), 0, 0, h - p, h - p, // Icon background
Theme.PRIMARY_FG.value); renderScope.drawRoundedRectangle(
p, p,
h, h,
Theme.WIDGET_RADIUS.value,
iconBg);
renderScope.drawText(0.6f, mod.getName(), p + h + 4, p + 1, Theme.FONT.value, Theme.PRIMARY_FG.value); // Icon
renderScope.drawTexture(
mod.getIconTexture(),
p + (p / 2),
p + (p / 2),
0, 0,
h - p,
h - p,
iconFg);
renderScope.drawText(0.35f, mod.getVersion(), // Module name
width - p - (int) (Fonts.getWidth(mod.getVersion(), Theme.FONT.value) * 0.35f), p + 1, Theme.FONT.value, renderScope.drawText(
Theme.PRIMARY_FG.value); 0.6f,
mod.getName(),
p + h + 4,
p + 1,
Theme.FONT.value,
fgColor);
// Version (right aligned)
String version = mod.getVersion();
int versionWidth = (int) (Fonts.getWidth(version, Theme.FONT.value) * 0.35f);
renderScope.drawText(
0.35f,
version,
width - p - versionWidth,
p + 1,
Theme.FONT.value,
fgColor);
// Tags
int xt = p + h + 4; int xt = p + h + 4;
for (String tag : mod.getTags()) { for (String tag : mod.getTags()) {
int xtb = (int) (Fonts.getWidth(tag, Theme.FONT.value) * 0.4f); int tagWidth = (int) (Fonts.getWidth(tag, Theme.FONT.value) * 0.4f);
renderScope.drawRoundedRectangle(xt, p + (h / 2), xtb + 6, 12, 5, Theme.ACCENT.value);
renderScope.drawText(0.4f, tag, xt + 2, p + (h / 2) + 3, Theme.FONT.value, Theme.ACCENT_FG.value); renderScope.drawRoundedRectangle(
xt += xtb + 9; xt,
p + (h / 2),
tagWidth + 6,
12,
5,
Theme.ACCENT.value);
renderScope.drawText(
0.4f,
tag,
xt + 2,
p + (h / 2) + 3,
Theme.FONT.value,
Theme.ACCENT_FG.value);
xt += tagWidth + 9;
} }
// TODO // Settings icon
if (settingsHover) { renderScope.drawTexture(
} Textures.SETTINGS,
width - s - p,
renderScope.drawTexture(Textures.SETTINGS, width - s - p, height - s - p, 0, 0, s, s, Theme.PRIMARY_FG.value); height - s - p,
0, 0,
s, s,
settingsColor);
} }
@Override @Override
@@ -76,7 +137,14 @@ public class SaturnModule extends Element {
int p = 10; int p = 10;
int s = 14; int s = 14;
if (Utils.isHovering(mouseX - (width - s - p - 5), mouseY - (height - s - p - 5), s + 10, s + 10, 1.0f)) { boolean settingsHover = Utils.isHovering(
mouseX - (width - s - p - 5),
mouseY - (height - s - p - 5),
s + 10,
s + 10,
1.0f);
if (settingsHover) {
SaturnClient.client.setScreen(new ConfigEditor(mod.getConfig())); SaturnClient.client.setScreen(new ConfigEditor(mod.getConfig()));
} else { } else {
mod.setEnabled(!mod.isEnabled()); mod.setEnabled(!mod.isEnabled());