SDEngine
Game Engine
Loading...
Searching...
No Matches
Application.hpp
Go to the documentation of this file.
1// TODO(docs): Add file-level Doxygen header
2// - @file Application.hpp
3// - @brief Main application class - the central hub of the engine
4// - Architecture overview: Application owns all subsystems
5// - Lifecycle diagram (Init -> Run -> Shutdown)
6// - Hot reload integration notes
7#pragma once
8#include <atomic>
9#include <expected>
10#include <functional>
11#include <memory>
12#include <string>
13#include <type_traits>
14#include <utility>
15
19#include "SD/core/LayerList.hpp"
20#include "SD/core/Scene.hpp"
22#include "SD/core/View.hpp"
26#include "SD/export.hpp"
27
28namespace sd {
29class Event;
30class GameContext;
31class Layer;
32class LayoutManager;
34class VulkanWindow;
35class Window;
36} // namespace sd
37
38
39namespace sd {
40
41// TODO(docs): Document ApplicationSpecification
42// - Each field's purpose and default value rationale
43// - Example configuration
45 std::string name = "SDEngine App";
46 int width = 1600;
47 int height = 900;
48 bool enableHotReload = true;
49 std::string gameSoPath = "libSandboxApp.so";
50};
51
52// TODO(docs): Document Application class thoroughly
53// - Class overview and responsibilities
54// - Ownership model (what it owns vs references)
55// - Singleton pattern usage (Get())
56// - Thread safety considerations
57// - Example minimal application setup
58class SD_EXPORT Application {
59public:
60 explicit Application(const ApplicationSpecification& spec,
61 RuntimeStateManager* state_manager = nullptr);
62 virtual ~Application();
63
64 Application(const Application&) = delete;
68
69
71
72 void run(const std::atomic<bool>* external_stop);
73
74 void frame();
75
76 void close() { is_running = false; }
77
78 void on_app_event(Event& e);
79
80 // Layer management
81 template<typename T, typename... Args>
82 requires std::is_base_of_v<Layer, T>
83 T& push_global_layer(Args&&... args) {
84 return global_layers.push_layer<T>(std::forward<Args>(args)...);
85 }
86
87 // Window management
88 [[nodiscard]] WindowId create_window(const WindowProps& props) {
89 return window_manager->create(props);
90 }
91 [[nodiscard]] Window& get_window(const WindowId id) const {
92 return window_manager->get_window(id);
93 }
94 [[nodiscard]] VulkanWindow& get_render_window(const WindowId id) const {
95 return window_manager->get_render_window(id);
96 }
97
98 template<typename T, typename... Args>
99 requires std::is_base_of_v<Layer, T>
100 T& push_view_layer(WindowId id, Args&&... args);
101
102 template<typename T, typename... Args>
103 requires std::is_base_of_v<View, T>
104 T& create_view(std::string name, Args&&... args) {
105 return view_manager->create<T>(std::move(name), std::forward<Args>(args)...);
106 }
107
108
109 [[nodiscard]] ViewResult get_view(const ViewId id) const { return view_manager->get(id); }
110 [[nodiscard]] ViewResult get_view(const std::string& name) const {
111 return view_manager->get(name);
112 }
113 [[nodiscard]] std::expected<ViewId, ViewError> get_view_id(const std::string& name) const {
114 return view_manager->get_id(name);
115 }
116
117 [[nodiscard]] ViewError remove_view(ViewId id) { return view_manager->remove(id); }
118 [[nodiscard]] ViewError remove_view(const std::string& name) {
119 return view_manager->remove(name);
120 }
121
122 template<typename T, typename... Args>
123 requires std::is_base_of_v<Layer, T>
124 std::expected<std::reference_wrapper<T>, ViewError> push_layer_to_view(ViewId id, Args&&... args);
125
126 template<typename T, typename... Args>
127 requires std::is_base_of_v<Layer, T>
128 std::expected<std::reference_wrapper<T>, ViewError> push_layer_to_view(const std::string& name,
129 Args&&... args);
130
131 // Scene management
132 Scene* create_scene(const std::string& name) { return scene_manager.create(name); }
133 [[nodiscard]] Scene* get_scene(const std::string& name) const { return scene_manager.get(name); }
134
135 void clear_game_layers();
136 void reload_game();
137
138 void reload_shaders() const;
139
140 [[nodiscard]] EngineServices services() const {
141 return EngineServices{
142 .glfw = *m_glfw_ctx,
143 .vulkan = *m_vulkan_ctx,
144 .renderer = *m_renderer,
145 .imgui = *m_imgui_ctx,
146 };
147 }
148
149 [[nodiscard]] ApplicationRuntime runtime() {
150 return ApplicationRuntime{
151 .views = *view_manager,
152 .scenes = scene_manager,
153 .layout = *layout_manager,
154 .events = app_event_manager,
155 .timer = timer,
156 .global_layers = global_layers,
157 .hot_reload_enabled = hot_reload_enabled,
158 };
159 }
160
161public:
162 bool is_running = true;
163 bool hot_reload_enabled = true;
164 float hot_reload_timer = 0.0f;
165
166
168
169
170 // todo: abstract
171
172
173 std::unique_ptr<WindowManager> window_manager;
174 std::unique_ptr<ViewManager> view_manager;
175 std::unique_ptr<LayoutManager> layout_manager;
177
180 GameContext* game_context = nullptr;
181
184
185private:
186 std::unique_ptr<GlfwContext> m_glfw_ctx;
187 std::unique_ptr<VulkanContext> m_vulkan_ctx;
188 std::unique_ptr<VulkanRenderer> m_renderer;
189 std::unique_ptr<SDImGuiContext> m_imgui_ctx;
190
191 void* m_game_handle = nullptr;
192};
193
194
195} // namespace sd
196
197
198#include "impl/Application.inl"
Definition Application.hpp:58
ViewError remove_view(ViewId id)
Definition Application.hpp:117
FrameTimer timer
Definition Application.hpp:183
RuntimeStateManager * state_manager
Definition Application.hpp:182
std::expected< ViewId, ViewError > get_view_id(const std::string &name) const
Definition Application.hpp:113
ViewError remove_view(const std::string &name)
Definition Application.hpp:118
ViewResult get_view(const std::string &name) const
Definition Application.hpp:110
T & push_global_layer(Args &&... args)
Definition Application.hpp:83
std::unique_ptr< VulkanContext > m_vulkan_ctx
Definition Application.hpp:187
std::unique_ptr< WindowManager > window_manager
Definition Application.hpp:173
EngineServices services() const
Definition Application.hpp:140
Scene * create_scene(const std::string &name)
Definition Application.hpp:132
std::unique_ptr< VulkanRenderer > m_renderer
Definition Application.hpp:188
Scene * get_scene(const std::string &name) const
Definition Application.hpp:133
std::unique_ptr< LayoutManager > layout_manager
Definition Application.hpp:175
ApplicationRuntime runtime()
Definition Application.hpp:149
std::unique_ptr< SDImGuiContext > m_imgui_ctx
Definition Application.hpp:189
ViewManager::ViewResult ViewResult
Definition Application.hpp:70
Application(Application &&)=delete
T & create_view(std::string name, Args &&... args)
Definition Application.hpp:104
std::unique_ptr< GlfwContext > m_glfw_ctx
Definition Application.hpp:186
void close()
Definition Application.hpp:76
SceneManager scene_manager
Definition Application.hpp:176
Application(const Application &)=delete
Application & operator=(const Application &)=delete
VulkanWindow & get_render_window(const WindowId id) const
Definition Application.hpp:94
Window & get_window(const WindowId id) const
Definition Application.hpp:91
EventManager app_event_manager
Definition Application.hpp:179
ApplicationSpecification app_spec
Definition Application.hpp:167
std::unique_ptr< ViewManager > view_manager
Definition Application.hpp:174
ViewResult get_view(const ViewId id) const
Definition Application.hpp:109
Application & operator=(Application &&)=delete
LayerList global_layers
Definition Application.hpp:178
WindowId create_window(const WindowProps &props)
Definition Application.hpp:88
Definition EventManager.hpp:20
Definition Event.hpp:56
Tracks frame timing, fixed timestep accumulation, and CPU work time.
Definition FrameTimer.hpp:21
Definition GameContext.hpp:20
Definition LayerList.hpp:21
Base class for all layers. Prefer using System, RenderStage, or Panel instead.
Definition Layer.hpp:28
Manages window layouts using ImGui DockBuilder for presets and INI for user layouts.
Definition LayoutManager.hpp:14
Definition RuntimeStateManager.hpp:24
Definition SceneManager.hpp:14
Definition Scene.hpp:18
std::expected< std::reference_wrapper< View >, ViewError > ViewResult
Definition ViewManager.hpp:47
Definition VulkanWindow.hpp:35
Definition Window.hpp:49
Definition Application.hpp:28
ViewError
Definition View.hpp:26
Definition ApplicationRuntime.hpp:12
ViewManager & views
Definition ApplicationRuntime.hpp:13
Definition Application.hpp:44
int width
Definition Application.hpp:46
std::string gameSoPath
Definition Application.hpp:49
int height
Definition Application.hpp:47
bool enableHotReload
Definition Application.hpp:48
std::string name
Definition Application.hpp:45
Definition EngineServices.hpp:10
GlfwContext & glfw
Definition EngineServices.hpp:11
Definition id_types.hpp:7
Definition id_types.hpp:28
Definition WindowManager.hpp:26