37 APPLOG_TRACE(
"{}::{}", hpp::type_name_str(*
this), __func__);
42 auto& storage = add_storage<gfx::shader>();
47 auto& storage = add_storage<gfx::texture>();
53 auto& storage = add_storage<material>();
59 auto& storage = add_storage<mesh>();
65 auto& storage = add_storage<animation_clip>();
71 auto& storage = add_storage<prefab>();
77 auto& storage = add_storage<scene_prefab>();
83 auto& storage = add_storage<physics_material>();
89 auto& storage = add_storage<ui_tree>();
95 auto& storage = add_storage<style_sheet>();
101 auto& storage = add_storage<audio_clip>();
107 auto& storage = add_storage<font>();
113 auto& storage = add_storage<script>();
123 APPLOG_TRACE(
"{}::{}", hpp::type_name_str(*
this), __func__);
134 for(
auto& pair : storages_)
136 auto& storage = pair.second;
137 storage->unload_all(pool_);
141 std::lock_guard<std::mutex> lock(db_mutex_);
148 for(
auto& pair : storages_)
150 auto& storage = pair.second;
151 storage->unload_group(pool_, group);
155 remove_database(group);
161 std::lock_guard<std::mutex> lock(db_mutex_);
164 std::vector<std::string> result;
165 for(
auto& kvp : databases_)
167 if(kvp.first != protocol)
171 auto& db = kvp.second;
172 for(
auto& kvp : db.get_database())
174 result.push_back(kvp.second.location);
180auto asset_manager::get_database(
const std::string& key) ->
asset_database&
183 return databases_[protocol.generic_string()];
186void asset_manager::remove_database(
const std::string& key)
190 std::lock_guard<std::mutex> lock(db_mutex_);
191 databases_.erase(protocol.generic_string());
198 std::lock_guard<std::mutex> lock(db_mutex_);
199 auto& db = get_database(protocol);
205 std::lock_guard<std::mutex> lock(db_mutex_);
206 auto& db = get_database(protocol);
212 auto meta = generate_metadata(key);
213 return add_asset_info_for_key(key, meta,
override);
219 return add_asset(key,
override);
225 return add_asset_info_for_key(key, meta,
override);
230 std::lock_guard<std::mutex> lock(db_mutex_);
231 auto& db = get_database(key);
232 return db.add_asset(key, meta,
override);
237 std::lock_guard<std::mutex> lock(db_mutex_);
238 for(
auto& kvp : databases_)
240 auto& db = kvp.second;
241 const auto& meta = db.get_metadata(uid);
242 if(!meta.location.empty())
253 return get_metadata_for_key(key);
261 std::lock_guard<std::mutex> lock(db_mutex_);
263 const auto it = databases_.find(protocol);
264 if(it == databases_.cend())
269 return it->second.get_metadata(key);
275 meta.
type = p.extension().string();
279 if(meta.
type.empty() || protocol !=
"app")
299 std::lock_guard<std::mutex> lock(db_mutex_);
300 auto& db = get_database(key);
301 db.remove_asset(key);
306 for(
auto& [type_hash, storage] : storages_)
308 storage->evict_unused(pool_, group, max_idle);
314 for(
auto& [type_hash, storage] : storages_)
316 storage->preload_all();
Manages asset metadata and provides functionality for adding, removing, and querying assets.
Manages assets, including loading, unloading, and storage.
auto load_database(const std::string &protocol) -> bool
Loads an asset database from a protocol.
void preload_all_assets()
Triggers loading on all deferred handles across every registered storage. Non-blocking: starts backgr...
void save_database(const std::string &protocol, const fs::path &path)
Saves the asset database to a specified path.
asset_manager(rtti::context &ctx)
Constructs an asset manager with the given context.
auto generate_metadata(const fs::path &p) const -> asset_meta
auto get_all_assets(const std::string &group) const -> std::vector< std::string >
Gets all assets.
auto get_metadata_for_path(const fs::path &path) const -> asset_database::meta
void evict_unused_assets(const std::string &group, std::chrono::steady_clock::duration max_idle)
Evicts full-loaded assets not accessed within the given duration. Demotes them back to deferred state...
void unload_all()
Unloads all assets.
auto init(rtti::context &ctx) -> bool
Initializes the asset manager with the given context.
~asset_manager()
Destructs the asset manager.
auto add_asset(const std::string &key, bool override=false) -> hpp::uuid
Adds an asset with a specified key.
auto get_metadata(const hpp::uuid &uid) const -> asset_database::meta
Gets metadata for a resource uid.
auto deinit(rtti::context &ctx) -> bool
Deinitializes the asset manager with the given context.
void remove_asset_info_for_key(const std::string &key)
Removes asset information for a specified key.
auto get_metadata_for_key(const std::string &key) const -> asset_database::meta
auto add_asset_info_for_key(const std::string &key, const asset_meta &meta, bool override) -> hpp::uuid
Adds asset information for a specified key.
auto add_asset_info_for_path(const fs::path &path, const asset_meta &meta, bool override) -> hpp::uuid
Adds asset information for a specified path.
void remove_asset_info_for_path(const fs::path &path)
Removes asset information for a specified path.
auto add_asset_for_path(const fs::path &path, bool override=false) -> hpp::uuid
Adds an asset with a specified path.
void unload_group(const std::string &group)
Unloads all assets in a specified group.
void set_parent(asset_manager *parent)
Sets the parent asset manager.
#define APPLOG_TRACE(...)
path extract_protocol(const path &_path)
Given the specified path/filename, resolve the final full filename. This will be based on either the ...
path resolve_protocol(const path &_path)
Given the specified path/filename, resolve the final full filename. This will be based on either the ...
path convert_to_protocol(const path &_path)
Oposite of the resolve_protocol this function tries to convert to protocol path from an absolute one.
auto load_from_file< gfx::texture >(tpp::thread_pool &pool, asset_handle< gfx::texture > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< scene_prefab >(tpp::thread_pool &pool, asset_handle< scene_prefab > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< style_sheet >(tpp::thread_pool &pool, asset_handle< style_sheet > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< material >(tpp::thread_pool &pool, asset_handle< material > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< gfx::shader >(tpp::thread_pool &pool, asset_handle< gfx::shader > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< mesh >(tpp::thread_pool &pool, asset_handle< mesh > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< script >(tpp::thread_pool &pool, asset_handle< script > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< ui_tree >(tpp::thread_pool &pool, asset_handle< ui_tree > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< animation_clip >(tpp::thread_pool &pool, asset_handle< animation_clip > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< audio_clip >(tpp::thread_pool &pool, asset_handle< audio_clip > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< physics_material >(tpp::thread_pool &pool, asset_handle< physics_material > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< prefab >(tpp::thread_pool &pool, asset_handle< prefab > &output, const std::string &key, load_mode mode) -> bool
auto load_from_file< font >(tpp::thread_pool &pool, asset_handle< font > &output, const std::string &key, load_mode mode) -> bool
auto load_from_instance(tpp::thread_pool &pool, asset_handle< T > &output, std::shared_ptr< T > instance) -> bool
void mesh_importer_init()
auto generate_uuid() -> hpp::uuid
void load_from_file(const std::string &absolute_path, animation_clip &obj)
void save_to_file(const std::string &absolute_path, const animation_clip &obj)