comparison tests/test_text.nim @ 1239:69489a678141

add: better syncing, better swapchain access, correct font offset, two font-rendering tests
author sam <sam@basx.dev>
date Mon, 22 Jul 2024 00:46:10 +0700
parents 03634915bbdb
children 42eeb59f3a43
comparison
equal deleted inserted replaced
1238:03634915bbdb 1239:69489a678141
6 import std/options 6 import std/options
7 import std/random 7 import std/random
8 8
9 import ../semiconginev2 9 import ../semiconginev2
10 10
11 proc test_01_static_label(time: float32, swapchain: var Swapchain) = 11 proc test_01_static_label(time: float32) =
12 var renderdata = InitRenderData() 12 var renderdata = InitRenderData()
13 13
14 var pipeline = CreatePipeline[DefaultFontShader](renderPass = swapchain.renderPass) 14 var pipeline = CreatePipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass)
15 15
16 var font = LoadFont("Overhaul.ttf", lineHeightPixels = 160) 16 var font = LoadFont("Overhaul.ttf", lineHeightPixels = 160)
17 var label1 = InitTextbox( 17 var label1 = InitTextbox(
18 renderdata, 18 renderdata,
19 pipeline.descriptorSetLayouts[0], 19 pipeline.descriptorSetLayouts[0],
23 scale = 0.0005, 23 scale = 0.0005,
24 ) 24 )
25 25
26 var start = getMonoTime() 26 var start = getMonoTime()
27 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 27 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
28 label1.Refresh(swapchain.GetAspectRatio()) 28 label1.Refresh()
29 WithNextFrame(swapchain, framebuffer, commandbuffer): 29 WithNextFrame(framebuffer, commandbuffer):
30 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 30 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
31 WithPipeline(commandbuffer, pipeline): 31 WithPipeline(commandbuffer, pipeline):
32 Render(label1, commandbuffer, pipeline, swapchain.currentFiF) 32 Render(label1, commandbuffer, pipeline)
33 33
34 # cleanup 34 # cleanup
35 checkVkResult vkDeviceWaitIdle(vulkan.device) 35 checkVkResult vkDeviceWaitIdle(vulkan.device)
36 DestroyPipeline(pipeline) 36 DestroyPipeline(pipeline)
37 DestroyRenderData(renderdata) 37 DestroyRenderData(renderdata)
38 38
39 proc test_02_multiple_animated(time: float32, swapchain: var Swapchain) = 39 proc test_02_multiple_animated(time: float32) =
40 var renderdata = InitRenderData() 40 var renderdata = InitRenderData()
41 41
42 var pipeline = CreatePipeline[DefaultFontShader](renderPass = swapchain.renderPass) 42 var pipeline = CreatePipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass)
43 43
44 var font1 = LoadFont("Overhaul.ttf", lineHeightPixels = 40) 44 var font1 = LoadFont("Overhaul.ttf", lineHeightPixels = 40)
45 var font2 = LoadFont("Overhaul.ttf", lineHeightPixels = 160) 45 var font2 = LoadFont("Overhaul.ttf", lineHeightPixels = 160)
46 var font3 = LoadFont("DejaVuSans.ttf", lineHeightPixels = 160) 46 var font3 = LoadFont("DejaVuSans.ttf", lineHeightPixels = 160)
47 var labels = [ 47 var labels = [
83 c[i] = progress 83 c[i] = progress
84 labels[i].Color = c 84 labels[i].Color = c
85 labels[i].Scale = labels[i].Scale * (1.0 + (i + 1).float * 0.001) 85 labels[i].Scale = labels[i].Scale * (1.0 + (i + 1).float * 0.001)
86 labels[i].Position = labels[i].Position + NewVec3f(0.001 * (i.float - 1'f)) 86 labels[i].Position = labels[i].Position + NewVec3f(0.001 * (i.float - 1'f))
87 labels[i].text = $(p + i) 87 labels[i].text = $(p + i)
88 labels[i].Refresh(swapchain.GetAspectRatio()) 88 labels[i].Refresh()
89 inc p 89 inc p
90 WithNextFrame(swapchain, framebuffer, commandbuffer): 90 WithNextFrame(framebuffer, commandbuffer):
91 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 91 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
92 WithPipeline(commandbuffer, pipeline): 92 WithPipeline(commandbuffer, pipeline):
93 for label in labels: 93 for label in labels:
94 Render(label, commandbuffer, pipeline, swapchain.currentFiF) 94 Render(label, commandbuffer, pipeline)
95 95
96 # cleanup 96 # cleanup
97 checkVkResult vkDeviceWaitIdle(vulkan.device) 97 checkVkResult vkDeviceWaitIdle(vulkan.device)
98 DestroyPipeline(pipeline) 98 DestroyPipeline(pipeline)
99 DestroyRenderData(renderdata) 99 DestroyRenderData(renderdata)
100 100
101 proc test_03_layouting(time: float32, swapchain: var Swapchain) = 101 proc test_03_layouting(time: float32) =
102 discard # TODO 102 var renderdata = InitRenderData()
103 proc test_04_lots_of_texts(time: float32, swapchain: var Swapchain) = 103
104 var pipeline = CreatePipeline[DefaultFontShader](renderPass = vulkan.swapchain.renderPass)
105
106 var font = LoadFont("DejaVuSans.ttf", lineHeightPixels = 40)
107 var labels: seq[Textbox]
108
109 for horizontal in HorizontalAlignment:
110 labels.add InitTextbox(
111 renderdata,
112 pipeline.descriptorSetLayouts[0],
113 font,
114 $horizontal & " aligned",
115 color = NewVec4f(1, 1, 1, 1),
116 scale = 0.001,
117 position = NewVec3f(0, 0.9 - (horizontal.float * 0.15)),
118 horizontalAlignment = horizontal,
119 )
120 for vertical in VerticalAlignment:
121 labels.add InitTextbox(
122 renderdata,
123 pipeline.descriptorSetLayouts[0],
124 font,
125 $vertical & " aligned",
126 color = NewVec4f(1, 1, 1, 1),
127 scale = 0.001,
128 position = NewVec3f(-0.35 + (vertical.float * 0.35), 0.3),
129 verticalAlignment = vertical,
130 )
131 labels.add InitTextbox(
132 renderdata,
133 pipeline.descriptorSetLayouts[0],
134 font,
135 """Paragraph
136 This is a somewhat longer paragraph with a few newlines and a maximum width of 0.2.
137
138 It should display with some space above and have a pleasing appearance overall! :)""",
139 maxWidth = 0.6,
140 color = NewVec4f(1, 1, 1, 1),
141 scale = 0.001,
142 position = NewVec3f(-0.9, 0.1),
143 verticalAlignment = Top,
144 horizontalAlignment = Left,
145 )
146
147
148 var start = getMonoTime()
149 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
150 let progress = ((getMonoTime() - start).inMilliseconds().int / 1000) / time
151 WithNextFrame(framebuffer, commandbuffer):
152 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
153 WithPipeline(commandbuffer, pipeline):
154 for label in labels:
155 Render(label, commandbuffer, pipeline)
156
157 # cleanup
158 checkVkResult vkDeviceWaitIdle(vulkan.device)
159 DestroyPipeline(pipeline)
160 DestroyRenderData(renderdata)
161
162 proc test_04_lots_of_texts(time: float32) =
104 discard # TODO 163 discard # TODO
105 164
106 when isMainModule: 165 when isMainModule:
107 var time = 10'f32 166 var time = 10'f32
108 InitVulkan() 167 InitVulkan()
109 168
110 var renderpass = CreateDirectPresentationRenderPass(depthBuffer = true) 169 var renderpass = CreateDirectPresentationRenderPass(depthBuffer = true)
111 var swapchain = InitSwapchain(renderpass = renderpass).get() 170 SetupSwapchain(renderpass = renderpass)
112 171
113 # tests a simple triangle with minimalistic shader and vertex format 172 # tests a simple triangle with minimalistic shader and vertex format
114 # test_01_static_label(time, swapchain) 173 # test_01_static_label(time, swapchain)
115 test_02_multiple_animated(time, swapchain) 174 # test_02_multiple_animated(time)
175 test_03_layouting(time)
176
116 177
117 checkVkResult vkDeviceWaitIdle(vulkan.device) 178 checkVkResult vkDeviceWaitIdle(vulkan.device)
118 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) 179 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil)
119 DestroySwapchain(swapchain)
120 180
121 DestroyVulkan() 181 DestroyVulkan()