PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
Application.hpp
1#pragma once
2
4#include "PixelBullet/Application/LayerStack.hpp"
5
6#include "tools/cpp/runfiles/runfiles.h"
7
8#include <functional>
9#include <memory>
10#include <mutex>
11#include <string>
12#include <vector>
13
14int main(int argc, char* argv[]);
15
16namespace PixelBullet
17{
18 struct ApplicationSpecification;
19 struct ApplicationCommandLineArgs;
20
21 class ResourceLocator;
22
23 class Window;
24 class Graphics;
25
26 class Event;
27 class WindowCloseEvent;
28 class WindowResizeEvent;
29
30 class Audio;
31
32 class Layer;
33
41 {
42 public:
47 explicit Application(const ApplicationSpecification& specification, const char* binaryPath);
48
52 virtual ~Application();
53
57 Application(const Application&) = delete;
58
63
68
73
78 void OnEvent(Event& e);
79
84 template <typename T, typename... Args>
85 void PushLayer(Args&&... args)
86 {
87 static_assert(std::is_base_of<Layer, T>::value, "T must be derived from Layer");
88 auto layer = std::make_unique<T>(std::forward<Args>(args)...);
89 layer->OnAttach();
90 m_LayerStack->PushLayer(std::move(layer));
91 }
92
97 template <typename T, typename... Args>
98 void PushOverlay(Args&&... args)
99 {
100 static_assert(std::is_base_of<Layer, T>::value, "T must be derived from Layer");
101 auto layer = std::make_unique<T>(std::forward<Args>(args)...);
102 layer->OnAttach();
103 m_LayerStack->PushOverlay(std::move(layer));
104 }
105
110 static Application& Get()
111 {
112 ASSERT(s_Instance, "Application instance is null!");
113 return *s_Instance;
114 }
115
121 {
122 ASSERT(m_Specification, "Application specification is null!");
123 return *m_Specification;
124 }
125
131 {
132 ASSERT(m_Window, "Window has not been initialized!");
133 return *m_Window;
134 }
135
141 {
142 ASSERT(m_Graphics, "Graphics system has not been initialized!");
143 return *m_Graphics;
144 }
145
151 {
152 ASSERT(m_Audio, "Audio system has not been initialized!");
153 return *m_Audio;
154 }
155
161 {
162 ASSERT(m_ResourceLocator, "Resource locator has not been initialized!");
163 return *m_ResourceLocator;
164 }
165
166 bazel::tools::cpp::runfiles::Runfiles& GetRunfiles()
167 {
168 ASSERT(m_Runfiles, "Bazel runfiles are not available!");
169 return *m_Runfiles;
170 }
171
172 void Start() noexcept
173 {
174 m_Running = true;
175 }
176 void Stop() noexcept
177 {
178 m_Running = false;
179 }
180
181 [[nodiscard]] inline bool IsRunning() const noexcept
182 {
183 return m_Running;
184 }
185
190 void Restart(const ApplicationSpecification& newSpecification);
191
196 void SubmitToMainThread(std::function<void()> function);
197
198 private:
202 void Run();
203
209 bool OnWindowClose(WindowCloseEvent& e);
210
216 bool OnWindowResize(WindowResizeEvent& e);
217
221 void ExecuteMainThreadQueue();
222
223 private:
224 std::unique_ptr<ResourceLocator> m_ResourceLocator;
225 std::unique_ptr<bazel::tools::cpp::runfiles::Runfiles> m_Runfiles;
227 std::unique_ptr<Window> m_Window;
228 std::unique_ptr<Graphics> m_Graphics;
229 std::unique_ptr<Audio> m_Audio;
230
231 std::unique_ptr<LayerStack> m_LayerStack;
233 private:
234 const ApplicationSpecification* m_Specification;
236 bool m_Running = true;
237 bool m_Minimized = false;
238 float m_LastFrameTime = 0.0f;
240 std::vector<std::function<void()>> m_MainThreadQueue;
241 std::mutex m_MainThreadQueueMutex;
243 private:
244 static Application* s_Instance;
245 static int Launch(const ApplicationCommandLineArgs& cliArgs, const char* binaryPath);
246
247 friend int ::main(int argc, char* argv[]);
248 };
249
255 Application* CreateApplication(const ApplicationCommandLineArgs& args, const char* binaryPath);
256} // namespace PixelBullet
Provides assertion and panic mechanisms with optional custom formatting.
#define ASSERT(condition,...)
Asserts that a condition is true.
Definition Assert.hpp:151
Main application class.
Definition Application.hpp:41
void PushOverlay(Args &&... args)
Definition Application.hpp:98
ResourceLocator & GetResourceLocator()
Definition Application.hpp:160
void PushLayer(Args &&... args)
Definition Application.hpp:85
void SubmitToMainThread(std::function< void()> function)
Definition Application.cpp:85
const ApplicationSpecification & GetSpecification() const
Definition Application.hpp:120
Application(const ApplicationSpecification &specification, const char *binaryPath)
Definition Application.cpp:27
Graphics & GetGraphics()
Definition Application.hpp:140
void Restart(const ApplicationSpecification &newSpecification)
Definition Application.cpp:76
Application(const Application &)=delete
Window & GetWindow()
Definition Application.hpp:130
Application & operator=(Application &&)=delete
Audio & GetAudio()
Definition Application.hpp:150
Application & operator=(const Application &)=delete
Application(Application &&)=delete
void OnEvent(Event &e)
Definition Application.cpp:91
static Application & Get()
Definition Application.hpp:110
virtual ~Application()
Definition Application.cpp:51
Definition Audio.hpp:20
Definition Event.hpp:65
Module that manages the Vulkan m_Instance, Surface, Window and the renderpass structure.
Definition Graphics.hpp:32
Definition ResourceLocator.hpp:11
Definition Window.hpp:20
Contains configuration options for both the game and the engine.
Definition Specification.hpp:108