Mercurial > games > semicongine
comparison tests/test_vulkan_wrapper.nim @ 323:9defff46da48
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 | 6dab370d1758 |
| children | cbfe96272205 |
comparison
equal
deleted
inserted
replaced
| 322:6dab370d1758 | 323:9defff46da48 |
|---|---|
| 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) |
