changeset 1410:99d5b42cf32d

did: simplify text rendering API
author sam <sam@basx.dev>
date Thu, 26 Dec 2024 11:20:47 +0700
parents 5a56f8ac328b
children 5273bb68cf85
files semicongine/rendering.nim semicongine/text.nim semicongine/text/font.nim tests/test_text.nim
diffstat 4 files changed, 14 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/semicongine/rendering.nim	Mon Dec 23 00:32:07 2024 +0700
+++ b/semicongine/rendering.nim	Thu Dec 26 11:20:47 2024 +0700
@@ -114,7 +114,7 @@
   # shader related types
   DescriptorSetData*[T: object] = object
     data*: T
-    vk: array[INFLIGHTFRAMES.int, VkDescriptorSet]
+    vk*: array[INFLIGHTFRAMES.int, VkDescriptorSet]
 
   Pipeline*[TShader] = object
     vk: VkPipeline
--- a/semicongine/text.nim	Mon Dec 23 00:32:07 2024 +0700
+++ b/semicongine/text.nim	Thu Dec 26 11:20:47 2024 +0700
@@ -116,8 +116,11 @@
 
 include ./text/font
 
-func initTextBuffer*[MaxGlyphs: static int](
-    font: Font[MaxGlyphs], bufferSize: int, baseScale = 1'f32
+proc initTextBuffer*[MaxGlyphs: static int](
+    font: Font[MaxGlyphs],
+    bufferSize: int,
+    renderdata: var RenderData,
+    baseScale = 1'f32,
 ): TextBuffer[MaxGlyphs] =
   result.cursor = 0
   result.font = font
@@ -127,6 +130,7 @@
   result.color.data.setLen(bufferSize)
   result.glyphIndex.data.setLen(bufferSize)
   result.texts.setLen(bufferSize) # waste a lot of memory?
+  assignBuffers(renderdata, result)
 
 iterator splitLines(text: seq[Rune]): seq[Rune] =
   var current = newSeq[Rune]()
--- a/semicongine/text/font.nim	Mon Dec 23 00:32:07 2024 +0700
+++ b/semicongine/text/font.nim	Thu Dec 26 11:20:47 2024 +0700
@@ -177,6 +177,7 @@
   )
 
 proc upload*(font: Font, renderdata: var RenderData) =
+  assert font.descriptorSet.vk.allIt(not it.Valid), "Font was alread uploaded"
   assignBuffers(renderdata, font.descriptorSet)
   uploadImages(renderdata, font.descriptorSet)
 
--- a/tests/test_text.nim	Mon Dec 23 00:32:07 2024 +0700
+++ b/tests/test_text.nim	Thu Dec 26 11:20:47 2024 +0700
@@ -21,8 +21,7 @@
   var pipeline = createPipeline[GlyphShader[MAX_CODEPOINTS]](
     renderPass = vulkan.swapchain.renderPass
   )
-  var textbuffer = font.initTextBuffer(1000, baseScale = 0.1)
-  assignBuffers(renderdata, textbuffer)
+  var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1)
 
   font.upload(renderdata)
   font.addToPipeline(renderdata, pipeline)
@@ -70,13 +69,9 @@
   font2.addToPipeline(renderdata, pipeline)
   font3.addToPipeline(renderdata, pipeline)
 
-  var textbuffer1 = font1.initTextBuffer(10, baseScale = 0.1)
-  var textbuffer2 = font2.initTextBuffer(10, baseScale = 0.1)
-  var textbuffer3 = font3.initTextBuffer(10, baseScale = 0.1)
-
-  assignBuffers(renderdata, textbuffer1)
-  assignBuffers(renderdata, textbuffer2)
-  assignBuffers(renderdata, textbuffer3)
+  var textbuffer1 = font1.initTextBuffer(10, renderdata, baseScale = 0.1)
+  var textbuffer2 = font2.initTextBuffer(10, renderdata, baseScale = 0.1)
+  var textbuffer3 = font3.initTextBuffer(10, renderdata, baseScale = 0.1)
 
   var p = 0
   let l1 = textbuffer1.add($(p + 0), vec3(0.3, 0.5), capacity = 5)
@@ -130,8 +125,7 @@
   font.upload(renderdata)
   font.addToPipeline(renderdata, pipeline)
 
-  var textbuffer = font.initTextBuffer(1000, baseScale = 0.1)
-  assignBuffers(renderdata, textbuffer)
+  var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1)
 
   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))
@@ -184,8 +178,7 @@
   font.upload(renderdata)
   font.addToPipeline(renderdata, pipeline)
 
-  var textbuffer = font.initTextBuffer(3000, baseScale = 0.1)
-  assignBuffers(renderdata, textbuffer)
+  var textbuffer = font.initTextBuffer(3000, renderdata, baseScale = 0.1)
 
   for i in 0 ..< 1000:
     discard textbuffer.add(