OGL Engine 1.2.0-dev
Loading...
Searching...
No Matches
app.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <queue>
10#include <optional>
11#include <array>
12#include <typeinfo>
13
14#include "constants.hpp"
15#include "utils/statestore.hpp"
16
17#include "ecs/entity.hpp"
18#include "ecs/registry.hpp"
19#include "ecs/system.hpp"
20
21#include "core/window.hpp"
22#include "input/input.hpp"
24#include "scene/scene.hpp"
25
28
29
30namespace Engine {
40 class App {
41 private:
42 // ECS
44 std::unordered_map<std::type_index, ECS::System*> mSystems;
46 std::unordered_map<std::string, std::function<Scene::Scene*()>> mSceneFactories;
47 // Garde en mémoire le nom de la scène à charger (après un appel à LoadScene())
48 std::optional<std::string> mSceneToLoad;
50 Scene::Scene* mCurrentScene = nullptr;
52 void _LoadScene(const std::string& name);
58 bool mInitialized = false;
59
60 // Rendering pipeline
62 int mWidth;
64 int mHeight;
66 float mFrameCounter;
68 Core::Window* mWindow;
70 Render::RenderTarget* mRenderTarget;
72 Render::ScreenRenderer* mRenderer;
73
74 public:
80 struct AppSettings {
82 std::string title;
84 int windowWidth = 800;
86 int windowHeight = 600;
88 bool stretchFit = false;
90 float resolutionScaling = 1.0f;
92 glm::vec4 clearColor = glm::vec4(0.1f, 0.2f, 0.3f, 1.0f);
97 int fpsLimit = 60;
99
102
110 App(int width = 800, int height = 600, AppSettings settings = {"App"});
119 void Run();
121 void Quit();
122
147
154 glm::vec2 GetMousePosition();
160 glm::vec2 GetProjectedMousePosition();
161
167 int GetWidth();
173 int GetHeight();
181 void SetSize(int width, int height, bool adjustCamera = true);
183 float GetFPS();
184
185 // Scene Management
191 void LoadScene(const std::string& name);
198 template<typename T>
199 void RegisterScene(const std::string& name) {
200 mSceneFactories[name] = [this]() {
201 T* scene = new T();
202 scene->mApp = this;
203 scene->mCamera = new Scene::Camera2D(mWidth, mHeight);
204
205 return static_cast<Scene::Scene*>(scene);
206 };
207 }
208
209 // System management
218 template<typename T, typename... Args>
219 T& RegisterSystem(Args&&... args) {
220 std::type_index ti(typeid(T));
221 if(mSystems.find(ti) != mSystems.end()) throw std::runtime_error("App::RegisterSystem: Can not register an already registered system");
222 mSystems[ti] = new T(args...);
223 mSystems[ti]->mApp = this;
224 if(mCurrentScene) mSystems[ti]->mRegistry = mCurrentScene->GetRegistry();
225
226 return static_cast<T&>(*mSystems[ti]);
227 }
228
235 template<typename T>
236 bool HasSystem() {
237 std::type_index ti(typeid(T));
238 return mSystems.find(ti) != mSystems.end();
239 }
240
247 template<typename T>
249 std::type_index ti(typeid(T));
250 if(mSystems.find(ti) == mSystems.end()) throw std::runtime_error("App::GetSystem: Can not get an unregistered system");
251
252 return static_cast<T&>(*mSystems[ti]);
253 }
254
260 template<typename T>
262 std::type_index ti(typeid(T));
263 if(mSystems.find(ti) == mSystems.end()) throw std::runtime_error("App::UnregisterSystem: Can not unregister an already unregistered system");
264
265 delete mSystems[ti];
266 }
267 };
268}
Wrapper statique autour de l'api OpenAL pour charger, et lire des sons.
bool HasSystem()
vérifie si le système de type T est enregistré
Definition app.hpp:236
int GetWidth()
Renvoie la largeur interne de l'application.
Definition app.cpp:67
Utils::StateStore store
Store global de l'application.
Definition app.hpp:101
Render::RenderTarget * GetRenderTarget()
Renvoie un pointeur vers la renderTarget utilisée pour le screenRenderer.
Definition app.cpp:89
T & GetSystem()
Renvoie le système de type T.
Definition app.hpp:248
Core::Window * GetWindow()
Renvoie le wrapper du contexte openGL.
Definition app.cpp:88
App(int width=800, int height=600, AppSettings settings={"App"})
Créé une nouvelle application.
Definition app.cpp:50
void LoadScene(const std::string &name)
Charge la scène demandée.
Definition app.cpp:135
void UnregisterSystem()
Supprime le système de type T de l'application.
Definition app.hpp:261
Scene::Scene * GetCurrentScene()
Renvoie un pointeur vers la scène actuellement chargée.
Definition app.cpp:90
void SetSize(int width, int height, bool adjustCamera=true)
Définit la taille logique interne de l'application.
Definition app.cpp:69
void RegisterScene(const std::string &name)
Enregistre une scène de type T sous un nom donné
Definition app.hpp:199
int GetHeight()
Renvoie la hauteur interne de l'application.
Definition app.cpp:68
struct Engine::App::AppSettings settings
void Quit()
Demande la fermeture du contexte opengl (et par exetnsion met un terme à la boucle Run)
Definition app.cpp:255
void Run()
Lance la boucle principale de l'application.
Definition app.cpp:139
T & RegisterSystem(Args &&... args)
Enregistre un système de type T dans l'application.
Definition app.hpp:219
glm::vec2 GetProjectedMousePosition()
Permet d'obtenir la position de la osuris projetée dans la scène actuelle.
Definition app.cpp:110
float GetFPS()
Renvoie le nombre d'images comptées depuis la dernière seconde écoulée.
Definition app.cpp:86
glm::vec2 GetMousePosition()
Permet d'obtenir la position de la souris dans le cadre de l'application en prenant en compte les dif...
Definition app.cpp:92
Scene::ICamera * GetCurrentCamera()
Renvoie un pointeur vers la caméra de la scène actuelle.
Definition app.cpp:91
Wrapper pour le contexte openGL, ainsi que la statemachine openGL dans une certaine mesure.
Definition window.hpp:15
La classe RenderTarget encapsule la gestion d'un framebuffer de taille custom pour le rendu de scène ...
Definition rendertarget.hpp:15
La classe ScreenRenderer permet de dessiner une RenderTarget dans le contexte OpenGL courant.
Definition screenrenderer.hpp:18
Definition camera.hpp:31
Definition camera.hpp:7
Classe qui encapsule un registre de composants ECS, et des fonctions de lifcecycle.
Definition scene.hpp:36
Definition statestore.hpp:12
Définit des constantes utilisables un peu partout dans le code du moteur.
Décrit le fonctionnement de l'entité dans une architecture ECS.
Définit les inputs clavier/souris dans un contexte OpenGL donné
Definition app.cpp:14
Définit le rôle du Registre dans l'architecture ECS.
Implémentation d'un wrapper autour d'un framebuffer custom pour dessiner une scène.
Implémente une notion de "Scène" dans le moteur de jeu.
Implémente un système de state/store typé dynamiquement.
Structure de données qui contient des paramètres d'application.
Definition app.hpp:80
int fpsLimit
Limite du nombre d'images par seconde de la boucle principale Ce paramètre n'influence pas la boucle ...
Definition app.hpp:97
int windowHeight
hauteur de la fenêtre OpenGL générée (peut différer de la taille logique interne de l'app)
Definition app.hpp:86
std::string title
Le titre de l'application en cours.
Definition app.hpp:82
int windowWidth
largeur de la fenêtre OpenGL générée (peut différer de la taille logique interne de l'app)
Definition app.hpp:84
float resolutionScaling
Multiplie la résolution du renderTarget interne avant de l'envoyer à l'écran (> 1 = upscale,...
Definition app.hpp:90
bool stretchFit
Décide si le rendu du renderTarget interne doit s'étirer à la fenêtre ou maintenir l'aspect-ratio.
Definition app.hpp:88
glm::vec4 clearColor
La couleur affichée à chaque nettoyage d'écran (avant le dessin de la frame)
Definition app.hpp:92
Définit la manière dont le Système se comporte dans l'architecture ECS.
Fenêtre/Contexte OpenGL nécessaire pour le rendu 2D/3D et la gestion des inputs pour application de b...