changeset 1398:f7bf7a5cc1e7

sync from bedroom to office
author sam <sam@basx.dev>
date Sat, 14 Dec 2024 17:17:51 +0700
parents 4fd96b36696a
children dde74be11b49
files semicongine/text.nim semicongine/text/font.nim semicongine/text/textbox.nim tests/test_text.nim
diffstat 4 files changed, 59 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/semicongine/text.nim	Sat Dec 14 16:34:02 2024 +0700
+++ b/semicongine/text.nim	Sat Dec 14 17:17:51 2024 +0700
@@ -23,8 +23,9 @@
   GlyphInfo* = object
     uvs*: array[4, Vec2f]
     dimension*: Vec2f
-    topOffset*: float32
-    leftOffset*: float32
+    offsetX*: float32
+    offsetY*: float32
+    leftBearing*: float32
     advance*: float32
 
   FontObj* = object
@@ -98,15 +99,15 @@
 const int[6] indices = int[](0, 1, 2, 2, 3, 0);
 const int[4] i_x = int[](0, 0, 2, 2);
 const int[4] i_y = int[](1, 3, 3, 1);
-const float epsilon = 0.000000000000001;
-// const float epsilon = 0.1;
+// const float epsilon = 0.000000000000001;
+const float epsilon = 0.1;
 
 void main() {
   int vertexI = indices[gl_VertexIndex];
   vec3 pos = vec3(
     glyphData.pos[glyphIndex][i_x[vertexI]] * scale,
     glyphData.pos[glyphIndex][i_y[vertexI]] * scale,
-    gl_VertexIndex * epsilon
+    1 - (gl_InstanceIndex + 1) * epsilon
   );
   vec2 uv = vec2(glyphData.uv[glyphIndex][i_x[vertexI]], glyphData.uv[glyphIndex][i_y[vertexI]]);
   gl_Position = vec4(pos + position, 1.0);
@@ -116,13 +117,13 @@
     fragmentCode* =
       """void main() {
     float v = texture(fontAtlas, fragmentUv).r;
-    // CARFULL: This can lead to rough edges at times
     // if(v == 0) {
       // discard;
     // }
-    // outColor = vec4(fragmentColor.rgb, fragmentColor.a * v);
-    // outColor = fragmentColor;
-    outColor = vec4(1, 1, 1, v);
+    outColor = vec4(fragmentColor.rgb, fragmentColor.a * v);
+    if (v == 0) {
+      outColor = vec4(1, 0, 1, 1);
+    }
 }"""
 
 proc `=copy`(dest: var FontObj, source: FontObj) {.error.}
@@ -143,11 +144,11 @@
   var i = 0'u16
   for rune, info in font.glyphs.pairs():
     let
-      left = -info.leftOffset
-      right = -info.leftOffset + info.dimension.x
-      top = font.lineHeight + info.topOffset
-      bottom = font.lineHeight + info.topOffset - info.dimension.y
-    glyphData.pos[i] = vec4(left, bottom, right, top) * 0.01'f32
+      left = -info.offsetX
+      right = -info.offsetX + info.dimension.x
+      top = font.lineHeight + info.offsetY
+      bottom = font.lineHeight + info.offsetY - info.dimension.y
+    glyphData.pos[i] = vec4(left, bottom, right, top) * 0.005'f32
     assert info.uvs[0].x == info.uvs[1].x,
       "Currently only axis aligned rectangles are allowed for info boxes in font texture maps"
     assert info.uvs[0].y == info.uvs[3].y,
--- a/semicongine/text/font.nim	Sat Dec 14 16:34:02 2024 +0700
+++ b/semicongine/text/font.nim	Sat Dec 14 17:17:51 2024 +0700
@@ -70,8 +70,8 @@
       warn &"Loading font {name}: Codepoint '{codePoint}' ({cint(codePoint)}) has no glyph"
 
   var
-    topOffsets: Table[Rune, int]
-    leftOffsets: Table[Rune, int]
+    offsetY: Table[Rune, int]
+    offsetX: Table[Rune, int]
     images: seq[Image[Gray]]
 
   for codePoint in codePoints:
@@ -88,8 +88,8 @@
       addr offX,
       addr offY,
     )
-    topOffsets[codePoint] = offY
-    leftOffsets[codePoint] = offX
+    offsetX[codePoint] = offX
+    offsetY[codePoint] = offY
 
     if char(codePoint) in UppercaseLetters:
       result.capHeight = float32(height)
@@ -132,10 +132,10 @@
         vec2((coord.x + iw - 0.5) / w, (coord.y + 0.5) / h),
         vec2((coord.x + iw - 0.5) / w, (coord.y + ih - 0.5) / h),
       ],
-      topOffset: float32(topOffsets[codePoint]) * result.fontscale,
-      # leftOffset: float32(leftBearing) * result.fontscale,
-      leftOffset: float32(leftOffsets[codePoint] + leftBearing) * result.fontscale,
-      advance: float32(advance) * result.fontscale,
+      offsetX: float32(offsetX[codePoint]),
+      offsetY: float32(offsetY[codePoint]),
+      leftBearing: float32(leftBearing),
+      advance: float32(advance),
     )
 
     for codePointAfter in codePoints:
--- a/semicongine/text/textbox.nim	Sat Dec 14 16:34:02 2024 +0700
+++ b/semicongine/text/textbox.nim	Sat Dec 14 17:17:51 2024 +0700
@@ -86,10 +86,10 @@
       else:
         let
           glyph = textbox.font.glyphs[textbox.visibleText[i]]
-          left = offsetX + glyph.leftOffset
-          right = offsetX + glyph.leftOffset + glyph.dimension.x
-          top = offsetY - glyph.topOffset
-          bottom = offsetY - glyph.topOffset - glyph.dimension.y
+          left = offsetX + glyph.offsetX
+          right = offsetX + glyph.offsetX + glyph.dimension.x
+          top = offsetY - glyph.offsetY
+          bottom = offsetY - glyph.offsetY - glyph.dimension.y
 
         textbox.position.data[vertexOffset + 0] =
           vec3(left - anchorX, bottom - anchorY, 0)
--- a/tests/test_text.nim	Sat Dec 14 16:34:02 2024 +0700
+++ b/tests/test_text.nim	Sat Dec 14 17:17:51 2024 +0700
@@ -18,20 +18,45 @@
 
 const N_GLYPHS = 200
 proc test_01_static_label_new(time: float32) =
-  var font = loadFont("Overhaul.ttf", lineHeightPixels = 160)
+  # var font = loadFont("Overhaul.ttf", lineHeightPixels = 160)
+  var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 160)
   var renderdata = initRenderData()
   var pipeline =
     createPipeline[GlyphShader[N_GLYPHS]](renderPass = vulkan.swapchain.renderPass)
   var (ds, glyphtable) = glyphDescriptorSet(font, N_GLYPHS)
   var glyphs = Glyphs(
-    position:
-      asGPUArray([vec3(0, 0, 0.2), vec3(0, 0, 0.1), vec3(0, 0, 0)], VertexBufferMapped),
-    scale: asGPUArray([1'f32, 1'f32, 1'f32], VertexBufferMapped),
+    position: asGPUArray(
+      [
+        vec3(-1, 0, 0),
+        vec3(-0.6, 0, 0),
+        vec3(-0.3, 0, 0),
+        vec3(0, 0, 0),
+        vec3(0.3, 0, 0),
+        vec3(0.6, 0, 0),
+      ],
+      VertexBufferMapped,
+    ),
+    scale: asGPUArray([1'f32, 1'f32, 1'f32, 1'f32, 1'f32, 1'f32], VertexBufferMapped),
     color: asGPUArray(
-      [vec4(1, 1, 1, 1), vec4(1, 1, 1, 1), vec4(1, 1, 1, 1)], VertexBufferMapped
+      [
+        vec4(1, 1, 0, 1),
+        vec4(0, 0, 1, 1),
+        vec4(1, 1, 1, 1),
+        vec4(1, 1, 0, 1),
+        vec4(0, 0, 1, 1),
+        vec4(1, 1, 1, 1),
+      ],
+      VertexBufferMapped,
     ),
     glyphIndex: asGPUArray(
-      [glyphtable[Rune('A')], glyphtable[Rune('B')], glyphtable[Rune('g')]],
+      [
+        glyphtable[Rune('a')],
+        glyphtable[Rune('l')],
+        glyphtable[Rune('i')],
+        glyphtable[Rune('g')],
+        glyphtable[Rune('x')],
+        glyphtable[Rune('x')],
+      ],
       VertexBufferMapped,
     ),
   )
@@ -59,8 +84,7 @@
             pipeline,
             EMPTY(),
             glyphs,
-            fixedVertexCount = 6,
-            fixedInstanceCount = 2,
+            fixedVertexCount = 6, # fixedInstanceCount = 2,
           )
 
         # cleanup