comparison examples/hello_triangle.nim @ 493:680c4b8ca28a

add: working implementation of uniforms
author Sam <sam@basx.dev>
date Sat, 14 Jan 2023 23:34:50 +0700
parents 54a1f8ee208e
children 0c18638c7217
comparison
equal deleted inserted replaced
492:d63d980fa3bb 493:680c4b8ca28a
1 import std/times 1 import std/times
2 import std/strutils
3 import std/enumerate
2 4
3 import zamikongine/engine 5 import zamikongine/engine
4 import zamikongine/math/vector 6 import zamikongine/math/vector
7 import zamikongine/math/matrix
5 import zamikongine/vertex 8 import zamikongine/vertex
9 import zamikongine/descriptor
6 import zamikongine/mesh 10 import zamikongine/mesh
7 import zamikongine/thing 11 import zamikongine/thing
8 import zamikongine/shader 12 import zamikongine/shader
9 import zamikongine/buffer 13 import zamikongine/buffer
10 14
11 type 15 type
12 # define type of vertex 16 # define type of vertex
13 VertexDataA = object 17 VertexDataA = object
14 position: VertexAttribute[Vec2[float32]] 18 position: PositionAttribute[Vec2[float32]]
15 color: VertexAttribute[Vec3[float32]] 19 color: ColorAttribute[Vec3[float32]]
16 UniformType = float32 20 Uniforms = object
21 mat: Descriptor[Mat44[float32]]
22 dt: Descriptor[float32]
17 23
18 proc globalUpdate(engine: var Engine, dt: Duration) = 24 var pipeline: RenderPipeline[VertexDataA, Uniforms]
19 # var t = float32(dt.inNanoseconds) / 1_000_000_000'f32
20 # for buffer in engine.vulkan.uniformBuffers:
21 # buffer.updateData(t)
22 25
23 echo dt 26 var pos = 0'f32;
27 var uniforms = Uniforms(
28 mat: Descriptor[Mat44[float32]](value: Unit44f32),
29 dt: Descriptor[float32](value: 0'f32),
30 )
31 var scaledir = 1'f32
32 proc globalUpdate(engine: var Engine, dt: float32) =
33 uniforms.mat.value = uniforms.mat.value * scale3d(1 + scaledir * dt, 1 + scaledir * dt, 0'f32)
34 if uniforms.mat.value[0, 0] > 2'f32 or uniforms.mat.value[0, 0] < 0.5'f32:
35 scaledir = - scaledir
36 for buffer in pipeline.uniformBuffers:
37 buffer.updateData(uniforms)
38 echo uniforms.mat.value
24 39
25 # vertex data (types must match the above VertexAttributes) 40 # vertex data (types must match the above VertexAttributes)
26 const 41 const
27 triangle_pos = @[ 42 triangle_pos = @[
28 Vec2([ 0.0'f32, -0.5'f32]), 43 Vec2([ 0.0'f32, -0.5'f32]),
39 var myengine = igniteEngine("Hello triangle") 54 var myengine = igniteEngine("Hello triangle")
40 55
41 # build a mesh 56 # build a mesh
42 var trianglemesh = new Mesh[VertexDataA] 57 var trianglemesh = new Mesh[VertexDataA]
43 trianglemesh.vertexData = VertexDataA( 58 trianglemesh.vertexData = VertexDataA(
44 position: VertexAttribute[Vec2[float32]](data: triangle_pos), 59 position: PositionAttribute[Vec2[float32]](data: triangle_pos),
45 color: VertexAttribute[Vec3[float32]](data: triangle_color), 60 color: ColorAttribute[Vec3[float32]](data: triangle_color),
46 ) 61 )
47 # build a single-object scene graph 62 # build a single-object scene graph
48 var triangle = new Thing 63 var triangle = new Thing
49 # add the triangle mesh to the object 64 # add the triangle mesh to the object
50 triangle.parts.add trianglemesh 65 triangle.parts.add trianglemesh
51 66
52 # upload data, prepare shaders, etc 67 # upload data, prepare shaders, etc
53 var pipeline = setupPipeline[VertexDataA, UniformType, float32, uint16]( 68 const vertexShader = generateVertexShaderCode[VertexDataA, Uniforms](
69 # have 1 at:
70 # [2][0] [0][3]
71 # "out_position = vec4(in_position[0] + uniforms.mat[0][0], in_position[1] + uniforms.mat[0][0], 0, 1);"
72 "out_position = uniforms.mat * vec4(in_position, 0, 1);"
73 # "out_position = vec4(in_position, 0, 1);"
74 )
75 const fragmentShader = generateFragmentShaderCode[VertexDataA]()
76 static:
77 echo "--------------"
78 for (i, line) in enumerate(vertexShader.splitLines()):
79 echo $(i + 1) & " " & line
80 echo "--------------"
81 echo fragmentShader
82 echo "--------------"
83 pipeline = setupPipeline[VertexDataA, Uniforms, uint16](
54 myengine, 84 myengine,
55 triangle, 85 triangle,
56 generateVertexShaderCode[VertexDataA]("main", "position", "color"), 86 vertexShader,
57 generateFragmentShaderCode[VertexDataA]("main"), 87 fragmentShader
58 ) 88 )
59 # show something 89 # show something
60 myengine.run(pipeline, globalUpdate) 90 myengine.run(pipeline, globalUpdate)
61 pipeline.trash() 91 pipeline.trash()
62 myengine.trash() 92 myengine.trash()