// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequesites.hpp #pragma once #ifndef NDK_APPLICATION_HPP #define NDK_APPLICATION_HPP #include #include #include #include #include #include #include #include #ifndef NDK_SERVER #include #include #include #include #include #include #endif namespace Ndk { class NDK_API Application { public: #ifndef NDK_SERVER struct ConsoleOverlay; struct FPSCounterOverlay; #endif inline Application(); Application(int argc, char* argv[]); Application(const Application&) = delete; Application(Application&&) = delete; inline ~Application(); #ifndef NDK_SERVER template T& AddWindow(Args&&... args); #endif template World& AddWorld(Args&&... args); #ifndef NDK_SERVER inline void EnableConsole(bool enable); inline void EnableFPSCounter(bool enable); inline ConsoleOverlay& GetConsoleOverlay(std::size_t windowIndex = 0U); inline FPSCounterOverlay& GetFPSCounterOverlay(std::size_t windowIndex = 0U); #endif inline const std::set& GetOptions() const; inline const std::map& GetParameters() const; inline float GetUpdateTime() const; inline bool HasOption(const Nz::String& option) const; inline bool HasParameter(const Nz::String& key, Nz::String* value) const; #ifndef NDK_SERVER inline bool IsConsoleEnabled() const; inline bool IsFPSCounterEnabled() const; #endif bool Run(); #ifndef NDK_SERVER inline void MakeExitOnLastWindowClosed(bool exitOnClosedWindows); #endif inline void Quit(); Application& operator=(const Application&) = delete; Application& operator=(Application&&) = delete; inline static Application* Instance(); #ifndef NDK_SERVER struct ConsoleOverlay { std::unique_ptr console; Nz::LuaInstance lua; NazaraSlot(Nz::EventHandler, OnEvent, eventSlot); NazaraSlot(Nz::EventHandler, OnKeyPressed, keyPressedSlot); NazaraSlot(Nz::RenderTarget, OnRenderTargetSizeChange, resizedSlot); NazaraSlot(Nz::Log, OnLogWrite, logSlot); }; struct FPSCounterOverlay { Nz::TextSpriteRef sprite; EntityOwner entity; float elapsedTime = 0.f; unsigned int frameCount = 0; }; #endif private: #ifndef NDK_SERVER enum OverlayFlags { OverlayFlags_Console = 0x1, OverlayFlags_FPSCounter = 0x2 }; struct WindowInfo { inline WindowInfo(std::unique_ptr&& window); Nz::RenderTarget* renderTarget; std::unique_ptr window; std::unique_ptr console; std::unique_ptr fpsCounter; std::unique_ptr overlayWorld; }; void SetupConsole(WindowInfo& info); void SetupFPSCounter(WindowInfo& info); void SetupOverlay(WindowInfo& info); template void SetupWindow(WindowInfo& info, T* renderTarget, std::true_type /*isRenderTarget*/); template void SetupWindow(WindowInfo& /*info*/, T* /*renderTarget*/, std::false_type /*isNotRenderTarget*/); std::vector m_windows; #endif std::map m_parameters; std::set m_options; std::list m_worlds; Nz::Clock m_updateClock; #ifndef NDK_SERVER Nz::UInt32 m_overlayFlags; bool m_exitOnClosedWindows; #endif bool m_shouldQuit; float m_updateTime; static Application* s_application; }; } #include #endif // NDK_APPLICATION_HPP