Mercurial > games > semicongine
comparison examples/input.nim @ 60:c57285d292b6
did: deep refactoring of handling vertrex attribute and buffer updates, don't ask ;(
author | Sam <sam@basx.dev> |
---|---|
date | Sun, 22 Jan 2023 22:46:53 +0700 |
parents | d7d9420ba675 |
children |
comparison
equal
deleted
inserted
replaced
59:d7d9420ba675 | 60:c57285d292b6 |
---|---|
1 import std/strutils | |
1 import std/times | 2 import std/times |
2 import std/strutils | |
3 import std/enumerate | |
4 | 3 |
5 import semicongine | 4 import semicongine |
6 | 5 |
7 type | 6 type |
8 # define type of vertex | 7 # define type of vertex |
9 VertexDataA = object | 8 VertexDataA = object |
10 position: PositionAttribute[Vec2] | 9 position: PositionAttribute[Vec2] |
11 color: ColorAttribute[Vec3] | 10 color: ColorAttribute[Vec3] |
12 iscursor: GenericAttribute[int32] | 11 # transform: ModelTransformAttribute |
12 # TODO: make this somehow a single vertex attribute | |
13 m1: GenericInstanceAttribute[Vec4] | |
14 m2: GenericInstanceAttribute[Vec4] | |
15 m3: GenericInstanceAttribute[Vec4] | |
16 m4: GenericInstanceAttribute[Vec4] | |
13 Uniforms = object | 17 Uniforms = object |
14 projection: Descriptor[Mat44] | 18 projection: Descriptor[Mat44] |
15 cursor: Descriptor[Vec2] | 19 cursor: Descriptor[Vec2] |
16 | 20 |
17 var | 21 var |
18 pipeline: RenderPipeline[VertexDataA, Uniforms] | 22 pipeline: RenderPipeline[VertexDataA, Uniforms] |
19 uniforms: Uniforms | 23 uniforms: Uniforms |
24 scene: Thing | |
25 time: float | |
20 | 26 |
21 | 27 |
22 proc globalUpdate(engine: var Engine, dt: float32) = | 28 proc globalUpdate(engine: var Engine, dt: float32) = |
23 uniforms.cursor.value[0] = float32(engine.input.mouseX) | 29 time += dt |
24 uniforms.cursor.value[1] = float32(engine.input.mouseY) | 30 uniforms.cursor.value = engine.input.mousePos |
25 uniforms.projection.value = ortho[float32]( | 31 uniforms.projection.value = ortho[float32]( |
26 0'f32, float32(engine.vulkan.frameDimension.width), | 32 0'f32, float32(engine.vulkan.frameSize.x), |
27 0'f32, float32(engine.vulkan.frameDimension.height), | 33 0'f32, float32(engine.vulkan.frameSize.y), |
28 0'f32, 1'f32, | 34 0'f32, 1'f32, |
29 ) | 35 ) |
30 echo uniforms.projection.value | 36 engine.vulkan.device.updateUniformData(pipeline, uniforms) |
31 # echo uniforms.projection | |
32 for buffer in pipeline.uniformBuffers: | |
33 buffer.updateData(uniforms) | |
34 | 37 |
35 # vertex data (types must match the above VertexAttributes) | 38 let cursor = firstPartWithName[Mesh[VertexDataA]](scene, "cursor") |
39 if cursor != nil: | |
40 for c in cursor.vertexData.color.data.mitems: | |
41 c[1] = (sin(time * 8) * 0.5 + 0.5) * 0.2 | |
42 c[2] = (sin(time * 8) * 0.5 + 0.5) * 0.2 | |
43 engine.vulkan.device.updateVertexData(cursor.vertexData.color) | |
44 var trans = Unit44 * translate3d(engine.input.mousePos.x, | |
45 engine.input.mousePos.y, 0'f32) | |
46 cursor.vertexData.m1.data = @[trans.col(0)] | |
47 cursor.vertexData.m2.data = @[trans.col(1)] | |
48 cursor.vertexData.m3.data = @[trans.col(2)] | |
49 cursor.vertexData.m4.data = @[trans.col(3)] | |
50 engine.vulkan.device.updateVertexData(cursor.vertexData.m1) | |
51 engine.vulkan.device.updateVertexData(cursor.vertexData.m2) | |
52 engine.vulkan.device.updateVertexData(cursor.vertexData.m3) | |
53 engine.vulkan.device.updateVertexData(cursor.vertexData.m4) | |
54 | |
55 | |
36 const | 56 const |
37 shape = @[ | 57 shape = @[ |
38 Vec2([- 1'f32, - 1'f32]), | 58 Vec2([ - 1'f32, - 1'f32]), |
39 Vec2([ 1'f32, - 1'f32]), | 59 Vec2([1'f32, - 1'f32]), |
40 Vec2([-0.3'f32, -0.3'f32]), | 60 Vec2([-0.3'f32, -0.3'f32]), |
41 Vec2([-0.3'f32, -0.3'f32]), | 61 Vec2([-0.3'f32, -0.3'f32]), |
42 Vec2([- 1'f32, 1'f32]), | 62 Vec2([ - 1'f32, 1'f32]), |
43 Vec2([- 1'f32, - 1'f32]), | 63 Vec2([ - 1'f32, - 1'f32]), |
44 ] | 64 ] |
45 colors = @[ | 65 colors = @[ |
46 Vec3([1'f32, 0'f32, 0'f32]), | 66 Vec3([1'f32, 0'f32, 0'f32]), |
47 Vec3([1'f32, 0'f32, 0'f32]), | 67 Vec3([1'f32, 0'f32, 0'f32]), |
48 Vec3([1'f32, 0'f32, 0'f32]), | 68 Vec3([1'f32, 0'f32, 0'f32]), |
52 ] | 72 ] |
53 | 73 |
54 when isMainModule: | 74 when isMainModule: |
55 var myengine = igniteEngine("Input") | 75 var myengine = igniteEngine("Input") |
56 | 76 |
57 # build a single-object scene graph | |
58 var cursor = new Thing | |
59 var cursormesh = new Mesh[VertexDataA] | 77 var cursormesh = new Mesh[VertexDataA] |
60 cursormesh.vertexData = VertexDataA( | 78 cursormesh.vertexData = VertexDataA( |
61 position: PositionAttribute[Vec2](data: shape), | 79 position: PositionAttribute[Vec2](data: shape, useOnDeviceMemory: true), |
62 color: ColorAttribute[Vec3](data: colors), | 80 color: ColorAttribute[Vec3](data: colors), |
63 iscursor: GenericAttribute[int32](data: @[1'i32, 1'i32, 1'i32, 1'i32, 1'i32, 1'i32]), | 81 # transform: ModelTransformAttribute(data: @[Unit44]), |
82 m1: GenericInstanceAttribute[Vec4](data: @[Unit44.row(0)]), | |
83 m2: GenericInstanceAttribute[Vec4](data: @[Unit44.row(1)]), | |
84 m3: GenericInstanceAttribute[Vec4](data: @[Unit44.row(2)]), | |
85 m4: GenericInstanceAttribute[Vec4](data: @[Unit44.row(3)]), | |
64 ) | 86 ) |
65 # transform the cursor a bit to make it look nice | 87 # transform the cursor a bit to make it look nice |
66 for i in 0 ..< cursormesh.vertexData.position.data.len: | 88 for i in 0 ..< cursormesh.vertexData.position.data.len: |
67 let cursorscale = ( | 89 let cursorscale = ( |
68 scale2d(20'f32, 20'f32) * | 90 scale2d(20'f32, 20'f32) * |
69 translate2d(1'f32, 1'f32) * | 91 translate2d(1'f32, 1'f32) * |
70 rotate2d(-float32(PI) / 4'f32) * | 92 rotate2d(-float32(PI) / 4'f32) * |
71 scale2d(0.5'f32, 1'f32) * | 93 scale2d(0.5'f32, 1'f32) * |
72 rotate2d(float32(PI) / 4'f32) | 94 rotate2d(float32(PI) / 4'f32) |
73 ) | 95 ) |
74 let pos = Vec3([cursormesh.vertexData.position.data[i][0], cursormesh.vertexData.position.data[i][1], 1'f32]) | 96 let pos = Vec3([cursormesh.vertexData.position.data[i][0], |
97 cursormesh.vertexData.position.data[i][1], 1'f32]) | |
75 cursormesh.vertexData.position.data[i] = (cursorscale * pos).xy | 98 cursormesh.vertexData.position.data[i] = (cursorscale * pos).xy |
76 cursor.parts.add cursormesh | |
77 | 99 |
78 var box = new Thing | |
79 var boxmesh = new Mesh[VertexDataA] | 100 var boxmesh = new Mesh[VertexDataA] |
80 boxmesh.vertexData = VertexDataA( | 101 boxmesh.vertexData = VertexDataA( |
81 position: PositionAttribute[Vec2](data: shape), | 102 position: PositionAttribute[Vec2](data: shape), |
82 color: ColorAttribute[Vec3](data: colors), | 103 color: ColorAttribute[Vec3](data: colors), |
83 iscursor: GenericAttribute[int32](data: @[1'i32, 1'i32, 1'i32, 1'i32, 1'i32, 1'i32]), | 104 # transform: ModelTransformAttribute(data: @[Unit44]), |
105 m1: GenericInstanceAttribute[Vec4](data: @[Unit44.row(0)]), | |
106 m2: GenericInstanceAttribute[Vec4](data: @[Unit44.row(1)]), | |
107 m3: GenericInstanceAttribute[Vec4](data: @[Unit44.row(2)]), | |
108 m4: GenericInstanceAttribute[Vec4](data: @[Unit44.row(3)]), | |
84 ) | 109 ) |
110 for i in 0 ..< boxmesh.vertexData.position.data.len: | |
111 let boxscale = translate2d(100'f32, 100'f32) * scale2d(100'f32, 100'f32) | |
112 let pos = Vec3([boxmesh.vertexData.position.data[i][0], | |
113 boxmesh.vertexData.position.data[i][1], 1'f32]) | |
114 boxmesh.vertexData.position.data[i] = (boxscale * pos).xy | |
115 echo boxmesh.vertexData.position.data | |
85 | 116 |
86 var scene = new Thing | 117 scene = newThing("scene") |
87 scene.children.add cursor | 118 scene.add newThing("cursor", cursormesh) |
119 scene.add newThing("a box", boxmesh, newTransform(Unit44), newTransform( | |
120 translate3d(1'f32, 0'f32, 0'f32))) | |
121 scene.add newTransform(scale3d(1.5'f32, 1.5'f32, 1.5'f32)) | |
88 | 122 |
89 # upload data, prepare shaders, etc | 123 # upload data, prepare shaders, etc |
90 const vertexShader = generateVertexShaderCode[VertexDataA, Uniforms](""" | 124 const vertexShader = generateVertexShaderCode[VertexDataA, Uniforms](""" |
91 out_position = uniforms.projection * vec4(in_position + (uniforms.cursor * iscursor), 0, 1); | 125 mat4 mat = mat4(m1, m2, m3, m4); |
126 out_position = uniforms.projection * mat * vec4(position, 0, 1); | |
92 """) | 127 """) |
128 echo vertexShader | |
93 const fragmentShader = generateFragmentShaderCode[VertexDataA]() | 129 const fragmentShader = generateFragmentShaderCode[VertexDataA]() |
94 echo vertexShader | |
95 echo fragmentShader | |
96 pipeline = setupPipeline[VertexDataA, Uniforms, uint16]( | 130 pipeline = setupPipeline[VertexDataA, Uniforms, uint16]( |
97 myengine, | 131 myengine, |
98 scene, | 132 scene, |
99 vertexShader, | 133 vertexShader, |
100 fragmentShader | 134 fragmentShader |