comparison tests/test_vulkan_wrapper.nim @ 326:4ec852355750

fix: many issues, better mesh-handling, still need to cope with different binding numbers when using different pipelines...
author Sam <sam@basx.dev>
date Fri, 25 Aug 2023 00:29:51 +0700
parents 0c3f4f6f1aa2
children a63bd8f29252
comparison
equal deleted inserted replaced
325:0c3f4f6f1aa2 326:4ec852355750
39 ) 39 )
40 mat3 = Material( 40 mat3 = Material(
41 name: "mat3", 41 name: "mat3",
42 materialType: "my_special_material", 42 materialType: "my_special_material",
43 constants: { 43 constants: {
44 "color": toGPUValue(newVec4f(0.5, 0.5, 0)) 44 "color": toGPUValue(newVec4f(0, 1, 0, 1))
45 }.toTable 45 }.toTable
46 ) 46 )
47 47
48 proc scene_different_mesh_types(): Entity = 48 proc scene_different_mesh_types(): seq[Mesh] =
49 result = newEntity("root", [], 49 @[
50 newEntity("triangle1", {"mesh": Component(newMesh( 50 newMesh(
51 positions=[newVec3f(0.0, -0.5), newVec3f(0.5, 0.5), newVec3f(-0.5, 0.5)], 51 positions=[newVec3f(0.0, -0.5), newVec3f(0.5, 0.5), newVec3f(-0.5, 0.5)],
52 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)], 52 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)],
53 material=mat, 53 material=mat,
54 ))}), 54 transform=translate(-0.7, -0.5),
55 newEntity("triangle1b", {"mesh": Component(newMesh( 55 ),
56 newMesh(
56 positions=[newVec3f(0.0, -0.4), newVec3f(0.4, 0.4), newVec3f(-0.4, 0.5)], 57 positions=[newVec3f(0.0, -0.4), newVec3f(0.4, 0.4), newVec3f(-0.4, 0.5)],
57 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)], 58 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)],
58 material=mat, 59 material=mat,
59 ))}), 60 transform=translate(0, -0.5),
60 newEntity("triangle2a", {"mesh": Component(newMesh( 61 ),
62 newMesh(
61 positions=[newVec3f(0.0, 0.5), newVec3f(0.5, -0.5), newVec3f(-0.5, -0.5)], 63 positions=[newVec3f(0.0, 0.5), newVec3f(0.5, -0.5), newVec3f(-0.5, -0.5)],
62 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)], 64 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)],
63 indices=[[0'u16, 2'u16, 1'u16]], 65 indices=[[0'u16, 2'u16, 1'u16]],
64 material=mat2, 66 material=mat2,
65 ))}), 67 transform=translate(0.7, -0.5),
66 newEntity("triangle2b", {"mesh": Component(newMesh( 68 ),
69 newMesh(
67 positions=[newVec3f(0.0, 0.4), newVec3f(0.4, -0.4), newVec3f(-0.4, -0.4)], 70 positions=[newVec3f(0.0, 0.4), newVec3f(0.4, -0.4), newVec3f(-0.4, -0.4)],
68 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)], 71 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)],
69 indices=[[0'u16, 2'u16, 1'u16]], 72 indices=[[0'u16, 2'u16, 1'u16]],
70 material=mat2, 73 material=mat2,
71 ))}), 74 transform=translate(-0.7, 0.5),
72 newEntity("triangle3a", {"mesh": Component(newMesh( 75 ),
76 newMesh(
73 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], 77 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)],
74 colors=[newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1)], 78 colors=[newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1)],
75 indices=[[0'u32, 2'u32, 1'u32]], 79 indices=[[0'u32, 2'u32, 1'u32]],
76 autoResize=false, 80 autoResize=false,
77 material=mat2, 81 material=mat2,
78 ))}), 82 transform=translate(0, 0.5),
79 newEntity("triangle3b", {"mesh": Component(newMesh( 83 ),
84 newMesh(
80 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], 85 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)],
81 colors=[newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1)], 86 colors=[newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1)],
82 indices=[[0'u32, 2'u32, 1'u32]], 87 indices=[[0'u32, 2'u32, 1'u32]],
83 autoResize=false, 88 autoResize=false,
84 material=mat2, 89 material=mat2,
85 ))}), 90 transform=translate(0.7, 0.5),
86 ) 91 ),
87 for mesh in allComponentsOfType[Mesh](result): 92 ]
88 mesh.setInstanceData("translate", @[newVec3f()]) 93
89 result[0]["mesh", Mesh()].updateInstanceData("translate", @[newVec3f(-0.6, -0.6)]) 94 proc scene_simple(): seq[Mesh] =
90 result[1]["mesh", Mesh()].updateInstanceData("translate", @[newVec3f(-0.6, 0.6)]) 95 @[
91 result[2]["mesh", Mesh()].updateInstanceData("translate", @[newVec3f(0.6, -0.6)]) 96 newMesh(
92 result[3]["mesh", Mesh()].updateInstanceData("translate", @[newVec3f(0.6, 0.6)]) 97 positions=[newVec3f(0.0, -0.3), newVec3f(0.3, 0.3), newVec3f(-0.3, 0.3)],
93 98 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)],
94 proc scene_simple(): Entity = 99 material=mat,
95 var mymesh1 = newMesh( 100 transform=translate(0.4, 0.4),
96 positions=[newVec3f(0.0, -0.3), newVec3f(0.3, 0.3), newVec3f(-0.3, 0.3)], 101 ),
97 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)], 102 newMesh(
98 material=mat, 103 positions=[newVec3f(0.0, -0.5), newVec3f(0.5, 0.5), newVec3f(-0.5, 0.5)],
99 ) 104 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)],
100 var mymesh2 = newMesh( 105 material=mat,
101 positions=[newVec3f(0.0, -0.5), newVec3f(0.5, 0.5), newVec3f(-0.5, 0.5)], 106 transform=translate(0.4, -0.4),
102 colors=[newVec4f(1.0, 0.0, 0.0, 1), newVec4f(0.0, 1.0, 0.0, 1), newVec4f(0.0, 0.0, 1.0, 1)], 107 ),
103 material=mat, 108 newMesh(
104 ) 109 positions=[newVec3f(0.0, -0.6), newVec3f(0.6, 0.6), newVec3f(-0.6, 0.6)],
105 var mymesh3 = newMesh( 110 colors=[newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1)],
106 positions=[newVec3f(0.0, -0.6), newVec3f(0.6, 0.6), newVec3f(-0.6, 0.6)], 111 indices=[[0'u32, 1'u32, 2'u32]],
107 colors=[newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1), newVec4f(1.0, 1.0, 0.0, 1)], 112 autoResize=false,
108 indices=[[0'u32, 1'u32, 2'u32]], 113 material=mat,
109 autoResize=false, 114 transform=translate(-0.4, 0.4),
110 material=mat, 115 ),
111 ) 116 newMesh(
112 var mymesh4 = newMesh( 117 positions=[newVec3f(0.0, -0.8), newVec3f(0.8, 0.8), newVec3f(-0.8, 0.8)],
113 positions=[newVec3f(0.0, -0.8), newVec3f(0.8, 0.8), newVec3f(-0.8, 0.8)], 118 colors=[newVec4f(0.0, 0.0, 1.0, 1), newVec4f(0.0, 0.0, 1.0, 1), newVec4f(0.0, 0.0, 1.0, 1)],
114 colors=[newVec4f(0.0, 0.0, 1.0, 1), newVec4f(0.0, 0.0, 1.0, 1), newVec4f(0.0, 0.0, 1.0, 1)], 119 indices=[[0'u16, 1'u16, 2'u16]],
115 indices=[[0'u16, 1'u16, 2'u16]], 120 instanceTransforms=[Unit4F32, Unit4F32],
116 instanceCount=2, 121 material=mat,
117 material=mat, 122 transform=translate(-0.4, -0.4),
118 ) 123 )
119 mymesh1.setInstanceData("translate", @[newVec3f( 0.4, 0.4)]) 124 ]
120 mymesh2.setInstanceData("translate", @[newVec3f( 0.4, -0.4)]) 125
121 mymesh3.setInstanceData("translate", @[newVec3f(-0.4, -0.4)]) 126 proc scene_primitives(): seq[Mesh] =
122 mymesh4.setInstanceData("translate", @[newVec3f(-0.4, 0.4), newVec3f(0.0, 0.0)])
123 result = newEntity("root", [], newEntity("triangle", {"mesh1": Component(mymesh4), "mesh2": Component(mymesh3), "mesh3": Component(mymesh2), "mesh4": Component(mymesh1)}))
124
125 proc scene_primitives(): Entity =
126 var r = rect(color="ff0000") 127 var r = rect(color="ff0000")
127 var t = tri(color="0000ff") 128 var t = tri(color="0000ff")
128 var c = circle(color="00ff00") 129 var c = circle(color="00ff00")
129 r.material = mat 130 r.material = mat
130 t.material = mat 131 t.material = mat
131 c.material = mat 132 c.material = mat
132 133 r.transform = translate(newVec3f(0.5, -0.3))
133 r.setInstanceData("translate", @[newVec3f(0.5, -0.3)]) 134 t.transform = translate(newVec3f(0.3, 0.3))
134 t.setInstanceData("translate", @[newVec3f(0.3, 0.3)]) 135 c.transform = translate(newVec3f(-0.3, 0.1))
135 c.setInstanceData("translate", @[newVec3f(-0.3, 0.1)]) 136 result = @[r, c, t]
136 result = newEntity("root", {"mesh1": Component(t), "mesh2": Component(r), "mesh3": Component(c)}) 137
137 138 proc scene_flag(): seq[Mesh] =
138 proc scene_flag(): Entity = 139 @[
139 var r = rect(color="ffffff") 140 newMesh(
140 r.material = mat 141 positions=[newVec3f(-1.0, -1.0), newVec3f(1.0, -1.0), newVec3f(1.0, 1.0), newVec3f(-1.0, 1.0)],
141 result = newEntity("root", {"mesh": Component(r)}) 142 colors=[newVec4f(-1, -1, 1, 1), newVec4f(1, -1, 1, 1), newVec4f(1, 1, 1, 1), newVec4f(-1, 1, 1, 1)],
142 143 indices=[[0'u16, 1'u16, 2'u16], [2'u16, 3'u16, 0'u16]],
143 proc scene_multi_material(): Entity = 144 material=mat,
145 transform=scale(0.5, 0.5)
146 )
147 ]
148
149 proc scene_multi_material(): seq[Mesh] =
144 var 150 var
145 r1 = rect(color="ffffff") 151 r1 = rect(color="ffffff")
146 r2 = rect(color="000000") 152 r2 = rect(color="000000")
147 r1.material = mat 153 r1.material = mat
148 r2.material = mat3 154 r2.material = mat3
149 r1.setInstanceData("translate", @[newVec3f(-0.5)]) 155 r1.transform = translate(newVec3f(-0.5))
150 r2.setInstanceData("translate", @[newVec3f(+0.5)]) 156 r2.transform = translate(newVec3f(+0.5))
151 result = newEntity("root", {"mesh1": Component(r1), "mesh2": Component(r2)}) 157 result = @[r1, r2]
152 158
153 proc main() = 159 proc main() =
154 var engine = initEngine("Test") 160 var engine = initEngine("Test")
155 161
156 # INIT RENDERER: 162 # INIT RENDERER:
157 const 163 const
158 shaderConfiguration1 = createShaderConfiguration( 164 shaderConfiguration1 = createShaderConfiguration(
159 inputs=[ 165 inputs=[
160 attr[Vec3f]("position", memoryPerformanceHint=PreferFastRead), 166 attr[Vec3f]("position", memoryPerformanceHint=PreferFastRead),
161 attr[Vec4f]("color", memoryPerformanceHint=PreferFastWrite), 167 attr[Vec4f]("color", memoryPerformanceHint=PreferFastWrite),
162 attr[Vec3f]("translate", perInstance=true), 168 attr[Mat4]("transform", perInstance=true),
163 attr[uint16]("materialIndex", perInstance=true), 169 attr[uint16]("materialIndex", perInstance=true),
164 ], 170 ],
165 intermediates=[ 171 intermediates=[
166 attr[Vec4f]("outcolor"), 172 attr[Vec4f]("outcolor"),
167 attr[uint16]("materialIndexOut", noInterpolation=true), 173 attr[uint16]("materialIndexOut", noInterpolation=true),
169 outputs=[attr[Vec4f]("color")], 175 outputs=[attr[Vec4f]("color")],
170 uniforms=[attr[float32]("time")], 176 uniforms=[attr[float32]("time")],
171 samplers=[ 177 samplers=[
172 attr[Sampler2DType]("my_little_texture", arrayCount=2) 178 attr[Sampler2DType]("my_little_texture", arrayCount=2)
173 ], 179 ],
174 vertexCode="""gl_Position = vec4(position + translate, 1.0); outcolor = color; materialIndexOut = materialIndex;""", 180 vertexCode="""gl_Position = vec4(position, 1.0) * transform; outcolor = color; materialIndexOut = materialIndex;""",
175 fragmentCode="color = texture(my_little_texture[materialIndexOut], outcolor.xy) * 0.5 + outcolor * 0.5;", 181 fragmentCode="color = texture(my_little_texture[materialIndexOut], outcolor.xy) * 0.5 + outcolor * 0.5;",
176 ) 182 )
177 shaderConfiguration2 = createShaderConfiguration( 183 shaderConfiguration2 = createShaderConfiguration(
178 inputs=[ 184 inputs=[
179 attr[Vec3f]("position", memoryPerformanceHint=PreferFastRead), 185 attr[Vec3f]("position", memoryPerformanceHint=PreferFastRead),
180 attr[Vec3f]("translate", perInstance=true), 186 attr[Mat4]("transform", perInstance=true),
181 ], 187 ],
182 intermediates=[attr[Vec4f]("outcolor")], 188 intermediates=[attr[Vec4f]("outcolor")],
183 outputs=[attr[Vec4f]("color")], 189 outputs=[attr[Vec4f]("color")],
184 uniforms=[attr[Vec4f]("color")], 190 uniforms=[attr[Vec4f]("color")],
185 vertexCode="""gl_Position = vec4(position + translate, 1.0); outcolor = Uniforms.color;""", 191 vertexCode="""gl_Position = vec4(position, 1.0) * transform; outcolor = Uniforms.color;""",
186 fragmentCode="color = outcolor;", 192 fragmentCode="color = vec4(0, 0, 1, 1);",
187 ) 193 )
188 engine.initRenderer({ 194 engine.initRenderer({
189 "my_material": shaderConfiguration1, 195 "my_material": shaderConfiguration1,
190 "my_special_material": shaderConfiguration2, 196 "my_special_material": shaderConfiguration2,
191 }.toTable) 197 }.toTable)
192 198
193 # INIT SCENES 199 # INIT SCENES
194 var scenes = [ 200 var scenes = [
195 newScene("simple", scene_simple(), transformAttribute=""), 201 # Scene(name: "simple", meshes: scene_simple()),
196 newScene("different mesh types", scene_different_mesh_types(), transformAttribute=""), 202 # Scene(name: "different mesh types", meshes: scene_different_mesh_types()),
197 newScene("primitives", scene_primitives(), transformAttribute=""), 203 # Scene(name: "primitives", meshes: scene_primitives()),
198 newScene("flag", scene_multi_material(), transformAttribute=""), 204 # Scene(name: "flag", meshes: scene_flag()),
199 ] 205 # Scene(name: "multimaterial", meshes: scene_multi_material(), materialIndexAttribute: ""),
200 206 Scene(name: "multimaterial", meshes: scene_multi_material()),
201 scenes[3].addShaderGlobal("color", newVec4f(1, 0, 1)) 207 ]
208
209 scenes[0].addShaderGlobal("color", newVec4f(1, 0, 0, 1))
202 for scene in scenes.mitems: 210 for scene in scenes.mitems:
203 scene.addShaderGlobal("time", 0.0'f32) 211 scene.addShaderGlobal("time", 0.0'f32)
204 engine.addScene(scene) 212 engine.addScene(scene)
205
206 213
207 # MAINLOOP 214 # MAINLOOP
208 echo "Setup successfull, start rendering" 215 echo "Setup successfull, start rendering"
209 for i in 0 ..< 3: 216 for i in 0 ..< 3:
210 for scene in scenes.mitems: 217 for scene in scenes.mitems:
218 echo "rendering scene ", scene.name
211 for i in 0 ..< 1000: 219 for i in 0 ..< 1000:
212 if engine.updateInputs() != Running or engine.keyIsDown(Escape): 220 if engine.updateInputs() != Running or engine.keyIsDown(Escape):
213 engine.destroy() 221 engine.destroy()
214 return 222 return
215 setShaderGlobal(scene, "time", getShaderGlobal[float32](scene, "time") + 0.0005'f) 223 setShaderGlobal(scene, "time", getShaderGlobal[float32](scene, "time") + 0.0005'f)