Mercurial > games > semicongine
diff examples/hello_cube.nim @ 499:3f1111f3b9f8
did: tons of stuff, input, refactoring, fix some errors, some template improvment, sorry for super-commit
author | Sam <sam@basx.dev> |
---|---|
date | Wed, 18 Jan 2023 09:52:03 +0700 |
parents | |
children | 0cb294c5d2fd |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/hello_cube.nim Wed Jan 18 09:52:03 2023 +0700 @@ -0,0 +1,130 @@ +# +# TODO: Needs Depth-Buffer first! +# +# +# +# +# +# +# +# +import std/times +import std/strutils +import std/enumerate + +import zamikongine/engine +import zamikongine/math/vector +import zamikongine/math/matrix +import zamikongine/vertex +import zamikongine/descriptor +import zamikongine/mesh +import zamikongine/thing +import zamikongine/shader +import zamikongine/buffer + +type + # define type of vertex + VertexDataA = object + position: PositionAttribute[Vec3[float32]] + color: ColorAttribute[Vec3[float32]] + Uniforms = object + model: Descriptor[Mat44[float32]] + view: Descriptor[Mat44[float32]] + projection: Descriptor[Mat44[float32]] + +var + pipeline: RenderPipeline[VertexDataA, Uniforms] + uniforms:Uniforms + t: float32 + + +proc globalUpdate(engine: var Engine, dt: float32) = + let ratio = float32(engine.vulkan.frameDimension.height) / float32(engine.vulkan.frameDimension.width) + t += dt + uniforms.model.value = translate3d(0'f32, 0'f32, 10'f32) * rotate3d(t, Yf32) # * rotate3d(float32(PI), Yf32) + + uniforms.view.value = Unit44f32 + uniforms.projection.value = Mat44[float32](data:[ + ratio, 0'f32, 0'f32, 0'f32, + 0'f32, 1'f32, 0'f32, 0'f32, + 0'f32, 0'f32, 1'f32, 0'f32, + 0'f32, 0'f32, 0'f32, 1'f32, + ]) + uniforms.projection.value = perspective(float32(PI / 4), float32(engine.vulkan.frameDimension.width) / float32(engine.vulkan.frameDimension.height), 0.1'f32, 100'f32) + for buffer in pipeline.uniformBuffers: + buffer.updateData(uniforms) + echo uniforms.projection.value + +const + TopLeftFront = Vec3([ -0.5'f32, -0.5'f32, -0.5'f32]) + TopRightFront = Vec3([ 0.5'f32, -0.5'f32, -0.5'f32]) + BottomRightFront = Vec3([ 0.5'f32, 0.5'f32, -0.5'f32]) + BottomLeftFront = Vec3([ -0.5'f32, 0.5'f32, -0.5'f32]) + TopLeftBack = Vec3([ 0.5'f32, -0.5'f32, 0.5'f32]) + TopRightBack = Vec3([ -0.5'f32, -0.5'f32, 0.5'f32]) + BottomRightBack = Vec3([ -0.5'f32, 0.5'f32, 0.5'f32]) + BottomLeftBack = Vec3([ 0.5'f32, 0.5'f32, 0.5'f32]) +const + cube_pos = @[ + TopLeftFront, TopRightFront, BottomRightFront, BottomLeftFront, # front + TopLeftBack, TopRightBack, BottomRightBack, BottomLeftBack, # back + TopLeftBack, TopLeftFront, BottomLeftFront, BottomLeftBack, # left + TopRightBack, TopRightFront, BottomRightFront, BottomRightBack, # right + TopLeftBack, TopRightBack, TopRightFront, TopLeftFront, # top + BottomLeftFront, BottomRightFront, BottomRightBack, BottomLeftBack, # bottom + ] + cube_color = @[ + Rf32, Rf32, Rf32, Rf32, + Rf32 * 0.5'f32, Rf32 * 0.5'f32, Rf32 * 0.5'f32, Rf32 * 0.5'f32, + Gf32, Gf32, Gf32, Gf32, + Gf32 * 0.5'f32, Gf32 * 0.5'f32, Gf32 * 0.5'f32, Gf32 * 0.5'f32, + Bf32, Bf32, Bf32, Bf32, + Bf32 * 0.5'f32, Bf32 * 0.5'f32, Bf32 * 0.5'f32, Bf32 * 0.5'f32, + ] +var + tris: seq[array[3, uint16]] +# for i in 0'u16 ..< 6'u16: + # let off = i * 4 +var off = 0'u16 * 4 +# tris.add [off + 0'u16, off + 1'u16, off + 2'u16] +# tris.add [off + 2'u16, off + 3'u16, off + 0'u16] +# off = 1'u16 * 4 +# tris.add [off + 0'u16, off + 1'u16, off + 2'u16] +# tris.add [off + 2'u16, off + 3'u16, off + 0'u16] +# off = 4'u16 * 4 +# tris.add [off + 0'u16, off + 1'u16, off + 2'u16] +# tris.add [off + 2'u16, off + 3'u16, off + 0'u16] +# off = 3'u16 * 4 +# tris.add [off + 0'u16, off + 1'u16, off + 2'u16] +# tris.add [off + 2'u16, off + 3'u16, off + 0'u16] + +when isMainModule: + var myengine = igniteEngine("Hello cube") + + # build a mesh + var trianglemesh = new IndexedMesh[VertexDataA, uint16] + trianglemesh.vertexData = VertexDataA( + position: PositionAttribute[Vec3[float32]](data: cube_pos), + color: ColorAttribute[Vec3[float32]](data: cube_color), + ) + trianglemesh.indices = tris + # build a single-object scene graph + var triangle = new Thing + # add the triangle mesh to the object + triangle.parts.add trianglemesh + + # upload data, prepare shaders, etc + const vertexShader = generateVertexShaderCode[VertexDataA, Uniforms](""" + out_position = (uniforms.projection * uniforms.view * uniforms.model) * vec4(in_position, 1); + """) + const fragmentShader = generateFragmentShaderCode[VertexDataA]() + pipeline = setupPipeline[VertexDataA, Uniforms, uint16]( + myengine, + triangle, + vertexShader, + fragmentShader + ) + # show something + myengine.run(pipeline, globalUpdate) + pipeline.trash() + myengine.trash()