#pragma once #include #include #include #include #include #include #include class GameInstance; struct GameInfo { GameInfo() { gameName = "Game"; defaultMap = ""; benchmarkingEnabled = false; debugGUIEnabled = false; isEditor = false; } std::string gameName, defaultMap; bool benchmarkingEnabled; bool debugGUIEnabled; bool isEditor; }; class Engine { public: Engine(GameInfo info); ~Engine(); void Tick(bool updateSystems = true); template T* GetSystem() { static_assert(std::is_base_of::value, "GetSystem requires to be given a type that derives from System!"); if(m_systems.count(typeid(T))) return static_cast(m_systems.at(typeid(T))); return nullptr; } Renderer* GetRenderer() const { return m_renderer; } GameInstance* GetGame() const { return m_gameInstance; } GameInfo gameInfo; private: template void AddSystem() { static_assert(std::is_base_of::value, "AddSystem requires that the type derives from System!"); T* t = new T; static_cast(t)->SetEngine(this); m_systems.emplace(typeid(T), t); } void ApplyOptions(); void PickSuitableBackend(); void CreateBackend(); void DrawDebug(); bool m_debugging, m_benchmarking; GameInstance* m_gameInstance; Renderer* m_renderer; std::map m_systems; //used for time calculation std::chrono::time_point m_applicationStart; std::chrono::duration m_currentTime; int m_frames = 0; float m_lastTime = 0.0f; int m_oldWindowX = 0, m_oldWindowY = 0; };