/***************************************************************************************** * * * OpenSpace * * * * Copyright (c) 2014-2018 * * * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * * software and associated documentation files (the "Software"), to deal in the Software * * without restriction, including without limitation the rights to use, copy, modify, * * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * * permit persons to whom the Software is furnished to do so, subject to the following * * conditions: * * * * The above copyright notice and this permission notice shall be included in all copies * * or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ #ifndef __OPENSPACE_CORE___OPENSPACEENGINE___H__ #define __OPENSPACE_CORE___OPENSPACEENGINE___H__ #include #include #include #include #include #include #include #include #include #include namespace ghoul { class Dictionary; } namespace ghoul::cmdparser { class CommandlineParser; } namespace ghoul::fontrendering { class FontManager; } namespace openspace { class AssetManager; struct Configuration; class Dashboard; class DownloadManager; class GUI; class LoadingScreen; class LuaConsole; class ModuleEngine; class NetworkEngine; class ParallelPeer; class RenderEngine; class Scene; class SyncEngine; class TimeManager; class VirtualPropertyManager; class WindowWrapper; namespace interaction { class KeyBindingManager; class NavigationHandler; } // namespace interaction namespace gui { class GUI; } namespace properties { class PropertyOwner; } namespace scripting { struct LuaLibrary; class ScriptEngine; class ScriptScheduler; } // namespace scripting // Structure that is responsible for the delayed shutdown of the application struct ShutdownInformation { // Whether the application is currently in shutdown mode (i.e. counting down the // timer and closing it at '0' bool inShutdown = false; // Total amount of time the application will wait before actually shutting down float waitTime = 0.f; // Current state of the countdown; if it reaches '0', the application will // close float timer = 0.f; }; class OpenSpaceEngine { public: static void create(int argc, char** argv, std::unique_ptr windowWrapper, std::vector& sgctArguments, bool& requestClose, bool consoleLog = true); static void destroy(); static OpenSpaceEngine& ref(); static bool isCreated(); ~OpenSpaceEngine() = default; // callbacks void initialize(); void initializeGL(); void deinitialize(); void preSynchronization(); void postSynchronizationPreDraw(); void render(const glm::mat4& sceneMatrix, const glm::mat4& viewMatrix, const glm::mat4& projectionMatrix); void drawOverlays(); void postDraw(); void keyboardCallback(Key key, KeyModifier mod, KeyAction action); void charCallback(unsigned int codepoint, KeyModifier mod); void mouseButtonCallback(MouseButton button, MouseAction action); void mousePositionCallback(double x, double y); void mouseScrollWheelCallback(double posX, double posY); void setJoystickInputStates(interaction::JoystickInputStates& states); void externalControlCallback(const char* receivedChars, int size, int clientId); void encode(); void decode(); void scheduleLoadSingleAsset(std::string assetPath); void toggleShutdownMode(); // On purpose, there is no function that returns a non-const reference to // Configuration; that guards us against anyone in the program changing the // configuration values underneath our feet const Configuration& configuration() const; // Guaranteed to return a valid pointer LuaConsole& console(); AssetManager& assetManager(); Dashboard& dashboard(); DownloadManager& downloadManager(); ModuleEngine& moduleEngine(); LoadingScreen& loadingScreen(); NetworkEngine& networkEngine(); ParallelPeer& parallelPeer(); RenderEngine& renderEngine(); TimeManager& timeManager(); WindowWrapper& windowWrapper(); ghoul::fontrendering::FontManager& fontManager(); interaction::NavigationHandler& navigationHandler(); interaction::KeyBindingManager& keyBindingManager(); properties::PropertyOwner& rootPropertyOwner(); properties::PropertyOwner& globalPropertyOwner(); scripting::ScriptEngine& scriptEngine(); scripting::ScriptScheduler& scriptScheduler(); VirtualPropertyManager& virtualPropertyManager(); // This method is only to be called from Modules enum class CallbackOption { Initialize = 0, // Callback for the end of the initialization Deinitialize, // Callback for the end of the deinitialization InitializeGL, // Callback for the end of the OpenGL initialization DeinitializeGL, // Callback for the end of the OpenGL deinitialization PreSync, // Callback for the end of the pre-sync function PostSyncPreDraw, // Callback for the end of the post-sync-pre-draw function Render, // Callback for the end of the render function Draw2D, // Callback for the two-dimensional rendering functions PostDraw // Callback for the end of the post-draw function }; // Registers a callback for a specific CallbackOption void registerModuleCallback(CallbackOption option, std::function function); // Registers a callback that is called when a new keyboard event is received void registerModuleKeyboardCallback( std::function function); // Registers a callback that is called when a new character event is received void registerModuleCharCallback( std::function function); // Registers a callback that is called when a new mouse button is received void registerModuleMouseButtonCallback( std::function function); // Registers a callback that is called when a new mouse movement is received void registerModuleMousePositionCallback( std::function function); // Registers a callback that is called when a scroll wheel change is received void registerModuleMouseScrollWheelCallback( std::function function ); void writeSceneDocumentation(); void writeStaticDocumentation(); /** * Returns the Lua library that contains all Lua functions available to affect the * application. */ static scripting::LuaLibrary luaLibrary(); private: OpenSpaceEngine(std::string programName, std::unique_ptr windowWrapper); void loadSingleAsset(const std::string& assetPath); void gatherCommandlineArguments(); void loadFonts(); void configureLogging(bool consoleLog); void runGlobalCustomizationScripts(); void configureLogging(); std::unique_ptr _configuration; // Components std::unique_ptr _scene; std::unique_ptr _assetManager; std::unique_ptr _dashboard; std::unique_ptr _downloadManager; std::unique_ptr _console; std::unique_ptr _moduleEngine; std::unique_ptr _networkEngine; std::unique_ptr _parallelPeer; std::unique_ptr _renderEngine; std::unique_ptr _syncEngine; std::unique_ptr _timeManager; std::unique_ptr _windowWrapper; std::unique_ptr _commandlineParser; std::unique_ptr _fontManager; std::unique_ptr _navigationHandler; std::unique_ptr _keyBindingManager; std::unique_ptr _scriptEngine; std::unique_ptr _scriptScheduler; std::unique_ptr _virtualPropertyManager; // Others std::unique_ptr _rootPropertyOwner; std::unique_ptr _globalPropertyOwner; std::unique_ptr _loadingScreen; struct { properties::StringProperty versionString; properties::StringProperty sourceControlInformation; } _versionInformation; bool _hasScheduledAssetLoading = false; std::string _scheduledAssetPathToLoad; struct { std::vector> initialize; std::vector> deinitialize; std::vector> initializeGL; std::vector> deinitializeGL; std::vector> preSync; std::vector> postSyncPreDraw; std::vector> render; std::vector> draw2D; std::vector> postDraw; std::vector> keyboard; std::vector> character; std::vector> mouseButton; std::vector> mousePosition; std::vector> mouseScrollWheel; } _moduleCallbacks; ShutdownInformation _shutdown; // The first frame might take some more time in the update loop, so we need to know to // disable the synchronization; otherwise a hardware sync will kill us after 1 minute bool _isFirstRenderingFirstFrame = true; glm::dvec2 _mousePosition; static OpenSpaceEngine* _engine; }; #define OsEng (openspace::OpenSpaceEngine::ref()) } // namespace openspace #endif // __OPENSPACE_CORE___OPENSPACEENGINE___H__