1#ifndef UFBX_UFBX_H_INCLUDED
2#define UFBX_UFBX_H_INCLUDED
6#if defined(UFBX_CONFIG_HEADER)
7 #include UFBX_CONFIG_HEADER
20 #if defined(__STDC_VERSION__)
21 #define UFBX_STDC __STDC_VERSION__
28 #if defined(__cplusplus)
29 #define UFBX_CPP __cplusplus
35#ifndef UFBX_PLATFORM_MSC
36 #if !defined(UFBX_STANDARD_C) && defined(_MSC_VER)
37 #define UFBX_PLATFORM_MSC _MSC_VER
39 #define UFBX_PLATFORM_MSC 0
43#ifndef UFBX_PLATFORM_GNUC
44 #if !defined(UFBX_STANDARD_C) && defined(__GNUC__)
45 #define UFBX_PLATFORM_GNUC __GNUC__
47 #define UFBX_PLATFORM_GNUC 0
53 #if UFBX_CPP >= 201103L || (UFBX_CPP > 0 && UFBX_PLATFORM_MSC >= 1900)
62 #pragma warning(disable: 4061)
63 #pragma warning(disable: 4201)
64 #pragma warning(disable: 4505)
65 #pragma warning(disable: 4820)
66#elif defined(__clang__)
67 #pragma clang diagnostic push
68 #pragma clang diagnostic ignored "-Wpedantic"
69 #pragma clang diagnostic ignored "-Wpadded"
70 #if defined(__cplusplus)
71 #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
72 #pragma clang diagnostic ignored "-Wold-style-cast"
74#elif defined(__GNUC__)
75 #pragma GCC diagnostic push
76 #pragma GCC diagnostic ignored "-Wpedantic"
77 #pragma GCC diagnostic ignored "-Wpadded"
78 #if defined(__cplusplus)
79 #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
80 #pragma GCC diagnostic ignored "-Wold-style-cast"
83 #pragma GCC diagnostic ignored "-Wc90-c99-compat"
84 #pragma GCC diagnostic ignored "-Wc99-c11-compat"
90 #define ufbx_inline static __forceinline
91#elif UFBX_PLATFORM_GNUC
92 #define ufbx_inline static inline __attribute__((always_inline, unused))
94 #define ufbx_inline static
102 #if defined(UFBX_NO_ASSERT)
103 #define ufbx_assert(cond) (void)0
106 #define ufbx_assert(cond) assert(cond)
124 #if defined(UFBX_STATIC)
125 #define ufbx_abi static
134 #if defined(UFBX_STATIC)
135 #define ufbx_abi_data static
137 #define ufbx_abi_data extern
143#ifndef ufbx_abi_data_definition
144 #if defined(UFBX_STATIC)
145 #define ufbx_abi_data_def static
147 #define ufbx_abi_data_def
153#ifndef UFBX_REAL_TYPE
154 #if defined(UFBX_REAL_IS_FLOAT)
155 #define UFBX_REAL_TYPE float
157 #define UFBX_REAL_TYPE double
162#define UFBX_ERROR_STACK_MAX_DEPTH 8
163#define UFBX_PANIC_MESSAGE_LENGTH 128
164#define UFBX_ERROR_INFO_LENGTH 256
169#define UFBX_THREAD_GROUP_COUNT 4
177template <
typename T,
typename U>
178struct ufbxi_type_is { };
181struct ufbxi_type_is<T, T> {
using type = int; };
184struct ufbx_converter { };
186#define UFBX_CONVERSION_IMPL(p_name) \
187 template <typename T, typename S=typename ufbxi_type_is<T, decltype(ufbx_converter<T>::from(*(const p_name*)nullptr))>::type> \
188 operator T() const { return ufbx_converter<T>::from(*this); }
190#define UFBX_CONVERSION_TO_IMPL(p_name) \
191 template <typename T, typename S=typename ufbxi_type_is<p_name, decltype(ufbx_converter<T>::to(*(const T*)nullptr))>::type> \
192 p_name(const T &t) { *this = ufbx_converter<T>::to(t); }
194#define UFBX_CONVERSION_LIST_IMPL(p_name) \
195 template <typename T, typename S=typename ufbxi_type_is<T, decltype(ufbx_converter<T>::from_list((p_name*)nullptr, (size_t)0))>::type> \
196 operator T() const { return ufbx_converter<T>::from_list(data, count); }
200#define UFBX_CONVERSION_IMPL(p_name)
201#define UFBX_CONVERSION_TO_IMPL(p_name)
202#define UFBX_CONVERSION_LIST_IMPL(p_name)
206#if defined(__cplusplus)
207 #define UFBX_LIST_TYPE(p_name, p_type) struct p_name { p_type *data; size_t count; \
208 p_type &operator[](size_t index) const { ufbx_assert(index < count); return data[index]; } \
209 p_type *begin() const { return data; } \
210 p_type *end() const { return data + count; } \
211 UFBX_CONVERSION_LIST_IMPL(p_type) \
214 #define UFBX_LIST_TYPE(p_name, p_type) typedef struct p_name { p_type *data; size_t count; } p_name
220#if (UFBX_STDC >= 202311L || UFBX_CPP11) && defined(UFBX_USE_EXPLICIT_ENUM)
221 #define UFBX_ENUM_REPR : int
222 #define UFBX_ENUM_FORCE_WIDTH(p_prefix)
223 #define UFBX_FLAG_REPR : int
224 #define UFBX_FLAG_FORCE_WIDTH(p_prefix)
225 #define UFBX_HAS_FORCE_32BIT 0
227 #define UFBX_ENUM_REPR
228 #define UFBX_ENUM_FORCE_WIDTH(p_prefix) p_prefix##_FORCE_32BIT = 0x7fffffff
229 #define UFBX_FLAG_REPR
230 #define UFBX_FLAG_FORCE_WIDTH(p_prefix) p_prefix##_FORCE_32BIT = 0x7fffffff
231 #define UFBX_HAS_FORCE_32BIT 1
234#define UFBX_ENUM_TYPE(p_name, p_prefix, p_last) \
235 enum { p_prefix##_COUNT = p_last + 1 }
238 #define UFBX_VERTEX_ATTRIB_IMPL(p_type) \
239 p_type &operator[](size_t index) const { ufbx_assert(index < indices.count); return values.data[indices.data[index]]; }
241 #define UFBX_VERTEX_ATTRIB_IMPL(p_type)
245 #define UFBX_CALLBACK_IMPL(p_name, p_fn, p_return, p_params, p_args) \
246 template <typename F> static p_return _cpp_adapter p_params { F &f = *static_cast<F*>(user); return f p_args; } \
247 p_name() = default; \
248 p_name(p_fn *f) : fn(f), user(nullptr) { } \
249 template <typename F> p_name(F *f) : fn(&_cpp_adapter<F>), user(static_cast<void*>(f)) { }
251 #define UFBX_CALLBACK_IMPL(p_name, p_fn, p_return, p_params, p_args)
259#define ufbx_pack_version(major, minor, patch) ((uint32_t)(major)*1000000u + (uint32_t)(minor)*1000u + (uint32_t)(patch))
260#define ufbx_version_major(version) ((uint32_t)(version)/1000000u%1000u)
261#define ufbx_version_minor(version) ((uint32_t)(version)/1000u%1000u)
262#define ufbx_version_patch(version) ((uint32_t)(version)%1000u)
269#define UFBX_HEADER_VERSION ufbx_pack_version(0, 14, 3)
270#define UFBX_VERSION UFBX_HEADER_VERSION
278typedef UFBX_REAL_TYPE ufbx_real;
299 struct { ufbx_real x, y; };
309 struct { ufbx_real x, y, z; };
319 struct { ufbx_real x, y, z, w; };
329 struct { ufbx_real x, y, z, w; };
340typedef enum ufbx_rotation_order UFBX_ENUM_REPR {
341 UFBX_ROTATION_ORDER_XYZ,
342 UFBX_ROTATION_ORDER_XZY,
343 UFBX_ROTATION_ORDER_YZX,
344 UFBX_ROTATION_ORDER_YXZ,
345 UFBX_ROTATION_ORDER_ZXY,
346 UFBX_ROTATION_ORDER_ZYX,
347 UFBX_ROTATION_ORDER_SPHERIC,
349 UFBX_ENUM_FORCE_WIDTH(UFBX_ROTATION_ORDER)
350} ufbx_rotation_order;
352UFBX_ENUM_TYPE(ufbx_rotation_order, UFBX_ROTATION_ORDER, UFBX_ROTATION_ORDER_SPHERIC);
369 ufbx_real m00, m10, m20;
370 ufbx_real m01, m11, m21;
371 ufbx_real m02, m12, m22;
372 ufbx_real m03, m13, m23;
386UFBX_LIST_TYPE(ufbx_bool_list,
bool);
387UFBX_LIST_TYPE(ufbx_uint32_list, uint32_t);
388UFBX_LIST_TYPE(ufbx_real_list, ufbx_real);
389UFBX_LIST_TYPE(ufbx_vec2_list,
ufbx_vec2);
390UFBX_LIST_TYPE(ufbx_vec3_list,
ufbx_vec3);
391UFBX_LIST_TYPE(ufbx_vec4_list,
ufbx_vec4);
395#define UFBX_NO_INDEX ((uint32_t)~0u)
399typedef enum ufbx_dom_value_type UFBX_ENUM_REPR {
400 UFBX_DOM_VALUE_NUMBER,
401 UFBX_DOM_VALUE_STRING,
402 UFBX_DOM_VALUE_ARRAY_I8,
403 UFBX_DOM_VALUE_ARRAY_I32,
404 UFBX_DOM_VALUE_ARRAY_I64,
405 UFBX_DOM_VALUE_ARRAY_F32,
406 UFBX_DOM_VALUE_ARRAY_F64,
407 UFBX_DOM_VALUE_ARRAY_RAW_STRING,
408 UFBX_DOM_VALUE_ARRAY_IGNORED,
410 UFBX_ENUM_FORCE_WIDTH(UFBX_DOM_VALUE_TYPE)
411} ufbx_dom_value_type;
413UFBX_ENUM_TYPE(ufbx_dom_value_type, UFBX_DOM_VALUE_TYPE, UFBX_DOM_VALUE_ARRAY_IGNORED);
418 ufbx_dom_value_type type;
430 ufbx_dom_node_list children;
431 ufbx_dom_value_list values;
449typedef enum ufbx_prop_type UFBX_ENUM_REPR {
456 UFBX_PROP_COLOR_WITH_ALPHA,
459 UFBX_PROP_TRANSLATION,
467 UFBX_ENUM_FORCE_WIDTH(UFBX_PROP_TYPE)
470UFBX_ENUM_TYPE(ufbx_prop_type, UFBX_PROP_TYPE, UFBX_PROP_REFERENCE);
473typedef enum ufbx_prop_flags UFBX_FLAG_REPR {
476 UFBX_PROP_FLAG_ANIMATABLE = 0x1,
479 UFBX_PROP_FLAG_USER_DEFINED = 0x2,
482 UFBX_PROP_FLAG_HIDDEN = 0x4,
485 UFBX_PROP_FLAG_LOCK_X = 0x10,
486 UFBX_PROP_FLAG_LOCK_Y = 0x20,
487 UFBX_PROP_FLAG_LOCK_Z = 0x40,
488 UFBX_PROP_FLAG_LOCK_W = 0x80,
491 UFBX_PROP_FLAG_MUTE_X = 0x100,
492 UFBX_PROP_FLAG_MUTE_Y = 0x200,
493 UFBX_PROP_FLAG_MUTE_Z = 0x400,
494 UFBX_PROP_FLAG_MUTE_W = 0x800,
499 UFBX_PROP_FLAG_SYNTHETIC = 0x1000,
502 UFBX_PROP_FLAG_ANIMATED = 0x2000,
505 UFBX_PROP_FLAG_NOT_FOUND = 0x4000,
511 UFBX_PROP_FLAG_CONNECTED = 0x8000,
514 UFBX_PROP_FLAG_NO_VALUE = 0x10000,
518 UFBX_PROP_FLAG_OVERRIDDEN = 0x20000,
523 UFBX_PROP_FLAG_VALUE_REAL = 0x100000,
524 UFBX_PROP_FLAG_VALUE_VEC2 = 0x200000,
525 UFBX_PROP_FLAG_VALUE_VEC3 = 0x400000,
526 UFBX_PROP_FLAG_VALUE_VEC4 = 0x800000,
527 UFBX_PROP_FLAG_VALUE_INT = 0x1000000,
528 UFBX_PROP_FLAG_VALUE_STR = 0x2000000,
529 UFBX_PROP_FLAG_VALUE_BLOB = 0x4000000,
531 UFBX_FLAG_FORCE_WIDTH(UFBX_PROP_FLAGS)
538 uint32_t _internal_key;
541 ufbx_prop_flags flags;
547 ufbx_real value_real_arr[4];
548 ufbx_real value_real;
555UFBX_LIST_TYPE(ufbx_prop_list,
ufbx_prop);
561 ufbx_prop_list props;
645UFBX_LIST_TYPE(ufbx_node_list,
ufbx_node*);
646UFBX_LIST_TYPE(ufbx_mesh_list,
ufbx_mesh*);
649UFBX_LIST_TYPE(ufbx_bone_list,
ufbx_bone*);
684UFBX_LIST_TYPE(ufbx_pose_list,
ufbx_pose*);
687typedef enum ufbx_element_type UFBX_ENUM_REPR {
688 UFBX_ELEMENT_UNKNOWN,
695 UFBX_ELEMENT_LINE_CURVE,
696 UFBX_ELEMENT_NURBS_CURVE,
697 UFBX_ELEMENT_NURBS_SURFACE,
698 UFBX_ELEMENT_NURBS_TRIM_SURFACE,
699 UFBX_ELEMENT_NURBS_TRIM_BOUNDARY,
700 UFBX_ELEMENT_PROCEDURAL_GEOMETRY,
701 UFBX_ELEMENT_STEREO_CAMERA,
702 UFBX_ELEMENT_CAMERA_SWITCHER,
704 UFBX_ELEMENT_LOD_GROUP,
705 UFBX_ELEMENT_SKIN_DEFORMER,
706 UFBX_ELEMENT_SKIN_CLUSTER,
707 UFBX_ELEMENT_BLEND_DEFORMER,
708 UFBX_ELEMENT_BLEND_CHANNEL,
709 UFBX_ELEMENT_BLEND_SHAPE,
710 UFBX_ELEMENT_CACHE_DEFORMER,
711 UFBX_ELEMENT_CACHE_FILE,
712 UFBX_ELEMENT_MATERIAL,
713 UFBX_ELEMENT_TEXTURE,
716 UFBX_ELEMENT_SHADER_BINDING,
717 UFBX_ELEMENT_ANIM_STACK,
718 UFBX_ELEMENT_ANIM_LAYER,
719 UFBX_ELEMENT_ANIM_VALUE,
720 UFBX_ELEMENT_ANIM_CURVE,
721 UFBX_ELEMENT_DISPLAY_LAYER,
722 UFBX_ELEMENT_SELECTION_SET,
723 UFBX_ELEMENT_SELECTION_NODE,
724 UFBX_ELEMENT_CHARACTER,
725 UFBX_ELEMENT_CONSTRAINT,
726 UFBX_ELEMENT_AUDIO_LAYER,
727 UFBX_ELEMENT_AUDIO_CLIP,
729 UFBX_ELEMENT_METADATA_OBJECT,
731 UFBX_ELEMENT_TYPE_FIRST_ATTRIB = UFBX_ELEMENT_MESH,
732 UFBX_ELEMENT_TYPE_LAST_ATTRIB = UFBX_ELEMENT_LOD_GROUP,
734 UFBX_ENUM_FORCE_WIDTH(UFBX_ELEMENT_TYPE)
737UFBX_ENUM_TYPE(ufbx_element_type, UFBX_ELEMENT_TYPE, UFBX_ELEMENT_METADATA_OBJECT);
761 ufbx_node_list instances;
762 ufbx_element_type type;
763 ufbx_connection_list connections_src;
764 ufbx_connection_list connections_dst;
795typedef enum ufbx_inherit_mode UFBX_ENUM_REPR {
799 UFBX_INHERIT_MODE_NORMAL,
807 UFBX_INHERIT_MODE_IGNORE_PARENT_SCALE,
814 UFBX_INHERIT_MODE_COMPONENTWISE_SCALE,
816 UFBX_ENUM_FORCE_WIDTH(UFBX_INHERIT_MODE)
819UFBX_ENUM_TYPE(ufbx_inherit_mode, UFBX_INHERIT_MODE, UFBX_INHERIT_MODE_COMPONENTWISE_SCALE);
822typedef enum ufbx_mirror_axis UFBX_ENUM_REPR {
824 UFBX_MIRROR_AXIS_NONE,
829 UFBX_ENUM_FORCE_WIDTH(UFBX_MIRROR_AXIS)
832UFBX_ENUM_TYPE(ufbx_mirror_axis, UFBX_MIRROR_AXIS, UFBX_MIRROR_AXIS_Z);
854 ufbx_node_list children;
875 ufbx_nullable
ufbx_node *geometry_transform_helper;
882 ufbx_element_type attrib_type;
888 ufbx_element_list all_attribs;
892 ufbx_inherit_mode inherit_mode;
893 ufbx_inherit_mode original_inherit_mode;
906 ufbx_nullable
ufbx_node *inherit_scale_node;
911 ufbx_rotation_order rotation_order;
940 ufbx_real adjust_pre_scale;
942 ufbx_real adjust_post_scale;
943 ufbx_real adjust_translation_scale;
944 ufbx_mirror_axis adjust_mirror_axis;
949 ufbx_material_list materials;
961 bool has_geometry_transform;
966 bool has_adjust_transform;
969 bool has_root_adjust_transform;
973 bool is_geometry_transform_helper;
977 bool is_scale_helper;
980 bool is_scale_compensate_parent;
1002 ufbx_uint32_list indices;
1006 bool unique_per_vertex;
1013 ufbx_real_list values_w;
1019 ufbx_real_list values;
1020 ufbx_uint32_list indices;
1022 bool unique_per_vertex;
1023 ufbx_real_list values_w;
1025 UFBX_VERTEX_ATTRIB_IMPL(ufbx_real)
1031 ufbx_vec2_list values;
1032 ufbx_uint32_list indices;
1034 bool unique_per_vertex;
1035 ufbx_real_list values_w;
1043 ufbx_vec3_list values;
1044 ufbx_uint32_list indices;
1046 bool unique_per_vertex;
1047 ufbx_real_list values_w;
1055 ufbx_vec4_list values;
1056 ufbx_uint32_list indices;
1058 bool unique_per_vertex;
1059 ufbx_real_list values_w;
1090 struct { uint32_t a, b; };
1091 uint32_t indices[2];
1095UFBX_LIST_TYPE(ufbx_edge_list,
ufbx_edge);
1103 uint32_t index_begin;
1104 uint32_t num_indices;
1107UFBX_LIST_TYPE(ufbx_face_list,
ufbx_face);
1117 size_t num_triangles;
1119 size_t num_empty_faces;
1120 size_t num_point_faces;
1121 size_t num_line_faces;
1125 ufbx_uint32_list face_indices;
1139 uint32_t weight_begin;
1140 uint32_t num_weights;
1153 size_t result_memory_used;
1154 size_t temp_memory_used;
1155 size_t result_allocs;
1160 ufbx_subdivision_weight_range_list source_vertex_ranges;
1161 ufbx_subdivision_weight_list source_vertex_weights;
1165 ufbx_subdivision_weight_range_list skin_cluster_ranges;
1166 ufbx_subdivision_weight_list skin_cluster_weights;
1170typedef enum ufbx_subdivision_display_mode UFBX_ENUM_REPR {
1171 UFBX_SUBDIVISION_DISPLAY_DISABLED,
1172 UFBX_SUBDIVISION_DISPLAY_HULL,
1173 UFBX_SUBDIVISION_DISPLAY_HULL_AND_SMOOTH,
1174 UFBX_SUBDIVISION_DISPLAY_SMOOTH,
1176 UFBX_ENUM_FORCE_WIDTH(UFBX_SUBDIVISION_DISPLAY_MODE)
1177} ufbx_subdivision_display_mode;
1179UFBX_ENUM_TYPE(ufbx_subdivision_display_mode, UFBX_SUBDIVISION_DISPLAY_MODE, UFBX_SUBDIVISION_DISPLAY_SMOOTH);
1181typedef enum ufbx_subdivision_boundary UFBX_ENUM_REPR {
1182 UFBX_SUBDIVISION_BOUNDARY_DEFAULT,
1183 UFBX_SUBDIVISION_BOUNDARY_LEGACY,
1185 UFBX_SUBDIVISION_BOUNDARY_SHARP_CORNERS,
1187 UFBX_SUBDIVISION_BOUNDARY_SHARP_NONE,
1189 UFBX_SUBDIVISION_BOUNDARY_SHARP_BOUNDARY,
1191 UFBX_SUBDIVISION_BOUNDARY_SHARP_INTERIOR,
1193 UFBX_ENUM_FORCE_WIDTH(UFBX_SUBDIVISION_BOUNDARY)
1194} ufbx_subdivision_boundary;
1196UFBX_ENUM_TYPE(ufbx_subdivision_boundary, UFBX_SUBDIVISION_BOUNDARY, UFBX_SUBDIVISION_BOUNDARY_SHARP_INTERIOR);
1250 uint32_t element_id;
1252 ufbx_node_list instances;
1257 size_t num_vertices;
1260 size_t num_triangles;
1266 size_t max_face_triangles;
1268 size_t num_empty_faces;
1269 size_t num_point_faces;
1270 size_t num_line_faces;
1273 ufbx_face_list faces;
1274 ufbx_bool_list face_smoothing;
1275 ufbx_uint32_list face_material;
1276 ufbx_uint32_list face_group;
1277 ufbx_bool_list face_hole;
1280 ufbx_edge_list edges;
1281 ufbx_bool_list edge_smoothing;
1282 ufbx_real_list edge_crease;
1283 ufbx_bool_list edge_visibility;
1287 ufbx_uint32_list vertex_indices;
1288 ufbx_vec3_list vertices;
1291 ufbx_uint32_list vertex_first_index;
1309 ufbx_uv_set_list uv_sets;
1310 ufbx_color_set_list color_sets;
1315 ufbx_material_list materials;
1318 ufbx_face_group_list face_groups;
1322 ufbx_mesh_part_list material_parts;
1325 ufbx_mesh_part_list face_group_parts;
1330 ufbx_uint32_list material_part_usage_order;
1336 bool skinned_is_local;
1341 ufbx_skin_deformer_list skin_deformers;
1342 ufbx_blend_deformer_list blend_deformers;
1343 ufbx_cache_deformer_list cache_deformers;
1344 ufbx_element_list all_deformers;
1347 uint32_t subdivision_preview_levels;
1348 uint32_t subdivision_render_levels;
1349 ufbx_subdivision_display_mode subdivision_display_mode;
1350 ufbx_subdivision_boundary subdivision_boundary;
1351 ufbx_subdivision_boundary subdivision_uv_boundary;
1354 bool reversed_winding;
1359 bool generated_normals;
1362 bool subdivision_evaluated;
1366 bool from_tessellated_nurbs;
1370typedef enum ufbx_light_type UFBX_ENUM_REPR {
1375 UFBX_LIGHT_DIRECTIONAL,
1386 UFBX_ENUM_FORCE_WIDTH(UFBX_LIGHT_TYPE)
1389UFBX_ENUM_TYPE(ufbx_light_type, UFBX_LIGHT_TYPE, UFBX_LIGHT_VOLUME);
1392typedef enum ufbx_light_decay UFBX_ENUM_REPR {
1393 UFBX_LIGHT_DECAY_NONE,
1394 UFBX_LIGHT_DECAY_LINEAR,
1395 UFBX_LIGHT_DECAY_QUADRATIC,
1396 UFBX_LIGHT_DECAY_CUBIC,
1398 UFBX_ENUM_FORCE_WIDTH(UFBX_LIGHT_DECAY)
1401UFBX_ENUM_TYPE(ufbx_light_decay, UFBX_LIGHT_DECAY, UFBX_LIGHT_DECAY_CUBIC);
1403typedef enum ufbx_light_area_shape UFBX_ENUM_REPR {
1404 UFBX_LIGHT_AREA_SHAPE_RECTANGLE,
1405 UFBX_LIGHT_AREA_SHAPE_SPHERE,
1407 UFBX_ENUM_FORCE_WIDTH(UFBX_LIGHT_AREA_SHAPE)
1408} ufbx_light_area_shape;
1410UFBX_ENUM_TYPE(ufbx_light_area_shape, UFBX_LIGHT_AREA_SHAPE, UFBX_LIGHT_AREA_SHAPE_SPHERE);
1417 uint32_t element_id;
1419 ufbx_node_list instances;
1426 ufbx_real intensity;
1432 ufbx_light_type type;
1433 ufbx_light_decay decay;
1434 ufbx_light_area_shape area_shape;
1435 ufbx_real inner_angle;
1436 ufbx_real outer_angle;
1442typedef enum ufbx_projection_mode UFBX_ENUM_REPR {
1444 UFBX_PROJECTION_MODE_PERSPECTIVE,
1447 UFBX_PROJECTION_MODE_ORTHOGRAPHIC,
1449 UFBX_ENUM_FORCE_WIDTH(UFBX_PROJECTION_MODE)
1450} ufbx_projection_mode;
1452UFBX_ENUM_TYPE(ufbx_projection_mode, UFBX_PROJECTION_MODE, UFBX_PROJECTION_MODE_ORTHOGRAPHIC);
1456typedef enum ufbx_aspect_mode UFBX_ENUM_REPR {
1458 UFBX_ASPECT_MODE_WINDOW_SIZE,
1460 UFBX_ASPECT_MODE_FIXED_RATIO,
1462 UFBX_ASPECT_MODE_FIXED_RESOLUTION,
1464 UFBX_ASPECT_MODE_FIXED_WIDTH,
1466 UFBX_ASPECT_MODE_FIXED_HEIGHT,
1468 UFBX_ENUM_FORCE_WIDTH(UFBX_ASPECT_MODE)
1471UFBX_ENUM_TYPE(ufbx_aspect_mode, UFBX_ASPECT_MODE, UFBX_ASPECT_MODE_FIXED_HEIGHT);
1475typedef enum ufbx_aperture_mode UFBX_ENUM_REPR {
1477 UFBX_APERTURE_MODE_HORIZONTAL_AND_VERTICAL,
1479 UFBX_APERTURE_MODE_HORIZONTAL,
1481 UFBX_APERTURE_MODE_VERTICAL,
1483 UFBX_APERTURE_MODE_FOCAL_LENGTH,
1485 UFBX_ENUM_FORCE_WIDTH(UFBX_APERTURE_MODE)
1486} ufbx_aperture_mode;
1488UFBX_ENUM_TYPE(ufbx_aperture_mode, UFBX_APERTURE_MODE, UFBX_APERTURE_MODE_FOCAL_LENGTH);
1492typedef enum ufbx_gate_fit UFBX_ENUM_REPR {
1496 UFBX_GATE_FIT_VERTICAL,
1498 UFBX_GATE_FIT_HORIZONTAL,
1502 UFBX_GATE_FIT_OVERSCAN,
1505 UFBX_GATE_FIT_STRETCH,
1507 UFBX_ENUM_FORCE_WIDTH(UFBX_GATE_FIT)
1510UFBX_ENUM_TYPE(ufbx_gate_fit, UFBX_GATE_FIT, UFBX_GATE_FIT_STRETCH);
1514typedef enum ufbx_aperture_format UFBX_ENUM_REPR {
1515 UFBX_APERTURE_FORMAT_CUSTOM,
1516 UFBX_APERTURE_FORMAT_16MM_THEATRICAL,
1517 UFBX_APERTURE_FORMAT_SUPER_16MM,
1518 UFBX_APERTURE_FORMAT_35MM_ACADEMY,
1519 UFBX_APERTURE_FORMAT_35MM_TV_PROJECTION,
1520 UFBX_APERTURE_FORMAT_35MM_FULL_APERTURE,
1521 UFBX_APERTURE_FORMAT_35MM_185_PROJECTION,
1522 UFBX_APERTURE_FORMAT_35MM_ANAMORPHIC,
1523 UFBX_APERTURE_FORMAT_70MM_PROJECTION,
1524 UFBX_APERTURE_FORMAT_VISTAVISION,
1525 UFBX_APERTURE_FORMAT_DYNAVISION,
1526 UFBX_APERTURE_FORMAT_IMAX,
1528 UFBX_ENUM_FORCE_WIDTH(UFBX_APERTURE_FORMAT)
1529} ufbx_aperture_format;
1531UFBX_ENUM_TYPE(ufbx_aperture_format, UFBX_APERTURE_FORMAT, UFBX_APERTURE_FORMAT_IMAX);
1533typedef enum ufbx_coordinate_axis UFBX_ENUM_REPR {
1534 UFBX_COORDINATE_AXIS_POSITIVE_X,
1535 UFBX_COORDINATE_AXIS_NEGATIVE_X,
1536 UFBX_COORDINATE_AXIS_POSITIVE_Y,
1537 UFBX_COORDINATE_AXIS_NEGATIVE_Y,
1538 UFBX_COORDINATE_AXIS_POSITIVE_Z,
1539 UFBX_COORDINATE_AXIS_NEGATIVE_Z,
1540 UFBX_COORDINATE_AXIS_UNKNOWN,
1542 UFBX_ENUM_FORCE_WIDTH(UFBX_COORDINATE_AXIS)
1543} ufbx_coordinate_axis;
1545UFBX_ENUM_TYPE(ufbx_coordinate_axis, UFBX_COORDINATE_AXIS, UFBX_COORDINATE_AXIS_UNKNOWN);
1550 ufbx_coordinate_axis right;
1551 ufbx_coordinate_axis up;
1552 ufbx_coordinate_axis front;
1560 uint32_t element_id;
1562 ufbx_node_list instances;
1566 ufbx_projection_mode projection_mode;
1570 bool resolution_is_pixels;
1586 ufbx_real orthographic_extent;
1597 ufbx_real aspect_ratio;
1600 ufbx_real near_plane;
1603 ufbx_real far_plane;
1611 ufbx_aspect_mode aspect_mode;
1612 ufbx_aperture_mode aperture_mode;
1613 ufbx_gate_fit gate_fit;
1614 ufbx_aperture_format aperture_format;
1615 ufbx_real focal_length_mm;
1618 ufbx_real squeeze_ratio;
1627 uint32_t element_id;
1629 ufbx_node_list instances;
1636 ufbx_real relative_length;
1647 uint32_t element_id;
1649 ufbx_node_list instances;
1657 uint32_t index_begin;
1658 uint32_t num_indices;
1667 uint32_t element_id;
1669 ufbx_node_list instances;
1674 ufbx_vec3_list control_points;
1675 ufbx_uint32_list point_indices;
1677 ufbx_line_segment_list segments;
1680 bool from_tessellated_nurbs;
1683typedef enum ufbx_nurbs_topology UFBX_ENUM_REPR {
1685 UFBX_NURBS_TOPOLOGY_OPEN,
1687 UFBX_NURBS_TOPOLOGY_PERIODIC,
1689 UFBX_NURBS_TOPOLOGY_CLOSED,
1691 UFBX_ENUM_FORCE_WIDTH(UFBX_NURBS_TOPOLOGY)
1692} ufbx_nurbs_topology;
1694UFBX_ENUM_TYPE(ufbx_nurbs_topology, UFBX_NURBS_TOPOLOGY, UFBX_NURBS_TOPOLOGY_CLOSED);
1704 ufbx_nurbs_topology topology;
1707 ufbx_real_list knot_vector;
1714 ufbx_real_list spans;
1725 size_t num_wrap_control_points;
1736 uint32_t element_id;
1738 ufbx_node_list instances;
1747 ufbx_vec4_list control_points;
1754 uint32_t element_id;
1756 ufbx_node_list instances;
1764 size_t num_control_points_u;
1765 size_t num_control_points_v;
1771 ufbx_vec4_list control_points;
1774 uint32_t span_subdivision_u;
1775 uint32_t span_subdivision_v;
1789 uint32_t element_id;
1791 ufbx_node_list instances;
1799 uint32_t element_id;
1801 ufbx_node_list instances;
1811 uint32_t element_id;
1813 ufbx_node_list instances;
1821 uint32_t element_id;
1823 ufbx_node_list instances;
1834 uint32_t element_id;
1836 ufbx_node_list instances;
1840typedef enum ufbx_marker_type UFBX_ENUM_REPR {
1841 UFBX_MARKER_UNKNOWN,
1842 UFBX_MARKER_FK_EFFECTOR,
1843 UFBX_MARKER_IK_EFFECTOR,
1845 UFBX_ENUM_FORCE_WIDTH(UFBX_MARKER_TYPE)
1848UFBX_ENUM_TYPE(ufbx_marker_type, UFBX_MARKER_TYPE, UFBX_MARKER_IK_EFFECTOR);
1855 uint32_t element_id;
1857 ufbx_node_list instances;
1861 ufbx_marker_type type;
1865typedef enum ufbx_lod_display UFBX_ENUM_REPR {
1866 UFBX_LOD_DISPLAY_USE_LOD,
1867 UFBX_LOD_DISPLAY_SHOW,
1868 UFBX_LOD_DISPLAY_HIDE,
1870 UFBX_ENUM_FORCE_WIDTH(UFBX_LOD_DISPLAY)
1873UFBX_ENUM_TYPE(ufbx_lod_display, UFBX_LOD_DISPLAY, UFBX_LOD_DISPLAY_HIDE);
1887 ufbx_lod_display display;
1899 uint32_t element_id;
1901 ufbx_node_list instances;
1905 bool relative_distances;
1908 ufbx_lod_level_list lod_levels;
1911 bool ignore_parent_transform;
1915 bool use_distance_limit;
1916 ufbx_real distance_limit_min;
1917 ufbx_real distance_limit_max;
1923typedef enum ufbx_skinning_method UFBX_ENUM_REPR {
1925 UFBX_SKINNING_METHOD_LINEAR,
1927 UFBX_SKINNING_METHOD_RIGID,
1929 UFBX_SKINNING_METHOD_DUAL_QUATERNION,
1933 UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR,
1935 UFBX_ENUM_FORCE_WIDTH(UFBX_SKINNING_METHOD)
1936} ufbx_skinning_method;
1938UFBX_ENUM_TYPE(ufbx_skinning_method, UFBX_SKINNING_METHOD, UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR);
1947 uint32_t weight_begin;
1948 uint32_t num_weights;
1952 ufbx_real dq_weight;
1960 uint32_t cluster_index;
1973 uint32_t element_id;
1977 ufbx_skinning_method skinning_method;
1980 ufbx_skin_cluster_list clusters;
1983 ufbx_skin_vertex_list vertices;
1984 ufbx_skin_weight_list weights;
1987 size_t max_weights_per_vertex;
1992 size_t num_dq_weights;
1993 ufbx_uint32_list dq_vertices;
1994 ufbx_real_list dq_weights;
2002 uint32_t element_id;
2031 ufbx_uint32_list vertices;
2032 ufbx_real_list weights;
2041 uint32_t element_id;
2046 ufbx_blend_channel_list channels;
2055 ufbx_real target_weight;
2058 ufbx_real effective_weight;
2069 uint32_t element_id;
2078 ufbx_blend_keyframe_list keyframes;
2089 uint32_t element_id;
2096 ufbx_uint32_list offset_vertices;
2097 ufbx_vec3_list position_offsets;
2098 ufbx_vec3_list normal_offsets;
2101typedef enum ufbx_cache_file_format UFBX_ENUM_REPR {
2102 UFBX_CACHE_FILE_FORMAT_UNKNOWN,
2103 UFBX_CACHE_FILE_FORMAT_PC2,
2104 UFBX_CACHE_FILE_FORMAT_MC,
2106 UFBX_ENUM_FORCE_WIDTH(UFBX_CACHE_FILE_FORMAT)
2107} ufbx_cache_file_format;
2109UFBX_ENUM_TYPE(ufbx_cache_file_format, UFBX_CACHE_FILE_FORMAT, UFBX_CACHE_FILE_FORMAT_MC);
2111typedef enum ufbx_cache_data_format UFBX_ENUM_REPR {
2112 UFBX_CACHE_DATA_FORMAT_UNKNOWN,
2113 UFBX_CACHE_DATA_FORMAT_REAL_FLOAT,
2114 UFBX_CACHE_DATA_FORMAT_VEC3_FLOAT,
2115 UFBX_CACHE_DATA_FORMAT_REAL_DOUBLE,
2116 UFBX_CACHE_DATA_FORMAT_VEC3_DOUBLE,
2118 UFBX_ENUM_FORCE_WIDTH(UFBX_CACHE_DATA_FORMAT)
2119} ufbx_cache_data_format;
2121UFBX_ENUM_TYPE(ufbx_cache_data_format, UFBX_CACHE_DATA_FORMAT, UFBX_CACHE_DATA_FORMAT_VEC3_DOUBLE);
2123typedef enum ufbx_cache_data_encoding UFBX_ENUM_REPR {
2124 UFBX_CACHE_DATA_ENCODING_UNKNOWN,
2125 UFBX_CACHE_DATA_ENCODING_LITTLE_ENDIAN,
2126 UFBX_CACHE_DATA_ENCODING_BIG_ENDIAN,
2128 UFBX_ENUM_FORCE_WIDTH(UFBX_CACHE_DATA_ENCODING)
2129} ufbx_cache_data_encoding;
2131UFBX_ENUM_TYPE(ufbx_cache_data_encoding, UFBX_CACHE_DATA_ENCODING, UFBX_CACHE_DATA_ENCODING_BIG_ENDIAN);
2134typedef enum ufbx_cache_interpretation UFBX_ENUM_REPR {
2136 UFBX_CACHE_INTERPRETATION_UNKNOWN,
2140 UFBX_CACHE_INTERPRETATION_POINTS,
2143 UFBX_CACHE_INTERPRETATION_VERTEX_POSITION,
2146 UFBX_CACHE_INTERPRETATION_VERTEX_NORMAL,
2148 UFBX_ENUM_FORCE_WIDTH(UFBX_CACHE_INTERPRETATION)
2149} ufbx_cache_interpretation;
2151UFBX_ENUM_TYPE(ufbx_cache_interpretation, UFBX_CACHE_INTERPRETATION, UFBX_CACHE_INTERPRETATION_VERTEX_NORMAL);
2167 ufbx_cache_file_format file_format;
2170 ufbx_mirror_axis mirror_axis;
2173 ufbx_real scale_factor;
2175 ufbx_cache_data_format data_format;
2176 ufbx_cache_data_encoding data_encoding;
2177 uint64_t data_offset;
2178 uint32_t data_count;
2179 uint32_t data_element_bytes;
2180 uint64_t data_total_bytes;
2191 ufbx_cache_interpretation interpretation;
2199 ufbx_cache_frame_list frames;
2202 ufbx_mirror_axis mirror_axis;
2205 ufbx_real scale_factor;
2213 ufbx_cache_channel_list channels;
2214 ufbx_cache_frame_list frames;
2215 ufbx_string_list extra_info;
2222 uint32_t element_id;
2238 uint32_t element_id;
2262 ufbx_cache_file_format format;
2277 ufbx_real value_real;
2295 bool texture_enabled;
2298 bool feature_disabled;
2301 uint8_t value_components;
2330typedef enum ufbx_shader_type UFBX_ENUM_REPR {
2332 UFBX_SHADER_UNKNOWN,
2334 UFBX_SHADER_FBX_LAMBERT,
2336 UFBX_SHADER_FBX_PHONG,
2339 UFBX_SHADER_OSL_STANDARD_SURFACE,
2342 UFBX_SHADER_ARNOLD_STANDARD_SURFACE,
2345 UFBX_SHADER_3DS_MAX_PHYSICAL_MATERIAL,
2348 UFBX_SHADER_3DS_MAX_PBR_METAL_ROUGH,
2351 UFBX_SHADER_3DS_MAX_PBR_SPEC_GLOSS,
2354 UFBX_SHADER_GLTF_MATERIAL,
2357 UFBX_SHADER_SHADERFX_GRAPH,
2361 UFBX_SHADER_BLENDER_PHONG,
2363 UFBX_SHADER_WAVEFRONT_MTL,
2365 UFBX_ENUM_FORCE_WIDTH(UFBX_SHADER_TYPE)
2368UFBX_ENUM_TYPE(ufbx_shader_type, UFBX_SHADER_TYPE, UFBX_SHADER_WAVEFRONT_MTL);
2371typedef enum ufbx_material_fbx_map UFBX_ENUM_REPR {
2372 UFBX_MATERIAL_FBX_DIFFUSE_FACTOR,
2373 UFBX_MATERIAL_FBX_DIFFUSE_COLOR,
2374 UFBX_MATERIAL_FBX_SPECULAR_FACTOR,
2375 UFBX_MATERIAL_FBX_SPECULAR_COLOR,
2376 UFBX_MATERIAL_FBX_SPECULAR_EXPONENT,
2377 UFBX_MATERIAL_FBX_REFLECTION_FACTOR,
2378 UFBX_MATERIAL_FBX_REFLECTION_COLOR,
2379 UFBX_MATERIAL_FBX_TRANSPARENCY_FACTOR,
2380 UFBX_MATERIAL_FBX_TRANSPARENCY_COLOR,
2381 UFBX_MATERIAL_FBX_EMISSION_FACTOR,
2382 UFBX_MATERIAL_FBX_EMISSION_COLOR,
2383 UFBX_MATERIAL_FBX_AMBIENT_FACTOR,
2384 UFBX_MATERIAL_FBX_AMBIENT_COLOR,
2385 UFBX_MATERIAL_FBX_NORMAL_MAP,
2386 UFBX_MATERIAL_FBX_BUMP,
2387 UFBX_MATERIAL_FBX_BUMP_FACTOR,
2388 UFBX_MATERIAL_FBX_DISPLACEMENT_FACTOR,
2389 UFBX_MATERIAL_FBX_DISPLACEMENT,
2390 UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT_FACTOR,
2391 UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT,
2393 UFBX_ENUM_FORCE_WIDTH(UFBX_MATERIAL_FBX_MAP)
2394} ufbx_material_fbx_map;
2396UFBX_ENUM_TYPE(ufbx_material_fbx_map, UFBX_MATERIAL_FBX_MAP, UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT);
2399typedef enum ufbx_material_pbr_map UFBX_ENUM_REPR {
2400 UFBX_MATERIAL_PBR_BASE_FACTOR,
2401 UFBX_MATERIAL_PBR_BASE_COLOR,
2402 UFBX_MATERIAL_PBR_ROUGHNESS,
2403 UFBX_MATERIAL_PBR_METALNESS,
2404 UFBX_MATERIAL_PBR_DIFFUSE_ROUGHNESS,
2405 UFBX_MATERIAL_PBR_SPECULAR_FACTOR,
2406 UFBX_MATERIAL_PBR_SPECULAR_COLOR,
2407 UFBX_MATERIAL_PBR_SPECULAR_IOR,
2408 UFBX_MATERIAL_PBR_SPECULAR_ANISOTROPY,
2409 UFBX_MATERIAL_PBR_SPECULAR_ROTATION,
2410 UFBX_MATERIAL_PBR_TRANSMISSION_FACTOR,
2411 UFBX_MATERIAL_PBR_TRANSMISSION_COLOR,
2412 UFBX_MATERIAL_PBR_TRANSMISSION_DEPTH,
2413 UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER,
2414 UFBX_MATERIAL_PBR_TRANSMISSION_SCATTER_ANISOTROPY,
2415 UFBX_MATERIAL_PBR_TRANSMISSION_DISPERSION,
2416 UFBX_MATERIAL_PBR_TRANSMISSION_ROUGHNESS,
2417 UFBX_MATERIAL_PBR_TRANSMISSION_EXTRA_ROUGHNESS,
2418 UFBX_MATERIAL_PBR_TRANSMISSION_PRIORITY,
2419 UFBX_MATERIAL_PBR_TRANSMISSION_ENABLE_IN_AOV,
2420 UFBX_MATERIAL_PBR_SUBSURFACE_FACTOR,
2421 UFBX_MATERIAL_PBR_SUBSURFACE_COLOR,
2422 UFBX_MATERIAL_PBR_SUBSURFACE_RADIUS,
2423 UFBX_MATERIAL_PBR_SUBSURFACE_SCALE,
2424 UFBX_MATERIAL_PBR_SUBSURFACE_ANISOTROPY,
2425 UFBX_MATERIAL_PBR_SUBSURFACE_TINT_COLOR,
2426 UFBX_MATERIAL_PBR_SUBSURFACE_TYPE,
2427 UFBX_MATERIAL_PBR_SHEEN_FACTOR,
2428 UFBX_MATERIAL_PBR_SHEEN_COLOR,
2429 UFBX_MATERIAL_PBR_SHEEN_ROUGHNESS,
2430 UFBX_MATERIAL_PBR_COAT_FACTOR,
2431 UFBX_MATERIAL_PBR_COAT_COLOR,
2432 UFBX_MATERIAL_PBR_COAT_ROUGHNESS,
2433 UFBX_MATERIAL_PBR_COAT_IOR,
2434 UFBX_MATERIAL_PBR_COAT_ANISOTROPY,
2435 UFBX_MATERIAL_PBR_COAT_ROTATION,
2436 UFBX_MATERIAL_PBR_COAT_NORMAL,
2437 UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_COLOR,
2438 UFBX_MATERIAL_PBR_COAT_AFFECT_BASE_ROUGHNESS,
2439 UFBX_MATERIAL_PBR_THIN_FILM_THICKNESS,
2440 UFBX_MATERIAL_PBR_THIN_FILM_IOR,
2441 UFBX_MATERIAL_PBR_EMISSION_FACTOR,
2442 UFBX_MATERIAL_PBR_EMISSION_COLOR,
2443 UFBX_MATERIAL_PBR_OPACITY,
2444 UFBX_MATERIAL_PBR_INDIRECT_DIFFUSE,
2445 UFBX_MATERIAL_PBR_INDIRECT_SPECULAR,
2446 UFBX_MATERIAL_PBR_NORMAL_MAP,
2447 UFBX_MATERIAL_PBR_TANGENT_MAP,
2448 UFBX_MATERIAL_PBR_DISPLACEMENT_MAP,
2449 UFBX_MATERIAL_PBR_MATTE_FACTOR,
2450 UFBX_MATERIAL_PBR_MATTE_COLOR,
2451 UFBX_MATERIAL_PBR_AMBIENT_OCCLUSION,
2452 UFBX_MATERIAL_PBR_GLOSSINESS,
2453 UFBX_MATERIAL_PBR_COAT_GLOSSINESS,
2454 UFBX_MATERIAL_PBR_TRANSMISSION_GLOSSINESS,
2456 UFBX_ENUM_FORCE_WIDTH(UFBX_MATERIAL_PBR_MAP)
2457} ufbx_material_pbr_map;
2459UFBX_ENUM_TYPE(ufbx_material_pbr_map, UFBX_MATERIAL_PBR_MAP, UFBX_MATERIAL_PBR_TRANSMISSION_GLOSSINESS);
2462typedef enum ufbx_material_feature UFBX_ENUM_REPR {
2463 UFBX_MATERIAL_FEATURE_PBR,
2464 UFBX_MATERIAL_FEATURE_METALNESS,
2465 UFBX_MATERIAL_FEATURE_DIFFUSE,
2466 UFBX_MATERIAL_FEATURE_SPECULAR,
2467 UFBX_MATERIAL_FEATURE_EMISSION,
2468 UFBX_MATERIAL_FEATURE_TRANSMISSION,
2469 UFBX_MATERIAL_FEATURE_COAT,
2470 UFBX_MATERIAL_FEATURE_SHEEN,
2471 UFBX_MATERIAL_FEATURE_OPACITY,
2472 UFBX_MATERIAL_FEATURE_AMBIENT_OCCLUSION,
2473 UFBX_MATERIAL_FEATURE_MATTE,
2474 UFBX_MATERIAL_FEATURE_UNLIT,
2475 UFBX_MATERIAL_FEATURE_IOR,
2476 UFBX_MATERIAL_FEATURE_DIFFUSE_ROUGHNESS,
2477 UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS,
2478 UFBX_MATERIAL_FEATURE_THIN_WALLED,
2479 UFBX_MATERIAL_FEATURE_CAUSTICS,
2480 UFBX_MATERIAL_FEATURE_EXIT_TO_BACKGROUND,
2481 UFBX_MATERIAL_FEATURE_INTERNAL_REFLECTIONS,
2482 UFBX_MATERIAL_FEATURE_DOUBLE_SIDED,
2483 UFBX_MATERIAL_FEATURE_ROUGHNESS_AS_GLOSSINESS,
2484 UFBX_MATERIAL_FEATURE_COAT_ROUGHNESS_AS_GLOSSINESS,
2485 UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS_AS_GLOSSINESS,
2487 UFBX_ENUM_FORCE_WIDTH(UFBX_MATERIAL_FEATURE)
2488} ufbx_material_feature;
2490UFBX_ENUM_TYPE(ufbx_material_feature, UFBX_MATERIAL_FEATURE, UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS_AS_GLOSSINESS);
2620 uint32_t element_id;
2636 ufbx_shader_type shader_type;
2648 ufbx_material_texture_list textures;
2651typedef enum ufbx_texture_type UFBX_ENUM_REPR {
2660 UFBX_TEXTURE_LAYERED,
2663 UFBX_TEXTURE_PROCEDURAL,
2667 UFBX_TEXTURE_SHADER,
2669 UFBX_ENUM_FORCE_WIDTH(UFBX_TEXTURE_TYPE)
2672UFBX_ENUM_TYPE(ufbx_texture_type, UFBX_TEXTURE_TYPE, UFBX_TEXTURE_SHADER);
2678typedef enum ufbx_blend_mode UFBX_ENUM_REPR {
2679 UFBX_BLEND_TRANSLUCENT,
2680 UFBX_BLEND_ADDITIVE,
2681 UFBX_BLEND_MULTIPLY,
2682 UFBX_BLEND_MULTIPLY_2X,
2685 UFBX_BLEND_DISSOLVE,
2687 UFBX_BLEND_COLOR_BURN,
2688 UFBX_BLEND_LINEAR_BURN,
2689 UFBX_BLEND_DARKER_COLOR,
2692 UFBX_BLEND_COLOR_DODGE,
2693 UFBX_BLEND_LINEAR_DODGE,
2694 UFBX_BLEND_LIGHTER_COLOR,
2695 UFBX_BLEND_SOFT_LIGHT,
2696 UFBX_BLEND_HARD_LIGHT,
2697 UFBX_BLEND_VIVID_LIGHT,
2698 UFBX_BLEND_LINEAR_LIGHT,
2699 UFBX_BLEND_PIN_LIGHT,
2700 UFBX_BLEND_HARD_MIX,
2701 UFBX_BLEND_DIFFERENCE,
2702 UFBX_BLEND_EXCLUSION,
2703 UFBX_BLEND_SUBTRACT,
2706 UFBX_BLEND_SATURATION,
2708 UFBX_BLEND_LUMINOSITY,
2711 UFBX_ENUM_FORCE_WIDTH(UFBX_BLEND_MODE)
2714UFBX_ENUM_TYPE(ufbx_blend_mode, UFBX_BLEND_MODE, UFBX_BLEND_OVERLAY);
2717typedef enum ufbx_wrap_mode UFBX_ENUM_REPR {
2721 UFBX_ENUM_FORCE_WIDTH(UFBX_WRAP_MODE)
2724UFBX_ENUM_TYPE(ufbx_wrap_mode, UFBX_WRAP_MODE, UFBX_WRAP_CLAMP);
2729 ufbx_blend_mode blend_mode;
2735typedef enum ufbx_shader_texture_type UFBX_ENUM_REPR {
2736 UFBX_SHADER_TEXTURE_UNKNOWN,
2741 UFBX_SHADER_TEXTURE_SELECT_OUTPUT,
2745 UFBX_SHADER_TEXTURE_OSL,
2747 UFBX_ENUM_FORCE_WIDTH(UFBX_SHADER_TEXTURE_TYPE)
2748} ufbx_shader_texture_type;
2750UFBX_ENUM_TYPE(ufbx_shader_texture_type, UFBX_SHADER_TEXTURE_TYPE, UFBX_SHADER_TEXTURE_OSL);
2760 ufbx_real value_real;
2773 int64_t texture_output_index;
2777 bool texture_enabled;
2786 ufbx_nullable
ufbx_prop *texture_enabled_prop;
2802 ufbx_shader_texture_type type;
2808 uint64_t shader_type_id;
2812 ufbx_shader_texture_input_list inputs;
2824 int64_t main_texture_output_index;
2872 uint32_t element_id;
2877 ufbx_texture_type type;
2908 uint32_t file_index;
2914 ufbx_texture_layer_list layers;
2923 ufbx_texture_list file_textures;
2929 ufbx_wrap_mode wrap_u;
2930 ufbx_wrap_mode wrap_v;
2933 bool has_uv_transform;
2944 uint32_t element_id;
2980 uint32_t element_id;
2985 ufbx_shader_type type;
2991 ufbx_shader_binding_list bindings;
3007 uint32_t element_id;
3011 ufbx_shader_prop_binding_list prop_bindings;
3017 uint32_t element_id;
3019 uint32_t _internal_key;
3049 ufbx_anim_layer_list layers;
3052 ufbx_real_list override_layer_weights;
3055 ufbx_prop_override_list prop_overrides;
3058 ufbx_transform_override_list transform_overrides;
3061 bool ignore_connections;
3072 uint32_t element_id;
3079 ufbx_anim_layer_list layers;
3086 uint32_t _internal_key;
3098 uint32_t element_id;
3103 bool weight_is_animated;
3106 bool compose_rotation;
3109 ufbx_anim_value_list anim_values;
3110 ufbx_anim_prop_list anim_props;
3114 uint32_t _min_element_id;
3115 uint32_t _max_element_id;
3116 uint32_t _element_id_bitmask[4];
3123 uint32_t element_id;
3132typedef enum ufbx_interpolation UFBX_ENUM_REPR {
3133 UFBX_INTERPOLATION_CONSTANT_PREV,
3134 UFBX_INTERPOLATION_CONSTANT_NEXT,
3135 UFBX_INTERPOLATION_LINEAR,
3136 UFBX_INTERPOLATION_CUBIC,
3138 UFBX_ENUM_FORCE_WIDTH(UFBX_INTERPOLATION)
3139} ufbx_interpolation;
3141UFBX_ENUM_TYPE(ufbx_interpolation, UFBX_INTERPOLATION, UFBX_INTERPOLATION_CUBIC);
3164 ufbx_interpolation interpolation;
3175 uint32_t element_id;
3179 ufbx_keyframe_list keyframes;
3181 ufbx_real min_value;
3182 ufbx_real max_value;
3192 uint32_t element_id;
3197 ufbx_node_list nodes;
3211 uint32_t element_id;
3216 ufbx_selection_node_list nodes;
3224 uint32_t element_id;
3236 ufbx_uint32_list vertices;
3237 ufbx_uint32_list edges;
3238 ufbx_uint32_list faces;
3247 uint32_t element_id;
3253typedef enum ufbx_constraint_type UFBX_ENUM_REPR {
3254 UFBX_CONSTRAINT_UNKNOWN,
3255 UFBX_CONSTRAINT_AIM,
3256 UFBX_CONSTRAINT_PARENT,
3257 UFBX_CONSTRAINT_POSITION,
3258 UFBX_CONSTRAINT_ROTATION,
3259 UFBX_CONSTRAINT_SCALE,
3262 UFBX_CONSTRAINT_SINGLE_CHAIN_IK,
3264 UFBX_ENUM_FORCE_WIDTH(UFBX_CONSTRAINT_TYPE)
3265} ufbx_constraint_type;
3267UFBX_ENUM_TYPE(ufbx_constraint_type, UFBX_CONSTRAINT_TYPE, UFBX_CONSTRAINT_SINGLE_CHAIN_IK);
3279typedef enum ufbx_constraint_aim_up_type UFBX_ENUM_REPR {
3280 UFBX_CONSTRAINT_AIM_UP_SCENE,
3281 UFBX_CONSTRAINT_AIM_UP_TO_NODE,
3282 UFBX_CONSTRAINT_AIM_UP_ALIGN_NODE,
3283 UFBX_CONSTRAINT_AIM_UP_VECTOR,
3284 UFBX_CONSTRAINT_AIM_UP_NONE,
3286 UFBX_ENUM_FORCE_WIDTH(UFBX_CONSTRAINT_AIM_UP_TYPE)
3287} ufbx_constraint_aim_up_type;
3289UFBX_ENUM_TYPE(ufbx_constraint_aim_up_type, UFBX_CONSTRAINT_AIM_UP_TYPE, UFBX_CONSTRAINT_AIM_UP_NONE);
3292typedef enum ufbx_constraint_ik_pole_type UFBX_ENUM_REPR {
3293 UFBX_CONSTRAINT_IK_POLE_VECTOR,
3294 UFBX_CONSTRAINT_IK_POLE_NODE,
3296 UFBX_ENUM_FORCE_WIDTH(UFBX_CONSTRAINT_IK_POLE_TYPE)
3297} ufbx_constraint_ik_pole_type;
3299UFBX_ENUM_TYPE(ufbx_constraint_ik_pole_type, UFBX_CONSTRAINT_IK_POLE_TYPE, UFBX_CONSTRAINT_IK_POLE_NODE);
3305 uint32_t element_id;
3310 ufbx_constraint_type type;
3317 ufbx_constraint_target_list targets;
3324 bool constrain_translation[3];
3325 bool constrain_rotation[3];
3326 bool constrain_scale[3];
3333 ufbx_constraint_aim_up_type aim_up_type;
3349 uint32_t element_id;
3354 ufbx_audio_clip_list clips;
3361 uint32_t element_id;
3412 uint32_t element_id;
3421 ufbx_bone_pose_list bone_poses;
3428 uint32_t element_id;
3437 ufbx_element_type type;
3439 uint32_t _internal_key;
3450typedef enum ufbx_exporter UFBX_ENUM_REPR {
3451 UFBX_EXPORTER_UNKNOWN,
3452 UFBX_EXPORTER_FBX_SDK,
3453 UFBX_EXPORTER_BLENDER_BINARY,
3454 UFBX_EXPORTER_BLENDER_ASCII,
3455 UFBX_EXPORTER_MOTION_BUILDER,
3457 UFBX_ENUM_FORCE_WIDTH(UFBX_EXPORTER)
3460UFBX_ENUM_TYPE(ufbx_exporter, UFBX_EXPORTER, UFBX_EXPORTER_MOTION_BUILDER);
3468typedef enum ufbx_file_format UFBX_ENUM_REPR {
3469 UFBX_FILE_FORMAT_UNKNOWN,
3470 UFBX_FILE_FORMAT_FBX,
3471 UFBX_FILE_FORMAT_OBJ,
3472 UFBX_FILE_FORMAT_MTL,
3474 UFBX_ENUM_FORCE_WIDTH(UFBX_FILE_FORMAT)
3477UFBX_ENUM_TYPE(ufbx_file_format, UFBX_FILE_FORMAT, UFBX_FILE_FORMAT_MTL);
3479typedef enum ufbx_warning_type UFBX_ENUM_REPR {
3482 UFBX_WARNING_MISSING_EXTERNAL_FILE,
3486 UFBX_WARNING_IMPLICIT_MTL,
3489 UFBX_WARNING_TRUNCATED_ARRAY,
3492 UFBX_WARNING_MISSING_GEOMETRY_DATA,
3495 UFBX_WARNING_DUPLICATE_CONNECTION,
3498 UFBX_WARNING_BAD_VERTEX_W_ATTRIBUTE,
3501 UFBX_WARNING_MISSING_POLYGON_MAPPING,
3505 UFBX_WARNING_INDEX_CLAMPED,
3509 UFBX_WARNING_BAD_UNICODE,
3512 UFBX_WARNING_BAD_ELEMENT_CONNECTED_TO_ROOT,
3515 UFBX_WARNING_DUPLICATE_OBJECT_ID,
3519 UFBX_WARNING_EMPTY_FACE_REMOVED,
3522 UFBX_WARNING_UNKNOWN_OBJ_DIRECTIVE,
3526 UFBX_WARNING_TYPE_FIRST_DEDUPLICATED = UFBX_WARNING_INDEX_CLAMPED,
3528 UFBX_ENUM_FORCE_WIDTH(UFBX_WARNING_TYPE)
3531UFBX_ENUM_TYPE(ufbx_warning_type, UFBX_WARNING_TYPE, UFBX_WARNING_UNKNOWN_OBJ_DIRECTIVE);
3538 ufbx_warning_type type;
3542 uint32_t element_id;
3549typedef enum ufbx_thumbnail_format UFBX_ENUM_REPR {
3550 UFBX_THUMBNAIL_FORMAT_UNKNOWN,
3551 UFBX_THUMBNAIL_FORMAT_RGB_24,
3552 UFBX_THUMBNAIL_FORMAT_RGBA_32,
3554 UFBX_ENUM_FORCE_WIDTH(UFBX_THUMBNAIL_FORMAT)
3555} ufbx_thumbnail_format;
3557UFBX_ENUM_TYPE(ufbx_thumbnail_format, UFBX_THUMBNAIL_FORMAT, UFBX_THUMBNAIL_FORMAT_RGBA_32);
3562typedef enum ufbx_space_conversion UFBX_ENUM_REPR {
3566 UFBX_SPACE_CONVERSION_TRANSFORM_ROOT,
3572 UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS,
3577 UFBX_SPACE_CONVERSION_MODIFY_GEOMETRY,
3579 UFBX_ENUM_FORCE_WIDTH(UFBX_SPACE_CONVERSION)
3580} ufbx_space_conversion;
3582UFBX_ENUM_TYPE(ufbx_space_conversion, UFBX_SPACE_CONVERSION, UFBX_SPACE_CONVERSION_MODIFY_GEOMETRY);
3593 ufbx_thumbnail_format format;
3606 ufbx_warning_list warnings;
3615 ufbx_file_format file_format;
3619 bool may_contain_no_index;
3623 bool may_contain_missing_vertex_position;
3627 bool may_contain_broken_elements;
3635 bool has_warning[UFBX_WARNING_TYPE_COUNT];
3646 ufbx_exporter exporter;
3647 uint32_t exporter_version;
3656 bool geometry_ignored;
3657 bool animation_ignored;
3658 bool embedded_ignored;
3660 size_t max_face_triangles;
3662 size_t result_memory_used;
3663 size_t temp_memory_used;
3664 size_t result_allocs;
3667 size_t element_buffer_size;
3668 size_t num_shader_textures;
3670 ufbx_real bone_prop_size_unit;
3671 bool bone_prop_limb_length_relative;
3673 ufbx_real ortho_size_unit;
3675 int64_t ktime_second;
3681 ufbx_space_conversion space_conversion;
3685 ufbx_real root_scale;
3689 ufbx_mirror_axis mirror_axis;
3693 ufbx_real geometry_scale;
3697typedef enum ufbx_time_mode UFBX_ENUM_REPR {
3698 UFBX_TIME_MODE_DEFAULT,
3699 UFBX_TIME_MODE_120_FPS,
3700 UFBX_TIME_MODE_100_FPS,
3701 UFBX_TIME_MODE_60_FPS,
3702 UFBX_TIME_MODE_50_FPS,
3703 UFBX_TIME_MODE_48_FPS,
3704 UFBX_TIME_MODE_30_FPS,
3705 UFBX_TIME_MODE_30_FPS_DROP,
3706 UFBX_TIME_MODE_NTSC_DROP_FRAME,
3707 UFBX_TIME_MODE_NTSC_FULL_FRAME,
3709 UFBX_TIME_MODE_24_FPS,
3710 UFBX_TIME_MODE_1000_FPS,
3711 UFBX_TIME_MODE_FILM_FULL_FRAME,
3712 UFBX_TIME_MODE_CUSTOM,
3713 UFBX_TIME_MODE_96_FPS,
3714 UFBX_TIME_MODE_72_FPS,
3715 UFBX_TIME_MODE_59_94_FPS,
3717 UFBX_ENUM_FORCE_WIDTH(UFBX_TIME_MODE)
3720UFBX_ENUM_TYPE(ufbx_time_mode, UFBX_TIME_MODE, UFBX_TIME_MODE_59_94_FPS);
3722typedef enum ufbx_time_protocol UFBX_ENUM_REPR {
3723 UFBX_TIME_PROTOCOL_SMPTE,
3724 UFBX_TIME_PROTOCOL_FRAME_COUNT,
3725 UFBX_TIME_PROTOCOL_DEFAULT,
3727 UFBX_ENUM_FORCE_WIDTH(UFBX_TIME_PROTOCOL)
3728} ufbx_time_protocol;
3730UFBX_ENUM_TYPE(ufbx_time_protocol, UFBX_TIME_PROTOCOL, UFBX_TIME_PROTOCOL_DEFAULT);
3732typedef enum ufbx_snap_mode UFBX_ENUM_REPR {
3733 UFBX_SNAP_MODE_NONE,
3734 UFBX_SNAP_MODE_SNAP,
3735 UFBX_SNAP_MODE_PLAY,
3736 UFBX_SNAP_MODE_SNAP_AND_PLAY,
3738 UFBX_ENUM_FORCE_WIDTH(UFBX_SNAP_MODE)
3741UFBX_ENUM_TYPE(ufbx_snap_mode, UFBX_SNAP_MODE, UFBX_SNAP_MODE_SNAP_AND_PLAY);
3755 ufbx_real unit_meters;
3758 double frames_per_second;
3765 ufbx_time_mode time_mode;
3766 ufbx_time_protocol time_protocol;
3767 ufbx_snap_mode snap_mode;
3770 ufbx_coordinate_axis original_axis_up;
3771 ufbx_real original_unit_meters;
3788 ufbx_unknown_list unknowns;
3791 ufbx_node_list nodes;
3794 ufbx_mesh_list meshes;
3795 ufbx_light_list lights;
3796 ufbx_camera_list cameras;
3797 ufbx_bone_list bones;
3798 ufbx_empty_list empties;
3801 ufbx_line_curve_list line_curves;
3802 ufbx_nurbs_curve_list nurbs_curves;
3803 ufbx_nurbs_surface_list nurbs_surfaces;
3804 ufbx_nurbs_trim_surface_list nurbs_trim_surfaces;
3805 ufbx_nurbs_trim_boundary_list nurbs_trim_boundaries;
3808 ufbx_procedural_geometry_list procedural_geometries;
3809 ufbx_stereo_camera_list stereo_cameras;
3810 ufbx_camera_switcher_list camera_switchers;
3811 ufbx_marker_list markers;
3812 ufbx_lod_group_list lod_groups;
3815 ufbx_skin_deformer_list skin_deformers;
3816 ufbx_skin_cluster_list skin_clusters;
3817 ufbx_blend_deformer_list blend_deformers;
3818 ufbx_blend_channel_list blend_channels;
3819 ufbx_blend_shape_list blend_shapes;
3820 ufbx_cache_deformer_list cache_deformers;
3821 ufbx_cache_file_list cache_files;
3824 ufbx_material_list materials;
3825 ufbx_texture_list textures;
3826 ufbx_video_list videos;
3827 ufbx_shader_list shaders;
3828 ufbx_shader_binding_list shader_bindings;
3831 ufbx_anim_stack_list anim_stacks;
3832 ufbx_anim_layer_list anim_layers;
3833 ufbx_anim_value_list anim_values;
3834 ufbx_anim_curve_list anim_curves;
3837 ufbx_display_layer_list display_layers;
3838 ufbx_selection_set_list selection_sets;
3839 ufbx_selection_node_list selection_nodes;
3842 ufbx_character_list characters;
3843 ufbx_constraint_list constraints;
3846 ufbx_audio_layer_list audio_layers;
3847 ufbx_audio_clip_list audio_clips;
3850 ufbx_pose_list poses;
3851 ufbx_metadata_object_list metadata_objects;
3854 ufbx_element_list elements_by_type[UFBX_ELEMENT_TYPE_COUNT];
3858 ufbx_texture_file_list texture_files;
3861 ufbx_element_list elements;
3862 ufbx_connection_list connections_src;
3863 ufbx_connection_list connections_dst;
3866 ufbx_name_element_list elements_by_name;
3889typedef enum ufbx_topo_flags UFBX_FLAG_REPR {
3890 UFBX_TOPO_NON_MANIFOLD = 0x1,
3892 UFBX_FLAG_FORCE_WIDTH(UFBX_TOPO_FLAGS)
3903 ufbx_topo_flags flags;
3911 size_t vertex_count;
3921typedef void *ufbx_alloc_fn(
void *user,
size_t size);
3927typedef void *ufbx_realloc_fn(
void *user,
void *old_ptr,
size_t old_size,
size_t new_size);
3930typedef void ufbx_free_fn(
void *user,
void *ptr,
size_t size);
3933typedef void ufbx_free_allocator_fn(
void *user);
3941 ufbx_alloc_fn *alloc_fn;
3942 ufbx_realloc_fn *realloc_fn;
3943 ufbx_free_fn *free_fn;
3944 ufbx_free_allocator_fn *free_allocator_fn;
3953 size_t memory_limit;
3956 size_t allocation_limit;
3962 size_t huge_threshold;
3974 size_t max_chunk_size;
3982typedef size_t ufbx_read_fn(
void *user,
void *data,
size_t size);
3985typedef bool ufbx_skip_fn(
void *user,
size_t size);
3988typedef void ufbx_close_fn(
void *user);
3991 ufbx_read_fn *read_fn;
3992 ufbx_skip_fn *skip_fn;
3993 ufbx_close_fn *close_fn;
3999typedef enum ufbx_open_file_type UFBX_ENUM_REPR {
4000 UFBX_OPEN_FILE_MAIN_MODEL,
4001 UFBX_OPEN_FILE_GEOMETRY_CACHE,
4002 UFBX_OPEN_FILE_OBJ_MTL,
4004 UFBX_ENUM_FORCE_WIDTH(UFBX_OPEN_FILE_TYPE)
4005} ufbx_open_file_type;
4007UFBX_ENUM_TYPE(ufbx_open_file_type, UFBX_OPEN_FILE_TYPE, UFBX_OPEN_FILE_OBJ_MTL);
4011 ufbx_open_file_type type;
4025 ufbx_open_file_fn *fn;
4030 (stream, path, path_len, info))
4034typedef void ufbx_close_memory_fn(
void *user,
void *data,
size_t data_size);
4037 ufbx_close_memory_fn *fn;
4041 (
void *user,
void *data,
size_t data_size),
4047 uint32_t _begin_zero;
4057 ufbx_unsafe
bool no_copy;
4067 uint32_t source_line;
4073typedef enum ufbx_error_type UFBX_ENUM_REPR {
4083 UFBX_ERROR_FILE_NOT_FOUND,
4086 UFBX_ERROR_EMPTY_FILE,
4090 UFBX_ERROR_EXTERNAL_FILE_NOT_FOUND,
4093 UFBX_ERROR_OUT_OF_MEMORY,
4096 UFBX_ERROR_MEMORY_LIMIT,
4099 UFBX_ERROR_ALLOCATION_LIMIT,
4102 UFBX_ERROR_TRUNCATED_FILE,
4109 UFBX_ERROR_CANCELLED,
4114 UFBX_ERROR_UNRECOGNIZED_FILE_FORMAT,
4120 UFBX_ERROR_UNINITIALIZED_OPTIONS,
4123 UFBX_ERROR_ZERO_VERTEX_SIZE,
4126 UFBX_ERROR_TRUNCATED_VERTEX_STREAM,
4129 UFBX_ERROR_INVALID_UTF8,
4132 UFBX_ERROR_FEATURE_DISABLED,
4136 UFBX_ERROR_BAD_NURBS,
4139 UFBX_ERROR_BAD_INDEX,
4142 UFBX_ERROR_NODE_DEPTH_LIMIT,
4147 UFBX_ERROR_THREADED_ASCII_PARSE,
4150 UFBX_ERROR_UNSAFE_OPTIONS,
4153 UFBX_ERROR_DUPLICATE_OVERRIDE,
4155 UFBX_ENUM_FORCE_WIDTH(UFBX_ERROR_TYPE)
4158UFBX_ENUM_TYPE(ufbx_error_type, UFBX_ERROR_TYPE, UFBX_ERROR_DUPLICATE_OVERRIDE);
4163 ufbx_error_type type;
4165 uint32_t stack_size;
4168 char info[UFBX_ERROR_INFO_LENGTH];
4174 uint64_t bytes_read;
4175 uint64_t bytes_total;
4178typedef enum ufbx_progress_result UFBX_ENUM_REPR {
4179 UFBX_PROGRESS_CONTINUE = 0x100,
4180 UFBX_PROGRESS_CANCEL = 0x200,
4182 UFBX_ENUM_FORCE_WIDTH(UFBX_PROGRESS_RESULT)
4183} ufbx_progress_result;
4187typedef ufbx_progress_result ufbx_progress_fn(
void *user,
const ufbx_progress *progress);
4190 ufbx_progress_fn *fn;
4193 UFBX_CALLBACK_IMPL(
ufbx_progress_cb, ufbx_progress_fn, ufbx_progress_result,
4217 ufbx_read_fn *read_fn;
4222 uint64_t progress_interval_hint;
4225 uint64_t progress_size_before;
4226 uint64_t progress_size_after;
4235 size_t internal_fast_bits;
4242 uint64_t data[1024];
4245typedef enum ufbx_index_error_handling UFBX_ENUM_REPR {
4247 UFBX_INDEX_ERROR_HANDLING_CLAMP,
4252 UFBX_INDEX_ERROR_HANDLING_NO_INDEX,
4254 UFBX_INDEX_ERROR_HANDLING_ABORT_LOADING,
4259 UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE,
4261 UFBX_ENUM_FORCE_WIDTH(UFBX_INDEX_ERROR_HANDLING)
4262} ufbx_index_error_handling;
4264UFBX_ENUM_TYPE(ufbx_index_error_handling, UFBX_INDEX_ERROR_HANDLING, UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE);
4266typedef enum ufbx_unicode_error_handling UFBX_ENUM_REPR {
4268 UFBX_UNICODE_ERROR_HANDLING_REPLACEMENT_CHARACTER,
4270 UFBX_UNICODE_ERROR_HANDLING_UNDERSCORE,
4272 UFBX_UNICODE_ERROR_HANDLING_QUESTION_MARK,
4274 UFBX_UNICODE_ERROR_HANDLING_REMOVE,
4276 UFBX_UNICODE_ERROR_HANDLING_ABORT_LOADING,
4280 UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE,
4282 UFBX_ENUM_FORCE_WIDTH(UFBX_UNICODE_ERROR_HANDLING)
4283} ufbx_unicode_error_handling;
4285UFBX_ENUM_TYPE(ufbx_unicode_error_handling, UFBX_UNICODE_ERROR_HANDLING, UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE);
4293typedef enum ufbx_geometry_transform_handling UFBX_ENUM_REPR {
4299 UFBX_GEOMETRY_TRANSFORM_HANDLING_PRESERVE,
4304 UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES,
4310 UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY,
4314 UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK,
4316 UFBX_ENUM_FORCE_WIDTH(UFBX_GEOMETRY_TRANSFORM_HANDLING)
4317} ufbx_geometry_transform_handling;
4319UFBX_ENUM_TYPE(ufbx_geometry_transform_handling, UFBX_GEOMETRY_TRANSFORM_HANDLING, UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK);
4322typedef enum ufbx_inherit_mode_handling UFBX_ENUM_REPR {
4327 UFBX_INHERIT_MODE_HANDLING_PRESERVE,
4332 UFBX_INHERIT_MODE_HANDLING_HELPER_NODES,
4338 UFBX_INHERIT_MODE_HANDLING_COMPENSATE,
4342 UFBX_INHERIT_MODE_HANDLING_COMPENSATE_NO_FALLBACK,
4348 UFBX_INHERIT_MODE_HANDLING_IGNORE,
4350 UFBX_ENUM_FORCE_WIDTH(UFBX_INHERIT_MODE_HANDLING)
4351} ufbx_inherit_mode_handling;
4353UFBX_ENUM_TYPE(ufbx_inherit_mode_handling, UFBX_INHERIT_MODE_HANDLING, UFBX_INHERIT_MODE_HANDLING_IGNORE);
4356typedef enum ufbx_pivot_handling UFBX_ENUM_REPR {
4359 UFBX_PIVOT_HANDLING_RETAIN,
4365 UFBX_PIVOT_HANDLING_ADJUST_TO_PIVOT,
4367 UFBX_ENUM_FORCE_WIDTH(UFBX_PIVOT_HANDLING)
4368} ufbx_pivot_handling;
4370UFBX_ENUM_TYPE(ufbx_pivot_handling, UFBX_PIVOT_HANDLING, UFBX_PIVOT_HANDLING_ADJUST_TO_PIVOT);
4372typedef enum ufbx_baked_key_flags UFBX_FLAG_REPR {
4374 UFBX_BAKED_KEY_STEP_LEFT = 0x1,
4376 UFBX_BAKED_KEY_STEP_RIGHT = 0x2,
4379 UFBX_BAKED_KEY_STEP_KEY = 0x4,
4381 UFBX_BAKED_KEY_KEYFRAME = 0x8,
4384 UFBX_BAKED_KEY_REDUCED = 0x10,
4386 UFBX_FLAG_FORCE_WIDTH(UFBX_BAKED_KEY)
4387} ufbx_baked_key_flags;
4392 ufbx_baked_key_flags flags;
4400 ufbx_baked_key_flags flags;
4411 uint32_t element_id;
4414 bool constant_translation;
4416 bool constant_rotation;
4418 bool constant_scale;
4421 ufbx_baked_vec3_list translation_keys;
4423 ufbx_baked_quat_list rotation_keys;
4425 ufbx_baked_vec3_list scale_keys;
4436 bool constant_value;
4438 ufbx_baked_vec3_list keys;
4446 uint32_t element_id;
4448 ufbx_baked_prop_list props;
4455 size_t result_memory_used;
4456 size_t temp_memory_used;
4457 size_t result_allocs;
4469 ufbx_baked_node_list nodes;
4472 ufbx_baked_element_list elements;
4475 double playback_time_begin;
4476 double playback_time_end;
4477 double playback_duration;
4480 double key_time_min;
4481 double key_time_max;
4493typedef uintptr_t ufbx_thread_pool_context;
4496 uint32_t max_concurrent_tasks;
4499typedef bool ufbx_thread_pool_init_fn(
void *user, ufbx_thread_pool_context ctx,
const ufbx_thread_pool_info *info);
4500typedef bool ufbx_thread_pool_run_fn(
void *user, ufbx_thread_pool_context ctx, uint32_t group, uint32_t start_index, uint32_t count);
4501typedef bool ufbx_thread_pool_wait_fn(
void *user, ufbx_thread_pool_context ctx, uint32_t group, uint32_t max_index);
4502typedef void ufbx_thread_pool_free_fn(
void *user, ufbx_thread_pool_context ctx);
4505 ufbx_thread_pool_init_fn *init_fn;
4506 ufbx_thread_pool_run_fn *run_fn;
4507 ufbx_thread_pool_wait_fn *wait_fn;
4508 ufbx_thread_pool_free_fn *free_fn;
4515 size_t memory_limit;
4523 uint32_t _begin_zero;
4530 bool ignore_geometry;
4531 bool ignore_animation;
4532 bool ignore_embedded;
4533 bool ignore_all_content;
4535 bool evaluate_skinning;
4536 bool evaluate_caches;
4548 bool load_external_files;
4551 bool ignore_missing_external_files;
4555 bool skip_skin_vertices;
4558 bool skip_mesh_parts;
4561 bool clean_skin_weights;
4567 bool use_blender_pbr_material;
4570 bool disable_quirks;
4578 bool force_single_thread_ascii_parsing;
4582 ufbx_unsafe
bool allow_unsafe;
4585 ufbx_index_error_handling index_error_handling;
4590 bool connect_broken_elements;
4594 bool allow_nodes_out_of_root;
4598 bool allow_missing_vertex_position;
4601 bool allow_empty_faces;
4605 bool generate_missing_normals;
4608 bool open_main_file_with_default;
4611 char path_separator;
4617 uint32_t node_depth_limit;
4620 uint64_t file_size_estimate;
4623 size_t read_buffer_size;
4636 uint64_t progress_interval_hint;
4643 ufbx_geometry_transform_handling geometry_transform_handling;
4647 ufbx_inherit_mode_handling inherit_mode_handling;
4651 ufbx_pivot_handling pivot_handling;
4655 ufbx_space_conversion space_conversion;
4658 ufbx_mirror_axis handedness_conversion_axis;
4661 bool handedness_conversion_retain_winding;
4666 bool reverse_winding;
4674 ufbx_real target_unit_meters;
4695 bool normalize_normals;
4698 bool normalize_tangents;
4701 bool use_root_transform;
4705 double key_clamp_threshold;
4708 ufbx_unicode_error_handling unicode_error_handling;
4712 bool retain_vertex_attrib_w;
4718 ufbx_file_format file_format;
4722 size_t file_format_lookahead;
4725 bool no_format_from_content;
4730 bool no_format_from_extension;
4736 bool obj_search_mtl_by_filename;
4739 bool obj_merge_objects;
4742 bool obj_merge_groups;
4745 bool obj_split_groups;
4759 ufbx_real obj_unit_meters;
4772 uint32_t _begin_zero;
4777 bool evaluate_skinning;
4778 bool evaluate_caches;
4781 bool load_external_files;
4789UFBX_LIST_TYPE(ufbx_const_uint32_list,
const uint32_t);
4790UFBX_LIST_TYPE(ufbx_const_real_list,
const ufbx_real);
4794 uint32_t element_id;
4811 uint32_t _begin_zero;
4815 ufbx_const_uint32_list layer_ids;
4818 ufbx_const_real_list override_layer_weights;
4822 ufbx_const_prop_override_desc_list prop_overrides;
4826 ufbx_const_transform_override_list transform_overrides;
4829 bool ignore_connections;
4837typedef enum ufbx_bake_step_handling UFBX_ENUM_REPR {
4840 UFBX_BAKE_STEP_HANDLING_DEFAULT,
4844 UFBX_BAKE_STEP_HANDLING_CUSTOM_DURATION,
4849 UFBX_BAKE_STEP_HANDLING_IDENTICAL_TIME,
4856 UFBX_BAKE_STEP_HANDLING_ADJACENT_DOUBLE,
4859 UFBX_BAKE_STEP_HANDLING_IGNORE,
4861 UFBX_ENUM_FORCE_WIDTH(ufbx_bake_step_handling)
4862} ufbx_bake_step_handling;
4864UFBX_ENUM_TYPE(ufbx_bake_step_handling, UFBX_BAKE_STEP_HANDLING, UFBX_BAKE_STEP_HANDLING_IGNORE);
4867 uint32_t _begin_zero;
4877 bool trim_start_time;
4881 double resample_rate;
4887 double minimum_sample_rate;
4891 double maximum_sample_rate;
4894 bool bake_transform_props;
4897 bool skip_node_transforms;
4901 bool no_resample_rotation;
4904 bool ignore_layer_weight_animation;
4908 size_t max_keyframe_segments;
4911 ufbx_bake_step_handling step_handling;
4914 double step_custom_duration;
4919 double step_custom_epsilon;
4922 bool key_reduction_enabled;
4926 bool key_reduction_rotation;
4930 double key_reduction_threshold;
4935 size_t key_reduction_passes;
4943 uint32_t _begin_zero;
4949 size_t span_subdivision;
4957 uint32_t _begin_zero;
4967 size_t span_subdivision_u;
4968 size_t span_subdivision_v;
4971 bool skip_mesh_parts;
4979 uint32_t _begin_zero;
4984 ufbx_subdivision_boundary boundary;
4985 ufbx_subdivision_boundary uv_boundary;
4988 bool ignore_normals;
4992 bool interpolate_normals;
4995 bool interpolate_tangents;
4999 bool evaluate_source_vertices;
5002 size_t max_source_vertices;
5006 bool evaluate_skin_weights;
5009 size_t max_skin_weights;
5012 size_t skin_deformer_index;
5020 uint32_t _begin_zero;
5029 double frames_per_second;
5032 ufbx_mirror_axis mirror_axis;
5035 bool use_scale_factor;
5038 ufbx_real scale_factor;
5046 uint32_t _begin_zero;
5056 bool ignore_transform;
5063 size_t message_length;
5064 char message[UFBX_PANIC_MESSAGE_LENGTH];
5075ufbx_abi_data
const ufbx_blob ufbx_empty_blob;
5076ufbx_abi_data
const ufbx_matrix ufbx_identity_matrix;
5078ufbx_abi_data
const ufbx_vec2 ufbx_zero_vec2;
5079ufbx_abi_data
const ufbx_vec3 ufbx_zero_vec3;
5080ufbx_abi_data
const ufbx_vec4 ufbx_zero_vec4;
5081ufbx_abi_data
const ufbx_quat ufbx_identity_quat;
5090ufbx_abi_data
const size_t ufbx_element_type_size[UFBX_ELEMENT_TYPE_COUNT];
5093ufbx_abi_data
const uint32_t ufbx_source_version;
5108ufbx_abi
bool ufbx_is_thread_safe(
void);
5112 const void *data,
size_t data_size,
5117 const char *filename,
5120 const char *filename,
size_t filename_len,
5133 const void *prefix,
size_t prefix_size,
5144 const void *prefix,
size_t prefix_size,
5148ufbx_abi
void ufbx_free_scene(
ufbx_scene *scene);
5151ufbx_abi
void ufbx_retain_scene(
ufbx_scene *scene);
5156ufbx_abi
size_t ufbx_format_error(
char *dst,
size_t dst_size,
const ufbx_error *error);
5162ufbx_abi
ufbx_prop *ufbx_find_prop_len(
const ufbx_props *props,
const char *name,
size_t name_len);
5163ufbx_inline
ufbx_prop *ufbx_find_prop(
const ufbx_props *props,
const char *name) {
return ufbx_find_prop_len(props, name, strlen(name));}
5168ufbx_abi ufbx_real ufbx_find_real_len(
const ufbx_props *props,
const char *name,
size_t name_len, ufbx_real def);
5169ufbx_inline ufbx_real ufbx_find_real(
const ufbx_props *props,
const char *name, ufbx_real def) {
return ufbx_find_real_len(props, name, strlen(name), def); }
5171ufbx_inline
ufbx_vec3 ufbx_find_vec3(
const ufbx_props *props,
const char *name,
ufbx_vec3 def) {
return ufbx_find_vec3_len(props, name, strlen(name), def); }
5172ufbx_abi int64_t ufbx_find_int_len(
const ufbx_props *props,
const char *name,
size_t name_len, int64_t def);
5173ufbx_inline int64_t ufbx_find_int(
const ufbx_props *props,
const char *name, int64_t def) {
return ufbx_find_int_len(props, name, strlen(name), def); }
5174ufbx_abi
bool ufbx_find_bool_len(
const ufbx_props *props,
const char *name,
size_t name_len,
bool def);
5175ufbx_inline
bool ufbx_find_bool(
const ufbx_props *props,
const char *name,
bool def) {
return ufbx_find_bool_len(props, name, strlen(name), def); }
5177ufbx_inline
ufbx_string ufbx_find_string(
const ufbx_props *props,
const char *name,
ufbx_string def) {
return ufbx_find_string_len(props, name, strlen(name), def); }
5179ufbx_inline
ufbx_blob ufbx_find_blob(
const ufbx_props *props,
const char *name,
ufbx_blob def) {
return ufbx_find_blob_len(props, name, strlen(name), def); }
5188ufbx_abi
ufbx_element *ufbx_find_prop_element_len(
const ufbx_element *element,
const char *name,
size_t name_len, ufbx_element_type type);
5189ufbx_inline
ufbx_element *ufbx_find_prop_element(
const ufbx_element *element,
const char *name, ufbx_element_type type) {
return ufbx_find_prop_element_len(element, name, strlen(name), type); }
5194ufbx_abi
ufbx_element *ufbx_find_element_len(
const ufbx_scene *scene, ufbx_element_type type,
const char *name,
size_t name_len);
5195ufbx_inline
ufbx_element *ufbx_find_element(
const ufbx_scene *scene, ufbx_element_type type,
const char *name) {
return ufbx_find_element_len(scene, type, name, strlen(name)); }
5198ufbx_abi
ufbx_node *ufbx_find_node_len(
const ufbx_scene *scene,
const char *name,
size_t name_len);
5199ufbx_inline
ufbx_node *ufbx_find_node(
const ufbx_scene *scene,
const char *name) {
return ufbx_find_node_len(scene, name, strlen(name)); }
5203ufbx_inline
ufbx_anim_stack *ufbx_find_anim_stack(
const ufbx_scene *scene,
const char *name) {
return ufbx_find_anim_stack_len(scene, name, strlen(name)); }
5207ufbx_inline
ufbx_material *ufbx_find_material(
const ufbx_scene *scene,
const char *name) {
return ufbx_find_material_len(scene, name, strlen(name)); }
5233ufbx_abi
bool ufbx_open_file(
ufbx_stream *stream,
const char *path,
size_t path_len);
5246ufbx_abi ufbx_real ufbx_evaluate_curve(
const ufbx_anim_curve *curve,
double time, ufbx_real default_value);
5249ufbx_abi ufbx_real ufbx_evaluate_anim_value_real(
const ufbx_anim_value *anim_value,
double time);
5256 return ufbx_evaluate_prop_len(anim, element, name, strlen(name), time);
5265typedef enum ufbx_transform_flags UFBX_FLAG_REPR {
5268 UFBX_TRANSFORM_FLAG_IGNORE_SCALE_HELPER = 0x1,
5273 UFBX_TRANSFORM_FLAG_IGNORE_COMPONENTWISE_SCALE = 0x2,
5276 UFBX_TRANSFORM_FLAG_EXPLICIT_INCLUDES = 0x4,
5279 UFBX_TRANSFORM_FLAG_INCLUDE_TRANSLATION = 0x10,
5281 UFBX_TRANSFORM_FLAG_INCLUDE_ROTATION = 0x20,
5283 UFBX_TRANSFORM_FLAG_INCLUDE_SCALE = 0x40,
5285 UFBX_FLAG_FORCE_WIDTH(UFBX_TRANSFORM_FLAGS)
5286} ufbx_transform_flags;
5314ufbx_abi
void ufbx_free_anim(
ufbx_anim *anim);
5317ufbx_abi
void ufbx_retain_anim(
ufbx_anim *anim);
5337ufbx_abi
ufbx_vec3 ufbx_evaluate_baked_vec3(ufbx_baked_vec3_list keyframes,
double time);
5342ufbx_abi
ufbx_quat ufbx_evaluate_baked_quat(ufbx_baked_quat_list keyframes,
double time);
5355 return ufbx_find_prop_texture_len(material, name, strlen(name));
5359ufbx_abi
ufbx_string ufbx_find_shader_prop_len(
const ufbx_shader *shader,
const char *name,
size_t name_len);
5361 return ufbx_find_shader_prop_len(shader, name, strlen(name));
5365ufbx_abi ufbx_shader_prop_binding_list ufbx_find_shader_prop_bindings_len(
const ufbx_shader *shader,
const char *name,
size_t name_len);
5366ufbx_inline ufbx_shader_prop_binding_list ufbx_find_shader_prop_bindings(
const ufbx_shader *shader,
const char *name) {
5367 return ufbx_find_shader_prop_bindings_len(shader, name, strlen(name));
5373 return ufbx_find_shader_texture_input_len(shader, name, strlen(name));
5396ufbx_abi ufbx_real ufbx_matrix_determinant(
const ufbx_matrix *m);
5419 return ufbx_catch_get_skin_vertex_matrix(NULL, skin, vertex, fallback);
5424ufbx_abi uint32_t ufbx_get_blend_shape_offset_index(
const ufbx_blend_shape *shape,
size_t vertex);
5435ufbx_abi
void ufbx_add_blend_shape_vertex_offsets(
const ufbx_blend_shape *shape,
ufbx_vec3 *vertices,
size_t num_vertices, ufbx_real weight);
5439ufbx_abi
void ufbx_add_blend_vertex_offsets(
const ufbx_blend_deformer *blend,
ufbx_vec3 *vertices,
size_t num_vertices, ufbx_real weight);
5444ufbx_abi
size_t ufbx_evaluate_nurbs_basis(
const ufbx_nurbs_basis *basis, ufbx_real u, ufbx_real *weights,
size_t num_weights, ufbx_real *derivatives,
size_t num_derivatives);
5468ufbx_abi uint32_t ufbx_find_face_index(
ufbx_mesh *mesh,
size_t index);
5473ufbx_abi uint32_t ufbx_catch_triangulate_face(
ufbx_panic *panic, uint32_t *indices,
size_t num_indices,
const ufbx_mesh *mesh,
ufbx_face face);
5474ufbx_inline uint32_t ufbx_triangulate_face(uint32_t *indices,
size_t num_indices,
const ufbx_mesh *mesh,
ufbx_face face) {
5475 return ufbx_catch_triangulate_face(NULL, indices, num_indices, mesh, face);
5481 ufbx_catch_compute_topology(NULL, mesh, topo, num_topo);
5488ufbx_abi uint32_t ufbx_catch_topo_next_vertex_edge(
ufbx_panic *panic,
const ufbx_topo_edge *topo,
size_t num_topo, uint32_t index);
5489ufbx_inline uint32_t ufbx_topo_next_vertex_edge(
const ufbx_topo_edge *topo,
size_t num_topo, uint32_t index) {
5490 return ufbx_catch_topo_next_vertex_edge(NULL, topo, num_topo, index);
5494ufbx_abi uint32_t ufbx_catch_topo_prev_vertex_edge(
ufbx_panic *panic,
const ufbx_topo_edge *topo,
size_t num_topo, uint32_t index);
5495ufbx_inline uint32_t ufbx_topo_prev_vertex_edge(
const ufbx_topo_edge *topo,
size_t num_topo, uint32_t index) {
5496 return ufbx_catch_topo_prev_vertex_edge(NULL, topo, num_topo, index);
5503 return ufbx_catch_get_weighted_face_normal(NULL, positions, face);
5508ufbx_abi
size_t ufbx_catch_generate_normal_mapping(
ufbx_panic *panic,
const ufbx_mesh *mesh,
5510 uint32_t *normal_indices,
size_t num_normal_indices,
bool assume_smooth);
5511ufbx_abi
size_t ufbx_generate_normal_mapping(
const ufbx_mesh *mesh,
5513 uint32_t *normal_indices,
size_t num_normal_indices,
bool assume_smooth);
5518 const uint32_t *normal_indices,
size_t num_normal_indices,
5519 ufbx_vec3 *normals,
size_t num_normals);
5521 const uint32_t *normal_indices,
size_t num_normal_indices,
5522 ufbx_vec3 *normals,
size_t num_normals);
5528ufbx_abi
void ufbx_free_mesh(
ufbx_mesh *mesh);
5531ufbx_abi
void ufbx_retain_mesh(
ufbx_mesh *mesh);
5539 const char *filename,
5542 const char *filename,
size_t filename_len,
5561ufbx_inline
ufbx_dom_node *ufbx_dom_find(
const ufbx_dom_node *parent,
const char *name) {
return ufbx_dom_find_len(parent, name, strlen(name)); }
5574ufbx_unsafe ufbx_abi
void ufbx_thread_pool_run_task(ufbx_thread_pool_context ctx, uint32_t index);
5578ufbx_unsafe ufbx_abi
void ufbx_thread_pool_set_user_ptr(ufbx_thread_pool_context ctx,
void *user_ptr);
5579ufbx_unsafe ufbx_abi
void *ufbx_thread_pool_get_user_ptr(ufbx_thread_pool_context ctx);
5590ufbx_inline ufbx_real ufbx_get_vertex_real(
const ufbx_vertex_real *v,
size_t index) { ufbx_assert(index < v->indices.count);
return v->values.data[(int32_t)v->indices.data[index]]; }
5591ufbx_inline
ufbx_vec2 ufbx_get_vertex_vec2(
const ufbx_vertex_vec2 *v,
size_t index) { ufbx_assert(index < v->indices.count);
return v->values.data[(int32_t)v->indices.data[index]]; }
5592ufbx_inline
ufbx_vec3 ufbx_get_vertex_vec3(
const ufbx_vertex_vec3 *v,
size_t index) { ufbx_assert(index < v->indices.count);
return v->values.data[(int32_t)v->indices.data[index]]; }
5593ufbx_inline
ufbx_vec4 ufbx_get_vertex_vec4(
const ufbx_vertex_vec4 *v,
size_t index) { ufbx_assert(index < v->indices.count);
return v->values.data[(int32_t)v->indices.data[index]]; }
5596ufbx_inline ufbx_real ufbx_get_vertex_w_vec3(
const ufbx_vertex_vec3 *v,
size_t index) { ufbx_assert(index < v->indices.count);
return v->values_w.count > 0 ? v->values_w.data[(int32_t)v->indices.data[index]] : 0.0f; }
5651struct ufbx_string_view {
5655 ufbx_string_view() : data(nullptr), length(0) { }
5656 ufbx_string_view(
const char *data_,
size_t length_) : data(data_), length(length_) { }
5657 UFBX_CONVERSION_TO_IMPL(ufbx_string_view)
5660ufbx_inline
ufbx_scene *ufbx_load_file(ufbx_string_view filename,
const ufbx_load_opts *opts,
ufbx_error *error) {
return ufbx_load_file_len(filename.data, filename.length, opts, error); }
5661ufbx_inline
ufbx_prop *ufbx_find_prop(
const ufbx_props *props, ufbx_string_view name) {
return ufbx_find_prop_len(props, name.data, name.length); }
5662ufbx_inline ufbx_real ufbx_find_real(
const ufbx_props *props, ufbx_string_view name, ufbx_real def) {
return ufbx_find_real_len(props, name.data, name.length, def); }
5663ufbx_inline
ufbx_vec3 ufbx_find_vec3(
const ufbx_props *props, ufbx_string_view name,
ufbx_vec3 def) {
return ufbx_find_vec3_len(props, name.data, name.length, def); }
5664ufbx_inline int64_t ufbx_find_int(
const ufbx_props *props, ufbx_string_view name, int64_t def) {
return ufbx_find_int_len(props, name.data, name.length, def); }
5665ufbx_inline
bool ufbx_find_bool(
const ufbx_props *props, ufbx_string_view name,
bool def) {
return ufbx_find_bool_len(props, name.data, name.length, def); }
5666ufbx_inline
ufbx_string ufbx_find_string(
const ufbx_props *props, ufbx_string_view name,
ufbx_string def) {
return ufbx_find_string_len(props, name.data, name.length, def); }
5667ufbx_inline
ufbx_blob ufbx_find_blob(
const ufbx_props *props, ufbx_string_view name,
ufbx_blob def) {
return ufbx_find_blob_len(props, name.data, name.length, def); }
5668ufbx_inline
ufbx_element *ufbx_find_prop_element(
const ufbx_element *element, ufbx_string_view name, ufbx_element_type type) {
return ufbx_find_prop_element_len(element, name.data, name.length, type); }
5669ufbx_inline
ufbx_element *ufbx_find_element(
const ufbx_scene *scene, ufbx_element_type type, ufbx_string_view name) {
return ufbx_find_element_len(scene, type, name.data, name.length); }
5670ufbx_inline
ufbx_node *ufbx_find_node(
const ufbx_scene *scene, ufbx_string_view name) {
return ufbx_find_node_len(scene, name.data, name.length); }
5671ufbx_inline
ufbx_anim_stack *ufbx_find_anim_stack(
const ufbx_scene *scene, ufbx_string_view name) {
return ufbx_find_anim_stack_len(scene, name.data, name.length); }
5672ufbx_inline
ufbx_material *ufbx_find_material(
const ufbx_scene *scene, ufbx_string_view name) {
return ufbx_find_material_len(scene, name.data, name.length); }
5673ufbx_inline
ufbx_anim_prop *ufbx_find_anim_prop(
const ufbx_anim_layer *layer,
const ufbx_element *element, ufbx_string_view prop) {
return ufbx_find_anim_prop_len(layer, element, prop.data, prop.length); }
5674ufbx_inline
ufbx_prop ufbx_evaluate_prop(
const ufbx_anim *anim,
const ufbx_element *element, ufbx_string_view name,
double time) {
return ufbx_evaluate_prop_len(anim, element, name.data, name.length, time); }
5675ufbx_inline
ufbx_texture *ufbx_find_prop_texture(
const ufbx_material *material, ufbx_string_view name) {
return ufbx_find_prop_texture_len(material, name.data, name.length); }
5676ufbx_inline
ufbx_string ufbx_find_shader_prop(
const ufbx_shader *shader, ufbx_string_view name) {
return ufbx_find_shader_prop_len(shader, name.data, name.length); }
5677ufbx_inline ufbx_shader_prop_binding_list ufbx_find_shader_prop_bindings(
const ufbx_shader *shader, ufbx_string_view name) {
return ufbx_find_shader_prop_bindings_len(shader, name.data, name.length); }
5680ufbx_inline
ufbx_dom_node *ufbx_dom_find(
const ufbx_dom_node *parent, ufbx_string_view name) {
return ufbx_dom_find_len(parent, name.data, name.length); }
5686template <
typename T>
5687struct ufbx_type_traits {
enum { valid = 0 }; };
5689template<>
struct ufbx_type_traits<
ufbx_scene> {
5691 static void retain(
ufbx_scene *ptr) { ufbx_retain_scene(ptr); }
5692 static void free(
ufbx_scene *ptr) { ufbx_free_scene(ptr); }
5695template<>
struct ufbx_type_traits<
ufbx_mesh> {
5697 static void retain(
ufbx_mesh *ptr) { ufbx_retain_mesh(ptr); }
5698 static void free(
ufbx_mesh *ptr) { ufbx_free_mesh(ptr); }
5703 static void retain(
ufbx_line_curve *ptr) { ufbx_retain_line_curve(ptr); }
5713template<>
struct ufbx_type_traits<
ufbx_anim> {
5715 static void retain(
ufbx_anim *ptr) { ufbx_retain_anim(ptr); }
5716 static void free(
ufbx_anim *ptr) { ufbx_free_anim(ptr); }
5721 static void retain(
ufbx_baked_anim *ptr) { ufbx_retain_baked_anim(ptr); }
5727 template <
typename T>
5728 void operator()(T *ptr)
const {
5729 static_assert(ufbx_type_traits<T>::valid,
"ufbx_deleter() unsupported for type");
5730 ufbx_type_traits<T>::free(ptr);
5737template <
typename T>
5738class ufbx_unique_ptr {
5740 using traits = ufbx_type_traits<T>;
5741 static_assert(ufbx_type_traits<T>::valid,
"ufbx_unique_ptr unsupported for type");
5743 ufbx_unique_ptr() noexcept : ptr(
nullptr) { }
5744 explicit ufbx_unique_ptr(T *ptr_) noexcept : ptr(ptr_) { }
5745 ufbx_unique_ptr(ufbx_unique_ptr &&ref) noexcept : ptr(ref.ptr) { ref.ptr =
nullptr; }
5746 ~ufbx_unique_ptr() { traits::free(ptr); }
5748 ufbx_unique_ptr &operator=(ufbx_unique_ptr &&ref)
noexcept {
5749 if (&ref ==
this)
return *
this;
5755 void reset(T *new_ptr=
nullptr) noexcept {
5760 void swap(ufbx_unique_ptr &ref)
noexcept {
5766 T &operator*() const noexcept {
return *ptr; }
5767 T *operator->() const noexcept {
return ptr; }
5768 T *get() const noexcept {
return ptr; }
5769 explicit operator bool() const noexcept {
return ptr !=
nullptr; }
5774template <
typename T>
5775class ufbx_shared_ptr {
5777 using traits = ufbx_type_traits<T>;
5778 static_assert(ufbx_type_traits<T>::valid,
"ufbx_shared_ptr unsupported for type");
5781 ufbx_shared_ptr() noexcept : ptr(
nullptr) { }
5782 explicit ufbx_shared_ptr(T *ptr_) noexcept : ptr(ptr_) { }
5783 ufbx_shared_ptr(
const ufbx_shared_ptr &ref) noexcept : ptr(ref.ptr) { traits::retain(ref.ptr); }
5784 ufbx_shared_ptr(ufbx_shared_ptr &&ref) noexcept : ptr(ref.ptr) { ref.ptr =
nullptr; }
5785 ~ufbx_shared_ptr() { traits::free(ptr); }
5787 ufbx_shared_ptr &operator=(
const ufbx_shared_ptr &ref)
noexcept {
5788 if (&ref ==
this)
return *
this;
5790 traits::retain(ref.ptr);
5795 ufbx_shared_ptr &operator=(ufbx_shared_ptr &&ref)
noexcept {
5796 if (&ref ==
this)
return *
this;
5802 void reset(T *new_ptr=
nullptr) noexcept {
5807 void swap(ufbx_shared_ptr &ref)
noexcept {
5813 T &operator*() const noexcept {
return *ptr; }
5814 T *operator->() const noexcept {
return ptr; }
5815 T *get() const noexcept {
return ptr; }
5816 explicit operator bool() const noexcept {
return ptr !=
nullptr; }
5829#define UFBX_Lcl_Translation "Lcl Translation"
5834#define UFBX_Lcl_Rotation "Lcl Rotation"
5838#define UFBX_Lcl_Scaling "Lcl Scaling"
5842#define UFBX_RotationOrder "RotationOrder"
5846#define UFBX_ScalingPivot "ScalingPivot"
5850#define UFBX_RotationPivot "RotationPivot"
5854#define UFBX_ScalingOffset "ScalingOffset"
5858#define UFBX_RotationOffset "RotationOffset"
5863#define UFBX_PreRotation "PreRotation"
5868#define UFBX_PostRotation "PostRotation"
5872#define UFBX_Visibility "Visibility"
5876#define UFBX_Weight "Weight"
5880#define UFBX_DeformPercent "DeformPercent"
5882#if defined(_MSC_VER)
5883 #pragma warning(pop)
5884#elif defined(__clang__)
5885 #pragma clang diagnostic pop
5886#elif defined(__GNUC__)
5887 #pragma GCC diagnostic pop