PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
application.h
1#pragma once
2
3#include "pixelbullet/core/event.h"
4
5#include "pixelbullet/window/window_events.h"
6
7#include "pixelbullet/application/specification.h"
8
9#include <memory>
10#include <type_traits>
11#include <utility>
12
13namespace pixelbullet
14{
16class Application;
17using ApplicationFactory = std::unique_ptr<Application> (*)(const ApplicationBootstrap& bootstrap);
18
19namespace integration::application::runtime
20{
21class ApplicationHostControlBinding;
22}
23
25class Filesystem;
27
28class Window;
29class Graphics;
30
31class Audio;
32
33class Layer;
34class LayerStack;
35class UiFrameLayer;
36
44{
45public:
50 explicit Application(ApplicationSpecification specification, const ApplicationBootstrap& bootstrap);
51
55 virtual ~Application();
56
60 Application(const Application&) = delete;
61
66
71
76
82
87 template <typename T, typename... Args>
88 T* PushLayer(Args&&... args)
89 {
90 static_assert(std::is_base_of<Layer, T>::value, "T must be derived from Layer");
91 auto layer = std::make_unique<T>(std::forward<Args>(args)...);
92 return static_cast<T*>(PushLayerImpl(std::move(layer)));
93 }
94
99 template <typename T, typename... Args>
100 T* PushOverlay(Args&&... args)
101 {
102 static_assert(std::is_base_of<Layer, T>::value, "T must be derived from Layer");
103 auto layer = std::make_unique<T>(std::forward<Args>(args)...);
104 return static_cast<T*>(PushOverlayImpl(std::move(layer)));
105 }
106
112
117 Window& GetWindow();
118
124
129 Audio& GetAudio();
130
131 Filesystem& GetFilesystem();
132 const Filesystem& GetFilesystem() const;
133
134 GraphicsResourceCache& GetGraphicsResourceCache();
135 const GraphicsResourceCache& GetGraphicsResourceCache() const;
136
137 void Start() noexcept;
138 void Stop() noexcept;
139
140 [[nodiscard]] bool IsRunning() const noexcept;
141
142 static int Launch(const ApplicationBootstrap& bootstrap, ApplicationFactory factory);
143
144private:
145 friend class integration::application::runtime::ApplicationHostControlBinding;
146
147 enum class RunResult
148 {
149 Completed,
150 SmokeSucceeded,
151 SmokeTimedOut
152 };
153
157 RunResult Run();
158
164 pixelbullet::core::EventResult OnWindowClose(pixelbullet::window::WindowCloseEvent& e);
165
171 pixelbullet::core::EventResult OnWindowResize(pixelbullet::window::WindowResizeEvent& e);
172 Layer* PushLayerImpl(std::unique_ptr<Layer> layer);
173 Layer* PushOverlayImpl(std::unique_ptr<Layer> layer);
174 void RegisterUiFrameLayer(Layer* layer);
175
176 std::unique_ptr<ApplicationState> state_;
177};
178} // namespace pixelbullet
Definition application_internal.h:23
Main application class.
Definition application.h:44
Application(ApplicationSpecification specification, const ApplicationBootstrap &bootstrap)
Definition application.cc:71
T * PushLayer(Args &&... args)
Definition application.h:88
void OnEvent(pixelbullet::core::Event &e)
Definition application.cc:341
Window & GetWindow()
Definition application.cc:216
Application & operator=(const Application &)=delete
const ApplicationSpecification & GetSpecification() const
Definition application.cc:211
Application(const Application &)=delete
Audio & GetAudio()
Definition application.cc:228
T * PushOverlay(Args &&... args)
Definition application.h:100
Graphics & GetGraphics()
Definition application.cc:222
virtual ~Application()
Definition application.cc:153
Application & operator=(Application &&)=delete
Application(Application &&)=delete
Definition audio.h:25
Definition filesystem.h:20
Definition graphics_resource_cache.h:16
Host-facing graphics subsystem shell.
Definition graphics.h:21
Definition layer_stack.h:12
Definition layer.h:59
Definition layer.h:50
Definition window.h:30
Definition event.h:108
Definition window_events.h:43
Definition window_events.h:11
Definition specification.h:63
Contains configuration options for both the game and the engine.
Definition specification.h:84