From d5f8fed63315d64327ea1bb5e83b4dca4cf9f5d5 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 23 Jan 2026 12:48:54 +0300 Subject: [PATCH] add AssetsManagement --- src/engine/AssetsManagement.cpp | 53 +++++++++++++++++++++++++++++++++ src/engine/AssetsManagement.hpp | 22 ++++++++++++++ src/engine/Engine.cpp | 34 ++++----------------- src/engine/Engine.hpp | 3 +- 4 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 src/engine/AssetsManagement.cpp create mode 100644 src/engine/AssetsManagement.hpp diff --git a/src/engine/AssetsManagement.cpp b/src/engine/AssetsManagement.cpp new file mode 100644 index 000000000..2135f568f --- /dev/null +++ b/src/engine/AssetsManagement.cpp @@ -0,0 +1,53 @@ +#include "AssetsManagement.hpp" + +#include "assets/Assets.hpp" +#include "assets/AssetsLoader.hpp" +#include "engine/Engine.hpp" +#include "debug/Logger.hpp" +#include "content/Content.hpp" +#include "graphics/core/Shader.hpp" +#include "EnginePaths.hpp" +#include "coders/GLSLExtension.hpp" +#include "graphics/render/ModelsGenerator.hpp" +#include "graphics/ui/GUI.hpp" + +static debug::Logger logger("assets-management"); + +AssetsManagement::AssetsManagement(Engine& engine) : engine(engine) {} + +const Assets* AssetsManagement::getStorage() const { + return assets.get(); +} + +Assets* AssetsManagement::getStorage() { + return assets.get(); +} + +void AssetsManagement::loadAssets(Content* content) { + const auto& paths = engine.getPaths(); + logger.info() << "loading assets"; + Shader::preprocessor->setPaths(&paths.resPaths); + + auto new_assets = std::make_unique(); + AssetsLoader loader(engine, *new_assets, paths.resPaths); + AssetsLoader::addDefaults(loader, content); + + // no need + // correct log messages order is more useful + // todo: before setting to true, check if GLSLExtension thread safe + bool threading = false; // look at three upper lines + if (threading) { + auto task = loader.startTask([=](){}); + task->waitForEnd(); + } else { + while (loader.hasNext()) { + loader.loadNext(); + } + } + assets = std::move(new_assets); + if (content) { + ModelsGenerator::prepare(*content, *assets); + } + assets->setup(); + engine.getGUI().onAssetsLoad(assets.get()); +} diff --git a/src/engine/AssetsManagement.hpp b/src/engine/AssetsManagement.hpp new file mode 100644 index 000000000..5b06e6d8c --- /dev/null +++ b/src/engine/AssetsManagement.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include + +class Assets; +class AssetsLoader; +class Engine; +class Content; + +class AssetsManagement { +public: + AssetsManagement(Engine& engine); + + void loadAssets(Content* content); + + Assets* getStorage(); + const Assets* getStorage() const; +private: + Engine& engine; + std::unique_ptr assets; + std::unique_ptr backgroundLoader; +}; diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 5a63991bb..6cc976799 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -34,6 +34,7 @@ #include "window/input.hpp" #include "window/Window.hpp" #include "world/Level.hpp" +#include "AssetsManagement.hpp" #include "Mainloop.hpp" #include "ServerMainloop.hpp" #include "WindowControl.hpp" @@ -84,6 +85,7 @@ void Engine::onContentLoad() { } void Engine::initializeClient() { + assets = std::make_unique(*this); windowControl = std::make_unique(*this); auto [window, input] = windowControl->initialize(); @@ -305,7 +307,7 @@ void Engine::renderFrame() { screen->draw(time.getDelta()); DrawContext ctx(nullptr, *window, nullptr); - gui->draw(ctx, *assets); + gui->draw(ctx, *assets->getStorage()); } void Engine::saveSettings() { @@ -363,33 +365,7 @@ void Engine::setLevelConsumer(OnWorldOpen levelConsumer) { } void Engine::loadAssets() { - logger.info() << "loading assets"; - Shader::preprocessor->setPaths(&paths->resPaths); - - auto content = this->content->get(); - - auto new_assets = std::make_unique(); - AssetsLoader loader(*this, *new_assets, paths->resPaths); - AssetsLoader::addDefaults(loader, content); - - // no need - // correct log messages order is more useful - // todo: before setting to true, check if GLSLExtension thread safe - bool threading = false; // look at three upper lines - if (threading) { - auto task = loader.startTask([=](){}); - task->waitForEnd(); - } else { - while (loader.hasNext()) { - loader.loadNext(); - } - } - assets = std::move(new_assets); - if (content) { - ModelsGenerator::prepare(*content, *assets); - } - assets->setup(); - gui->onAssetsLoad(assets.get()); + assets->loadAssets(content->get()); } void Engine::loadProject() { @@ -442,7 +418,7 @@ EngineSettings& Engine::getSettings() { } Assets* Engine::getAssets() { - return assets.get(); + return assets->getStorage(); } EnginePaths& Engine::getPaths() { diff --git a/src/engine/Engine.hpp b/src/engine/Engine.hpp index 06246f8c6..7ecff05c6 100644 --- a/src/engine/Engine.hpp +++ b/src/engine/Engine.hpp @@ -10,6 +10,7 @@ #include class Assets; +class AssetsManagement; class ContentControl; class EngineController; class EnginePaths; @@ -52,7 +53,7 @@ class Engine : public util::ObjectsKeeper { std::unique_ptr paths; std::unique_ptr project; std::unique_ptr settingsHandler; - std::unique_ptr assets; + std::unique_ptr assets; std::shared_ptr screen; std::unique_ptr content; std::unique_ptr controller;