Mercurial > games > semicongine
annotate src/semicongine/engine.nim @ 140:29f0109c5222
add: some helper functions
author | Sam <sam@basx.dev> |
---|---|
date | Sat, 22 Apr 2023 17:34:42 +0700 |
parents | e6c7973d8525 |
children | 9c0d7839dc91 |
rev | line source |
---|---|
127 | 1 import ./platform/window |
2 | |
3 import ./vulkan/api | |
4 import ./vulkan/instance | |
5 import ./vulkan/device | |
6 import ./vulkan/physicaldevice | |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
7 import ./vulkan/renderpass |
127 | 8 |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
9 import ./gpu_data |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
10 import ./entity |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
11 import ./renderer |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
12 import ./events |
127 | 13 import ./config |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
14 import ./math |
127 | 15 |
16 type | |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
17 Input = object |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
18 keyIsDown: set[Key] |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
19 keyWasPressed: set[Key] |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
20 keyWasReleased: set[Key] |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
21 mouseIsDown: set[MouseButton] |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
22 mouseWasPressed: set[MouseButton] |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
23 mouseWasReleased: set[MouseButton] |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
24 mousePosition: Vec2f |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
25 eventsProcessed: uint64 |
127 | 26 Engine* = object |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
27 running*: bool |
127 | 28 device: Device |
29 debugger: Debugger | |
30 instance: Instance | |
31 window: NativeWindow | |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
32 renderer: Renderer |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
33 input: Input |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
34 exitHandler: proc(engine: var Engine) |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
35 resizeHandler: proc(engine: var Engine) |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
36 eventHandler: proc(engine: var Engine, event: Event) |
127 | 37 |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
38 |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
39 proc destroy*(engine: var Engine) = |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
40 checkVkResult engine.device.vk.vkDeviceWaitIdle() |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
41 engine.renderer.destroy() |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
42 engine.device.destroy() |
134
e6c7973d8525
add: remove a few warning, improve a few things
Sam <sam@basx.dev>
parents:
133
diff
changeset
|
43 if engine.debugger.messenger.valid: |
e6c7973d8525
add: remove a few warning, improve a few things
Sam <sam@basx.dev>
parents:
133
diff
changeset
|
44 engine.debugger.destroy() |
e6c7973d8525
add: remove a few warning, improve a few things
Sam <sam@basx.dev>
parents:
133
diff
changeset
|
45 engine.window.destroy() |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
46 engine.instance.destroy() |
133
9f2c178beb60
add: correct swapchain destruction, update 1st example to be working
Sam <sam@basx.dev>
parents:
131
diff
changeset
|
47 engine.running = false |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
48 |
127 | 49 |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
50 proc initEngine*( |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
51 applicationName: string, |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
52 debug=DEBUG, |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
53 exitHandler: proc(engine: var Engine) = nil, |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
54 resizeHandler: proc(engine: var Engine) = nil, |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
55 eventHandler: proc(engine: var Engine, event: Event) = nil |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
56 ): Engine = |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
57 result.running = true |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
58 result.exitHandler = exitHandler |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
59 result.resizeHandler = resizeHandler |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
60 result.eventHandler = eventHandler |
127 | 61 result.window = createWindow(applicationName) |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
62 |
127 | 63 var |
64 instanceExtensions: seq[string] | |
65 enabledLayers: seq[string] | |
66 | |
67 if debug: | |
68 instanceExtensions.add "VK_EXT_debug_utils" | |
69 enabledLayers.add @["VK_LAYER_KHRONOS_validation", "VK_LAYER_MESA_overlay"] | |
70 result.instance = result.window.createInstance( | |
71 vulkanVersion=VK_MAKE_API_VERSION(0, 1, 3, 0), | |
72 instanceExtensions=instanceExtensions, | |
73 layers=enabledLayers, | |
74 ) | |
75 if debug: | |
76 result.debugger = result.instance.createDebugMessenger() | |
77 # create devices | |
78 let selectedPhysicalDevice = result.instance.getPhysicalDevices().filterBestGraphics() | |
79 result.device = result.instance.createDevice( | |
80 selectedPhysicalDevice, | |
81 enabledLayers = @[], | |
82 enabledExtensions = @[], | |
83 selectedPhysicalDevice.filterForGraphicsPresentationQueues() | |
84 ) | |
85 | |
131
11666d28e04d
add: recreation of swapchain (at least on linux, windows will likely fail, needs testing
Sam <sam@basx.dev>
parents:
129
diff
changeset
|
86 proc setRenderer*(engine: var Engine, renderPass: RenderPass) = |
11666d28e04d
add: recreation of swapchain (at least on linux, windows will likely fail, needs testing
Sam <sam@basx.dev>
parents:
129
diff
changeset
|
87 engine.renderer = engine.device.initRenderer(renderPass) |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
88 |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
89 proc addScene*(engine: var Engine, entity: Entity, vertexInput: seq[ShaderAttribute]) = |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
90 engine.renderer.setupDrawableBuffers(entity, vertexInput) |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
91 |
131
11666d28e04d
add: recreation of swapchain (at least on linux, windows will likely fail, needs testing
Sam <sam@basx.dev>
parents:
129
diff
changeset
|
92 proc renderScene*(engine: var Engine, entity: Entity) = |
140 | 93 assert engine.renderer.valid |
133
9f2c178beb60
add: correct swapchain destruction, update 1st example to be working
Sam <sam@basx.dev>
parents:
131
diff
changeset
|
94 if engine.running: |
9f2c178beb60
add: correct swapchain destruction, update 1st example to be working
Sam <sam@basx.dev>
parents:
131
diff
changeset
|
95 engine.renderer.render(entity) |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
96 |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
97 proc updateInputs*(engine: var Engine) = |
133
9f2c178beb60
add: correct swapchain destruction, update 1st example to be working
Sam <sam@basx.dev>
parents:
131
diff
changeset
|
98 if not engine.running: |
9f2c178beb60
add: correct swapchain destruction, update 1st example to be working
Sam <sam@basx.dev>
parents:
131
diff
changeset
|
99 return |
9f2c178beb60
add: correct swapchain destruction, update 1st example to be working
Sam <sam@basx.dev>
parents:
131
diff
changeset
|
100 |
129
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
101 engine.input.keyWasPressed = {} |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
102 engine.input.keyWasReleased = {} |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
103 engine.input.mouseWasPressed = {} |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
104 engine.input.mouseWasReleased = {} |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
105 var |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
106 killed = false |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
107 resized = false |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
108 for event in engine.window.pendingEvents(): |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
109 inc engine.input.eventsProcessed |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
110 if engine.eventHandler != nil: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
111 engine.eventHandler(engine, event) |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
112 case event.eventType: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
113 of Quit: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
114 killed = true |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
115 of ResizedWindow: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
116 resized = true |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
117 of KeyPressed: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
118 engine.input.keyWasPressed.incl event.key |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
119 engine.input.keyIsDown.incl event.key |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
120 of KeyReleased: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
121 engine.input.keyWasReleased.incl event.key |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
122 engine.input.keyIsDown.excl event.key |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
123 of MousePressed: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
124 engine.input.mouseWasPressed.incl event.button |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
125 engine.input.mouseIsDown.incl event.button |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
126 of MouseReleased: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
127 engine.input.mouseWasReleased.incl event.button |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
128 engine.input.mouseIsDown.excl event.button |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
129 of MouseMoved: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
130 engine.input.mousePosition = newVec2(float32(event.x), float32(event.y)) |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
131 if killed: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
132 engine.running = false |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
133 if engine.exitHandler != nil: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
134 engine.exitHandler(engine) |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
135 if resized and engine.resizeHandler != nil: |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
136 engine.resizeHandler(engine) |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
137 |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
138 func keyIsDown*(engine: Engine, key: Key): auto = key in engine.input.keyIsDown |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
139 func keyWasPressed*(engine: Engine, key: Key): auto = key in engine.input.keyWasPressed |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
140 func keyWasReleased*(engine: Engine, key: Key): auto = key in engine.input.keyWasReleased |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
141 func mouseIsDown*(engine: Engine, button: MouseButton): auto = button in engine.input.mouseIsDown |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
142 func mouseWasPressed*(engine: Engine, button: MouseButton): auto = button in engine.input.mouseWasPressed |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
143 func mouseWasReleased*(engine: Engine, button: MouseButton): auto = button in engine.input.mouseWasReleased |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
144 func mousePosition*(engine: Engine, key: Key): auto = engine.input.mousePosition |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
145 func eventsProcessed*(engine: Engine): auto = engine.input.eventsProcessed |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
146 func framesRendered*(engine: Engine): auto = engine.renderer.framesRendered |
15d37022625c
add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents:
127
diff
changeset
|
147 func gpuDevice*(engine: Engine): Device = engine.device |
140 | 148 func getWindow*(engine: Engine): auto = engine.window |