Mercurial > games > semicongine
comparison tests/test_text.nim @ 1332:df3c075e5dea
did: formatting
| author | sam <sam@basx.dev> |
|---|---|
| date | Thu, 22 Aug 2024 18:31:59 +0700 |
| parents | ad09d41abd1e |
| children | f2ff6f624932 |
comparison
equal
deleted
inserted
replaced
| 1331:1abdd42f5cfe | 1332:df3c075e5dea |
|---|---|
| 7 import std/options | 7 import std/options |
| 8 import std/random | 8 import std/random |
| 9 | 9 |
| 10 import ../semicongine | 10 import ../semicongine |
| 11 | 11 |
| 12 type | 12 type FontDS = object |
| 13 FontDS = object | 13 fontAtlas: Image[Gray] |
| 14 fontAtlas: Image[Gray] | |
| 15 | 14 |
| 16 proc test_01_static_label(time: float32) = | 15 proc test_01_static_label(time: float32) = |
| 17 var font = loadFont("Overhaul.ttf", lineHeightPixels = 160) | 16 var font = loadFont("Overhaul.ttf", lineHeightPixels = 160) |
| 18 var renderdata = initRenderData() | 17 var renderdata = initRenderData() |
| 19 var pipeline = createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | 18 var pipeline = |
| 19 createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | |
| 20 | 20 |
| 21 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas)) | 21 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas)) |
| 22 uploadImages(renderdata, ds) | 22 uploadImages(renderdata, ds) |
| 23 initDescriptorSet( | 23 initDescriptorSet(renderdata, pipeline.layout(0), ds) |
| 24 renderdata, | 24 |
| 25 pipeline.layout(0), | 25 var label1 = |
| 26 ds, | 26 initTextbox(renderdata, pipeline.layout(0), font, 0.0005, "Hello semicongine!") |
| 27 ) | |
| 28 | |
| 29 var label1 = initTextbox( | |
| 30 renderdata, | |
| 31 pipeline.layout(0), | |
| 32 font, | |
| 33 0.0005, | |
| 34 "Hello semicongine!", | |
| 35 ) | |
| 36 | 27 |
| 37 var start = getMonoTime() | 28 var start = getMonoTime() |
| 38 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 29 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 39 label1.refresh() | 30 label1.refresh() |
| 40 withNextFrame(framebuffer, commandbuffer): | 31 withNextFrame(framebuffer, commandbuffer): |
| 41 bindDescriptorSet(commandbuffer, ds, 0, pipeline) | 32 bindDescriptorSet(commandbuffer, ds, 0, pipeline) |
| 42 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): | 33 withRenderPass( |
| 34 vulkan.swapchain.renderPass, | |
| 35 framebuffer, | |
| 36 commandbuffer, | |
| 37 vulkan.swapchain.width, | |
| 38 vulkan.swapchain.height, | |
| 39 vec4(0, 0, 0, 0), | |
| 40 ): | |
| 43 withPipeline(commandbuffer, pipeline): | 41 withPipeline(commandbuffer, pipeline): |
| 44 render(commandbuffer, pipeline, label1, vec3(), vec4(1, 1, 1, 1)) | 42 render(commandbuffer, pipeline, label1, vec3(), vec4(1, 1, 1, 1)) |
| 45 | 43 |
| 46 # cleanup | 44 # cleanup |
| 47 checkVkResult vkDeviceWaitIdle(vulkan.device) | 45 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 52 var font1 = loadFont("Overhaul.ttf", lineHeightPixels = 40) | 50 var font1 = loadFont("Overhaul.ttf", lineHeightPixels = 40) |
| 53 var font2 = loadFont("Overhaul.ttf", lineHeightPixels = 160) | 51 var font2 = loadFont("Overhaul.ttf", lineHeightPixels = 160) |
| 54 var font3 = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) | 52 var font3 = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) |
| 55 var renderdata = initRenderData() | 53 var renderdata = initRenderData() |
| 56 | 54 |
| 57 var pipeline = createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | 55 var pipeline = |
| 56 createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | |
| 58 | 57 |
| 59 var ds1 = asDescriptorSetData(FontDS(fontAtlas: font1.fontAtlas)) | 58 var ds1 = asDescriptorSetData(FontDS(fontAtlas: font1.fontAtlas)) |
| 60 uploadImages(renderdata, ds1) | 59 uploadImages(renderdata, ds1) |
| 61 initDescriptorSet(renderdata, pipeline.layout(0), ds1) | 60 initDescriptorSet(renderdata, pipeline.layout(0), ds1) |
| 62 | 61 |
| 67 var ds3 = asDescriptorSetData(FontDS(fontAtlas: font3.fontAtlas)) | 66 var ds3 = asDescriptorSetData(FontDS(fontAtlas: font3.fontAtlas)) |
| 68 uploadImages(renderdata, ds3) | 67 uploadImages(renderdata, ds3) |
| 69 initDescriptorSet(renderdata, pipeline.layout(0), ds3) | 68 initDescriptorSet(renderdata, pipeline.layout(0), ds3) |
| 70 | 69 |
| 71 var labels = [ | 70 var labels = [ |
| 72 initTextbox( | 71 initTextbox(renderdata, pipeline.layout(0), font1, 0.004, " 0"), |
| 73 renderdata, | 72 initTextbox(renderdata, pipeline.layout(0), font2, 0.001, " 1"), |
| 74 pipeline.layout(0), | 73 initTextbox(renderdata, pipeline.layout(0), font3, 0.001, " 2"), |
| 75 font1, | |
| 76 0.004, | |
| 77 " 0", | |
| 78 ), | |
| 79 initTextbox( | |
| 80 renderdata, | |
| 81 pipeline.layout(0), | |
| 82 font2, | |
| 83 0.001, | |
| 84 " 1", | |
| 85 ), | |
| 86 initTextbox( | |
| 87 renderdata, | |
| 88 pipeline.layout(0), | |
| 89 font3, | |
| 90 0.001, | |
| 91 " 2", | |
| 92 ) | |
| 93 ] | 74 ] |
| 94 | 75 |
| 95 var start = getMonoTime() | 76 var start = getMonoTime() |
| 96 var p = 0 | 77 var p = 0 |
| 97 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 78 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 99 for i in 0 ..< labels.len: | 80 for i in 0 ..< labels.len: |
| 100 labels[i].text = $(p + i) | 81 labels[i].text = $(p + i) |
| 101 labels[i].refresh() | 82 labels[i].refresh() |
| 102 inc p | 83 inc p |
| 103 withNextFrame(framebuffer, commandbuffer): | 84 withNextFrame(framebuffer, commandbuffer): |
| 104 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): | 85 withRenderPass( |
| 86 vulkan.swapchain.renderPass, | |
| 87 framebuffer, | |
| 88 commandbuffer, | |
| 89 vulkan.swapchain.width, | |
| 90 vulkan.swapchain.height, | |
| 91 vec4(0, 0, 0, 0), | |
| 92 ): | |
| 105 withPipeline(commandbuffer, pipeline): | 93 withPipeline(commandbuffer, pipeline): |
| 106 bindDescriptorSet(commandbuffer, ds1, 0, pipeline) | 94 bindDescriptorSet(commandbuffer, ds1, 0, pipeline) |
| 107 render( | 95 render( |
| 108 commandbuffer, | 96 commandbuffer, |
| 109 pipeline, | 97 pipeline, |
| 110 labels[0], | 98 labels[0], |
| 111 position=vec3(0 / labels.len, 0.1 + progress * 0.5), | 99 position = vec3(0 / labels.len, 0.1 + progress * 0.5), |
| 112 color=vec4(1, 1, 1, 1), | 100 color = vec4(1, 1, 1, 1), |
| 113 ) | 101 ) |
| 114 bindDescriptorSet(commandbuffer, ds2, 0, pipeline) | 102 bindDescriptorSet(commandbuffer, ds2, 0, pipeline) |
| 115 render( | 103 render( |
| 116 commandbuffer, | 104 commandbuffer, |
| 117 pipeline, | 105 pipeline, |
| 118 labels[1], | 106 labels[1], |
| 119 position=vec3(1 / labels.len, 0.1 + progress * 0.5), | 107 position = vec3(1 / labels.len, 0.1 + progress * 0.5), |
| 120 color=vec4(1, 1, 1, 1), | 108 color = vec4(1, 1, 1, 1), |
| 121 ) | 109 ) |
| 122 bindDescriptorSet(commandbuffer, ds3, 0, pipeline) | 110 bindDescriptorSet(commandbuffer, ds3, 0, pipeline) |
| 123 render( | 111 render( |
| 124 commandbuffer, | 112 commandbuffer, |
| 125 pipeline, | 113 pipeline, |
| 126 labels[2], | 114 labels[2], |
| 127 position=vec3(2 / labels.len, 0.1 + progress * 0.5), | 115 position = vec3(2 / labels.len, 0.1 + progress * 0.5), |
| 128 color=vec4(1, 1, 1, 1), | 116 color = vec4(1, 1, 1, 1), |
| 129 ) | 117 ) |
| 130 | 118 |
| 131 # cleanup | 119 # cleanup |
| 132 checkVkResult vkDeviceWaitIdle(vulkan.device) | 120 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 133 destroyPipeline(pipeline) | 121 destroyPipeline(pipeline) |
| 135 | 123 |
| 136 proc test_03_layouting(time: float32) = | 124 proc test_03_layouting(time: float32) = |
| 137 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 40) | 125 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 40) |
| 138 var renderdata = initRenderData() | 126 var renderdata = initRenderData() |
| 139 | 127 |
| 140 var pipeline = createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | 128 var pipeline = |
| 129 createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | |
| 141 | 130 |
| 142 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas)) | 131 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas)) |
| 143 uploadImages(renderdata, ds) | 132 uploadImages(renderdata, ds) |
| 144 initDescriptorSet( | 133 initDescriptorSet(renderdata, pipeline.layout(0), ds) |
| 145 renderdata, | |
| 146 pipeline.layout(0), | |
| 147 ds, | |
| 148 ) | |
| 149 | 134 |
| 150 var labels: seq[Textbox] | 135 var labels: seq[Textbox] |
| 151 | 136 |
| 152 for horizontal in HorizontalAlignment: | 137 for horizontal in HorizontalAlignment: |
| 153 labels.add initTextbox( | 138 labels.add initTextbox( |
| 184 var start = getMonoTime() | 169 var start = getMonoTime() |
| 185 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 170 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 186 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time | 171 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time |
| 187 withNextFrame(framebuffer, commandbuffer): | 172 withNextFrame(framebuffer, commandbuffer): |
| 188 bindDescriptorSet(commandbuffer, ds, 0, pipeline) | 173 bindDescriptorSet(commandbuffer, ds, 0, pipeline) |
| 189 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): | 174 withRenderPass( |
| 175 vulkan.swapchain.renderPass, | |
| 176 framebuffer, | |
| 177 commandbuffer, | |
| 178 vulkan.swapchain.width, | |
| 179 vulkan.swapchain.height, | |
| 180 vec4(0, 0, 0, 0), | |
| 181 ): | |
| 190 withPipeline(commandbuffer, pipeline): | 182 withPipeline(commandbuffer, pipeline): |
| 191 for i in 0 ..< labels.len: | 183 for i in 0 ..< labels.len: |
| 192 render(commandbuffer, pipeline, labels[i], vec3(0.5 - i.float32 * 0.1, 0.5 - i.float32 * 0.1), vec4(1, 1, 1, 1)) | 184 render( |
| 185 commandbuffer, | |
| 186 pipeline, | |
| 187 labels[i], | |
| 188 vec3(0.5 - i.float32 * 0.1, 0.5 - i.float32 * 0.1), | |
| 189 vec4(1, 1, 1, 1), | |
| 190 ) | |
| 193 | 191 |
| 194 # cleanup | 192 # cleanup |
| 195 checkVkResult vkDeviceWaitIdle(vulkan.device) | 193 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 196 destroyPipeline(pipeline) | 194 destroyPipeline(pipeline) |
| 197 destroyRenderData(renderdata) | 195 destroyRenderData(renderdata) |
| 198 | 196 |
| 199 proc test_04_lots_of_texts(time: float32) = | 197 proc test_04_lots_of_texts(time: float32) = |
| 200 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) | 198 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) |
| 201 var renderdata = initRenderData() | 199 var renderdata = initRenderData() |
| 202 | 200 |
| 203 var pipeline = createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | 201 var pipeline = |
| 202 createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | |
| 204 | 203 |
| 205 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas)) | 204 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas)) |
| 206 uploadImages(renderdata, ds) | 205 uploadImages(renderdata, ds) |
| 207 initDescriptorSet( | 206 initDescriptorSet(renderdata, pipeline.layout(0), ds) |
| 208 renderdata, | |
| 209 pipeline.layout(0), | |
| 210 ds, | |
| 211 ) | |
| 212 | 207 |
| 213 var labels: seq[Textbox] | 208 var labels: seq[Textbox] |
| 214 var positions = newSeq[Vec3f](100) | 209 var positions = newSeq[Vec3f](100) |
| 215 var colors = newSeq[Vec4f](100) | 210 var colors = newSeq[Vec4f](100) |
| 216 var scales = newSeq[Vec2f](100) | 211 var scales = newSeq[Vec2f](100) |
| 217 for i in 0 ..< 100: | 212 for i in 0 ..< 100: |
| 218 positions[i] = vec3(rand(-0.5 .. 0.5), rand(-0.5 .. 0.5), rand(-0.1 .. 0.1)) | 213 positions[i] = vec3(rand(-0.5 .. 0.5), rand(-0.5 .. 0.5), rand(-0.1 .. 0.1)) |
| 219 colors[i] = vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)) | 214 colors[i] = |
| 215 vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)) | |
| 220 scales[i] = vec2(rand(0.5'f32 .. 1.5'f32), rand(0.5'f32 .. 1.5'f32)) | 216 scales[i] = vec2(rand(0.5'f32 .. 1.5'f32), rand(0.5'f32 .. 1.5'f32)) |
| 221 labels.add initTextbox( | 217 labels.add initTextbox(renderdata, pipeline.layout(0), font, 0.001, $i) |
| 222 renderdata, | |
| 223 pipeline.layout(0), | |
| 224 font, | |
| 225 0.001, | |
| 226 $i, | |
| 227 ) | |
| 228 | 218 |
| 229 var start = getMonoTime() | 219 var start = getMonoTime() |
| 230 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 220 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 231 for l in labels.mitems: | 221 for l in labels.mitems: |
| 232 l.refresh() | 222 l.refresh() |
| 233 withNextFrame(framebuffer, commandbuffer): | 223 withNextFrame(framebuffer, commandbuffer): |
| 234 bindDescriptorSet(commandbuffer, ds, 0, pipeline) | 224 bindDescriptorSet(commandbuffer, ds, 0, pipeline) |
| 235 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): | 225 withRenderPass( |
| 226 vulkan.swapchain.renderPass, | |
| 227 framebuffer, | |
| 228 commandbuffer, | |
| 229 vulkan.swapchain.width, | |
| 230 vulkan.swapchain.height, | |
| 231 vec4(0, 0, 0, 0), | |
| 232 ): | |
| 236 withPipeline(commandbuffer, pipeline): | 233 withPipeline(commandbuffer, pipeline): |
| 237 for i in 0 ..< labels.len: | 234 for i in 0 ..< labels.len: |
| 238 render(commandbuffer, pipeline, labels[i], positions[i], colors[i], scales[i]) | 235 render( |
| 236 commandbuffer, pipeline, labels[i], positions[i], colors[i], scales[i] | |
| 237 ) | |
| 239 | 238 |
| 240 # cleanup | 239 # cleanup |
| 241 checkVkResult vkDeviceWaitIdle(vulkan.device) | 240 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 242 destroyPipeline(pipeline) | 241 destroyPipeline(pipeline) |
| 243 destroyRenderData(renderdata) | 242 destroyRenderData(renderdata) |
