feat: keeping assets alive during current frame (temporary solution)

This commit is contained in:
MihailRis 2026-02-28 00:27:08 +03:00
parent ad758fd718
commit ded0964827
4 changed files with 27 additions and 5 deletions

View file

@ -1,6 +1,15 @@
#include "Assets.hpp"
Assets::~Assets() = default;
Assets::Assets(util::ObjectsKeeper& vault) : vault(vault) {
}
Assets::~Assets() {
for (auto& [_, map] : assets) {
for (auto& [__, asset] : map) {
vault.keepAlive(std::move(asset));
}
}
}
const std::vector<TextureAnimation>& Assets::getAnimations() {
return animations;

View file

@ -12,6 +12,7 @@
#include <vector>
#include "util/stringutil.hpp"
#include "util/ObjectsKeeper.hpp"
#include "graphics/core/TextureAnimation.hpp"
class Assets;
@ -64,13 +65,14 @@ namespace assetload {
}
class Assets {
util::ObjectsKeeper& vault;
std::vector<TextureAnimation> animations;
using assets_map = std::unordered_map<std::string, std::shared_ptr<void>>;
std::unordered_map<std::type_index, assets_map> assets;
std::vector<assetload::setupfunc> setupFuncs;
public:
Assets() = default;
Assets(util::ObjectsKeeper& vault);
Assets(const Assets&) = delete;
~Assets();
@ -79,12 +81,20 @@ public:
template <class T>
void store(std::unique_ptr<T> asset, const std::string& name) {
assets[typeid(T)][name].reset(asset.release());
auto& dst = assets[typeid(T)][name];
if (dst != nullptr) {
vault.keepAlive(std::move(dst));
}
dst.reset(asset.release());
}
template <class T>
void store(std::shared_ptr<T> asset, const std::string& name) {
assets[typeid(T)][name] = std::move(asset);
auto& dst = assets[typeid(T)][name];
if (dst != nullptr) {
vault.keepAlive(std::move(dst));
}
dst = std::move(asset);
}
template <class T>