Mercurial > games > semicongine
comparison tests/test_vulkan_wrapper.nim @ 128:9901ec3831d1
did: finish refactoring of render pipeline, yipi! :)
author | Sam <sam@basx.dev> |
---|---|
date | Mon, 17 Apr 2023 18:02:19 +0700 |
parents | 5871acc2977e |
children | 15d37022625c |
comparison
equal
deleted
inserted
replaced
127:5871acc2977e | 128:9901ec3831d1 |
---|---|
31 echo " " & $mode | 31 echo " " & $mode |
32 echo " Surface formats" | 32 echo " Surface formats" |
33 for format in device.getSurfaceFormats(): | 33 for format in device.getSurfaceFormats(): |
34 echo " " & $format | 34 echo " " & $format |
35 | 35 |
36 proc scene_different_mesh_types(): Scene = | 36 proc scene_different_mesh_types(): Entity = |
37 result = Scene( | 37 result = newEntity("root", |
38 name: "main", | 38 newEntity("triangle1", newMesh( |
39 root: newEntity("root", | 39 positions=[newVec3f(0.0, -0.5), newVec3f(0.5, 0.5), newVec3f(-0.5, 0.5)], |
40 newEntity("triangle1", newMesh( | 40 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], |
41 positions=[newVec3f(0.0, -0.5), newVec3f(0.5, 0.5), newVec3f(-0.5, 0.5)], | 41 )), |
42 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], | 42 newEntity("triangle1b", newMesh( |
43 )), | 43 positions=[newVec3f(0.0, -0.4), newVec3f(0.4, 0.4), newVec3f(-0.4, 0.5)], |
44 newEntity("triangle1b", newMesh( | 44 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], |
45 positions=[newVec3f(0.0, -0.4), newVec3f(0.4, 0.4), newVec3f(-0.4, 0.5)], | 45 )), |
46 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], | 46 newEntity("triangle2a", newMesh( |
47 )), | 47 positions=[newVec3f(0.0, 0.5), newVec3f(0.5, -0.5), newVec3f(-0.5, -0.5)], |
48 newEntity("triangle2a", newMesh( | 48 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], |
49 positions=[newVec3f(0.0, 0.5), newVec3f(0.5, -0.5), newVec3f(-0.5, -0.5)], | 49 indices=[[0'u16, 2'u16, 1'u16]] |
50 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], | 50 )), |
51 indices=[[0'u16, 2'u16, 1'u16]] | 51 newEntity("triangle2b", newMesh( |
52 )), | 52 positions=[newVec3f(0.0, 0.4), newVec3f(0.4, -0.4), newVec3f(-0.4, -0.4)], |
53 newEntity("triangle2b", newMesh( | 53 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], |
54 positions=[newVec3f(0.0, 0.4), newVec3f(0.4, -0.4), newVec3f(-0.4, -0.4)], | 54 indices=[[0'u16, 2'u16, 1'u16]] |
55 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], | 55 )), |
56 indices=[[0'u16, 2'u16, 1'u16]] | 56 newEntity("triangle3a", newMesh( |
57 )), | 57 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], |
58 newEntity("triangle3a", newMesh( | 58 colors=[newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0)], |
59 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], | 59 indices=[[0'u32, 2'u32, 1'u32]], |
60 colors=[newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0)], | 60 autoResize=false |
61 indices=[[0'u32, 2'u32, 1'u32]], | 61 )), |
62 autoResize=false | 62 newEntity("triangle3b", newMesh( |
63 )), | 63 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], |
64 newEntity("triangle3b", newMesh( | 64 colors=[newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0)], |
65 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], | 65 indices=[[0'u32, 2'u32, 1'u32]], |
66 colors=[newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0)], | 66 autoResize=false |
67 indices=[[0'u32, 2'u32, 1'u32]], | 67 )), |
68 autoResize=false | |
69 )), | |
70 ) | |
71 ) | 68 ) |
69 for mesh in allComponentsOfType[Mesh](result): | |
70 mesh.setInstanceData("translate", @[newVec3f()]) | |
72 | 71 |
73 proc scene_simple(): Scene = | 72 proc scene_simple(): Entity = |
74 var mymesh1 = newMesh( | 73 var mymesh1 = newMesh( |
75 positions=[newVec3f(0.0, -0.3), newVec3f(0.3, 0.3), newVec3f(-0.3, 0.3)], | 74 positions=[newVec3f(0.0, -0.3), newVec3f(0.3, 0.3), newVec3f(-0.3, 0.3)], |
76 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], | 75 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], |
77 ) | 76 ) |
78 var mymesh2 = newMesh( | 77 var mymesh2 = newMesh( |
93 ) | 92 ) |
94 mymesh1.setInstanceData("translate", @[newVec3f(0.3, 0.0)]) | 93 mymesh1.setInstanceData("translate", @[newVec3f(0.3, 0.0)]) |
95 mymesh2.setInstanceData("translate", @[newVec3f(0.0, 0.3)]) | 94 mymesh2.setInstanceData("translate", @[newVec3f(0.0, 0.3)]) |
96 mymesh3.setInstanceData("translate", @[newVec3f(-0.3, 0.0)]) | 95 mymesh3.setInstanceData("translate", @[newVec3f(-0.3, 0.0)]) |
97 mymesh4.setInstanceData("translate", @[newVec3f(0.0, -0.3), newVec3f(0.0, 0.5)]) | 96 mymesh4.setInstanceData("translate", @[newVec3f(0.0, -0.3), newVec3f(0.0, 0.5)]) |
98 result = Scene( | 97 result = newEntity("root", newEntity("triangle", mymesh4, mymesh3, mymesh2, mymesh1)) |
99 name: "main", | |
100 root: newEntity("root", newEntity("triangle", mymesh4, mymesh3, mymesh2, mymesh1)) | |
101 ) | |
102 | 98 |
103 proc scene_primitives(): Scene = | 99 proc scene_primitives(): Entity = |
104 var r = rect(color="ff0000") | 100 var r = rect(color="ff0000") |
105 var t = tri(color="0000ff") | 101 var t = tri(color="0000ff") |
106 var c = circle(color="00ff00") | 102 var c = circle(color="00ff00") |
107 setInstanceData[Vec3f](r, "translate", @[newVec3f(0.5, -0.3)]) | 103 setInstanceData[Vec3f](r, "translate", @[newVec3f(0.5, -0.3)]) |
108 setInstanceData[Vec3f](t, "translate", @[newVec3f(0.3, 0.3)]) | 104 setInstanceData[Vec3f](t, "translate", @[newVec3f(0.3, 0.3)]) |
109 setInstanceData[Vec3f](c, "translate", @[newVec3f(-0.3, 0.1)]) | 105 setInstanceData[Vec3f](c, "translate", @[newVec3f(-0.3, 0.1)]) |
110 result = Scene( | 106 result = newEntity("root", t, r, c) |
111 name: "main", | |
112 root: newEntity("root", t, r, c) | |
113 ) | |
114 | 107 |
115 when isMainModule: | 108 when isMainModule: |
116 var engine = initEngine("Test") | 109 var engine = initEngine("Test") |
117 | 110 |
118 # INIT RENDERER: | 111 # INIT RENDERER: |
138 uniforms=uniforms, | 131 uniforms=uniforms, |
139 outputs=fragOutput, | 132 outputs=fragOutput, |
140 main="color = vec4(outcolor, 1);" | 133 main="color = vec4(outcolor, 1);" |
141 ) | 134 ) |
142 var | 135 var |
143 vertexshader = engine.gpuDevice.createShaderModule(vertexCode) | |
144 fragmentshader = engine.gpuDevice.createShaderModule(fragmentCode) | |
145 surfaceFormat = engine.gpuDevice.physicalDevice.getSurfaceFormats().filterSurfaceFormat() | 136 surfaceFormat = engine.gpuDevice.physicalDevice.getSurfaceFormats().filterSurfaceFormat() |
146 renderPass = engine.gpuDevice.simpleForwardRenderPass(surfaceFormat.format, vertexshader, fragmentshader, 2) | 137 renderPass = engine.gpuDevice.simpleForwardRenderPass(surfaceFormat.format, vertexCode, fragmentCode, 2) |
147 (swapchain, res) = engine.gpuDevice.createSwapchain(renderPass, surfaceFormat, engine.gpuDevice.firstGraphicsQueue().get().family, 2) | 138 renderer = engine.gpuDevice.initRenderer([renderPass]) |
148 if res != VK_SUCCESS: | |
149 raise newException(Exception, "Unable to create swapchain") | |
150 | 139 |
151 # INIT SCENE | 140 # INIT SCENE |
152 | 141 |
153 # var thescene = scene_simple() | 142 var scenes = [scene_simple(), scene_different_mesh_types(), scene_primitives()] |
154 # var thescene = scene_different_mesh_types() | |
155 var thescene = scene_primitives() | |
156 var time = initShaderGlobal("time", 0.0'f32) | 143 var time = initShaderGlobal("time", 0.0'f32) |
157 thescene.root.components.add time | 144 for scene in scenes.mitems: |
158 thescene.setupDrawableBuffers(engine.gpuDevice, vertexInput) | 145 scene.components.add time |
146 renderer.setupDrawableBuffers(scene, vertexInput) | |
159 | 147 |
160 # MAINLOOP | 148 # MAINLOOP |
161 echo "Setup successfull, start rendering" | 149 echo "Setup successfull, start rendering" |
162 for i in 0 ..< 10000: | 150 for i in 0 ..< 3: |
163 setValue[float32](time.value, get[float32](time.value) + 0.0005) | 151 for scene in scenes: |
164 discard swapchain.drawScene(thescene) | 152 for i in 0 ..< 1000: |
165 echo "Rendered ", swapchain.framesRendered, " frames" | 153 setValue[float32](time.value, get[float32](time.value) + 0.0005) |
154 discard renderer.render(scene) | |
155 echo "Rendered ", renderer.framesRendered, " frames" | |
166 | 156 |
167 # cleanup | 157 # cleanup |
168 echo "Start cleanup" | 158 echo "Start cleanup" |
169 checkVkResult engine.gpuDevice.vk.vkDeviceWaitIdle() | 159 checkVkResult engine.gpuDevice.vk.vkDeviceWaitIdle() |
170 | 160 renderer.destroy() |
171 # destroy scene | |
172 thescene.destroy() | |
173 | |
174 # destroy renderer | |
175 vertexshader.destroy() | |
176 fragmentshader.destroy() | |
177 renderPass.destroy() | |
178 swapchain.destroy() | |
179 | |
180 # destroy engine | |
181 engine.destroy() | 161 engine.destroy() |