diff tests/test_text.nim @ 1408:17d960ff6a24

did: implement decent text rendering (I hope, we'll see)
author sam <sam@basx.dev>
date Sun, 22 Dec 2024 22:32:12 +0700
parents 56f927b89716
children 5a56f8ac328b
line wrap: on
line diff
--- a/tests/test_text.nim	Sun Dec 22 00:31:29 2024 +0700
+++ b/tests/test_text.nim	Sun Dec 22 22:32:12 2024 +0700
@@ -28,12 +28,13 @@
   uploadImages(renderdata, font.descriptorSet)
   initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet)
 
+  discard textbuffer.add("Hello semicongine!", vec3())
+
   var start = getMonoTime()
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     let t = getMonoTime()
-    textbuffer.reset()
-    textbuffer.add("Hello semicongine!", vec3(0.5, 0.5), anchor = vec2(0.5, 0.5))
-    textbuffer.updateAllGPUBuffers(flush = true)
+    if windowWasResized():
+      textbuffer.refresh()
 
     withNextFrame(framebuffer, commandbuffer):
       bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline)
@@ -81,25 +82,25 @@
   assignBuffers(renderdata, textbuffer2)
   assignBuffers(renderdata, textbuffer3)
 
-  var labels = ["  0", "  1", "  2"]
+  var p = 0
+  let l1 = textbuffer1.add($(p + 0), vec3(0.3, 0.5), capacity = 5)
+  let l2 = textbuffer2.add($(p + 1), vec3(0.5, 0.5), capacity = 5)
+  let l3 = textbuffer3.add($(p + 2), vec3(0.7, 0.5), capacity = 5)
 
   var start = getMonoTime()
-  var p = 0
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time
-    textbuffer1.reset()
-    textbuffer2.reset()
-    textbuffer3.reset()
-
-    textbuffer1.add($(p + 0), vec3(0.3, 0.5))
-    textbuffer2.add($(p + 1), vec3(0.5, 0.5))
-    textbuffer3.add($(p + 2), vec3(0.7, 0.5))
-
-    textbuffer1.updateAllGPUBuffers(flush = true)
-    textbuffer2.updateAllGPUBuffers(flush = true)
-    textbuffer3.updateAllGPUBuffers(flush = true)
 
     inc p
+
+    textbuffer1.text(l1, $(p + 0))
+    textbuffer2.text(l2, $(p + 1))
+    textbuffer3.text(l3, $(p + 2))
+
+    textbuffer1.refresh()
+    textbuffer2.refresh()
+    textbuffer3.refresh()
+
     withNextFrame(framebuffer, commandbuffer):
       withRenderPass(
         vulkan.swapchain.renderPass,
@@ -137,28 +138,27 @@
   var textbuffer = font.initTextBuffer(1000, baseScale = 0.1)
   assignBuffers(renderdata, textbuffer)
 
+  discard textbuffer.add("Anchor at center", vec3(0, 0), anchor = vec2(0, 0))
+  discard textbuffer.add("Anchor at top left`", vec3(-1, 1), anchor = vec2(-1, 1))
+  discard textbuffer.add("Anchor at top right", vec3(1, 1), anchor = vec2(1, 1))
+  discard textbuffer.add("Anchor at bottom left", vec3(-1, -1), anchor = vec2(-1, -1))
+  discard textbuffer.add("Anchor at bottom right", vec3(1, -1), anchor = vec2(1, -1))
+
+  discard textbuffer.add(
+    "Mutiline text\nLeft aligned\nCool!", vec3(-0.5, -0.5), alignment = Left
+  )
+  discard textbuffer.add(
+    "Mutiline text\nCenter aligned\nCool!!", vec3(0, -0.5), alignment = Center
+  )
+  discard textbuffer.add(
+    "Mutiline text\nRight aligned\nCool!!!", vec3(0.5, -0.5), alignment = Right
+  )
+
   var start = getMonoTime()
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time
-
-    textbuffer.reset()
-    textbuffer.add("Anchor at center", vec3(0, 0), anchor = vec2(0, 0))
-    textbuffer.add("Anchor at top left`", vec3(-1, 1), anchor = vec2(-1, 1))
-    textbuffer.add("Anchor at top right", vec3(1, 1), anchor = vec2(1, 1))
-    textbuffer.add("Anchor at bottom left", vec3(-1, -1), anchor = vec2(-1, -1))
-    textbuffer.add("Anchor at bottom right", vec3(1, -1), anchor = vec2(1, -1))
-
-    textbuffer.add(
-      "Mutiline text\nLeft aligned\nCool!", vec3(-0.5, -0.5), alignment = Left
-    )
-    textbuffer.add(
-      "Mutiline text\nCenter aligned\nCool!!", vec3(0, -0.5), alignment = Center
-    )
-    textbuffer.add(
-      "Mutiline text\nRight aligned\nCool!!!", vec3(0.5, -0.5), alignment = Right
-    )
-
-    textbuffer.updateAllGPUBuffers(flush = true)
+    if windowWasResized():
+      textbuffer.refresh()
 
     withNextFrame(framebuffer, commandbuffer):
       bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline)
@@ -190,24 +190,27 @@
   uploadImages(renderdata, font.descriptorSet)
   initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet)
 
-  var textbuffer = font.initTextBuffer(1000, baseScale = 0.1)
+  var textbuffer = font.initTextBuffer(3000, baseScale = 0.1)
   assignBuffers(renderdata, textbuffer)
 
-  var labels: seq[Textbox]
-  var positions = newSeq[Vec3f](100)
-  var colors = newSeq[Vec4f](100)
-  var scales = newSeq[Vec2f](100)
-  for i in 0 ..< 100:
-    positions[i] = vec3(rand(-0.5 .. 0.5), rand(-0.5 .. 0.5), rand(-0.1 .. 0.1))
-    colors[i] =
-      vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0))
-    scales[i] = vec2(rand(0.5'f32 .. 1.5'f32), rand(0.5'f32 .. 1.5'f32))
-    labels.add initTextbox(renderdata, pipeline.layout(0), font, 0.001, $i)
+  for i in 0 ..< 1000:
+    discard textbuffer.add(
+      $i,
+      vec3(rand(-0.8 .. 0.8), rand(-0.8 .. 0.8), rand(-0.1 .. 0.1)),
+      color =
+        vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)),
+      scale = rand(0.5'f32 .. 1.5'f32),
+    )
 
   var start = getMonoTime()
+  var last = start
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
-    textbuffer.reset()
+    let n = getMonoTime()
+    echo (n - last).inMicroseconds() / 1000
+    last = n
     withNextFrame(framebuffer, commandbuffer):
+      if windowWasResized():
+        textbuffer.refresh()
       bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline)
       withRenderPass(
         vulkan.swapchain.renderPass,
@@ -226,7 +229,7 @@
   destroyRenderData(renderdata)
 
 when isMainModule:
-  var time = 100'f32
+  var time = 1'f32
   initVulkan()
 
   for depthBuffer in [true, false]:
@@ -234,10 +237,10 @@
     setupSwapchain(renderpass = renderpass)
 
     # tests a simple triangle with minimalistic shader and vertex format
-    # test_01_static_label(time)
-    # test_02_multi_counter(time)
+    test_01_static_label(time)
+    test_02_multi_counter(time)
     test_03_layouting(time)
-    # test_04_lots_of_texts(time)
+    test_04_lots_of_texts(time)
 
     checkVkResult vkDeviceWaitIdle(vulkan.device)
     vkDestroyRenderPass(vulkan.device, renderpass.vk, nil)