Mercurial > games > semicongine
comparison tests/test_text.nim @ 1283:0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
author | sam <sam@basx.dev> |
---|---|
date | Mon, 29 Jul 2024 16:50:50 +0700 |
parents | 3308b88e53a6 |
children | 5de466f5f087 |
comparison
equal
deleted
inserted
replaced
1282:3308b88e53a6 | 1283:0369fa1ffbd9 |
---|---|
8 import std/random | 8 import std/random |
9 | 9 |
10 import ../semicongine | 10 import ../semicongine |
11 | 11 |
12 proc test_01_static_label(time: float32) = | 12 proc test_01_static_label(time: float32) = |
13 var renderdata = InitRenderData() | 13 var renderdata = initRenderData() |
14 | 14 |
15 var pipeline = CreatePipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass) | 15 var pipeline = createPipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass) |
16 | 16 |
17 var font = loadFont("Overhaul.ttf", lineHeightPixels = 160) | 17 var font = loadFont("Overhaul.ttf", lineHeightPixels = 160) |
18 var label1 = InitTextbox( | 18 var label1 = initTextbox( |
19 renderdata, | 19 renderdata, |
20 pipeline.descriptorSetLayouts[0], | 20 pipeline.descriptorSetLayouts[0], |
21 font, | 21 font, |
22 "Hello semicongine!", | 22 "Hello semicongine!", |
23 color = vec4(1, 1, 1, 1), | 23 color = vec4(1, 1, 1, 1), |
24 scale = 0.0005, | 24 scale = 0.0005, |
25 ) | 25 ) |
26 | 26 |
27 var start = getMonoTime() | 27 var start = getMonoTime() |
28 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 28 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
29 label1.Refresh() | 29 label1.refresh() |
30 WithNextFrame(framebuffer, commandbuffer): | 30 withNextFrame(framebuffer, commandbuffer): |
31 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): | 31 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): |
32 WithPipeline(commandbuffer, pipeline): | 32 withPipeline(commandbuffer, pipeline): |
33 Render(label1, commandbuffer, pipeline) | 33 render(label1, commandbuffer, pipeline) |
34 | 34 |
35 # cleanup | 35 # cleanup |
36 checkVkResult vkDeviceWaitIdle(vulkan.device) | 36 checkVkResult vkDeviceWaitIdle(vulkan.device) |
37 DestroyPipeline(pipeline) | 37 destroyPipeline(pipeline) |
38 DestroyRenderData(renderdata) | 38 destroyRenderData(renderdata) |
39 | 39 |
40 proc test_02_multiple_animated(time: float32) = | 40 proc test_02_multiple_animated(time: float32) = |
41 var renderdata = InitRenderData() | 41 var renderdata = initRenderData() |
42 | 42 |
43 var pipeline = CreatePipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass) | 43 var pipeline = createPipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass) |
44 | 44 |
45 var font1 = loadFont("Overhaul.ttf", lineHeightPixels = 40) | 45 var font1 = loadFont("Overhaul.ttf", lineHeightPixels = 40) |
46 var font2 = loadFont("Overhaul.ttf", lineHeightPixels = 160) | 46 var font2 = loadFont("Overhaul.ttf", lineHeightPixels = 160) |
47 var font3 = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) | 47 var font3 = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) |
48 var labels = [ | 48 var labels = [ |
49 InitTextbox( | 49 initTextbox( |
50 renderdata, | 50 renderdata, |
51 pipeline.descriptorSetLayouts[0], | 51 pipeline.descriptorSetLayouts[0], |
52 font1, | 52 font1, |
53 " 0", | 53 " 0", |
54 color = vec4(0, 1, 1, 1), | 54 color = vec4(0, 1, 1, 1), |
55 scale = 0.004, | 55 scale = 0.004, |
56 position = vec3(-0.3, 0.5) | 56 position = vec3(-0.3, 0.5) |
57 ), | 57 ), |
58 InitTextbox( | 58 initTextbox( |
59 renderdata, | 59 renderdata, |
60 pipeline.descriptorSetLayouts[0], | 60 pipeline.descriptorSetLayouts[0], |
61 font2, | 61 font2, |
62 " 1", | 62 " 1", |
63 color = vec4(1, 0, 1, 1), | 63 color = vec4(1, 0, 1, 1), |
64 scale = 0.001, | 64 scale = 0.001, |
65 position = vec3(0, 0) | 65 position = vec3(0, 0) |
66 ), | 66 ), |
67 InitTextbox( | 67 initTextbox( |
68 renderdata, | 68 renderdata, |
69 pipeline.descriptorSetLayouts[0], | 69 pipeline.descriptorSetLayouts[0], |
70 font3, | 70 font3, |
71 " 2", | 71 " 2", |
72 color = vec4(1, 1, 0, 1), | 72 color = vec4(1, 1, 0, 1), |
78 var start = getMonoTime() | 78 var start = getMonoTime() |
79 var p = 0 | 79 var p = 0 |
80 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 80 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
81 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time | 81 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time |
82 for i in 0 ..< labels.len: | 82 for i in 0 ..< labels.len: |
83 var c = labels[i].Color | 83 var c = labels[i].color |
84 c[i] = progress | 84 c[i] = progress |
85 labels[i].Color = c | 85 labels[i].color = c |
86 labels[i].Scale = labels[i].Scale * (1.0 + (i + 1).float * 0.001) | 86 labels[i].scale = labels[i].scale * (1.0 + (i + 1).float * 0.001) |
87 labels[i].Position = labels[i].Position + vec3(0.001 * (i.float - 1'f)) | 87 labels[i].position = labels[i].position + vec3(0.001 * (i.float - 1'f)) |
88 labels[i].text = $(p + i) | 88 labels[i].text = $(p + i) |
89 labels[i].Refresh() | 89 labels[i].refresh() |
90 inc p | 90 inc p |
91 WithNextFrame(framebuffer, commandbuffer): | 91 withNextFrame(framebuffer, commandbuffer): |
92 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): | 92 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): |
93 WithPipeline(commandbuffer, pipeline): | 93 withPipeline(commandbuffer, pipeline): |
94 for label in labels: | 94 for label in labels: |
95 Render(label, commandbuffer, pipeline) | 95 render(label, commandbuffer, pipeline) |
96 | 96 |
97 # cleanup | 97 # cleanup |
98 checkVkResult vkDeviceWaitIdle(vulkan.device) | 98 checkVkResult vkDeviceWaitIdle(vulkan.device) |
99 DestroyPipeline(pipeline) | 99 destroyPipeline(pipeline) |
100 DestroyRenderData(renderdata) | 100 destroyRenderData(renderdata) |
101 | 101 |
102 proc test_03_layouting(time: float32) = | 102 proc test_03_layouting(time: float32) = |
103 var renderdata = InitRenderData() | 103 var renderdata = initRenderData() |
104 | 104 |
105 var pipeline = CreatePipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass) | 105 var pipeline = createPipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass) |
106 | 106 |
107 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 40) | 107 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 40) |
108 var labels: seq[Textbox] | 108 var labels: seq[Textbox] |
109 | 109 |
110 for horizontal in HorizontalAlignment: | 110 for horizontal in HorizontalAlignment: |
111 labels.add InitTextbox( | 111 labels.add initTextbox( |
112 renderdata, | 112 renderdata, |
113 pipeline.descriptorSetLayouts[0], | 113 pipeline.descriptorSetLayouts[0], |
114 font, | 114 font, |
115 $horizontal & " aligned", | 115 $horizontal & " aligned", |
116 color = vec4(1, 1, 1, 1), | 116 color = vec4(1, 1, 1, 1), |
117 scale = 0.001, | 117 scale = 0.001, |
118 position = vec3(0, 0.9 - (horizontal.float * 0.15)), | 118 position = vec3(0, 0.9 - (horizontal.float * 0.15)), |
119 horizontalAlignment = horizontal, | 119 horizontalAlignment = horizontal, |
120 ) | 120 ) |
121 for vertical in VerticalAlignment: | 121 for vertical in VerticalAlignment: |
122 labels.add InitTextbox( | 122 labels.add initTextbox( |
123 renderdata, | 123 renderdata, |
124 pipeline.descriptorSetLayouts[0], | 124 pipeline.descriptorSetLayouts[0], |
125 font, | 125 font, |
126 $vertical & " aligned", | 126 $vertical & " aligned", |
127 color = vec4(1, 1, 1, 1), | 127 color = vec4(1, 1, 1, 1), |
128 scale = 0.001, | 128 scale = 0.001, |
129 position = vec3(-0.35 + (vertical.float * 0.35), 0.3), | 129 position = vec3(-0.35 + (vertical.float * 0.35), 0.3), |
130 verticalAlignment = vertical, | 130 verticalAlignment = vertical, |
131 ) | 131 ) |
132 labels.add InitTextbox( | 132 labels.add initTextbox( |
133 renderdata, | 133 renderdata, |
134 pipeline.descriptorSetLayouts[0], | 134 pipeline.descriptorSetLayouts[0], |
135 font, | 135 font, |
136 """Paragraph | 136 """Paragraph |
137 This is a somewhat longer paragraph with a few newlines and a maximum width of 0.2. | 137 This is a somewhat longer paragraph with a few newlines and a maximum width of 0.2. |
147 | 147 |
148 | 148 |
149 var start = getMonoTime() | 149 var start = getMonoTime() |
150 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 150 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
151 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time | 151 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time |
152 WithNextFrame(framebuffer, commandbuffer): | 152 withNextFrame(framebuffer, commandbuffer): |
153 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): | 153 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): |
154 WithPipeline(commandbuffer, pipeline): | 154 withPipeline(commandbuffer, pipeline): |
155 for label in labels: | 155 for label in labels: |
156 Render(label, commandbuffer, pipeline) | 156 render(label, commandbuffer, pipeline) |
157 | 157 |
158 # cleanup | 158 # cleanup |
159 checkVkResult vkDeviceWaitIdle(vulkan.device) | 159 checkVkResult vkDeviceWaitIdle(vulkan.device) |
160 DestroyPipeline(pipeline) | 160 destroyPipeline(pipeline) |
161 DestroyRenderData(renderdata) | 161 destroyRenderData(renderdata) |
162 | 162 |
163 proc test_04_lots_of_texts(time: float32) = | 163 proc test_04_lots_of_texts(time: float32) = |
164 var renderdata = InitRenderData() | 164 var renderdata = initRenderData() |
165 | 165 |
166 var pipeline = CreatePipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass) | 166 var pipeline = createPipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass) |
167 | 167 |
168 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) | 168 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) |
169 var labels: seq[Textbox] | 169 var labels: seq[Textbox] |
170 for i in 0 ..< 100: | 170 for i in 0 ..< 100: |
171 labels.add InitTextbox( | 171 labels.add initTextbox( |
172 renderdata, | 172 renderdata, |
173 pipeline.descriptorSetLayouts[0], | 173 pipeline.descriptorSetLayouts[0], |
174 font, | 174 font, |
175 $i, | 175 $i, |
176 color = vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)), | 176 color = vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)), |
177 scale = rand(0.0002 .. 0.002), | 177 scale = rand(0.0002 .. 0.002), |
178 position = vec3(rand(-0.5 .. 0.5), rand(-0.5 .. 0.5), rand(-0.1 .. 0.1)) | 178 position = vec3(rand(-0.5 .. 0.5), rand(-0.5 .. 0.5), rand(-0.1 .. 0.1)) |
179 ) | 179 ) |
180 labels = labels.sortedByIt(-it.Position.z) | 180 labels = labels.sortedByIt(-it.position.z) |
181 | 181 |
182 var start = getMonoTime() | 182 var start = getMonoTime() |
183 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 183 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
184 for l in labels.mitems: | 184 for l in labels.mitems: |
185 l.Refresh() | 185 l.refresh() |
186 WithNextFrame(framebuffer, commandbuffer): | 186 withNextFrame(framebuffer, commandbuffer): |
187 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): | 187 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): |
188 WithPipeline(commandbuffer, pipeline): | 188 withPipeline(commandbuffer, pipeline): |
189 for l in labels: | 189 for l in labels: |
190 Render(l, commandbuffer, pipeline) | 190 render(l, commandbuffer, pipeline) |
191 | 191 |
192 # cleanup | 192 # cleanup |
193 checkVkResult vkDeviceWaitIdle(vulkan.device) | 193 checkVkResult vkDeviceWaitIdle(vulkan.device) |
194 DestroyPipeline(pipeline) | 194 destroyPipeline(pipeline) |
195 DestroyRenderData(renderdata) | 195 destroyRenderData(renderdata) |
196 | 196 |
197 when isMainModule: | 197 when isMainModule: |
198 var time = 1'f32 | 198 var time = 1'f32 |
199 InitVulkan() | 199 initVulkan() |
200 | 200 |
201 for depthBuffer in [true, false]: | 201 for depthBuffer in [true, false]: |
202 var renderpass = CreateDirectPresentationRenderPass(depthBuffer = depthBuffer) | 202 var renderpass = createDirectPresentationRenderPass(depthBuffer = depthBuffer) |
203 SetupSwapchain(renderpass = renderpass) | 203 setupSwapchain(renderpass = renderpass) |
204 | 204 |
205 # tests a simple triangle with minimalistic shader and vertex format | 205 # tests a simple triangle with minimalistic shader and vertex format |
206 test_01_static_label(time) | 206 test_01_static_label(time) |
207 test_02_multiple_animated(time) | 207 test_02_multiple_animated(time) |
208 test_03_layouting(time) | 208 test_03_layouting(time) |
209 test_04_lots_of_texts(time) | 209 test_04_lots_of_texts(time) |
210 | 210 |
211 checkVkResult vkDeviceWaitIdle(vulkan.device) | 211 checkVkResult vkDeviceWaitIdle(vulkan.device) |
212 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) | 212 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) |
213 ClearSwapchain() | 213 clearSwapchain() |
214 | 214 |
215 DestroyVulkan() | 215 destroyVulkan() |