Unravel Engine C++ Reference
Loading...
Searching...
No Matches
mesh.cpp
Go to the documentation of this file.
1#include "mesh.hpp"
2
7
8#include <fstream>
12
15
16namespace bgfx
17{
18SAVE(VertexLayout)
19{
20 try_save(ar, ser20::make_nvp("hash", obj.m_hash));
21 try_save(ar, ser20::make_nvp("stride", obj.m_stride));
22 try_save(ar, ser20::make_nvp("offset", obj.m_offset));
23 try_save(ar, ser20::make_nvp("attributes", obj.m_attributes));
24}
27
28LOAD(VertexLayout)
29{
30 try_load(ar, ser20::make_nvp("hash", obj.m_hash));
31 try_load(ar, ser20::make_nvp("stride", obj.m_stride));
32 try_load(ar, ser20::make_nvp("offset", obj.m_offset));
33 try_load(ar, ser20::make_nvp("attributes", obj.m_attributes));
34}
37
38} // namespace bgfx
39
40namespace unravel
41{
43{
44 entt::meta_factory<mesh::info::lod_info>{}
45 .type("lod_info"_hs)
47 entt::attribute{"name", "lod_info"},
48 })
49 .data<nullptr, &mesh::info::lod_info::triangles>("triangles"_hs)
51 entt::attribute{"name", "triangles"},
52 entt::attribute{"pretty_name", "Triangles"},
53 entt::attribute{"tooltip", "Number of triangles in this LOD."},
54 })
55 .data<nullptr, &mesh::info::lod_info::percent>("percent"_hs)
57 entt::attribute{"name", "percent"},
58 entt::attribute{"pretty_name", "Percent"},
59 entt::attribute{"tooltip", "Percentage of triangles in this LOD."},
60 });
61}
62
64{
65 entt::meta_factory<mesh::info>{}
66 .type("info"_hs)
68 entt::attribute{"name", "info"},
69 })
70 .data<nullptr, &mesh::info::vertices>("vertices"_hs)
72 entt::attribute{"name", "vertices"},
73 entt::attribute{"pretty_name", "Vertices"},
74 entt::attribute{"tooltip", "Vertices count."},
75 })
76 .data<nullptr, &mesh::info::triangles>("triangles"_hs)
78 entt::attribute{"name", "triangles"},
79 entt::attribute{"pretty_name", "Triangles"},
80 entt::attribute{"tooltip", "Triangles count."},
81 })
82 .data<nullptr, &mesh::info::submeshes>("submeshes"_hs)
84 entt::attribute{"name", "submeshes"},
85 entt::attribute{"pretty_name", "Submeshes"},
86 entt::attribute{"tooltip", "submeshes count."},
87 })
88 .data<nullptr, &mesh::info::data_groups>("data_groups"_hs)
90 entt::attribute{"name", "data_groups"},
91 entt::attribute{"pretty_name", "Material Groups"},
92 entt::attribute{"tooltip", "Materials count."},
93 })
94 .data<nullptr, &mesh::info::lods>("lods"_hs)
96 entt::attribute{"name", "lods"},
97 entt::attribute{"pretty_name", "LODs"},
98 entt::attribute{"tooltip", "Information about each LOD level."},
99 });
100}
101
103{
104 entt::meta_factory<mesh>{}
105 .type("mesh"_hs)
107 entt::attribute{"name", "mesh"},
108 })
109 .data<nullptr, &mesh::get_info>("info"_hs)
111 entt::attribute{"name", "info"},
112 entt::attribute{"pretty_name", "Info"},
113 entt::attribute{"tooltip", "Info about the mesh."},
114 })
115 .data<nullptr, &mesh::get_imported_materials>("imported_materials"_hs)
117 entt::attribute{"name", "imported_materials"},
118 entt::attribute{"pretty_name", "Imported Materials"},
119 entt::attribute{"tooltip", "Imported materials."},
120 });
121}
123{
124 try_save(ar, ser20::make_nvp("data_group_id", obj.data_group_id));
125 try_save(ar, ser20::make_nvp("vertex_start", obj.vertex_start));
126 try_save(ar, ser20::make_nvp("vertex_count", obj.vertex_count));
127 try_save(ar, ser20::make_nvp("face_start", obj.face_start));
128 try_save(ar, ser20::make_nvp("face_count", obj.face_count));
129 try_save(ar, ser20::make_nvp("bbox", obj.bbox));
130 try_save(ar, ser20::make_nvp("skinned", obj.skinned));
131 try_save(ar, ser20::make_nvp("stable_id", obj.stable_id));
132}
135
137{
138 try_load(ar, ser20::make_nvp("data_group_id", obj.data_group_id));
139 try_load(ar, ser20::make_nvp("vertex_start", obj.vertex_start));
140 try_load(ar, ser20::make_nvp("vertex_count", obj.vertex_count));
141 try_load(ar, ser20::make_nvp("face_start", obj.face_start));
142 try_load(ar, ser20::make_nvp("face_count", obj.face_count));
143 try_load(ar, ser20::make_nvp("bbox", obj.bbox));
144 try_load(ar, ser20::make_nvp("skinned", obj.skinned));
145 try_load(ar, ser20::make_nvp("stable_id", obj.stable_id));
146}
149
151{
152 try_save(ar, ser20::make_nvp("data_group_id", obj.data_group_id));
153 try_save(ar, ser20::make_nvp("indices", obj.indices));
154 try_save(ar, ser20::make_nvp("flags", obj.flags));
155}
158
160{
161 try_load(ar, ser20::make_nvp("data_group_id", obj.data_group_id));
162 try_load(ar, ser20::make_nvp("indices", obj.indices));
163 try_load(ar, ser20::make_nvp("flags", obj.flags));
164}
167
169{
170 try_save(ar, ser20::make_nvp("vertex_index", obj.vertex_index));
171 try_save(ar, ser20::make_nvp("weight", obj.weight));
172}
175
177{
178 try_load(ar, ser20::make_nvp("vertex_index", obj.vertex_index));
179 try_load(ar, ser20::make_nvp("weight", obj.weight));
180}
183
185{
186 try_save(ar, ser20::make_nvp("bone_id", obj.bone_id));
187 try_save(ar, ser20::make_nvp("bind_pose_transform", obj.bind_pose_transform));
188 try_save(ar, ser20::make_nvp("influences", obj.influences));
189 try_save(ar, ser20::make_nvp("bounds", obj.bounds));
190}
193
195{
196 try_load(ar, ser20::make_nvp("bone_id", obj.bone_id));
197 try_load(ar, ser20::make_nvp("bind_pose_transform", obj.bind_pose_transform));
198 try_load(ar, ser20::make_nvp("influences", obj.influences));
199 try_load(ar, ser20::make_nvp("bounds", obj.bounds));
200}
203
205{
206 try_save(ar, ser20::make_nvp("bones", obj.get_bones()));
207}
210
212{
213 try_load(ar, ser20::make_nvp("bones", obj.get_bones()));
214}
217
219{
220 try_save(ar, ser20::make_nvp("name", obj.name));
221 try_save(ar, ser20::make_nvp("local_transform", obj.local_transform));
222 try_save(ar, ser20::make_nvp("children", obj.children));
223 try_save(ar, ser20::make_nvp("submeshes", obj.submeshes));
224 try_save(ar, ser20::make_nvp("index", obj.index));
225}
228
230{
231 try_load(ar, ser20::make_nvp("name", obj.name));
232 try_load(ar, ser20::make_nvp("local_transform", obj.local_transform));
233 try_load(ar, ser20::make_nvp("children", obj.children));
234 try_load(ar, ser20::make_nvp("submeshes", obj.submeshes));
235 try_load(ar, ser20::make_nvp("index", obj.index));
236}
239
241{
242 try_save(ar, ser20::make_nvp("index_data", obj.index_data));
243 try_save(ar, ser20::make_nvp("face_count", obj.face_count));
244 try_save(ar, ser20::make_nvp("submeshes", obj.submeshes));
245 try_save(ar, ser20::make_nvp("simplification_error", obj.simplification_error));
246}
249
251{
252 try_load(ar, ser20::make_nvp("index_data", obj.index_data));
253 try_load(ar, ser20::make_nvp("face_count", obj.face_count));
254 try_load(ar, ser20::make_nvp("submeshes", obj.submeshes));
255 try_load(ar, ser20::make_nvp("simplification_error", obj.simplification_error));
256}
259
261{
262 try_save(ar, ser20::make_nvp("vertex_format", obj.vertex_format));
263 try_save(ar, ser20::make_nvp("vertex_count", obj.vertex_count));
264 try_save(ar, ser20::make_nvp("vertex_data", obj.vertex_data));
265 try_save(ar, ser20::make_nvp("triangle_count", obj.triangle_count));
266 try_save(ar, ser20::make_nvp("triangle_data", obj.triangle_data));
267 try_save(ar, ser20::make_nvp("material_count", obj.material_count));
268 try_save(ar, ser20::make_nvp("submeshes", obj.submeshes));
269 try_save(ar, ser20::make_nvp("skin_data", obj.skin_data));
270 try_save(ar, ser20::make_nvp("root_node", obj.root_node));
271 try_save(ar, ser20::make_nvp("bbox", obj.bbox));
272 try_save(ar, ser20::make_nvp("skin_is_prepared", obj.skin_is_prepared));
273 try_save(ar, ser20::make_nvp("bone_palette_bones", obj.bone_palette_bones));
274 try_save(ar, ser20::make_nvp("lods", obj.lods));
275 try_save(ar, ser20::make_nvp("default_material_uids", obj.default_material_uids));
276
277 // Changes here should be reflected in ex::get_format_version<mesh>() in asset_extensions.h
278}
281
283{
284 try_load(ar, ser20::make_nvp("vertex_format", obj.vertex_format));
285 try_load(ar, ser20::make_nvp("vertex_count", obj.vertex_count));
286 try_load(ar, ser20::make_nvp("vertex_data", obj.vertex_data));
287 try_load(ar, ser20::make_nvp("triangle_count", obj.triangle_count));
288 try_load(ar, ser20::make_nvp("triangle_data", obj.triangle_data));
289 try_load(ar, ser20::make_nvp("material_count", obj.material_count));
290 try_load(ar, ser20::make_nvp("submeshes", obj.submeshes));
291 try_load(ar, ser20::make_nvp("skin_data", obj.skin_data));
292 try_load(ar, ser20::make_nvp("root_node", obj.root_node));
293 try_load(ar, ser20::make_nvp("bbox", obj.bbox));
294 try_load(ar, ser20::make_nvp("skin_is_prepared", obj.skin_is_prepared));
295 try_load(ar, ser20::make_nvp("bone_palette_bones", obj.bone_palette_bones));
296 try_load(ar, ser20::make_nvp("lods", obj.lods));
297 try_load(ar, ser20::make_nvp("default_material_uids", obj.default_material_uids));
298
299 // Changes here should be reflected in ex::get_format_version<mesh>() in asset_extensions.h
300}
303
304void save_to_file(const std::string& absolute_path, const mesh::load_data& obj)
305{
306 std::ofstream stream(absolute_path);
307 if(stream.good())
308 {
309 auto ar = ser20::create_oarchive_associative(stream);
310 try_save(ar, ser20::make_nvp("mesh", obj));
311 }
312}
313
314void save_to_file_bin(const std::string& absolute_path, const mesh::load_data& obj)
315{
316 std::ofstream stream(absolute_path, std::ios::binary);
317 if(stream.good())
318 {
319 ser20::oarchive_binary_t ar(stream);
320 try_save(ar, ser20::make_nvp("mesh", obj));
321 }
322}
323
324void load_from_file(const std::string& absolute_path, mesh::load_data& obj)
325{
326 fs::file_istream input(absolute_path);
327 if(!input.is_open())
328 {
329 return;
330 }
331
333
334 try_load(ar, ser20::make_nvp("mesh", obj));
335}
336
337void load_from_file_bin(const std::string& absolute_path, mesh::load_data& obj)
338{
339 fs::file_istream input(absolute_path, std::ios::binary);
340 if(!input.is_open())
341 {
342 return;
343 }
345 try_load(ar, ser20::make_nvp("mesh", obj));
346}
347
348} // namespace unravel
stdio-backed input stream. Accepts std::ios open flags (e.g. std::ios::binary) when opening a
Main class representing a 3D mesh with support for different LODs, submeshes, and skinning.
Definition mesh.h:323
Structure describing how a skinned mesh should be bound to any bones that influence its vertices.
Definition mesh.h:53
Definition mesh.cpp:17
attributes::value_type attribute
Definition reflection.h:19
std::map< std::string, meta_any > attributes
Definition reflection.h:18
auto create_oarchive_associative(std::ostream &stream)
BinaryInputArchive iarchive_binary_t
auto create_iarchive_associative(std::istream &stream)
simd::JSONOutputArchive oarchive_associative_t
BinaryOutputArchive oarchive_binary_t
simd::JSONInputArchive iarchive_associative_t
void save_to_file_bin(const std::string &absolute_path, const animation_clip &obj)
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)
void load_from_file_bin(const std::string &absolute_path, animation_clip &obj)
#define REFLECT(cls)
Definition reflection.h:149
#define SAVE_INSTANTIATE(cls, Archive)
#define LOAD(cls)
auto try_save(Archive &ar, ser20::NameValuePair< T > &&t, const hpp::source_location &loc=hpp::source_location::current()) -> bool
#define LOAD_INSTANTIATE(cls, Archive)
#define SAVE(cls)
auto try_load(Archive &ar, ser20::NameValuePair< T > &&t, const hpp::source_location &loc=hpp::source_location::current()) -> bool
< Structure describing LOD level information. Total number of vertices.
Definition mesh.h:356
Struct used for mesh construction.
Definition mesh.h:451
Structure describing a LOD level in load_data (for serialization).
Definition mesh.h:436
Structure describing an individual "piece" of the mesh, often grouped by material,...
Definition mesh.h:330
Structure describing data for a single triangle in the mesh.
Definition mesh.h:379
Describes the vertices that are connected to the referenced bone and how much influence it has on the...
Definition mesh.h:71
Describes how a bone influences a specific vertex.
Definition mesh.h:59