Mercurial > games > semicongine
comparison tests/test_mesh.nim @ 1021:73b572f82a1f
add: bases for a better input-system
author | sam <sam@basx.dev> |
---|---|
date | Thu, 09 May 2024 23:02:35 +0700 |
parents | 6406766a222d |
children | 74957cbf589b |
comparison
equal
deleted
inserted
replaced
1020:355ef428b5f4 | 1021:73b572f82a1f |
---|---|
1 import std/strformat | 1 import std/strformat |
2 import semicongine | 2 import semicongine |
3 | 3 |
4 const | |
5 MeshMaterial* = MaterialType( | |
6 name: "colored single texture material", | |
7 vertexAttributes: { | |
8 "position": Vec3F32, | |
9 "texcoord_0": Vec2F32, | |
10 }.toTable, | |
11 attributes: {"baseTexture": TextureType, "color": Vec4F32}.toTable | |
12 ) | |
13 | |
4 proc main() = | 14 proc main() = |
5 var scenes = [ | 15 var scenes = [ |
6 Scene(name: "Donut", meshes: loadMeshes("donut.glb", COLORED_SINGLE_TEXTURE_MATERIAL)[0].toSeq), | 16 Scene(name: "Donut", meshes: loadMeshes("donut.glb", MeshMaterial)[0].toSeq), |
7 ] | 17 ] |
8 | 18 |
9 var engine = initEngine("Test meshes") | 19 var engine = initEngine("Test meshes") |
10 const | 20 const |
11 shaderConfiguration = createShaderConfiguration( | 21 shaderConfiguration = createShaderConfiguration( |
22 name = "default shader", | |
12 inputs = [ | 23 inputs = [ |
13 attr[Vec3f]("position", memoryPerformanceHint = PreferFastRead), | 24 attr[Vec3f]("position", memoryPerformanceHint = PreferFastRead), |
14 attr[uint16](MATERIALINDEX_ATTRIBUTE, memoryPerformanceHint = PreferFastRead, perInstance = true), | 25 attr[uint16](MATERIALINDEX_ATTRIBUTE, memoryPerformanceHint = PreferFastRead, perInstance = true), |
15 attr[Vec2f]("texcoord_0", memoryPerformanceHint = PreferFastRead), | 26 attr[Vec2f]("texcoord_0", memoryPerformanceHint = PreferFastRead), |
16 attr[Mat4]("transform", memoryPerformanceHint = PreferFastWrite, perInstance = true), | 27 attr[Mat4]("transform", memoryPerformanceHint = PreferFastWrite, perInstance = true), |
26 attr[Mat4]("view"), | 37 attr[Mat4]("view"), |
27 attr[Vec4f]("color", arrayCount = 4), | 38 attr[Vec4f]("color", arrayCount = 4), |
28 ], | 39 ], |
29 samplers = [attr[Texture]("baseTexture", arrayCount = 4)], | 40 samplers = [attr[Texture]("baseTexture", arrayCount = 4)], |
30 vertexCode = &""" | 41 vertexCode = &""" |
31 gl_Position = vec4(position, 1.0) * (transform * Uniforms.view * Uniforms.projection); | 42 gl_Position = vec4(position, 1.0) * (transform * (Uniforms.view * Uniforms.projection)); |
32 vertexColor = Uniforms.color[{MATERIALINDEX_ATTRIBUTE}]; | 43 vertexColor = Uniforms.color[{MATERIALINDEX_ATTRIBUTE}]; |
33 colorTexCoord = texcoord_0; | 44 colorTexCoord = texcoord_0; |
34 materialIndexOut = {MATERIALINDEX_ATTRIBUTE}; | 45 materialIndexOut = {MATERIALINDEX_ATTRIBUTE}; |
35 """, | 46 """, |
36 fragmentCode = "color = texture(baseTexture[materialIndexOut], colorTexCoord) * vertexColor;" | 47 fragmentCode = "color = texture(baseTexture[materialIndexOut], colorTexCoord) * vertexColor;" |
37 ) | 48 ) |
38 engine.initRenderer({COLORED_SINGLE_TEXTURE_MATERIAL: shaderConfiguration}) | 49 engine.initRenderer({MeshMaterial: shaderConfiguration}) |
39 | 50 |
40 for scene in scenes.mitems: | 51 for scene in scenes.mitems: |
41 scene.addShaderGlobal("projection", Unit4F32) | 52 scene.addShaderGlobal("projection", Unit4F32) |
42 scene.addShaderGlobal("view", Unit4F32) | 53 scene.addShaderGlobal("view", Unit4F32) |
43 engine.loadScene(scene) | 54 engine.loadScene(scene) |
46 size = 1'f32 | 57 size = 1'f32 |
47 elevation = 0'f32 | 58 elevation = 0'f32 |
48 azimut = 0'f32 | 59 azimut = 0'f32 |
49 currentScene = 0 | 60 currentScene = 0 |
50 | 61 |
51 while engine.updateInputs() == Running and not engine.keyIsDown(Escape): | 62 while engine.updateInputs() and not keyIsDown(Escape): |
52 if engine.keyWasPressed(`1`): | 63 if keyWasPressed(`1`): |
53 currentScene = 0 | 64 currentScene = 0 |
54 elif engine.keyWasPressed(`2`): | 65 elif keyWasPressed(`2`): |
55 currentScene = 1 | 66 currentScene = 1 |
56 elif engine.keyWasPressed(`3`): | 67 elif keyWasPressed(`3`): |
57 currentScene = 2 | 68 currentScene = 2 |
58 elif engine.keyWasPressed(`4`): | 69 elif keyWasPressed(`4`): |
59 currentScene = 3 | 70 currentScene = 3 |
60 elif engine.keyWasPressed(`5`): | 71 elif keyWasPressed(`5`): |
61 currentScene = 4 | 72 currentScene = 4 |
62 elif engine.keyWasPressed(`6`): | 73 elif keyWasPressed(`6`): |
63 currentScene = 5 | 74 currentScene = 5 |
64 | 75 |
65 if engine.keyWasPressed(NumberRowExtra3): | 76 if keyWasPressed(NumberRowExtra3): |
66 size = 0.3'f32 | 77 size = 0.3'f32 |
67 elevation = 0'f32 | 78 elevation = 0'f32 |
68 azimut = 0'f32 | 79 azimut = 0'f32 |
69 | 80 |
70 let ratio = engine.getWindow().size[0] / engine.getWindow().size[1] | 81 let ratio = engine.getWindow().size[0] / engine.getWindow().size[1] |
71 size *= 1'f32 + engine.mouseWheel() * 0.05 | 82 size *= 1'f32 + mouseWheel() * 0.05 |
72 azimut += engine.mouseMove().x / 180'f32 | 83 azimut += mouseMove().x / 180'f32 |
73 elevation -= engine.mouseMove().y / 180'f32 | 84 elevation -= mouseMove().y / 180'f32 |
74 scenes[currentScene].setShaderGlobal("projection", ortho(-ratio, ratio, -1, 1, -1, 1)) | 85 scenes[currentScene].setShaderGlobal("projection", perspective(PI / 2, ratio, -0.5, 1)) |
75 scenes[currentScene].setShaderGlobal( | 86 scenes[currentScene].setShaderGlobal( |
76 "view", | 87 "view", |
77 scale(size, size, size) * rotate(elevation, newVec3f(1, 0, 0)) * rotate(azimut, Yf32) | 88 scale(size, size, size) * rotate(elevation, newVec3f(1, 0, 0)) * rotate(azimut, Yf32) |
78 ) | 89 ) |
79 engine.renderScene(scenes[currentScene]) | 90 engine.renderScene(scenes[currentScene]) |