diff --git a/src/main/java/speiger/src/coreengine/NewInputTest.java b/src/main/java/speiger/src/coreengine/NewInputTest.java index e79f656..fd900e9 100644 --- a/src/main/java/speiger/src/coreengine/NewInputTest.java +++ b/src/main/java/speiger/src/coreengine/NewInputTest.java @@ -17,13 +17,11 @@ import speiger.src.coreengine.assets.base.IAssetProvider; import speiger.src.coreengine.math.vector.matrix.Matrix4f; import speiger.src.coreengine.rendering.gui.font.Font; import speiger.src.coreengine.rendering.gui.font.FontManager; +import speiger.src.coreengine.rendering.gui.font.TextStyle; import speiger.src.coreengine.rendering.gui.font.glyth.Glyth; import speiger.src.coreengine.rendering.gui.font.glyth.IGlythSheetInfo; import speiger.src.coreengine.rendering.gui.font.glyth.MissingGlyth; -import speiger.src.coreengine.rendering.gui.font.glyth.UnbakedGlyth; import speiger.src.coreengine.rendering.gui.font.glyth.UnbakedGlyth.GlythBaker; -import speiger.src.coreengine.rendering.gui.font.providers.IFontProvider; -import speiger.src.coreengine.rendering.gui.font.providers.STBTrueTypeProvider; import speiger.src.coreengine.rendering.input.devices.FileDrop; import speiger.src.coreengine.rendering.input.devices.Joystick; import speiger.src.coreengine.rendering.input.devices.Keyboard; @@ -42,9 +40,12 @@ import speiger.src.coreengine.rendering.tesselation.buffer.VertexBuilder; import speiger.src.coreengine.rendering.tesselation.format.VertexTypes; import speiger.src.coreengine.rendering.textures.custom.Drawable; import speiger.src.coreengine.rendering.textures.custom.DynamicTexture; +import speiger.src.coreengine.rendering.utils.GLFunctions; import speiger.src.coreengine.rendering.utils.GLStateTracker; +import speiger.src.coreengine.rendering.utils.values.GLBlendFactor; import speiger.src.coreengine.rendering.utils.values.GLDataType; import speiger.src.coreengine.rendering.utils.values.GLMode; +import speiger.src.coreengine.rendering.utils.values.IGLValue.ISourceFactor; import speiger.src.coreengine.rendering.utils.values.textures.GLTextureFormat; import speiger.src.coreengine.utils.eventbus.EventBus; import speiger.src.coreengine.utils.helpers.IOUtils; @@ -83,7 +84,6 @@ public class NewInputTest { System.out.println("Testing: "+GL.getCapabilities().OpenGL41); System.out.println("Testing: "+Integer.divideUnsigned(-1, 255)); - IFontProvider provider = STBTrueTypeProvider.create(AssetLocation.of("font/roboto/font.json"), assets); guiShader.get().proView.set(new Matrix4f().ortho(0, 0, window.width(), window.height(), 1000, -1000)); int size = 512; @@ -107,22 +107,6 @@ public class NewInputTest { drawable.upload(texture.id(), base * 3, base * 3, base, base, base * 2, base * 2); drawable.close(); } - else if(T.key() == GLFW.GLFW_KEY_Z) { - T.cancel(); - System.out.println("Testing"); -// texture.bind(); - UnbakedGlyth data = provider.glythData("C".codePointAt(0), 0, 18.5F, 2F); - data.bake(new GlythBaker() { - @Override - public Glyth bake(IGlythSheetInfo info) { - int width = info.width(); - int height = info.height(); - info.upload(texture.id(), half - (width >> 1), half - (height >> 1)); - System.out.println("Test2: "+width+", "+height); - return null; - } - }); - } else if(T.key() == GLFW.GLFW_KEY_U) { MissingGlyth glyth = new MissingGlyth(18.5F, 4F); glyth.bake(new GlythBaker() { @@ -163,10 +147,10 @@ public class NewInputTest { // String s = "The Quick brown fox Jumps over the Lazy dog"; float offset = font.drawText("The Quick ", 50, 50, -1, buffer, false); - offset += font.drawText(Font.DEFAULT.with(25F), "Brown ", 50+offset, 50, -1, buffer, false); - offset += font.drawText(Font.DEFAULT, "Fox ", 50+offset, 50, -1, buffer, false); - offset += font.drawText(Font.DEFAULT.with(10F), "Jumps ", 50+offset, 50, -1, buffer, false); - offset += font.drawText(Font.DEFAULT, "over the Lazy dog", 50+offset, 50, -1, buffer, true); + offset += font.drawText(TextStyle.DEFAULT.size(25F), "Brown ", 50+offset, 50, -1, buffer, false); + offset += font.drawText(TextStyle.DEFAULT, "§ox ", 50+offset, 50, -1, buffer, false); + offset += font.drawText(TextStyle.DEFAULT.size(10F), "Jumps ", 50+offset, 50, -1, buffer, false); + offset += font.drawText(TextStyle.DEFAULT, "over the Lazy dog", 50+offset, 50, -1, buffer, true); // font.drawText(s, 50, 50, -1, buffer, true); GLStateTracker tracker = GLStateTracker.instance(); @@ -182,10 +166,12 @@ public class NewInputTest { model.unbindArray(); guiModel[0].bindArray(); guiShader.bind(); + GLStateTracker.instance().blend.setFunction(GLBlendFactor.SRC_COLOR, GLBlendFactor.ONE_MINUS_SRC_ALPHA, GLBlendFactor.ONE, GLBlendFactor.ZERO).enable(); for(GLDraw draw : draws) { tracker.textures.bind(draw.texture()); GLStateTracker.drawArrays(GLMode.TRIANGLES.glValue(), draw.startVertex(), draw.vertexCount()); } + GLStateTracker.instance().blend.disable(); guiModel[0].unbindArray(); window.handleInput(); window.finishFrame(); diff --git a/src/main/java/speiger/src/coreengine/math/misc/ColorUtils.java b/src/main/java/speiger/src/coreengine/math/misc/ColorUtils.java index a0350d8..1cbaa84 100644 --- a/src/main/java/speiger/src/coreengine/math/misc/ColorUtils.java +++ b/src/main/java/speiger/src/coreengine/math/misc/ColorUtils.java @@ -112,6 +112,14 @@ public class ColorUtils { public static float getBF(int rgba) { return (rgba & 0xFF) * DEVIDER; } public static int getA(int rgba) { return (rgba >> 24) & 0xFF; } public static float getAF(int rgba) { return ((rgba >> 24) & 0xFF) * DEVIDER; } + public static int parse(String input) { + try { return Long.decode(input).intValue(); } + catch (Exception e) { return -1; } + } + public static int parse(String input, int defaultValue) { + try { return Long.decode(input).intValue(); } + catch (Exception e) { return defaultValue; } + } public static String toHex(int rgba, boolean alpha) { return "0x"+(alpha ? Long.toHexString(1 << 32 | rgba & SIGN) : Integer.toHexString((1 << 24) | (rgba & ~A))).substring(1); } public static String toHTML(int rgba, boolean alpha) { return "#"+(alpha ? Long.toHexString(1 << 32 | rgba & SIGN) : Integer.toHexString((1 << 24) | (rgba & ~A))).substring(1); } } diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/font/Font.java b/src/main/java/speiger/src/coreengine/rendering/gui/font/Font.java index 605ed50..2d15cb2 100644 --- a/src/main/java/speiger/src/coreengine/rendering/gui/font/Font.java +++ b/src/main/java/speiger/src/coreengine/rendering/gui/font/Font.java @@ -10,8 +10,8 @@ import speiger.src.coreengine.rendering.gui.font.glyth.UnbakedGlyth.GlythBaker; import speiger.src.coreengine.rendering.tesselation.buffer.IVertexBuilder; public class Font { - public static final FontStyle DEFAULT = new FontStyle(AssetLocation.of("default"), 0, 18F); - + private static final int FORMAT_CODE_POINT = '§'; + FontSplitter splitter; Map fonts; GlythBaker baker; float oversample; @@ -22,6 +22,7 @@ public class Font { this.baker = baker; this.oversample = oversample; clearing.accept(this::reset); + splitter = new FontSplitter(this); } private void reset() { @@ -43,19 +44,28 @@ public class Font { } public float drawText(String text, float x, float y, int color, TexturedBuffer buffer, boolean end) { - return drawText(DEFAULT, text, x, y, color, buffer, end); + return drawText(TextStyle.DEFAULT, text, x, y, color, buffer, end); } - public float drawText(FontStyle style, String text, float x, float y, int color, TexturedBuffer buffer, boolean end) { + public float drawText(TextStyle style, String text, float x, float y, int color, TexturedBuffer buffer, boolean end) { + TextStyle[] currentStyle = {style}; + int[] currentColor = {currentStyle[0].hasColor() ? currentStyle[0].color() : color}; float xStart = x; int previousCodepoint = -1; for(int i = 0,m=text.length();i { + currentStyle[0] = T; + currentColor[0] = T.hasColor() ? T.color() : color; + })) { + i = text.indexOf('>', i)+1; + continue; + } + GlythData data = data(currentStyle[0].font(), codepoint); if(previousCodepoint != -1) { x -= data.kerning(previousCodepoint); } - Glyth glyth = glyth(style, codepoint); + Glyth glyth = glyth(currentStyle[0].font(), codepoint); if(glyth.isValid()) { float minX = glyth.left() + x; float minY = glyth.top() + y; @@ -63,12 +73,12 @@ public class Font { float maxY = glyth.bottom() + y; IVertexBuilder builder = buffer.builderForTexture(glyth.texture()); - builder.pos(minX, minY, 0F).tex(glyth.minU(), glyth.minV()).rgba(-1).endVertex(); - builder.pos(maxX, minY, 0F).tex(glyth.maxU(), glyth.minV()).rgba(-1).endVertex(); - builder.pos(maxX, maxY, 0F).tex(glyth.maxU(), glyth.maxV()).rgba(-1).endVertex(); - builder.pos(maxX, maxY, 0F).tex(glyth.maxU(), glyth.maxV()).rgba(-1).endVertex(); - builder.pos(minX, maxY, 0F).tex(glyth.minU(), glyth.maxV()).rgba(-1).endVertex(); - builder.pos(minX, minY, 0F).tex(glyth.minU(), glyth.minV()).rgba(-1).endVertex(); + builder.pos(minX, minY, 0F).tex(glyth.minU(), glyth.minV()).rgba(currentColor[0]).endVertex(); + builder.pos(maxX, minY, 0F).tex(glyth.maxU(), glyth.minV()).rgba(currentColor[0]).endVertex(); + builder.pos(maxX, maxY, 0F).tex(glyth.maxU(), glyth.maxV()).rgba(currentColor[0]).endVertex(); + builder.pos(maxX, maxY, 0F).tex(glyth.maxU(), glyth.maxV()).rgba(currentColor[0]).endVertex(); + builder.pos(minX, maxY, 0F).tex(glyth.minU(), glyth.maxV()).rgba(currentColor[0]).endVertex(); + builder.pos(minX, minY, 0F).tex(glyth.minU(), glyth.minV()).rgba(currentColor[0]).endVertex(); } x += data.advance(); i += Character.charCount(codepoint); @@ -78,6 +88,17 @@ public class Font { return x - xStart; } + boolean applyStyle(String text, int index, TextStyle style, TextStyle original, Consumer consumer) { + if(text.length() <= index || text.codePointAt(index) != '<') return false; + int endIndex = text.indexOf('>', index); + if(endIndex == -1) return false; + String[] formatting = text.substring(index+1, endIndex).split(","); + if(formatting.length <= 0) return false; + consumer.accept(style.parseArguments(original, formatting)); + return true; + } + + public static interface TexturedBuffer { public IVertexBuilder builderForTexture(int textureId); public void end(); diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/font/FontSplitter.java b/src/main/java/speiger/src/coreengine/rendering/gui/font/FontSplitter.java new file mode 100644 index 0000000..8ff2264 --- /dev/null +++ b/src/main/java/speiger/src/coreengine/rendering/gui/font/FontSplitter.java @@ -0,0 +1,28 @@ +package speiger.src.coreengine.rendering.gui.font; + +public class FontSplitter { + private static final int SPLITTER_CODE_POINT = '§'; + + Font font; + + public FontSplitter(Font font) { + this.font = font; + System.out.println("Testing: "+SPLITTER_CODE_POINT); + } + + public float width(String text) { + return width(TextStyle.DEFAULT, text); + } + + public float width(TextStyle style, String text) { + float total = 0F; + for(int i = 0,m=text.length();i 0F) { @@ -48,7 +48,7 @@ public class ConstrainedContext { for(int i = 0,m=children.size();i original; + case 't' -> true; + case 'f' -> false; + default -> current; + }; + } + return Boolean.parseBoolean(data); + } + + public static float parseFloat(String input, float defaultValue) { + try { return Float.parseFloat(input); } + catch (Exception e) { return defaultValue; } + } + public static String removeSpecialFormatters(String input) { return input.replaceAll("\\§\\<(.*?)\\>", ""); }