mirror of
https://github.com/raysan5/raylib.git
synced 2025-12-25 10:22:33 -05:00
Update external libraries
This commit is contained in:
406
src/external/cgltf.h
vendored
406
src/external/cgltf.h
vendored
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* cgltf - a single-file glTF 2.0 parser written in C99.
|
||||
*
|
||||
* Version: 1.4
|
||||
* Version: 1.5
|
||||
*
|
||||
* Website: https://github.com/jkuhlmann/cgltf
|
||||
*
|
||||
@ -24,8 +24,8 @@
|
||||
*
|
||||
* `cgltf_options` is the struct passed to `cgltf_parse()` to control
|
||||
* parts of the parsing process. You can use it to force the file type
|
||||
* and provide memory allocation callbacks. Should be zero-initialized
|
||||
* to trigger default behavior.
|
||||
* and provide memory allocation as well as file operation callbacks.
|
||||
* Should be zero-initialized to trigger default behavior.
|
||||
*
|
||||
* `cgltf_data` is the struct allocated and filled by `cgltf_parse()`.
|
||||
* It generally mirrors the glTF format as described by the spec (see
|
||||
@ -72,6 +72,11 @@
|
||||
* size is the number of floats in the output buffer, which should be in the range [1, 16]. Returns
|
||||
* false if the passed-in element_size is too small, or if the accessor is sparse.
|
||||
*
|
||||
* `cgltf_accessor_read_uint` is similar to its floating-point counterpart, but limited to reading
|
||||
* vector types and does not support matrix types. The passed-in element size is the number of uints
|
||||
* in the output buffer, which should be in the range [1, 4]. Returns false if the passed-in
|
||||
* element_size is too small, or if the accessor is sparse.
|
||||
*
|
||||
* `cgltf_accessor_read_index` is similar to its floating-point counterpart, but it returns size_t
|
||||
* and only works with single-component data types.
|
||||
*
|
||||
@ -96,6 +101,7 @@ extern "C" {
|
||||
typedef size_t cgltf_size;
|
||||
typedef float cgltf_float;
|
||||
typedef int cgltf_int;
|
||||
typedef unsigned int cgltf_uint;
|
||||
typedef int cgltf_bool;
|
||||
|
||||
typedef enum cgltf_file_type
|
||||
@ -105,15 +111,6 @@ typedef enum cgltf_file_type
|
||||
cgltf_file_type_glb,
|
||||
} cgltf_file_type;
|
||||
|
||||
typedef struct cgltf_options
|
||||
{
|
||||
cgltf_file_type type; /* invalid == auto detect */
|
||||
cgltf_size json_token_count; /* 0 == auto */
|
||||
void* (*memory_alloc)(void* user, cgltf_size size);
|
||||
void (*memory_free) (void* user, void* ptr);
|
||||
void* memory_user_data;
|
||||
} cgltf_options;
|
||||
|
||||
typedef enum cgltf_result
|
||||
{
|
||||
cgltf_result_success,
|
||||
@ -128,6 +125,28 @@ typedef enum cgltf_result
|
||||
cgltf_result_legacy_gltf,
|
||||
} cgltf_result;
|
||||
|
||||
typedef struct cgltf_memory_options
|
||||
{
|
||||
void* (*alloc)(void* user, cgltf_size size);
|
||||
void (*free) (void* user, void* ptr);
|
||||
void* user_data;
|
||||
} cgltf_memory_options;
|
||||
|
||||
typedef struct cgltf_file_options
|
||||
{
|
||||
cgltf_result(*read)(const struct cgltf_memory_options* memory_options, const struct cgltf_file_options* file_options, const char* path, cgltf_size* size, void** data);
|
||||
void (*release)(const struct cgltf_memory_options* memory_options, const struct cgltf_file_options* file_options, void* data);
|
||||
void* user_data;
|
||||
} cgltf_file_options;
|
||||
|
||||
typedef struct cgltf_options
|
||||
{
|
||||
cgltf_file_type type; /* invalid == auto detect */
|
||||
cgltf_size json_token_count; /* 0 == auto */
|
||||
cgltf_memory_options memory;
|
||||
cgltf_file_options file;
|
||||
} cgltf_options;
|
||||
|
||||
typedef enum cgltf_buffer_view_type
|
||||
{
|
||||
cgltf_buffer_view_type_invalid,
|
||||
@ -560,8 +579,8 @@ typedef struct cgltf_data
|
||||
const void* bin;
|
||||
cgltf_size bin_size;
|
||||
|
||||
void (*memory_free) (void* user, void* ptr);
|
||||
void* memory_user_data;
|
||||
cgltf_memory_options memory;
|
||||
cgltf_file_options file;
|
||||
} cgltf_data;
|
||||
|
||||
cgltf_result cgltf_parse(
|
||||
@ -591,6 +610,7 @@ void cgltf_node_transform_local(const cgltf_node* node, cgltf_float* out_matrix)
|
||||
void cgltf_node_transform_world(const cgltf_node* node, cgltf_float* out_matrix);
|
||||
|
||||
cgltf_bool cgltf_accessor_read_float(const cgltf_accessor* accessor, cgltf_size index, cgltf_float* out, cgltf_size element_size);
|
||||
cgltf_bool cgltf_accessor_read_uint(const cgltf_accessor* accessor, cgltf_size index, cgltf_uint* out, cgltf_size element_size);
|
||||
cgltf_size cgltf_accessor_read_index(const cgltf_accessor* accessor, cgltf_size index);
|
||||
|
||||
cgltf_size cgltf_num_components(cgltf_type type);
|
||||
@ -713,7 +733,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(options->memory.user_data, element_size * count);
|
||||
if (!result)
|
||||
{
|
||||
return NULL;
|
||||
@ -722,6 +742,71 @@ static void* cgltf_calloc(cgltf_options* options, size_t element_size, cgltf_siz
|
||||
return result;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
FILE* file = fopen(path, "rb");
|
||||
if (!file)
|
||||
{
|
||||
return cgltf_result_file_not_found;
|
||||
}
|
||||
|
||||
cgltf_size file_size = size ? *size : 0;
|
||||
|
||||
if (file_size == 0)
|
||||
{
|
||||
fseek(file, 0, SEEK_END);
|
||||
|
||||
long length = ftell(file);
|
||||
if (length < 0)
|
||||
{
|
||||
fclose(file);
|
||||
return cgltf_result_io_error;
|
||||
}
|
||||
|
||||
fseek(file, 0, SEEK_SET);
|
||||
file_size = (cgltf_size)length;
|
||||
}
|
||||
|
||||
char* file_data = (char*)memory_alloc(memory_options->user_data, file_size);
|
||||
if (!file_data)
|
||||
{
|
||||
fclose(file);
|
||||
return cgltf_result_out_of_memory;
|
||||
}
|
||||
|
||||
cgltf_size read_size = fread(file_data, 1, file_size, file);
|
||||
|
||||
fclose(file);
|
||||
|
||||
if (read_size != file_size)
|
||||
{
|
||||
memory_free(memory_options->user_data, file_data);
|
||||
return cgltf_result_io_error;
|
||||
}
|
||||
|
||||
if (size)
|
||||
{
|
||||
*size = file_size;
|
||||
}
|
||||
if (data)
|
||||
{
|
||||
*data = file_data;
|
||||
}
|
||||
|
||||
return cgltf_result_success;
|
||||
}
|
||||
|
||||
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;
|
||||
memfree(memory_options->user_data, data);
|
||||
}
|
||||
|
||||
static cgltf_result cgltf_parse_json(cgltf_options* options, const uint8_t* json_chunk, cgltf_size size, cgltf_data** out_data);
|
||||
|
||||
cgltf_result cgltf_parse(const cgltf_options* options, const void* data, cgltf_size size, cgltf_data** out_data)
|
||||
@ -737,13 +822,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 == NULL)
|
||||
{
|
||||
fixed_options.memory_alloc = &cgltf_default_alloc;
|
||||
fixed_options.memory.alloc = &cgltf_default_alloc;
|
||||
}
|
||||
if (fixed_options.memory_free == NULL)
|
||||
if (fixed_options.memory.free == NULL)
|
||||
{
|
||||
fixed_options.memory_free = &cgltf_default_free;
|
||||
fixed_options.memory.free = &cgltf_default_free;
|
||||
}
|
||||
|
||||
uint32_t tmp;
|
||||
@ -863,49 +948,23 @@ cgltf_result cgltf_parse_file(const cgltf_options* options, const char* path, cg
|
||||
return cgltf_result_invalid_options;
|
||||
}
|
||||
|
||||
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 ? options->memory.alloc : &cgltf_default_alloc;
|
||||
void (*memory_free)(void*, void*) = options->memory.free ? options->memory.free : &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;
|
||||
|
||||
FILE* file = fopen(path, "rb");
|
||||
if (!file)
|
||||
void* file_data = NULL;
|
||||
cgltf_size file_size = 0;
|
||||
cgltf_result result = file_read(&options->memory, &options->file, path, &file_size, &file_data);
|
||||
if (result != cgltf_result_success)
|
||||
{
|
||||
return cgltf_result_file_not_found;
|
||||
return result;
|
||||
}
|
||||
|
||||
fseek(file, 0, SEEK_END);
|
||||
|
||||
long length = ftell(file);
|
||||
if (length < 0)
|
||||
{
|
||||
fclose(file);
|
||||
return cgltf_result_io_error;
|
||||
}
|
||||
|
||||
fseek(file, 0, SEEK_SET);
|
||||
|
||||
char* file_data = (char*)memory_alloc(options->memory_user_data, length);
|
||||
if (!file_data)
|
||||
{
|
||||
fclose(file);
|
||||
return cgltf_result_out_of_memory;
|
||||
}
|
||||
|
||||
cgltf_size file_size = (cgltf_size)length;
|
||||
cgltf_size read_size = fread(file_data, 1, file_size, file);
|
||||
|
||||
fclose(file);
|
||||
|
||||
if (read_size != file_size)
|
||||
{
|
||||
memory_free(options->memory_user_data, file_data);
|
||||
return cgltf_result_io_error;
|
||||
}
|
||||
|
||||
cgltf_result result = cgltf_parse(options, file_data, file_size, out_data);
|
||||
result = cgltf_parse(options, file_data, file_size, out_data);
|
||||
|
||||
if (result != cgltf_result_success)
|
||||
{
|
||||
memory_free(options->memory_user_data, file_data);
|
||||
memory_free(options->memory.user_data, file_data);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -935,10 +994,11 @@ 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 ? options->memory.alloc : &cgltf_default_alloc;
|
||||
void (*memory_free)(void*, void*) = options->memory.free ? options->memory.free : &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);
|
||||
char* path = (char*)memory_alloc(options->memory.user_data, strlen(uri) + strlen(gltf_path) + 1);
|
||||
if (!path)
|
||||
{
|
||||
return cgltf_result_out_of_memory;
|
||||
@ -946,30 +1006,11 @@ static cgltf_result cgltf_load_buffer_file(const cgltf_options* options, cgltf_s
|
||||
|
||||
cgltf_combine_paths(path, gltf_path, uri);
|
||||
|
||||
FILE* file = fopen(path, "rb");
|
||||
|
||||
memory_free(options->memory_user_data, path);
|
||||
|
||||
if (!file)
|
||||
void* file_data = NULL;
|
||||
cgltf_result result = file_read(&options->memory, &options->file, path, &size, &file_data);
|
||||
if (result != cgltf_result_success)
|
||||
{
|
||||
return cgltf_result_file_not_found;
|
||||
}
|
||||
|
||||
char* file_data = (char*)memory_alloc(options->memory_user_data, size);
|
||||
if (!file_data)
|
||||
{
|
||||
fclose(file);
|
||||
return cgltf_result_out_of_memory;
|
||||
}
|
||||
|
||||
cgltf_size read_size = fread(file_data, 1, size, file);
|
||||
|
||||
fclose(file);
|
||||
|
||||
if (read_size != size)
|
||||
{
|
||||
memory_free(options->memory_user_data, file_data);
|
||||
return cgltf_result_io_error;
|
||||
return result;
|
||||
}
|
||||
|
||||
*out_data = file_data;
|
||||
@ -979,10 +1020,10 @@ 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 ? options->memory.alloc : &cgltf_default_alloc;
|
||||
void (*memory_free)(void*, void*) = options->memory.free ? options->memory.free : &cgltf_default_free;
|
||||
|
||||
unsigned char* data = (unsigned char*)memory_alloc(options->memory_user_data, size);
|
||||
unsigned char* data = (unsigned char*)memory_alloc(options->memory.user_data, size);
|
||||
if (!data)
|
||||
{
|
||||
return cgltf_result_out_of_memory;
|
||||
@ -1007,7 +1048,7 @@ cgltf_result cgltf_load_buffer_base64(const cgltf_options* options, cgltf_size s
|
||||
|
||||
if (index < 0)
|
||||
{
|
||||
memory_free(options->memory_user_data, data);
|
||||
memory_free(options->memory.user_data, data);
|
||||
return cgltf_result_io_error;
|
||||
}
|
||||
|
||||
@ -1372,155 +1413,157 @@ void cgltf_free(cgltf_data* data)
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
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->accessors);
|
||||
data->memory_free(data->memory_user_data, data->buffer_views);
|
||||
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(data->memory.user_data, data->accessors);
|
||||
data->memory.free(data->memory.user_data, data->buffer_views);
|
||||
|
||||
for (cgltf_size i = 0; i < data->buffers_count; ++i)
|
||||
{
|
||||
if (data->buffers[i].data != data->bin)
|
||||
{
|
||||
data->memory_free(data->memory_user_data, data->buffers[i].data);
|
||||
file_release(&data->memory, &data->file, data->buffers[i].data);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->buffers[i].uri);
|
||||
data->memory.free(data->memory.user_data, data->buffers[i].uri);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->buffers);
|
||||
data->memory.free(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(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(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(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(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(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(data->memory.user_data, data->meshes[i].primitives[j].targets);
|
||||
}
|
||||
|
||||
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(data->memory.user_data, data->meshes[i].primitives);
|
||||
data->memory.free(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(data->memory.user_data, data->meshes[i].target_names[j]);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->meshes[i].target_names);
|
||||
data->memory.free(data->memory.user_data, data->meshes[i].target_names);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->meshes);
|
||||
data->memory.free(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(data->memory.user_data, data->materials[i].name);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->materials);
|
||||
data->memory.free(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(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(data->memory_user_data, data->images);
|
||||
data->memory.free(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(data->memory.user_data, data->textures[i].name);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->textures);
|
||||
data->memory.free(data->memory.user_data, data->textures);
|
||||
|
||||
data->memory_free(data->memory_user_data, data->samplers);
|
||||
data->memory.free(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(data->memory.user_data, data->skins[i].name);
|
||||
data->memory.free(data->memory.user_data, data->skins[i].joints);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->skins);
|
||||
data->memory.free(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(data->memory.user_data, data->cameras[i].name);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->cameras);
|
||||
data->memory.free(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(data->memory.user_data, data->lights[i].name);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->lights);
|
||||
data->memory.free(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(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(data->memory_user_data, data->nodes);
|
||||
data->memory.free(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(data->memory.user_data, data->scenes[i].name);
|
||||
data->memory.free(data->memory.user_data, data->scenes[i].nodes);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->scenes);
|
||||
data->memory.free(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(data->memory_user_data, data->animations[i].samplers);
|
||||
data->memory_free(data->memory_user_data, data->animations[i].channels);
|
||||
data->memory.free(data->memory.user_data, data->animations[i].name);
|
||||
data->memory.free(data->memory.user_data, data->animations[i].samplers);
|
||||
data->memory.free(data->memory.user_data, data->animations[i].channels);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->animations);
|
||||
data->memory.free(data->memory.user_data, data->animations);
|
||||
|
||||
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(data->memory.user_data, data->extensions_used[i]);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->extensions_used);
|
||||
data->memory.free(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(data->memory.user_data, data->extensions_required[i]);
|
||||
}
|
||||
|
||||
data->memory_free(data->memory_user_data, data->extensions_required);
|
||||
data->memory.free(data->memory.user_data, data->extensions_required);
|
||||
|
||||
data->memory_free(data->memory_user_data, data->file_data);
|
||||
file_release(&data->memory, &data->file, data->file_data);
|
||||
|
||||
data->memory_free(data->memory_user_data, data);
|
||||
data->memory.free(data->memory.user_data, data);
|
||||
}
|
||||
|
||||
void cgltf_node_transform_local(const cgltf_node* node, cgltf_float* out_matrix)
|
||||
@ -1787,6 +1830,77 @@ cgltf_size cgltf_accessor_unpack_floats(const cgltf_accessor* accessor, cgltf_fl
|
||||
return element_count * floats_per_element;
|
||||
}
|
||||
|
||||
static cgltf_uint cgltf_component_read_uint(const void* in, cgltf_component_type component_type)
|
||||
{
|
||||
switch (component_type)
|
||||
{
|
||||
case cgltf_component_type_r_8:
|
||||
return *((const int8_t*) in);
|
||||
|
||||
case cgltf_component_type_r_8u:
|
||||
return *((const uint8_t*) in);
|
||||
|
||||
case cgltf_component_type_r_16:
|
||||
return *((const int16_t*) in);
|
||||
|
||||
case cgltf_component_type_r_16u:
|
||||
return *((const uint16_t*) in);
|
||||
|
||||
case cgltf_component_type_r_32u:
|
||||
return *((const uint32_t*) in);
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cgltf_bool cgltf_element_read_uint(const uint8_t* element, cgltf_type type, cgltf_component_type component_type, cgltf_uint* out, cgltf_size element_size)
|
||||
{
|
||||
cgltf_size num_components = cgltf_num_components(type);
|
||||
|
||||
if (element_size < num_components)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Reading integer matrices is not a valid use case
|
||||
if (type == cgltf_type_mat2 || type == cgltf_type_mat3 || type == cgltf_type_mat4)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
cgltf_size component_size = cgltf_component_size(component_type);
|
||||
|
||||
for (cgltf_size i = 0; i < num_components; ++i)
|
||||
{
|
||||
out[i] = cgltf_component_read_uint(element + component_size * i, component_type);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
cgltf_bool cgltf_accessor_read_uint(const cgltf_accessor* accessor, cgltf_size index, cgltf_uint* out, cgltf_size element_size)
|
||||
{
|
||||
if (accessor->is_sparse)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (accessor->buffer_view == NULL)
|
||||
{
|
||||
memset(out, 0, element_size * sizeof( cgltf_uint ));
|
||||
return 1;
|
||||
}
|
||||
if (accessor->buffer_view->buffer->data == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
cgltf_size offset = accessor->offset + accessor->buffer_view->offset;
|
||||
const uint8_t* element = (const uint8_t*) accessor->buffer_view->buffer->data;
|
||||
element += offset + accessor->stride * index;
|
||||
return cgltf_element_read_uint(element, accessor->type, accessor->component_type, out, element_size);
|
||||
}
|
||||
|
||||
cgltf_size cgltf_accessor_read_index(const cgltf_accessor* accessor, cgltf_size index)
|
||||
{
|
||||
if (accessor->is_sparse)
|
||||
@ -1916,7 +2030,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(options->memory.user_data, size + 1);
|
||||
if (!result)
|
||||
{
|
||||
return CGLTF_ERROR_NOMEM;
|
||||
@ -4387,7 +4501,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(options->memory.user_data, sizeof(jsmntok_t) * (options->json_token_count + 1));
|
||||
|
||||
if (!tokens)
|
||||
{
|
||||
@ -4400,7 +4514,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(options->memory.user_data, tokens);
|
||||
return cgltf_result_invalid_json;
|
||||
}
|
||||
|
||||
@ -4408,21 +4522,21 @@ 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(options->memory.user_data, sizeof(cgltf_data));
|
||||
|
||||
if (!data)
|
||||
{
|
||||
options->memory_free(options->memory_user_data, tokens);
|
||||
options->memory.free(options->memory.user_data, tokens);
|
||||
return cgltf_result_out_of_memory;
|
||||
}
|
||||
|
||||
memset(data, 0, sizeof(cgltf_data));
|
||||
data->memory_free = options->memory_free;
|
||||
data->memory_user_data = options->memory_user_data;
|
||||
data->memory = options->memory;
|
||||
data->file = options->file;
|
||||
|
||||
int i = cgltf_parse_json_root(options, tokens, 0, json_chunk, data);
|
||||
|
||||
options->memory_free(options->memory_user_data, tokens);
|
||||
options->memory.free(options->memory.user_data, tokens);
|
||||
|
||||
if (i < 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user