Saturn Screen implementation
This commit is contained in:
@@ -0,0 +1,110 @@
|
|||||||
|
package org.saturnclient.ui;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public abstract class SaturnScreen {
|
||||||
|
public static interface ScreenProvider {
|
||||||
|
public void close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// General
|
||||||
|
public int width;
|
||||||
|
public int height;
|
||||||
|
public String title;
|
||||||
|
|
||||||
|
// Saturn Screen
|
||||||
|
public List<Element> elements = new ArrayList<>();
|
||||||
|
public float backgroundOpacity = 1.0f;
|
||||||
|
protected Instant start = null;
|
||||||
|
public int backgroundBlur = 10;
|
||||||
|
|
||||||
|
// Provider
|
||||||
|
public ScreenProvider provider;
|
||||||
|
|
||||||
|
public SaturnScreen() {
|
||||||
|
provider.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void init() {
|
||||||
|
elements.clear();
|
||||||
|
width *= 2;
|
||||||
|
height *= 2;
|
||||||
|
ui(); // abstraction to render the saturn ui and also render extra stuff here
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void ui();
|
||||||
|
|
||||||
|
public void draw(Element element) {
|
||||||
|
ElementRenderer.INSTANCE.draw(elements, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------
|
||||||
|
// Rendering
|
||||||
|
// --------------
|
||||||
|
|
||||||
|
public void render(RenderScope renderScope, int mouseX, int mouseY, float delta, long elapsed) {
|
||||||
|
renderScope.getMatrixStack().push();
|
||||||
|
|
||||||
|
renderScope.getMatrixStack().scale(0.5f, 0.5f, 0.5f);
|
||||||
|
|
||||||
|
ElementRenderer.INSTANCE.render(new ArrayList<>(elements), elapsed, renderScope, mouseX, mouseY);
|
||||||
|
|
||||||
|
renderScope.getMatrixStack().pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------
|
||||||
|
// Events
|
||||||
|
// --------------
|
||||||
|
|
||||||
|
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
||||||
|
mouseX *= 2;
|
||||||
|
mouseY *= 2;
|
||||||
|
|
||||||
|
ElementRenderer.INSTANCE.mouseClicked(elements, mouseX, mouseY, button);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
|
||||||
|
mouseX *= 2;
|
||||||
|
mouseY *= 2;
|
||||||
|
|
||||||
|
ElementRenderer.INSTANCE.mouseDragged(elements, mouseX, mouseY, button, deltaX, deltaY);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean mouseReleased(double mouseX, double mouseY, int button) {
|
||||||
|
mouseX *= 2;
|
||||||
|
mouseY *= 2;
|
||||||
|
|
||||||
|
ElementRenderer.INSTANCE.mouseReleased(elements, mouseX, mouseY, button);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean mouseScrolled(
|
||||||
|
double mouseX,
|
||||||
|
double mouseY,
|
||||||
|
double horizontalAmount,
|
||||||
|
double verticalAmount) {
|
||||||
|
mouseX *= 2;
|
||||||
|
mouseY *= 2;
|
||||||
|
|
||||||
|
ElementRenderer.INSTANCE.mouseScrolled(elements, mouseX, mouseY, horizontalAmount, verticalAmount);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resize(int width, int height) {
|
||||||
|
elements.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
||||||
|
ElementRenderer.INSTANCE.keyPressed(elements, keyCode, scanCode, modifiers);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,10 +2,9 @@ package org.saturnclient.ui;
|
|||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.saturnclient.saturnclient.mixin.DrawContextAccessor;
|
import org.saturnclient.saturnclient.mixin.DrawContextAccessor;
|
||||||
|
import org.saturnclient.ui.SaturnScreen.ScreenProvider;
|
||||||
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gl.PostEffectProcessor;
|
import net.minecraft.client.gl.PostEffectProcessor;
|
||||||
@@ -20,13 +19,7 @@ import net.minecraft.client.util.Pool;
|
|||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
public abstract class SaturnScreenFabric extends Screen {
|
public abstract class SaturnScreenFabric extends Screen implements ScreenProvider {
|
||||||
private final Pool pool = new Pool(3);
|
|
||||||
protected List<Element> elements = new ArrayList<>();
|
|
||||||
protected float backgroundOpacity = 1.0f;
|
|
||||||
protected Instant start = null;
|
|
||||||
public int backgroundBlur = 10;
|
|
||||||
|
|
||||||
protected static final Identifier PANORAMA = Identifier.of("saturnclient",
|
protected static final Identifier PANORAMA = Identifier.of("saturnclient",
|
||||||
"textures/gui/title/background/panorama");
|
"textures/gui/title/background/panorama");
|
||||||
protected static final CubeMapRenderer PANORAMA_RENDERER = new CubeMapRenderer(PANORAMA);
|
protected static final CubeMapRenderer PANORAMA_RENDERER = new CubeMapRenderer(PANORAMA);
|
||||||
@@ -37,6 +30,9 @@ public abstract class SaturnScreenFabric extends Screen {
|
|||||||
ROTATING_PANORAMA_RENDERER = new RotatingCubeMapRenderer(PANORAMA_RENDERER);
|
ROTATING_PANORAMA_RENDERER = new RotatingCubeMapRenderer(PANORAMA_RENDERER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final Pool pool = new Pool(3);
|
||||||
|
private final SaturnScreen screen;
|
||||||
|
|
||||||
public static void preload(MinecraftClient client) {
|
public static void preload(MinecraftClient client) {
|
||||||
TextureManager textureManager = client.getTextureManager();
|
TextureManager textureManager = client.getTextureManager();
|
||||||
|
|
||||||
@@ -49,37 +45,30 @@ public abstract class SaturnScreenFabric extends Screen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SaturnScreenFabric(String title) {
|
public SaturnScreenFabric(SaturnScreen screen) {
|
||||||
super(Text.literal(title));
|
super(Text.literal(screen.title));
|
||||||
}
|
screen.provider = this;
|
||||||
|
this.screen = screen;
|
||||||
public void draw(Element element) {
|
|
||||||
ElementRenderer.INSTANCE.draw(elements, element);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void init() {
|
protected void init() {
|
||||||
elements.clear();
|
screen.init();
|
||||||
width *= 2;
|
|
||||||
height *= 2;
|
|
||||||
ui(); // abstraction to render the saturn ui and also render extra stuff here
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void ui();
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
@Override
|
@Override
|
||||||
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
||||||
if (start == null) {
|
if (screen.start == null) {
|
||||||
start = Instant.now();
|
screen.start = Instant.now();
|
||||||
}
|
}
|
||||||
long elapsed = Duration.between(start, Instant.now()).toMillis();
|
long elapsed = Duration.between(screen.start, Instant.now()).toMillis();
|
||||||
|
|
||||||
mouseX *= 2;
|
mouseX *= 2;
|
||||||
mouseY *= 2;
|
mouseY *= 2;
|
||||||
|
|
||||||
if (client.world == null && client.getCurrentServerEntry() == null) {
|
if (client.world == null && client.getCurrentServerEntry() == null) {
|
||||||
ROTATING_PANORAMA_RENDERER.render(context, this.width, this.height, backgroundOpacity, delta);
|
ROTATING_PANORAMA_RENDERER.render(context, this.width, this.height, screen.backgroundOpacity, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
PostEffectProcessor postEffectProcessor = this.client.getShaderLoader().loadPostEffect(
|
PostEffectProcessor postEffectProcessor = this.client.getShaderLoader().loadPostEffect(
|
||||||
@@ -87,7 +76,7 @@ public abstract class SaturnScreenFabric extends Screen {
|
|||||||
DefaultFramebufferSet.MAIN_ONLY);
|
DefaultFramebufferSet.MAIN_ONLY);
|
||||||
|
|
||||||
if (postEffectProcessor != null) {
|
if (postEffectProcessor != null) {
|
||||||
postEffectProcessor.setUniforms("Radius", backgroundBlur * Math.min((float) elapsed / 700, 1.0f));
|
postEffectProcessor.setUniforms("Radius", screen.backgroundBlur * Math.min((float) elapsed / 700, 1.0f));
|
||||||
postEffectProcessor.render(this.client.getFramebuffer(), this.pool);
|
postEffectProcessor.render(this.client.getFramebuffer(), this.pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,43 +85,22 @@ public abstract class SaturnScreenFabric extends Screen {
|
|||||||
RenderScope renderScope = new RenderScopeImpl(context.getMatrices(),
|
RenderScope renderScope = new RenderScopeImpl(context.getMatrices(),
|
||||||
((DrawContextAccessor) context).getVertexConsumers());
|
((DrawContextAccessor) context).getVertexConsumers());
|
||||||
|
|
||||||
renderScope.getMatrixStack().push();
|
screen.render(renderScope, mouseX, mouseY, delta, elapsed);
|
||||||
|
|
||||||
renderScope.getMatrixStack().scale(0.5f, 0.5f, 0.5f);
|
|
||||||
|
|
||||||
ElementRenderer.INSTANCE.render(new ArrayList<>(elements), elapsed, renderScope, mouseX, mouseY);
|
|
||||||
|
|
||||||
renderScope.getMatrixStack().pop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
||||||
mouseX *= 2;
|
return screen.mouseClicked(mouseX, mouseY, button);
|
||||||
mouseY *= 2;
|
|
||||||
|
|
||||||
ElementRenderer.INSTANCE.mouseClicked(elements, mouseX, mouseY, button);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
|
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
|
||||||
mouseX *= 2;
|
return screen.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
|
||||||
mouseY *= 2;
|
|
||||||
|
|
||||||
ElementRenderer.INSTANCE.mouseDragged(elements, mouseX, mouseY, button, deltaX, deltaY);
|
|
||||||
|
|
||||||
return super.mouseReleased(mouseX, mouseY, button);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean mouseReleased(double mouseX, double mouseY, int button) {
|
public boolean mouseReleased(double mouseX, double mouseY, int button) {
|
||||||
mouseX *= 2;
|
return screen.mouseReleased(mouseX, mouseY, button);
|
||||||
mouseY *= 2;
|
|
||||||
|
|
||||||
ElementRenderer.INSTANCE.mouseReleased(elements, mouseX, mouseY, button);
|
|
||||||
|
|
||||||
return super.mouseReleased(mouseX, mouseY, button);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -141,28 +109,25 @@ public abstract class SaturnScreenFabric extends Screen {
|
|||||||
double mouseY,
|
double mouseY,
|
||||||
double horizontalAmount,
|
double horizontalAmount,
|
||||||
double verticalAmount) {
|
double verticalAmount) {
|
||||||
mouseX *= 2;
|
return screen.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount);
|
||||||
mouseY *= 2;
|
|
||||||
|
|
||||||
ElementRenderer.INSTANCE.mouseScrolled(elements, mouseX, mouseY, horizontalAmount, verticalAmount);
|
|
||||||
|
|
||||||
return super.mouseScrolled(
|
|
||||||
mouseX,
|
|
||||||
mouseY,
|
|
||||||
horizontalAmount,
|
|
||||||
verticalAmount);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void resize(MinecraftClient client, int width, int height) {
|
|
||||||
elements.clear();
|
|
||||||
super.resize(client, width, height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
||||||
ElementRenderer.INSTANCE.keyPressed(elements, keyCode, scanCode, modifiers);
|
return screen.keyPressed(keyCode, scanCode, modifiers);
|
||||||
|
}
|
||||||
|
|
||||||
return super.keyPressed(keyCode, scanCode, modifiers);
|
@Override
|
||||||
|
public void resize(MinecraftClient client, int width, int height) {
|
||||||
|
screen.resize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------
|
||||||
|
// ScreenProvider implementations
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
super.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user