Unravel Engine C++ Reference
Loading...
Searching...
No Matches
asset_manager.cpp
Go to the documentation of this file.
1#include "asset_manager.h"
2#include "impl/asset_reader.h"
4
7#include <engine/ecs/prefab.h>
10#include <engine/ui/ui_tree.h>
15
17
18#include <graphics/shader.h>
19#include <graphics/texture.h>
20
21namespace unravel
22{
23asset_manager::asset_manager(rtti::context& ctx) : pool_(*ctx.get_cached<threader>().pool)
24{
25}
26
28
30{
31 parent_ = parent;
32}
33
35{
36 APPLOG_TRACE("{}::{}", hpp::type_name_str(*this), __func__);
37
39 init_fonts();
40 {
41 auto& storage = add_storage<gfx::shader>();
42 storage.load_from_file = asset_reader::load_from_file<gfx::shader>;
43 storage.load_from_instance = asset_reader::load_from_instance<gfx::shader>;
44 }
45 {
46 auto& storage = add_storage<gfx::texture>();
47 storage.load_from_file = asset_reader::load_from_file<gfx::texture>;
48 storage.load_from_instance = asset_reader::load_from_instance<gfx::texture>;
49 }
50
51 {
52 auto& storage = add_storage<material>();
53 storage.load_from_file = asset_reader::load_from_file<material>;
54 storage.load_from_instance = asset_reader::load_from_instance<material>;
55 }
56
57 {
58 auto& storage = add_storage<mesh>();
59 storage.load_from_file = asset_reader::load_from_file<mesh>;
60 storage.load_from_instance = asset_reader::load_from_instance<mesh>;
61 }
62
63 {
64 auto& storage = add_storage<animation_clip>();
65 storage.load_from_file = asset_reader::load_from_file<animation_clip>;
66 storage.load_from_instance = asset_reader::load_from_instance<animation_clip>;
67 }
68
69 {
70 auto& storage = add_storage<prefab>();
71 storage.load_from_file = asset_reader::load_from_file<prefab>;
72 storage.load_from_instance = asset_reader::load_from_instance<prefab>;
73 }
74
75 {
76 auto& storage = add_storage<scene_prefab>();
77 storage.load_from_file = asset_reader::load_from_file<scene_prefab>;
78 storage.load_from_instance = asset_reader::load_from_instance<scene_prefab>;
79 }
80
81 {
82 auto& storage = add_storage<physics_material>();
84 storage.load_from_instance = asset_reader::load_from_instance<physics_material>;
85 }
86
87 {
88 auto& storage = add_storage<ui_tree>();
89 storage.load_from_file = asset_reader::load_from_file<ui_tree>;
90 storage.load_from_instance = asset_reader::load_from_instance<ui_tree>;
91 }
92
93 {
94 auto& storage = add_storage<style_sheet>();
95 storage.load_from_file = asset_reader::load_from_file<style_sheet>;
96 storage.load_from_instance = asset_reader::load_from_instance<style_sheet>;
97 }
98
99 {
100 auto& storage = add_storage<audio_clip>();
101 storage.load_from_file = asset_reader::load_from_file<audio_clip>;
102 storage.load_from_instance = asset_reader::load_from_instance<audio_clip>;
103 }
104
105 {
106 auto& storage = add_storage<font>();
107 storage.load_from_file = asset_reader::load_from_file<font>;
108 storage.load_from_instance = asset_reader::load_from_instance<font>;
109 }
110
111 {
112 auto& storage = add_storage<script>();
113 storage.load_from_file = asset_reader::load_from_file<script>;
114 storage.load_from_instance = asset_reader::load_from_instance<script>;
115 }
116
117 return true;
118}
119
121{
122 APPLOG_TRACE("{}::{}", hpp::type_name_str(*this), __func__);
123
124 storages_.clear();
125 databases_.clear();
126 deinit_fonts();
127
128 return true;
129}
130
132{
133 for(auto& pair : storages_)
134 {
135 auto& storage = pair.second;
136 storage->unload_all(pool_);
137 }
138
139 {
140 std::lock_guard<std::mutex> lock(db_mutex_);
141 databases_.clear();
142 }
143}
144
145void asset_manager::unload_group(const std::string& group)
146{
147 for(auto& pair : storages_)
148 {
149 auto& storage = pair.second;
150 storage->unload_group(pool_, group);
151 }
152
153 {
154 remove_database(group);
155 }
156}
157
158auto asset_manager::get_database(const std::string& key) -> asset_database&
159{
160 auto protocol = fs::extract_protocol(fs::path(key));
161 return databases_[protocol.generic_string()];
162}
163
164void asset_manager::remove_database(const std::string& key)
165{
166 auto protocol = fs::extract_protocol(fs::path(key));
167
168 std::lock_guard<std::mutex> lock(db_mutex_);
169 databases_.erase(protocol.generic_string());
170}
171
172auto asset_manager::load_database(const std::string& protocol) -> bool
173{
174 auto assets_pack = fs::resolve_protocol(protocol + "assets.pack");
175
176 std::lock_guard<std::mutex> lock(db_mutex_);
177 auto& db = get_database(protocol);
178 return load_from_file(assets_pack.string(), db);
179}
180
181void asset_manager::save_database(const std::string& protocol, const fs::path& path)
182{
183 std::lock_guard<std::mutex> lock(db_mutex_);
184 auto& db = get_database(protocol);
185 save_to_file(path.string(), db);
186}
187
188auto asset_manager::add_asset(const std::string& key) -> hpp::uuid
189{
190 auto meta = generate_metadata(key);
191 return add_asset_info_for_key(key, meta, false);
192}
193
194auto asset_manager::add_asset_info_for_path(const fs::path& path, const asset_meta& meta, bool override) -> hpp::uuid
195{
196 auto key = fs::convert_to_protocol(path).generic_string();
197 return add_asset_info_for_key(key, meta, override);
198}
199
200auto asset_manager::add_asset_info_for_key(const std::string& key, const asset_meta& meta, bool override) -> hpp::uuid
201{
202 std::lock_guard<std::mutex> lock(db_mutex_);
203 auto& db = get_database(key);
204 return db.add_asset(key, meta, override);
205}
206
207auto asset_manager::get_metadata(const hpp::uuid& uid) const -> asset_database::meta
208{
209 std::lock_guard<std::mutex> lock(db_mutex_);
210 for(auto& kvp : databases_)
211 {
212 auto& db = kvp.second;
213 const auto& meta = db.get_metadata(uid);
214 if(!meta.location.empty())
215 {
216 return meta;
217 }
218 }
219 return {};
220}
221
222auto asset_manager::generate_metadata(const fs::path& p) const -> asset_meta
223{
224 asset_meta meta;
225 meta.type = p.extension().string();
226
227 // embedded assets which must generate uid based on their name.
228 if(meta.type.empty())
229 {
230 meta.uid = generate_uuid(p.generic_string());
231 }
232 else
233 {
234 meta.uid = generate_uuid();
235 }
236
237 return meta;
238}
239
241{
242 auto key = fs::convert_to_protocol(path).generic_string();
244}
245
247{
248 std::lock_guard<std::mutex> lock(db_mutex_);
249 auto& db = get_database(key);
250 db.remove_asset(key);
251}
252
253} // namespace unravel
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_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 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.
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(...)
Definition logging.h:17
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< font >(tpp::thread_pool &pool, asset_handle< font > &output, const std::string &key) -> bool
auto load_from_file< gfx::texture >(tpp::thread_pool &pool, asset_handle< gfx::texture > &output, const std::string &key) -> bool
auto load_from_file< scene_prefab >(tpp::thread_pool &pool, asset_handle< scene_prefab > &output, const std::string &key) -> bool
auto load_from_file< style_sheet >(tpp::thread_pool &pool, asset_handle< style_sheet > &output, const std::string &key) -> bool
auto load_from_file< mesh >(tpp::thread_pool &pool, asset_handle< mesh > &output, const std::string &key) -> bool
auto load_from_file< material >(tpp::thread_pool &pool, asset_handle< material > &output, const std::string &key) -> bool
auto load_from_file< gfx::shader >(tpp::thread_pool &pool, asset_handle< gfx::shader > &output, const std::string &key) -> bool
auto load_from_file< physics_material >(tpp::thread_pool &pool, asset_handle< physics_material > &output, const std::string &key) -> bool
auto load_from_file< ui_tree >(tpp::thread_pool &pool, asset_handle< ui_tree > &output, const std::string &key) -> bool
auto load_from_file< prefab >(tpp::thread_pool &pool, asset_handle< prefab > &output, const std::string &key) -> bool
auto load_from_file< script >(tpp::thread_pool &pool, asset_handle< script > &output, const std::string &key) -> bool
auto load_from_file< audio_clip >(tpp::thread_pool &pool, asset_handle< audio_clip > &output, const std::string &key) -> bool
auto load_from_instance(tpp::thread_pool &pool, asset_handle< T > &output, std::shared_ptr< T > instance) -> bool
auto load_from_file< animation_clip >(tpp::thread_pool &pool, asset_handle< animation_clip > &output, const std::string &key) -> bool
auto generate_uuid() -> hpp::uuid
Definition uuid.cpp:25
void init_fonts()
Definition font.cpp:813
void deinit_fonts()
Definition font.cpp:818
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)
Metadata information for an asset including its location.
Metadata for an asset, including its UUID and type.
std::string type
Type of the asset.
hpp::uuid uid
Unique identifier for the asset.