Mercurial > games > semicongine
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() |
