2#include <engine/engine_export.h>
9#include <unordered_map>
75 void save_database(
const std::string& protocol,
const fs::path& path);
121 template<
typename S,
typename... Args>
124 auto operation = storages_.emplace(hpp::type_id<
asset_storage<S>>().hash_code(),
140 auto& storage = get_storage<T>();
141 return load_asset_from_file_impl<T>(key,
143 storage.container_mutex,
145 storage.load_from_file);
159 if(!meta.location.empty())
161 const auto& key = meta.location;
167 return parent_->
get_asset<T>(uid, flags);
181 auto& storage = get_storage<T>();
182 return find_asset_impl<T>(key, storage.container_mutex, storage.container);
195 auto& storage = get_storage<T>();
196 return get_asset_from_instance_impl(key,
198 storage.container_mutex,
200 storage.load_from_instance);
212 for(
auto& kvp : databases_)
214 auto& db = kvp.second;
215 db.rename_asset(key, new_key);
218 auto& storage = get_storage<T>();
220 std::lock_guard<std::recursive_mutex> lock(storage.container_mutex);
221 auto it = storage.container.find(key);
222 if(it != storage.container.end())
224 auto&
handle = it->second;
225 handle.set_internal_id(new_key);
226 storage.container[new_key] =
handle;
227 storage.container.erase(it);
244 auto& storage = get_storage<T>();
245 storage.unload_single(pool_, key);
262 auto& storage = get_storage<T>();
263 auto assets = storage.get_group(group);
268 std::move(std::begin(passets), std::end(passets), std::back_inserter(assets));
281 template<
typename T,
typename F>
284 auto& storage = get_storage<T>();
285 return storage.get_with_condition(std::forward<F>(predicate));
294 template<
typename T,
typename F>
297 auto& storage = get_storage<T>();
298 std::lock_guard<std::recursive_mutex> lock(storage.container_mutex);
300 for(
const auto& el : storage.container)
323 void remove_database(
const std::string& group);
330 auto add_asset(
const std::string& key) -> hpp::uuid;
343 template<
typename T,
typename F>
344 auto load_asset_from_file_impl(
const std::string& key,
346 std::recursive_mutex& container_mutex,
352 auto inst = find_asset_impl<T>(key, container_mutex, container);
359 std::unique_lock<std::recursive_mutex> lock(container_mutex);
365 auto uid = add_asset(key);
372 pool_.stop(
handle.task_id());
376 handle.set_internal_ids(uid, key);
377 load_func(pool_,
handle, key);
394 template<
typename T,
typename F>
395 auto get_asset_from_instance_impl(
const std::string& key,
396 std::shared_ptr<T>
entry,
397 std::recursive_mutex& container_mutex,
401 auto inst = find_asset_impl<T>(key, container_mutex, container);
407 std::lock_guard<std::recursive_mutex> lock(container_mutex);
413 auto uid = add_asset(key);
419 handle.set_internal_ids(uid, key);
435 auto find_asset_impl(
const std::string& key,
436 std::recursive_mutex& container_mutex,
439 std::lock_guard<std::recursive_mutex> lock(container_mutex);
440 auto it = container.find(key);
441 if(it != container.end())
448 return parent_->find_asset_impl<T>(
key, container_mutex, container);
460 auto get_storage() -> asset_storage<S>&
462 auto it = storages_.find(hpp::type_id<asset_storage<S>>().hash_code());
463 assert(it != storages_.end());
464 return (
static_cast<asset_storage<S>&
>(*it->second.get()));
473 auto get_storage() const -> asset_storage<S>&
475 auto& storage = storages_.at(hpp::type_id<asset_storage<S>>().hash_code());
476 return (
static_cast<asset_storage<S>&
>(*storage.get()));
480 tpp::thread_pool& pool_;
482 std::unordered_map<std::size_t, std::unique_ptr<basic_storage>> storages_{};
484 mutable std::mutex db_mutex_;
486 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 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
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 get_asset(const hpp::uuid &uid, load_flags flags=load_flags::standard) -> asset_handle< T >
Gets an asset by its UUID.
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 get_metadata(const hpp::uuid &uid) const -> asset_database::meta
Gets metadata for a resource uid.
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_asset(const std::string &key, load_flags flags=load_flags::standard) -> asset_handle< T >
Gets an asset by its key.
auto get_assets(const std::string &group={}) const -> std::vector< asset_handle< T > >
Gets all assets in a specified group.
void remove_asset_info_for_key(const std::string &key)
Removes asset information for a specified key.
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.
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.
Represents a handle to an asset, providing access and management functions.
static auto get_empty() -> const asset_handle &
Gets an empty asset handle.
Manages storage and loading of assets of a specific type.
std::unordered_map< std::string, asset_handle< T > > request_container_t
Container for asset requests.