mirror of https://github.com/bkaradzic/bgfx
Updated cgltf.
This commit is contained in:
parent
c2acc14216
commit
f9e9a56879
|
@ -63,7 +63,7 @@
|
|||
* By passing null for the output pointer, users can find out how many floats are required in the
|
||||
* output buffer.
|
||||
*
|
||||
* `cgltf_accessor_num_components` is a tiny utility that tells you the dimensionality of
|
||||
* `cgltf_num_components` is a tiny utility that tells you the dimensionality of
|
||||
* a certain accessor type. This can be used before `cgltf_accessor_unpack_floats` to help allocate
|
||||
* the necessary amount of memory.
|
||||
*
|
||||
|
@ -99,6 +99,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
typedef size_t cgltf_size;
|
||||
typedef long long int cgltf_ssize;
|
||||
typedef float cgltf_float;
|
||||
typedef int cgltf_int;
|
||||
typedef unsigned int cgltf_uint;
|
||||
|
@ -109,6 +110,7 @@ typedef enum cgltf_file_type
|
|||
cgltf_file_type_invalid,
|
||||
cgltf_file_type_gltf,
|
||||
cgltf_file_type_glb,
|
||||
cgltf_file_type_max_enum
|
||||
} cgltf_file_type;
|
||||
|
||||
typedef enum cgltf_result
|
||||
|
@ -123,12 +125,13 @@ typedef enum cgltf_result
|
|||
cgltf_result_io_error,
|
||||
cgltf_result_out_of_memory,
|
||||
cgltf_result_legacy_gltf,
|
||||
cgltf_result_max_enum
|
||||
} cgltf_result;
|
||||
|
||||
typedef struct cgltf_memory_options
|
||||
{
|
||||
void* (*alloc)(void* user, cgltf_size size);
|
||||
void (*free) (void* user, void* ptr);
|
||||
void* (*alloc_func)(void* user, cgltf_size size);
|
||||
void (*free_func) (void* user, void* ptr);
|
||||
void* user_data;
|
||||
} cgltf_memory_options;
|
||||
|
||||
|
@ -152,6 +155,7 @@ typedef enum cgltf_buffer_view_type
|
|||
cgltf_buffer_view_type_invalid,
|
||||
cgltf_buffer_view_type_indices,
|
||||
cgltf_buffer_view_type_vertices,
|
||||
cgltf_buffer_view_type_max_enum
|
||||
} cgltf_buffer_view_type;
|
||||
|
||||
typedef enum cgltf_attribute_type
|
||||
|
@ -164,6 +168,8 @@ typedef enum cgltf_attribute_type
|
|||
cgltf_attribute_type_color,
|
||||
cgltf_attribute_type_joints,
|
||||
cgltf_attribute_type_weights,
|
||||
cgltf_attribute_type_custom,
|
||||
cgltf_attribute_type_max_enum
|
||||
} cgltf_attribute_type;
|
||||
|
||||
typedef enum cgltf_component_type
|
||||
|
@ -175,6 +181,7 @@ typedef enum cgltf_component_type
|
|||
cgltf_component_type_r_16u, /* UNSIGNED_SHORT */
|
||||
cgltf_component_type_r_32u, /* UNSIGNED_INT */
|
||||
cgltf_component_type_r_32f, /* FLOAT */
|
||||
cgltf_component_type_max_enum
|
||||
} cgltf_component_type;
|
||||
|
||||
typedef enum cgltf_type
|
||||
|
@ -187,6 +194,7 @@ typedef enum cgltf_type
|
|||
cgltf_type_mat2,
|
||||
cgltf_type_mat3,
|
||||
cgltf_type_mat4,
|
||||
cgltf_type_max_enum
|
||||
} cgltf_type;
|
||||
|
||||
typedef enum cgltf_primitive_type
|
||||
|
@ -198,6 +206,7 @@ typedef enum cgltf_primitive_type
|
|||
cgltf_primitive_type_triangles,
|
||||
cgltf_primitive_type_triangle_strip,
|
||||
cgltf_primitive_type_triangle_fan,
|
||||
cgltf_primitive_type_max_enum
|
||||
} cgltf_primitive_type;
|
||||
|
||||
typedef enum cgltf_alpha_mode
|
||||
|
@ -205,6 +214,7 @@ typedef enum cgltf_alpha_mode
|
|||
cgltf_alpha_mode_opaque,
|
||||
cgltf_alpha_mode_mask,
|
||||
cgltf_alpha_mode_blend,
|
||||
cgltf_alpha_mode_max_enum
|
||||
} cgltf_alpha_mode;
|
||||
|
||||
typedef enum cgltf_animation_path_type {
|
||||
|
@ -213,18 +223,21 @@ typedef enum cgltf_animation_path_type {
|
|||
cgltf_animation_path_type_rotation,
|
||||
cgltf_animation_path_type_scale,
|
||||
cgltf_animation_path_type_weights,
|
||||
cgltf_animation_path_type_max_enum
|
||||
} cgltf_animation_path_type;
|
||||
|
||||
typedef enum cgltf_interpolation_type {
|
||||
cgltf_interpolation_type_linear,
|
||||
cgltf_interpolation_type_step,
|
||||
cgltf_interpolation_type_cubic_spline,
|
||||
cgltf_interpolation_type_max_enum
|
||||
} cgltf_interpolation_type;
|
||||
|
||||
typedef enum cgltf_camera_type {
|
||||
cgltf_camera_type_invalid,
|
||||
cgltf_camera_type_perspective,
|
||||
cgltf_camera_type_orthographic,
|
||||
cgltf_camera_type_max_enum
|
||||
} cgltf_camera_type;
|
||||
|
||||
typedef enum cgltf_light_type {
|
||||
|
@ -232,12 +245,14 @@ typedef enum cgltf_light_type {
|
|||
cgltf_light_type_directional,
|
||||
cgltf_light_type_point,
|
||||
cgltf_light_type_spot,
|
||||
cgltf_light_type_max_enum
|
||||
} cgltf_light_type;
|
||||
|
||||
typedef enum cgltf_data_free_method {
|
||||
cgltf_data_free_method_none,
|
||||
cgltf_data_free_method_file_release,
|
||||
cgltf_data_free_method_memory_free,
|
||||
cgltf_data_free_method_max_enum
|
||||
} cgltf_data_free_method;
|
||||
|
||||
typedef struct cgltf_extras {
|
||||
|
@ -267,6 +282,7 @@ typedef enum cgltf_meshopt_compression_mode {
|
|||
cgltf_meshopt_compression_mode_attributes,
|
||||
cgltf_meshopt_compression_mode_triangles,
|
||||
cgltf_meshopt_compression_mode_indices,
|
||||
cgltf_meshopt_compression_mode_max_enum
|
||||
} cgltf_meshopt_compression_mode;
|
||||
|
||||
typedef enum cgltf_meshopt_compression_filter {
|
||||
|
@ -274,6 +290,7 @@ typedef enum cgltf_meshopt_compression_filter {
|
|||
cgltf_meshopt_compression_filter_octahedral,
|
||||
cgltf_meshopt_compression_filter_quaternion,
|
||||
cgltf_meshopt_compression_filter_exponential,
|
||||
cgltf_meshopt_compression_filter_max_enum
|
||||
} cgltf_meshopt_compression_filter;
|
||||
|
||||
typedef struct cgltf_meshopt_compression
|
||||
|
@ -856,6 +873,10 @@ cgltf_result cgltf_copy_extras_json(const cgltf_data* data, const cgltf_extras*
|
|||
#include <stdlib.h> /* For malloc, free, atoi, atof */
|
||||
#endif
|
||||
|
||||
#if CGLTF_VALIDATE_ENABLE_ASSERTS
|
||||
#include <assert.h>
|
||||
#endif
|
||||
|
||||
/* JSMN_PARENT_LINKS is necessary to make parsing large structures linear in input size */
|
||||
#define JSMN_PARENT_LINKS
|
||||
|
||||
|
@ -947,7 +968,7 @@ static void* cgltf_calloc(cgltf_options* options, size_t element_size, cgltf_siz
|
|||
{
|
||||
return NULL;
|
||||
}
|
||||
void* result = options->memory.alloc(options->memory.user_data, element_size * count);
|
||||
void* result = options->memory.alloc_func(options->memory.user_data, element_size * count);
|
||||
if (!result)
|
||||
{
|
||||
return NULL;
|
||||
|
@ -959,8 +980,8 @@ static void* cgltf_calloc(cgltf_options* options, size_t element_size, cgltf_siz
|
|||
static cgltf_result cgltf_default_file_read(const struct cgltf_memory_options* memory_options, const struct cgltf_file_options* file_options, const char* path, cgltf_size* size, void** data)
|
||||
{
|
||||
(void)file_options;
|
||||
void* (*memory_alloc)(void*, cgltf_size) = memory_options->alloc ? memory_options->alloc : &cgltf_default_alloc;
|
||||
void (*memory_free)(void*, void*) = memory_options->free ? memory_options->free : &cgltf_default_free;
|
||||
void* (*memory_alloc)(void*, cgltf_size) = memory_options->alloc_func ? memory_options->alloc_func : &cgltf_default_alloc;
|
||||
void (*memory_free)(void*, void*) = memory_options->free_func ? memory_options->free_func : &cgltf_default_free;
|
||||
|
||||
FILE* file = fopen(path, "rb");
|
||||
if (!file)
|
||||
|
@ -1022,7 +1043,7 @@ static cgltf_result cgltf_default_file_read(const struct cgltf_memory_options* m
|
|||
static void cgltf_default_file_release(const struct cgltf_memory_options* memory_options, const struct cgltf_file_options* file_options, void* data)
|
||||
{
|
||||
(void)file_options;
|
||||
void (*memfree)(void*, void*) = memory_options->free ? memory_options->free : &cgltf_default_free;
|
||||
void (*memfree)(void*, void*) = memory_options->free_func ? memory_options->free_func : &cgltf_default_free;
|
||||
memfree(memory_options->user_data, data);
|
||||
}
|
||||
|
||||
|
@ -1041,13 +1062,13 @@ cgltf_result cgltf_parse(const cgltf_options* options, const void* data, cgltf_s
|
|||
}
|
||||
|
||||
cgltf_options fixed_options = *options;
|
||||
if (fixed_options.memory.alloc == NULL)
|
||||
if (fixed_options.memory.alloc_func == NULL)
|
||||
{
|
||||
fixed_options.memory.alloc = &cgltf_default_alloc;
|
||||
fixed_options.memory.alloc_func = &cgltf_default_alloc;
|
||||
}
|
||||
if (fixed_options.memory.free == NULL)
|
||||
if (fixed_options.memory.free_func == NULL)
|
||||
{
|
||||
fixed_options.memory.free = &cgltf_default_free;
|
||||
fixed_options.memory.free_func = &cgltf_default_free;
|
||||
}
|
||||
|
||||
uint32_t tmp;
|
||||
|
@ -1212,8 +1233,8 @@ static void cgltf_combine_paths(char* path, const char* base, const char* uri)
|
|||
|
||||
static cgltf_result cgltf_load_buffer_file(const cgltf_options* options, cgltf_size size, const char* uri, const char* gltf_path, void** out_data)
|
||||
{
|
||||
void* (*memory_alloc)(void*, cgltf_size) = options->memory.alloc ? options->memory.alloc : &cgltf_default_alloc;
|
||||
void (*memory_free)(void*, void*) = options->memory.free ? options->memory.free : &cgltf_default_free;
|
||||
void* (*memory_alloc)(void*, cgltf_size) = options->memory.alloc_func ? options->memory.alloc_func : &cgltf_default_alloc;
|
||||
void (*memory_free)(void*, void*) = options->memory.free_func ? options->memory.free_func : &cgltf_default_free;
|
||||
cgltf_result (*file_read)(const struct cgltf_memory_options*, const struct cgltf_file_options*, const char*, cgltf_size*, void**) = options->file.read ? options->file.read : &cgltf_default_file_read;
|
||||
|
||||
char* path = (char*)memory_alloc(options->memory.user_data, strlen(uri) + strlen(gltf_path) + 1);
|
||||
|
@ -1239,8 +1260,8 @@ static cgltf_result cgltf_load_buffer_file(const cgltf_options* options, cgltf_s
|
|||
|
||||
cgltf_result cgltf_load_buffer_base64(const cgltf_options* options, cgltf_size size, const char* base64, void** out_data)
|
||||
{
|
||||
void* (*memory_alloc)(void*, cgltf_size) = options->memory.alloc ? options->memory.alloc : &cgltf_default_alloc;
|
||||
void (*memory_free)(void*, void*) = options->memory.free ? options->memory.free : &cgltf_default_free;
|
||||
void* (*memory_alloc)(void*, cgltf_size) = options->memory.alloc_func ? options->memory.alloc_func : &cgltf_default_alloc;
|
||||
void (*memory_free)(void*, void*) = options->memory.free_func ? options->memory.free_func : &cgltf_default_free;
|
||||
|
||||
unsigned char* data = (unsigned char*)memory_alloc(options->memory.user_data, size);
|
||||
if (!data)
|
||||
|
@ -1728,10 +1749,10 @@ void cgltf_free_extensions(cgltf_data* data, cgltf_extension* extensions, cgltf_
|
|||
{
|
||||
for (cgltf_size i = 0; i < extensions_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, extensions[i].name);
|
||||
data->memory.free(data->memory.user_data, extensions[i].data);
|
||||
data->memory.free_func(data->memory.user_data, extensions[i].name);
|
||||
data->memory.free_func(data->memory.user_data, extensions[i].data);
|
||||
}
|
||||
data->memory.free(data->memory.user_data, extensions);
|
||||
data->memory.free_func(data->memory.user_data, extensions);
|
||||
}
|
||||
|
||||
void cgltf_free(cgltf_data* data)
|
||||
|
@ -1743,16 +1764,16 @@ void cgltf_free(cgltf_data* data)
|
|||
|
||||
void (*file_release)(const struct cgltf_memory_options*, const struct cgltf_file_options*, void* data) = data->file.release ? data->file.release : cgltf_default_file_release;
|
||||
|
||||
data->memory.free(data->memory.user_data, data->asset.copyright);
|
||||
data->memory.free(data->memory.user_data, data->asset.generator);
|
||||
data->memory.free(data->memory.user_data, data->asset.version);
|
||||
data->memory.free(data->memory.user_data, data->asset.min_version);
|
||||
data->memory.free_func(data->memory.user_data, data->asset.copyright);
|
||||
data->memory.free_func(data->memory.user_data, data->asset.generator);
|
||||
data->memory.free_func(data->memory.user_data, data->asset.version);
|
||||
data->memory.free_func(data->memory.user_data, data->asset.min_version);
|
||||
|
||||
cgltf_free_extensions(data, data->asset.extensions, data->asset.extensions_count);
|
||||
|
||||
for (cgltf_size i = 0; i < data->accessors_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->accessors[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->accessors[i].name);
|
||||
|
||||
if(data->accessors[i].is_sparse)
|
||||
{
|
||||
|
@ -1762,20 +1783,20 @@ void cgltf_free(cgltf_data* data)
|
|||
}
|
||||
cgltf_free_extensions(data, data->accessors[i].extensions, data->accessors[i].extensions_count);
|
||||
}
|
||||
data->memory.free(data->memory.user_data, data->accessors);
|
||||
data->memory.free_func(data->memory.user_data, data->accessors);
|
||||
|
||||
for (cgltf_size i = 0; i < data->buffer_views_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->buffer_views[i].name);
|
||||
data->memory.free(data->memory.user_data, data->buffer_views[i].data);
|
||||
data->memory.free_func(data->memory.user_data, data->buffer_views[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->buffer_views[i].data);
|
||||
|
||||
cgltf_free_extensions(data, data->buffer_views[i].extensions, data->buffer_views[i].extensions_count);
|
||||
}
|
||||
data->memory.free(data->memory.user_data, data->buffer_views);
|
||||
data->memory.free_func(data->memory.user_data, data->buffer_views);
|
||||
|
||||
for (cgltf_size i = 0; i < data->buffers_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->buffers[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->buffers[i].name);
|
||||
|
||||
if (data->buffers[i].data_free_method == cgltf_data_free_method_file_release)
|
||||
{
|
||||
|
@ -1783,74 +1804,74 @@ void cgltf_free(cgltf_data* data)
|
|||
}
|
||||
else if (data->buffers[i].data_free_method == cgltf_data_free_method_memory_free)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->buffers[i].data);
|
||||
data->memory.free_func(data->memory.user_data, data->buffers[i].data);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->buffers[i].uri);
|
||||
data->memory.free_func(data->memory.user_data, data->buffers[i].uri);
|
||||
|
||||
cgltf_free_extensions(data, data->buffers[i].extensions, data->buffers[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->buffers);
|
||||
data->memory.free_func(data->memory.user_data, data->buffers);
|
||||
|
||||
for (cgltf_size i = 0; i < data->meshes_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].name);
|
||||
|
||||
for (cgltf_size j = 0; j < data->meshes[i].primitives_count; ++j)
|
||||
{
|
||||
for (cgltf_size k = 0; k < data->meshes[i].primitives[j].attributes_count; ++k)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].primitives[j].attributes[k].name);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].primitives[j].attributes[k].name);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].primitives[j].attributes);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].primitives[j].attributes);
|
||||
|
||||
for (cgltf_size k = 0; k < data->meshes[i].primitives[j].targets_count; ++k)
|
||||
{
|
||||
for (cgltf_size m = 0; m < data->meshes[i].primitives[j].targets[k].attributes_count; ++m)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].primitives[j].targets[k].attributes[m].name);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].primitives[j].targets[k].attributes[m].name);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].primitives[j].targets[k].attributes);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].primitives[j].targets[k].attributes);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].primitives[j].targets);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].primitives[j].targets);
|
||||
|
||||
if (data->meshes[i].primitives[j].has_draco_mesh_compression)
|
||||
{
|
||||
for (cgltf_size k = 0; k < data->meshes[i].primitives[j].draco_mesh_compression.attributes_count; ++k)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].primitives[j].draco_mesh_compression.attributes[k].name);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].primitives[j].draco_mesh_compression.attributes[k].name);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].primitives[j].draco_mesh_compression.attributes);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].primitives[j].draco_mesh_compression.attributes);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].primitives[j].mappings);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].primitives[j].mappings);
|
||||
|
||||
cgltf_free_extensions(data, data->meshes[i].primitives[j].extensions, data->meshes[i].primitives[j].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].primitives);
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].weights);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].primitives);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].weights);
|
||||
|
||||
for (cgltf_size j = 0; j < data->meshes[i].target_names_count; ++j)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].target_names[j]);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].target_names[j]);
|
||||
}
|
||||
|
||||
cgltf_free_extensions(data, data->meshes[i].extensions, data->meshes[i].extensions_count);
|
||||
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].target_names);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes[i].target_names);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->meshes);
|
||||
data->memory.free_func(data->memory.user_data, data->meshes);
|
||||
|
||||
for (cgltf_size i = 0; i < data->materials_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->materials[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->materials[i].name);
|
||||
|
||||
if(data->materials[i].has_pbr_metallic_roughness)
|
||||
{
|
||||
|
@ -1899,126 +1920,126 @@ void cgltf_free(cgltf_data* data)
|
|||
cgltf_free_extensions(data, data->materials[i].extensions, data->materials[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->materials);
|
||||
data->memory.free_func(data->memory.user_data, data->materials);
|
||||
|
||||
for (cgltf_size i = 0; i < data->images_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->images[i].name);
|
||||
data->memory.free(data->memory.user_data, data->images[i].uri);
|
||||
data->memory.free(data->memory.user_data, data->images[i].mime_type);
|
||||
data->memory.free_func(data->memory.user_data, data->images[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->images[i].uri);
|
||||
data->memory.free_func(data->memory.user_data, data->images[i].mime_type);
|
||||
|
||||
cgltf_free_extensions(data, data->images[i].extensions, data->images[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->images);
|
||||
data->memory.free_func(data->memory.user_data, data->images);
|
||||
|
||||
for (cgltf_size i = 0; i < data->textures_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->textures[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->textures[i].name);
|
||||
cgltf_free_extensions(data, data->textures[i].extensions, data->textures[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->textures);
|
||||
data->memory.free_func(data->memory.user_data, data->textures);
|
||||
|
||||
for (cgltf_size i = 0; i < data->samplers_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->samplers[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->samplers[i].name);
|
||||
cgltf_free_extensions(data, data->samplers[i].extensions, data->samplers[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->samplers);
|
||||
data->memory.free_func(data->memory.user_data, data->samplers);
|
||||
|
||||
for (cgltf_size i = 0; i < data->skins_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->skins[i].name);
|
||||
data->memory.free(data->memory.user_data, data->skins[i].joints);
|
||||
data->memory.free_func(data->memory.user_data, data->skins[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->skins[i].joints);
|
||||
|
||||
cgltf_free_extensions(data, data->skins[i].extensions, data->skins[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->skins);
|
||||
data->memory.free_func(data->memory.user_data, data->skins);
|
||||
|
||||
for (cgltf_size i = 0; i < data->cameras_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->cameras[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->cameras[i].name);
|
||||
cgltf_free_extensions(data, data->cameras[i].extensions, data->cameras[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->cameras);
|
||||
data->memory.free_func(data->memory.user_data, data->cameras);
|
||||
|
||||
for (cgltf_size i = 0; i < data->lights_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->lights[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->lights[i].name);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->lights);
|
||||
data->memory.free_func(data->memory.user_data, data->lights);
|
||||
|
||||
for (cgltf_size i = 0; i < data->nodes_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->nodes[i].name);
|
||||
data->memory.free(data->memory.user_data, data->nodes[i].children);
|
||||
data->memory.free(data->memory.user_data, data->nodes[i].weights);
|
||||
data->memory.free_func(data->memory.user_data, data->nodes[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->nodes[i].children);
|
||||
data->memory.free_func(data->memory.user_data, data->nodes[i].weights);
|
||||
cgltf_free_extensions(data, data->nodes[i].extensions, data->nodes[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->nodes);
|
||||
data->memory.free_func(data->memory.user_data, data->nodes);
|
||||
|
||||
for (cgltf_size i = 0; i < data->scenes_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->scenes[i].name);
|
||||
data->memory.free(data->memory.user_data, data->scenes[i].nodes);
|
||||
data->memory.free_func(data->memory.user_data, data->scenes[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->scenes[i].nodes);
|
||||
|
||||
cgltf_free_extensions(data, data->scenes[i].extensions, data->scenes[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->scenes);
|
||||
data->memory.free_func(data->memory.user_data, data->scenes);
|
||||
|
||||
for (cgltf_size i = 0; i < data->animations_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->animations[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->animations[i].name);
|
||||
for (cgltf_size j = 0; j < data->animations[i].samplers_count; ++j)
|
||||
{
|
||||
cgltf_free_extensions(data, data->animations[i].samplers[j].extensions, data->animations[i].samplers[j].extensions_count);
|
||||
}
|
||||
data->memory.free(data->memory.user_data, data->animations[i].samplers);
|
||||
data->memory.free_func(data->memory.user_data, data->animations[i].samplers);
|
||||
|
||||
for (cgltf_size j = 0; j < data->animations[i].channels_count; ++j)
|
||||
{
|
||||
cgltf_free_extensions(data, data->animations[i].channels[j].extensions, data->animations[i].channels[j].extensions_count);
|
||||
}
|
||||
data->memory.free(data->memory.user_data, data->animations[i].channels);
|
||||
data->memory.free_func(data->memory.user_data, data->animations[i].channels);
|
||||
|
||||
cgltf_free_extensions(data, data->animations[i].extensions, data->animations[i].extensions_count);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->animations);
|
||||
data->memory.free_func(data->memory.user_data, data->animations);
|
||||
|
||||
for (cgltf_size i = 0; i < data->variants_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->variants[i].name);
|
||||
data->memory.free_func(data->memory.user_data, data->variants[i].name);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->variants);
|
||||
data->memory.free_func(data->memory.user_data, data->variants);
|
||||
|
||||
cgltf_free_extensions(data, data->data_extensions, data->data_extensions_count);
|
||||
|
||||
for (cgltf_size i = 0; i < data->extensions_used_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->extensions_used[i]);
|
||||
data->memory.free_func(data->memory.user_data, data->extensions_used[i]);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->extensions_used);
|
||||
data->memory.free_func(data->memory.user_data, data->extensions_used);
|
||||
|
||||
for (cgltf_size i = 0; i < data->extensions_required_count; ++i)
|
||||
{
|
||||
data->memory.free(data->memory.user_data, data->extensions_required[i]);
|
||||
data->memory.free_func(data->memory.user_data, data->extensions_required[i]);
|
||||
}
|
||||
|
||||
data->memory.free(data->memory.user_data, data->extensions_required);
|
||||
data->memory.free_func(data->memory.user_data, data->extensions_required);
|
||||
|
||||
file_release(&data->memory, &data->file, data->file_data);
|
||||
|
||||
data->memory.free(data->memory.user_data, data);
|
||||
data->memory.free_func(data->memory.user_data, data);
|
||||
}
|
||||
|
||||
void cgltf_node_transform_local(const cgltf_node* node, cgltf_float* out_matrix)
|
||||
|
@ -2101,7 +2122,7 @@ void cgltf_node_transform_world(const cgltf_node* node, cgltf_float* out_matrix)
|
|||
}
|
||||
}
|
||||
|
||||
static cgltf_size cgltf_component_read_index(const void* in, cgltf_component_type component_type)
|
||||
static cgltf_ssize cgltf_component_read_integer(const void* in, cgltf_component_type component_type)
|
||||
{
|
||||
switch (component_type)
|
||||
{
|
||||
|
@ -2112,7 +2133,7 @@ static cgltf_size cgltf_component_read_index(const void* in, cgltf_component_typ
|
|||
case cgltf_component_type_r_32u:
|
||||
return *((const uint32_t*) in);
|
||||
case cgltf_component_type_r_32f:
|
||||
return (cgltf_size)*((const float*) in);
|
||||
return (cgltf_ssize)*((const float*) in);
|
||||
case cgltf_component_type_r_8:
|
||||
return *((const int8_t*) in);
|
||||
case cgltf_component_type_r_8u:
|
||||
|
@ -2122,6 +2143,23 @@ static cgltf_size cgltf_component_read_index(const void* in, cgltf_component_typ
|
|||
}
|
||||
}
|
||||
|
||||
static cgltf_size cgltf_component_read_index(const void* in, cgltf_component_type component_type)
|
||||
{
|
||||
switch (component_type)
|
||||
{
|
||||
case cgltf_component_type_r_16u:
|
||||
return *((const uint16_t*) in);
|
||||
case cgltf_component_type_r_32u:
|
||||
return *((const uint32_t*) in);
|
||||
case cgltf_component_type_r_32f:
|
||||
return (cgltf_size)*((const float*) in);
|
||||
case cgltf_component_type_r_8u:
|
||||
return *((const uint8_t*) in);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static cgltf_float cgltf_component_read_float(const void* in, cgltf_component_type component_type, cgltf_bool normalized)
|
||||
{
|
||||
if (component_type == cgltf_component_type_r_32f)
|
||||
|
@ -2147,7 +2185,7 @@ static cgltf_float cgltf_component_read_float(const void* in, cgltf_component_ty
|
|||
}
|
||||
}
|
||||
|
||||
return (cgltf_float)cgltf_component_read_index(in, component_type);
|
||||
return (cgltf_float)cgltf_component_read_integer(in, component_type);
|
||||
}
|
||||
|
||||
static cgltf_size cgltf_component_size(cgltf_component_type component_type);
|
||||
|
@ -2505,7 +2543,7 @@ static int cgltf_parse_json_string(cgltf_options* options, jsmntok_t const* toke
|
|||
return CGLTF_ERROR_JSON;
|
||||
}
|
||||
int size = tokens[i].end - tokens[i].start;
|
||||
char* result = (char*)options->memory.alloc(options->memory.user_data, size + 1);
|
||||
char* result = (char*)options->memory.alloc_func(options->memory.user_data, size + 1);
|
||||
if (!result)
|
||||
{
|
||||
return CGLTF_ERROR_NOMEM;
|
||||
|
@ -2560,6 +2598,12 @@ static int cgltf_parse_json_string_array(cgltf_options* options, jsmntok_t const
|
|||
|
||||
static void cgltf_parse_attribute_type(const char* name, cgltf_attribute_type* out_type, int* out_index)
|
||||
{
|
||||
if (*name == '_')
|
||||
{
|
||||
*out_type = cgltf_attribute_type_custom;
|
||||
return;
|
||||
}
|
||||
|
||||
const char* us = strchr(name, '_');
|
||||
size_t len = us ? (size_t)(us - name) : strlen(name);
|
||||
|
||||
|
@ -2658,7 +2702,7 @@ static int cgltf_parse_json_unprocessed_extension(cgltf_options* options, jsmnto
|
|||
}
|
||||
|
||||
cgltf_size name_length = tokens[i].end - tokens[i].start;
|
||||
out_extension->name = (char*)options->memory.alloc(options->memory.user_data, name_length + 1);
|
||||
out_extension->name = (char*)options->memory.alloc_func(options->memory.user_data, name_length + 1);
|
||||
if (!out_extension->name)
|
||||
{
|
||||
return CGLTF_ERROR_NOMEM;
|
||||
|
@ -2669,7 +2713,7 @@ static int cgltf_parse_json_unprocessed_extension(cgltf_options* options, jsmnto
|
|||
|
||||
size_t start = tokens[i].start;
|
||||
size_t size = tokens[i].end - start;
|
||||
out_extension->data = (char*)options->memory.alloc(options->memory.user_data, size + 1);
|
||||
out_extension->data = (char*)options->memory.alloc_func(options->memory.user_data, size + 1);
|
||||
if (!out_extension->data)
|
||||
{
|
||||
return CGLTF_ERROR_NOMEM;
|
||||
|
@ -6081,7 +6125,7 @@ cgltf_result cgltf_parse_json(cgltf_options* options, const uint8_t* json_chunk,
|
|||
options->json_token_count = token_count;
|
||||
}
|
||||
|
||||
jsmntok_t* tokens = (jsmntok_t*)options->memory.alloc(options->memory.user_data, sizeof(jsmntok_t) * (options->json_token_count + 1));
|
||||
jsmntok_t* tokens = (jsmntok_t*)options->memory.alloc_func(options->memory.user_data, sizeof(jsmntok_t) * (options->json_token_count + 1));
|
||||
|
||||
if (!tokens)
|
||||
{
|
||||
|
@ -6094,7 +6138,7 @@ cgltf_result cgltf_parse_json(cgltf_options* options, const uint8_t* json_chunk,
|
|||
|
||||
if (token_count <= 0)
|
||||
{
|
||||
options->memory.free(options->memory.user_data, tokens);
|
||||
options->memory.free_func(options->memory.user_data, tokens);
|
||||
return cgltf_result_invalid_json;
|
||||
}
|
||||
|
||||
|
@ -6102,11 +6146,11 @@ cgltf_result cgltf_parse_json(cgltf_options* options, const uint8_t* json_chunk,
|
|||
// for invalid JSON inputs this makes sure we don't perform out of bound reads of token data
|
||||
tokens[token_count].type = JSMN_UNDEFINED;
|
||||
|
||||
cgltf_data* data = (cgltf_data*)options->memory.alloc(options->memory.user_data, sizeof(cgltf_data));
|
||||
cgltf_data* data = (cgltf_data*)options->memory.alloc_func(options->memory.user_data, sizeof(cgltf_data));
|
||||
|
||||
if (!data)
|
||||
{
|
||||
options->memory.free(options->memory.user_data, tokens);
|
||||
options->memory.free_func(options->memory.user_data, tokens);
|
||||
return cgltf_result_out_of_memory;
|
||||
}
|
||||
|
||||
|
@ -6116,7 +6160,7 @@ cgltf_result cgltf_parse_json(cgltf_options* options, const uint8_t* json_chunk,
|
|||
|
||||
int i = cgltf_parse_json_root(options, tokens, 0, json_chunk, data);
|
||||
|
||||
options->memory.free(options->memory.user_data, tokens);
|
||||
options->memory.free_func(options->memory.user_data, tokens);
|
||||
|
||||
if (i < 0)
|
||||
{
|
||||
|
|
|
@ -799,7 +799,7 @@ static const char* cgltf_write_str_path_type(cgltf_animation_path_type path_type
|
|||
return "scale";
|
||||
case cgltf_animation_path_type_weights:
|
||||
return "weights";
|
||||
case cgltf_animation_path_type_invalid:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return "invalid";
|
||||
|
@ -815,6 +815,8 @@ static const char* cgltf_write_str_interpolation_type(cgltf_interpolation_type i
|
|||
return "STEP";
|
||||
case cgltf_interpolation_type_cubic_spline:
|
||||
return "CUBICSPLINE";
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return "invalid";
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ namespace stl = tinystl;
|
|||
|
||||
#include <meshoptimizer/src/meshoptimizer.h>
|
||||
|
||||
#define CGLTF_VALIDATE_ENABLE_ASSERTS BX_CONFIG_DEBUG
|
||||
#define CGLTF_IMPLEMENTATION
|
||||
#include <cgltf/cgltf.h>
|
||||
|
||||
|
|
Loading…
Reference in New Issue