4#include "PixelBullet/Application/LayerStack.hpp"
6#include "tools/cpp/runfiles/runfiles.h"
14int main(
int argc,
char* argv[]);
18 struct ApplicationSpecification;
19 struct ApplicationCommandLineArgs;
21 class ResourceLocator;
27 class WindowCloseEvent;
28 class WindowResizeEvent;
84 template <
typename T,
typename... Args>
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)...);
90 m_LayerStack->PushLayer(std::move(layer));
97 template <
typename T,
typename... Args>
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)...);
103 m_LayerStack->PushOverlay(std::move(layer));
112 ASSERT(s_Instance,
"Application instance is null!");
122 ASSERT(m_Specification,
"Application specification is null!");
123 return *m_Specification;
132 ASSERT(m_Window,
"Window has not been initialized!");
142 ASSERT(m_Graphics,
"Graphics system has not been initialized!");
152 ASSERT(m_Audio,
"Audio system has not been initialized!");
162 ASSERT(m_ResourceLocator,
"Resource locator has not been initialized!");
163 return *m_ResourceLocator;
166 bazel::tools::cpp::runfiles::Runfiles& GetRunfiles()
168 ASSERT(m_Runfiles,
"Bazel runfiles are not available!");
172 void Start() noexcept
181 [[nodiscard]]
inline bool IsRunning() const noexcept
190 void Restart(
const ApplicationSpecification& newSpecification);
209 bool OnWindowClose(WindowCloseEvent& e);
216 bool OnWindowResize(WindowResizeEvent& e);
221 void ExecuteMainThreadQueue();
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;
231 std::unique_ptr<LayerStack> m_LayerStack;
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;
245 static int Launch(
const ApplicationCommandLineArgs& cliArgs,
const char* binaryPath);
247 friend int ::main(
int argc,
char* argv[]);
255 Application* CreateApplication(
const ApplicationCommandLineArgs& args,
const char* binaryPath);
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
Module that manages the Vulkan m_Instance, Surface, Window and the renderpass structure.
Definition Graphics.hpp:32
Definition ResourceLocator.hpp:11
Contains configuration options for both the game and the engine.
Definition Specification.hpp:108