Mercurial > games > semicongine
comparison tests/test_vulkan_wrapper.nim @ 784:fa39e67dded7
add: first complete working version of multiple materials and shaders per scene, yipie :)
author | Sam <sam@basx.dev> |
---|---|
date | Sat, 19 Aug 2023 22:24:06 +0700 |
parents | 893ec0fbfd44 |
children | cbfe96272205 |
comparison
equal
deleted
inserted
replaced
783:893ec0fbfd44 | 784:fa39e67dded7 |
---|---|
1 import std/tables | 1 import std/tables |
2 | 2 |
3 import semicongine | 3 import semicongine |
4 | 4 |
5 | 5 |
6 let sampler = Sampler( | 6 let |
7 sampler = Sampler( | |
7 magnification: VK_FILTER_NEAREST, | 8 magnification: VK_FILTER_NEAREST, |
8 minification: VK_FILTER_NEAREST, | 9 minification: VK_FILTER_NEAREST, |
9 wrapModeS: VK_SAMPLER_ADDRESS_MODE_REPEAT, | 10 wrapModeS: VK_SAMPLER_ADDRESS_MODE_REPEAT, |
10 wrapModeT: VK_SAMPLER_ADDRESS_MODE_REPEAT, | 11 wrapModeT: VK_SAMPLER_ADDRESS_MODE_REPEAT, |
11 ) | 12 ) |
12 let (R, W) = ([255'u8, 0'u8, 0'u8, 255'u8], [255'u8, 255'u8, 255'u8, 255'u8]) | 13 (R, W) = ([255'u8, 0'u8, 0'u8, 255'u8], [255'u8, 255'u8, 255'u8, 255'u8]) |
13 let mat = Material( | 14 mat = Material( |
15 name: "mat", | |
14 materialType: "my_material", | 16 materialType: "my_material", |
15 textures: { | 17 textures: { |
16 "my_little_texture": Texture(image: Image(width: 5, height: 5, imagedata: @[ | 18 "my_little_texture": Texture(image: Image(width: 5, height: 5, imagedata: @[ |
17 R, R, R, R, R, | 19 R, R, R, R, R, |
18 R, R, W, R, R, | 20 R, R, W, R, R, |
20 R, R, W, R, R, | 22 R, R, W, R, R, |
21 R, R, R, R, R, | 23 R, R, R, R, R, |
22 ]), sampler: sampler) | 24 ]), sampler: sampler) |
23 }.toTable | 25 }.toTable |
24 ) | 26 ) |
27 mat2 = Material( | |
28 name: "mat2", | |
29 materialType: "my_material", | |
30 textures: { | |
31 "my_little_texture": Texture(image: Image(width: 5, height: 5, imagedata: @[ | |
32 R, W, R, W, R, | |
33 W, R, W, R, W, | |
34 R, W, R, W, R, | |
35 W, R, W, R, W, | |
36 R, W, R, W, R, | |
37 ]), sampler: sampler) | |
38 }.toTable | |
39 ) | |
40 mat3 = Material( | |
41 name: "mat3", | |
42 materialType: "my_special_material", | |
43 constants: { | |
44 "colors": toGPUValue(newVec4f(0.5, 0.5, 0)) | |
45 }.toTable | |
46 ) | |
25 | 47 |
26 proc scene_different_mesh_types(): Entity = | 48 proc scene_different_mesh_types(): Entity = |
27 result = newEntity("root", [], | 49 result = newEntity("root", [], |
28 newEntity("triangle1", {"mesh": Component(newMesh( | 50 newEntity("triangle1", {"mesh": Component(newMesh( |
29 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)], |
37 ))}), | 59 ))}), |
38 newEntity("triangle2a", {"mesh": Component(newMesh( | 60 newEntity("triangle2a", {"mesh": Component(newMesh( |
39 positions=[newVec3f(0.0, 0.5), newVec3f(0.5, -0.5), newVec3f(-0.5, -0.5)], | 61 positions=[newVec3f(0.0, 0.5), newVec3f(0.5, -0.5), newVec3f(-0.5, -0.5)], |
40 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)], | 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)], |
41 indices=[[0'u16, 2'u16, 1'u16]], | 63 indices=[[0'u16, 2'u16, 1'u16]], |
42 material=mat, | 64 material=mat2, |
43 ))}), | 65 ))}), |
44 newEntity("triangle2b", {"mesh": Component(newMesh( | 66 newEntity("triangle2b", {"mesh": Component(newMesh( |
45 positions=[newVec3f(0.0, 0.4), newVec3f(0.4, -0.4), newVec3f(-0.4, -0.4)], | 67 positions=[newVec3f(0.0, 0.4), newVec3f(0.4, -0.4), newVec3f(-0.4, -0.4)], |
46 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)], | 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)], |
47 indices=[[0'u16, 2'u16, 1'u16]], | 69 indices=[[0'u16, 2'u16, 1'u16]], |
48 material=mat, | 70 material=mat2, |
49 ))}), | 71 ))}), |
50 newEntity("triangle3a", {"mesh": Component(newMesh( | 72 newEntity("triangle3a", {"mesh": Component(newMesh( |
51 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], | 73 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], |
52 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)], | 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)], |
53 indices=[[0'u32, 2'u32, 1'u32]], | 75 indices=[[0'u32, 2'u32, 1'u32]], |
54 autoResize=false, | 76 autoResize=false, |
55 material=mat, | 77 material=mat2, |
56 ))}), | 78 ))}), |
57 newEntity("triangle3b", {"mesh": Component(newMesh( | 79 newEntity("triangle3b", {"mesh": Component(newMesh( |
58 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], | 80 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], |
59 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)], | 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)], |
60 indices=[[0'u32, 2'u32, 1'u32]], | 82 indices=[[0'u32, 2'u32, 1'u32]], |
61 autoResize=false, | 83 autoResize=false, |
62 material=mat, | 84 material=mat2, |
63 ))}), | 85 ))}), |
64 ) | 86 ) |
65 for mesh in allComponentsOfType[Mesh](result): | 87 for mesh in allComponentsOfType[Mesh](result): |
66 mesh.setInstanceData("translate", @[newVec3f()]) | 88 mesh.setInstanceData("translate", @[newVec3f()]) |
89 result[0]["mesh", Mesh()].updateInstanceData("translate", @[newVec3f(-0.6, -0.6)]) | |
90 result[1]["mesh", Mesh()].updateInstanceData("translate", @[newVec3f(-0.6, 0.6)]) | |
91 result[2]["mesh", Mesh()].updateInstanceData("translate", @[newVec3f(0.6, -0.6)]) | |
92 result[3]["mesh", Mesh()].updateInstanceData("translate", @[newVec3f(0.6, 0.6)]) | |
67 | 93 |
68 proc scene_simple(): Entity = | 94 proc scene_simple(): Entity = |
69 var mymesh1 = newMesh( | 95 var mymesh1 = newMesh( |
70 positions=[newVec3f(0.0, -0.3), newVec3f(0.3, 0.3), newVec3f(-0.3, 0.3)], | 96 positions=[newVec3f(0.0, -0.3), newVec3f(0.3, 0.3), newVec3f(-0.3, 0.3)], |
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)], | 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)], |
88 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)], |
89 indices=[[0'u16, 1'u16, 2'u16]], | 115 indices=[[0'u16, 1'u16, 2'u16]], |
90 instanceCount=2, | 116 instanceCount=2, |
91 material=mat, | 117 material=mat, |
92 ) | 118 ) |
93 mymesh1.setInstanceData("translate", @[newVec3f(0.3, 0.0)]) | 119 mymesh1.setInstanceData("translate", @[newVec3f( 0.4, 0.4)]) |
94 mymesh2.setInstanceData("translate", @[newVec3f(0.0, 0.3)]) | 120 mymesh2.setInstanceData("translate", @[newVec3f( 0.4, -0.4)]) |
95 mymesh3.setInstanceData("translate", @[newVec3f(-0.3, 0.0)]) | 121 mymesh3.setInstanceData("translate", @[newVec3f(-0.4, -0.4)]) |
96 mymesh4.setInstanceData("translate", @[newVec3f(0.0, -0.3), newVec3f(0.0, 0.5)]) | 122 mymesh4.setInstanceData("translate", @[newVec3f(-0.4, 0.4), newVec3f(0.0, 0.0)]) |
97 result = newEntity("root", [], newEntity("triangle", {"mesh1": Component(mymesh4), "mesh2": Component(mymesh3), "mesh3": Component(mymesh2), "mesh4": Component(mymesh1)})) | 123 result = newEntity("root", [], newEntity("triangle", {"mesh1": Component(mymesh4), "mesh2": Component(mymesh3), "mesh3": Component(mymesh2), "mesh4": Component(mymesh1)})) |
98 | 124 |
99 proc scene_primitives(): Entity = | 125 proc scene_primitives(): Entity = |
100 var r = rect(color="ff0000") | 126 var r = rect(color="ff0000") |
101 var t = tri(color="0000ff") | 127 var t = tri(color="0000ff") |
102 var c = circle(color="00ff00") | 128 var c = circle(color="00ff00") |
103 t.material = mat | 129 r.material = mat |
104 t.material = mat | 130 t.material = mat |
105 c.material = mat | 131 c.material = mat |
106 | 132 |
107 r.setInstanceData("translate", @[newVec3f(0.5, -0.3)]) | 133 r.setInstanceData("translate", @[newVec3f(0.5, -0.3)]) |
108 t.setInstanceData("translate", @[newVec3f(0.3, 0.3)]) | 134 t.setInstanceData("translate", @[newVec3f(0.3, 0.3)]) |
109 c.setInstanceData("translate", @[newVec3f(-0.3, 0.1)]) | 135 c.setInstanceData("translate", @[newVec3f(-0.3, 0.1)]) |
110 result = newEntity("root", {"mesh1": Component(t), "mesh2": Component(r), "mesh3": Component(c)}) | 136 result = newEntity("root", {"mesh1": Component(t), "mesh2": Component(r), "mesh3": Component(c)}) |
111 | 137 |
112 proc scene_flag(): Entity = | 138 proc scene_flag(): Entity = |
113 var r = rect(color="ff0000") | 139 var r = rect(color="ffffff") |
114 r.material = mat | 140 r.material = mat |
115 r.updateMeshData("color", @[newVec4f(0, 0), newVec4f(1, 0), newVec4f(1, 1), newVec4f(0, 1)]) | |
116 result = newEntity("root", {"mesh": Component(r)}) | 141 result = newEntity("root", {"mesh": Component(r)}) |
142 | |
143 proc scene_multi_material(): Entity = | |
144 var | |
145 r1 = rect(color="ffffff") | |
146 r2 = rect(color="000000") | |
147 r1.material = mat | |
148 r2.material = mat3 | |
149 r1.setInstanceData("translate", @[newVec3f(-0.5)]) | |
150 r2.setInstanceData("translate", @[newVec3f(+0.5)]) | |
151 result = newEntity("root", {"mesh1": Component(r1), "mesh2": Component(r2)}) | |
117 | 152 |
118 proc main() = | 153 proc main() = |
119 var engine = initEngine("Test") | 154 var engine = initEngine("Test") |
120 | 155 |
121 # INIT RENDERER: | 156 # INIT RENDERER: |
122 const | 157 const |
123 shaderConfiguration = createShaderConfiguration( | 158 shaderConfiguration = createShaderConfiguration( |
124 inputs=[ | 159 inputs=[ |
125 attr[Vec3f]("position", memoryPerformanceHint=PreferFastRead), | 160 attr[Vec3f]("position", memoryPerformanceHint=PreferFastRead), |
126 attr[Vec4f]("color", memoryPerformanceHint=PreferFastWrite), | 161 attr[Vec4f]("color", memoryPerformanceHint=PreferFastWrite), |
127 attr[Vec3f]("translate", perInstance=true) | 162 attr[Vec3f]("translate", perInstance=true), |
163 attr[uint16]("materialIndex", perInstance=true), | |
128 ], | 164 ], |
129 intermediates=[attr[Vec4f]("outcolor")], | 165 intermediates=[ |
166 attr[Vec4f]("outcolor"), | |
167 attr[uint16]("materialIndexOut", noInterpolation=true), | |
168 ], | |
130 outputs=[attr[Vec4f]("color")], | 169 outputs=[attr[Vec4f]("color")], |
131 uniforms=[attr[float32]("time")], | 170 uniforms=[attr[float32]("time")], |
132 samplers=[attr[Sampler2DType]("my_little_texture")], | 171 samplers=[ |
133 vertexCode="""gl_Position = vec4(position + translate, 1.0); outcolor = color;""", | 172 attr[Sampler2DType]("my_little_texture", arrayCount=2) |
134 fragmentCode="color = texture(my_little_texture, outcolor.xy) * 0.5 + outcolor * 0.5;", | 173 ], |
174 vertexCode="""gl_Position = vec4(position + translate, 1.0); outcolor = color; materialIndexOut = materialIndex;""", | |
175 fragmentCode="color = texture(my_little_texture[materialIndexOut], outcolor.xy) * 0.5 + outcolor * 0.5;", | |
135 ) | 176 ) |
136 engine.setRenderer({"my_material": shaderConfiguration}.toTable) | 177 engine.initRenderer({ |
178 "my_material": shaderConfiguration, | |
179 "my_special_material": shaderConfiguration, | |
180 }.toTable) | |
137 | 181 |
138 # INIT SCENES | 182 # INIT SCENES |
139 var scenes = [ | 183 var scenes = [ |
140 newScene("simple", scene_simple(), transformAttribute="", materialIndexAttribute=""), | 184 newScene("simple", scene_simple(), transformAttribute=""), |
141 newScene("different mesh types", scene_different_mesh_types(), transformAttribute="", materialIndexAttribute=""), | 185 newScene("different mesh types", scene_different_mesh_types(), transformAttribute=""), |
142 newScene("primitives", scene_primitives(), transformAttribute="", materialIndexAttribute=""), | 186 newScene("primitives", scene_primitives(), transformAttribute=""), |
143 newScene("flag", scene_flag(), transformAttribute="", materialIndexAttribute=""), | 187 newScene("flag", scene_multi_material(), transformAttribute=""), |
144 ] | 188 ] |
145 | 189 |
146 for scene in scenes.mitems: | 190 for scene in scenes.mitems: |
147 scene.addShaderGlobal("time", 0.0'f32) | 191 scene.addShaderGlobal("time", 0.0'f32) |
148 engine.addScene(scene) | 192 engine.addScene(scene) |