Mercurial > games > semicongine
comparison examples/E03_hello_cube.nim @ 61:0f04ba283558
did: rename and update older demos to work with new APIs
author | Sam <sam@basx.dev> |
---|---|
date | Tue, 24 Jan 2023 10:22:38 +0700 |
parents | examples/hello_cube.nim@c57285d292b6 |
children | bdef52f3bc0d |
comparison
equal
deleted
inserted
replaced
60:c57285d292b6 | 61:0f04ba283558 |
---|---|
1 # | |
2 # TODO: Needs Depth-Buffer first! | |
3 # | |
4 # | |
5 # | |
6 # | |
7 # | |
8 # | |
9 | |
10 | |
11 import std/times | |
12 import std/strutils | |
13 | |
14 import semicongine | |
15 | |
16 type | |
17 # define type of vertex | |
18 VertexDataA = object | |
19 position: PositionAttribute[Vec3] | |
20 color: ColorAttribute[Vec3] | |
21 Uniforms = object | |
22 model: Descriptor[Mat44] | |
23 view: Descriptor[Mat44] | |
24 projection: Descriptor[Mat44] | |
25 | |
26 var | |
27 pipeline: RenderPipeline[VertexDataA, Uniforms] | |
28 uniforms: Uniforms | |
29 t: float32 | |
30 | |
31 | |
32 proc globalUpdate(engine: var Engine, dt: float32) = | |
33 let ratio = float32(engine.vulkan.frameSize.y) / float32( | |
34 engine.vulkan.frameSize.x) | |
35 t += dt | |
36 uniforms.model.value = translate3d(0'f32, 0'f32, 10'f32) * rotate3d(t, | |
37 Yf32) # * rotate3d(float32(PI), Yf32) | |
38 | |
39 uniforms.view.value = Unit44f32 | |
40 uniforms.projection.value = Mat44(data: [ | |
41 ratio, 0'f32, 0'f32, 0'f32, | |
42 0'f32, 1'f32, 0'f32, 0'f32, | |
43 0'f32, 0'f32, 1'f32, 0'f32, | |
44 0'f32, 0'f32, 0'f32, 1'f32, | |
45 ]) | |
46 uniforms.projection.value = perspective(float32(PI / 4), float32( | |
47 engine.vulkan.frameSize.x) / float32( | |
48 engine.vulkan.frameSize.y), 0.1'f32, 100'f32) | |
49 engine.vulkan.device.updateUniformData(pipeline, uniforms) | |
50 | |
51 const | |
52 TopLeftFront = Vec3([-0.5'f32, -0.5'f32, -0.5'f32]) | |
53 TopRightFront = Vec3([0.5'f32, -0.5'f32, -0.5'f32]) | |
54 BottomRightFront = Vec3([0.5'f32, 0.5'f32, -0.5'f32]) | |
55 BottomLeftFront = Vec3([-0.5'f32, 0.5'f32, -0.5'f32]) | |
56 TopLeftBack = Vec3([0.5'f32, -0.5'f32, 0.5'f32]) | |
57 TopRightBack = Vec3([-0.5'f32, -0.5'f32, 0.5'f32]) | |
58 BottomRightBack = Vec3([-0.5'f32, 0.5'f32, 0.5'f32]) | |
59 BottomLeftBack = Vec3([0.5'f32, 0.5'f32, 0.5'f32]) | |
60 const | |
61 cube_pos = @[ | |
62 TopLeftFront, TopRightFront, BottomRightFront, BottomLeftFront, # front | |
63 TopLeftBack, TopRightBack, BottomRightBack, BottomLeftBack, # back | |
64 TopLeftBack, TopLeftFront, BottomLeftFront, BottomLeftBack, # left | |
65 TopRightBack, TopRightFront, BottomRightFront, BottomRightBack, # right | |
66 TopLeftBack, TopRightBack, TopRightFront, TopLeftFront, # top | |
67 BottomLeftFront, BottomRightFront, BottomRightBack, BottomLeftBack, # bottom | |
68 ] | |
69 cube_color = @[ | |
70 Rf32, Rf32, Rf32, Rf32, | |
71 Rf32 * 0.5'f32, Rf32 * 0.5'f32, Rf32 * 0.5'f32, Rf32 * 0.5'f32, | |
72 Gf32, Gf32, Gf32, Gf32, | |
73 Gf32 * 0.5'f32, Gf32 * 0.5'f32, Gf32 * 0.5'f32, Gf32 * 0.5'f32, | |
74 Bf32, Bf32, Bf32, Bf32, | |
75 Bf32 * 0.5'f32, Bf32 * 0.5'f32, Bf32 * 0.5'f32, Bf32 * 0.5'f32, | |
76 ] | |
77 var | |
78 tris: seq[array[3, uint16]] | |
79 for i in 0'u16 ..< 6'u16: | |
80 let off = i * 4 | |
81 tris.add [off + 0'u16, off + 1'u16, off + 2'u16] | |
82 tris.add [off + 2'u16, off + 3'u16, off + 0'u16] | |
83 | |
84 when isMainModule: | |
85 var myengine = igniteEngine("Hello cube") | |
86 | |
87 # build a mesh | |
88 var trianglemesh = new IndexedMesh[VertexDataA, uint16] | |
89 trianglemesh.vertexData = VertexDataA( | |
90 position: PositionAttribute[Vec3](data: cube_pos), | |
91 color: ColorAttribute[Vec3](data: cube_color), | |
92 ) | |
93 trianglemesh.indices = tris | |
94 var cube = newThing("cube", trianglemesh) | |
95 | |
96 # upload data, prepare shaders, etc | |
97 const vertexShader = generateVertexShaderCode[VertexDataA, Uniforms](""" | |
98 out_position = (uniforms.projection * uniforms.view * uniforms.model) * vec4(in_position, 1); | |
99 """) | |
100 const fragmentShader = generateFragmentShaderCode[VertexDataA]() | |
101 pipeline = setupPipeline[VertexDataA, Uniforms, uint16]( | |
102 myengine, | |
103 cube, | |
104 vertexShader, | |
105 fragmentShader | |
106 ) | |
107 # show something | |
108 myengine.run(pipeline, globalUpdate) | |
109 pipeline.trash() | |
110 myengine.trash() |