slow and steady

- add create's panorama as a background for config ui when opened from the main menu
- fix panoramas moving at a inconsistent speed

- add a optional speed limit to physical floats
This commit is contained in:
zelophed 2021-07-11 21:09:23 +02:00
parent e3386c178a
commit 4306d076db
4 changed files with 61 additions and 15 deletions

View file

@ -8,6 +8,7 @@ import java.util.stream.Collectors;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.TriConsumer;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL30;
@ -15,12 +16,15 @@ import org.lwjgl.opengl.GL30;
import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.gl.versioned.GlCompat; import com.jozufozu.flywheel.backend.gl.versioned.GlCompat;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.StencilElement; import com.simibubi.create.foundation.gui.StencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.mainMenu.CreateMainMenuScreen;
import com.simibubi.create.foundation.utility.animation.Force; import com.simibubi.create.foundation.utility.animation.Force;
import com.simibubi.create.foundation.utility.animation.PhysicalFloat; import com.simibubi.create.foundation.utility.animation.PhysicalFloat;
@ -47,7 +51,8 @@ public abstract class ConfigScreen extends AbstractSimiScreen {
* *
* */ * */
public static final PhysicalFloat cogSpin = PhysicalFloat.create().withDrag(0.3).addForce(new Force.Static(.2f)); public static final Map<String, TriConsumer<Screen, MatrixStack, Float>> backgrounds = new HashMap<>();
public static final PhysicalFloat cogSpin = PhysicalFloat.create().withLimit(10f).withDrag(0.3).addForce(new Force.Static(.2f));
public static final BlockState cogwheelState = AllBlocks.LARGE_COGWHEEL.getDefaultState().with(CogWheelBlock.AXIS, Direction.Axis.Y); public static final BlockState cogwheelState = AllBlocks.LARGE_COGWHEEL.getDefaultState().with(CogWheelBlock.AXIS, Direction.Axis.Y);
public static final Map<String, Object> changes = new HashMap<>(); public static final Map<String, Object> changes = new HashMap<>();
public static String modID = null; public static String modID = null;
@ -71,9 +76,11 @@ public abstract class ConfigScreen extends AbstractSimiScreen {
@Override @Override
protected void renderWindowBackground(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderWindowBackground(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
if (this.client != null && this.client.world != null) { if (this.client != null && this.client.world != null) {
//in game
fill(ms, 0, 0, this.width, this.height, 0xb0_282c34); fill(ms, 0, 0, this.width, this.height, 0xb0_282c34);
} else { } else {
fill(ms, 0, 0, this.width, this.height, 0xff_282c34); //in menus
renderMenuBackground(ms, partialTicks);
} }
new StencilElement() { new StencilElement() {
@ -144,6 +151,30 @@ public abstract class ConfigScreen extends AbstractSimiScreen {
return s; return s;
} }
/**
* By default ConfigScreens will render the Create Panorama as
* their background when opened from the Main- or ModList-Menu.
* If your addon wants to render something else, please add to the
* backgrounds Map in this Class with your modID as the key.
*/
protected void renderMenuBackground(MatrixStack ms, float partialTicks) {
TriConsumer<Screen, MatrixStack, Float> customBackground = backgrounds.get(modID);
if (customBackground != null) {
customBackground.accept(this, ms, partialTicks);
return;
}
float elapsedPartials = client.getTickLength();
CreateMainMenuScreen.panorama.render(elapsedPartials, 1);
client.getTextureManager().bindTexture(CreateMainMenuScreen.PANORAMA_OVERLAY_TEXTURES);
RenderSystem.enableBlend();
RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
drawTexture(ms, 0, 0, this.width, this.height, 0.0F, 0.0F, 16, 128, 16, 128);
fill(ms, 0, 0, this.width, this.height, 0x90_282c34);
}
protected void renderCog(MatrixStack ms, float partialTicks) { protected void renderCog(MatrixStack ms, float partialTicks) {
ms.push(); ms.push();

View file

@ -30,13 +30,17 @@ public class EnumEntry extends ValueEntry<Enum<?>> {
height, width, Theme.p(Theme.Key.TEXT))); height, width, Theme.p(Theme.Key.TEXT)));
DelegatedStencilElement l = AllIcons.I_CONFIG_PREV.asStencil(); DelegatedStencilElement l = AllIcons.I_CONFIG_PREV.asStencil();
cycleLeft = new BoxWidget(0, 0, cycleWidth + 8, 16).showingElement(l) cycleLeft = new BoxWidget(0, 0, cycleWidth + 8, 16)
.withCallback(() -> cycleValue(-1)); .withCustomBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT))
.showingElement(l)
.withCallback(() -> cycleValue(-1));
l.withElementRenderer(BoxWidget.gradientFactory.apply(cycleLeft)); l.withElementRenderer(BoxWidget.gradientFactory.apply(cycleLeft));
DelegatedStencilElement r = AllIcons.I_CONFIG_NEXT.asStencil(); DelegatedStencilElement r = AllIcons.I_CONFIG_NEXT.asStencil();
cycleRight = new BoxWidget(0, 0, cycleWidth + 8, 16).showingElement(r) cycleRight = new BoxWidget(0, 0, cycleWidth + 8, 16)
.withCallback(() -> cycleValue(1)); .withCustomBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT))
.showingElement(r)
.withCallback(() -> cycleValue(1));
r.at(cycleWidth - 8, 0); r.at(cycleWidth - 8, 0);
r.withElementRenderer(BoxWidget.gradientFactory.apply(cycleRight)); r.withElementRenderer(BoxWidget.gradientFactory.apply(cycleRight));
@ -89,10 +93,10 @@ public class EnumEntry extends ValueEntry<Enum<?>> {
cycleRight.render(ms, mouseX, mouseY, partialTicks); cycleRight.render(ms, mouseX, mouseY, partialTicks);
new BoxElement() new BoxElement()
.withBackground(0) .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT))
.flatBorder(0) .flatBorder(0x01_000000)
.withBounds(10, 10) .withBounds(48, 6)
.at(cycleLeft.x + cycleWidth + 4, cycleLeft.y + 3) .at(cycleLeft.x + 22, cycleLeft.y + 5)
.render(ms); .render(ms);
} }

View file

@ -37,12 +37,12 @@ public class CreateMainMenuScreen extends AbstractSimiScreen {
protected final Screen parent; protected final Screen parent;
protected boolean returnOnClose; protected boolean returnOnClose;
private static final RenderSkyboxCube PANORAMA_RESOURCES = public static final RenderSkyboxCube PANORAMA_RESOURCES =
new RenderSkyboxCube(Create.asResource("textures/gui/title/background/panorama")); new RenderSkyboxCube(Create.asResource("textures/gui/title/background/panorama"));
private static final ResourceLocation PANORAMA_OVERLAY_TEXTURES = public static final ResourceLocation PANORAMA_OVERLAY_TEXTURES =
new ResourceLocation("textures/gui/title/background/panorama_overlay.png"); new ResourceLocation("textures/gui/title/background/panorama_overlay.png");
private RenderSkybox vanillaPanorama = new RenderSkybox(MainMenuScreen.PANORAMA_RESOURCES); private RenderSkybox vanillaPanorama = new RenderSkybox(MainMenuScreen.PANORAMA_RESOURCES);
private RenderSkybox panorama = new RenderSkybox(PANORAMA_RESOURCES); public static RenderSkybox panorama = new RenderSkybox(PANORAMA_RESOURCES);
private long firstRenderTime; private long firstRenderTime;
private Button gettingStarted; private Button gettingStarted;
@ -65,11 +65,12 @@ public class CreateMainMenuScreen extends AbstractSimiScreen {
protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
float f = (float) (Util.milliTime() - this.firstRenderTime) / 1000.0F; float f = (float) (Util.milliTime() - this.firstRenderTime) / 1000.0F;
float alpha = MathHelper.clamp(f, 0.0F, 1.0F); float alpha = MathHelper.clamp(f, 0.0F, 1.0F);
float elapsedPartials = client.getTickLength();
if (parent instanceof MainMenuScreen) { if (parent instanceof MainMenuScreen) {
if (alpha < 1) if (alpha < 1)
vanillaPanorama.render(partialTicks, 1); vanillaPanorama.render(elapsedPartials, 1);
panorama.render(partialTicks, alpha); panorama.render(elapsedPartials, alpha);
client.getTextureManager() client.getTextureManager()
.bindTexture(PANORAMA_OVERLAY_TEXTURES); .bindTexture(PANORAMA_OVERLAY_TEXTURES);

View file

@ -11,6 +11,7 @@ public class PhysicalFloat {
float previousSpeed; float previousSpeed;
float speed; float speed;
float limit = Float.NaN;
float mass; float mass;
@ -41,6 +42,11 @@ public class PhysicalFloat {
return addForce(new Force.Zeroing((float) g)); return addForce(new Force.Zeroing((float) g));
} }
public PhysicalFloat withLimit(float limit) {
this.limit = limit;
return this;
}
public void tick() { public void tick() {
previousSpeed = speed; previousSpeed = speed;
previousValue = value; previousValue = value;
@ -53,6 +59,10 @@ public class PhysicalFloat {
forces.removeIf(Force::finished); forces.removeIf(Force::finished);
if (Float.isFinite(limit)) {
speed = MathHelper.clamp(speed, -limit, limit);
}
value += speed; value += speed;
} }