diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/GlyphInstance.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/GlyphInstance.java index cd33b677a..510afd8bf 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/GlyphInstance.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/GlyphInstance.java @@ -9,6 +9,10 @@ import net.minecraft.client.gui.font.glyphs.BakedGlyph; import net.minecraft.util.FastColor; public class GlyphInstance extends AbstractInstance { + // Skew x by 1 - 0.25 * y + // Note that columns are written as rows. + private static final Matrix4f ITALIC_SKEW = new Matrix4f(1, 0, 0, 0, -0.25f, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1); + public final Matrix4f pose = new Matrix4f(); public float u0; @@ -16,14 +20,6 @@ public class GlyphInstance extends AbstractInstance { public float v0; public float v1; - public float x0; - public float x1; - public float x2; - public float x3; - - public float y0; - public float y1; - public byte red = (byte) 0xFF; public byte green = (byte) 0xFF; public byte blue = (byte) 0xFF; @@ -47,22 +43,26 @@ public class GlyphInstance extends AbstractInstance { float up = glyphReader.flywheel$up(); float down = glyphReader.flywheel$down(); - float f = x + left; - float g = x + right; - float h = up - 3.0f; - float j = down - 3.0f; - float k = y + h; - float l = y + j; - float m = italic ? 1.0f - 0.25f * h : 0.0f; - float n = italic ? 1.0f - 0.25f * j : 0.0f; + pose.translate(x + left, y + up - 3.0f, 0.0f); + pose.scale(right - left, down - up, 1.0f); - y0 = k; - y1 = l; + if (italic) { + pose.mul(ITALIC_SKEW); + } - x0 = f + m; - x1 = f + n; - x2 = g + n; - x3 = g + m; + return this; + } + + public GlyphInstance setEffect(BakedGlyph glyph, float x0, float y0, float x1, float y1, float depth) { + var glyphReader = FlwLibLink.INSTANCE.getGlyphExtension(glyph); + + u0 = glyphReader.flywheel$u0(); + u1 = glyphReader.flywheel$u1(); + v0 = glyphReader.flywheel$v0(); + v1 = glyphReader.flywheel$v1(); + + pose.translate(x0, y0, depth); + pose.scale(x1 - x0, y1 - y0, 1.0f); return this; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/InstanceTypes.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/InstanceTypes.java index 0d271fcce..4002af4d2 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/InstanceTypes.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/InstanceTypes.java @@ -107,8 +107,6 @@ public final class InstanceTypes { .layout(LayoutBuilder.create() .matrix("pose", FloatRepr.FLOAT, 4) .vector("u0u1v0v1", FloatRepr.FLOAT, 4) - .vector("x", FloatRepr.FLOAT, 4) - .vector("y", FloatRepr.FLOAT, 2) .vector("color", FloatRepr.UNSIGNED_BYTE, 4) .vector("light", FloatRepr.UNSIGNED_SHORT, 2) .build()) @@ -118,17 +116,11 @@ public final class InstanceTypes { MemoryUtil.memPutFloat(ptr + 68, instance.u1); MemoryUtil.memPutFloat(ptr + 72, instance.v0); MemoryUtil.memPutFloat(ptr + 76, instance.v1); - MemoryUtil.memPutFloat(ptr + 80, instance.x0); - MemoryUtil.memPutFloat(ptr + 84, instance.x1); - MemoryUtil.memPutFloat(ptr + 88, instance.x2); - MemoryUtil.memPutFloat(ptr + 92, instance.x3); - MemoryUtil.memPutFloat(ptr + 96, instance.y0); - MemoryUtil.memPutFloat(ptr + 100, instance.y1); - MemoryUtil.memPutByte(ptr + 104, instance.red); - MemoryUtil.memPutByte(ptr + 105, instance.green); - MemoryUtil.memPutByte(ptr + 106, instance.blue); - MemoryUtil.memPutByte(ptr + 107, instance.alpha); - ExtraMemoryOps.put2x16(ptr + 108, instance.light); + MemoryUtil.memPutByte(ptr + 80, instance.red); + MemoryUtil.memPutByte(ptr + 81, instance.green); + MemoryUtil.memPutByte(ptr + 82, instance.blue); + MemoryUtil.memPutByte(ptr + 83, instance.alpha); + ExtraMemoryOps.put2x16(ptr + 84, instance.light); }) .vertexShader(Flywheel.rl("instance/glyph.vert")) .cullShader(Flywheel.rl("instance/cull/glyph.glsl")) diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/TextVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/TextVisual.java index 4ecc07c1b..7db6ca399 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/TextVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/TextVisual.java @@ -39,6 +39,8 @@ import net.minecraft.util.FormattedCharSink; * A visual that renders a single line of text. */ public class TextVisual { + public static final float ONE_PIXEL = 0.125f; + public boolean dropShadow; public boolean with8xOutline; public int backgroundColor = 0; @@ -120,9 +122,9 @@ public class TextVisual { GlyphInstance glyph = recycler.get(new GlyphModelKey(glyphExtension.flywheel$texture(), new GlyphSettings(bold, dropShadow, with8xOutline))); + glyph.pose.set(pose); glyph.setGlyph(bakedGlyph, this.x, this.y, style.isItalic()); glyph.color(r, g, b, this.a); - glyph.pose.set(pose); glyph.light = light; glyph.setChanged(); } @@ -146,20 +148,9 @@ public class TextVisual { GlyphInstance glyph = recycler.get(new GlyphModelKey(glyphExtension.flywheel$texture(), new GlyphSettings(false, dropShadow, with8xOutline))); - glyph.u0 = glyphExtension.flywheel$u0(); - glyph.u1 = glyphExtension.flywheel$u1(); - glyph.v0 = glyphExtension.flywheel$v0(); - glyph.v1 = glyphExtension.flywheel$v1(); - - glyph.y0 = y0; - glyph.y1 = y1; - - glyph.x0 = x0; - glyph.x1 = x1; - glyph.x2 = x1; - glyph.x3 = x0; - glyph.color(r, g, b, this.a); glyph.pose.set(pose); + glyph.setEffect(bakedGlyph, x0, y0, x1, y1, depth); + glyph.color(r, g, b, this.a); glyph.light = light; glyph.setChanged(); } @@ -181,7 +172,6 @@ public class TextVisual { private static final Material GLYPH_MATERIAL = SimpleMaterial.builder() .cutout(CutoutShaders.ONE_TENTH) - .backfaceCulling(false) .build(); private record GlyphModelKey(ResourceLocation font, GlyphSettings settings) { @@ -207,7 +197,7 @@ public class TextVisual { continue; } - out.add(new Vector3f(x, y, 0)); + out.add(new Vector3f(x * ONE_PIXEL, y * ONE_PIXEL, 0)); } } } else { @@ -215,11 +205,11 @@ public class TextVisual { } if (bold) { - out.add(new Vector3f(1, 0, 0)); + out.add(new Vector3f(ONE_PIXEL, 0, 0)); } if (dropShadow) { - out.add(new Vector3f(1, 1, 0)); + out.add(new Vector3f(ONE_PIXEL, ONE_PIXEL, 0)); } return new GlyphMesh(out.toArray(new Vector3f[0])); @@ -232,6 +222,8 @@ public class TextVisual { * @param quads Each quad will be expanded into 4 vertices. */ private record GlyphMesh(Vector3f[] quads) implements QuadMesh { + private static final float[] X = new float[]{0, 0, 1, 1}; + private static final float[] Y = new float[]{0, 1, 1, 0}; @Override public int vertexCount() { @@ -245,8 +237,8 @@ public class TextVisual { var quadStart = i * 4; for (int j = 0; j < 4; j++) { - vertexList.x(quadStart + j, quad.x); - vertexList.y(quadStart + j, quad.y); + vertexList.x(quadStart + j, quad.x + X[j]); + vertexList.y(quadStart + j, quad.y + Y[j]); vertexList.z(quadStart + j, quad.z); vertexList.normalX(quadStart + j, 0); vertexList.normalY(quadStart + j, 0); diff --git a/common/src/lib/resources/assets/flywheel/flywheel/instance/cull/glyph.glsl b/common/src/lib/resources/assets/flywheel/flywheel/instance/cull/glyph.glsl index 8f49e6898..c8d9a275c 100644 --- a/common/src/lib/resources/assets/flywheel/flywheel/instance/cull/glyph.glsl +++ b/common/src/lib/resources/assets/flywheel/flywheel/instance/cull/glyph.glsl @@ -1,9 +1,5 @@ #include "flywheel:util/matrix.glsl" void flw_transformBoundingSphere(in FlwInstance i, inout vec3 center, inout float radius) { - - radius += abs(i.x[2] - i.x[0]) + abs(i.y[1] - i.y[0]); - center += vec3((i.x[0] + i.x[2]) * 0.5, (i.y[0] + i.y[1]) * 0.5, 0.); - transformBoundingSphere(i.pose, center, radius); } diff --git a/common/src/lib/resources/assets/flywheel/flywheel/instance/glyph.vert b/common/src/lib/resources/assets/flywheel/flywheel/instance/glyph.vert index 89978637e..3f7d2a303 100644 --- a/common/src/lib/resources/assets/flywheel/flywheel/instance/glyph.vert +++ b/common/src/lib/resources/assets/flywheel/flywheel/instance/glyph.vert @@ -3,9 +3,6 @@ void flw_instanceVertex(in FlwInstance i) { uint yIndex = ((vertexInGlyph + 1u) >> 1u) & 1u; - flw_vertexPos.x += i.x[vertexInGlyph]; - flw_vertexPos.y += i.y[yIndex]; - flw_vertexPos = i.pose * flw_vertexPos; flw_vertexTexCoord.s = i.u0u1v0v1[(vertexInGlyph & 2u) >> 1u];