#ifndef UFBX_UFBX_H_INCLUDED
#define UFBX_UFBX_H_INCLUDED
#if defined(UFBX_CONFIG_HEADER)
#include UFBX_CONFIG_HEADER
#endif
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#ifndef UFBX_STDC
#if defined(__STDC_VERSION__)
#define UFBX_STDC …
#else
#define UFBX_STDC …
#endif
#endif
#ifndef UFBX_CPP
#if defined(__cplusplus)
#define UFBX_CPP …
#else
#define UFBX_CPP …
#endif
#endif
#ifndef UFBX_PLATFORM_MSC
#if !defined(UFBX_STANDARD_C) && defined(_MSC_VER)
#define UFBX_PLATFORM_MSC …
#else
#define UFBX_PLATFORM_MSC …
#endif
#endif
#ifndef UFBX_PLATFORM_GNUC
#if !defined(UFBX_STANDARD_C) && defined(__GNUC__)
#define UFBX_PLATFORM_GNUC …
#else
#define UFBX_PLATFORM_GNUC …
#endif
#endif
#ifndef UFBX_CPP11
#if UFBX_CPP >= 201103L || (UFBX_CPP > 0 && UFBX_PLATFORM_MSC >= 1900)
#define UFBX_CPP11 …
#else
#define UFBX_CPP11 …
#endif
#endif
#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable: 4061)
#pragma warning(disable: 4201)
#pragma warning(disable: 4505)
#pragma warning(disable: 4820)
#elif defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpedantic"
#pragma clang diagnostic ignored "-Wpadded"
#if defined(__cplusplus)
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
#pragma clang diagnostic ignored "-Wold-style-cast"
#endif
#elif defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
#pragma GCC diagnostic ignored "-Wpadded"
#if defined(__cplusplus)
#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
#pragma GCC diagnostic ignored "-Wold-style-cast"
#else
#if __GNUC__ >= 5
#pragma GCC diagnostic ignored "-Wc90-c99-compat"
#pragma GCC diagnostic ignored "-Wc99-c11-compat"
#endif
#endif
#endif
#if UFBX_PLATFORM_MSC
#define ufbx_inline …
#elif UFBX_PLATFORM_GNUC
#define ufbx_inline …
#else
#define ufbx_inline …
#endif
#ifndef ufbx_assert
#if defined(UFBX_NO_ASSERT)
#define ufbx_assert …
#else
#include <assert.h>
#define ufbx_assert(cond) …
#endif
#endif
#define ufbx_nullable
#define ufbx_unsafe
#ifndef ufbx_abi
#if defined(UFBX_STATIC)
#define ufbx_abi …
#else
#define ufbx_abi
#endif
#endif
#ifndef ufbx_abi_data
#if defined(UFBX_STATIC)
#define ufbx_abi_data …
#else
#define ufbx_abi_data …
#endif
#endif
#ifndef ufbx_abi_data_definition
#if defined(UFBX_STATIC)
#define ufbx_abi_data_def …
#else
#define ufbx_abi_data_def
#endif
#endif
#ifndef UFBX_REAL_TYPE
#if defined(UFBX_REAL_IS_FLOAT)
#define UFBX_REAL_TYPE …
#else
#define UFBX_REAL_TYPE …
#endif
#endif
#define UFBX_ERROR_STACK_MAX_DEPTH …
#define UFBX_PANIC_MESSAGE_LENGTH …
#define UFBX_ERROR_INFO_LENGTH …
#define UFBX_THREAD_GROUP_COUNT …
#if UFBX_CPP11
template <typename T, typename U>
struct ufbxi_type_is { };
template <typename T>
struct ufbxi_type_is<T, T> { using type = int; };
template <typename T>
struct ufbx_converter { };
#define UFBX_CONVERSION_IMPL …
#define UFBX_CONVERSION_TO_IMPL …
#define UFBX_CONVERSION_LIST_IMPL …
#else
#define UFBX_CONVERSION_IMPL(p_name) …
#define UFBX_CONVERSION_TO_IMPL(p_name) …
#define UFBX_CONVERSION_LIST_IMPL(p_name) …
#endif
#if defined(__cplusplus)
#define UFBX_LIST_TYPE …
#else
#define UFBX_LIST_TYPE(p_name, p_type) …
#endif
#if (UFBX_STDC >= 202311L || UFBX_CPP11) && defined(UFBX_USE_EXPLICIT_ENUM)
#define UFBX_ENUM_REPR …
#define UFBX_ENUM_FORCE_WIDTH …
#define UFBX_FLAG_REPR …
#define UFBX_FLAG_FORCE_WIDTH …
#define UFBX_HAS_FORCE_32BIT …
#else
#define UFBX_ENUM_REPR
#define UFBX_ENUM_FORCE_WIDTH(p_prefix) …
#define UFBX_FLAG_REPR
#define UFBX_FLAG_FORCE_WIDTH(p_prefix) …
#define UFBX_HAS_FORCE_32BIT …
#endif
#define UFBX_ENUM_TYPE(p_name, p_prefix, p_last) …
#if UFBX_CPP
#define UFBX_VERTEX_ATTRIB_IMPL …
#else
#define UFBX_VERTEX_ATTRIB_IMPL(p_type) …
#endif
#if UFBX_CPP11
#define UFBX_CALLBACK_IMPL …
#else
#define UFBX_CALLBACK_IMPL(p_name, p_fn, p_return, p_params, p_args) …
#endif
#define ufbx_pack_version(major, minor, patch) …
#define ufbx_version_major(version) …
#define ufbx_version_minor(version) …
#define ufbx_version_patch(version) …
#define UFBX_HEADER_VERSION …
#define UFBX_VERSION …
ufbx_real;
ufbx_string;
ufbx_blob;
ufbx_vec2;
ufbx_vec3;
ufbx_vec4;
ufbx_quat;
ufbx_rotation_order;
UFBX_ENUM_TYPE(ufbx_rotation_order, UFBX_ROTATION_ORDER, UFBX_ROTATION_ORDER_SPHERIC);
ufbx_transform;
ufbx_matrix;
ufbx_void_list;
UFBX_LIST_TYPE(…) …;
UFBX_LIST_TYPE(…) …;
UFBX_LIST_TYPE(…) …;
UFBX_LIST_TYPE(…) …;
UFBX_LIST_TYPE(…) …;
UFBX_LIST_TYPE(…) …;
UFBX_LIST_TYPE(…) …;
#define UFBX_NO_INDEX …
ufbx_dom_value_type;
UFBX_ENUM_TYPE(ufbx_dom_value_type, UFBX_DOM_VALUE_TYPE, UFBX_DOM_VALUE_ARRAY_IGNORED);
ufbx_dom_node;
ufbx_dom_value;
UFBX_LIST_TYPE(ufbx_dom_node_list, ufbx_dom_node … } ;
UFBX_LIST_TYPE(…) …;
struct ufbx_dom_node { … };
ufbx_prop;
ufbx_props;
ufbx_prop_type;
UFBX_ENUM_TYPE(ufbx_prop_type, UFBX_PROP_TYPE, UFBX_PROP_REFERENCE);
ufbx_prop_flags;
struct ufbx_prop { … };
UFBX_LIST_TYPE(…) …;
struct ufbx_props { … };
ufbx_scene;
ufbx_element;
ufbx_unknown;
ufbx_node;
ufbx_mesh;
ufbx_light;
ufbx_camera;
ufbx_bone;
ufbx_empty;
ufbx_line_curve;
ufbx_nurbs_curve;
ufbx_nurbs_surface;
ufbx_nurbs_trim_surface;
ufbx_nurbs_trim_boundary;
ufbx_procedural_geometry;
ufbx_stereo_camera;
ufbx_camera_switcher;
ufbx_marker;
ufbx_lod_group;
ufbx_skin_deformer;
ufbx_skin_cluster;
ufbx_blend_deformer;
ufbx_blend_channel;
ufbx_blend_shape;
ufbx_cache_deformer;
ufbx_cache_file;
ufbx_material;
ufbx_texture;
ufbx_video;
ufbx_shader;
ufbx_shader_binding;
ufbx_anim_stack;
ufbx_anim_layer;
ufbx_anim_value;
ufbx_anim_curve;
ufbx_display_layer;
ufbx_selection_set;
ufbx_selection_node;
ufbx_character;
ufbx_constraint;
ufbx_audio_layer;
ufbx_audio_clip;
ufbx_pose;
ufbx_metadata_object;
UFBX_LIST_TYPE(ufbx_element_list, ufbx_element … } ;
UFBX_LIST_TYPE(ufbx_unknown_list, ufbx_unknown … } ;
UFBX_LIST_TYPE(ufbx_node_list, ufbx_node … } ;
UFBX_LIST_TYPE(ufbx_mesh_list, ufbx_mesh … } ;
UFBX_LIST_TYPE(ufbx_light_list, ufbx_light … } ;
UFBX_LIST_TYPE(ufbx_camera_list, ufbx_camera … } ;
UFBX_LIST_TYPE(ufbx_bone_list, ufbx_bone … } ;
UFBX_LIST_TYPE(ufbx_empty_list, ufbx_empty … } ;
UFBX_LIST_TYPE(ufbx_line_curve_list, ufbx_line_curve … } ;
UFBX_LIST_TYPE(ufbx_nurbs_curve_list, ufbx_nurbs_curve … } ;
UFBX_LIST_TYPE(ufbx_nurbs_surface_list, ufbx_nurbs_surface … } ;
UFBX_LIST_TYPE(ufbx_nurbs_trim_surface_list, ufbx_nurbs_trim_surface … } ;
UFBX_LIST_TYPE(ufbx_nurbs_trim_boundary_list, ufbx_nurbs_trim_boundary … } ;
UFBX_LIST_TYPE(ufbx_procedural_geometry_list, ufbx_procedural_geometry … } ;
UFBX_LIST_TYPE(ufbx_stereo_camera_list, ufbx_stereo_camera … } ;
UFBX_LIST_TYPE(ufbx_camera_switcher_list, ufbx_camera_switcher … } ;
UFBX_LIST_TYPE(ufbx_marker_list, ufbx_marker … } ;
UFBX_LIST_TYPE(ufbx_lod_group_list, ufbx_lod_group … } ;
UFBX_LIST_TYPE(ufbx_skin_deformer_list, ufbx_skin_deformer … } ;
UFBX_LIST_TYPE(ufbx_skin_cluster_list, ufbx_skin_cluster … } ;
UFBX_LIST_TYPE(ufbx_blend_deformer_list, ufbx_blend_deformer … } ;
UFBX_LIST_TYPE(ufbx_blend_channel_list, ufbx_blend_channel … } ;
UFBX_LIST_TYPE(ufbx_blend_shape_list, ufbx_blend_shape … } ;
UFBX_LIST_TYPE(ufbx_cache_deformer_list, ufbx_cache_deformer … } ;
UFBX_LIST_TYPE(ufbx_cache_file_list, ufbx_cache_file … } ;
UFBX_LIST_TYPE(ufbx_material_list, ufbx_material … } ;
UFBX_LIST_TYPE(ufbx_texture_list, ufbx_texture … } ;
UFBX_LIST_TYPE(ufbx_video_list, ufbx_video … } ;
UFBX_LIST_TYPE(ufbx_shader_list, ufbx_shader … } ;
UFBX_LIST_TYPE(ufbx_shader_binding_list, ufbx_shader_binding … } ;
UFBX_LIST_TYPE(ufbx_anim_stack_list, ufbx_anim_stack … } ;
UFBX_LIST_TYPE(ufbx_anim_layer_list, ufbx_anim_layer … } ;
UFBX_LIST_TYPE(ufbx_anim_value_list, ufbx_anim_value … } ;
UFBX_LIST_TYPE(ufbx_anim_curve_list, ufbx_anim_curve … } ;
UFBX_LIST_TYPE(ufbx_display_layer_list, ufbx_display_layer … } ;
UFBX_LIST_TYPE(ufbx_selection_set_list, ufbx_selection_set … } ;
UFBX_LIST_TYPE(ufbx_selection_node_list, ufbx_selection_node … } ;
UFBX_LIST_TYPE(ufbx_character_list, ufbx_character … } ;
UFBX_LIST_TYPE(ufbx_constraint_list, ufbx_constraint … } ;
UFBX_LIST_TYPE(ufbx_audio_layer_list, ufbx_audio_layer … } ;
UFBX_LIST_TYPE(ufbx_audio_clip_list, ufbx_audio_clip … } ;
UFBX_LIST_TYPE(ufbx_pose_list, ufbx_pose … } ;
UFBX_LIST_TYPE(ufbx_metadata_object_list, ufbx_metadata_object … } ;
ufbx_element_type;
UFBX_ENUM_TYPE(ufbx_element_type, UFBX_ELEMENT_TYPE, UFBX_ELEMENT_METADATA_OBJECT);
ufbx_connection;
UFBX_LIST_TYPE(…) …;
struct ufbx_element { … };
struct ufbx_unknown { … };
ufbx_inherit_mode;
UFBX_ENUM_TYPE(ufbx_inherit_mode, UFBX_INHERIT_MODE, UFBX_INHERIT_MODE_COMPONENTWISE_SCALE);
ufbx_mirror_axis;
UFBX_ENUM_TYPE(ufbx_mirror_axis, UFBX_MIRROR_AXIS, UFBX_MIRROR_AXIS_Z);
struct ufbx_node { … };
ufbx_vertex_attrib;
ufbx_vertex_real;
ufbx_vertex_vec2;
ufbx_vertex_vec3;
ufbx_vertex_vec4;
ufbx_uv_set;
ufbx_color_set;
UFBX_LIST_TYPE(…) …;
UFBX_LIST_TYPE(…) …;
ufbx_edge;
UFBX_LIST_TYPE(…) …;
ufbx_face;
UFBX_LIST_TYPE(…) …;
ufbx_mesh_part;
UFBX_LIST_TYPE(…) …;
ufbx_face_group;
UFBX_LIST_TYPE(…) …;
ufbx_subdivision_weight_range;
UFBX_LIST_TYPE(…) …;
ufbx_subdivision_weight;
UFBX_LIST_TYPE(…) …;
ufbx_subdivision_result;
ufbx_subdivision_display_mode;
UFBX_ENUM_TYPE(ufbx_subdivision_display_mode, UFBX_SUBDIVISION_DISPLAY_MODE, UFBX_SUBDIVISION_DISPLAY_SMOOTH);
ufbx_subdivision_boundary;
UFBX_ENUM_TYPE(ufbx_subdivision_boundary, UFBX_SUBDIVISION_BOUNDARY, UFBX_SUBDIVISION_BOUNDARY_SHARP_INTERIOR);
struct ufbx_mesh { … };
ufbx_light_type;
UFBX_ENUM_TYPE(ufbx_light_type, UFBX_LIGHT_TYPE, UFBX_LIGHT_VOLUME);
ufbx_light_decay;
UFBX_ENUM_TYPE(ufbx_light_decay, UFBX_LIGHT_DECAY, UFBX_LIGHT_DECAY_CUBIC);
ufbx_light_area_shape;
UFBX_ENUM_TYPE(ufbx_light_area_shape, UFBX_LIGHT_AREA_SHAPE, UFBX_LIGHT_AREA_SHAPE_SPHERE);
struct ufbx_light { … };
ufbx_projection_mode;
UFBX_ENUM_TYPE(ufbx_projection_mode, UFBX_PROJECTION_MODE, UFBX_PROJECTION_MODE_ORTHOGRAPHIC);
ufbx_aspect_mode;
UFBX_ENUM_TYPE(ufbx_aspect_mode, UFBX_ASPECT_MODE, UFBX_ASPECT_MODE_FIXED_HEIGHT);
ufbx_aperture_mode;
UFBX_ENUM_TYPE(ufbx_aperture_mode, UFBX_APERTURE_MODE, UFBX_APERTURE_MODE_FOCAL_LENGTH);
ufbx_gate_fit;
UFBX_ENUM_TYPE(ufbx_gate_fit, UFBX_GATE_FIT, UFBX_GATE_FIT_STRETCH);
ufbx_aperture_format;
UFBX_ENUM_TYPE(ufbx_aperture_format, UFBX_APERTURE_FORMAT, UFBX_APERTURE_FORMAT_IMAX);
ufbx_coordinate_axis;
UFBX_ENUM_TYPE(ufbx_coordinate_axis, UFBX_COORDINATE_AXIS, UFBX_COORDINATE_AXIS_UNKNOWN);
ufbx_coordinate_axes;
struct ufbx_camera { … };
struct ufbx_bone { … };
struct ufbx_empty { … };
ufbx_line_segment;
UFBX_LIST_TYPE(…) …;
struct ufbx_line_curve { … };
ufbx_nurbs_topology;
UFBX_ENUM_TYPE(ufbx_nurbs_topology, UFBX_NURBS_TOPOLOGY, UFBX_NURBS_TOPOLOGY_CLOSED);
ufbx_nurbs_basis;
struct ufbx_nurbs_curve { … };
struct ufbx_nurbs_surface { … };
struct ufbx_nurbs_trim_surface { … };
struct ufbx_nurbs_trim_boundary { … };
struct ufbx_procedural_geometry { … };
struct ufbx_stereo_camera { … };
struct ufbx_camera_switcher { … };
ufbx_marker_type;
UFBX_ENUM_TYPE(ufbx_marker_type, UFBX_MARKER_TYPE, UFBX_MARKER_IK_EFFECTOR);
struct ufbx_marker { … };
ufbx_lod_display;
UFBX_ENUM_TYPE(ufbx_lod_display, UFBX_LOD_DISPLAY, UFBX_LOD_DISPLAY_HIDE);
ufbx_lod_level;
UFBX_LIST_TYPE(…) …;
struct ufbx_lod_group { … };
ufbx_skinning_method;
UFBX_ENUM_TYPE(ufbx_skinning_method, UFBX_SKINNING_METHOD, UFBX_SKINNING_METHOD_BLENDED_DQ_LINEAR);
ufbx_skin_vertex;
UFBX_LIST_TYPE(…) …;
ufbx_skin_weight;
UFBX_LIST_TYPE(…) …;
struct ufbx_skin_deformer { … };
struct ufbx_skin_cluster { … };
struct ufbx_blend_deformer { … };
ufbx_blend_keyframe;
UFBX_LIST_TYPE(…) …;
struct ufbx_blend_channel { … };
struct ufbx_blend_shape { … };
ufbx_cache_file_format;
UFBX_ENUM_TYPE(ufbx_cache_file_format, UFBX_CACHE_FILE_FORMAT, UFBX_CACHE_FILE_FORMAT_MC);
ufbx_cache_data_format;
UFBX_ENUM_TYPE(ufbx_cache_data_format, UFBX_CACHE_DATA_FORMAT, UFBX_CACHE_DATA_FORMAT_VEC3_DOUBLE);
ufbx_cache_data_encoding;
UFBX_ENUM_TYPE(ufbx_cache_data_encoding, UFBX_CACHE_DATA_ENCODING, UFBX_CACHE_DATA_ENCODING_BIG_ENDIAN);
ufbx_cache_interpretation;
UFBX_ENUM_TYPE(ufbx_cache_interpretation, UFBX_CACHE_INTERPRETATION, UFBX_CACHE_INTERPRETATION_VERTEX_NORMAL);
ufbx_cache_frame;
UFBX_LIST_TYPE(…) …;
ufbx_cache_channel;
UFBX_LIST_TYPE(…) …;
ufbx_geometry_cache;
struct ufbx_cache_deformer { … };
struct ufbx_cache_file { … };
ufbx_material_map;
ufbx_material_feature_info;
ufbx_material_texture;
UFBX_LIST_TYPE(…) …;
ufbx_shader_type;
UFBX_ENUM_TYPE(ufbx_shader_type, UFBX_SHADER_TYPE, UFBX_SHADER_WAVEFRONT_MTL);
ufbx_material_fbx_map;
UFBX_ENUM_TYPE(ufbx_material_fbx_map, UFBX_MATERIAL_FBX_MAP, UFBX_MATERIAL_FBX_VECTOR_DISPLACEMENT);
ufbx_material_pbr_map;
UFBX_ENUM_TYPE(ufbx_material_pbr_map, UFBX_MATERIAL_PBR_MAP, UFBX_MATERIAL_PBR_TRANSMISSION_GLOSSINESS);
ufbx_material_feature;
UFBX_ENUM_TYPE(ufbx_material_feature, UFBX_MATERIAL_FEATURE, UFBX_MATERIAL_FEATURE_TRANSMISSION_ROUGHNESS_AS_GLOSSINESS);
ufbx_material_fbx_maps;
ufbx_material_pbr_maps;
ufbx_material_features;
struct ufbx_material { … };
ufbx_texture_type;
UFBX_ENUM_TYPE(ufbx_texture_type, UFBX_TEXTURE_TYPE, UFBX_TEXTURE_SHADER);
ufbx_blend_mode;
UFBX_ENUM_TYPE(ufbx_blend_mode, UFBX_BLEND_MODE, UFBX_BLEND_OVERLAY);
ufbx_wrap_mode;
UFBX_ENUM_TYPE(ufbx_wrap_mode, UFBX_WRAP_MODE, UFBX_WRAP_CLAMP);
ufbx_texture_layer;
UFBX_LIST_TYPE(…) …;
ufbx_shader_texture_type;
UFBX_ENUM_TYPE(ufbx_shader_texture_type, UFBX_SHADER_TEXTURE_TYPE, UFBX_SHADER_TEXTURE_OSL);
ufbx_shader_texture_input;
UFBX_LIST_TYPE(…) …;
ufbx_shader_texture;
ufbx_texture_file;
UFBX_LIST_TYPE(…) …;
struct ufbx_texture { … };
struct ufbx_video { … };
struct ufbx_shader { … };
ufbx_shader_prop_binding;
UFBX_LIST_TYPE(…) …;
struct ufbx_shader_binding { … };
ufbx_prop_override;
UFBX_LIST_TYPE(…) …;
ufbx_transform_override;
UFBX_LIST_TYPE(…) …;
ufbx_anim;
struct ufbx_anim_stack { … };
ufbx_anim_prop;
UFBX_LIST_TYPE(…) …;
struct ufbx_anim_layer { … };
struct ufbx_anim_value { … };
ufbx_interpolation;
UFBX_ENUM_TYPE(ufbx_interpolation, UFBX_INTERPOLATION, UFBX_INTERPOLATION_CUBIC);
ufbx_tangent;
ufbx_keyframe;
UFBX_LIST_TYPE(…) …;
struct ufbx_anim_curve { … };
struct ufbx_display_layer { … };
struct ufbx_selection_set { … };
struct ufbx_selection_node { … };
struct ufbx_character { … };
ufbx_constraint_type;
UFBX_ENUM_TYPE(ufbx_constraint_type, UFBX_CONSTRAINT_TYPE, UFBX_CONSTRAINT_SINGLE_CHAIN_IK);
ufbx_constraint_target;
UFBX_LIST_TYPE(…) …;
ufbx_constraint_aim_up_type;
UFBX_ENUM_TYPE(ufbx_constraint_aim_up_type, UFBX_CONSTRAINT_AIM_UP_TYPE, UFBX_CONSTRAINT_AIM_UP_NONE);
ufbx_constraint_ik_pole_type;
UFBX_ENUM_TYPE(ufbx_constraint_ik_pole_type, UFBX_CONSTRAINT_IK_POLE_TYPE, UFBX_CONSTRAINT_IK_POLE_NODE);
struct ufbx_constraint { … };
struct ufbx_audio_layer { … };
struct ufbx_audio_clip { … };
ufbx_bone_pose;
UFBX_LIST_TYPE(…) …;
struct ufbx_pose { … };
struct ufbx_metadata_object { … };
ufbx_name_element;
UFBX_LIST_TYPE(…) …;
ufbx_exporter;
UFBX_ENUM_TYPE(ufbx_exporter, UFBX_EXPORTER, UFBX_EXPORTER_MOTION_BUILDER);
ufbx_application;
ufbx_file_format;
UFBX_ENUM_TYPE(ufbx_file_format, UFBX_FILE_FORMAT, UFBX_FILE_FORMAT_MTL);
ufbx_warning_type;
UFBX_ENUM_TYPE(ufbx_warning_type, UFBX_WARNING_TYPE, UFBX_WARNING_UNKNOWN_OBJ_DIRECTIVE);
ufbx_warning;
UFBX_LIST_TYPE(…) …;
ufbx_thumbnail_format;
UFBX_ENUM_TYPE(ufbx_thumbnail_format, UFBX_THUMBNAIL_FORMAT, UFBX_THUMBNAIL_FORMAT_RGBA_32);
ufbx_space_conversion;
UFBX_ENUM_TYPE(ufbx_space_conversion, UFBX_SPACE_CONVERSION, UFBX_SPACE_CONVERSION_MODIFY_GEOMETRY);
ufbx_thumbnail;
ufbx_metadata;
ufbx_time_mode;
UFBX_ENUM_TYPE(ufbx_time_mode, UFBX_TIME_MODE, UFBX_TIME_MODE_59_94_FPS);
ufbx_time_protocol;
UFBX_ENUM_TYPE(ufbx_time_protocol, UFBX_TIME_PROTOCOL, UFBX_TIME_PROTOCOL_DEFAULT);
ufbx_snap_mode;
UFBX_ENUM_TYPE(ufbx_snap_mode, UFBX_SNAP_MODE, UFBX_SNAP_MODE_SNAP_AND_PLAY);
ufbx_scene_settings;
struct ufbx_scene { … };
ufbx_curve_point;
ufbx_surface_point;
ufbx_topo_flags;
ufbx_topo_edge;
ufbx_vertex_stream;
ufbx_alloc_fn;
ufbx_realloc_fn;
ufbx_free_fn;
ufbx_free_allocator_fn;
ufbx_allocator;
ufbx_allocator_opts;
ufbx_read_fn;
ufbx_skip_fn;
ufbx_close_fn;
ufbx_stream;
ufbx_open_file_type;
UFBX_ENUM_TYPE(ufbx_open_file_type, UFBX_OPEN_FILE_TYPE, UFBX_OPEN_FILE_OBJ_MTL);
ufbx_open_file_info;
ufbx_open_file_fn;
ufbx_open_file_cb;
ufbx_close_memory_fn;
ufbx_close_memory_cb;
ufbx_open_memory_opts;
ufbx_error_frame;
ufbx_error_type;
UFBX_ENUM_TYPE(ufbx_error_type, UFBX_ERROR_TYPE, UFBX_ERROR_DUPLICATE_OVERRIDE);
ufbx_error;
ufbx_progress;
ufbx_progress_result;
ufbx_progress_fn;
ufbx_progress_cb;
ufbx_inflate_input;
ufbx_inflate_retain;
struct ufbx_inflate_input { … };
struct ufbx_inflate_retain { … };
ufbx_index_error_handling;
UFBX_ENUM_TYPE(ufbx_index_error_handling, UFBX_INDEX_ERROR_HANDLING, UFBX_INDEX_ERROR_HANDLING_UNSAFE_IGNORE);
ufbx_unicode_error_handling;
UFBX_ENUM_TYPE(ufbx_unicode_error_handling, UFBX_UNICODE_ERROR_HANDLING, UFBX_UNICODE_ERROR_HANDLING_UNSAFE_IGNORE);
ufbx_geometry_transform_handling;
UFBX_ENUM_TYPE(ufbx_geometry_transform_handling, UFBX_GEOMETRY_TRANSFORM_HANDLING, UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK);
ufbx_inherit_mode_handling;
UFBX_ENUM_TYPE(ufbx_inherit_mode_handling, UFBX_INHERIT_MODE_HANDLING, UFBX_INHERIT_MODE_HANDLING_IGNORE);
ufbx_pivot_handling;
UFBX_ENUM_TYPE(ufbx_pivot_handling, UFBX_PIVOT_HANDLING, UFBX_PIVOT_HANDLING_ADJUST_TO_PIVOT);
ufbx_baked_key_flags;
ufbx_baked_vec3;
UFBX_LIST_TYPE(…) …;
ufbx_baked_quat;
UFBX_LIST_TYPE(…) …;
ufbx_baked_node;
UFBX_LIST_TYPE(…) …;
ufbx_baked_prop;
UFBX_LIST_TYPE(…) …;
ufbx_baked_element;
UFBX_LIST_TYPE(…) …;
ufbx_baked_anim_metadata;
ufbx_baked_anim;
ufbx_thread_pool_context;
ufbx_thread_pool_info;
ufbx_thread_pool_init_fn;
ufbx_thread_pool_run_fn;
ufbx_thread_pool_wait_fn;
ufbx_thread_pool_free_fn;
ufbx_thread_pool;
ufbx_thread_opts;
ufbx_load_opts;
ufbx_evaluate_opts;
UFBX_LIST_TYPE(ufbx_const_uint32_list, … } ;
UFBX_LIST_TYPE(ufbx_const_real_list, … } ;
ufbx_prop_override_desc;
UFBX_LIST_TYPE(ufbx_const_prop_override_desc_list, … } ;
UFBX_LIST_TYPE(ufbx_const_transform_override_list, … } ;
ufbx_anim_opts;
ufbx_bake_step_handling;
UFBX_ENUM_TYPE(ufbx_bake_step_handling, UFBX_BAKE_STEP_HANDLING, UFBX_BAKE_STEP_HANDLING_IGNORE);
ufbx_bake_opts;
ufbx_tessellate_curve_opts;
ufbx_tessellate_surface_opts;
ufbx_subdivide_opts;
ufbx_geometry_cache_opts;
ufbx_geometry_cache_data_opts;
ufbx_panic;
#ifdef __cplusplus
extern "C" {
#endif
ufbx_abi_data const ufbx_string ufbx_empty_string;
ufbx_abi_data const ufbx_blob ufbx_empty_blob;
ufbx_abi_data const ufbx_matrix ufbx_identity_matrix;
ufbx_abi_data const ufbx_transform ufbx_identity_transform;
ufbx_abi_data const ufbx_vec2 ufbx_zero_vec2;
ufbx_abi_data const ufbx_vec3 ufbx_zero_vec3;
ufbx_abi_data const ufbx_vec4 ufbx_zero_vec4;
ufbx_abi_data const ufbx_quat ufbx_identity_quat;
ufbx_abi_data const ufbx_coordinate_axes ufbx_axes_right_handed_y_up;
ufbx_abi_data const ufbx_coordinate_axes ufbx_axes_right_handed_z_up;
ufbx_abi_data const ufbx_coordinate_axes ufbx_axes_left_handed_y_up;
ufbx_abi_data const ufbx_coordinate_axes ufbx_axes_left_handed_z_up;
ufbx_abi_data const size_t ufbx_element_type_size[UFBX_ELEMENT_TYPE_COUNT];
ufbx_abi_data const uint32_t ufbx_source_version;
ufbx_abi bool ufbx_is_thread_safe(void);
ufbx_abi ufbx_scene *ufbx_load_memory(
const void *data, size_t data_size,
const ufbx_load_opts *opts, ufbx_error *error);
ufbx_abi ufbx_scene *ufbx_load_file(
const char *filename,
const ufbx_load_opts *opts, ufbx_error *error);
ufbx_abi ufbx_scene *ufbx_load_file_len(
const char *filename, size_t filename_len,
const ufbx_load_opts *opts, ufbx_error *error);
ufbx_abi ufbx_scene *ufbx_load_stdio(
void *file,
const ufbx_load_opts *opts, ufbx_error *error);
ufbx_abi ufbx_scene *ufbx_load_stdio_prefix(
void *file,
const void *prefix, size_t prefix_size,
const ufbx_load_opts *opts, ufbx_error *error);
ufbx_abi ufbx_scene *ufbx_load_stream(
const ufbx_stream *stream,
const ufbx_load_opts *opts, ufbx_error *error);
ufbx_abi ufbx_scene *ufbx_load_stream_prefix(
const ufbx_stream *stream,
const void *prefix, size_t prefix_size,
const ufbx_load_opts *opts, ufbx_error *error);
ufbx_abi void ufbx_free_scene(ufbx_scene *scene);
ufbx_abi void ufbx_retain_scene(ufbx_scene *scene);
ufbx_abi size_t ufbx_format_error(char *dst, size_t dst_size, const ufbx_error *error);
ufbx_abi ufbx_prop *ufbx_find_prop_len(const ufbx_props *props, const char *name, size_t name_len);
ufbx_inline ufbx_prop *ufbx_find_prop(const ufbx_props *props, const char *name) { … }
ufbx_abi ufbx_real ufbx_find_real_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_real def);
ufbx_inline ufbx_real ufbx_find_real(const ufbx_props *props, const char *name, ufbx_real def) { … }
ufbx_abi ufbx_vec3 ufbx_find_vec3_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_vec3 def);
ufbx_inline ufbx_vec3 ufbx_find_vec3(const ufbx_props *props, const char *name, ufbx_vec3 def) { … }
ufbx_abi int64_t ufbx_find_int_len(const ufbx_props *props, const char *name, size_t name_len, int64_t def);
ufbx_inline int64_t ufbx_find_int(const ufbx_props *props, const char *name, int64_t def) { … }
ufbx_abi bool ufbx_find_bool_len(const ufbx_props *props, const char *name, size_t name_len, bool def);
ufbx_inline bool ufbx_find_bool(const ufbx_props *props, const char *name, bool def) { … }
ufbx_abi ufbx_string ufbx_find_string_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_string def);
ufbx_inline ufbx_string ufbx_find_string(const ufbx_props *props, const char *name, ufbx_string def) { … }
ufbx_abi ufbx_blob ufbx_find_blob_len(const ufbx_props *props, const char *name, size_t name_len, ufbx_blob def);
ufbx_inline ufbx_blob ufbx_find_blob(const ufbx_props *props, const char *name, ufbx_blob def) { … }
ufbx_abi ufbx_prop *ufbx_find_prop_concat(const ufbx_props *props, const ufbx_string *parts, size_t num_parts);
ufbx_abi ufbx_element *ufbx_get_prop_element(const ufbx_element *element, const ufbx_prop *prop, ufbx_element_type type);
ufbx_abi ufbx_element *ufbx_find_prop_element_len(const ufbx_element *element, const char *name, size_t name_len, ufbx_element_type type);
ufbx_inline ufbx_element *ufbx_find_prop_element(const ufbx_element *element, const char *name, ufbx_element_type type) { … }
ufbx_abi ufbx_element *ufbx_find_element_len(const ufbx_scene *scene, ufbx_element_type type, const char *name, size_t name_len);
ufbx_inline ufbx_element *ufbx_find_element(const ufbx_scene *scene, ufbx_element_type type, const char *name) { … }
ufbx_abi ufbx_node *ufbx_find_node_len(const ufbx_scene *scene, const char *name, size_t name_len);
ufbx_inline ufbx_node *ufbx_find_node(const ufbx_scene *scene, const char *name) { … }
ufbx_abi ufbx_anim_stack *ufbx_find_anim_stack_len(const ufbx_scene *scene, const char *name, size_t name_len);
ufbx_inline ufbx_anim_stack *ufbx_find_anim_stack(const ufbx_scene *scene, const char *name) { … }
ufbx_abi ufbx_material *ufbx_find_material_len(const ufbx_scene *scene, const char *name, size_t name_len);
ufbx_inline ufbx_material *ufbx_find_material(const ufbx_scene *scene, const char *name) { … }
ufbx_abi ufbx_anim_prop *ufbx_find_anim_prop_len(const ufbx_anim_layer *layer, const ufbx_element *element, const char *prop, size_t prop_len);
ufbx_inline ufbx_anim_prop *ufbx_find_anim_prop(const ufbx_anim_layer *layer, const ufbx_element *element, const char *prop) { … }
ufbx_abi ufbx_anim_prop_list ufbx_find_anim_props(const ufbx_anim_layer *layer, const ufbx_element *element);
ufbx_abi ufbx_matrix ufbx_get_compatible_matrix_for_normals(const ufbx_node *node);
ufbx_abi ptrdiff_t ufbx_inflate(void *dst, size_t dst_size, const ufbx_inflate_input *input, ufbx_inflate_retain *retain);
ufbx_abi bool ufbx_open_file(ufbx_stream *stream, const char *path, size_t path_len);
ufbx_abi bool ufbx_default_open_file(void *user, ufbx_stream *stream, const char *path, size_t path_len, const ufbx_open_file_info *info);
ufbx_abi bool ufbx_open_memory(ufbx_stream *stream, const void *data, size_t data_size, const ufbx_open_memory_opts *opts, ufbx_error *error);
ufbx_abi ufbx_real ufbx_evaluate_curve(const ufbx_anim_curve *curve, double time, ufbx_real default_value);
ufbx_abi ufbx_real ufbx_evaluate_anim_value_real(const ufbx_anim_value *anim_value, double time);
ufbx_abi ufbx_vec3 ufbx_evaluate_anim_value_vec3(const ufbx_anim_value *anim_value, double time);
ufbx_abi ufbx_prop ufbx_evaluate_prop_len(const ufbx_anim *anim, const ufbx_element *element, const char *name, size_t name_len, double time);
ufbx_inline ufbx_prop ufbx_evaluate_prop(const ufbx_anim *anim, const ufbx_element *element, const char *name, double time) { … }
ufbx_abi ufbx_props ufbx_evaluate_props(const ufbx_anim *anim, const ufbx_element *element, double time, ufbx_prop *buffer, size_t buffer_size);
ufbx_transform_flags;
ufbx_abi ufbx_transform ufbx_evaluate_transform(const ufbx_anim *anim, const ufbx_node *node, double time);
ufbx_abi ufbx_transform ufbx_evaluate_transform_flags(const ufbx_anim *anim, const ufbx_node *node, double time, uint32_t flags);
ufbx_abi ufbx_real ufbx_evaluate_blend_weight(const ufbx_anim *anim, const ufbx_blend_channel *channel, double time);
ufbx_abi ufbx_scene *ufbx_evaluate_scene(const ufbx_scene *scene, const ufbx_anim *anim, double time, const ufbx_evaluate_opts *opts, ufbx_error *error);
ufbx_abi ufbx_anim *ufbx_create_anim(const ufbx_scene *scene, const ufbx_anim_opts *opts, ufbx_error *error);
ufbx_abi void ufbx_free_anim(ufbx_anim *anim);
ufbx_abi void ufbx_retain_anim(ufbx_anim *anim);
ufbx_abi ufbx_baked_anim *ufbx_bake_anim(const ufbx_scene *scene, const ufbx_anim *anim, const ufbx_bake_opts *opts, ufbx_error *error);
ufbx_abi void ufbx_retain_baked_anim(ufbx_baked_anim *bake);
ufbx_abi void ufbx_free_baked_anim(ufbx_baked_anim *bake);
ufbx_abi ufbx_baked_node *ufbx_find_baked_node_by_typed_id(ufbx_baked_anim *bake, uint32_t typed_id);
ufbx_abi ufbx_baked_node *ufbx_find_baked_node(ufbx_baked_anim *bake, ufbx_node *node);
ufbx_abi ufbx_baked_element *ufbx_find_baked_element_by_element_id(ufbx_baked_anim *bake, uint32_t element_id);
ufbx_abi ufbx_baked_element *ufbx_find_baked_element(ufbx_baked_anim *bake, ufbx_element *element);
ufbx_abi ufbx_vec3 ufbx_evaluate_baked_vec3(ufbx_baked_vec3_list keyframes, double time);
ufbx_abi ufbx_quat ufbx_evaluate_baked_quat(ufbx_baked_quat_list keyframes, double time);
ufbx_abi ufbx_bone_pose *ufbx_get_bone_pose(const ufbx_pose *pose, const ufbx_node *node);
ufbx_abi ufbx_texture *ufbx_find_prop_texture_len(const ufbx_material *material, const char *name, size_t name_len);
ufbx_inline ufbx_texture *ufbx_find_prop_texture(const ufbx_material *material, const char *name) { … }
ufbx_abi ufbx_string ufbx_find_shader_prop_len(const ufbx_shader *shader, const char *name, size_t name_len);
ufbx_inline ufbx_string ufbx_find_shader_prop(const ufbx_shader *shader, const char *name) { … }
ufbx_abi ufbx_shader_prop_binding_list ufbx_find_shader_prop_bindings_len(const ufbx_shader *shader, const char *name, size_t name_len);
ufbx_inline ufbx_shader_prop_binding_list ufbx_find_shader_prop_bindings(const ufbx_shader *shader, const char *name) { … }
ufbx_abi ufbx_shader_texture_input *ufbx_find_shader_texture_input_len(const ufbx_shader_texture *shader, const char *name, size_t name_len);
ufbx_inline ufbx_shader_texture_input *ufbx_find_shader_texture_input(const ufbx_shader_texture *shader, const char *name) { … }
ufbx_abi bool ufbx_coordinate_axes_valid(ufbx_coordinate_axes axes);
ufbx_abi ufbx_vec3 ufbx_vec3_normalize(ufbx_vec3 v);
ufbx_abi ufbx_real ufbx_quat_dot(ufbx_quat a, ufbx_quat b);
ufbx_abi ufbx_quat ufbx_quat_mul(ufbx_quat a, ufbx_quat b);
ufbx_abi ufbx_quat ufbx_quat_normalize(ufbx_quat q);
ufbx_abi ufbx_quat ufbx_quat_fix_antipodal(ufbx_quat q, ufbx_quat reference);
ufbx_abi ufbx_quat ufbx_quat_slerp(ufbx_quat a, ufbx_quat b, ufbx_real t);
ufbx_abi ufbx_vec3 ufbx_quat_rotate_vec3(ufbx_quat q, ufbx_vec3 v);
ufbx_abi ufbx_vec3 ufbx_quat_to_euler(ufbx_quat q, ufbx_rotation_order order);
ufbx_abi ufbx_quat ufbx_euler_to_quat(ufbx_vec3 v, ufbx_rotation_order order);
ufbx_abi ufbx_matrix ufbx_matrix_mul(const ufbx_matrix *a, const ufbx_matrix *b);
ufbx_abi ufbx_real ufbx_matrix_determinant(const ufbx_matrix *m);
ufbx_abi ufbx_matrix ufbx_matrix_invert(const ufbx_matrix *m);
ufbx_abi ufbx_matrix ufbx_matrix_for_normals(const ufbx_matrix *m);
ufbx_abi ufbx_vec3 ufbx_transform_position(const ufbx_matrix *m, ufbx_vec3 v);
ufbx_abi ufbx_vec3 ufbx_transform_direction(const ufbx_matrix *m, ufbx_vec3 v);
ufbx_abi ufbx_matrix ufbx_transform_to_matrix(const ufbx_transform *t);
ufbx_abi ufbx_transform ufbx_matrix_to_transform(const ufbx_matrix *m);
ufbx_abi ufbx_matrix ufbx_catch_get_skin_vertex_matrix(ufbx_panic *panic, const ufbx_skin_deformer *skin, size_t vertex, const ufbx_matrix *fallback);
ufbx_inline ufbx_matrix ufbx_get_skin_vertex_matrix(const ufbx_skin_deformer *skin, size_t vertex, const ufbx_matrix *fallback) { … }
ufbx_abi uint32_t ufbx_get_blend_shape_offset_index(const ufbx_blend_shape *shape, size_t vertex);
ufbx_abi ufbx_vec3 ufbx_get_blend_shape_vertex_offset(const ufbx_blend_shape *shape, size_t vertex);
ufbx_abi ufbx_vec3 ufbx_get_blend_vertex_offset(const ufbx_blend_deformer *blend, size_t vertex);
ufbx_abi void ufbx_add_blend_shape_vertex_offsets(const ufbx_blend_shape *shape, ufbx_vec3 *vertices, size_t num_vertices, ufbx_real weight);
ufbx_abi void ufbx_add_blend_vertex_offsets(const ufbx_blend_deformer *blend, ufbx_vec3 *vertices, size_t num_vertices, ufbx_real weight);
ufbx_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);
ufbx_abi ufbx_curve_point ufbx_evaluate_nurbs_curve(const ufbx_nurbs_curve *curve, ufbx_real u);
ufbx_abi ufbx_surface_point ufbx_evaluate_nurbs_surface(const ufbx_nurbs_surface *surface, ufbx_real u, ufbx_real v);
ufbx_abi ufbx_line_curve *ufbx_tessellate_nurbs_curve(const ufbx_nurbs_curve *curve, const ufbx_tessellate_curve_opts *opts, ufbx_error *error);
ufbx_abi ufbx_mesh *ufbx_tessellate_nurbs_surface(const ufbx_nurbs_surface *surface, const ufbx_tessellate_surface_opts *opts, ufbx_error *error);
ufbx_abi void ufbx_free_line_curve(ufbx_line_curve *curve);
ufbx_abi void ufbx_retain_line_curve(ufbx_line_curve *curve);
ufbx_abi uint32_t ufbx_find_face_index(ufbx_mesh *mesh, size_t index);
ufbx_abi uint32_t ufbx_catch_triangulate_face(ufbx_panic *panic, uint32_t *indices, size_t num_indices, const ufbx_mesh *mesh, ufbx_face face);
ufbx_inline uint32_t ufbx_triangulate_face(uint32_t *indices, size_t num_indices, const ufbx_mesh *mesh, ufbx_face face) { … }
ufbx_abi void ufbx_catch_compute_topology(ufbx_panic *panic, const ufbx_mesh *mesh, ufbx_topo_edge *topo, size_t num_topo);
ufbx_inline void ufbx_compute_topology(const ufbx_mesh *mesh, ufbx_topo_edge *topo, size_t num_topo) { … }
ufbx_abi uint32_t ufbx_catch_topo_next_vertex_edge(ufbx_panic *panic, const ufbx_topo_edge *topo, size_t num_topo, uint32_t index);
ufbx_inline uint32_t ufbx_topo_next_vertex_edge(const ufbx_topo_edge *topo, size_t num_topo, uint32_t index) { … }
ufbx_abi uint32_t ufbx_catch_topo_prev_vertex_edge(ufbx_panic *panic, const ufbx_topo_edge *topo, size_t num_topo, uint32_t index);
ufbx_inline uint32_t ufbx_topo_prev_vertex_edge(const ufbx_topo_edge *topo, size_t num_topo, uint32_t index) { … }
ufbx_abi ufbx_vec3 ufbx_catch_get_weighted_face_normal(ufbx_panic *panic, const ufbx_vertex_vec3 *positions, ufbx_face face);
ufbx_inline ufbx_vec3 ufbx_get_weighted_face_normal(const ufbx_vertex_vec3 *positions, ufbx_face face) { … }
ufbx_abi size_t ufbx_catch_generate_normal_mapping(ufbx_panic *panic, const ufbx_mesh *mesh,
const ufbx_topo_edge *topo, size_t num_topo,
uint32_t *normal_indices, size_t num_normal_indices, bool assume_smooth);
ufbx_abi size_t ufbx_generate_normal_mapping(const ufbx_mesh *mesh,
const ufbx_topo_edge *topo, size_t num_topo,
uint32_t *normal_indices, size_t num_normal_indices, bool assume_smooth);
ufbx_abi void ufbx_catch_compute_normals(ufbx_panic *panic, const ufbx_mesh *mesh, const ufbx_vertex_vec3 *positions,
const uint32_t *normal_indices, size_t num_normal_indices,
ufbx_vec3 *normals, size_t num_normals);
ufbx_abi void ufbx_compute_normals(const ufbx_mesh *mesh, const ufbx_vertex_vec3 *positions,
const uint32_t *normal_indices, size_t num_normal_indices,
ufbx_vec3 *normals, size_t num_normals);
ufbx_abi ufbx_mesh *ufbx_subdivide_mesh(const ufbx_mesh *mesh, size_t level, const ufbx_subdivide_opts *opts, ufbx_error *error);
ufbx_abi void ufbx_free_mesh(ufbx_mesh *mesh);
ufbx_abi void ufbx_retain_mesh(ufbx_mesh *mesh);
ufbx_abi ufbx_geometry_cache *ufbx_load_geometry_cache(
const char *filename,
const ufbx_geometry_cache_opts *opts, ufbx_error *error);
ufbx_abi ufbx_geometry_cache *ufbx_load_geometry_cache_len(
const char *filename, size_t filename_len,
const ufbx_geometry_cache_opts *opts, ufbx_error *error);
ufbx_abi void ufbx_free_geometry_cache(ufbx_geometry_cache *cache);
ufbx_abi void ufbx_retain_geometry_cache(ufbx_geometry_cache *cache);
ufbx_abi size_t ufbx_read_geometry_cache_real(const ufbx_cache_frame *frame, ufbx_real *data, size_t num_data, const ufbx_geometry_cache_data_opts *opts);
ufbx_abi size_t ufbx_read_geometry_cache_vec3(const ufbx_cache_frame *frame, ufbx_vec3 *data, size_t num_data, const ufbx_geometry_cache_data_opts *opts);
ufbx_abi size_t ufbx_sample_geometry_cache_real(const ufbx_cache_channel *channel, double time, ufbx_real *data, size_t num_data, const ufbx_geometry_cache_data_opts *opts);
ufbx_abi size_t ufbx_sample_geometry_cache_vec3(const ufbx_cache_channel *channel, double time, ufbx_vec3 *data, size_t num_data, const ufbx_geometry_cache_data_opts *opts);
ufbx_abi ufbx_dom_node *ufbx_dom_find_len(const ufbx_dom_node *parent, const char *name, size_t name_len);
ufbx_inline ufbx_dom_node *ufbx_dom_find(const ufbx_dom_node *parent, const char *name) { … }
ufbx_abi size_t ufbx_generate_indices(const ufbx_vertex_stream *streams, size_t num_streams, uint32_t *indices, size_t num_indices, const ufbx_allocator_opts *allocator, ufbx_error *error);
ufbx_unsafe ufbx_abi void ufbx_thread_pool_run_task(ufbx_thread_pool_context ctx, uint32_t index);
ufbx_unsafe ufbx_abi void ufbx_thread_pool_set_user_ptr(ufbx_thread_pool_context ctx, void *user_ptr);
ufbx_unsafe ufbx_abi void *ufbx_thread_pool_get_user_ptr(ufbx_thread_pool_context ctx);
ufbx_abi ufbx_real ufbx_catch_get_vertex_real(ufbx_panic *panic, const ufbx_vertex_real *v, size_t index);
ufbx_abi ufbx_vec2 ufbx_catch_get_vertex_vec2(ufbx_panic *panic, const ufbx_vertex_vec2 *v, size_t index);
ufbx_abi ufbx_vec3 ufbx_catch_get_vertex_vec3(ufbx_panic *panic, const ufbx_vertex_vec3 *v, size_t index);
ufbx_abi ufbx_vec4 ufbx_catch_get_vertex_vec4(ufbx_panic *panic, const ufbx_vertex_vec4 *v, size_t index);
ufbx_inline ufbx_real ufbx_get_vertex_real(const ufbx_vertex_real *v, size_t index) { … }
ufbx_inline ufbx_vec2 ufbx_get_vertex_vec2(const ufbx_vertex_vec2 *v, size_t index) { … }
ufbx_inline ufbx_vec3 ufbx_get_vertex_vec3(const ufbx_vertex_vec3 *v, size_t index) { … }
ufbx_inline ufbx_vec4 ufbx_get_vertex_vec4(const ufbx_vertex_vec4 *v, size_t index) { … }
ufbx_abi ufbx_real ufbx_catch_get_vertex_w_vec3(ufbx_panic *panic, const ufbx_vertex_vec3 *v, size_t index);
ufbx_inline ufbx_real ufbx_get_vertex_w_vec3(const ufbx_vertex_vec3 *v, size_t index) { … }
ufbx_abi ufbx_unknown *ufbx_as_unknown(const ufbx_element *element);
ufbx_abi ufbx_node *ufbx_as_node(const ufbx_element *element);
ufbx_abi ufbx_mesh *ufbx_as_mesh(const ufbx_element *element);
ufbx_abi ufbx_light *ufbx_as_light(const ufbx_element *element);
ufbx_abi ufbx_camera *ufbx_as_camera(const ufbx_element *element);
ufbx_abi ufbx_bone *ufbx_as_bone(const ufbx_element *element);
ufbx_abi ufbx_empty *ufbx_as_empty(const ufbx_element *element);
ufbx_abi ufbx_line_curve *ufbx_as_line_curve(const ufbx_element *element);
ufbx_abi ufbx_nurbs_curve *ufbx_as_nurbs_curve(const ufbx_element *element);
ufbx_abi ufbx_nurbs_surface *ufbx_as_nurbs_surface(const ufbx_element *element);
ufbx_abi ufbx_nurbs_trim_surface *ufbx_as_nurbs_trim_surface(const ufbx_element *element);
ufbx_abi ufbx_nurbs_trim_boundary *ufbx_as_nurbs_trim_boundary(const ufbx_element *element);
ufbx_abi ufbx_procedural_geometry *ufbx_as_procedural_geometry(const ufbx_element *element);
ufbx_abi ufbx_stereo_camera *ufbx_as_stereo_camera(const ufbx_element *element);
ufbx_abi ufbx_camera_switcher *ufbx_as_camera_switcher(const ufbx_element *element);
ufbx_abi ufbx_marker *ufbx_as_marker(const ufbx_element *element);
ufbx_abi ufbx_lod_group *ufbx_as_lod_group(const ufbx_element *element);
ufbx_abi ufbx_skin_deformer *ufbx_as_skin_deformer(const ufbx_element *element);
ufbx_abi ufbx_skin_cluster *ufbx_as_skin_cluster(const ufbx_element *element);
ufbx_abi ufbx_blend_deformer *ufbx_as_blend_deformer(const ufbx_element *element);
ufbx_abi ufbx_blend_channel *ufbx_as_blend_channel(const ufbx_element *element);
ufbx_abi ufbx_blend_shape *ufbx_as_blend_shape(const ufbx_element *element);
ufbx_abi ufbx_cache_deformer *ufbx_as_cache_deformer(const ufbx_element *element);
ufbx_abi ufbx_cache_file *ufbx_as_cache_file(const ufbx_element *element);
ufbx_abi ufbx_material *ufbx_as_material(const ufbx_element *element);
ufbx_abi ufbx_texture *ufbx_as_texture(const ufbx_element *element);
ufbx_abi ufbx_video *ufbx_as_video(const ufbx_element *element);
ufbx_abi ufbx_shader *ufbx_as_shader(const ufbx_element *element);
ufbx_abi ufbx_shader_binding *ufbx_as_shader_binding(const ufbx_element *element);
ufbx_abi ufbx_anim_stack *ufbx_as_anim_stack(const ufbx_element *element);
ufbx_abi ufbx_anim_layer *ufbx_as_anim_layer(const ufbx_element *element);
ufbx_abi ufbx_anim_value *ufbx_as_anim_value(const ufbx_element *element);
ufbx_abi ufbx_anim_curve *ufbx_as_anim_curve(const ufbx_element *element);
ufbx_abi ufbx_display_layer *ufbx_as_display_layer(const ufbx_element *element);
ufbx_abi ufbx_selection_set *ufbx_as_selection_set(const ufbx_element *element);
ufbx_abi ufbx_selection_node *ufbx_as_selection_node(const ufbx_element *element);
ufbx_abi ufbx_character *ufbx_as_character(const ufbx_element *element);
ufbx_abi ufbx_constraint *ufbx_as_constraint(const ufbx_element *element);
ufbx_abi ufbx_audio_layer *ufbx_as_audio_layer(const ufbx_element *element);
ufbx_abi ufbx_audio_clip *ufbx_as_audio_clip(const ufbx_element *element);
ufbx_abi ufbx_pose *ufbx_as_pose(const ufbx_element *element);
ufbx_abi ufbx_metadata_object *ufbx_as_metadata_object(const ufbx_element *element);
#ifdef __cplusplus
}
#endif
#if UFBX_CPP11
struct ufbx_string_view {
const char *data;
size_t length;
ufbx_string_view() : data(nullptr), length(0) { }
ufbx_string_view(const char *data_, size_t length_) : data(data_), length(length_) { }
UFBX_CONVERSION_TO_IMPL(ufbx_string_view)
};
ufbx_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); }
ufbx_inline ufbx_prop *ufbx_find_prop(const ufbx_props *props, ufbx_string_view name) { return ufbx_find_prop_len(props, name.data, name.length); }
ufbx_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); }
ufbx_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); }
ufbx_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); }
ufbx_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); }
ufbx_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); }
ufbx_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); }
ufbx_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); }
ufbx_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); }
ufbx_inline ufbx_node *ufbx_find_node(const ufbx_scene *scene, ufbx_string_view name) { return ufbx_find_node_len(scene, name.data, name.length); }
ufbx_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); }
ufbx_inline ufbx_material *ufbx_find_material(const ufbx_scene *scene, ufbx_string_view name) { return ufbx_find_material_len(scene, name.data, name.length); }
ufbx_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); }
ufbx_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); }
ufbx_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); }
ufbx_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); }
ufbx_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); }
ufbx_inline ufbx_shader_texture_input *ufbx_find_shader_texture_input(const ufbx_shader_texture *shader, ufbx_string_view name) { return ufbx_find_shader_texture_input_len(shader, name.data, name.length); }
ufbx_inline ufbx_geometry_cache *ufbx_load_geometry_cache(ufbx_string_view filename, const ufbx_geometry_cache_opts *opts, ufbx_error *error) { return ufbx_load_geometry_cache_len(filename.data, filename.length, opts, error); }
ufbx_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); }
#endif
#if UFBX_CPP11
template <typename T>
struct ufbx_type_traits { enum { valid = 0 }; };
template<> struct ufbx_type_traits<ufbx_scene> {
enum { valid = 1 };
static void retain(ufbx_scene *ptr) { ufbx_retain_scene(ptr); }
static void free(ufbx_scene *ptr) { ufbx_free_scene(ptr); }
};
template<> struct ufbx_type_traits<ufbx_mesh> {
enum { valid = 1 };
static void retain(ufbx_mesh *ptr) { ufbx_retain_mesh(ptr); }
static void free(ufbx_mesh *ptr) { ufbx_free_mesh(ptr); }
};
template<> struct ufbx_type_traits<ufbx_line_curve> {
enum { valid = 1 };
static void retain(ufbx_line_curve *ptr) { ufbx_retain_line_curve(ptr); }
static void free(ufbx_line_curve *ptr) { ufbx_free_line_curve(ptr); }
};
template<> struct ufbx_type_traits<ufbx_geometry_cache> {
enum { valid = 1 };
static void retain(ufbx_geometry_cache *ptr) { ufbx_retain_geometry_cache(ptr); }
static void free(ufbx_geometry_cache *ptr) { ufbx_free_geometry_cache(ptr); }
};
template<> struct ufbx_type_traits<ufbx_anim> {
enum { valid = 1 };
static void retain(ufbx_anim *ptr) { ufbx_retain_anim(ptr); }
static void free(ufbx_anim *ptr) { ufbx_free_anim(ptr); }
};
template<> struct ufbx_type_traits<ufbx_baked_anim> {
enum { valid = 1 };
static void retain(ufbx_baked_anim *ptr) { ufbx_retain_baked_anim(ptr); }
static void free(ufbx_baked_anim *ptr) { ufbx_free_baked_anim(ptr); }
};
class ufbx_deleter {
public:
template <typename T>
void operator()(T *ptr) const {
static_assert(ufbx_type_traits<T>::valid, "ufbx_deleter() unsupported for type");
ufbx_type_traits<T>::free(ptr);
}
};
template <typename T>
class ufbx_unique_ptr {
T *ptr;
using traits = ufbx_type_traits<T>;
static_assert(ufbx_type_traits<T>::valid, "ufbx_unique_ptr unsupported for type");
public:
ufbx_unique_ptr() noexcept : ptr(nullptr) { }
explicit ufbx_unique_ptr(T *ptr_) noexcept : ptr(ptr_) { }
ufbx_unique_ptr(ufbx_unique_ptr &&ref) noexcept : ptr(ref.ptr) { ref.ptr = nullptr; }
~ufbx_unique_ptr() { traits::free(ptr); }
ufbx_unique_ptr &operator=(ufbx_unique_ptr &&ref) noexcept {
if (&ref == this) return *this;
ptr = ref.ptr;
ref.ptr = nullptr;
return *this;
}
void reset(T *new_ptr=nullptr) noexcept {
traits::free(ptr);
ptr = new_ptr;
}
void swap(ufbx_unique_ptr &ref) noexcept {
T *tmp = ptr;
ptr = ref.ptr;
ref.ptr = tmp;
}
T &operator*() const noexcept { return *ptr; }
T *operator->() const noexcept { return ptr; }
T *get() const noexcept { return ptr; }
explicit operator bool() const noexcept { return ptr != nullptr; }
};
template <typename T>
class ufbx_shared_ptr {
T *ptr;
using traits = ufbx_type_traits<T>;
static_assert(ufbx_type_traits<T>::valid, "ufbx_shared_ptr unsupported for type");
public:
ufbx_shared_ptr() noexcept : ptr(nullptr) { }
explicit ufbx_shared_ptr(T *ptr_) noexcept : ptr(ptr_) { }
ufbx_shared_ptr(const ufbx_shared_ptr &ref) noexcept : ptr(ref.ptr) { traits::retain(ref.ptr); }
ufbx_shared_ptr(ufbx_shared_ptr &&ref) noexcept : ptr(ref.ptr) { ref.ptr = nullptr; }
~ufbx_shared_ptr() { traits::free(ptr); }
ufbx_shared_ptr &operator=(const ufbx_shared_ptr &ref) noexcept {
if (&ref == this) return *this;
traits::free(ptr);
traits::retain(ref.ptr);
ptr = ref.ptr;
return *this;
}
ufbx_shared_ptr &operator=(ufbx_shared_ptr &&ref) noexcept {
if (&ref == this) return *this;
ptr = ref.ptr;
ref.ptr = nullptr;
return *this;
}
void reset(T *new_ptr=nullptr) noexcept {
traits::free(ptr);
ptr = new_ptr;
}
void swap(ufbx_shared_ptr &ref) noexcept {
T *tmp = ptr;
ptr = ref.ptr;
ref.ptr = tmp;
}
T &operator*() const noexcept { return *ptr; }
T *operator->() const noexcept { return ptr; }
T *get() const noexcept { return ptr; }
explicit operator bool() const noexcept { return ptr != nullptr; }
};
#endif
#define UFBX_Lcl_Translation …
#define UFBX_Lcl_Rotation …
#define UFBX_Lcl_Scaling …
#define UFBX_RotationOrder …
#define UFBX_ScalingPivot …
#define UFBX_RotationPivot …
#define UFBX_ScalingOffset …
#define UFBX_RotationOffset …
#define UFBX_PreRotation …
#define UFBX_PostRotation …
#define UFBX_Visibility …
#define UFBX_Weight …
#define UFBX_DeformPercent …
#if defined(_MSC_VER)
#pragma warning(pop)
#elif defined(__clang__)
#pragma clang diagnostic pop
#elif defined(__GNUC__)
#pragma GCC diagnostic pop
#endif
#endif