Mercurial > games > semicongine
annotate README.md @ 1268:617ebd404fbe
fix: git-sync script
author | sam <sam@basx.dev> |
---|---|
date | Sun, 28 Jul 2024 23:14:22 +0700 |
parents | 4cf9872f7bb6 |
children | 81450075ad89 |
rev | line source |
---|---|
922 | 1 Note: If you are reading this on Github, please not that this is only a mirror |
1266 | 2 repository and the newest code is hosted on my mercurial repository at |
3 https://hg.basx.dev/games/semicongine/. | |
922 | 4 |
289 | 5 # Semicongine |
41 | 6 |
926
f8974736e446
did: smile, just for the sake of testing mercurial hooks :)
sam <sam@basx.dev>
parents:
925
diff
changeset
|
7 Hi there |
8 | 8 |
213
b5d9410a8184
add: resource packaging and loading for different resource types, simplify build commands, update readme
Sam <sam@basx.dev>
parents:
202
diff
changeset
|
9 This is a little game engine, mainly trying to wrap around vulkan and the |
b5d9410a8184
add: resource packaging and loading for different resource types, simplify build commands, update readme
Sam <sam@basx.dev>
parents:
202
diff
changeset
|
10 operating system's windowing, input and audio system. I am using the last |
b5d9410a8184
add: resource packaging and loading for different resource types, simplify build commands, update readme
Sam <sam@basx.dev>
parents:
202
diff
changeset
|
11 programming language you will ever need, [Nim](https://nim-lang.org/) |
41 | 12 |
1266 | 13 ## Features |
14 | |
15 The engine currently features the following: | |
16 | |
17 - No dependencies outside of this repo (except zip/unzip on Linux). All | |
18 dependencies are included. | |
19 - Low-level, Vulkan-base rendering system | |
20 - All vertex/uniform/descriptors/shader-formats, shaders can and must be | |
21 defined "freely". The only restriction that we currently have, is that vertex | |
22 data is non-interleaved. | |
23 - A ton of compiletime checks to ensure the defined mesh-data and shaders are | |
24 compatible for rendering | |
25 - Simple audio mixer, should suffice for most things | |
26 - Simple input-system, no controller support at this time | |
1267 | 27 - Resource packaging of images, audio and 3D files |
28 - Simple font and text rendering | |
1266 | 29 - A few additional utils like a simple storage API, a few algorithms for |
30 collision detection, noise generation and texture packing, and a simple | |
31 settings API with hot-reloading | |
32 | |
33 ## Hello world example | |
34 | |
35 Attention, this project is not optimized for "hello world"-scenarios, so you | |
36 have quite a few lines to get something to display: | |
37 | |
38 ``` | |
39 | |
40 import semicongine | |
41 | |
42 # required | |
43 InitVulkan() | |
44 | |
45 # set up a simple render pass to render the displayed frame | |
46 var renderpass = CreateDirectPresentationRenderPass(depthBuffer = false, samples = VK_SAMPLE_COUNT_1_BIT) | |
47 | |
48 # the swapchain, needs to be attached to the main renderpass | |
49 SetupSwapchain(renderpass = renderpass) | |
50 | |
51 # render data is used for memory management on the GPU | |
52 var renderdata = InitRenderData() | |
53 | |
54 type | |
55 # define a push constant, to have something moving | |
56 PushConstant = object | |
57 scale: float32 | |
58 # This is how we define shaders: the interface needs to be "typed" | |
59 # but the shader code itself can freely be written in glsl | |
60 Shader = object | |
61 position {.VertexAttribute.}: Vec3f | |
62 color {.VertexAttribute.}: Vec3f | |
63 pushConstant {.PushConstantAttribute.}: PushConstant | |
64 fragmentColor {.Pass.}: Vec3f | |
65 outColor {.ShaderOutput.}: Vec4f | |
66 # code | |
67 vertexCode: string = """void main() { | |
68 fragmentColor = color; | |
69 gl_Position = vec4(position * pushConstant.scale, 1);}""" | |
70 fragmentCode: string = """void main() { | |
71 outColor = vec4(fragmentColor, 1);}""" | |
72 # And we also need to define our Mesh, which does describe the vertex layout | |
73 TriangleMesh = object | |
74 position: GPUArray[Vec3f, VertexBuffer] | |
75 color: GPUArray[Vec3f, VertexBuffer] | |
76 | |
77 # instantiate the mesh and fill with data | |
78 var mesh = TriangleMesh( | |
79 position: asGPUArray([NewVec3f(-0.5, -0.5), NewVec3f(0, 0.5), NewVec3f(0.5, -0.5)], VertexBuffer), | |
80 color: asGPUArray([NewVec3f(0, 0, 1), NewVec3f(0, 1, 0), NewVec3f(1, 0, 0)], VertexBuffer), | |
81 ) | |
82 | |
83 # this allocates GPU data, uploads the data to the GPU and flushes any thing that is host-cached | |
84 # this is a shortcut version, more fine-grained control is possible | |
85 AssignBuffers(renderdata, mesh) | |
86 renderdata.FlushAllMemory() | |
87 | |
88 # Now we need to instantiate the shader as a pipeline object that is attached to a renderpass | |
89 var pipeline = CreatePipeline[Shader](renderPass = vulkan.swapchain.renderPass) | |
90 | |
91 # the main render-loop will exit if we get a kill-signal from the OS | |
92 while UpdateInputs(): | |
93 | |
94 # starts the drawing for the next frame and provides us necesseary framebuffer and commandbuffer objects in this scope | |
95 WithNextFrame(framebuffer, commandbuffer): | |
96 | |
97 # start the main (and only) renderpass we have, needs to know the target framebuffer and a commandbuffer | |
98 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | |
99 | |
100 # now activate our shader-pipeline | |
101 WithPipeline(commandbuffer, pipeline): | |
102 | |
103 # and finally, draw the mesh and set a single parameter | |
104 # more complicated setups with descriptors/uniforms are of course possible | |
105 RenderWithPushConstant(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh, pushConstant = PushConstant(scale: 0.3)) | |
106 | |
107 # cleanup | |
108 checkVkResult vkDeviceWaitIdle(vulkan.device) | |
109 DestroyPipeline(pipeline) | |
110 DestroyRenderData(renderdata) | |
111 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) | |
112 DestroyVulkan() | |
113 | |
114 ``` | |
115 | |
289 | 116 ## Roadmap |
41 | 117 |
1266 | 118 For now all features that I need are implemented. I will gradually add more |
119 stuff that I need, based on the games that I am developing. Here are a few | |
120 things that I consider integrating at a later point, once I have gather some | |
121 more experience what can/should be used across different projects: | |
194
93f661a20f74
did: a bit of cleanup with the config, also add some documentation
Sam <sam@basx.dev>
parents:
187
diff
changeset
|
122 |
1266 | 123 [ ] More support for glTF format (JPEG textures, animations, morphing) |
124 [ ] Maybe some often used utils like camera-controllers, offscreen-rendering, shadow-map rendering, etc. | |
125 [ ] Maybe some UI-stuff | |
126 [ ] Controller support |