diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index e068295b..42fe4a0b 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -19,13 +19,14 @@ #include "items/ItemDef.hpp" #include "Assets.hpp" #include "assetload_funcs.hpp" +#include "engine/Engine.hpp" namespace fs = std::filesystem; static debug::Logger logger("assets-loader"); -AssetsLoader::AssetsLoader(Assets* assets, const ResPaths* paths) - : assets(assets), paths(paths) { +AssetsLoader::AssetsLoader(Engine& engine, Assets& assets, const ResPaths* paths) + : engine(engine), assets(assets), paths(paths) { addLoader(AssetType::SHADER, assetload::shader); addLoader(AssetType::TEXTURE, assetload::texture); addLoader(AssetType::FONT, assetload::font); @@ -73,7 +74,7 @@ void AssetsLoader::loadNext() { aloader_func loader = getLoader(entry.tag); auto postfunc = loader(this, paths, entry.filename, entry.alias, entry.config); - postfunc(assets); + postfunc(&assets); entries.pop(); } catch (std::runtime_error& err) { logger.error() << err.what(); @@ -101,7 +102,7 @@ static void add_layouts( AssetType::LAYOUT, file.string(), name, - std::make_shared(env) + std::make_shared(&loader.getEngine().getGUI(), env) ); } } @@ -296,6 +297,10 @@ bool AssetsLoader::loadExternalTexture( return false; } +Engine& AssetsLoader::getEngine() { + return engine; +} + const ResPaths* AssetsLoader::getPaths() const { return paths; } @@ -324,7 +329,7 @@ std::shared_ptr AssetsLoader::startTask(runnable onDone) { std::make_shared>( "assets-loader-pool", [=]() { return std::make_shared(this); }, - [=](const assetload::postfunc& func) { func(assets); } + [this](const assetload::postfunc& func) { func(&assets); } ); pool->setOnComplete(std::move(onDone)); while (!entries.empty()) { diff --git a/src/assets/AssetsLoader.hpp b/src/assets/AssetsLoader.hpp index bf117a3d..20dc50a3 100644 --- a/src/assets/AssetsLoader.hpp +++ b/src/assets/AssetsLoader.hpp @@ -18,6 +18,11 @@ class ResPaths; class AssetsLoader; class Content; +class Engine; + +namespace gui { + class GUI; +} struct AssetCfg { virtual ~AssetCfg() { @@ -25,9 +30,10 @@ struct AssetCfg { }; struct LayoutCfg : AssetCfg { + gui::GUI* gui; scriptenv env; - LayoutCfg(scriptenv env) : env(std::move(env)) { + LayoutCfg(gui::GUI* gui, scriptenv env) : gui(gui), env(std::move(env)) { } }; @@ -61,7 +67,8 @@ struct aloader_entry { }; class AssetsLoader { - Assets* assets; + Engine& engine; + Assets& assets; std::map loaders; std::queue entries; std::set> enqueued; @@ -76,7 +83,7 @@ class AssetsLoader { void processPreloadConfig(const io::path& file); void processPreloadConfigs(const Content* content); public: - AssetsLoader(Assets* assets, const ResPaths* paths); + AssetsLoader(Engine& engine, Assets& assets, const ResPaths* paths); void addLoader(AssetType tag, aloader_func func); /// @brief Enqueue asset load @@ -111,4 +118,6 @@ public: const std::string& name, const std::vector& alternatives ); + + Engine& getEngine(); }; diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index bad2bbb5..f6582333 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -189,6 +189,7 @@ assetload::postfunc assetload::layout( auto prefix = name.substr(0, pos); assets->store( UiDocument::read( + *cfg->gui, cfg->env, name, file, diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 5778ed98..b653794c 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -50,8 +50,6 @@ static debug::Logger logger("engine"); -namespace fs = std::filesystem; - static std::unique_ptr load_icon() { try { auto file = "res:textures/misc/icon.png"; @@ -65,20 +63,21 @@ static std::unique_ptr load_icon() { } Engine::Engine() = default; +Engine::~Engine() = default; -static std::unique_ptr engine; +static std::unique_ptr instance = nullptr; Engine& Engine::getInstance() { - if (!engine) { - engine = std::make_unique(); + if (!instance) { + instance = std::make_unique(); } - return *engine; + return *instance; } void Engine::initialize(CoreParameters coreParameters) { params = std::move(coreParameters); settingsHandler = std::make_unique(settings); - interpreter = std::make_unique(); + cmd = std::make_unique(); network = network::Network::create(settings.network); logger.info() << "engine version: " << ENGINE_VERSION_STRING; @@ -97,7 +96,7 @@ void Engine::initialize(CoreParameters coreParameters) { controller = std::make_unique(*this); if (!params.headless) { - if (Window::initialize(&settings.display)){ + if (!(input = Window::initialize(&settings.display))){ throw initialize_error("could not initialize window"); } time.set(Window::time()); @@ -107,9 +106,9 @@ void Engine::initialize(CoreParameters coreParameters) { } loadControls(); - gui = std::make_unique(); + gui = std::make_unique(*this); if (ENGINE_DEBUG_BUILD) { - menus::create_version_label(*this); + menus::create_version_label(*gui); } } audio::initialize(!params.headless, settings.audio); @@ -209,7 +208,7 @@ void Engine::nextFrame() { : settings.display.framerate.get() ); Window::swapBuffers(); - Events::pollEvents(); + input->pollEvents(); } void Engine::renderFrame() { @@ -229,7 +228,7 @@ void Engine::saveSettings() { } } -Engine::~Engine() { +void Engine::close() { saveSettings(); logger.info() << "shutting down"; if (screen) { @@ -238,7 +237,7 @@ Engine::~Engine() { } content.reset(); assets.reset(); - interpreter.reset(); + cmd.reset(); if (gui) { gui.reset(); logger.info() << "gui finished"; @@ -256,17 +255,14 @@ Engine::~Engine() { } void Engine::terminate() { - engine.reset(); + instance->close(); + instance.reset(); } EngineController* Engine::getController() { return controller.get(); } -cmd::CommandsInterpreter* Engine::getCommandsInterpreter() { - return interpreter.get(); -} - PacksManager Engine::createPacksManager(const io::path& worldFolder) { PacksManager manager; manager.setSources({ @@ -286,7 +282,7 @@ void Engine::loadAssets() { Shader::preprocessor->setPaths(resPaths.get()); auto new_assets = std::make_unique(); - AssetsLoader loader(new_assets.get(), resPaths.get()); + AssetsLoader loader(*this, *new_assets, resPaths.get()); AssetsLoader::addDefaults(loader, content.get()); // no need @@ -376,7 +372,6 @@ void Engine::loadContent() { load_configs(pack.folder); } content = contentBuilder.build(); - interpreter->reset(); scripting::on_content_load(content.get()); ContentLoader::loadScripts(*content); @@ -468,10 +463,6 @@ bool Engine::isQuitSignal() const { return quitSignal; } -gui::GUI* Engine::getGUI() { - return gui.get(); -} - EngineSettings& Engine::getSettings() { return settings; } @@ -518,10 +509,6 @@ SettingsHandler& Engine::getSettingsHandler() { return *settingsHandler; } -network::Network& Engine::getNetwork() { - return *network; -} - Time& Engine::getTime() { return time; } diff --git a/src/engine/Engine.hpp b/src/engine/Engine.hpp index ccfabeed..ca5bcb21 100644 --- a/src/engine/Engine.hpp +++ b/src/engine/Engine.hpp @@ -26,6 +26,7 @@ class ResPaths; class EngineController; class SettingsHandler; struct EngineSettings; +class Input; namespace gui { class GUI; @@ -66,8 +67,9 @@ class Engine : public util::ObjectsKeeper { std::unique_ptr content; std::unique_ptr resPaths; std::unique_ptr controller; - std::unique_ptr interpreter; + std::unique_ptr cmd; std::unique_ptr network; + std::unique_ptr input; std::vector basePacks; std::unique_ptr gui; PostRunnables postRunnables; @@ -87,6 +89,7 @@ public: static Engine& getInstance(); void initialize(CoreParameters coreParameters); + void close(); static void terminate(); @@ -128,9 +131,6 @@ public: /// @brief Get active assets storage instance Assets* getAssets(); - - /// @brief Get main UI controller - gui::GUI* getGUI(); /// @brief Get writeable engine settings structure instance EngineSettings& getSettings(); @@ -171,7 +171,6 @@ public: void saveScreenshot(); EngineController* getController(); - cmd::CommandsInterpreter* getCommandsInterpreter(); PacksManager createPacksManager(const io::path& worldFolder); @@ -179,11 +178,25 @@ public: SettingsHandler& getSettingsHandler(); - network::Network& getNetwork(); - Time& getTime(); const CoreParameters& getCoreParameters() const; bool isHeadless() const; + + gui::GUI& getGUI() { + return *gui; + } + + Input& getInput() { + return *input; + } + + network::Network& getNetwork() { + return *network; + } + + cmd::CommandsInterpreter& getCmd() { + return *cmd; + } }; diff --git a/src/frontend/UiDocument.cpp b/src/frontend/UiDocument.cpp index 1dfa18aa..0ca64542 100644 --- a/src/frontend/UiDocument.cpp +++ b/src/frontend/UiDocument.cpp @@ -54,6 +54,7 @@ scriptenv UiDocument::getEnvironment() const { } std::unique_ptr UiDocument::read( + gui::GUI& gui, const scriptenv& penv, const std::string& name, const io::path& file, @@ -66,7 +67,7 @@ std::unique_ptr UiDocument::read( ? scripting::create_doc_environment(scripting::get_root_environment(), name) : scripting::create_doc_environment(penv, name); - gui::UiXmlReader reader(env); + gui::UiXmlReader reader(gui, env); auto view = reader.readXML(file.string(), *xmldoc->getRoot()); view->setId("root"); uidocscript script {}; @@ -80,8 +81,7 @@ std::unique_ptr UiDocument::read( } std::shared_ptr UiDocument::readElement( - const io::path& file, const std::string& fileName + gui::GUI& gui, const io::path& file, const std::string& fileName ) { - auto document = read(nullptr, file.name(), file, fileName); - return document->getRoot(); + return read(gui, nullptr, file.name(), file, fileName)->getRoot(); } diff --git a/src/frontend/UiDocument.hpp b/src/frontend/UiDocument.hpp index 298e63bc..b280249a 100644 --- a/src/frontend/UiDocument.hpp +++ b/src/frontend/UiDocument.hpp @@ -9,6 +9,7 @@ #include "io/fwd.hpp" namespace gui { + class GUI; class UINode; } @@ -45,12 +46,13 @@ public: scriptenv getEnvironment() const; static std::unique_ptr read( + gui::GUI&, const scriptenv& parent_env, const std::string& name, const io::path& file, const std::string& fileName ); static std::shared_ptr readElement( - const io::path& file, const std::string& fileName + gui::GUI&, const io::path& file, const std::string& fileName ); }; diff --git a/src/frontend/debug_panel.cpp b/src/frontend/debug_panel.cpp index 779597e1..67b43f5a 100644 --- a/src/frontend/debug_panel.cpp +++ b/src/frontend/debug_panel.cpp @@ -35,8 +35,8 @@ using namespace gui; -static std::shared_ptr