diff --git a/src/assets/Assets.cpp b/src/assets/Assets.cpp index 45db15945..3e0776747 100644 --- a/src/assets/Assets.cpp +++ b/src/assets/Assets.cpp @@ -1,13 +1,17 @@ #include "Assets.hpp" -Assets::Assets(util::ObjectsKeeper& vault) : vault(vault) { +Assets::Assets(util::ObjectsKeeper* vault) : vault(vault) { } Assets::~Assets() { + if (vault == nullptr) { + return; + } for (auto& [_, map] : assets) { for (auto& [__, asset] : map) { - vault.keepAlive(std::move(asset)); + vault->keepAlive(std::move(asset)); } + map.clear(); } } diff --git a/src/assets/Assets.hpp b/src/assets/Assets.hpp index 06372551e..b9faa877f 100644 --- a/src/assets/Assets.hpp +++ b/src/assets/Assets.hpp @@ -65,14 +65,14 @@ namespace assetload { } class Assets { - util::ObjectsKeeper& vault; + util::ObjectsKeeper* vault; std::vector animations; using assets_map = std::unordered_map>; std::unordered_map assets; std::vector setupFuncs; public: - Assets(util::ObjectsKeeper& vault); + Assets(util::ObjectsKeeper* vault); Assets(const Assets&) = delete; ~Assets(); @@ -82,8 +82,8 @@ public: template void store(std::unique_ptr asset, const std::string& name) { auto& dst = assets[typeid(T)][name]; - if (dst != nullptr) { - vault.keepAlive(std::move(dst)); + if (vault != nullptr && dst != nullptr) { + vault->keepAlive(std::move(dst)); } dst.reset(asset.release()); } @@ -91,8 +91,8 @@ public: template void store(std::shared_ptr asset, const std::string& name) { auto& dst = assets[typeid(T)][name]; - if (dst != nullptr) { - vault.keepAlive(std::move(dst)); + if (vault != nullptr && dst != nullptr) { + vault->keepAlive(std::move(dst)); } dst = std::move(asset); } diff --git a/src/engine/AssetsManagement.cpp b/src/engine/AssetsManagement.cpp index b5fd9e7c5..1ca1935c9 100644 --- a/src/engine/AssetsManagement.cpp +++ b/src/engine/AssetsManagement.cpp @@ -51,7 +51,9 @@ void AssetsManagement::loadAssets(Content* content) { logger.info() << "loading assets"; Shader::preprocessor->setPaths(&paths.resPaths); - auto new_assets = std::make_unique(assetsVault); + auto new_assets = std::make_unique( + settings.system.preserveAssetsDuringFrame.get() ? &assetsVault : nullptr + ); AssetsLoader loader(engine, *new_assets, paths.resPaths); AssetsLoader::addDefaults(loader, content); diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp index af4547a14..c66b5c451 100644 --- a/src/io/settings_io.cpp +++ b/src/io/settings_io.cpp @@ -100,6 +100,7 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { builder.addSection("system"); builder.add("max-bg-asset-loaders", &settings.system.maxBgAssetLoaders); + builder.add("preserve-assets-during-frame", &settings.system.preserveAssetsDuringFrame); } dv::value SettingsHandler::getValue(const std::string& name) const { diff --git a/src/settings.hpp b/src/settings.hpp index 331ff3ee8..782330f14 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -122,7 +122,10 @@ struct NetworkSettings { }; struct SystemSettings { + /// @brief Max background assets loaders IntegerSetting maxBgAssetLoaders {3, -4, 16}; + /// @brief Preserve assets during current frame from being destroyed + FlagSetting preserveAssetsDuringFrame {true}; }; struct EngineSettings {