PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
application.h
1#pragma once
2
3#include "pixelbullet/application/event.h"
4#include "pixelbullet/application/specification.h"
6
7#include <memory>
8#include <type_traits>
9#include <utility>
10
11namespace pixelbullet
12{
13struct ApplicationBootstrap;
14class Application;
15using ApplicationFactory = std::unique_ptr<Application> (*)(const ApplicationBootstrap& bootstrap);
16
17class Filesystem;
18class ResourceCache;
19
20class Window;
21class Graphics;
22
23class Event;
24class WindowCloseEvent;
25class WindowResizeEvent;
26
27class Audio;
28
29class Layer;
30class LayerStack;
31class UiFrameLayer;
32
40{
41public:
46 explicit Application(ApplicationSpecification specification, const ApplicationBootstrap& bootstrap);
47
51 virtual ~Application();
52
56 Application(const Application&) = delete;
57
62
67
72
77 void OnEvent(Event& e);
78
83 template <typename T, typename... Args>
84 T* PushLayer(Args&&... args)
85 {
86 static_assert(std::is_base_of<Layer, T>::value, "T must be derived from Layer");
87 auto layer = std::make_unique<T>(std::forward<Args>(args)...);
88 return static_cast<T*>(PushLayerImpl(std::move(layer)));
89 }
90
95 template <typename T, typename... Args>
96 T* PushOverlay(Args&&... args)
97 {
98 static_assert(std::is_base_of<Layer, T>::value, "T must be derived from Layer");
99 auto layer = std::make_unique<T>(std::forward<Args>(args)...);
100 return static_cast<T*>(PushOverlayImpl(std::move(layer)));
101 }
102
108 {
109 return specification_;
110 }
111
117 {
118 ASSERT(window_, "Window has not been initialized!");
119 return *window_;
120 }
121
127 {
128 ASSERT(graphics_, "Graphics system has not been initialized!");
129 return *graphics_;
130 }
131
137 {
138 ASSERT(audio_, "Audio system has not been initialized!");
139 return *audio_;
140 }
141
142 Filesystem& GetFilesystem()
143 {
144 ASSERT(filesystem_, "Filesystem has not been initialized!");
145 return *filesystem_;
146 }
147 const Filesystem& GetFilesystem() const
148 {
149 ASSERT(filesystem_, "Filesystem has not been initialized!");
150 return *filesystem_;
151 }
152
153 ResourceCache& GetResourceCache()
154 {
155 ASSERT(resource_cache_, "Resource cache has not been initialized!");
156 return *resource_cache_;
157 }
158 const ResourceCache& GetResourceCache() const
159 {
160 ASSERT(resource_cache_, "Resource cache has not been initialized!");
161 return *resource_cache_;
162 }
163
164 void Start() noexcept
165 {
166 running_ = true;
167 }
168 void Stop() noexcept
169 {
170 running_ = false;
171 }
172
173 [[nodiscard]] inline bool IsRunning() const noexcept
174 {
175 return running_;
176 }
177
178 static int Launch(const ApplicationBootstrap& bootstrap, ApplicationFactory factory);
179
180private:
181 enum class RunResult
182 {
183 Completed,
184 SmokeSucceeded,
185 SmokeTimedOut
186 };
187
191 RunResult Run();
192
198 EventResult OnWindowClose(WindowCloseEvent& e);
199
205 EventResult OnWindowResize(WindowResizeEvent& e);
206 Layer* PushLayerImpl(std::unique_ptr<Layer> layer);
207 Layer* PushOverlayImpl(std::unique_ptr<Layer> layer);
208 void RegisterUiFrameLayer(Layer* layer);
209
210 std::unique_ptr<Filesystem> filesystem_;
211 std::unique_ptr<ResourceCache> resource_cache_;
212
213 std::unique_ptr<Window> window_;
214 std::unique_ptr<Graphics> graphics_;
215 std::unique_ptr<Audio> audio_;
216
217 std::unique_ptr<LayerStack> layer_stack_;
218 UiFrameLayer* ui_frame_layer_ = nullptr;
219
220private:
221 ApplicationSpecification specification_;
222 ApplicationLaunchOptions launch_options_;
223
224 bool running_ = true;
225 bool minimized_ = false;
226 float last_frame_time_ = 0.0f;
227};
228} // namespace pixelbullet
Provides assertion and panic mechanisms with optional custom formatting.
#define ASSERT(condition,...)
Asserts that a condition is true.
Definition assert.h:163
Main application class.
Definition application.h:40
Application(ApplicationSpecification specification, const ApplicationBootstrap &bootstrap)
Definition application.cc:60
T * PushLayer(Args &&... args)
Definition application.h:84
Window & GetWindow()
Definition application.h:116
Application & operator=(const Application &)=delete
const ApplicationSpecification & GetSpecification() const
Definition application.h:107
Application(const Application &)=delete
Audio & GetAudio()
Definition application.h:136
T * PushOverlay(Args &&... args)
Definition application.h:96
Graphics & GetGraphics()
Definition application.h:126
virtual ~Application()
Definition application.cc:116
Application & operator=(Application &&)=delete
Application(Application &&)=delete
void OnEvent(Event &e)
Definition application.cc:178
Definition audio.h:15
Definition event.h:72
Definition filesystem.h:16
Module that manages the Vulkan instance_, Surface, Window and the renderpass structure.
Definition graphics.h:36
Definition window.h:23
Definition specification.h:62
Contains configuration options for both the game and the engine.
Definition specification.h:145