comparison examples/E03_hello_cube.nim @ 141:8bb27869b649

did: migrate to new engine version
author Sam <sam@basx.dev>
date Sat, 22 Apr 2023 17:34:59 +0700
parents 779607656b12
children a4e6e76128e6
comparison
equal deleted inserted replaced
140:29f0109c5222 141:8bb27869b649
11 import std/times 11 import std/times
12 import std/strutils 12 import std/strutils
13 13
14 import semicongine 14 import semicongine
15 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
30
31 proc globalUpdate(engine: var Engine, t, dt: float32) =
32 let ratio = float32(engine.vulkan.frameSize.y) / float32(
33 engine.vulkan.frameSize.x)
34 uniforms.model.value = translate3d(0'f32, 0'f32, 10'f32) * rotate3d(t,
35 Yf32) # * rotate3d(float32(PI), Yf32)
36
37 uniforms.view.value = Unit44f32
38 uniforms.projection.value = Mat44(data: [
39 ratio, 0'f32, 0'f32, 0'f32,
40 0'f32, 1'f32, 0'f32, 0'f32,
41 0'f32, 0'f32, 1'f32, 0'f32,
42 0'f32, 0'f32, 0'f32, 1'f32,
43 ])
44 uniforms.projection.value = perspective(float32(PI / 4), float32(
45 engine.vulkan.frameSize.x) / float32(
46 engine.vulkan.frameSize.y), 0.1'f32, 100'f32)
47 engine.vulkan.device.updateUniformData(pipeline, uniforms)
48
49 const 16 const
50 TopLeftFront = Vec3([-0.5'f32, -0.5'f32, -0.5'f32]) 17 TopLeftFront = newVec3f(-0.5'f32, -0.5'f32, -0.5'f32)
51 TopRightFront = Vec3([0.5'f32, -0.5'f32, -0.5'f32]) 18 TopRightFront = newVec3f(0.5'f32, -0.5'f32, -0.5'f32)
52 BottomRightFront = Vec3([0.5'f32, 0.5'f32, -0.5'f32]) 19 BottomRightFront = newVec3f(0.5'f32, 0.5'f32, -0.5'f32)
53 BottomLeftFront = Vec3([-0.5'f32, 0.5'f32, -0.5'f32]) 20 BottomLeftFront = newVec3f(-0.5'f32, 0.5'f32, -0.5'f32)
54 TopLeftBack = Vec3([0.5'f32, -0.5'f32, 0.5'f32]) 21 TopLeftBack = newVec3f(0.5'f32, -0.5'f32, 0.5'f32)
55 TopRightBack = Vec3([-0.5'f32, -0.5'f32, 0.5'f32]) 22 TopRightBack = newVec3f(-0.5'f32, -0.5'f32, 0.5'f32)
56 BottomRightBack = Vec3([-0.5'f32, 0.5'f32, 0.5'f32]) 23 BottomRightBack = newVec3f(-0.5'f32, 0.5'f32, 0.5'f32)
57 BottomLeftBack = Vec3([0.5'f32, 0.5'f32, 0.5'f32]) 24 BottomLeftBack = newVec3f(0.5'f32, 0.5'f32, 0.5'f32)
58 const 25 const
59 cube_pos = @[ 26 cube_pos = @[
60 TopLeftFront, TopRightFront, BottomRightFront, BottomLeftFront, # front 27 TopLeftFront, TopRightFront, BottomRightFront, BottomLeftFront, # front
61 TopLeftBack, TopRightBack, BottomRightBack, BottomLeftBack, # back 28 TopLeftBack, TopRightBack, BottomRightBack, BottomLeftBack, # back
62 TopLeftBack, TopLeftFront, BottomLeftFront, BottomLeftBack, # left 29 TopLeftBack, TopLeftFront, BottomLeftFront, BottomLeftBack, # left
78 let off = i * 4 45 let off = i * 4
79 tris.add [off + 0'u16, off + 1'u16, off + 2'u16] 46 tris.add [off + 0'u16, off + 1'u16, off + 2'u16]
80 tris.add [off + 2'u16, off + 3'u16, off + 0'u16] 47 tris.add [off + 2'u16, off + 3'u16, off + 0'u16]
81 48
82 when isMainModule: 49 when isMainModule:
83 var myengine = igniteEngine("Hello cube") 50 var myengine = initEngine("Hello cube")
84 51
85 # build a mesh 52 const
86 var trianglemesh = new Mesh[VertexDataA, uint16] 53 vertexInput = @[
87 trianglemesh.indexed = true 54 attr[Vec3f]("position", memoryLocation=VRAM),
88 trianglemesh.vertexData = VertexDataA( 55 attr[Vec3f]("color", memoryLocation=VRAMVisible),
89 position: PositionAttribute[Vec3](data: cube_pos), 56 ]
90 color: ColorAttribute[Vec3](data: cube_color), 57 vertexOutput = @[attr[Vec3f]("outcolor")]
91 ) 58 uniforms = @[
92 trianglemesh.indices = tris 59 attr[Mat4]("projection"),
93 var cube = newThing("cube", trianglemesh) 60 attr[Mat4]("view"),
61 attr[Mat4]("model"),
62 ]
63 fragOutput = @[attr[Vec4f]("color")]
64 vertexCode = compileGlslShader(
65 stage=VK_SHADER_STAGE_VERTEX_BIT,
66 inputs=vertexInput,
67 uniforms=uniforms,
68 outputs=vertexOutput,
69 main="""outcolor = color; gl_Position = (Uniforms.projection * Uniforms.view * Uniforms.model) * vec4(position, 1);"""
70 )
71 fragmentCode = compileGlslShader(
72 stage=VK_SHADER_STAGE_FRAGMENT_BIT,
73 inputs=vertexOutput,
74 uniforms=uniforms,
75 outputs=fragOutput,
76 main="color = vec4(outcolor, 1);"
77 )
78 myengine.setRenderer(myengine.gpuDevice.simpleForwardRenderPass(vertexCode, fragmentCode))
79 var
80 projection = initShaderGlobal("projection", Unit4f32)
81 view = initShaderGlobal("view", Unit4f32)
82 model = initShaderGlobal("model", Unit4f32)
83 cube = newEntity("cube", newMesh(positions=cube_pos, indices=tris, colors=cube_color))
84 cube.components.add projection
85 cube.components.add view
86 cube.components.add model
87 myengine.addScene(cube, vertexInput)
94 88
95 # upload data, prepare shaders, etc 89 var t: float32 = cpuTime()
96 const vertexShader = generateVertexShaderCode[VertexDataA, Uniforms](""" 90 while myengine.running and not myengine.keyWasPressed(Escape):
97 out_position = (uniforms.projection * uniforms.view * uniforms.model) * vec4(in_position, 1); 91 myengine.updateInputs()
98 """) 92 setValue[Mat4](model.value, translate3d(0'f32, 0'f32, 10'f32) * rotate3d(t, Yf32))
99 const fragmentShader = generateFragmentShaderCode[VertexDataA]() 93 setValue[Mat4](
100 pipeline = setupPipeline[VertexDataA, Uniforms, uint16]( 94 projection.value,
101 myengine, 95 perspective(
102 cube, 96 float32(PI / 4),
103 vertexShader, 97 float32(myengine.getWindow().size[0]) / float32(myengine.getWindow().size[0]),
104 fragmentShader 98 0.1'f32,
105 ) 99 100'f32
106 # show something 100 )
107 myengine.run(pipeline, globalUpdate) 101 )
108 pipeline.trash() 102 t = cpuTime()
109 myengine.trash() 103
104 myengine.renderScene(cube)
105
106 myengine.destroy()