mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-11 22:11:51 +00:00
feat: keeping assets alive during current frame (temporary solution)
This commit is contained in:
parent
ad758fd718
commit
ded0964827
4 changed files with 27 additions and 5 deletions
|
|
@ -1,6 +1,15 @@
|
||||||
#include "Assets.hpp"
|
#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() {
|
const std::vector<TextureAnimation>& Assets::getAnimations() {
|
||||||
return animations;
|
return animations;
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "util/stringutil.hpp"
|
#include "util/stringutil.hpp"
|
||||||
|
#include "util/ObjectsKeeper.hpp"
|
||||||
#include "graphics/core/TextureAnimation.hpp"
|
#include "graphics/core/TextureAnimation.hpp"
|
||||||
|
|
||||||
class Assets;
|
class Assets;
|
||||||
|
|
@ -64,13 +65,14 @@ namespace assetload {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Assets {
|
class Assets {
|
||||||
|
util::ObjectsKeeper& vault;
|
||||||
std::vector<TextureAnimation> animations;
|
std::vector<TextureAnimation> animations;
|
||||||
|
|
||||||
using assets_map = std::unordered_map<std::string, std::shared_ptr<void>>;
|
using assets_map = std::unordered_map<std::string, std::shared_ptr<void>>;
|
||||||
std::unordered_map<std::type_index, assets_map> assets;
|
std::unordered_map<std::type_index, assets_map> assets;
|
||||||
std::vector<assetload::setupfunc> setupFuncs;
|
std::vector<assetload::setupfunc> setupFuncs;
|
||||||
public:
|
public:
|
||||||
Assets() = default;
|
Assets(util::ObjectsKeeper& vault);
|
||||||
Assets(const Assets&) = delete;
|
Assets(const Assets&) = delete;
|
||||||
~Assets();
|
~Assets();
|
||||||
|
|
||||||
|
|
@ -79,12 +81,20 @@ public:
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void store(std::unique_ptr<T> asset, const std::string& name) {
|
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>
|
template <class T>
|
||||||
void store(std::shared_ptr<T> asset, const std::string& name) {
|
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>
|
template <class T>
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ void AssetsManagement::loadAssets(Content* content) {
|
||||||
logger.info() << "loading assets";
|
logger.info() << "loading assets";
|
||||||
Shader::preprocessor->setPaths(&paths.resPaths);
|
Shader::preprocessor->setPaths(&paths.resPaths);
|
||||||
|
|
||||||
auto new_assets = std::make_unique<Assets>();
|
auto new_assets = std::make_unique<Assets>(assetsVault);
|
||||||
AssetsLoader loader(engine, *new_assets, paths.resPaths);
|
AssetsLoader loader(engine, *new_assets, paths.resPaths);
|
||||||
AssetsLoader::addDefaults(loader, content);
|
AssetsLoader::addDefaults(loader, content);
|
||||||
|
|
||||||
|
|
@ -78,6 +78,7 @@ void AssetsManagement::loadAssets(Content* content) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetsManagement::update() {
|
void AssetsManagement::update() {
|
||||||
|
assetsVault.clearKeepedObjects();
|
||||||
if (backgroundLoaderTask) {
|
if (backgroundLoaderTask) {
|
||||||
backgroundLoaderTask->update();
|
backgroundLoaderTask->update();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "assets/Assets.hpp"
|
#include "assets/Assets.hpp"
|
||||||
|
#include "util/ObjectsKeeper.hpp"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
|
@ -30,4 +31,5 @@ private:
|
||||||
std::unique_ptr<Assets> assets;
|
std::unique_ptr<Assets> assets;
|
||||||
std::unique_ptr<AssetsLoader> backgroundLoader;
|
std::unique_ptr<AssetsLoader> backgroundLoader;
|
||||||
std::shared_ptr<Task> backgroundLoaderTask;
|
std::shared_ptr<Task> backgroundLoaderTask;
|
||||||
|
util::ObjectsKeeper assetsVault;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue