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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
127
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
1 import ./platform/window
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
2
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
3 import ./vulkan/api
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
4 import ./vulkan/instance
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
5 import ./vulkan/device
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
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
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
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
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
13 import ./config
129
15d37022625c add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents: 127
diff changeset
14 import ./math
127
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
15
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
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
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
26 Engine* = object
129
15d37022625c add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents: 127
diff changeset
27 running*: bool
127
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
28 device: Device
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
29 debugger: Debugger
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
30 instance: Instance
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
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
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
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
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
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
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
61 result.window = createWindow(applicationName)
129
15d37022625c add: input handling, small refactoring for renderer
Sam <sam@basx.dev>
parents: 127
diff changeset
62
127
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
63 var
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
64 instanceExtensions: seq[string]
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
65 enabledLayers: seq[string]
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
66
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
67 if debug:
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
68 instanceExtensions.add "VK_EXT_debug_utils"
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
69 enabledLayers.add @["VK_LAYER_KHRONOS_validation", "VK_LAYER_MESA_overlay"]
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
70 result.instance = result.window.createInstance(
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
71 vulkanVersion=VK_MAKE_API_VERSION(0, 1, 3, 0),
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
72 instanceExtensions=instanceExtensions,
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
73 layers=enabledLayers,
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
74 )
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
75 if debug:
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
76 result.debugger = result.instance.createDebugMessenger()
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
77 # create devices
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
78 let selectedPhysicalDevice = result.instance.getPhysicalDevices().filterBestGraphics()
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
79 result.device = result.instance.createDevice(
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
80 selectedPhysicalDevice,
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
81 enabledLayers = @[],
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
82 enabledExtensions = @[],
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
83 selectedPhysicalDevice.filterForGraphicsPresentationQueues()
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
84 )
5871acc2977e did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
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
29f0109c5222 add: some helper functions
Sam <sam@basx.dev>
parents: 134
diff changeset
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
29f0109c5222 add: some helper functions
Sam <sam@basx.dev>
parents: 134
diff changeset
148 func getWindow*(engine: Engine): auto = engine.window