comparison tests/test_text.nim @ 1405:46bac138ad6c

did: minimal work on next test
author sam <sam@basx.dev>
date Sat, 21 Dec 2024 00:19:11 +0700
parents 80cfa19d1e2c
children aeb15aa9768c
comparison
equal deleted inserted replaced
1404:80cfa19d1e2c 1405:46bac138ad6c
9 import std/random 9 import std/random
10 import std/unicode 10 import std/unicode
11 11
12 import ../semicongine 12 import ../semicongine
13 13
14 type FontDS = object
15 fontAtlas: Image[Gray]
16
17 const MAX_CODEPOINTS = 200 14 const MAX_CODEPOINTS = 200
18 const FONTNAME = "Overhaul.ttf" 15 const FONTNAME = "Overhaul.ttf"
19 # const FONTNAME = "DejaVuSans.ttf" 16 # const FONTNAME = "DejaVuSans.ttf"
20 17
21 proc test_01_static_label(time: float32) = 18 proc test_01_static_label(time: float32) =
123 # cleanup 120 # cleanup
124 checkVkResult vkDeviceWaitIdle(vulkan.device) 121 checkVkResult vkDeviceWaitIdle(vulkan.device)
125 destroyPipeline(pipeline) 122 destroyPipeline(pipeline)
126 destroyRenderData(renderdata) 123 destroyRenderData(renderdata)
127 124
128 #[
129 proc test_03_layouting(time: float32) = 125 proc test_03_layouting(time: float32) =
130 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 40) 126 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 40)
131 var renderdata = initRenderData() 127 var renderdata = initRenderData()
132 128
133 var pipeline = createPipeline[GlyphShader[MAX_CODEPOINTS]]( 129 var pipeline = createPipeline[GlyphShader[MAX_CODEPOINTS]](
134 renderPass = vulkan.swapchain.renderPass 130 renderPass = vulkan.swapchain.renderPass
135 ) 131 )
136 132
137 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas.copy())) 133 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas.copy()))
138 uploadImages(renderdata, ds) 134
139 initDescriptorSet(renderdata, pipeline.layout(0), ds) 135 assignBuffers(renderdata, font.descriptorSet)
140 136 uploadImages(renderdata, font.descriptorSet)
141 var labels: seq[Textbox] 137 initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet)
138
139 var glyphs = font.initGlyphs(1000, baseScale = 0.1)
140 assignBuffers(renderdata, glyphs)
142 141
143 for horizontal in HorizontalAlignment: 142 for horizontal in HorizontalAlignment:
144 labels.add initTextbox( 143 glyphs.add $horizontal & " aligned"
145 renderdata,
146 pipeline.layout(0),
147 font,
148 0.001,
149 $horizontal & " aligned",
150 horizontalAlignment = horizontal,
151 )
152 for vertical in VerticalAlignment: 144 for vertical in VerticalAlignment:
153 labels.add initTextbox( 145 glyphs.add $vertical & " aligned"
154 renderdata, 146
155 pipeline.layout(0), 147 glyphs.add(
156 font,
157 0.001,
158 $vertical & " aligned",
159 verticalAlignment = vertical,
160 )
161 labels.add initTextbox(
162 renderdata,
163 pipeline.layout(0),
164 font,
165 0.001,
166 """Paragraph 148 """Paragraph
167 This is a somewhat longer paragraph with a few newlines and a maximum width of 0.2. 149 This is a somewhat longer paragraph with a few newlines and a maximum width of 0.2.
168 150
169 It should display with some space above and have a pleasing appearance overall! :)""", 151 It should display with some space above and have a pleasing appearance overall! :)""",
170 maxWidth = 0.6,
171 verticalAlignment = Top, 152 verticalAlignment = Top,
172 horizontalAlignment = Left, 153 horizontalAlignment = Left,
173 ) 154 )
174 155
175 var start = getMonoTime() 156 var start = getMonoTime()
176 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 157 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
177 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time 158 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time
178 withNextFrame(framebuffer, commandbuffer): 159 withNextFrame(framebuffer, commandbuffer):
179 bindDescriptorSet(commandbuffer, ds, 0, pipeline) 160 bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline)
180 withRenderPass( 161 withRenderPass(
181 vulkan.swapchain.renderPass, 162 vulkan.swapchain.renderPass,
182 framebuffer, 163 framebuffer,
183 commandbuffer, 164 commandbuffer,
184 vulkan.swapchain.width, 165 vulkan.swapchain.width,
185 vulkan.swapchain.height, 166 vulkan.swapchain.height,
186 vec4(0, 0, 0, 0), 167 vec4(0, 0, 0, 0),
187 ): 168 ):
188 withPipeline(commandbuffer, pipeline): 169 withPipeline(commandbuffer, pipeline):
189 for i in 0 ..< labels.len: 170 renderGlyphs(commandbuffer, pipeline, glyphs)
190 render(
191 commandbuffer,
192 pipeline,
193 labels[i],
194 vec3(0.5 - i.float32 * 0.1, 0.5 - i.float32 * 0.1),
195 vec4(1, 1, 1, 1),
196 )
197 171
198 # cleanup 172 # cleanup
199 checkVkResult vkDeviceWaitIdle(vulkan.device) 173 checkVkResult vkDeviceWaitIdle(vulkan.device)
200 destroyPipeline(pipeline) 174 destroyPipeline(pipeline)
201 destroyRenderData(renderdata) 175 destroyRenderData(renderdata)
202 176
177 #[
203 proc test_04_lots_of_texts(time: float32) = 178 proc test_04_lots_of_texts(time: float32) =
204 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) 179 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160)
205 var renderdata = initRenderData() 180 var renderdata = initRenderData()
206 181
207 var pipeline = createPipeline[GlyphShader[MAX_CODEPOINTS]]( 182 var pipeline = createPipeline[GlyphShader[MAX_CODEPOINTS]](
258 setupSwapchain(renderpass = renderpass) 233 setupSwapchain(renderpass = renderpass)
259 234
260 # tests a simple triangle with minimalistic shader and vertex format 235 # tests a simple triangle with minimalistic shader and vertex format
261 test_01_static_label(time) 236 test_01_static_label(time)
262 test_02_multi_counter(time) 237 test_02_multi_counter(time)
263 # test_03_layouting(time) 238 test_03_layouting(time)
264 # test_04_lots_of_texts(time) 239 # test_04_lots_of_texts(time)
265 240
266 checkVkResult vkDeviceWaitIdle(vulkan.device) 241 checkVkResult vkDeviceWaitIdle(vulkan.device)
267 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) 242 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil)
268 clearSwapchain() 243 clearSwapchain()