Mercurial > games > semicongine
comparison examples/E04_input.nim @ 336:887ddc8d45fd
did: update examples to work with improved scenegraph/material api, notice removed complexity!
author | Sam <sam@basx.dev> |
---|---|
date | Tue, 05 Sep 2023 00:28:35 +0700 |
parents | b145a05c2459 |
children | 55c9183f7ece |
comparison
equal
deleted
inserted
replaced
335:f05b4bef44d1 | 336:887ddc8d45fd |
---|---|
1 import std/enumerate | 1 import std/enumerate |
2 import std/tables | |
2 import std/typetraits | 3 import std/typetraits |
3 import std/math | 4 import std/math |
4 | 5 |
5 import ../src/semicongine | 6 import ../src/semicongine |
6 | 7 |
105 for i in 0 ..< positions.len: | 106 for i in 0 ..< positions.len: |
106 positions[i] = cursorscale * newVec3f(positions[i].x, positions[i].y) | 107 positions[i] = cursorscale * newVec3f(positions[i].x, positions[i].y) |
107 | 108 |
108 # define mesh objects | 109 # define mesh objects |
109 var | 110 var |
111 material = Material(name: "default") | |
110 cursormesh = newMesh( | 112 cursormesh = newMesh( |
111 positions=positions, | 113 positions=positions, |
112 colors=arrow_colors, | 114 colors=arrow_colors, |
113 instanceCount=1, | 115 material=material, |
114 ) | 116 ) |
115 keyboardmesh = newMesh( | 117 keyboardmesh = newMesh( |
116 positions=keyvertexpos, | 118 positions=keyvertexpos, |
117 colors=keyvertexcolor, | 119 colors=keyvertexcolor, |
118 indices=keymeshindices | 120 indices=keymeshindices, |
121 material=material, | |
119 ) | 122 ) |
120 backgroundmesh = newMesh( | 123 backgroundmesh = newMesh( |
121 positions= @[ | 124 positions= @[ |
122 newVec3f(0'f32, 0'f32), | 125 newVec3f(0'f32, 0'f32), |
123 newVec3f(1'f32, 0'f32), | 126 newVec3f(1'f32, 0'f32), |
129 backgroundColor, | 132 backgroundColor, |
130 backgroundColor, | 133 backgroundColor, |
131 backgroundColor, | 134 backgroundColor, |
132 ], | 135 ], |
133 indices= @[[0'u16, 1'u16, 2'u16], [2'u16, 3'u16, 0'u16]], | 136 indices= @[[0'u16, 1'u16, 2'u16], [2'u16, 3'u16, 0'u16]], |
137 material=material, | |
134 ) | 138 ) |
135 | 139 |
136 # define mesh objects | 140 # define mesh objects |
137 scene = newScene("scene", newEntity("scene")) | 141 var keyboard_center = translate( |
138 scene.root.add newEntity("background", {"mesh": Component(backgroundmesh)}) | |
139 let keyboard = newEntity("keyboard", {"mesh": Component(keyboardmesh)}) | |
140 keyboard.transform = translate3d( | |
141 -float32(rowWidth) / 2'f32, | 142 -float32(rowWidth) / 2'f32, |
142 -float32(tupleLen(keyRows) * (keyDimension + keyGap) - keyGap) / 2'f32, | 143 -float32(tupleLen(keyRows) * (keyDimension + keyGap) - keyGap) / 2'f32, |
143 0'f32 | 144 0'f32 |
144 ) | 145 ) |
145 scene.root.add newEntity("keyboard-center", [], keyboard) | 146 scene = Scene(name: "scene", meshes: @[backgroundmesh, keyboardmesh, cursormesh]) |
146 scene.root.add newEntity("cursor", {"mesh": Component(cursormesh)}) | |
147 | 147 |
148 # shaders | 148 # shaders |
149 const | 149 const |
150 inputs = @[ | 150 shaderConfiguration = createShaderConfiguration( |
151 attr[Vec3f]("position"), | 151 inputs=[ |
152 attr[Vec4f]("color", memoryPerformanceHint=PreferFastWrite), | 152 attr[Vec3f]("position"), |
153 attr[Mat4]("transform", memoryPerformanceHint=PreferFastWrite, perInstance=true), | 153 attr[Vec4f]("color", memoryPerformanceHint=PreferFastWrite), |
154 ] | 154 attr[Mat4]("transform", memoryPerformanceHint=PreferFastWrite, perInstance=true), |
155 intermediate = @[attr[Vec4f]("outcolor")] | 155 ], |
156 uniforms = @[attr[Mat4]("projection")] | 156 intermediates=[attr[Vec4f]("outcolor")], |
157 outputs = @[attr[Vec4f]("color")] | 157 uniforms=[attr[Mat4]("projection")], |
158 (vertexCode, fragmentCode) = compileVertexFragmentShaderSet( | 158 outputs=[attr[Vec4f]("color")], |
159 inputs=inputs, | |
160 intermediate=intermediate, | |
161 outputs=outputs, | |
162 uniforms=uniforms, | |
163 vertexCode="""outcolor = color; gl_Position = vec4(position, 1) * (transform * Uniforms.projection);""", | 159 vertexCode="""outcolor = color; gl_Position = vec4(position, 1) * (transform * Uniforms.projection);""", |
164 fragmentCode="color = outcolor;", | 160 fragmentCode="color = outcolor;", |
165 ) | 161 ) |
166 | 162 |
167 # set up rendering | 163 # set up rendering |
168 myengine.setRenderer(myengine.gpuDevice.simpleForwardRenderPass(vertexCode, fragmentCode, clearColor=newVec4f(0, 0, 0.5))) | 164 myengine.initRenderer({"default": shaderConfiguration}.toTable) |
169 myengine.addScene(scene, inputs, @[], transformAttribute="transform") | |
170 scene.addShaderGlobal("projection", Unit4f32) | 165 scene.addShaderGlobal("projection", Unit4f32) |
166 myengine.addScene(scene) | |
167 myengine.hideSystemCursor() | |
171 | 168 |
172 # mainloop | 169 # mainloop |
173 while myengine.updateInputs() == Running: | 170 while myengine.updateInputs() == Running: |
174 if myengine.windowWasResized(): | 171 if myengine.windowWasResized(): |
175 setShaderGlobal(scene, "projection", | 172 scene.setShaderGlobal("projection", |
176 ortho( | 173 ortho( |
177 0, float32(myengine.getWindow().size[0]), | 174 0, float32(myengine.getWindow().size[0]), |
178 0, float32(myengine.getWindow().size[1]), | 175 0, float32(myengine.getWindow().size[1]), |
179 0, 1, | 176 0, 1, |
180 ) | 177 ) |
181 ) | 178 ) |
182 let | 179 let |
183 winsize = myengine.getWindow().size | 180 winsize = myengine.getWindow().size |
184 center = translate3d(float32(winsize[0]) / 2'f32, float32(winsize[1]) / 2'f32, 0.1'f32) | 181 center = translate(float32(winsize[0]) / 2'f32, float32(winsize[1]) / 2'f32, 0.1'f32) |
185 scene.root.firstWithName("keyboard-center").transform = center | 182 keyboardmesh.transform = keyboard_center * center |
186 scene.root.firstWithName("background").transform = scale3d(float32(winsize[0]), float32(winsize[1]), 1'f32) | 183 backgroundmesh.transform = scale(float32(winsize[0]), float32(winsize[1]), 1'f32) |
187 | 184 |
188 let mousePos = translate3d(myengine.mousePosition().x + 20, myengine.mousePosition().y + 20, 0'f32) | 185 let mousePos = translate(myengine.mousePosition().x + 20, myengine.mousePosition().y + 20, 0'f32) |
189 scene.root.firstWithName("cursor").transform = mousePos | 186 cursormesh.transform = mousePos |
190 | 187 |
191 var mesh = Mesh(scene.root.firstWithName("keyboard")["mesh"]) | |
192 for (index, key) in enumerate(keyIndices): | 188 for (index, key) in enumerate(keyIndices): |
193 if myengine.keyWasPressed(key): | 189 if myengine.keyWasPressed(key): |
194 let baseIndex = uint32(index * 4) | 190 let baseIndex = index * 4 |
195 mesh.updateMeshData("color", baseIndex + 0, activeColor) | 191 keyboardmesh[].updateAttributeData("color", baseIndex + 0, activeColor) |
196 mesh.updateMeshData("color", baseIndex + 1, activeColor) | 192 keyboardmesh[].updateAttributeData("color", baseIndex + 1, activeColor) |
197 mesh.updateMeshData("color", baseIndex + 2, activeColor) | 193 keyboardmesh[].updateAttributeData("color", baseIndex + 2, activeColor) |
198 mesh.updateMeshData("color", baseIndex + 3, activeColor) | 194 keyboardmesh[].updateAttributeData("color", baseIndex + 3, activeColor) |
199 if myengine.keyWasReleased(key): | 195 if myengine.keyWasReleased(key): |
200 let baseIndex = uint32(index * 4) | 196 let baseIndex = index * 4 |
201 mesh.updateMeshData("color", baseIndex + 0, baseColor) | 197 keyboardmesh[].updateAttributeData("color", baseIndex + 0, baseColor) |
202 mesh.updateMeshData("color", baseIndex + 1, baseColor) | 198 keyboardmesh[].updateAttributeData("color", baseIndex + 1, baseColor) |
203 mesh.updateMeshData("color", baseIndex + 2, baseColor) | 199 keyboardmesh[].updateAttributeData("color", baseIndex + 2, baseColor) |
204 mesh.updateMeshData("color", baseIndex + 3, baseColor) | 200 keyboardmesh[].updateAttributeData("color", baseIndex + 3, baseColor) |
205 | 201 |
206 myengine.renderScene(scene) | 202 myengine.renderScene(scene) |
207 | 203 |
208 myengine.destroy() | 204 myengine.destroy() |