comparison 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
comparison
equal deleted inserted replaced
1407:56f927b89716 1408:17d960ff6a24
26 assignBuffers(renderdata, textbuffer) 26 assignBuffers(renderdata, textbuffer)
27 assignBuffers(renderdata, font.descriptorSet) 27 assignBuffers(renderdata, font.descriptorSet)
28 uploadImages(renderdata, font.descriptorSet) 28 uploadImages(renderdata, font.descriptorSet)
29 initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet) 29 initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet)
30 30
31 discard textbuffer.add("Hello semicongine!", vec3())
32
31 var start = getMonoTime() 33 var start = getMonoTime()
32 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 34 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
33 let t = getMonoTime() 35 let t = getMonoTime()
34 textbuffer.reset() 36 if windowWasResized():
35 textbuffer.add("Hello semicongine!", vec3(0.5, 0.5), anchor = vec2(0.5, 0.5)) 37 textbuffer.refresh()
36 textbuffer.updateAllGPUBuffers(flush = true)
37 38
38 withNextFrame(framebuffer, commandbuffer): 39 withNextFrame(framebuffer, commandbuffer):
39 bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline) 40 bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline)
40 withRenderPass( 41 withRenderPass(
41 vulkan.swapchain.renderPass, 42 vulkan.swapchain.renderPass,
79 80
80 assignBuffers(renderdata, textbuffer1) 81 assignBuffers(renderdata, textbuffer1)
81 assignBuffers(renderdata, textbuffer2) 82 assignBuffers(renderdata, textbuffer2)
82 assignBuffers(renderdata, textbuffer3) 83 assignBuffers(renderdata, textbuffer3)
83 84
84 var labels = [" 0", " 1", " 2"]
85
86 var start = getMonoTime()
87 var p = 0 85 var p = 0
86 let l1 = textbuffer1.add($(p + 0), vec3(0.3, 0.5), capacity = 5)
87 let l2 = textbuffer2.add($(p + 1), vec3(0.5, 0.5), capacity = 5)
88 let l3 = textbuffer3.add($(p + 2), vec3(0.7, 0.5), capacity = 5)
89
90 var start = getMonoTime()
88 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 91 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
89 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time 92 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time
90 textbuffer1.reset()
91 textbuffer2.reset()
92 textbuffer3.reset()
93
94 textbuffer1.add($(p + 0), vec3(0.3, 0.5))
95 textbuffer2.add($(p + 1), vec3(0.5, 0.5))
96 textbuffer3.add($(p + 2), vec3(0.7, 0.5))
97
98 textbuffer1.updateAllGPUBuffers(flush = true)
99 textbuffer2.updateAllGPUBuffers(flush = true)
100 textbuffer3.updateAllGPUBuffers(flush = true)
101 93
102 inc p 94 inc p
95
96 textbuffer1.text(l1, $(p + 0))
97 textbuffer2.text(l2, $(p + 1))
98 textbuffer3.text(l3, $(p + 2))
99
100 textbuffer1.refresh()
101 textbuffer2.refresh()
102 textbuffer3.refresh()
103
103 withNextFrame(framebuffer, commandbuffer): 104 withNextFrame(framebuffer, commandbuffer):
104 withRenderPass( 105 withRenderPass(
105 vulkan.swapchain.renderPass, 106 vulkan.swapchain.renderPass,
106 framebuffer, 107 framebuffer,
107 commandbuffer, 108 commandbuffer,
135 initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet) 136 initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet)
136 137
137 var textbuffer = font.initTextBuffer(1000, baseScale = 0.1) 138 var textbuffer = font.initTextBuffer(1000, baseScale = 0.1)
138 assignBuffers(renderdata, textbuffer) 139 assignBuffers(renderdata, textbuffer)
139 140
141 discard textbuffer.add("Anchor at center", vec3(0, 0), anchor = vec2(0, 0))
142 discard textbuffer.add("Anchor at top left`", vec3(-1, 1), anchor = vec2(-1, 1))
143 discard textbuffer.add("Anchor at top right", vec3(1, 1), anchor = vec2(1, 1))
144 discard textbuffer.add("Anchor at bottom left", vec3(-1, -1), anchor = vec2(-1, -1))
145 discard textbuffer.add("Anchor at bottom right", vec3(1, -1), anchor = vec2(1, -1))
146
147 discard textbuffer.add(
148 "Mutiline text\nLeft aligned\nCool!", vec3(-0.5, -0.5), alignment = Left
149 )
150 discard textbuffer.add(
151 "Mutiline text\nCenter aligned\nCool!!", vec3(0, -0.5), alignment = Center
152 )
153 discard textbuffer.add(
154 "Mutiline text\nRight aligned\nCool!!!", vec3(0.5, -0.5), alignment = Right
155 )
156
140 var start = getMonoTime() 157 var start = getMonoTime()
141 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 158 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
142 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time 159 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time
143 160 if windowWasResized():
144 textbuffer.reset() 161 textbuffer.refresh()
145 textbuffer.add("Anchor at center", vec3(0, 0), anchor = vec2(0, 0))
146 textbuffer.add("Anchor at top left`", vec3(-1, 1), anchor = vec2(-1, 1))
147 textbuffer.add("Anchor at top right", vec3(1, 1), anchor = vec2(1, 1))
148 textbuffer.add("Anchor at bottom left", vec3(-1, -1), anchor = vec2(-1, -1))
149 textbuffer.add("Anchor at bottom right", vec3(1, -1), anchor = vec2(1, -1))
150
151 textbuffer.add(
152 "Mutiline text\nLeft aligned\nCool!", vec3(-0.5, -0.5), alignment = Left
153 )
154 textbuffer.add(
155 "Mutiline text\nCenter aligned\nCool!!", vec3(0, -0.5), alignment = Center
156 )
157 textbuffer.add(
158 "Mutiline text\nRight aligned\nCool!!!", vec3(0.5, -0.5), alignment = Right
159 )
160
161 textbuffer.updateAllGPUBuffers(flush = true)
162 162
163 withNextFrame(framebuffer, commandbuffer): 163 withNextFrame(framebuffer, commandbuffer):
164 bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline) 164 bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline)
165 withRenderPass( 165 withRenderPass(
166 vulkan.swapchain.renderPass, 166 vulkan.swapchain.renderPass,
188 188
189 assignBuffers(renderdata, font.descriptorSet) 189 assignBuffers(renderdata, font.descriptorSet)
190 uploadImages(renderdata, font.descriptorSet) 190 uploadImages(renderdata, font.descriptorSet)
191 initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet) 191 initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet)
192 192
193 var textbuffer = font.initTextBuffer(1000, baseScale = 0.1) 193 var textbuffer = font.initTextBuffer(3000, baseScale = 0.1)
194 assignBuffers(renderdata, textbuffer) 194 assignBuffers(renderdata, textbuffer)
195 195
196 var labels: seq[Textbox] 196 for i in 0 ..< 1000:
197 var positions = newSeq[Vec3f](100) 197 discard textbuffer.add(
198 var colors = newSeq[Vec4f](100) 198 $i,
199 var scales = newSeq[Vec2f](100) 199 vec3(rand(-0.8 .. 0.8), rand(-0.8 .. 0.8), rand(-0.1 .. 0.1)),
200 for i in 0 ..< 100: 200 color =
201 positions[i] = vec3(rand(-0.5 .. 0.5), rand(-0.5 .. 0.5), rand(-0.1 .. 0.1)) 201 vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)),
202 colors[i] = 202 scale = rand(0.5'f32 .. 1.5'f32),
203 vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)) 203 )
204 scales[i] = vec2(rand(0.5'f32 .. 1.5'f32), rand(0.5'f32 .. 1.5'f32)) 204
205 labels.add initTextbox(renderdata, pipeline.layout(0), font, 0.001, $i) 205 var start = getMonoTime()
206 206 var last = start
207 var start = getMonoTime() 207 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
208 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 208 let n = getMonoTime()
209 textbuffer.reset() 209 echo (n - last).inMicroseconds() / 1000
210 withNextFrame(framebuffer, commandbuffer): 210 last = n
211 withNextFrame(framebuffer, commandbuffer):
212 if windowWasResized():
213 textbuffer.refresh()
211 bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline) 214 bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline)
212 withRenderPass( 215 withRenderPass(
213 vulkan.swapchain.renderPass, 216 vulkan.swapchain.renderPass,
214 framebuffer, 217 framebuffer,
215 commandbuffer, 218 commandbuffer,
224 checkVkResult vkDeviceWaitIdle(vulkan.device) 227 checkVkResult vkDeviceWaitIdle(vulkan.device)
225 destroyPipeline(pipeline) 228 destroyPipeline(pipeline)
226 destroyRenderData(renderdata) 229 destroyRenderData(renderdata)
227 230
228 when isMainModule: 231 when isMainModule:
229 var time = 100'f32 232 var time = 1'f32
230 initVulkan() 233 initVulkan()
231 234
232 for depthBuffer in [true, false]: 235 for depthBuffer in [true, false]:
233 var renderpass = createDirectPresentationRenderPass(depthBuffer = depthBuffer) 236 var renderpass = createDirectPresentationRenderPass(depthBuffer = depthBuffer)
234 setupSwapchain(renderpass = renderpass) 237 setupSwapchain(renderpass = renderpass)
235 238
236 # tests a simple triangle with minimalistic shader and vertex format 239 # tests a simple triangle with minimalistic shader and vertex format
237 # test_01_static_label(time) 240 test_01_static_label(time)
238 # test_02_multi_counter(time) 241 test_02_multi_counter(time)
239 test_03_layouting(time) 242 test_03_layouting(time)
240 # test_04_lots_of_texts(time) 243 test_04_lots_of_texts(time)
241 244
242 checkVkResult vkDeviceWaitIdle(vulkan.device) 245 checkVkResult vkDeviceWaitIdle(vulkan.device)
243 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) 246 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil)
244 clearSwapchain() 247 clearSwapchain()
245 248