Mercurial > games > semicongine
comparison old_tests/test_vulkan_wrapper.nim @ 1203:6360c8d17ce0 compiletime-tests
did: preprations to add rendering tests
| author | sam <sam@basx.dev> |
|---|---|
| date | Mon, 15 Jul 2024 20:06:42 +0700 |
| parents | tests/test_vulkan_wrapper.nim@114f395b9144 |
| children |
comparison
equal
deleted
inserted
replaced
| 1202:a8864fe6fe6e | 1203:6360c8d17ce0 |
|---|---|
| 1 import std/tables | |
| 2 | |
| 3 import semicongine | |
| 4 | |
| 5 | |
| 6 let | |
| 7 sampler = Sampler( | |
| 8 magnification: VK_FILTER_NEAREST, | |
| 9 minification: VK_FILTER_NEAREST, | |
| 10 wrapModeS: VK_SAMPLER_ADDRESS_MODE_REPEAT, | |
| 11 wrapModeT: VK_SAMPLER_ADDRESS_MODE_REPEAT, | |
| 12 ) | |
| 13 (R, W) = ([255'u8, 0'u8, 0'u8, 255'u8], [255'u8, 255'u8, 255'u8, 255'u8]) | |
| 14 Mat1Type = MaterialType( | |
| 15 name: "single texture material 1", | |
| 16 vertexAttributes: { | |
| 17 "color": Vec4F32, | |
| 18 "position": Vec3F32, | |
| 19 "uv": Vec2F32, | |
| 20 }.toTable, | |
| 21 attributes: {"baseTexture": TextureType}.toTable | |
| 22 ) | |
| 23 mat = Mat1Type.InitMaterialData( | |
| 24 name = "mat", | |
| 25 attributes = { | |
| 26 "baseTexture": InitDataList(@[Texture(isGrayscale: false, colorImage: Image[RGBAPixel](width: 5, height: 5, imagedata: @[ | |
| 27 R, R, R, R, R, | |
| 28 R, R, W, R, R, | |
| 29 R, W, W, W, R, | |
| 30 R, R, W, R, R, | |
| 31 R, R, R, R, R, | |
| 32 ]), sampler: sampler)]) | |
| 33 }.toTable | |
| 34 ) | |
| 35 Mat2Type = MaterialType( | |
| 36 name: "single texture material 2", | |
| 37 vertexAttributes: { | |
| 38 "color": Vec4F32, | |
| 39 "position": Vec3F32, | |
| 40 "uv": Vec2F32, | |
| 41 }.toTable, | |
| 42 attributes: {"baseTexture": TextureType}.toTable | |
| 43 ) | |
| 44 mat2 = Mat2Type.InitMaterialData( | |
| 45 name = "mat2", | |
| 46 attributes = { | |
| 47 "baseTexture": InitDataList(@[Texture(isGrayscale: false, colorImage: Image[RGBAPixel](width: 5, height: 5, imagedata: @[ | |
| 48 R, W, R, W, R, | |
| 49 W, R, W, R, W, | |
| 50 R, W, R, W, R, | |
| 51 W, R, W, R, W, | |
| 52 R, W, R, W, R, | |
| 53 ]), sampler: sampler)]) | |
| 54 }.toTable | |
| 55 ) | |
| 56 mat3 = SINGLE_COLOR_MATERIAL.InitMaterialData( | |
| 57 name = "mat3", | |
| 58 attributes = { | |
| 59 "color": InitDataList(@[NewVec4f(0, 1, 0, 1)]) | |
| 60 }.toTable | |
| 61 ) | |
| 62 | |
| 63 proc scene_different_mesh_types(): seq[Mesh] = | |
| 64 @[ | |
| 65 NewMesh( | |
| 66 positions = [NewVec3f(0.0, -0.5), NewVec3f(0.5, 0.5), NewVec3f(-0.5, 0.5)], | |
| 67 uvs = [NewVec2f(0.0, -0.5), NewVec2f(0.5, 0.5), NewVec2f(-0.5, 0.5)], | |
| 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)], | |
| 69 material = mat, | |
| 70 transform = Translate(-0.7, -0.5), | |
| 71 ), | |
| 72 NewMesh( | |
| 73 positions = [NewVec3f(0.0, -0.4), NewVec3f(0.4, 0.4), NewVec3f(-0.4, 0.5)], | |
| 74 uvs = [NewVec2f(0.0, -0.4), NewVec2f(0.4, 0.4), NewVec2f(-0.4, 0.5)], | |
| 75 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)], | |
| 76 material = mat, | |
| 77 transform = Translate(0, -0.5), | |
| 78 ), | |
| 79 NewMesh( | |
| 80 positions = [NewVec3f(0.0, 0.5), NewVec3f(0.5, -0.5), NewVec3f(-0.5, -0.5)], | |
| 81 uvs = [NewVec2f(0.0, 0.5), NewVec2f(0.5, -0.5), NewVec2f(-0.5, -0.5)], | |
| 82 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)], | |
| 83 indices = [[0'u16, 2'u16, 1'u16]], | |
| 84 material = mat2, | |
| 85 transform = Translate(0.7, -0.5), | |
| 86 ), | |
| 87 NewMesh( | |
| 88 positions = [NewVec3f(0.0, 0.4), NewVec3f(0.4, -0.4), NewVec3f(-0.4, -0.4)], | |
| 89 uvs = [NewVec2f(0.0, 0.4), NewVec2f(0.4, -0.4), NewVec2f(-0.4, -0.4)], | |
| 90 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)], | |
| 91 indices = [[0'u16, 2'u16, 1'u16]], | |
| 92 material = mat2, | |
| 93 transform = Translate(-0.7, 0.5), | |
| 94 ), | |
| 95 NewMesh( | |
| 96 positions = [NewVec3f(0.4, 0.5), NewVec3f(0.9, -0.3), NewVec3f(0.0, -0.3)], | |
| 97 uvs = [NewVec2f(0.4, 0.5), NewVec2f(0.9, -0.3), NewVec2f(0.0, -0.3)], | |
| 98 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)], | |
| 99 indices = [[0'u32, 2'u32, 1'u32]], | |
| 100 autoResize = false, | |
| 101 material = mat2, | |
| 102 transform = Translate(0, 0.5), | |
| 103 ), | |
| 104 NewMesh( | |
| 105 positions = [NewVec3f(0.4, 0.5), NewVec3f(0.9, -0.3), NewVec3f(0.0, -0.3)], | |
| 106 uvs = [NewVec2f(0.4, 0.5), NewVec2f(0.9, -0.3), NewVec2f(0.0, -0.3)], | |
| 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)], | |
| 108 indices = [[0'u32, 2'u32, 1'u32]], | |
| 109 autoResize = false, | |
| 110 material = mat2, | |
| 111 transform = Translate(0.7, 0.5), | |
| 112 ), | |
| 113 ] | |
| 114 | |
| 115 proc scene_simple(): seq[Mesh] = | |
| 116 @[ | |
| 117 NewMesh( | |
| 118 positions = [NewVec3f(0.0, -0.3), NewVec3f(0.3, 0.3), NewVec3f(-0.3, 0.3)], | |
| 119 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)], | |
| 120 uvs = [NewVec2f(0.0, -0.3), NewVec2f(0.3, 0.3), NewVec2f(-0.3, 0.3)], | |
| 121 material = mat, | |
| 122 transform = Translate(0.4, 0.4), | |
| 123 ), | |
| 124 NewMesh( | |
| 125 positions = [NewVec3f(0.0, -0.5), NewVec3f(0.5, 0.5), NewVec3f(-0.5, 0.5)], | |
| 126 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)], | |
| 127 uvs = [NewVec2f(0.0, -0.5), NewVec2f(0.5, 0.5), NewVec2f(-0.5, 0.5)], | |
| 128 material = mat, | |
| 129 transform = Translate(0.4, -0.4), | |
| 130 ), | |
| 131 NewMesh( | |
| 132 positions = [NewVec3f(0.0, -0.6), NewVec3f(0.6, 0.6), NewVec3f(-0.6, 0.6)], | |
| 133 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)], | |
| 134 uvs = [NewVec2f(0.0, -0.6), NewVec2f(0.6, 0.6), NewVec2f(-0.6, 0.6)], | |
| 135 indices = [[0'u32, 1'u32, 2'u32]], | |
| 136 autoResize = false, | |
| 137 material = mat, | |
| 138 transform = Translate(-0.4, 0.4), | |
| 139 ), | |
| 140 NewMesh( | |
| 141 positions = [NewVec3f(0.0, -0.8), NewVec3f(0.8, 0.8), NewVec3f(-0.8, 0.8)], | |
| 142 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)], | |
| 143 uvs = [NewVec2f(0.0, -0.8), NewVec2f(0.8, 0.8), NewVec2f(-0.8, 0.8)], | |
| 144 indices = [[0'u16, 1'u16, 2'u16]], | |
| 145 instanceTransforms = [Unit4F32, Unit4F32], | |
| 146 material = mat, | |
| 147 transform = Translate(-0.4, -0.4), | |
| 148 ) | |
| 149 ] | |
| 150 | |
| 151 proc scene_primitives(): seq[Mesh] = | |
| 152 var r = Rect(color = "ff0000") | |
| 153 var t = Tri(color = "0000ff") | |
| 154 var c = Circle(color = "00ff00") | |
| 155 r.material = mat | |
| 156 t.material = mat | |
| 157 c.material = mat | |
| 158 r.transform = Translate(NewVec3f(0.5, -0.3)) | |
| 159 t.transform = Translate(NewVec3f(0.3, 0.3)) | |
| 160 c.transform = Translate(NewVec3f(-0.3, 0.1)) | |
| 161 result = @[r, c, t] | |
| 162 | |
| 163 proc scene_flag(): seq[Mesh] = | |
| 164 @[ | |
| 165 NewMesh( | |
| 166 positions = [NewVec3f(-1.0, -1.0), NewVec3f(1.0, -1.0), NewVec3f(1.0, 1.0), NewVec3f(-1.0, 1.0)], | |
| 167 uvs = [NewVec2f(-1.0, -1.0), NewVec2f(1.0, -1.0), NewVec2f(1.0, 1.0), NewVec2f(-1.0, 1.0)], | |
| 168 colors = [NewVec4f(-1, -1, 1, 1), NewVec4f(1, -1, 1, 1), NewVec4f(1, 1, 1, 1), NewVec4f(-1, 1, 1, 1)], | |
| 169 indices = [[0'u16, 1'u16, 2'u16], [2'u16, 3'u16, 0'u16]], | |
| 170 material = mat, | |
| 171 transform = Scale(0.5, 0.5) | |
| 172 ) | |
| 173 ] | |
| 174 | |
| 175 proc scene_multi_material(): seq[Mesh] = | |
| 176 var | |
| 177 r1 = Rect(color = "ffffff") | |
| 178 r2 = Rect(color = "000000") | |
| 179 r1.material = mat | |
| 180 r2.material = mat3 | |
| 181 r1.transform = Translate(NewVec3f(-0.5)) | |
| 182 r2.transform = Translate(NewVec3f(+0.5)) | |
| 183 result = @[r1, r2] | |
| 184 | |
| 185 proc main() = | |
| 186 var engine = InitEngine("Test") | |
| 187 | |
| 188 # INIT RENDERER: | |
| 189 const | |
| 190 shaderConfiguration1 = CreateShaderConfiguration( | |
| 191 name = "shader1", | |
| 192 inputs = [ | |
| 193 Attr[Vec3f]("position", memoryPerformanceHint = PreferFastRead), | |
| 194 Attr[Vec4f]("color", memoryPerformanceHint = PreferFastWrite), | |
| 195 Attr[Mat4]("transform", perInstance = true), | |
| 196 ], | |
| 197 intermediates = [ | |
| 198 Attr[Vec4f]("outcolor"), | |
| 199 ], | |
| 200 outputs = [Attr[Vec4f]("color")], | |
| 201 samplers = [Attr[Texture]("baseTexture")], | |
| 202 vertexCode = """gl_Position = vec4(position, 1.0) * transform; outcolor = color;""", | |
| 203 fragmentCode = "color = texture(baseTexture, outcolor.xy) * 0.5 + outcolor * 0.5;", | |
| 204 ) | |
| 205 shaderConfiguration2 = CreateShaderConfiguration( | |
| 206 name = "shader2", | |
| 207 inputs = [ | |
| 208 Attr[Vec3f]("position", memoryPerformanceHint = PreferFastRead), | |
| 209 Attr[Mat4]("transform", perInstance = true), | |
| 210 ], | |
| 211 intermediates = [Attr[Vec4f]("outcolor")], | |
| 212 outputs = [Attr[Vec4f]("color")], | |
| 213 uniforms = [Attr[Vec4f]("color", arrayCount = 1)], | |
| 214 vertexCode = """gl_Position = vec4(position, 1.0) * transform; outcolor = Uniforms.color[0];""", | |
| 215 fragmentCode = "color = outcolor;", | |
| 216 ) | |
| 217 engine.InitRenderer({ | |
| 218 Mat1Type: shaderConfiguration1, | |
| 219 Mat1Type: shaderConfiguration1, | |
| 220 Mat2Type: shaderConfiguration1, | |
| 221 SINGLE_COLOR_MATERIAL: shaderConfiguration2, | |
| 222 }) | |
| 223 | |
| 224 # INIT SCENES | |
| 225 var scenes = [ | |
| 226 Scene(name: "simple", meshes: scene_simple()), | |
| 227 Scene(name: "different mesh types", meshes: scene_different_mesh_types()), | |
| 228 Scene(name: "primitives", meshes: scene_primitives()), | |
| 229 Scene(name: "flag", meshes: scene_flag()), | |
| 230 Scene(name: "multimaterial", meshes: scene_multi_material()), | |
| 231 ] | |
| 232 | |
| 233 for scene in scenes.mitems: | |
| 234 engine.LoadScene(scene) | |
| 235 | |
| 236 # MAINLOOP | |
| 237 echo "Setup successfull, start rendering" | |
| 238 for i in 0 ..< 3: | |
| 239 for scene in scenes.mitems: | |
| 240 echo "rendering scene ", scene.name | |
| 241 for i in 0 ..< 1000: | |
| 242 if not engine.UpdateInputs() or KeyIsDown(Escape): | |
| 243 engine.Destroy() | |
| 244 return | |
| 245 engine.RenderScene(scene) | |
| 246 | |
| 247 # cleanup | |
| 248 echo "Start cleanup" | |
| 249 engine.Destroy() | |
| 250 | |
| 251 when isMainModule: | |
| 252 main() |
