fancy text

This commit is contained in:
zelophed 2021-04-07 02:17:55 +02:00
parent d4994ddc8b
commit 7ad0575618
15 changed files with 408 additions and 9 deletions

View file

@ -110,6 +110,7 @@ public class CreateClient {
PonderIndex.registerTags();
UIRenderHelper.init();
UIRenderHelper.enableStencil();
IResourceManager resourceManager = Minecraft.getInstance()
.getResourceManager();

View file

@ -29,7 +29,7 @@ import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperR
import com.simibubi.create.content.logistics.block.depot.EjectorTargetHandler;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPointHandler;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.ui.ConfigScreen;
import com.simibubi.create.foundation.config.ui.BaseConfigScreen;
import com.simibubi.create.foundation.item.ItemDescription;
import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.networking.AllPackets;
@ -312,7 +312,7 @@ public class ClientEvents {
public static void loadCompleted(FMLLoadCompleteEvent event) {
ModContainer createContainer = ModList.get().getModContainerById("create").orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted"));
createContainer.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (mc, previousScreen) -> new ConfigScreen(previousScreen));
createContainer.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (mc, previousScreen) -> new BaseConfigScreen(previousScreen));
}
}

View file

@ -3,7 +3,7 @@ package com.simibubi.create.foundation.command;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.ui.ConfigScreen;
import com.simibubi.create.foundation.config.ui.BaseConfigScreen;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import com.simibubi.create.foundation.ponder.PonderRegistry;
@ -93,7 +93,7 @@ public class ConfigureConfigPacket extends SimplePacketBase {
@OnlyIn(Dist.CLIENT)
private static void configScreen(String value) {
ScreenOpener.open(new ConfigScreen(null));
ScreenOpener.open(new BaseConfigScreen(null));
}
@OnlyIn(Dist.CLIENT)

View file

@ -0,0 +1,62 @@
package com.simibubi.create.foundation.config.ui;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.gui.CombinedStencilElement;
import com.simibubi.create.foundation.gui.StencilElement;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.widgets.StencilWidget;
public class BaseConfigScreen extends ConfigScreen {
StencilWidget clientConfigWidget;
StencilWidget commonConfigWidget;
StencilWidget serverConfigWidget;
public BaseConfigScreen(Screen parent) {
super(parent);
}
@Override
protected void init() {
widgets.clear();
super.init();
StencilElement text = new TextStencilElement.Centered(client.fontRenderer, new StringTextComponent("CLIENT CONFIG").formatted(TextFormatting.BOLD), 200).at(0, 11, 0);
widgets.add(clientConfigWidget = ConfigButton.createFromTextElement(
width/2 - 100,
height/2 - 15 - 50,
200,
30,
text
));
StencilElement text2 = new TextStencilElement.Centered(client.fontRenderer, new StringTextComponent("COMMON CONFIG").formatted(TextFormatting.BOLD), 200).at(0, 11, 0);
widgets.add(commonConfigWidget = ConfigButton.createFromTextElement(
width/2 - 100,
height/2 - 15,
200,
30,
text2
));
StencilElement text3 = new TextStencilElement.Centered(client.fontRenderer, new StringTextComponent("SERVER CONFIG").formatted(TextFormatting.BOLD), 200).at(0, 11, 0);
widgets.add(serverConfigWidget = ConfigButton.createFromTextElement(
width/2 - 100,
height/2 - 15 + 50,
200,
30,
text3
));
}
@Override
protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
super.renderWindow(ms, mouseX, mouseY, partialTicks);
}
}

View file

@ -0,0 +1,56 @@
package com.simibubi.create.foundation.config.ui;
import net.minecraft.client.gui.AbstractGui;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.util.text.StringTextComponent;
import javax.annotation.Nonnull;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.gui.CombinedStencilElement;
import com.simibubi.create.foundation.gui.StencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.widgets.StencilWidget;
public class ConfigButton extends StencilWidget {
protected int gradientColor1 = 0xff_c0c0ff, gradientColor2 = 0xff_7b7ba3;
public static ConfigButton createFromTextElement(int x, int y, int width, int height, StencilElement text) {
ConfigButton button = new ConfigButton(x, y, width, height);
StencilElement box = new StencilElement() {
@Override
protected void renderStencil(MatrixStack ms) {
fill(ms, 0, 0 , width, 0 + 1, 0xff_000000);
fill(ms, 0, height, width +1, height + 1, 0xff_000000);
fill(ms, 0 , 0, 0 + 1, height, 0xff_000000);
fill(ms, width, 0, width + 1, height, 0xff_000000);
}
@Override
protected void renderElement(MatrixStack ms) {
UIRenderHelper.angledGradient(ms, 0, 0, 15, 32, 201, button.gradientColor1, button.gradientColor2);
}
};
button.stencilElement = CombinedStencilElement.of(box, text);
return button;
}
protected ConfigButton(int x, int y, int width, int height) {
super(x, y, width, height);
}
public ConfigButton(int x, int y, int width, int height, StencilElement stencilElement) {
super(x, y, width, height, stencilElement);
}
@Override
public void renderButton(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
RenderSystem.enableBlend();
RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE);
fill(ms, x, y, x + width, y + height, 0x30_ffffff);
RenderSystem.defaultBlendFunc();
super.renderButton(ms, mouseX, mouseY, partialTicks);
}
}

View file

@ -11,6 +11,8 @@ import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.StencilElement;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.ponder.NavigatableSimiScreen;
import com.simibubi.create.foundation.utility.animation.Force;
@ -22,6 +24,8 @@ public class ConfigScreen extends NavigatableSimiScreen {
protected static final PhysicalFloat cogSpin = PhysicalFloat.create().withDrag(0.3).addForce(new Force.Static(.2f));
protected static final BlockState cogwheelState = AllBlocks.LARGE_COGWHEEL.getDefaultState().with(CogWheelBlock.AXIS, Direction.Axis.Y);
protected StencilElement testStencil;
public ConfigScreen(Screen parent) {
this.parent = parent;
}
@ -35,7 +39,7 @@ public class ConfigScreen extends NavigatableSimiScreen {
@Override
protected void init() {
super.init();
testStencil = new TextStencilElement(client.fontRenderer, "POGGERS").at(width*0.5f, height*0.5f, 0);
}
@Override
@ -78,6 +82,8 @@ public class ConfigScreen extends NavigatableSimiScreen {
this.drawHorizontalLine(ms, x-25, x+25, y, 0xff_807060);
this.drawVerticalLine(ms, x, y-25, y+25, 0xff_90a0b0);
//this.testStencil.render(ms);
//UIRenderHelper.streak(ms, 0, mouseX, mouseY, 16, 50, 0xaa_1e1e1e);
}

View file

@ -0,0 +1,58 @@
package com.simibubi.create.foundation.gui;
import javax.annotation.Nonnull;
import com.mojang.blaze3d.matrix.MatrixStack;
public class CombinedStencilElement extends StencilElement {
private StencilElement element1;
private StencilElement element2;
private ElementMode mode;
private CombinedStencilElement() {}
public static CombinedStencilElement of(@Nonnull StencilElement element1, @Nonnull StencilElement element2) {
return of(element1, element2, ElementMode.FIRST);
}
public static CombinedStencilElement of(@Nonnull StencilElement element1, @Nonnull StencilElement element2, ElementMode mode) {
CombinedStencilElement e = new CombinedStencilElement();
e.element1 = element1;
e.element2 = element2;
e.mode = mode;
return e;
}
@Override
protected void renderStencil(MatrixStack ms) {
ms.push();
element1.transform(ms);
element1.renderStencil(ms);
ms.pop();
ms.push();
element2.transform(ms);
element2.renderStencil(ms);
ms.pop();
}
@Override
protected void renderElement(MatrixStack ms) {
if (mode.rendersFirst())
element1.renderElement(ms);
if (mode.rendersSecond())
element2.renderElement(ms);
}
public enum ElementMode {
FIRST, SECOND, BOTH;
boolean rendersFirst() {
return this == FIRST || this == BOTH;
}
boolean rendersSecond() {
return this == SECOND || this == BOTH;
}
}
}

View file

@ -0,0 +1,55 @@
package com.simibubi.create.foundation.gui;
import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
public abstract class StencilElement {
float x, y , z;
public StencilElement at(float x, float y, float z) {
this.x = x;
this.y = y;
this.z = z;
return this;
}
public void render(MatrixStack ms) {
ms.push();
transform(ms);
prepareStencil(ms);
renderStencil(ms);
prepareElement(ms);
renderElement(ms);
cleanUp(ms);
ms.pop();
}
protected abstract void renderStencil(MatrixStack ms);
protected abstract void renderElement(MatrixStack ms);
protected void transform(MatrixStack ms) {
ms.translate(x, y, z);
}
protected void prepareStencil(MatrixStack ms) {
GL11.glEnable(GL11.GL_STENCIL_TEST);
RenderSystem.clearStencil(0);
RenderSystem.stencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
RenderSystem.stencilMask(0xFF);
RenderSystem.stencilFunc(GL11.GL_ALWAYS, 1, 0xFF);
}
protected void prepareElement(MatrixStack ms) {
GL11.glEnable(GL11.GL_STENCIL_TEST);
RenderSystem.stencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
RenderSystem.stencilFunc(GL11.GL_EQUAL, 1, 0xFF);
}
protected void cleanUp(MatrixStack ms) {
GL11.glDisable(GL11.GL_STENCIL_TEST);
}
}

View file

@ -0,0 +1,87 @@
package com.simibubi.create.foundation.gui;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.util.text.IFormattableTextComponent;
import net.minecraft.util.text.StringTextComponent;
import com.mojang.blaze3d.matrix.MatrixStack;
public class TextStencilElement extends StencilElement {
protected static final ElementRenderer DEFAULT_RENDERER = ((ms, width, _height) -> UIRenderHelper.angledGradient(ms, 15, -3, 5, 14, width+6, 0xff_10dd10, 0x1010dd));
protected FontRenderer font;
protected IFormattableTextComponent component;
protected ElementRenderer elementRenderer = DEFAULT_RENDERER;
public TextStencilElement(FontRenderer font) {
super();
this.font = font;
}
public TextStencilElement(FontRenderer font, String text) {
this(font);
component = new StringTextComponent(text);
}
public TextStencilElement(FontRenderer font, IFormattableTextComponent component) {
this(font);
this.component = component;
}
public TextStencilElement withElementRenderer(ElementRenderer renderer) {
elementRenderer = renderer;
return this;
}
public TextStencilElement withText(String text) {
component = new StringTextComponent(text);
return this;
}
public TextStencilElement withText(IFormattableTextComponent component) {
this.component = component;
return this;
}
@Override
protected void renderStencil(MatrixStack ms) {
font.draw(ms, component, 0, 0, 0xff_000000);
}
@Override
protected void renderElement(MatrixStack ms) {
elementRenderer.render(ms, font.getWidth(component), 10);
}
@FunctionalInterface
public interface ElementRenderer {
void render(MatrixStack ms, int width, int height);
}
public static class Centered extends TextStencilElement {
int width;
public Centered(FontRenderer font, String text, int width) {
super(font, text);
this.width = width;
}
public Centered(FontRenderer font, IFormattableTextComponent component, int width) {
super(font, component);
this.width = width;
}
@Override
protected void renderStencil(MatrixStack ms) {
int textWidth = font.getWidth(component);
font.draw(ms, component, width / 2f - textWidth / 2f, 0, 0xff_000000);
}
@Override
protected void renderElement(MatrixStack ms) {
elementRenderer.render(ms, width, 10);
}
}
}

View file

@ -16,8 +16,14 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.shader.Framebuffer;
import net.minecraftforge.fml.client.gui.GuiUtils;
import javax.annotation.Nonnull;
public class UIRenderHelper {
public static void enableStencil() {
RenderSystem.recordRenderCall(() -> Minecraft.getInstance().getFramebuffer().enableStencil());
}
public static Framebuffer framebuffer;
public static void init() {
@ -102,6 +108,33 @@ public class UIRenderHelper {
GuiUtils.drawGradientRect(model, 0, -width, (int) (split2 * height), width, height, c3, c4);
}
/**
* @see #angledGradient(MatrixStack, float, int, int, int, int, int, int, int)
*/
public static void angledGradient(@Nonnull MatrixStack ms, float angle, int x, int y, int width, int length, int color1, int color2) {
angledGradient(ms, angle, x, y, 0, width, length, color1, color2);
}
/**
* x and y specify the middle point of the starting edge
*
* @param angle the angle of the gradient in degrees; 0° means from left to right
* @param color1 the color at the starting edge
* @param color2 the color at the ending edge
* @param width the total width of the gradient
*
*/
public static void angledGradient(@Nonnull MatrixStack ms, float angle, int x, int y, int z, int width, int length, int color1, int color2) {
ms.push();
ms.translate(x, y, z);
ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(angle - 90));
Matrix4f model = ms.peek().getModel();
int w = width / 2;
GuiUtils.drawGradientRect(model, 0, -w, 0, w, length, color1, color2);
ms.pop();
}
//draws a wide chevron-style breadcrumb arrow pointing left
public static void breadcrumbArrow(MatrixStack matrixStack, int x, int y, int z, int width, int height, int indent, int startColor, int endColor) {
matrixStack.push();

View file

@ -9,6 +9,8 @@ import net.minecraft.client.gui.widget.Widget;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import javax.annotation.Nonnull;
public abstract class AbstractSimiWidget extends Widget {
protected List<ITextComponent> toolTip;
@ -23,7 +25,7 @@ public abstract class AbstractSimiWidget extends Widget {
}
@Override
public void renderButton(MatrixStack matrixStack, int p_renderButton_1_, int p_renderButton_2_, float p_renderButton_3_) {
public void renderButton(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
}
}

View file

@ -7,6 +7,8 @@ import com.simibubi.create.foundation.gui.AllIcons;
import net.minecraft.util.text.ITextComponent;
import javax.annotation.Nonnull;
public class IconButton extends AbstractSimiWidget {
private AllIcons icon;
@ -18,7 +20,7 @@ public class IconButton extends AbstractSimiWidget {
}
@Override
public void renderButton(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) {
public void renderButton(@Nonnull MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) {
if (this.visible) {
this.hovered =
mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height;

View file

@ -0,0 +1,33 @@
package com.simibubi.create.foundation.gui.widgets;
import javax.annotation.Nonnull;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.gui.StencilElement;
public class StencilWidget extends AbstractSimiWidget {
protected StencilElement stencilElement;
protected StencilWidget(int x, int y, int width, int height) {
super(x, y, width, height);
}
public StencilWidget(int x, int y, int width, int height, StencilElement stencilElement) {
super(x, y, width, height);
this.stencilElement = stencilElement;
}
@Override
public void renderButton(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
ms.push();
ms.translate(x, y, 0);
stencilElement.render(ms);
ms.pop();
}
public StencilElement getStencilElement() {
return stencilElement;
}
}

View file

@ -11,6 +11,8 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.SoundHandler;
import net.minecraft.client.gui.FontRenderer;
import net.minecraftforge.fml.client.gui.GuiUtils;
import javax.annotation.Nonnull;
import org.antlr.v4.runtime.misc.IntegerList;
public class PonderProgressBar extends AbstractSimiWidget {
@ -103,7 +105,7 @@ public class PonderProgressBar extends AbstractSimiWidget {
}
@Override
public void renderButton(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
public void renderButton(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
hovered = clicked(mouseX, mouseY);

View file

@ -16,6 +16,8 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
public class PonderButton extends AbstractSimiWidget {
private IScreenRenderable icon;
@ -87,7 +89,7 @@ public class PonderButton extends AbstractSimiWidget {
}
@Override
public void renderButton(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
public void renderButton(@Nonnull MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
if (!visible)
return;
if (fade < .1f)