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()