2#include <engine/engine_export.h>
9#include <unordered_map>
75 void save_database(
const std::string& protocol,
const fs::path& path);
123 template<
typename HeaderT>
124 auto get_header(
const hpp::uuid& uid)
const -> std::shared_ptr<HeaderT>
127 if(meta.meta.header && meta.meta.header->is<HeaderT>())
129 return std::static_pointer_cast<HeaderT>(meta.meta.header);
141 template<
typename S,
typename... Args>
144 auto operation = storages_.emplace(hpp::type_id<
asset_storage<S>>().hash_code(),
163 auto& storage = get_storage<T>();
164 return load_asset_from_file_impl<T>(key,
167 storage.container_mutex,
169 storage.load_from_file);
186 if(!meta.location.empty())
188 const auto& key = meta.location;
194 return parent_->
get_asset<T>(uid, flags, mode);
209 auto& storage = get_storage<T>();
210 return register_asset_impl<T>(key,
211 storage.container_mutex,
213 storage.load_from_file);
227 if(!meta.location.empty())
246 auto& storage = get_storage<T>();
247 storage.preload_all();
266 auto& storage = get_storage<T>();
267 return find_asset_impl<T>(key, storage.container_mutex, storage.container);
280 auto& storage = get_storage<T>();
281 return get_asset_from_instance_impl(key,
283 storage.container_mutex,
285 storage.load_from_instance);
297 for(
auto& kvp : databases_)
299 auto& db = kvp.second;
300 db.rename_asset(key, new_key);
303 auto& storage = get_storage<T>();
305 std::lock_guard<std::recursive_mutex> lock(storage.container_mutex);
306 auto it = storage.container.find(key);
307 if(it != storage.container.end())
309 auto&
handle = it->second;
310 handle.set_internal_id(new_key);
311 storage.container[new_key] =
handle;
312 storage.container.erase(it);
329 auto& storage = get_storage<T>();
330 storage.unload_single(pool_, key);
347 auto& storage = get_storage<T>();
348 auto assets = storage.get_group(group);
353 std::move(std::begin(passets), std::end(passets), std::back_inserter(
assets));
366 template<
typename T,
typename F>
369 auto& storage = get_storage<T>();
370 return storage.get_with_condition(std::forward<F>(predicate));
379 template<
typename T,
typename F>
382 auto& storage = get_storage<T>();
383 std::lock_guard<std::recursive_mutex> lock(storage.container_mutex);
385 for(
const auto& el : storage.container)
400 auto get_all_assets(
const std::string& group)
const -> std::vector<std::string>;
408 void evict_unused_assets(
const std::string& group, std::chrono::steady_clock::duration max_idle);
415 auto add_asset(
const std::string& key,
bool override =
false) -> hpp::uuid;
438 void remove_database(
const std::string& group);
453 template<
typename T,
typename F>
454 auto load_asset_from_file_impl(
const std::string& key,
457 std::recursive_mutex& container_mutex,
463 auto inst = find_asset_impl<T>(key, container_mutex, container);
470 std::unique_lock<std::recursive_mutex> lock(container_mutex);
479 pool_.stop(
handle.task_id());
483 handle.set_internal_ids(uid, key);
484 load_func(pool_,
handle, key, mode);
501 auto register_asset_impl(
const std::string& key,
502 std::recursive_mutex& container_mutex,
506 auto inst = find_asset_impl<T>(key, container_mutex, container);
512 std::lock_guard<std::recursive_mutex> lock(container_mutex);
516 handle.set_internal_ids(uid, key);
533 template<
typename T,
typename F>
534 auto get_asset_from_instance_impl(
const std::string& key,
535 std::shared_ptr<T>
entry,
536 std::recursive_mutex& container_mutex,
540 auto inst = find_asset_impl<T>(key, container_mutex, container);
546 std::lock_guard<std::recursive_mutex> lock(container_mutex);
558 handle.set_internal_ids(uid, key);
574 auto find_asset_impl(
const std::string& key,
575 std::recursive_mutex& container_mutex,
578 std::lock_guard<std::recursive_mutex> lock(container_mutex);
579 auto it = container.find(key);
580 if(it != container.end())
587 return parent_->find_asset_impl<T>(
key, container_mutex, container);
599 auto get_storage() -> asset_storage<S>&
601 auto it = storages_.find(hpp::type_id<asset_storage<S>>().hash_code());
602 assert(it != storages_.end());
603 return (
static_cast<asset_storage<S>&
>(*it->second.get()));
612 auto get_storage() const -> asset_storage<S>&
614 auto& storage = storages_.at(hpp::type_id<asset_storage<S>>().hash_code());
615 return (
static_cast<asset_storage<S>&
>(*storage.get()));
619 tpp::thread_pool& pool_;
621 std::unordered_map<std::size_t, std::unique_ptr<basic_storage>> storages_{};
623 mutable std::mutex db_mutex_;
625 std::map<std::string, asset_database, std::less<>> databases_{};
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 register_asset(const hpp::uuid &uid) -> asset_handle< T >
Registers an asset by UUID without loading it. The actual load is triggered on the first handle....
auto register_asset(const std::string &key) -> asset_handle< T >
Registers an asset by key without loading it. The actual load is triggered on the first handle....
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.
void unload_asset(const std::string &key)
Unloads an asset by its key.
void for_each_asset(F &&callback)
Applies a callback function to each asset.
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 get_header(const hpp::uuid &uid) const -> std::shared_ptr< HeaderT >
Gets typed header info for an asset without loading it.
void preload_assets()
Triggers loading on all deferred handles of a given type. Non-blocking: starts background loads but d...
auto get_assets_with_predicate(F &&predicate) const -> std::vector< asset_handle< T > >
Gets all assets that satisfy a predicate.
auto deinit(rtti::context &ctx) -> bool
Deinitializes the asset manager with the given context.
auto add_storage(Args &&... args) -> asset_storage< S > &
Adds a storage for a specific type.
auto get_assets(const std::string &group={}) const -> std::vector< asset_handle< T > >
Gets all assets in a specified group.
auto get_asset(const hpp::uuid &uid, load_flags flags=load_flags::standard, load_mode mode=load_mode::immediate) -> asset_handle< T >
Gets an asset by its UUID.
void remove_asset_info_for_key(const std::string &key)
Removes asset information for a specified key.
auto get_asset(const std::string &key, load_flags flags=load_flags::standard, load_mode mode=load_mode::immediate) -> asset_handle< T >
Gets an asset by its 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 find_asset(const std::string &key) const -> const asset_handle< T > &
Finds an asset by its key.
void rename_asset(const std::string &key, const std::string &new_key)
Renames an asset.
auto add_asset_for_path(const fs::path &path, bool override=false) -> hpp::uuid
Adds an asset with a specified path.
void register_asset_info_for_path(const fs::path &path, bool override)
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.
auto get_asset_from_instance(const std::string &key, std::shared_ptr< T > entry) -> asset_handle< T >
Gets an asset handle from an instance.
load_mode
Controls whether an asset is loaded immediately or deferred until first access.
@ deferred
Register handle only; load triggered on first .get() call.
@ immediate
Schedule load on thread pool now (default, backward compatible).
Thread-safe handle to an asset.
static auto get_empty() -> const asset_handle &
Gets an empty asset handle.
Manages storage and loading of assets of a specific type.
callable< bool(tpp::thread_pool &pool, asset_handle< T > &, const std::string &, load_mode)> load_from_file_t
Function type for loading from file.
std::unordered_map< std::string, asset_handle< T > > request_container_t
Container for asset requests.
std::vector< GitHubAsset > assets