Mercurial > games > semicongine
comparison tests/test_text.nim @ 1423:3b8a736c45a7
did: put almost all global state into a single struct
author | sam <sam@basx.dev> |
---|---|
date | Thu, 09 Jan 2025 23:03:47 +0700 |
parents | 5e5a3311ca44 |
children | 676fc13685a9 |
comparison
equal
deleted
inserted
replaced
1422:6f0c1b347403 | 1423:3b8a736c45a7 |
---|---|
13 | 13 |
14 const MAX_CODEPOINTS = 200 | 14 const MAX_CODEPOINTS = 200 |
15 const FONTNAME = "Overhaul.ttf" | 15 const FONTNAME = "Overhaul.ttf" |
16 # const FONTNAME = "DejaVuSans.ttf" | 16 # const FONTNAME = "DejaVuSans.ttf" |
17 | 17 |
18 proc test_01_static_label(time: float32) = | 18 proc test_01_static_label(time: float32, renderPass: RenderPass) = |
19 var font = loadFont[MAX_CODEPOINTS](FONTNAME, lineHeightPixels = 200) | 19 var font = loadFont[MAX_CODEPOINTS](FONTNAME, lineHeightPixels = 200) |
20 var renderdata = initRenderData() | 20 var renderdata = initRenderData() |
21 var pipeline = createPipeline( | 21 var pipeline = createPipeline(GlyphShader[MAX_CODEPOINTS](), renderPass = renderPass) |
22 GlyphShader[MAX_CODEPOINTS](), renderPass = vulkan.swapchain.renderPass | |
23 ) | |
24 var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1) | 22 var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1) |
25 | 23 |
26 font.upload(renderdata) | 24 font.upload(renderdata) |
27 font.addToPipeline(renderdata, pipeline) | 25 font.addToPipeline(renderdata, pipeline) |
28 | 26 |
29 # small drop-shadow | 27 # small drop-shadow |
30 discard textbuffer.add( | 28 discard textbuffer.add( |
31 "Hello semicongine!", | 29 "Hello semicongine!", |
32 vec3(0.009, -0.009 * getAspectRatio(), 0.002), | 30 vec3(0.009, -0.009 * getAspectRatio(), 0.2), |
33 color = vec4(0.02, 0.02, 0.02, 1), | 31 color = vec4(0.02, 0.02, 0.02, 1), |
34 scale = 1.01, | 32 scale = 1.01, |
35 ) | 33 ) |
36 discard textbuffer.add("Hello semicongine!", vec3(0, 0, 0)) | 34 discard textbuffer.add("Hello semicongine!", vec3(0, 0, 0.1)) |
37 | 35 |
38 var start = getMonoTime() | 36 var start = getMonoTime() |
39 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 37 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
40 let t = getMonoTime() | 38 let t = getMonoTime() |
41 if windowWasResized(): | 39 if windowWasResized(): |
42 textbuffer.refresh() | 40 textbuffer.refresh() |
43 | 41 |
44 withNextFrame(framebuffer, commandbuffer): | 42 withNextFrame(framebuffer, commandbuffer): |
45 font.bindTo(pipeline, commandbuffer) | 43 font.bindTo(pipeline, commandbuffer) |
46 withRenderPass( | 44 withRenderPass( |
47 vulkan.swapchain.renderPass, | 45 renderPass, |
48 framebuffer, | 46 framebuffer, |
49 commandbuffer, | 47 commandbuffer, |
50 vulkan.swapchain.width, | 48 frameWidth(), |
51 vulkan.swapchain.height, | 49 frameHeight(), |
52 vec4(0, 0, 0, 0), | 50 vec4(0, 0, 0, 0), |
53 ): | 51 ): |
54 withPipeline(commandbuffer, pipeline): | 52 withPipeline(commandbuffer, pipeline): |
55 renderTextBuffer(commandbuffer, pipeline, textbuffer) | 53 renderTextBuffer(commandbuffer, pipeline, textbuffer) |
56 | 54 |
57 # cleanup | 55 # cleanup |
58 checkVkResult vkDeviceWaitIdle(vulkan.device) | 56 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
59 destroyPipeline(pipeline) | 57 destroyPipeline(pipeline) |
60 destroyRenderData(renderdata) | 58 destroyRenderData(renderdata) |
61 | 59 |
62 proc test_02_multi_counter(time: float32) = | 60 proc test_02_multi_counter(time: float32, renderPass: RenderPass) = |
63 var font1 = loadFont[MAX_CODEPOINTS]("Overhaul.ttf", lineHeightPixels = 40) | 61 var font1 = loadFont[MAX_CODEPOINTS]("Overhaul.ttf", lineHeightPixels = 40) |
64 var font2 = loadFont[MAX_CODEPOINTS]("Overhaul.ttf", lineHeightPixels = 160) | 62 var font2 = loadFont[MAX_CODEPOINTS]("Overhaul.ttf", lineHeightPixels = 160) |
65 var font3 = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) | 63 var font3 = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) |
66 var renderdata = initRenderData() | 64 var renderdata = initRenderData() |
67 | 65 |
68 var pipeline = createPipeline( | 66 var pipeline = createPipeline(GlyphShader[MAX_CODEPOINTS](), renderPass = renderPass) |
69 GlyphShader[MAX_CODEPOINTS](), renderPass = vulkan.swapchain.renderPass | |
70 ) | |
71 | 67 |
72 font1.upload(renderdata) | 68 font1.upload(renderdata) |
73 font2.upload(renderdata) | 69 font2.upload(renderdata) |
74 font3.upload(renderdata) | 70 font3.upload(renderdata) |
75 font1.addToPipeline(renderdata, pipeline) | 71 font1.addToPipeline(renderdata, pipeline) |
99 textbuffer2.refresh() | 95 textbuffer2.refresh() |
100 textbuffer3.refresh() | 96 textbuffer3.refresh() |
101 | 97 |
102 withNextFrame(framebuffer, commandbuffer): | 98 withNextFrame(framebuffer, commandbuffer): |
103 withRenderPass( | 99 withRenderPass( |
104 vulkan.swapchain.renderPass, | 100 renderPass, |
105 framebuffer, | 101 framebuffer, |
106 commandbuffer, | 102 commandbuffer, |
107 vulkan.swapchain.width, | 103 frameWidth(), |
108 vulkan.swapchain.height, | 104 frameHeight(), |
109 vec4(0, 0, 0, 0), | 105 vec4(0, 0, 0, 0), |
110 ): | 106 ): |
111 withPipeline(commandbuffer, pipeline): | 107 withPipeline(commandbuffer, pipeline): |
112 bindDescriptorSet(commandbuffer, font1.descriptorSet, 3, pipeline) | 108 bindDescriptorSet(commandbuffer, font1.descriptorSet, 3, pipeline) |
113 renderTextBuffer(commandbuffer, pipeline, textbuffer1) | 109 renderTextBuffer(commandbuffer, pipeline, textbuffer1) |
115 renderTextBuffer(commandbuffer, pipeline, textbuffer2) | 111 renderTextBuffer(commandbuffer, pipeline, textbuffer2) |
116 bindDescriptorSet(commandbuffer, font3.descriptorSet, 3, pipeline) | 112 bindDescriptorSet(commandbuffer, font3.descriptorSet, 3, pipeline) |
117 renderTextBuffer(commandbuffer, pipeline, textbuffer3) | 113 renderTextBuffer(commandbuffer, pipeline, textbuffer3) |
118 | 114 |
119 # cleanup | 115 # cleanup |
120 checkVkResult vkDeviceWaitIdle(vulkan.device) | 116 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
121 destroyPipeline(pipeline) | 117 destroyPipeline(pipeline) |
122 destroyRenderData(renderdata) | 118 destroyRenderData(renderdata) |
123 | 119 |
124 proc test_03_layouting(time: float32) = | 120 proc test_03_layouting(time: float32, renderPass: RenderPass) = |
125 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) | 121 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) |
126 var renderdata = initRenderData() | 122 var renderdata = initRenderData() |
127 | 123 |
128 var pipeline = createPipeline( | 124 var pipeline = createPipeline(GlyphShader[MAX_CODEPOINTS](), renderPass = renderPass) |
129 GlyphShader[MAX_CODEPOINTS](), renderPass = vulkan.swapchain.renderPass | |
130 ) | |
131 | 125 |
132 font.upload(renderdata) | 126 font.upload(renderdata) |
133 font.addToPipeline(renderdata, pipeline) | 127 font.addToPipeline(renderdata, pipeline) |
134 | 128 |
135 var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1) | 129 var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1) |
157 textbuffer.refresh() | 151 textbuffer.refresh() |
158 | 152 |
159 withNextFrame(framebuffer, commandbuffer): | 153 withNextFrame(framebuffer, commandbuffer): |
160 bindDescriptorSet(commandbuffer, font.descriptorSet, 3, pipeline) | 154 bindDescriptorSet(commandbuffer, font.descriptorSet, 3, pipeline) |
161 withRenderPass( | 155 withRenderPass( |
162 vulkan.swapchain.renderPass, | 156 renderPass, |
163 framebuffer, | 157 framebuffer, |
164 commandbuffer, | 158 commandbuffer, |
165 vulkan.swapchain.width, | 159 frameWidth(), |
166 vulkan.swapchain.height, | 160 frameHeight(), |
167 vec4(0, 0, 0, 0), | 161 vec4(0, 0, 0, 0), |
168 ): | 162 ): |
169 withPipeline(commandbuffer, pipeline): | 163 withPipeline(commandbuffer, pipeline): |
170 renderTextBuffer(commandbuffer, pipeline, textbuffer) | 164 renderTextBuffer(commandbuffer, pipeline, textbuffer) |
171 | 165 |
172 # cleanup | 166 # cleanup |
173 checkVkResult vkDeviceWaitIdle(vulkan.device) | 167 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
174 destroyPipeline(pipeline) | 168 destroyPipeline(pipeline) |
175 destroyRenderData(renderdata) | 169 destroyRenderData(renderdata) |
176 | 170 |
177 proc test_04_lots_of_texts(time: float32) = | 171 proc test_04_lots_of_texts(time: float32, renderPass: RenderPass) = |
178 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) | 172 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) |
179 var renderdata = initRenderData() | 173 var renderdata = initRenderData() |
180 | 174 |
181 var pipeline = createPipeline( | 175 var pipeline = createPipeline(GlyphShader[MAX_CODEPOINTS](), renderPass = renderPass) |
182 GlyphShader[MAX_CODEPOINTS](), renderPass = vulkan.swapchain.renderPass | |
183 ) | |
184 | 176 |
185 font.upload(renderdata) | 177 font.upload(renderdata) |
186 font.addToPipeline(renderdata, pipeline) | 178 font.addToPipeline(renderdata, pipeline) |
187 | 179 |
188 var textbuffer = font.initTextBuffer(3000, renderdata, baseScale = 0.1) | 180 var textbuffer = font.initTextBuffer(3000, renderdata, baseScale = 0.1) |
189 | 181 |
190 for i in 0 ..< 1000: | 182 for i in 0 ..< 1000: |
191 discard textbuffer.add( | 183 discard textbuffer.add( |
192 $i, | 184 $i, |
193 vec3(rand(-0.8 .. 0.8), rand(-0.8 .. 0.8), rand(-0.1 .. 0.1)), | 185 vec3(rand(-0.8 .. 0.8), rand(-0.8 .. 0.8), rand(0.1 .. 0.2)), |
194 color = | 186 color = |
195 vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)), | 187 vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)), |
196 scale = rand(0.5'f32 .. 1.5'f32), | 188 scale = rand(0.5'f32 .. 1.5'f32), |
197 ) | 189 ) |
198 | 190 |
205 withNextFrame(framebuffer, commandbuffer): | 197 withNextFrame(framebuffer, commandbuffer): |
206 if windowWasResized(): | 198 if windowWasResized(): |
207 textbuffer.refresh() | 199 textbuffer.refresh() |
208 bindDescriptorSet(commandbuffer, font.descriptorSet, 3, pipeline) | 200 bindDescriptorSet(commandbuffer, font.descriptorSet, 3, pipeline) |
209 withRenderPass( | 201 withRenderPass( |
210 vulkan.swapchain.renderPass, | 202 renderPass, |
211 framebuffer, | 203 framebuffer, |
212 commandbuffer, | 204 commandbuffer, |
213 vulkan.swapchain.width, | 205 frameWidth(), |
214 vulkan.swapchain.height, | 206 frameHeight(), |
215 vec4(0, 0, 0, 0), | 207 vec4(0, 0, 0, 0), |
216 ): | 208 ): |
217 withPipeline(commandbuffer, pipeline): | 209 withPipeline(commandbuffer, pipeline): |
218 renderTextBuffer(commandbuffer, pipeline, textbuffer) | 210 renderTextBuffer(commandbuffer, pipeline, textbuffer) |
219 | 211 |
220 # cleanup | 212 # cleanup |
221 checkVkResult vkDeviceWaitIdle(vulkan.device) | 213 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
222 destroyPipeline(pipeline) | 214 destroyPipeline(pipeline) |
223 destroyRenderData(renderdata) | 215 destroyRenderData(renderdata) |
224 | 216 |
225 when isMainModule: | 217 when isMainModule: |
226 var time = 3'f32 | 218 var time = 3'f32 |
227 initVulkan() | 219 initEngine("Test text") |
228 | 220 |
229 for depthBuffer in [true, false]: | 221 # for depthBuffer in [true, false]: |
230 var renderpass = createDirectPresentationRenderPass(depthBuffer = depthBuffer) | 222 var renderpass = createDirectPresentationRenderPass(depthBuffer = true) |
231 setupSwapchain(renderpass = renderpass) | 223 setupSwapchain(renderpass = renderpass) |
232 | 224 |
233 # tests a simple triangle with minimalistic shader and vertex format | 225 # tests a simple triangle with minimalistic shader and vertex format |
234 test_01_static_label(time) | 226 test_01_static_label(time, renderpass) |
235 test_02_multi_counter(time) | 227 test_02_multi_counter(time, renderpass) |
236 test_03_layouting(time) | 228 test_03_layouting(time, renderpass) |
237 test_04_lots_of_texts(time) | 229 test_04_lots_of_texts(time, renderpass) |
238 | 230 |
239 checkVkResult vkDeviceWaitIdle(vulkan.device) | 231 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
240 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) | 232 destroyRenderPass(renderpass) |
241 clearSwapchain() | 233 clearSwapchain() |
242 | 234 |
243 destroyVulkan() | 235 destroyVulkan() |