added animations

This commit is contained in:
2025-04-29 05:40:10 -05:00
parent 9849a38fe9
commit bf4e16d940
7 changed files with 78 additions and 41 deletions
@@ -1,14 +1,19 @@
package org.saturnclient.ui2; package org.saturnclient.ui2;
import java.util.function.Function;
import org.saturnclient.ui2.anim.Animation; import org.saturnclient.ui2.anim.Animation;
import org.saturnclient.ui2.anim.Curve;
public class Element { public class Element {
public int x; public int x;
public int y; public int y;
public int width; public int width;
public int height; public int height;
public float opacity = 1.0f;
public boolean focused; public boolean focused;
public Animation animation; public Animation animation;
public Function<Double, Double> curve = Curve::easeInOutCubic;
public void render(RenderScope renderScope, RenderContext ctx) { public void render(RenderScope renderScope, RenderContext ctx) {
} }
@@ -46,7 +51,12 @@ public class Element {
public final Element animation(Animation animation) { public final Element animation(Animation animation) {
this.animation = animation; this.animation = animation;
return this;
}
public final Element animation(Animation animation, Function<Double, Double> curve) {
this.animation = animation;
this.curve = curve;
return this; return this;
} }
} }
@@ -246,6 +246,7 @@ public class RenderScope {
x2 *= 4; x2 *= 4;
y1 *= 4; y1 *= 4;
y2 *= 4; y2 *= 4;
color = getColor(color);
matrices.push(); matrices.push();
matrices.scale(0.25f, 0.25f, 1.0f); matrices.scale(0.25f, 0.25f, 1.0f);
@@ -27,53 +27,46 @@ public class SaturnScreen extends Screen {
if (element.animation != null) { if (element.animation != null) {
element.animation.init(element); element.animation.init(element);
try {
Thread.sleep(25);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(() -> { new Thread(() -> {
Function<Double, Double> curveFunction = Curve::easeInOutCubicReverse;
int delay = (element.animation.duration / 20) - 15;
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
float lastProgress = 0.0f;
while (true) { Function<Double, Double> curveFunction = Curve::easeInOutCubic;
int elapsed = (int) (System.currentTimeMillis() - startTime); float progress = 0.0f;
double incremental = (1000 - element.animation.duration) / 10000.0;
float progress = Math.round(curveFunction.apply((double) elapsed / element.animation.duration) * 1000.0f) / 1000.0f; System.out.println("Starting animation...");
// System.out.printf("Increment per step: %.6f%n", incremental);
float p = lastProgress; for (int i = 0; i <= 100; i++) {
float newProgress = (float) (double) curveFunction.apply(i / 100.0);
while (progress != p) { while (Math.abs(newProgress - progress) > 1e-6) {
if (p < progress) { if (progress < newProgress) {
p += 0.01f; progress += incremental;
if (p > progress) p = progress; if (progress > newProgress) progress = newProgress;
} else if (p > progress) { } else {
p -= 0.01f; progress -= incremental;
if (p < progress) p = progress; if (progress < newProgress) progress = newProgress;
} }
element.animation.tick(p, element); element.animation.tick(progress, element);
try { try {
Thread.sleep(4); Thread.sleep(element.animation.duration / 100);
} catch (Exception e) {
e.printStackTrace();
}
}
if (elapsed > (element.animation.duration + 30)) {
break;
}
if (progress != lastProgress) {
lastProgress = p;
}
if (delay > 0) {
try {
Thread.sleep(delay);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
System.out.println("Animation complete. " + (System.currentTimeMillis() - startTime) + "MS");
}).start(); }).start();
} }
} }
@@ -96,6 +89,7 @@ public class SaturnScreen extends Screen {
renderScope.matrices.push(); renderScope.matrices.push();
for (Element element : elements) { for (Element element : elements) {
renderScope.setOpacity(element.opacity);
renderScope.matrices.push(); renderScope.matrices.push();
renderScope.matrices.translate(element.x, element.y, 0); renderScope.matrices.translate(element.x, element.y, 0);
element.render(renderScope, new RenderContext(mouseX, mouseY, element)); element.render(renderScope, new RenderContext(mouseX, mouseY, element));
@@ -1,6 +1,10 @@
package org.saturnclient.ui2.anim; package org.saturnclient.ui2.anim;
public class Curve { public class Curve {
public static double easeOutCubic(double x) {
return 1 - Math.pow(1 - x, 3);
}
public static double easeInOutCubic(double x) { public static double easeInOutCubic(double x) {
return (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); return (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2);
} }
@@ -8,4 +12,15 @@ public class Curve {
public static double easeInOutCubicReverse(double x) { public static double easeInOutCubicReverse(double x) {
return -(x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); return -(x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2);
} }
public static double easeInOutBack(double x) {
double c1 = 1.70158;
double c2 = c1 * 1.525;
if (x < 0.5) {
return (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2;
} else {
return (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (2 * x - 2) + c2) + 2) / 2;
}
}
} }
@@ -0,0 +1,20 @@
package org.saturnclient.ui2.anim;
import org.saturnclient.ui2.Element;
public class Fade extends Animation {
public Fade(int duration) {
super(duration);
}
@Override
public void tick(float progress, Element element) {
element.opacity = progress;
// element.opacity += 0.1f;
}
@Override
public void init(Element element) {
element.opacity = 0;
}
}
@@ -27,16 +27,12 @@ public class SlideY extends Animation {
@Override @Override
public void tick(float progress, Element element) { public void tick(float progress, Element element) {
if (progress > 0) { element.y = elementY + (int) (offset * progress);
element.y = elementY + Math.min(maxOffset, (int) (offset * progress));
} else {
element.y = elementY + Math.max(-offset, (int) (offset * progress));
}
} }
@Override @Override
public void init(Element element) { public void init(Element element) {
element.y += offset; element.y -= offset;
elementY = element.y; elementY = element.y;
} }
} }
@@ -10,6 +10,7 @@ import org.saturnclient.ui2.SaturnScreen;
import org.saturnclient.ui2.elements.Button; import org.saturnclient.ui2.elements.Button;
import org.saturnclient.ui2.elements.ImageTexture; import org.saturnclient.ui2.elements.ImageTexture;
import org.saturnclient.ui2.elements.TextureButton; import org.saturnclient.ui2.elements.TextureButton;
import org.saturnclient.ui2.anim.Fade;
import org.saturnclient.ui2.anim.SlideY; import org.saturnclient.ui2.anim.SlideY;
public class ShiftMenu extends SaturnScreen { public class ShiftMenu extends SaturnScreen {
@@ -19,8 +20,8 @@ public class ShiftMenu extends SaturnScreen {
@Override @Override
public void ui() { public void ui() {
draw(new ImageTexture(Textures.LOGO).dimensions(49, 49).centerOffset(width, height, 0, -45).animation(new SlideY(300))); draw(new ImageTexture(Textures.LOGO).dimensions(49, 49).centerOffset(width, height, 0, -40).animation(new SlideY(700, -20)));
draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(49, 8).centerOffset(width, height, 0, -23)); draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(49, 8).centerOffset(width, height, 0, -18).animation(new Fade(700)));
Element button = new Button("Settings", () -> { Element button = new Button("Settings", () -> {
SaturnClient.client.setScreen(new ModMenu()); SaturnClient.client.setScreen(new ModMenu());