#pragma once #include #include "Engine/Graphics/UI.hpp" #include "Engine/Graphics/DebugUI.hpp" #include "Engine/Graphics/3DRenderer.hpp" #include "Engine/Utils/Timers.hpp" #define WNDSIZE_DEFAULT_W (1280) #define WNDSIZE_DEFAULT_H (720) #define W_RATIO (16.f / 9.f) #define H_RATIO (9.f / 16.f) #define TARGET_FPS (60) typedef enum eGameStatus { GAME_INIT, GAME_RUNNING, GAME_QUIT } GAME_STATUS; //TODO: Use thread for Update/Render instance class Game final { public: static Game& getInstance(std::shared_ptr mainWnd, bool dbgFlag) { if (smInstance == nullptr) smInstance = new Game(mainWnd, dbgFlag); return *smInstance; } ~Game() = default; Game(Game&&) = default; Game& operator= (Game&&) = default; Game(Game const&) = delete; Game& operator= (Game const&) = delete; static void GetDefaultWindowSize(unsigned int& w, unsigned int& h) noexcept { w = WNDSIZE_DEFAULT_W; h = WNDSIZE_DEFAULT_H; } GAME_STATUS Tick(); void EventMouseMoved(int _x, int _y); void EventWindowSizeChanged(unsigned int w, unsigned int h); private: Game(std::shared_ptr& mainWnd, bool dbgFlag) noexcept(false); static Game* smInstance; void Update(); void KeyboardInputsCheck(); void Render(); bool mbDbgModeEnabled; std::unique_ptr mDbgUI = nullptr; SysTimer mSysTimer; SysTimer mKeyEventTimer; std::unique_ptr mPerfsTimer = nullptr; std::shared_ptr mMainWindow; std::shared_ptr mWorld3D; std::unique_ptr mCockpitUI; std::unique_ptr mWorldUI; sf::Vector2i mPrevMousePos = {0, 0}; };