94#ifndef CGLTF_H_INCLUDED__
95#define CGLTF_H_INCLUDED__
993 const char* gltf_path);
1057#if defined(__INTELLISENSE__) || defined(__JETBRAINS_IDE__)
1059#define CGLTF_IMPLEMENTATION
1062#ifdef CGLTF_IMPLEMENTATION
1070#if !defined(CGLTF_MALLOC) || !defined(CGLTF_FREE) || !defined(CGLTF_ATOI) || !defined(CGLTF_ATOF) || !defined(CGLTF_ATOLL)
1075#define JSMN_PARENT_LINKS
1094 JSMN_ERROR_NOMEM = -1,
1096 JSMN_ERROR_INVAL = -2,
1098 JSMN_ERROR_PART = -3
1105#ifdef JSMN_PARENT_LINKS
1111 unsigned int toknext;
1114static void jsmn_init(jsmn_parser *parser);
1115static int jsmn_parse(jsmn_parser *parser,
const char *js,
size_t len, jsmntok_t *tokens,
size_t num_tokens);
1122#define GlbHeaderSize 12
1123#define GlbChunkHeaderSize 8
1124static const uint32_t GlbVersion = 2;
1125static const uint32_t GlbMagic = 0x46546C67;
1126static const uint32_t GlbMagicJsonChunk = 0x4E4F534A;
1127static const uint32_t GlbMagicBinChunk = 0x004E4942;
1132#define CGLTF_MALLOC(size) malloc(size)
1135#define CGLTF_FREE(ptr) free(ptr)
1138#define CGLTF_ATOI(str) atoi(str)
1141#define CGLTF_ATOF(str) atof(str)
1144#define CGLTF_ATOLL(str) atoll(str)
1146#ifndef CGLTF_VALIDATE_ENABLE_ASSERTS
1147#define CGLTF_VALIDATE_ENABLE_ASSERTS 0
1150static void* cgltf_default_alloc(
void* user,
cgltf_size size)
1153 return CGLTF_MALLOC(size);
1156static void cgltf_default_free(
void* user,
void* ptr)
1164 if (SIZE_MAX / element_size < count)
1173 memset(result, 0, element_size * count);
1181 void (*memory_free)(
void*,
void*) = memory_options->
free_func ? memory_options->
free_func : &cgltf_default_free;
1183 FILE* file = fopen(path,
"rb");
1193 fseek(file, 0, SEEK_END);
1196 __int64 length = _ftelli64(file);
1198 long length = ftell(file);
1207 fseek(file, 0, SEEK_SET);
1211 char* file_data = (
char*)memory_alloc(memory_options->
user_data, file_size);
1218 cgltf_size read_size = fread(file_data, 1, file_size, file);
1222 if (read_size != file_size)
1224 memory_free(memory_options->
user_data, file_data);
1243 void (*memfree)(
void*,
void*) = memory_options->
free_func ? memory_options->
free_func : &cgltf_default_free;
1244 memfree(memory_options->
user_data, data);
1251 if (size < GlbHeaderSize)
1256 if (options == NULL)
1273 memcpy(&tmp, data, 4);
1274 if (tmp != GlbMagic)
1288 cgltf_result json_result = cgltf_parse_json(&fixed_options, (
const uint8_t*)data, size, out_data);
1299 const uint8_t* ptr = (
const uint8_t*)data;
1301 memcpy(&tmp, ptr + 4, 4);
1302 uint32_t version = tmp;
1303 if (version != GlbVersion)
1309 memcpy(&tmp, ptr + 8, 4);
1315 const uint8_t* json_chunk = ptr + GlbHeaderSize;
1317 if (GlbHeaderSize + GlbChunkHeaderSize > size)
1323 uint32_t json_length;
1324 memcpy(&json_length, json_chunk, 4);
1325 if (json_length > size - GlbHeaderSize - GlbChunkHeaderSize)
1331 memcpy(&tmp, json_chunk + 4, 4);
1332 if (tmp != GlbMagicJsonChunk)
1337 json_chunk += GlbChunkHeaderSize;
1339 const void* bin = NULL;
1342 if (GlbChunkHeaderSize <= size - GlbHeaderSize - GlbChunkHeaderSize - json_length)
1345 const uint8_t* bin_chunk = json_chunk + json_length;
1348 uint32_t bin_length;
1349 memcpy(&bin_length, bin_chunk, 4);
1350 if (bin_length > size - GlbHeaderSize - GlbChunkHeaderSize - json_length - GlbChunkHeaderSize)
1356 memcpy(&tmp, bin_chunk + 4, 4);
1357 if (tmp != GlbMagicBinChunk)
1362 bin_chunk += GlbChunkHeaderSize;
1365 bin_size = bin_length;
1368 cgltf_result json_result = cgltf_parse_json(&fixed_options, json_chunk, json_length, out_data);
1375 (*out_data)->bin = bin;
1376 (*out_data)->bin_size = bin_size;
1383 if (options == NULL)
1391 void* file_data = NULL;
1399 result =
cgltf_parse(options, file_data, file_size, out_data);
1403 file_release(&options->
memory, &options->
file, file_data);
1407 (*out_data)->file_data = file_data;
1412static void cgltf_combine_paths(
char* path,
const char* base,
const char* uri)
1414 const char* s0 = strrchr(base,
'/');
1415 const char* s1 = strrchr(base,
'\\');
1416 const char* slash = s0 ? (s1 && s1 > s0 ? s1 : s0) : s1;
1420 size_t prefix = slash - base + 1;
1422 strncpy(path, base, prefix);
1423 strcpy(path + prefix, uri);
1437 char* path = (
char*)memory_alloc(options->
memory.
user_data, strlen(uri) + strlen(gltf_path) + 1);
1443 cgltf_combine_paths(path, gltf_path, uri);
1448 void* file_data = NULL;
1463 unsigned char* data = (
unsigned char*)memory_alloc(options->
memory.
user_data, size);
1469 unsigned int buffer = 0;
1470 unsigned int buffer_bits = 0;
1474 while (buffer_bits < 8)
1476 char ch = *base64++;
1479 (unsigned)(ch -
'A') < 26 ? (ch -
'A') :
1480 (unsigned)(ch -
'a') < 26 ? (ch -
'a') + 26 :
1481 (unsigned)(ch -
'0') < 10 ? (ch -
'0') + 52 :
1492 buffer = (buffer << 6) | index;
1496 data[i] = (
unsigned char)(buffer >> (buffer_bits - 8));
1505static int cgltf_unhex(
char ch)
1508 (
unsigned)(ch -
'0') < 10 ? (ch -
'0') :
1509 (unsigned)(ch -
'A') < 6 ? (ch -
'A') + 10 :
1510 (unsigned)(ch -
'a') < 6 ? (ch -
'a') + 10 :
1516 char*
read =
string + strcspn(
string,
"\\");
1519 return read - string;
1521 char* write = string;
1522 char* last = string;
1528 memmove(write, last, written);
1539 case '\"': *write++ =
'\"';
break;
1540 case '/': *write++ =
'/';
break;
1541 case '\\': *write++ =
'\\';
break;
1542 case 'b': *write++ =
'\b';
break;
1543 case 'f': *write++ =
'\f';
break;
1544 case 'r': *write++ =
'\r';
break;
1545 case 'n': *write++ =
'\n';
break;
1546 case 't': *write++ =
'\t';
break;
1553 character = (character << 4) + cgltf_unhex(*
read++);
1556 if (character <= 0x7F)
1558 *write++ = character & 0xFF;
1560 else if (character <= 0x7FF)
1562 *write++ = 0xC0 | ((character >> 6) & 0xFF);
1563 *write++ = 0x80 | (character & 0x3F);
1567 *write++ = 0xE0 | ((character >> 12) & 0xFF);
1568 *write++ = 0x80 | ((character >> 6) & 0x3F);
1569 *write++ = 0x80 | (character & 0x3F);
1582 return write - string;
1594 int ch1 = cgltf_unhex(i[1]);
1598 int ch2 = cgltf_unhex(i[2]);
1602 *write++ = (char)(ch1 * 16 + ch2);
1618 if (options == NULL)
1648 if (strncmp(uri,
"data:", 5) == 0)
1650 const char* comma = strchr(uri,
',');
1652 if (comma && comma - uri >= 7 && strncmp(comma - 7,
";base64", 7) == 0)
1667 else if (strstr(uri,
"://") == NULL && gltf_path)
1688 char* data = (
char*)buffer_view->
buffer->
data + offset + buffer_view->
offset;
1691 switch (component_type)
1694 for (
size_t i = 0; i < count; ++i)
1697 bound = bound > v ? bound : v;
1702 for (
size_t i = 0; i < count; ++i)
1705 bound = bound > v ? bound : v;
1710 for (
size_t i = 0; i < count; ++i)
1713 bound = bound > v ? bound : v;
1724#if CGLTF_VALIDATE_ENABLE_ASSERTS
1725#define CGLTF_ASSERT_IF(cond, result) assert(!(cond)); if (cond) return result;
1727#define CGLTF_ASSERT_IF(cond, result) if (cond) return result;
1842 CGLTF_ASSERT_IF(indices &&
1949 *dest_size = json_size + 1;
1955 if (*dest_size + 1 < json_size)
1958 dest[*dest_size - 1] = 0;
1963 dest[json_size] = 0;
1976 for (
cgltf_size i = 0; i < extensions_count; ++i)
2271 cgltf_free_extras(data, &data->
extras);
2298 memcpy(lm, node->
matrix,
sizeof(
float) * 16);
2311 float sx = node->
scale[0];
2312 float sy = node->
scale[1];
2313 float sz = node->
scale[2];
2315 lm[0] = (1 - 2 * qy*qy - 2 * qz*qz) * sx;
2316 lm[1] = (2 * qx*qy + 2 * qz*qw) * sx;
2317 lm[2] = (2 * qx*qz - 2 * qy*qw) * sx;
2320 lm[4] = (2 * qx*qy - 2 * qz*qw) * sy;
2321 lm[5] = (1 - 2 * qx*qx - 2 * qz*qz) * sy;
2322 lm[6] = (2 * qy*qz + 2 * qx*qw) * sy;
2325 lm[8] = (2 * qx*qz + 2 * qy*qw) * sz;
2326 lm[9] = (2 * qy*qz - 2 * qx*qw) * sz;
2327 lm[10] = (1 - 2 * qx*qx - 2 * qy*qy) * sz;
2349 for (
int i = 0; i < 4; ++i)
2351 float l0 = lm[i * 4 + 0];
2352 float l1 = lm[i * 4 + 1];
2353 float l2 = lm[i * 4 + 2];
2355 float r0 = l0 * pm[0] + l1 * pm[4] + l2 * pm[8];
2356 float r1 = l0 * pm[1] + l1 * pm[5] + l2 * pm[9];
2357 float r2 = l0 * pm[2] + l1 * pm[6] + l2 * pm[10];
2374 switch (component_type)
2377 return *((
const int16_t*) in);
2379 return *((
const uint16_t*) in);
2381 return *((
const uint32_t*) in);
2383 return *((
const int8_t*) in);
2385 return *((
const uint8_t*) in);
2393 switch (component_type)
2396 return *((
const uint16_t*) in);
2398 return *((
const uint32_t*) in);
2400 return *((
const uint8_t*) in);
2410 return *((
const float*) in);
2415 switch (component_type)
2419 return *((
const int16_t*) in) / (
cgltf_float)32767;
2421 return *((
const uint16_t*) in) / (
cgltf_float)65535;
2431 return (
cgltf_float)cgltf_component_read_integer(in, component_type);
2438 if (element_size < num_components) {
2448 out[0] = cgltf_component_read_float(element, component_type, normalized);
2449 out[1] = cgltf_component_read_float(element + 1, component_type, normalized);
2450 out[2] = cgltf_component_read_float(element + 4, component_type, normalized);
2451 out[3] = cgltf_component_read_float(element + 5, component_type, normalized);
2457 out[0] = cgltf_component_read_float(element, component_type, normalized);
2458 out[1] = cgltf_component_read_float(element + 1, component_type, normalized);
2459 out[2] = cgltf_component_read_float(element + 2, component_type, normalized);
2460 out[3] = cgltf_component_read_float(element + 4, component_type, normalized);
2461 out[4] = cgltf_component_read_float(element + 5, component_type, normalized);
2462 out[5] = cgltf_component_read_float(element + 6, component_type, normalized);
2463 out[6] = cgltf_component_read_float(element + 8, component_type, normalized);
2464 out[7] = cgltf_component_read_float(element + 9, component_type, normalized);
2465 out[8] = cgltf_component_read_float(element + 10, component_type, normalized);
2471 out[0] = cgltf_component_read_float(element, component_type, normalized);
2472 out[1] = cgltf_component_read_float(element + 2, component_type, normalized);
2473 out[2] = cgltf_component_read_float(element + 4, component_type, normalized);
2474 out[3] = cgltf_component_read_float(element + 8, component_type, normalized);
2475 out[4] = cgltf_component_read_float(element + 10, component_type, normalized);
2476 out[5] = cgltf_component_read_float(element + 12, component_type, normalized);
2477 out[6] = cgltf_component_read_float(element + 16, component_type, normalized);
2478 out[7] = cgltf_component_read_float(element + 18, component_type, normalized);
2479 out[8] = cgltf_component_read_float(element + 20, component_type, normalized);
2483 for (
cgltf_size i = 0; i < num_components; ++i)
2485 out[i] = cgltf_component_read_float(element + component_size * i, component_type, normalized);
2493 return (
const uint8_t*)view->
data;
2498 const uint8_t* result = (
const uint8_t*)view->
buffer->
data;
2508 if (attr->
type == type && attr->
index == index)
2523 memset(out, 0, element_size *
sizeof(
cgltf_float));
2527 if (element == NULL)
2531 element += accessor->
offset + accessor->
stride * index;
2541 return available_floats;
2544 float_count = available_floats < float_count ? available_floats : float_count;
2545 cgltf_size element_count = float_count / floats_per_element;
2550 memset(out, 0, element_count * floats_per_element *
sizeof(
cgltf_float));
2555 if (element == NULL)
2559 element += accessor->
offset;
2563 memcpy(out, element, element_count * floats_per_element *
sizeof(
cgltf_float));
2569 for (
cgltf_size index = 0; index < element_count; index++, dest += floats_per_element, element += accessor->
stride)
2587 if (index_data == NULL || reader_head == NULL)
2596 for (
cgltf_size reader_index = 0; reader_index < sparse->
count; reader_index++, index_data += index_stride, reader_head += accessor->
stride)
2599 float* writer_head = out + writer_index * floats_per_element;
2601 if (!cgltf_element_read_float(reader_head, accessor->
type, accessor->
component_type, accessor->
normalized, writer_head, floats_per_element))
2608 return element_count * floats_per_element;
2613 switch (component_type)
2616 return *((
const int8_t*) in);
2619 return *((
const uint8_t*) in);
2622 return *((
const int16_t*) in);
2625 return *((
const uint16_t*) in);
2628 return *((
const uint32_t*) in);
2639 if (element_size < num_components)
2652 for (
cgltf_size i = 0; i < num_components; ++i)
2654 out[i] = cgltf_component_read_uint(element + component_size * i, component_type);
2667 memset(out, 0, element_size *
sizeof(
cgltf_uint ));
2671 if (element == NULL)
2675 element += accessor->
offset + accessor->
stride * index;
2676 return cgltf_element_read_uint(element, accessor->
type, accessor->
component_type, out, element_size);
2690 if (element == NULL)
2694 element += accessor->
offset + accessor->
stride * index;
2695 return cgltf_component_read_index(element, accessor->
component_type);
2810 return accessor->
count;
2813 index_count = accessor->
count < index_count ? accessor->
count : index_count;
2824 if (index_component_size > out_component_size)
2829 if (element == NULL)
2833 element += accessor->
offset;
2835 if (index_component_size == out_component_size && accessor->
stride == out_component_size)
2837 memcpy(out, element, index_count * index_component_size);
2842 switch (out_component_size)
2845 for (
cgltf_size index = 0; index < index_count; index++, element += accessor->
stride)
2847 ((uint16_t*)out)[index] = (uint16_t)cgltf_component_read_index(element, accessor->
component_type);
2851 for (
cgltf_size index = 0; index < index_count; index++, element += accessor->
stride)
2853 ((uint32_t*)out)[index] = (uint32_t)cgltf_component_read_index(element, accessor->
component_type);
2863#define CGLTF_ERROR_JSON -1
2864#define CGLTF_ERROR_NOMEM -2
2865#define CGLTF_ERROR_LEGACY -3
2867#define CGLTF_CHECK_TOKTYPE(tok_, type_) if ((tok_).type != (type_)) { return CGLTF_ERROR_JSON; }
2868#define CGLTF_CHECK_TOKTYPE_RET(tok_, type_, ret_) if ((tok_).type != (type_)) { return ret_; }
2869#define CGLTF_CHECK_KEY(tok_) if ((tok_).type != JSMN_STRING || (tok_).size == 0) { return CGLTF_ERROR_JSON; }
2871#define CGLTF_PTRINDEX(type, idx) (type*)((cgltf_size)idx + 1)
2872#define CGLTF_PTRFIXUP(var, data, size) if (var) { if ((cgltf_size)var > size) { return CGLTF_ERROR_JSON; } var = &data[(cgltf_size)var-1]; }
2873#define CGLTF_PTRFIXUP_REQ(var, data, size) if (!var || (cgltf_size)var > size) { return CGLTF_ERROR_JSON; } var = &data[(cgltf_size)var-1];
2875static int cgltf_json_strcmp(jsmntok_t
const* tok,
const uint8_t* json_chunk,
const char* str)
2877 CGLTF_CHECK_TOKTYPE(*tok, JSMN_STRING);
2878 size_t const str_len = strlen(str);
2879 size_t const name_length = (size_t)(tok->end - tok->start);
2880 return (str_len == name_length) ? strncmp((
const char*)json_chunk + tok->start, str, str_len) : 128;
2883static int cgltf_json_to_int(jsmntok_t
const* tok,
const uint8_t* json_chunk)
2885 CGLTF_CHECK_TOKTYPE(*tok, JSMN_PRIMITIVE);
2887 int size = (size_t)(tok->end - tok->start) <
sizeof(tmp) ? (
int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1);
2888 strncpy(tmp, (
const char*)json_chunk + tok->start, size);
2890 return CGLTF_ATOI(tmp);
2893static cgltf_size cgltf_json_to_size(jsmntok_t
const* tok,
const uint8_t* json_chunk)
2895 CGLTF_CHECK_TOKTYPE_RET(*tok, JSMN_PRIMITIVE, 0);
2897 int size = (size_t)(tok->end - tok->start) <
sizeof(tmp) ? (
int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1);
2898 strncpy(tmp, (
const char*)json_chunk + tok->start, size);
2900 long long res = CGLTF_ATOLL(tmp);
2904static cgltf_float cgltf_json_to_float(jsmntok_t
const* tok,
const uint8_t* json_chunk)
2906 CGLTF_CHECK_TOKTYPE(*tok, JSMN_PRIMITIVE);
2908 int size = (size_t)(tok->end - tok->start) <
sizeof(tmp) ? (
int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1);
2909 strncpy(tmp, (
const char*)json_chunk + tok->start, size);
2914static cgltf_bool cgltf_json_to_bool(jsmntok_t
const* tok,
const uint8_t* json_chunk)
2916 int size = (int)(tok->end - tok->start);
2917 return size == 4 && memcmp(json_chunk + tok->start,
"true", 4) == 0;
2920static int cgltf_skip_json(jsmntok_t
const* tokens,
int i)
2926 switch (tokens[i].type)
2929 end += tokens[i].size * 2;
2933 end += tokens[i].size;
2936 case JSMN_PRIMITIVE:
2950static void cgltf_fill_float_array(
float* out_array,
int size,
float value)
2952 for (
int j = 0; j < size; ++j)
2954 out_array[j] = value;
2958static int cgltf_parse_json_float_array(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
float* out_array,
int size)
2960 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_ARRAY);
2961 if (tokens[i].size != size)
2963 return CGLTF_ERROR_JSON;
2966 for (
int j = 0; j < size; ++j)
2968 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
2969 out_array[j] = cgltf_json_to_float(tokens + i, json_chunk);
2975static int cgltf_parse_json_string(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
char** out_string)
2977 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_STRING);
2980 return CGLTF_ERROR_JSON;
2982 int size = (int)(tokens[i].end - tokens[i].start);
2986 return CGLTF_ERROR_NOMEM;
2988 strncpy(result, (
const char*)json_chunk + tokens[i].start, size);
2990 *out_string = result;
2994static int cgltf_parse_json_array(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
size_t element_size,
void** out_array,
cgltf_size* out_size)
2997 if (tokens[i].type != JSMN_ARRAY)
2999 return tokens[i].type == JSMN_OBJECT ? CGLTF_ERROR_LEGACY : CGLTF_ERROR_JSON;
3003 return CGLTF_ERROR_JSON;
3005 int size = tokens[i].size;
3006 void* result = cgltf_calloc(options, element_size, size);
3009 return CGLTF_ERROR_NOMEM;
3011 *out_array = result;
3016static int cgltf_parse_json_string_array(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
char*** out_array,
cgltf_size* out_size)
3018 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_ARRAY);
3019 i = cgltf_parse_json_array(options, tokens, i, json_chunk,
sizeof(
char*), (
void**)out_array, out_size);
3027 i = cgltf_parse_json_string(options, tokens, i, json_chunk, j + (*out_array));
3036static void cgltf_parse_attribute_type(
const char* name,
cgltf_attribute_type* out_type,
int* out_index)
3044 const char* us = strchr(name,
'_');
3045 size_t len = us ? (size_t)(us - name) : strlen(name);
3047 if (len == 8 && strncmp(name,
"POSITION", 8) == 0)
3051 else if (len == 6 && strncmp(name,
"NORMAL", 6) == 0)
3055 else if (len == 7 && strncmp(name,
"TANGENT", 7) == 0)
3059 else if (len == 8 && strncmp(name,
"TEXCOORD", 8) == 0)
3063 else if (len == 5 && strncmp(name,
"COLOR", 5) == 0)
3067 else if (len == 6 && strncmp(name,
"JOINTS", 6) == 0)
3071 else if (len == 7 && strncmp(name,
"WEIGHTS", 7) == 0)
3082 *out_index = CGLTF_ATOI(us + 1);
3091static int cgltf_parse_json_attribute_list(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_attribute** out_attributes,
cgltf_size* out_attributes_count)
3093 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3095 if (*out_attributes)
3097 return CGLTF_ERROR_JSON;
3100 *out_attributes_count = tokens[i].size;
3104 if (!*out_attributes)
3106 return CGLTF_ERROR_NOMEM;
3109 for (
cgltf_size j = 0; j < *out_attributes_count; ++j)
3111 CGLTF_CHECK_KEY(tokens[i]);
3113 i = cgltf_parse_json_string(options, tokens, i, json_chunk, &(*out_attributes)[j].name);
3116 return CGLTF_ERROR_JSON;
3119 cgltf_parse_attribute_type((*out_attributes)[j].name, &(*out_attributes)[j].type, &(*out_attributes)[j].index);
3121 (*out_attributes)[j].data = CGLTF_PTRINDEX(
cgltf_accessor, cgltf_json_to_int(tokens + i, json_chunk));
3128static int cgltf_parse_json_extras(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_extras* out_extras)
3130 if (out_extras->
data)
3132 return CGLTF_ERROR_JSON;
3139 size_t start = tokens[i].start;
3140 size_t size = tokens[i].end - start;
3142 if (!out_extras->
data)
3144 return CGLTF_ERROR_NOMEM;
3146 strncpy(out_extras->
data, (
const char*)json_chunk + start, size);
3147 out_extras->
data[size] =
'\0';
3149 i = cgltf_skip_json(tokens, i);
3153static int cgltf_parse_json_unprocessed_extension(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_extension* out_extension)
3155 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_STRING);
3156 CGLTF_CHECK_TOKTYPE(tokens[i+1], JSMN_OBJECT);
3157 if (out_extension->
name)
3159 return CGLTF_ERROR_JSON;
3162 cgltf_size name_length = tokens[i].end - tokens[i].start;
3164 if (!out_extension->
name)
3166 return CGLTF_ERROR_NOMEM;
3168 strncpy(out_extension->
name, (
const char*)json_chunk + tokens[i].start, name_length);
3169 out_extension->
name[name_length] = 0;
3172 size_t start = tokens[i].start;
3173 size_t size = tokens[i].end - start;
3175 if (!out_extension->
data)
3177 return CGLTF_ERROR_NOMEM;
3179 strncpy(out_extension->
data, (
const char*)json_chunk + start, size);
3180 out_extension->
data[size] =
'\0';
3182 i = cgltf_skip_json(tokens, i);
3187static int cgltf_parse_json_unprocessed_extensions(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_size* out_extensions_count,
cgltf_extension** out_extensions)
3191 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3194 return CGLTF_ERROR_JSON;
3197 int extensions_size = tokens[i].size;
3198 *out_extensions_count = 0;
3201 if (!*out_extensions)
3203 return CGLTF_ERROR_NOMEM;
3208 for (
int j = 0; j < extensions_size; ++j)
3210 CGLTF_CHECK_KEY(tokens[i]);
3212 cgltf_size extension_index = (*out_extensions_count)++;
3214 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, extension);
3226 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3228 int size = tokens[i].size;
3231 for (
int j = 0; j < size; ++j)
3233 CGLTF_CHECK_KEY(tokens[i]);
3235 if (cgltf_json_strcmp(tokens + i, json_chunk,
"attributes") == 0)
3237 i = cgltf_parse_json_attribute_list(options, tokens, i + 1, json_chunk, &out_draco_mesh_compression->
attributes, &out_draco_mesh_compression->
attributes_count);
3239 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"bufferView") == 0)
3247 i = cgltf_skip_json(tokens, i+1);
3261 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3263 int size = tokens[i].size;
3266 for (
int j = 0; j < size; ++j)
3268 CGLTF_CHECK_KEY(tokens[i]);
3270 if (cgltf_json_strcmp(tokens + i, json_chunk,
"attributes") == 0)
3272 i = cgltf_parse_json_attribute_list(options, tokens, i + 1, json_chunk, &out_mesh_gpu_instancing->
attributes, &out_mesh_gpu_instancing->
attributes_count);
3276 i = cgltf_skip_json(tokens, i+1);
3291 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_ARRAY);
3293 int size = tokens[i].size;
3296 for (
int j = 0; j < size; ++j)
3298 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3300 int obj_size = tokens[i].size;
3304 int variants_tok = -1;
3305 int extras_tok = -1;
3307 for (
int k = 0; k < obj_size; ++k)
3309 CGLTF_CHECK_KEY(tokens[i]);
3311 if (cgltf_json_strcmp(tokens + i, json_chunk,
"material") == 0)
3314 material = cgltf_json_to_int(tokens + i, json_chunk);
3317 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"variants") == 0)
3320 CGLTF_CHECK_TOKTYPE(tokens[variants_tok], JSMN_ARRAY);
3322 i = cgltf_skip_json(tokens, i+1);
3324 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
3327 i = cgltf_skip_json(tokens, extras_tok);
3331 i = cgltf_skip_json(tokens, i+1);
3340 if (material < 0 || variants_tok < 0)
3342 return CGLTF_ERROR_JSON;
3347 for (
int k = 0; k < tokens[variants_tok].size; ++k)
3349 int variant = cgltf_json_to_int(&tokens[variants_tok + 1 + k], json_chunk);
3354 out_mappings[*offset].
variant = variant;
3356 if (extras_tok >= 0)
3358 int e = cgltf_parse_json_extras(options, tokens, extras_tok, json_chunk, &out_mappings[*offset].extras);
3368 (*offset) += tokens[variants_tok].size;
3375static int cgltf_parse_json_material_mappings(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_primitive* out_prim)
3377 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3379 int size = tokens[i].size;
3382 for (
int j = 0; j < size; ++j)
3384 CGLTF_CHECK_KEY(tokens[i]);
3386 if (cgltf_json_strcmp(tokens + i, json_chunk,
"mappings") == 0)
3390 return CGLTF_ERROR_JSON;
3394 int k = cgltf_parse_json_material_mapping_data(options, tokens, i + 1, json_chunk, NULL, &mappings_offset);
3403 mappings_offset = 0;
3404 i = cgltf_parse_json_material_mapping_data(options, tokens, i + 1, json_chunk, out_prim->
mappings, &mappings_offset);
3408 i = cgltf_skip_json(tokens, i+1);
3420static cgltf_primitive_type cgltf_json_to_primitive_type(jsmntok_t
const* tok,
const uint8_t* json_chunk)
3422 int type = cgltf_json_to_int(tok, json_chunk);
3445static int cgltf_parse_json_primitive(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_primitive* out_prim)
3447 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3451 int size = tokens[i].size;
3454 for (
int j = 0; j < size; ++j)
3456 CGLTF_CHECK_KEY(tokens[i]);
3458 if (cgltf_json_strcmp(tokens+i, json_chunk,
"mode") == 0)
3461 out_prim->
type = cgltf_json_to_primitive_type(tokens+i, json_chunk);
3464 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"indices") == 0)
3470 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"material") == 0)
3476 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"attributes") == 0)
3480 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"targets") == 0)
3497 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
3499 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_prim->
extras);
3501 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
3505 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3508 return CGLTF_ERROR_JSON;
3511 int extensions_size = tokens[i].size;
3517 return CGLTF_ERROR_NOMEM;
3521 for (
int k = 0; k < extensions_size; ++k)
3523 CGLTF_CHECK_KEY(tokens[i]);
3525 if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_draco_mesh_compression") == 0)
3528 i = cgltf_parse_json_draco_mesh_compression(options, tokens, i + 1, json_chunk, &out_prim->
draco_mesh_compression);
3530 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_variants") == 0)
3532 i = cgltf_parse_json_material_mappings(options, tokens, i + 1, json_chunk, out_prim);
3536 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_prim->
extensions[out_prim->
extensions_count++]));
3547 i = cgltf_skip_json(tokens, i+1);
3559static int cgltf_parse_json_mesh(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_mesh* out_mesh)
3561 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3563 int size = tokens[i].size;
3566 for (
int j = 0; j < size; ++j)
3568 CGLTF_CHECK_KEY(tokens[i]);
3570 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
3572 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_mesh->
name);
3574 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"primitives") == 0)
3584 i = cgltf_parse_json_primitive(options, tokens, i, json_chunk, &out_mesh->
primitives[prim_index]);
3591 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"weights") == 0)
3599 i = cgltf_parse_json_float_array(tokens, i - 1, json_chunk, out_mesh->
weights, (
int)out_mesh->
weights_count);
3601 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
3608 if (tokens[i].type == JSMN_OBJECT)
3610 int extras_size = tokens[i].size;
3613 for (
int k = 0; k < extras_size; ++k)
3615 CGLTF_CHECK_KEY(tokens[i]);
3617 if (cgltf_json_strcmp(tokens+i, json_chunk,
"targetNames") == 0 && tokens[i+1].type == JSMN_ARRAY)
3623 i = cgltf_skip_json(tokens, i+1);
3634 i = cgltf_skip_json(tokens, i);
3637 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
3639 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_mesh->
extensions_count, &out_mesh->
extensions);
3643 i = cgltf_skip_json(tokens, i+1);
3655static int cgltf_parse_json_meshes(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
3665 i = cgltf_parse_json_mesh(options, tokens, i, json_chunk, &out_data->
meshes[j]);
3674static cgltf_component_type cgltf_json_to_component_type(jsmntok_t
const* tok,
const uint8_t* json_chunk)
3676 int type = cgltf_json_to_int(tok, json_chunk);
3697static int cgltf_parse_json_accessor_sparse(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_accessor_sparse* out_sparse)
3699 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3701 int size = tokens[i].size;
3704 for (
int j = 0; j < size; ++j)
3706 CGLTF_CHECK_KEY(tokens[i]);
3708 if (cgltf_json_strcmp(tokens+i, json_chunk,
"count") == 0)
3711 out_sparse->
count = cgltf_json_to_size(tokens + i, json_chunk);
3714 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"indices") == 0)
3717 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3719 int indices_size = tokens[i].size;
3722 for (
int k = 0; k < indices_size; ++k)
3724 CGLTF_CHECK_KEY(tokens[i]);
3726 if (cgltf_json_strcmp(tokens+i, json_chunk,
"bufferView") == 0)
3732 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
3738 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"componentType") == 0)
3746 i = cgltf_skip_json(tokens, i+1);
3755 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"values") == 0)
3758 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3760 int values_size = tokens[i].size;
3763 for (
int k = 0; k < values_size; ++k)
3765 CGLTF_CHECK_KEY(tokens[i]);
3767 if (cgltf_json_strcmp(tokens+i, json_chunk,
"bufferView") == 0)
3773 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
3781 i = cgltf_skip_json(tokens, i+1);
3792 i = cgltf_skip_json(tokens, i+1);
3804static int cgltf_parse_json_accessor(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_accessor* out_accessor)
3806 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3808 int size = tokens[i].size;
3811 for (
int j = 0; j < size; ++j)
3813 CGLTF_CHECK_KEY(tokens[i]);
3815 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
3817 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_accessor->
name);
3819 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"bufferView") == 0)
3825 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
3829 cgltf_json_to_size(tokens+i, json_chunk);
3832 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"componentType") == 0)
3835 out_accessor->
component_type = cgltf_json_to_component_type(tokens + i, json_chunk);
3838 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"normalized") == 0)
3841 out_accessor->
normalized = cgltf_json_to_bool(tokens+i, json_chunk);
3844 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"count") == 0)
3847 out_accessor->
count = cgltf_json_to_size(tokens+i, json_chunk);
3850 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"type") == 0)
3853 if (cgltf_json_strcmp(tokens+i, json_chunk,
"SCALAR") == 0)
3857 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"VEC2") == 0)
3861 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"VEC3") == 0)
3865 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"VEC4") == 0)
3869 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"MAT2") == 0)
3873 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"MAT3") == 0)
3877 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"MAT4") == 0)
3883 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"min") == 0)
3888 int min_size = tokens[i].size > 16 ? 16 : tokens[i].size;
3889 i = cgltf_parse_json_float_array(tokens, i, json_chunk, out_accessor->
min, min_size);
3891 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"max") == 0)
3896 int max_size = tokens[i].size > 16 ? 16 : tokens[i].size;
3897 i = cgltf_parse_json_float_array(tokens, i, json_chunk, out_accessor->
max, max_size);
3899 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"sparse") == 0)
3902 i = cgltf_parse_json_accessor_sparse(tokens, i + 1, json_chunk, &out_accessor->
sparse);
3904 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
3906 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_accessor->
extras);
3908 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
3910 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_accessor->
extensions_count, &out_accessor->
extensions);
3914 i = cgltf_skip_json(tokens, i+1);
3926static int cgltf_parse_json_texture_transform(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_texture_transform* out_texture_transform)
3928 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3930 int size = tokens[i].size;
3933 for (
int j = 0; j < size; ++j)
3935 CGLTF_CHECK_KEY(tokens[i]);
3937 if (cgltf_json_strcmp(tokens + i, json_chunk,
"offset") == 0)
3939 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_texture_transform->
offset, 2);
3941 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"rotation") == 0)
3944 out_texture_transform->
rotation = cgltf_json_to_float(tokens + i, json_chunk);
3947 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"scale") == 0)
3949 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_texture_transform->
scale, 2);
3951 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"texCoord") == 0)
3955 out_texture_transform->
texcoord = cgltf_json_to_int(tokens + i, json_chunk);
3960 i = cgltf_skip_json(tokens, i + 1);
3972static int cgltf_parse_json_texture_view(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_texture_view* out_texture_view)
3976 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3978 out_texture_view->
scale = 1.0f;
3979 cgltf_fill_float_array(out_texture_view->
transform.
scale, 2, 1.0f);
3981 int size = tokens[i].size;
3984 for (
int j = 0; j < size; ++j)
3986 CGLTF_CHECK_KEY(tokens[i]);
3988 if (cgltf_json_strcmp(tokens + i, json_chunk,
"index") == 0)
3991 out_texture_view->
texture = CGLTF_PTRINDEX(
cgltf_texture, cgltf_json_to_int(tokens + i, json_chunk));
3994 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"texCoord") == 0)
3997 out_texture_view->
texcoord = cgltf_json_to_int(tokens + i, json_chunk);
4000 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"scale") == 0)
4003 out_texture_view->
scale = cgltf_json_to_float(tokens + i, json_chunk);
4006 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"strength") == 0)
4009 out_texture_view->
scale = cgltf_json_to_float(tokens + i, json_chunk);
4012 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
4016 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4017 int extensions_size = tokens[i].size;
4021 for (
int k = 0; k < extensions_size; ++k)
4023 CGLTF_CHECK_KEY(tokens[i]);
4025 if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_texture_transform") == 0)
4028 i = cgltf_parse_json_texture_transform(tokens, i + 1, json_chunk, &out_texture_view->
transform);
4032 i = cgltf_skip_json(tokens, i + 1);
4043 i = cgltf_skip_json(tokens, i + 1);
4057 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4059 int size = tokens[i].size;
4062 for (
int j = 0; j < size; ++j)
4064 CGLTF_CHECK_KEY(tokens[i]);
4066 if (cgltf_json_strcmp(tokens+i, json_chunk,
"metallicFactor") == 0)
4070 cgltf_json_to_float(tokens + i, json_chunk);
4073 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"roughnessFactor") == 0)
4077 cgltf_json_to_float(tokens+i, json_chunk);
4080 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"baseColorFactor") == 0)
4082 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_pbr->
base_color_factor, 4);
4084 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"baseColorTexture") == 0)
4086 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_pbr->
base_color_texture);
4088 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"metallicRoughnessTexture") == 0)
4094 i = cgltf_skip_json(tokens, i+1);
4108 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4109 int size = tokens[i].size;
4112 for (
int j = 0; j < size; ++j)
4114 CGLTF_CHECK_KEY(tokens[i]);
4116 if (cgltf_json_strcmp(tokens+i, json_chunk,
"diffuseFactor") == 0)
4118 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_pbr->
diffuse_factor, 4);
4120 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularFactor") == 0)
4122 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_pbr->
specular_factor, 3);
4124 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"glossinessFactor") == 0)
4130 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"diffuseTexture") == 0)
4132 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_pbr->
diffuse_texture);
4134 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularGlossinessTexture") == 0)
4140 i = cgltf_skip_json(tokens, i+1);
4152static int cgltf_parse_json_clearcoat(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_clearcoat* out_clearcoat)
4154 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4155 int size = tokens[i].size;
4158 for (
int j = 0; j < size; ++j)
4160 CGLTF_CHECK_KEY(tokens[i]);
4162 if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatFactor") == 0)
4165 out_clearcoat->
clearcoat_factor = cgltf_json_to_float(tokens + i, json_chunk);
4168 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatRoughnessFactor") == 0)
4174 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatTexture") == 0)
4176 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_clearcoat->
clearcoat_texture);
4178 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatRoughnessTexture") == 0)
4182 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatNormalTexture") == 0)
4188 i = cgltf_skip_json(tokens, i+1);
4200static int cgltf_parse_json_ior(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_ior* out_ior)
4202 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4203 int size = tokens[i].size;
4207 out_ior->
ior = 1.5f;
4209 for (
int j = 0; j < size; ++j)
4211 CGLTF_CHECK_KEY(tokens[i]);
4213 if (cgltf_json_strcmp(tokens+i, json_chunk,
"ior") == 0)
4216 out_ior->
ior = cgltf_json_to_float(tokens + i, json_chunk);
4221 i = cgltf_skip_json(tokens, i+1);
4233static int cgltf_parse_json_specular(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_specular* out_specular)
4235 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4236 int size = tokens[i].size;
4243 for (
int j = 0; j < size; ++j)
4245 CGLTF_CHECK_KEY(tokens[i]);
4247 if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularFactor") == 0)
4250 out_specular->
specular_factor = cgltf_json_to_float(tokens + i, json_chunk);
4253 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularColorFactor") == 0)
4255 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_specular->
specular_color_factor, 3);
4257 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularTexture") == 0)
4259 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_specular->
specular_texture);
4261 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"specularColorTexture") == 0)
4263 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_specular->
specular_color_texture);
4267 i = cgltf_skip_json(tokens, i+1);
4279static int cgltf_parse_json_transmission(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_transmission* out_transmission)
4281 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4282 int size = tokens[i].size;
4285 for (
int j = 0; j < size; ++j)
4287 CGLTF_CHECK_KEY(tokens[i]);
4289 if (cgltf_json_strcmp(tokens+i, json_chunk,
"transmissionFactor") == 0)
4295 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"transmissionTexture") == 0)
4297 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_transmission->
transmission_texture);
4301 i = cgltf_skip_json(tokens, i+1);
4313static int cgltf_parse_json_volume(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_volume* out_volume)
4315 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4316 int size = tokens[i].size;
4319 for (
int j = 0; j < size; ++j)
4321 CGLTF_CHECK_KEY(tokens[i]);
4323 if (cgltf_json_strcmp(tokens + i, json_chunk,
"thicknessFactor") == 0)
4326 out_volume->
thickness_factor = cgltf_json_to_float(tokens + i, json_chunk);
4329 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"thicknessTexture") == 0)
4331 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_volume->
thickness_texture);
4333 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"attenuationColor") == 0)
4335 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_volume->
attenuation_color, 3);
4337 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"attenuationDistance") == 0)
4345 i = cgltf_skip_json(tokens, i + 1);
4357static int cgltf_parse_json_sheen(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_sheen* out_sheen)
4359 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4360 int size = tokens[i].size;
4363 for (
int j = 0; j < size; ++j)
4365 CGLTF_CHECK_KEY(tokens[i]);
4367 if (cgltf_json_strcmp(tokens+i, json_chunk,
"sheenColorFactor") == 0)
4369 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_sheen->
sheen_color_factor, 3);
4371 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"sheenColorTexture") == 0)
4373 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_sheen->
sheen_color_texture);
4375 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"sheenRoughnessFactor") == 0)
4381 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"sheenRoughnessTexture") == 0)
4387 i = cgltf_skip_json(tokens, i+1);
4399static int cgltf_parse_json_emissive_strength(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_emissive_strength* out_emissive_strength)
4401 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4402 int size = tokens[i].size;
4408 for (
int j = 0; j < size; ++j)
4410 CGLTF_CHECK_KEY(tokens[i]);
4412 if (cgltf_json_strcmp(tokens + i, json_chunk,
"emissiveStrength") == 0)
4415 out_emissive_strength->
emissive_strength = cgltf_json_to_float(tokens + i, json_chunk);
4420 i = cgltf_skip_json(tokens, i + 1);
4432static int cgltf_parse_json_iridescence(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_iridescence* out_iridescence)
4434 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4435 int size = tokens[i].size;
4443 for (
int j = 0; j < size; ++j)
4445 CGLTF_CHECK_KEY(tokens[i]);
4447 if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceFactor") == 0)
4453 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceTexture") == 0)
4455 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_iridescence->
iridescence_texture);
4457 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceIor") == 0)
4460 out_iridescence->
iridescence_ior = cgltf_json_to_float(tokens + i, json_chunk);
4463 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceThicknessMinimum") == 0)
4469 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceThicknessMaximum") == 0)
4475 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceThicknessTexture") == 0)
4481 i = cgltf_skip_json(tokens, i + 1);
4495 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4496 int size = tokens[i].size;
4503 for (
int j = 0; j < size; ++j)
4505 CGLTF_CHECK_KEY(tokens[i]);
4507 if (cgltf_json_strcmp(tokens + i, json_chunk,
"diffuseTransmissionFactor") == 0)
4513 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"diffuseTransmissionTexture") == 0)
4517 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"diffuseTransmissionColorFactor") == 0)
4521 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"diffuseTransmissionColorTexture") == 0)
4527 i = cgltf_skip_json(tokens, i + 1);
4539static int cgltf_parse_json_subsurface(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_subsurface* out_subsurface)
4541 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4542 int size = tokens[i].size;
4552 for (
int j = 0; j < size; ++j)
4554 CGLTF_CHECK_KEY(tokens[i]);
4556 if (cgltf_json_strcmp(tokens + i, json_chunk,
"subsurfaceMethod") == 0)
4558 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_subsurface->
subsurface_method);
4560 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"subsurfaceWeight") == 0)
4563 out_subsurface->
subsurface_weight = cgltf_json_to_float(tokens + i, json_chunk);
4566 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"subsurfaceRadius") == 0)
4568 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_subsurface->
subsurface_radius, 3);
4570 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"subsurfaceScale") == 0)
4573 out_subsurface->
subsurface_scale = cgltf_json_to_float(tokens + i, json_chunk);
4578 i = cgltf_skip_json(tokens, i + 1);
4590static int cgltf_parse_json_anisotropy(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_anisotropy* out_anisotropy)
4592 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4593 int size = tokens[i].size;
4597 for (
int j = 0; j < size; ++j)
4599 CGLTF_CHECK_KEY(tokens[i]);
4601 if (cgltf_json_strcmp(tokens + i, json_chunk,
"anisotropyStrength") == 0)
4607 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"anisotropyRotation") == 0)
4613 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"anisotropyTexture") == 0)
4615 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_anisotropy->
anisotropy_texture);
4619 i = cgltf_skip_json(tokens, i + 1);
4631static int cgltf_parse_json_dispersion(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_dispersion* out_dispersion)
4633 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4634 int size = tokens[i].size;
4638 for (
int j = 0; j < size; ++j)
4640 CGLTF_CHECK_KEY(tokens[i]);
4642 if (cgltf_json_strcmp(tokens + i, json_chunk,
"dispersion") == 0)
4645 out_dispersion->
dispersion = cgltf_json_to_float(tokens + i, json_chunk);
4650 i = cgltf_skip_json(tokens, i + 1);
4662static int cgltf_parse_json_foundation_materials(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_foundation_materials* out_materials)
4664 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4669 int size = tokens[i].size;
4672 for (
int j = 0; j < size; ++j)
4674 CGLTF_CHECK_KEY(tokens[i]);
4676 if (cgltf_json_strcmp(tokens + i, json_chunk,
"shaderBlock") == 0)
4680 if (cgltf_json_strcmp(tokens + i, json_chunk,
"principled") == 0)
4684 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"hair") == 0)
4690 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"model") == 0)
4693 if (cgltf_json_strcmp(tokens + i, json_chunk,
"chiang") == 0)
4703 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"betaM") == 0)
4707 out_materials->
hair_beta_m = cgltf_json_to_float(tokens + i, json_chunk);
4710 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"betaN") == 0)
4714 out_materials->
hair_beta_n = cgltf_json_to_float(tokens + i, json_chunk);
4717 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"alpha") == 0)
4721 out_materials->
hair_alpha = cgltf_json_to_float(tokens + i, json_chunk);
4724 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"ior") == 0)
4728 out_materials->
ior = cgltf_json_to_float(tokens + i, json_chunk);
4733 i = cgltf_skip_json(tokens, i + 1);
4745static int cgltf_parse_json_image(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_image* out_image)
4747 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4749 int size = tokens[i].size;
4752 for (
int j = 0; j < size; ++j)
4754 CGLTF_CHECK_KEY(tokens[i]);
4756 if (cgltf_json_strcmp(tokens + i, json_chunk,
"uri") == 0)
4758 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_image->
uri);
4760 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"bufferView") == 0)
4766 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"mimeType") == 0)
4768 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_image->
mime_type);
4770 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
4772 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_image->
name);
4774 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
4776 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_image->
extras);
4778 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
4780 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_image->
extensions_count, &out_image->
extensions);
4784 i = cgltf_skip_json(tokens, i + 1);
4796static int cgltf_parse_json_sampler(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_sampler* out_sampler)
4799 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4804 int size = tokens[i].size;
4807 for (
int j = 0; j < size; ++j)
4809 CGLTF_CHECK_KEY(tokens[i]);
4811 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
4813 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_sampler->
name);
4815 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"magFilter") == 0)
4822 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"minFilter") == 0)
4829 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"wrapS") == 0)
4836 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"wrapT") == 0)
4843 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
4845 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sampler->
extras);
4847 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
4849 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sampler->
extensions_count, &out_sampler->
extensions);
4853 i = cgltf_skip_json(tokens, i + 1);
4865static int cgltf_parse_json_texture(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_texture* out_texture)
4867 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4869 int size = tokens[i].size;
4872 for (
int j = 0; j < size; ++j)
4874 CGLTF_CHECK_KEY(tokens[i]);
4876 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
4878 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_texture->
name);
4880 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"sampler") == 0)
4883 out_texture->
sampler = CGLTF_PTRINDEX(
cgltf_sampler, cgltf_json_to_int(tokens + i, json_chunk));
4886 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"source") == 0)
4889 out_texture->
image = CGLTF_PTRINDEX(
cgltf_image, cgltf_json_to_int(tokens + i, json_chunk));
4892 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
4894 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_texture->
extras);
4896 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
4900 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4903 return CGLTF_ERROR_JSON;
4906 int extensions_size = tokens[i].size;
4913 return CGLTF_ERROR_NOMEM;
4916 for (
int k = 0; k < extensions_size; ++k)
4918 CGLTF_CHECK_KEY(tokens[i]);
4920 if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_texture_basisu") == 0)
4924 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4925 int num_properties = tokens[i].size;
4928 for (
int t = 0; t < num_properties; ++t)
4930 CGLTF_CHECK_KEY(tokens[i]);
4932 if (cgltf_json_strcmp(tokens + i, json_chunk,
"source") == 0)
4940 i = cgltf_skip_json(tokens, i + 1);
4948 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"EXT_texture_webp") == 0)
4952 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4953 int num_properties = tokens[i].size;
4956 for (
int t = 0; t < num_properties; ++t)
4958 CGLTF_CHECK_KEY(tokens[i]);
4960 if (cgltf_json_strcmp(tokens + i, json_chunk,
"source") == 0)
4968 i = cgltf_skip_json(tokens, i + 1);
4978 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_texture->
extensions[out_texture->
extensions_count++]));
4989 i = cgltf_skip_json(tokens, i + 1);
5001static int cgltf_parse_json_material(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_material* out_material)
5003 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5018 int size = tokens[i].size;
5021 for (
int j = 0; j < size; ++j)
5023 CGLTF_CHECK_KEY(tokens[i]);
5025 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
5027 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_material->
name);
5029 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"pbrMetallicRoughness") == 0)
5032 i = cgltf_parse_json_pbr_metallic_roughness(options, tokens, i + 1, json_chunk, &out_material->
pbr_metallic_roughness);
5034 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"emissiveFactor") == 0)
5036 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_material->
emissive_factor, 3);
5038 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"normalTexture") == 0)
5040 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk,
5043 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"occlusionTexture") == 0)
5045 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk,
5048 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"emissiveTexture") == 0)
5050 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk,
5053 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"alphaMode") == 0)
5056 if (cgltf_json_strcmp(tokens + i, json_chunk,
"OPAQUE") == 0)
5060 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"MASK") == 0)
5064 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"BLEND") == 0)
5070 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"alphaCutoff") == 0)
5073 out_material->
alpha_cutoff = cgltf_json_to_float(tokens + i, json_chunk);
5076 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"doubleSided") == 0)
5080 cgltf_json_to_bool(tokens + i, json_chunk);
5083 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5085 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_material->
extras);
5087 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5091 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5094 return CGLTF_ERROR_JSON;
5097 int extensions_size = tokens[i].size;
5104 return CGLTF_ERROR_NOMEM;
5107 for (
int k = 0; k < extensions_size; ++k)
5109 CGLTF_CHECK_KEY(tokens[i]);
5111 if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_pbrSpecularGlossiness") == 0)
5114 i = cgltf_parse_json_pbr_specular_glossiness(options, tokens, i + 1, json_chunk, &out_material->
pbr_specular_glossiness);
5116 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_unlit") == 0)
5118 out_material->
unlit = 1;
5119 i = cgltf_skip_json(tokens, i+1);
5121 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_clearcoat") == 0)
5124 i = cgltf_parse_json_clearcoat(options, tokens, i + 1, json_chunk, &out_material->
clearcoat);
5126 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_ior") == 0)
5129 i = cgltf_parse_json_ior(tokens, i + 1, json_chunk, &out_material->
ior);
5131 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_specular") == 0)
5134 i = cgltf_parse_json_specular(options, tokens, i + 1, json_chunk, &out_material->
specular);
5136 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_transmission") == 0)
5139 i = cgltf_parse_json_transmission(options, tokens, i + 1, json_chunk, &out_material->
transmission);
5141 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_volume") == 0)
5144 i = cgltf_parse_json_volume(options, tokens, i + 1, json_chunk, &out_material->
volume);
5146 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_sheen") == 0)
5149 i = cgltf_parse_json_sheen(options, tokens, i + 1, json_chunk, &out_material->
sheen);
5151 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_emissive_strength") == 0)
5154 i = cgltf_parse_json_emissive_strength(tokens, i + 1, json_chunk, &out_material->
emissive_strength);
5156 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_iridescence") == 0)
5159 i = cgltf_parse_json_iridescence(options, tokens, i + 1, json_chunk, &out_material->
iridescence);
5161 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_diffuse_transmission") == 0)
5164 i = cgltf_parse_json_diffuse_transmission(options, tokens, i + 1, json_chunk, &out_material->
diffuse_transmission);
5166 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"EXT_materials_subsurface") == 0)
5169 i = cgltf_parse_json_subsurface(options, tokens, i + 1, json_chunk, &out_material->
subsurface);
5171 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_anisotropy") == 0)
5174 i = cgltf_parse_json_anisotropy(options, tokens, i + 1, json_chunk, &out_material->
anisotropy);
5176 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_dispersion") == 0)
5179 i = cgltf_parse_json_dispersion(tokens, i + 1, json_chunk, &out_material->
dispersion);
5181 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"EXT_foundation_materials") == 0)
5184 i = cgltf_parse_json_foundation_materials(tokens, i + 1, json_chunk, &out_material->
foundation_materials);
5188 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_material->
extensions[out_material->
extensions_count++]));
5199 i = cgltf_skip_json(tokens, i+1);
5211static int cgltf_parse_json_accessors(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5221 i = cgltf_parse_json_accessor(options, tokens, i, json_chunk, &out_data->
accessors[j]);
5230static int cgltf_parse_json_materials(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5240 i = cgltf_parse_json_material(options, tokens, i, json_chunk, &out_data->
materials[j]);
5249static int cgltf_parse_json_images(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5259 i = cgltf_parse_json_image(options, tokens, i, json_chunk, &out_data->
images[j]);
5268static int cgltf_parse_json_textures(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5278 i = cgltf_parse_json_texture(options, tokens, i, json_chunk, &out_data->
textures[j]);
5287static int cgltf_parse_json_samplers(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5297 i = cgltf_parse_json_sampler(options, tokens, i, json_chunk, &out_data->
samplers[j]);
5309 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5311 int size = tokens[i].size;
5314 for (
int j = 0; j < size; ++j)
5316 CGLTF_CHECK_KEY(tokens[i]);
5318 if (cgltf_json_strcmp(tokens+i, json_chunk,
"buffer") == 0)
5321 out_meshopt_compression->
buffer = CGLTF_PTRINDEX(
cgltf_buffer, cgltf_json_to_int(tokens + i, json_chunk));
5324 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
5327 out_meshopt_compression->
offset = cgltf_json_to_size(tokens+i, json_chunk);
5330 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteLength") == 0)
5333 out_meshopt_compression->
size = cgltf_json_to_size(tokens+i, json_chunk);
5336 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteStride") == 0)
5339 out_meshopt_compression->
stride = cgltf_json_to_size(tokens+i, json_chunk);
5342 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"count") == 0)
5345 out_meshopt_compression->
count = cgltf_json_to_size(tokens+i, json_chunk);
5348 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"mode") == 0)
5351 if (cgltf_json_strcmp(tokens+i, json_chunk,
"ATTRIBUTES") == 0)
5355 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"TRIANGLES") == 0)
5359 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"INDICES") == 0)
5365 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"filter") == 0)
5368 if (cgltf_json_strcmp(tokens+i, json_chunk,
"NONE") == 0)
5372 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"OCTAHEDRAL") == 0)
5376 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"QUATERNION") == 0)
5380 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXPONENTIAL") == 0)
5388 i = cgltf_skip_json(tokens, i+1);
5400static int cgltf_parse_json_buffer_view(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_buffer_view* out_buffer_view)
5402 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5404 int size = tokens[i].size;
5407 for (
int j = 0; j < size; ++j)
5409 CGLTF_CHECK_KEY(tokens[i]);
5411 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
5413 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_buffer_view->
name);
5415 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"buffer") == 0)
5418 out_buffer_view->
buffer = CGLTF_PTRINDEX(
cgltf_buffer, cgltf_json_to_int(tokens + i, json_chunk));
5421 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
5424 out_buffer_view->
offset =
5425 cgltf_json_to_size(tokens+i, json_chunk);
5428 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteLength") == 0)
5431 out_buffer_view->
size =
5432 cgltf_json_to_size(tokens+i, json_chunk);
5435 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteStride") == 0)
5438 out_buffer_view->
stride =
5439 cgltf_json_to_size(tokens+i, json_chunk);
5442 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"target") == 0)
5445 int type = cgltf_json_to_int(tokens+i, json_chunk);
5461 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5463 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_buffer_view->
extras);
5465 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5469 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5472 return CGLTF_ERROR_JSON;
5475 int extensions_size = tokens[i].size;
5481 return CGLTF_ERROR_NOMEM;
5485 for (
int k = 0; k < extensions_size; ++k)
5487 CGLTF_CHECK_KEY(tokens[i]);
5489 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_meshopt_compression") == 0)
5492 i = cgltf_parse_json_meshopt_compression(options, tokens, i + 1, json_chunk, &out_buffer_view->
meshopt_compression);
5496 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_buffer_view->
extensions[out_buffer_view->
extensions_count++]));
5507 i = cgltf_skip_json(tokens, i+1);
5519static int cgltf_parse_json_buffer_views(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5529 i = cgltf_parse_json_buffer_view(options, tokens, i, json_chunk, &out_data->
buffer_views[j]);
5538static int cgltf_parse_json_buffer(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_buffer* out_buffer)
5540 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5542 int size = tokens[i].size;
5545 for (
int j = 0; j < size; ++j)
5547 CGLTF_CHECK_KEY(tokens[i]);
5549 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
5551 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_buffer->
name);
5553 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteLength") == 0)
5557 cgltf_json_to_size(tokens+i, json_chunk);
5560 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"uri") == 0)
5562 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_buffer->
uri);
5564 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5566 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_buffer->
extras);
5568 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5570 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_buffer->
extensions_count, &out_buffer->
extensions);
5574 i = cgltf_skip_json(tokens, i+1);
5586static int cgltf_parse_json_buffers(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5596 i = cgltf_parse_json_buffer(options, tokens, i, json_chunk, &out_data->
buffers[j]);
5605static int cgltf_parse_json_skin(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_skin* out_skin)
5607 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5609 int size = tokens[i].size;
5612 for (
int j = 0; j < size; ++j)
5614 CGLTF_CHECK_KEY(tokens[i]);
5616 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
5618 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_skin->
name);
5620 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"joints") == 0)
5622 i = cgltf_parse_json_array(options, tokens, i + 1, json_chunk,
sizeof(
cgltf_node*), (
void**)&out_skin->
joints, &out_skin->
joints_count);
5630 out_skin->
joints[k] = CGLTF_PTRINDEX(
cgltf_node, cgltf_json_to_int(tokens + i, json_chunk));
5634 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"skeleton") == 0)
5637 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
5638 out_skin->
skeleton = CGLTF_PTRINDEX(
cgltf_node, cgltf_json_to_int(tokens + i, json_chunk));
5641 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"inverseBindMatrices") == 0)
5644 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
5648 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5650 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_skin->
extras);
5652 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5654 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_skin->
extensions_count, &out_skin->
extensions);
5658 i = cgltf_skip_json(tokens, i+1);
5670static int cgltf_parse_json_skins(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5672 i = cgltf_parse_json_array(options, tokens, i, json_chunk,
sizeof(
cgltf_skin), (
void**)&out_data->
skins, &out_data->
skins_count);
5680 i = cgltf_parse_json_skin(options, tokens, i, json_chunk, &out_data->
skins[j]);
5689static int cgltf_parse_json_camera_lens(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_camera_lens* out_lens)
5692 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5695 out_lens->
fstop = 2.8f;
5701 int size = tokens[i].size;
5704 for (
int j = 0; j < size; ++j)
5706 CGLTF_CHECK_KEY(tokens[i]);
5708 if (cgltf_json_strcmp(tokens+i, json_chunk,
"sensorSize") == 0)
5711 out_lens->
sensor_size = cgltf_json_to_float(tokens + i, json_chunk);
5714 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"fStop") == 0)
5717 out_lens->
fstop = cgltf_json_to_float(tokens + i, json_chunk);
5720 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"focusDistance") == 0)
5723 out_lens->
focus_distance = cgltf_json_to_float(tokens + i, json_chunk);
5726 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"apertureBlades") == 0)
5732 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"apertureRotation") == 0)
5738 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"apertureRatio") == 0)
5741 out_lens->
aperture_ratio = cgltf_json_to_float(tokens + i, json_chunk);
5746 i = cgltf_skip_json(tokens, i+1);
5758static int cgltf_parse_json_camera(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_camera* out_camera)
5760 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5762 int size = tokens[i].size;
5765 for (
int j = 0; j < size; ++j)
5767 CGLTF_CHECK_KEY(tokens[i]);
5769 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
5771 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_camera->
name);
5773 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"perspective") == 0)
5777 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5779 int data_size = tokens[i].size;
5784 return CGLTF_ERROR_JSON;
5789 for (
int k = 0; k < data_size; ++k)
5791 CGLTF_CHECK_KEY(tokens[i]);
5793 if (cgltf_json_strcmp(tokens+i, json_chunk,
"aspectRatio") == 0)
5800 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"yfov") == 0)
5806 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"zfar") == 0)
5813 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"znear") == 0)
5819 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5821 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_camera->
data.
perspective.
extras);
5825 i = cgltf_skip_json(tokens, i+1);
5834 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"orthographic") == 0)
5838 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5840 int data_size = tokens[i].size;
5845 return CGLTF_ERROR_JSON;
5850 for (
int k = 0; k < data_size; ++k)
5852 CGLTF_CHECK_KEY(tokens[i]);
5854 if (cgltf_json_strcmp(tokens+i, json_chunk,
"xmag") == 0)
5860 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"ymag") == 0)
5866 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"zfar") == 0)
5872 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"znear") == 0)
5878 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5884 i = cgltf_skip_json(tokens, i+1);
5893 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5895 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_camera->
extras);
5897 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5901 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5904 return CGLTF_ERROR_JSON;
5907 int extensions_size = tokens[i].size;
5909 if (extensions_size > 0)
5914 if (extensions_size > 0 && !out_camera->
extensions)
5916 return CGLTF_ERROR_NOMEM;
5921 for (
int k = 0; k < extensions_size; ++k)
5923 CGLTF_CHECK_KEY(tokens[i]);
5925 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_camera_lens") == 0)
5928 i = cgltf_parse_json_camera_lens(options, tokens, i + 1, json_chunk, &out_camera->
lens);
5932 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_camera->
extensions[out_camera->
extensions_count++]));
5943 i = cgltf_skip_json(tokens, i+1);
5955static int cgltf_parse_json_cameras(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5965 i = cgltf_parse_json_camera(options, tokens, i, json_chunk, &out_data->
cameras[j]);
5974static int cgltf_parse_json_light(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_light* out_light)
5976 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5978 out_light->
color[0] = 1.f;
5979 out_light->
color[1] = 1.f;
5980 out_light->
color[2] = 1.f;
5989 int size = tokens[i].size;
5992 for (
int j = 0; j < size; ++j)
5994 CGLTF_CHECK_KEY(tokens[i]);
5996 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
5998 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_light->
name);
6000 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"color") == 0)
6002 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_light->
color, 3);
6004 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"intensity") == 0)
6007 out_light->
intensity = cgltf_json_to_float(tokens + i, json_chunk);
6010 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"type") == 0)
6013 if (cgltf_json_strcmp(tokens + i, json_chunk,
"directional") == 0)
6017 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"point") == 0)
6021 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"spot") == 0)
6027 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"range") == 0)
6030 out_light->
range = cgltf_json_to_float(tokens + i, json_chunk);
6033 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"spot") == 0)
6037 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6039 int data_size = tokens[i].size;
6042 for (
int k = 0; k < data_size; ++k)
6044 CGLTF_CHECK_KEY(tokens[i]);
6046 if (cgltf_json_strcmp(tokens+i, json_chunk,
"innerConeAngle") == 0)
6052 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"outerConeAngle") == 0)
6060 i = cgltf_skip_json(tokens, i+1);
6069 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
6071 CGLTF_CHECK_TOKTYPE(tokens[i + 1], JSMN_OBJECT);
6072 int extensions_size = tokens[i + 1].size;
6074 for (
int k = 0; k < extensions_size; ++k)
6076 CGLTF_CHECK_KEY(tokens[i]);
6077 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_lights") == 0)
6080 CGLTF_CHECK_TOKTYPE(tokens[i + 1], JSMN_OBJECT);
6081 int ext_size = tokens[i + 1].size;
6083 for (
int m = 0; m < ext_size; ++m)
6085 CGLTF_CHECK_KEY(tokens[i]);
6086 if (cgltf_json_strcmp(tokens+i, json_chunk,
"angularDiameter") == 0)
6094 i = cgltf_skip_json(tokens, i+1);
6096 if (i < 0)
return i;
6101 i = cgltf_skip_json(tokens, i+1);
6103 if (i < 0)
return i;
6106 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6108 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_light->
extras);
6112 i = cgltf_skip_json(tokens, i+1);
6124static int cgltf_parse_json_lights(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6134 i = cgltf_parse_json_light(options, tokens, i, json_chunk, &out_data->
lights[j]);
6143static int cgltf_parse_json_light_area(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_light_area* out_light)
6145 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6147 out_light->
color[0] = 1.f;
6148 out_light->
color[1] = 1.f;
6149 out_light->
color[2] = 1.f;
6152 out_light->
size = 1.f;
6155 int size = tokens[i].size;
6158 for (
int j = 0; j < size; ++j)
6160 CGLTF_CHECK_KEY(tokens[i]);
6162 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
6164 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_light->
name);
6166 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"color") == 0)
6168 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_light->
color, 3);
6170 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"intensity") == 0)
6173 out_light->
intensity = cgltf_json_to_float(tokens + i, json_chunk);
6176 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"type") == 0)
6179 if (cgltf_json_strcmp(tokens + i, json_chunk,
"rect") == 0)
6183 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"disk") == 0)
6189 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"size") == 0)
6192 out_light->
size = cgltf_json_to_float(tokens + i, json_chunk);
6195 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"rect") == 0)
6199 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6201 int data_size = tokens[i].size;
6204 for (
int k = 0; k < data_size; ++k)
6206 CGLTF_CHECK_KEY(tokens[i]);
6208 if (cgltf_json_strcmp(tokens + i, json_chunk,
"aspect") == 0)
6211 out_light->
rect_aspect = cgltf_json_to_float(tokens + i, json_chunk);
6216 i = cgltf_skip_json(tokens, i + 1);
6225 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6227 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_light->
extras);
6231 i = cgltf_skip_json(tokens, i + 1);
6243static int cgltf_parse_json_lights_area(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6253 i = cgltf_parse_json_light_area(options, tokens, i, json_chunk, &out_data->
lights_area[j]);
6262static int cgltf_parse_json_curve(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_curve* out_curve)
6264 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6269 int size = tokens[i].size;
6272 for (
int j = 0; j < size; ++j)
6274 CGLTF_CHECK_KEY(tokens[i]);
6276 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
6278 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_curve->
name);
6280 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"basis") == 0)
6283 if (cgltf_json_strcmp(tokens + i, json_chunk,
"linear") == 0)
6287 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"bezier") == 0)
6291 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"bspline") == 0)
6295 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"catmullRom") == 0)
6301 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"renderMode") == 0)
6304 if (cgltf_json_strcmp(tokens + i, json_chunk,
"capsule") == 0)
6310 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"points") == 0)
6313 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6317 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"curveVertexCounts") == 0)
6320 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6324 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"material") == 0)
6327 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6331 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6333 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_curve->
extras);
6337 i = cgltf_skip_json(tokens, i + 1);
6349static int cgltf_parse_json_curves(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6359 i = cgltf_parse_json_curve(options, tokens, i, json_chunk, &out_data->
curves[j]);
6368static int cgltf_parse_json_node(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_node* out_node)
6370 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6373 out_node->
scale[0] = 1.0f;
6374 out_node->
scale[1] = 1.0f;
6375 out_node->
scale[2] = 1.0f;
6376 out_node->
matrix[0] = 1.0f;
6377 out_node->
matrix[5] = 1.0f;
6378 out_node->
matrix[10] = 1.0f;
6379 out_node->
matrix[15] = 1.0f;
6381 int size = tokens[i].size;
6384 for (
int j = 0; j < size; ++j)
6386 CGLTF_CHECK_KEY(tokens[i]);
6388 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
6390 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_node->
name);
6392 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"children") == 0)
6402 out_node->
children[k] = CGLTF_PTRINDEX(
cgltf_node, cgltf_json_to_int(tokens + i, json_chunk));
6406 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"mesh") == 0)
6409 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6410 out_node->
mesh = CGLTF_PTRINDEX(
cgltf_mesh, cgltf_json_to_int(tokens + i, json_chunk));
6413 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"skin") == 0)
6416 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6417 out_node->
skin = CGLTF_PTRINDEX(
cgltf_skin, cgltf_json_to_int(tokens + i, json_chunk));
6420 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"camera") == 0)
6423 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6424 out_node->
camera = CGLTF_PTRINDEX(
cgltf_camera, cgltf_json_to_int(tokens + i, json_chunk));
6427 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"translation") == 0)
6430 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_node->
translation, 3);
6432 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"rotation") == 0)
6435 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_node->
rotation, 4);
6437 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"scale") == 0)
6440 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_node->
scale, 3);
6442 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"matrix") == 0)
6445 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_node->
matrix, 16);
6447 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"weights") == 0)
6455 i = cgltf_parse_json_float_array(tokens, i - 1, json_chunk, out_node->
weights, (
int)out_node->
weights_count);
6457 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6459 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_node->
extras);
6461 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
6465 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6468 return CGLTF_ERROR_JSON;
6471 int extensions_size = tokens[i].size;
6477 return CGLTF_ERROR_NOMEM;
6482 for (
int k = 0; k < extensions_size; ++k)
6484 CGLTF_CHECK_KEY(tokens[i]);
6486 if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_lights_punctual") == 0)
6490 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6492 int data_size = tokens[i].size;
6495 for (
int m = 0; m < data_size; ++m)
6497 CGLTF_CHECK_KEY(tokens[i]);
6499 if (cgltf_json_strcmp(tokens + i, json_chunk,
"light") == 0)
6502 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6503 out_node->
light = CGLTF_PTRINDEX(
cgltf_light, cgltf_json_to_int(tokens + i, json_chunk));
6508 i = cgltf_skip_json(tokens, i + 1);
6517 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_lights_area") == 0)
6521 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6523 int data_size = tokens[i].size;
6526 for (
int m = 0; m < data_size; ++m)
6528 CGLTF_CHECK_KEY(tokens[i]);
6530 if (cgltf_json_strcmp(tokens + i, json_chunk,
"light") == 0)
6533 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6539 i = cgltf_skip_json(tokens, i + 1);
6548 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_curves") == 0)
6552 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6554 int data_size = tokens[i].size;
6557 for (
int m = 0; m < data_size; ++m)
6559 CGLTF_CHECK_KEY(tokens[i]);
6561 if (cgltf_json_strcmp(tokens + i, json_chunk,
"curve") == 0)
6564 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6565 out_node->
curve = CGLTF_PTRINDEX(
cgltf_curve, cgltf_json_to_int(tokens + i, json_chunk));
6570 i = cgltf_skip_json(tokens, i + 1);
6579 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"EXT_mesh_gpu_instancing") == 0)
6582 i = cgltf_parse_json_mesh_gpu_instancing(options, tokens, i + 1, json_chunk, &out_node->
mesh_gpu_instancing);
6586 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_node->
extensions[out_node->
extensions_count++]));
6597 i = cgltf_skip_json(tokens, i+1);
6609static int cgltf_parse_json_nodes(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6611 i = cgltf_parse_json_array(options, tokens, i, json_chunk,
sizeof(
cgltf_node), (
void**)&out_data->
nodes, &out_data->
nodes_count);
6619 i = cgltf_parse_json_node(options, tokens, i, json_chunk, &out_data->
nodes[j]);
6630 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6632 int size = tokens[i].size;
6635 for (
int j = 0; j < size; ++j)
6637 CGLTF_CHECK_KEY(tokens[i]);
6639 if (cgltf_json_strcmp(tokens + i, json_chunk,
"postExposure") == 0)
6643 out_color_management->
post_exposure = cgltf_json_to_float(tokens + i, json_chunk);
6646 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"sdr") == 0)
6648 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_color_management->
sdr);
6650 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"hdr") == 0)
6652 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_color_management->
hdr);
6656 i = cgltf_skip_json(tokens, i + 1);
6670 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6673 out_environment->
color[0] = 0.25f;
6674 out_environment->
color[1] = 0.25f;
6675 out_environment->
color[2] = 0.25f;
6680 int size = tokens[i].size;
6683 for (
int j = 0; j < size; ++j)
6685 CGLTF_CHECK_KEY(tokens[i]);
6687 if (cgltf_json_strcmp(tokens + i, json_chunk,
"type") == 0)
6690 if (cgltf_json_strcmp(tokens + i, json_chunk,
"color") == 0)
6694 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"hdri") == 0 || cgltf_json_strcmp(tokens + i, json_chunk,
"envMap") == 0)
6700 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"color") == 0)
6702 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_environment->
color, 3);
6704 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"strength") == 0)
6707 out_environment->
strength = cgltf_json_to_float(tokens + i, json_chunk);
6710 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"uri") == 0)
6712 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_environment->
uri);
6714 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"projection") == 0)
6717 if (cgltf_json_strcmp(tokens + i, json_chunk,
"longlat") == 0 || cgltf_json_strcmp(tokens + i, json_chunk,
"equirectangular") == 0)
6727 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"azimuthOffset") == 0)
6730 out_environment->
azimuth_offset = cgltf_json_to_float(tokens + i, json_chunk);
6735 i = cgltf_skip_json(tokens, i + 1);
6747static int cgltf_parse_json_scene(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_scene* out_scene)
6749 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6751 int size = tokens[i].size;
6754 for (
int j = 0; j < size; ++j)
6756 CGLTF_CHECK_KEY(tokens[i]);
6758 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
6760 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_scene->
name);
6762 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"nodes") == 0)
6764 i = cgltf_parse_json_array(options, tokens, i + 1, json_chunk,
sizeof(
cgltf_node*), (
void**)&out_scene->
nodes, &out_scene->
nodes_count);
6772 out_scene->
nodes[k] = CGLTF_PTRINDEX(
cgltf_node, cgltf_json_to_int(tokens + i, json_chunk));
6776 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6778 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_scene->
extras);
6780 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
6784 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6787 return CGLTF_ERROR_JSON;
6790 int extensions_size = tokens[i].size;
6796 return CGLTF_ERROR_NOMEM;
6801 for (
int k = 0; k < extensions_size; ++k)
6803 CGLTF_CHECK_KEY(tokens[i]);
6805 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_environment") == 0)
6808 i = cgltf_parse_json_foundation_environment(options, tokens, i + 1, json_chunk, &out_scene->
foundation_environment);
6812 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_scene->
extensions[out_scene->
extensions_count++]));
6823 i = cgltf_skip_json(tokens, i+1);
6835static int cgltf_parse_json_scenes(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6845 i = cgltf_parse_json_scene(options, tokens, i, json_chunk, &out_data->
scenes[j]);
6857 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6859 int size = tokens[i].size;
6862 for (
int j = 0; j < size; ++j)
6864 CGLTF_CHECK_KEY(tokens[i]);
6866 if (cgltf_json_strcmp(tokens+i, json_chunk,
"input") == 0)
6869 out_sampler->
input = CGLTF_PTRINDEX(
cgltf_accessor, cgltf_json_to_int(tokens + i, json_chunk));
6872 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"output") == 0)
6875 out_sampler->
output = CGLTF_PTRINDEX(
cgltf_accessor, cgltf_json_to_int(tokens + i, json_chunk));
6878 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"interpolation") == 0)
6881 if (cgltf_json_strcmp(tokens + i, json_chunk,
"LINEAR") == 0)
6885 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"STEP") == 0)
6889 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"CUBICSPLINE") == 0)
6895 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6897 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sampler->
extras);
6899 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
6901 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sampler->
extensions_count, &out_sampler->
extensions);
6905 i = cgltf_skip_json(tokens, i+1);
6920 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6922 int size = tokens[i].size;
6925 for (
int j = 0; j < size; ++j)
6927 CGLTF_CHECK_KEY(tokens[i]);
6929 if (cgltf_json_strcmp(tokens+i, json_chunk,
"sampler") == 0)
6935 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"target") == 0)
6939 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6941 int target_size = tokens[i].size;
6944 for (
int k = 0; k < target_size; ++k)
6946 CGLTF_CHECK_KEY(tokens[i]);
6948 if (cgltf_json_strcmp(tokens+i, json_chunk,
"node") == 0)
6954 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"path") == 0)
6957 if (cgltf_json_strcmp(tokens+i, json_chunk,
"translation") == 0)
6961 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"rotation") == 0)
6965 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"scale") == 0)
6969 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"weights") == 0)
6975 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6977 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_channel->
extras);
6979 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
6981 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_channel->
extensions_count, &out_channel->
extensions);
6985 i = cgltf_skip_json(tokens, i+1);
6996 i = cgltf_skip_json(tokens, i+1);
7008static int cgltf_parse_json_animation(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_animation* out_animation)
7010 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7012 int size = tokens[i].size;
7015 for (
int j = 0; j < size; ++j)
7017 CGLTF_CHECK_KEY(tokens[i]);
7019 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
7021 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_animation->
name);
7023 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"samplers") == 0)
7033 i = cgltf_parse_json_animation_sampler(options, tokens, i, json_chunk, &out_animation->
samplers[k]);
7040 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"channels") == 0)
7050 i = cgltf_parse_json_animation_channel(options, tokens, i, json_chunk, &out_animation->
channels[k]);
7057 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
7059 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_animation->
extras);
7061 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
7063 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_animation->
extensions_count, &out_animation->
extensions);
7067 i = cgltf_skip_json(tokens, i+1);
7079static int cgltf_parse_json_animations(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
7089 i = cgltf_parse_json_animation(options, tokens, i, json_chunk, &out_data->
animations[j]);
7100 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7102 int size = tokens[i].size;
7105 for (
int j = 0; j < size; ++j)
7107 CGLTF_CHECK_KEY(tokens[i]);
7109 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
7111 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_variant->
name);
7113 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
7115 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_variant->
extras);
7119 i = cgltf_skip_json(tokens, i+1);
7131static int cgltf_parse_json_variants(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
7141 i = cgltf_parse_json_variant(options, tokens, i, json_chunk, &out_data->
variants[j]);
7150static int cgltf_parse_json_asset(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_asset* out_asset)
7152 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7154 int size = tokens[i].size;
7157 for (
int j = 0; j < size; ++j)
7159 CGLTF_CHECK_KEY(tokens[i]);
7161 if (cgltf_json_strcmp(tokens+i, json_chunk,
"copyright") == 0)
7163 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_asset->
copyright);
7165 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"generator") == 0)
7167 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_asset->
generator);
7169 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"version") == 0)
7171 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_asset->
version);
7173 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"minVersion") == 0)
7175 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_asset->
min_version);
7177 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
7179 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_asset->
extras);
7181 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
7183 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_asset->
extensions_count, &out_asset->
extensions);
7187 i = cgltf_skip_json(tokens, i+1);
7198 return CGLTF_ERROR_LEGACY;
7227 switch (component_type)
7249 return 8 * component_size;
7251 else if (type ==
cgltf_type_mat3 && (component_size == 1 || component_size == 2))
7253 return 12 * component_size;
7258static int cgltf_fixup_pointers(
cgltf_data* out_data);
7260static int cgltf_parse_json_root(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
7262 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7264 int size = tokens[i].size;
7267 for (
int j = 0; j < size; ++j)
7269 CGLTF_CHECK_KEY(tokens[i]);
7271 if (cgltf_json_strcmp(tokens + i, json_chunk,
"asset") == 0)
7273 i = cgltf_parse_json_asset(options, tokens, i + 1, json_chunk, &out_data->
asset);
7275 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"meshes") == 0)
7277 i = cgltf_parse_json_meshes(options, tokens, i + 1, json_chunk, out_data);
7279 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"accessors") == 0)
7281 i = cgltf_parse_json_accessors(options, tokens, i + 1, json_chunk, out_data);
7283 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"bufferViews") == 0)
7285 i = cgltf_parse_json_buffer_views(options, tokens, i + 1, json_chunk, out_data);
7287 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"buffers") == 0)
7289 i = cgltf_parse_json_buffers(options, tokens, i + 1, json_chunk, out_data);
7291 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"materials") == 0)
7293 i = cgltf_parse_json_materials(options, tokens, i + 1, json_chunk, out_data);
7295 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"images") == 0)
7297 i = cgltf_parse_json_images(options, tokens, i + 1, json_chunk, out_data);
7299 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"textures") == 0)
7301 i = cgltf_parse_json_textures(options, tokens, i + 1, json_chunk, out_data);
7303 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"samplers") == 0)
7305 i = cgltf_parse_json_samplers(options, tokens, i + 1, json_chunk, out_data);
7307 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"skins") == 0)
7309 i = cgltf_parse_json_skins(options, tokens, i + 1, json_chunk, out_data);
7311 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"cameras") == 0)
7313 i = cgltf_parse_json_cameras(options, tokens, i + 1, json_chunk, out_data);
7315 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"nodes") == 0)
7317 i = cgltf_parse_json_nodes(options, tokens, i + 1, json_chunk, out_data);
7319 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"scenes") == 0)
7321 i = cgltf_parse_json_scenes(options, tokens, i + 1, json_chunk, out_data);
7323 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"scene") == 0)
7326 out_data->
scene = CGLTF_PTRINDEX(
cgltf_scene, cgltf_json_to_int(tokens + i, json_chunk));
7329 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"animations") == 0)
7331 i = cgltf_parse_json_animations(options, tokens, i + 1, json_chunk, out_data);
7333 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"extras") == 0)
7335 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_data->
extras);
7337 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
7341 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7344 return CGLTF_ERROR_JSON;
7347 int extensions_size = tokens[i].size;
7353 return CGLTF_ERROR_NOMEM;
7358 for (
int k = 0; k < extensions_size; ++k)
7360 CGLTF_CHECK_KEY(tokens[i]);
7362 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_colormanagement") == 0)
7367 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_lights_punctual") == 0)
7371 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7373 int data_size = tokens[i].size;
7376 for (
int m = 0; m < data_size; ++m)
7378 CGLTF_CHECK_KEY(tokens[i]);
7380 if (cgltf_json_strcmp(tokens + i, json_chunk,
"lights") == 0)
7382 i = cgltf_parse_json_lights(options, tokens, i + 1, json_chunk, out_data);
7386 i = cgltf_skip_json(tokens, i + 1);
7395 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_lights_area") == 0)
7399 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7401 int data_size = tokens[i].size;
7404 for (
int m = 0; m < data_size; ++m)
7406 CGLTF_CHECK_KEY(tokens[i]);
7408 if (cgltf_json_strcmp(tokens + i, json_chunk,
"lights") == 0)
7410 i = cgltf_parse_json_lights_area(options, tokens, i + 1, json_chunk, out_data);
7414 i = cgltf_skip_json(tokens, i + 1);
7423 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_curves") == 0)
7427 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7429 int data_size = tokens[i].size;
7432 for (
int m = 0; m < data_size; ++m)
7434 CGLTF_CHECK_KEY(tokens[i]);
7436 if (cgltf_json_strcmp(tokens + i, json_chunk,
"curves") == 0)
7438 i = cgltf_parse_json_curves(options, tokens, i + 1, json_chunk, out_data);
7442 i = cgltf_skip_json(tokens, i + 1);
7451 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_variants") == 0)
7455 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7457 int data_size = tokens[i].size;
7460 for (
int m = 0; m < data_size; ++m)
7462 CGLTF_CHECK_KEY(tokens[i]);
7464 if (cgltf_json_strcmp(tokens + i, json_chunk,
"variants") == 0)
7466 i = cgltf_parse_json_variants(options, tokens, i + 1, json_chunk, out_data);
7470 i = cgltf_skip_json(tokens, i + 1);
7490 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensionsUsed") == 0)
7494 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensionsRequired") == 0)
7500 i = cgltf_skip_json(tokens, i + 1);
7514 jsmn_parser parser = { 0, 0, 0 };
7518 int token_count = jsmn_parse(&parser, (
const char*)json_chunk, size, NULL, 0);
7520 if (token_count <= 0)
7537 int token_count = jsmn_parse(&parser, (
const char*)json_chunk, size, tokens, options->
json_token_count);
7539 if (token_count <= 0)
7547 tokens[token_count].type = JSMN_UNDEFINED;
7561 int i = cgltf_parse_json_root(options, tokens, 0, json_chunk, data);
7577 if (cgltf_fixup_pointers(data) < 0)
7583 data->
json = (
const char*)json_chunk;
7591static int cgltf_fixup_pointers(
cgltf_data* data)
7734 return CGLTF_ERROR_JSON;
7764 return CGLTF_ERROR_JSON;
7818static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
7819 jsmntok_t *tokens,
size_t num_tokens) {
7821 if (parser->toknext >= num_tokens) {
7824 tok = &tokens[parser->toknext++];
7825 tok->start = tok->end = -1;
7827#ifdef JSMN_PARENT_LINKS
7836static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
7837 ptrdiff_t start, ptrdiff_t end) {
7839 token->start = start;
7847static int jsmn_parse_primitive(jsmn_parser *parser,
const char *js,
7848 size_t len, jsmntok_t *tokens,
size_t num_tokens) {
7852 start = parser->pos;
7854 for (; parser->pos < len && js[parser->pos] !=
'\0'; parser->pos++) {
7855 switch (js[parser->pos]) {
7860 case '\t' :
case '\r' :
case '\n' :
case ' ' :
7861 case ',' :
case ']' :
case '}' :
7864 if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
7865 parser->pos = start;
7866 return JSMN_ERROR_INVAL;
7871 parser->pos = start;
7872 return JSMN_ERROR_PART;
7876 if (tokens == NULL) {
7880 token = jsmn_alloc_token(parser, tokens, num_tokens);
7881 if (token == NULL) {
7882 parser->pos = start;
7883 return JSMN_ERROR_NOMEM;
7885 jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
7886#ifdef JSMN_PARENT_LINKS
7887 token->parent = parser->toksuper;
7896static int jsmn_parse_string(jsmn_parser *parser,
const char *js,
7897 size_t len, jsmntok_t *tokens,
size_t num_tokens) {
7900 ptrdiff_t start = parser->pos;
7905 for (; parser->pos < len && js[parser->pos] !=
'\0'; parser->pos++) {
7906 char c = js[parser->pos];
7910 if (tokens == NULL) {
7913 token = jsmn_alloc_token(parser, tokens, num_tokens);
7914 if (token == NULL) {
7915 parser->pos = start;
7916 return JSMN_ERROR_NOMEM;
7918 jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos);
7919#ifdef JSMN_PARENT_LINKS
7920 token->parent = parser->toksuper;
7926 if (c ==
'\\' && parser->pos + 1 < len) {
7929 switch (js[parser->pos]) {
7931 case '\"':
case '/' :
case '\\' :
case 'b' :
7932 case 'f' :
case 'r' :
case 'n' :
case 't' :
7937 for(i = 0; i < 4 && parser->pos < len && js[parser->pos] !=
'\0'; i++) {
7939 if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) ||
7940 (js[parser->pos] >= 65 && js[parser->pos] <= 70) ||
7941 (js[parser->pos] >= 97 && js[parser->pos] <= 102))) {
7942 parser->pos = start;
7943 return JSMN_ERROR_INVAL;
7951 parser->pos = start;
7952 return JSMN_ERROR_INVAL;
7956 parser->pos = start;
7957 return JSMN_ERROR_PART;
7963static int jsmn_parse(jsmn_parser *parser,
const char *js,
size_t len,
7964 jsmntok_t *tokens,
size_t num_tokens) {
7968 int count = parser->toknext;
7970 for (; parser->pos < len && js[parser->pos] !=
'\0'; parser->pos++) {
7974 c = js[parser->pos];
7978 if (tokens == NULL) {
7981 token = jsmn_alloc_token(parser, tokens, num_tokens);
7983 return JSMN_ERROR_NOMEM;
7984 if (parser->toksuper != -1) {
7985 tokens[parser->toksuper].size++;
7986#ifdef JSMN_PARENT_LINKS
7987 token->parent = parser->toksuper;
7990 token->type = (c ==
'{' ? JSMN_OBJECT : JSMN_ARRAY);
7991 token->start = parser->pos;
7992 parser->toksuper = parser->toknext - 1;
7997 type = (c ==
'}' ? JSMN_OBJECT : JSMN_ARRAY);
7998#ifdef JSMN_PARENT_LINKS
7999 if (parser->toknext < 1) {
8000 return JSMN_ERROR_INVAL;
8002 token = &tokens[parser->toknext - 1];
8004 if (token->start != -1 && token->end == -1) {
8005 if (token->type != type) {
8006 return JSMN_ERROR_INVAL;
8008 token->end = parser->pos + 1;
8009 parser->toksuper = token->parent;
8012 if (token->parent == -1) {
8013 if(token->type != type || parser->toksuper == -1) {
8014 return JSMN_ERROR_INVAL;
8018 token = &tokens[token->parent];
8021 for (i = parser->toknext - 1; i >= 0; i--) {
8023 if (token->start != -1 && token->end == -1) {
8024 if (token->type != type) {
8025 return JSMN_ERROR_INVAL;
8027 parser->toksuper = -1;
8028 token->end = parser->pos + 1;
8033 if (i == -1)
return JSMN_ERROR_INVAL;
8034 for (; i >= 0; i--) {
8036 if (token->start != -1 && token->end == -1) {
8037 parser->toksuper = i;
8044 r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
8045 if (r < 0)
return r;
8047 if (parser->toksuper != -1 && tokens != NULL)
8048 tokens[parser->toksuper].size++;
8050 case '\t' :
case '\r' :
case '\n' :
case ' ':
8053 parser->toksuper = parser->toknext - 1;
8056 if (tokens != NULL && parser->toksuper != -1 &&
8057 tokens[parser->toksuper].type != JSMN_ARRAY &&
8058 tokens[parser->toksuper].type != JSMN_OBJECT) {
8059#ifdef JSMN_PARENT_LINKS
8060 parser->toksuper = tokens[parser->toksuper].parent;
8062 for (i = parser->toknext - 1; i >= 0; i--) {
8063 if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
8064 if (tokens[i].start != -1 && tokens[i].end == -1) {
8065 parser->toksuper = i;
8075 case '-':
case '0':
case '1' :
case '2':
case '3' :
case '4':
8076 case '5':
case '6':
case '7' :
case '8':
case '9':
8077 case 't':
case 'f':
case 'n' :
8079 if (tokens != NULL && parser->toksuper != -1) {
8080 jsmntok_t *t = &tokens[parser->toksuper];
8081 if (t->type == JSMN_OBJECT ||
8082 (t->type == JSMN_STRING && t->size != 0)) {
8083 return JSMN_ERROR_INVAL;
8090 r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
8091 if (r < 0)
return r;
8093 if (parser->toksuper != -1 && tokens != NULL)
8094 tokens[parser->toksuper].size++;
8100 return JSMN_ERROR_INVAL;
8105 if (tokens != NULL) {
8106 for (i = parser->toknext - 1; i >= 0; i--) {
8108 if (tokens[i].start != -1 && tokens[i].end == -1) {
8109 return JSMN_ERROR_PART;
8121static void jsmn_init(jsmn_parser *parser) {
8123 parser->toknext = 0;
8124 parser->toksuper = -1;
cgltf_size cgltf_scene_index(const cgltf_data *data, const cgltf_scene *object)
size_t cgltf_size
Definition cgltf.h:104
cgltf_size cgltf_sampler_index(const cgltf_data *data, const cgltf_sampler *object)
void cgltf_node_transform_local(const cgltf_node *node, cgltf_float *out_matrix)
cgltf_size cgltf_accessor_index(const cgltf_data *data, const cgltf_accessor *object)
long long int cgltf_ssize
Definition cgltf.h:105
unsigned int cgltf_uint
Definition cgltf.h:108
cgltf_result cgltf_parse_file(const cgltf_options *options, const char *path, cgltf_data **out_data)
cgltf_bool cgltf_accessor_read_float(const cgltf_accessor *accessor, cgltf_size index, cgltf_float *out, cgltf_size element_size)
cgltf_foundation_material_shader_block
Definition cgltf.h:290
@ cgltf_foundation_material_shader_block_hair
Definition cgltf.h:293
@ cgltf_foundation_material_shader_block_invalid
Definition cgltf.h:291
@ cgltf_foundation_material_shader_block_max_enum
Definition cgltf.h:294
@ cgltf_foundation_material_shader_block_principled
Definition cgltf.h:292
cgltf_animation_path_type
Definition cgltf.h:224
@ cgltf_animation_path_type_max_enum
Definition cgltf.h:230
@ cgltf_animation_path_type_weights
Definition cgltf.h:229
@ cgltf_animation_path_type_invalid
Definition cgltf.h:225
@ cgltf_animation_path_type_translation
Definition cgltf.h:226
@ cgltf_animation_path_type_scale
Definition cgltf.h:228
@ cgltf_animation_path_type_rotation
Definition cgltf.h:227
cgltf_size cgltf_component_size(cgltf_component_type component_type)
cgltf_result cgltf_validate(cgltf_data *data)
cgltf_filter_type
Definition cgltf.h:427
@ cgltf_filter_type_undefined
Definition cgltf.h:428
@ cgltf_filter_type_nearest_mipmap_linear
Definition cgltf.h:433
@ cgltf_filter_type_linear_mipmap_linear
Definition cgltf.h:434
@ cgltf_filter_type_nearest_mipmap_nearest
Definition cgltf.h:431
@ cgltf_filter_type_linear
Definition cgltf.h:430
@ cgltf_filter_type_linear_mipmap_nearest
Definition cgltf.h:432
@ cgltf_filter_type_nearest
Definition cgltf.h:429
cgltf_size cgltf_accessor_unpack_indices(const cgltf_accessor *accessor, void *out, cgltf_size out_component_size, cgltf_size index_count)
cgltf_meshopt_compression_mode
Definition cgltf.h:334
@ cgltf_meshopt_compression_mode_attributes
Definition cgltf.h:336
@ cgltf_meshopt_compression_mode_invalid
Definition cgltf.h:335
@ cgltf_meshopt_compression_mode_triangles
Definition cgltf.h:337
@ cgltf_meshopt_compression_mode_max_enum
Definition cgltf.h:339
@ cgltf_meshopt_compression_mode_indices
Definition cgltf.h:338
cgltf_size cgltf_animation_channel_index(const cgltf_animation *animation, const cgltf_animation_channel *object)
cgltf_wrap_mode
Definition cgltf.h:437
@ cgltf_wrap_mode_repeat
Definition cgltf.h:440
@ cgltf_wrap_mode_clamp_to_edge
Definition cgltf.h:438
@ cgltf_wrap_mode_mirrored_repeat
Definition cgltf.h:439
cgltf_curve_basis
Definition cgltf.h:262
@ cgltf_curve_basis_catmull_rom
Definition cgltf.h:267
@ cgltf_curve_basis_invalid
Definition cgltf.h:263
@ cgltf_curve_basis_linear
Definition cgltf.h:264
@ cgltf_curve_basis_bezier
Definition cgltf.h:265
@ cgltf_curve_basis_max_enum
Definition cgltf.h:268
@ cgltf_curve_basis_bspline
Definition cgltf.h:266
void cgltf_node_transform_world(const cgltf_node *node, cgltf_float *out_matrix)
cgltf_size cgltf_decode_uri(char *uri)
cgltf_foundation_material_hair_model
Definition cgltf.h:297
@ cgltf_foundation_material_hair_model_invalid
Definition cgltf.h:298
@ cgltf_foundation_material_hair_model_chiang
Definition cgltf.h:299
@ cgltf_foundation_material_hair_model_max_enum
Definition cgltf.h:300
cgltf_size cgltf_image_index(const cgltf_data *data, const cgltf_image *object)
cgltf_primitive_type
Definition cgltf.h:204
@ cgltf_primitive_type_invalid
Definition cgltf.h:205
@ cgltf_primitive_type_line_strip
Definition cgltf.h:209
@ cgltf_primitive_type_lines
Definition cgltf.h:207
@ cgltf_primitive_type_triangles
Definition cgltf.h:210
@ cgltf_primitive_type_line_loop
Definition cgltf.h:208
@ cgltf_primitive_type_triangle_fan
Definition cgltf.h:212
@ cgltf_primitive_type_points
Definition cgltf.h:206
@ cgltf_primitive_type_max_enum
Definition cgltf.h:213
@ cgltf_primitive_type_triangle_strip
Definition cgltf.h:211
cgltf_size cgltf_node_index(const cgltf_data *data, const cgltf_node *object)
cgltf_bool cgltf_accessor_read_uint(const cgltf_accessor *accessor, cgltf_size index, cgltf_uint *out, cgltf_size element_size)
cgltf_size cgltf_light_area_index(const cgltf_data *data, const cgltf_light_area *object)
cgltf_result cgltf_parse(const cgltf_options *options, const void *data, cgltf_size size, cgltf_data **out_data)
cgltf_size cgltf_calc_size(cgltf_type type, cgltf_component_type component_type)
cgltf_size cgltf_decode_string(char *string)
const uint8_t * cgltf_buffer_view_data(const cgltf_buffer_view *view)
const cgltf_accessor * cgltf_find_accessor(const cgltf_primitive *prim, cgltf_attribute_type type, cgltf_int index)
cgltf_light_area_type
Definition cgltf.h:255
@ cgltf_light_area_type_disk
Definition cgltf.h:258
@ cgltf_light_area_type_rect
Definition cgltf.h:257
@ cgltf_light_area_type_invalid
Definition cgltf.h:256
@ cgltf_light_area_type_max_enum
Definition cgltf.h:259
int cgltf_bool
Definition cgltf.h:109
int cgltf_int
Definition cgltf.h:107
cgltf_size cgltf_animation_sampler_index(const cgltf_animation *animation, const cgltf_animation_sampler *object)
cgltf_foundation_environment_projection
Definition cgltf.h:284
@ cgltf_foundation_environment_projection_max_enum
Definition cgltf.h:287
@ cgltf_foundation_environment_projection_longlat
Definition cgltf.h:286
@ cgltf_foundation_environment_projection_invalid
Definition cgltf.h:285
cgltf_result cgltf_copy_extras_json(const cgltf_data *data, const cgltf_extras *extras, char *dest, cgltf_size *dest_size)
void cgltf_free(cgltf_data *data)
cgltf_interpolation_type
Definition cgltf.h:233
@ cgltf_interpolation_type_cubic_spline
Definition cgltf.h:236
@ cgltf_interpolation_type_max_enum
Definition cgltf.h:237
@ cgltf_interpolation_type_linear
Definition cgltf.h:234
@ cgltf_interpolation_type_step
Definition cgltf.h:235
cgltf_size cgltf_material_index(const cgltf_data *data, const cgltf_material *object)
cgltf_light_type
Definition cgltf.h:247
@ cgltf_light_type_spot
Definition cgltf.h:251
@ cgltf_light_type_invalid
Definition cgltf.h:248
@ cgltf_light_type_max_enum
Definition cgltf.h:252
@ cgltf_light_type_point
Definition cgltf.h:250
@ cgltf_light_type_directional
Definition cgltf.h:249
cgltf_attribute_type
Definition cgltf.h:165
@ cgltf_attribute_type_color
Definition cgltf.h:171
@ cgltf_attribute_type_joints
Definition cgltf.h:172
@ cgltf_attribute_type_custom
Definition cgltf.h:174
@ cgltf_attribute_type_invalid
Definition cgltf.h:166
@ cgltf_attribute_type_texcoord
Definition cgltf.h:170
@ cgltf_attribute_type_weights
Definition cgltf.h:173
@ cgltf_attribute_type_position
Definition cgltf.h:167
@ cgltf_attribute_type_tangent
Definition cgltf.h:169
@ cgltf_attribute_type_normal
Definition cgltf.h:168
@ cgltf_attribute_type_max_enum
Definition cgltf.h:175
cgltf_result cgltf_load_buffer_base64(const cgltf_options *options, cgltf_size size, const char *base64, void **out_data)
cgltf_curve_render_mode
Definition cgltf.h:271
@ cgltf_curve_render_mode_max_enum
Definition cgltf.h:274
@ cgltf_curve_render_mode_invalid
Definition cgltf.h:272
@ cgltf_curve_render_mode_capsule
Definition cgltf.h:273
cgltf_size cgltf_accessor_read_index(const cgltf_accessor *accessor, cgltf_size index)
cgltf_foundation_environment_type
Definition cgltf.h:277
@ cgltf_foundation_environment_type_max_enum
Definition cgltf.h:281
@ cgltf_foundation_environment_type_invalid
Definition cgltf.h:278
@ cgltf_foundation_environment_type_color
Definition cgltf.h:279
@ cgltf_foundation_environment_type_hdri
Definition cgltf.h:280
float cgltf_float
Definition cgltf.h:106
cgltf_size cgltf_curve_index(const cgltf_data *data, const cgltf_curve *object)
cgltf_size cgltf_num_components(cgltf_type type)
cgltf_result cgltf_load_buffers(const cgltf_options *options, cgltf_data *data, const char *gltf_path)
cgltf_size cgltf_light_index(const cgltf_data *data, const cgltf_light *object)
cgltf_size cgltf_skin_index(const cgltf_data *data, const cgltf_skin *object)
cgltf_type
Definition cgltf.h:191
@ cgltf_type_invalid
Definition cgltf.h:192
@ cgltf_type_vec4
Definition cgltf.h:196
@ cgltf_type_mat2
Definition cgltf.h:197
@ cgltf_type_vec2
Definition cgltf.h:194
@ cgltf_type_vec3
Definition cgltf.h:195
@ cgltf_type_scalar
Definition cgltf.h:193
@ cgltf_type_mat3
Definition cgltf.h:198
@ cgltf_type_mat4
Definition cgltf.h:199
@ cgltf_type_max_enum
Definition cgltf.h:200
cgltf_size cgltf_buffer_view_index(const cgltf_data *data, const cgltf_buffer_view *object)
cgltf_component_type
Definition cgltf.h:179
@ cgltf_component_type_r_32f
Definition cgltf.h:186
@ cgltf_component_type_r_8
Definition cgltf.h:181
@ cgltf_component_type_r_8u
Definition cgltf.h:182
@ cgltf_component_type_r_32u
Definition cgltf.h:185
@ cgltf_component_type_r_16u
Definition cgltf.h:184
@ cgltf_component_type_invalid
Definition cgltf.h:180
@ cgltf_component_type_max_enum
Definition cgltf.h:187
@ cgltf_component_type_r_16
Definition cgltf.h:183
cgltf_size cgltf_mesh_index(const cgltf_data *data, const cgltf_mesh *object)
cgltf_size cgltf_accessor_unpack_floats(const cgltf_accessor *accessor, cgltf_float *out, cgltf_size float_count)
cgltf_data_free_method
Definition cgltf.h:303
@ cgltf_data_free_method_max_enum
Definition cgltf.h:307
@ cgltf_data_free_method_memory_free
Definition cgltf.h:306
@ cgltf_data_free_method_none
Definition cgltf.h:304
@ cgltf_data_free_method_file_release
Definition cgltf.h:305
cgltf_size cgltf_texture_index(const cgltf_data *data, const cgltf_texture *object)
cgltf_meshopt_compression_filter
Definition cgltf.h:342
@ cgltf_meshopt_compression_filter_none
Definition cgltf.h:343
@ cgltf_meshopt_compression_filter_quaternion
Definition cgltf.h:345
@ cgltf_meshopt_compression_filter_octahedral
Definition cgltf.h:344
@ cgltf_meshopt_compression_filter_exponential
Definition cgltf.h:346
@ cgltf_meshopt_compression_filter_max_enum
Definition cgltf.h:347
cgltf_size cgltf_camera_index(const cgltf_data *data, const cgltf_camera *object)
cgltf_result
Definition cgltf.h:120
@ cgltf_result_success
Definition cgltf.h:121
@ cgltf_result_invalid_gltf
Definition cgltf.h:125
@ cgltf_result_legacy_gltf
Definition cgltf.h:130
@ cgltf_result_data_too_short
Definition cgltf.h:122
@ cgltf_result_unknown_format
Definition cgltf.h:123
@ cgltf_result_max_enum
Definition cgltf.h:131
@ cgltf_result_file_not_found
Definition cgltf.h:127
@ cgltf_result_out_of_memory
Definition cgltf.h:129
@ cgltf_result_invalid_options
Definition cgltf.h:126
@ cgltf_result_io_error
Definition cgltf.h:128
@ cgltf_result_invalid_json
Definition cgltf.h:124
cgltf_file_type
Definition cgltf.h:112
@ cgltf_file_type_invalid
Definition cgltf.h:113
@ cgltf_file_type_max_enum
Definition cgltf.h:116
@ cgltf_file_type_glb
Definition cgltf.h:115
@ cgltf_file_type_gltf
Definition cgltf.h:114
cgltf_size cgltf_buffer_index(const cgltf_data *data, const cgltf_buffer *object)
cgltf_camera_type
Definition cgltf.h:240
@ cgltf_camera_type_orthographic
Definition cgltf.h:243
@ cgltf_camera_type_invalid
Definition cgltf.h:241
@ cgltf_camera_type_max_enum
Definition cgltf.h:244
@ cgltf_camera_type_perspective
Definition cgltf.h:242
cgltf_alpha_mode
Definition cgltf.h:217
@ cgltf_alpha_mode_mask
Definition cgltf.h:219
@ cgltf_alpha_mode_opaque
Definition cgltf.h:218
@ cgltf_alpha_mode_max_enum
Definition cgltf.h:221
@ cgltf_alpha_mode_blend
Definition cgltf.h:220
cgltf_buffer_view_type
Definition cgltf.h:157
@ cgltf_buffer_view_type_invalid
Definition cgltf.h:158
@ cgltf_buffer_view_type_vertices
Definition cgltf.h:160
@ cgltf_buffer_view_type_max_enum
Definition cgltf.h:161
@ cgltf_buffer_view_type_indices
Definition cgltf.h:159
cgltf_size cgltf_animation_index(const cgltf_data *data, const cgltf_animation *object)
cgltf_buffer_view * indices_buffer_view
Definition cgltf.h:380
cgltf_component_type indices_component_type
Definition cgltf.h:382
cgltf_size values_byte_offset
Definition cgltf.h:384
cgltf_buffer_view * values_buffer_view
Definition cgltf.h:383
cgltf_size indices_byte_offset
Definition cgltf.h:381
cgltf_size count
Definition cgltf.h:379
char * name
Definition cgltf.h:389
cgltf_bool normalized
Definition cgltf.h:391
cgltf_extras extras
Definition cgltf.h:403
cgltf_bool is_sparse
Definition cgltf.h:401
cgltf_float max[16]
Definition cgltf.h:400
cgltf_size count
Definition cgltf.h:394
cgltf_size extensions_count
Definition cgltf.h:404
cgltf_type type
Definition cgltf.h:392
cgltf_float min[16]
Definition cgltf.h:398
cgltf_size offset
Definition cgltf.h:393
cgltf_bool has_min
Definition cgltf.h:397
cgltf_buffer_view * buffer_view
Definition cgltf.h:396
cgltf_bool has_max
Definition cgltf.h:399
cgltf_component_type component_type
Definition cgltf.h:390
cgltf_size stride
Definition cgltf.h:395
cgltf_accessor_sparse sparse
Definition cgltf.h:402
cgltf_extension * extensions
Definition cgltf.h:405
cgltf_node * target_node
Definition cgltf.h:862
cgltf_extras extras
Definition cgltf.h:864
cgltf_animation_path_type target_path
Definition cgltf.h:863
cgltf_animation_sampler * sampler
Definition cgltf.h:861
cgltf_extension * extensions
Definition cgltf.h:866
cgltf_size extensions_count
Definition cgltf.h:865
cgltf_extras extras
Definition cgltf.h:855
cgltf_extension * extensions
Definition cgltf.h:857
cgltf_accessor * input
Definition cgltf.h:852
cgltf_accessor * output
Definition cgltf.h:853
cgltf_interpolation_type interpolation
Definition cgltf.h:854
cgltf_size extensions_count
Definition cgltf.h:856
cgltf_animation_sampler * samplers
Definition cgltf.h:871
cgltf_animation_channel * channels
Definition cgltf.h:873
cgltf_extension * extensions
Definition cgltf.h:877
cgltf_size extensions_count
Definition cgltf.h:876
cgltf_size channels_count
Definition cgltf.h:874
cgltf_size samplers_count
Definition cgltf.h:872
char * name
Definition cgltf.h:870
cgltf_extras extras
Definition cgltf.h:875
cgltf_texture_view anisotropy_texture
Definition cgltf.h:587
cgltf_float anisotropy_strength
Definition cgltf.h:585
cgltf_float anisotropy_rotation
Definition cgltf.h:586
cgltf_extras extras
Definition cgltf.h:891
char * version
Definition cgltf.h:889
char * min_version
Definition cgltf.h:890
cgltf_extension * extensions
Definition cgltf.h:893
cgltf_size extensions_count
Definition cgltf.h:892
char * copyright
Definition cgltf.h:887
char * generator
Definition cgltf.h:888
char * name
Definition cgltf.h:410
cgltf_int index
Definition cgltf.h:412
cgltf_attribute_type type
Definition cgltf.h:411
cgltf_accessor * data
Definition cgltf.h:413
cgltf_extras extras
Definition cgltf.h:372
cgltf_extension * extensions
Definition cgltf.h:374
cgltf_meshopt_compression meshopt_compression
Definition cgltf.h:371
cgltf_size size
Definition cgltf.h:366
cgltf_buffer * buffer
Definition cgltf.h:364
cgltf_buffer_view_type type
Definition cgltf.h:368
char * name
Definition cgltf.h:363
cgltf_size stride
Definition cgltf.h:367
cgltf_size offset
Definition cgltf.h:365
cgltf_bool has_meshopt_compression
Definition cgltf.h:370
cgltf_size extensions_count
Definition cgltf.h:373
void * data
Definition cgltf.h:369
char * uri
Definition cgltf.h:326
char * name
Definition cgltf.h:324
cgltf_extras extras
Definition cgltf.h:329
cgltf_data_free_method data_free_method
Definition cgltf.h:328
cgltf_size size
Definition cgltf.h:325
cgltf_extension * extensions
Definition cgltf.h:331
cgltf_size extensions_count
Definition cgltf.h:330
void * data
Definition cgltf.h:327
cgltf_float sensor_size
Definition cgltf.h:741
cgltf_uint aperture_blades
Definition cgltf.h:744
cgltf_float aperture_ratio
Definition cgltf.h:746
cgltf_float aperture_rotation
Definition cgltf.h:745
cgltf_float fstop
Definition cgltf.h:742
cgltf_float focus_distance
Definition cgltf.h:743
cgltf_float znear
Definition cgltf.h:736
cgltf_float xmag
Definition cgltf.h:733
cgltf_float ymag
Definition cgltf.h:734
cgltf_float zfar
Definition cgltf.h:735
cgltf_extras extras
Definition cgltf.h:737
cgltf_float yfov
Definition cgltf.h:725
cgltf_bool has_zfar
Definition cgltf.h:726
cgltf_bool has_aspect_ratio
Definition cgltf.h:723
cgltf_float zfar
Definition cgltf.h:727
cgltf_float aspect_ratio
Definition cgltf.h:724
cgltf_float znear
Definition cgltf.h:728
cgltf_extras extras
Definition cgltf.h:729
union cgltf_camera::@0 data
cgltf_extension * extensions
Definition cgltf.h:760
cgltf_extras extras
Definition cgltf.h:758
char * name
Definition cgltf.h:750
cgltf_bool has_lens
Definition cgltf.h:756
cgltf_camera_type type
Definition cgltf.h:751
cgltf_size extensions_count
Definition cgltf.h:759
cgltf_camera_orthographic orthographic
Definition cgltf.h:754
cgltf_camera_perspective perspective
Definition cgltf.h:753
cgltf_camera_lens lens
Definition cgltf.h:757
cgltf_float clearcoat_roughness_factor
Definition cgltf.h:514
cgltf_texture_view clearcoat_roughness_texture
Definition cgltf.h:510
cgltf_texture_view clearcoat_normal_texture
Definition cgltf.h:511
cgltf_float clearcoat_factor
Definition cgltf.h:513
cgltf_texture_view clearcoat_texture
Definition cgltf.h:509
cgltf_material * material
Definition cgltf.h:792
char * name
Definition cgltf.h:787
cgltf_accessor * points
Definition cgltf.h:790
cgltf_accessor * curve_vertex_counts
Definition cgltf.h:791
cgltf_curve_basis basis
Definition cgltf.h:788
cgltf_curve_render_mode render_mode
Definition cgltf.h:789
cgltf_extras extras
Definition cgltf.h:793
cgltf_file_options file
Definition cgltf.h:976
cgltf_size bin_size
Definition cgltf.h:973
cgltf_size variants_count
Definition cgltf.h:954
cgltf_scene * scenes
Definition cgltf.h:945
cgltf_extension * data_extensions
Definition cgltf.h:959
const void * bin
Definition cgltf.h:972
cgltf_size buffer_views_count
Definition cgltf.h:913
cgltf_asset asset
Definition cgltf.h:901
cgltf_memory_options memory
Definition cgltf.h:975
cgltf_size extensions_required_count
Definition cgltf.h:967
cgltf_mesh * meshes
Definition cgltf.h:903
cgltf_size lights_area_count
Definition cgltf.h:937
cgltf_light * lights
Definition cgltf.h:933
cgltf_size json_size
Definition cgltf.h:970
cgltf_size buffers_count
Definition cgltf.h:916
cgltf_buffer_view * buffer_views
Definition cgltf.h:912
cgltf_size cameras_count
Definition cgltf.h:931
cgltf_size extensions_used_count
Definition cgltf.h:964
cgltf_skin * skins
Definition cgltf.h:927
cgltf_bool has_foundation_color_management
Definition cgltf.h:960
cgltf_scene * scene
Definition cgltf.h:948
cgltf_size images_count
Definition cgltf.h:919
cgltf_material * materials
Definition cgltf.h:906
cgltf_sampler * samplers
Definition cgltf.h:924
cgltf_size skins_count
Definition cgltf.h:928
cgltf_size textures_count
Definition cgltf.h:922
cgltf_size curves_count
Definition cgltf.h:940
cgltf_animation * animations
Definition cgltf.h:950
cgltf_file_type file_type
Definition cgltf.h:898
cgltf_curve * curves
Definition cgltf.h:939
cgltf_node * nodes
Definition cgltf.h:942
void * file_data
Definition cgltf.h:899
cgltf_accessor * accessors
Definition cgltf.h:909
char ** extensions_required
Definition cgltf.h:966
cgltf_camera * cameras
Definition cgltf.h:930
cgltf_size samplers_count
Definition cgltf.h:925
cgltf_size animations_count
Definition cgltf.h:951
cgltf_image * images
Definition cgltf.h:918
cgltf_size nodes_count
Definition cgltf.h:943
cgltf_foundation_color_management foundation_color_management
Definition cgltf.h:961
cgltf_texture * textures
Definition cgltf.h:921
cgltf_size accessors_count
Definition cgltf.h:910
cgltf_size data_extensions_count
Definition cgltf.h:958
const char * json
Definition cgltf.h:969
cgltf_size scenes_count
Definition cgltf.h:946
char ** extensions_used
Definition cgltf.h:963
cgltf_light_area * lights_area
Definition cgltf.h:936
cgltf_size meshes_count
Definition cgltf.h:904
cgltf_buffer * buffers
Definition cgltf.h:915
cgltf_extras extras
Definition cgltf.h:956
cgltf_size lights_count
Definition cgltf.h:934
cgltf_material_variant * variants
Definition cgltf.h:953
cgltf_size materials_count
Definition cgltf.h:907
cgltf_float diffuse_transmission_color_factor[3]
Definition cgltf.h:571
cgltf_float diffuse_transmission_factor
Definition cgltf.h:570
cgltf_texture_view diffuse_transmission_texture
Definition cgltf.h:569
cgltf_texture_view diffuse_transmission_color_texture
Definition cgltf.h:572
cgltf_float dispersion
Definition cgltf.h:592
cgltf_attribute * attributes
Definition cgltf.h:670
cgltf_size attributes_count
Definition cgltf.h:671
cgltf_buffer_view * buffer_view
Definition cgltf.h:669
cgltf_float emissive_strength
Definition cgltf.h:554
char * name
Definition cgltf.h:318
char * data
Definition cgltf.h:319
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)
Definition cgltf.h:143
void * user_data
Definition cgltf.h:145
void(* release)(const struct cgltf_memory_options *memory_options, const struct cgltf_file_options *file_options, void *data)
Definition cgltf.h:144
char * sdr
Definition cgltf.h:808
cgltf_float post_exposure
Definition cgltf.h:807
char * hdr
Definition cgltf.h:809
cgltf_bool has_post_exposure
Definition cgltf.h:806
cgltf_float strength
Definition cgltf.h:799
cgltf_foundation_environment_projection projection
Definition cgltf.h:801
cgltf_foundation_environment_type type
Definition cgltf.h:797
cgltf_float color[3]
Definition cgltf.h:798
cgltf_float azimuth_offset
Definition cgltf.h:802
char * uri
Definition cgltf.h:800
cgltf_bool has_hair_beta_n
Definition cgltf.h:602
cgltf_bool has_hair_alpha
Definition cgltf.h:604
cgltf_foundation_material_shader_block shader_block
Definition cgltf.h:598
cgltf_bool has_ior
Definition cgltf.h:606
cgltf_float ior
Definition cgltf.h:607
cgltf_bool has_shader_block
Definition cgltf.h:597
cgltf_float hair_beta_n
Definition cgltf.h:603
cgltf_float hair_beta_m
Definition cgltf.h:601
cgltf_bool has_hair_beta_m
Definition cgltf.h:600
cgltf_float hair_alpha
Definition cgltf.h:605
cgltf_foundation_material_hair_model hair_model
Definition cgltf.h:599
char * uri
Definition cgltf.h:419
char * mime_type
Definition cgltf.h:421
cgltf_extras extras
Definition cgltf.h:422
cgltf_extension * extensions
Definition cgltf.h:424
char * name
Definition cgltf.h:418
cgltf_size extensions_count
Definition cgltf.h:423
cgltf_buffer_view * buffer_view
Definition cgltf.h:420
cgltf_float ior
Definition cgltf.h:525
cgltf_float iridescence_thickness_max
Definition cgltf.h:563
cgltf_float iridescence_ior
Definition cgltf.h:561
cgltf_texture_view iridescence_thickness_texture
Definition cgltf.h:564
cgltf_float iridescence_thickness_min
Definition cgltf.h:562
cgltf_texture_view iridescence_texture
Definition cgltf.h:560
cgltf_float iridescence_factor
Definition cgltf.h:559
cgltf_float color[3]
Definition cgltf.h:778
cgltf_float intensity
Definition cgltf.h:779
cgltf_extras extras
Definition cgltf.h:783
cgltf_light_area_type type
Definition cgltf.h:780
cgltf_float rect_aspect
Definition cgltf.h:782
char * name
Definition cgltf.h:777
cgltf_float size
Definition cgltf.h:781
cgltf_float angular_diameter
Definition cgltf.h:773
cgltf_extras extras
Definition cgltf.h:771
cgltf_float range
Definition cgltf.h:768
cgltf_float color[3]
Definition cgltf.h:765
cgltf_bool has_foundation_lights
Definition cgltf.h:772
cgltf_light_type type
Definition cgltf.h:767
cgltf_float intensity
Definition cgltf.h:766
cgltf_float spot_outer_cone_angle
Definition cgltf.h:770
char * name
Definition cgltf.h:764
cgltf_float spot_inner_cone_angle
Definition cgltf.h:769
cgltf_extras extras
Definition cgltf.h:660
cgltf_size variant
Definition cgltf.h:658
cgltf_material * material
Definition cgltf.h:659
cgltf_extras extras
Definition cgltf.h:883
char * name
Definition cgltf.h:882
cgltf_bool double_sided
Definition cgltf.h:649
cgltf_pbr_specular_glossiness pbr_specular_glossiness
Definition cgltf.h:629
char * name
Definition cgltf.h:612
cgltf_pbr_metallic_roughness pbr_metallic_roughness
Definition cgltf.h:628
cgltf_dispersion dispersion
Definition cgltf.h:641
cgltf_iridescence iridescence
Definition cgltf.h:637
cgltf_bool has_subsurface
Definition cgltf.h:624
cgltf_extras extras
Definition cgltf.h:651
cgltf_size extensions_count
Definition cgltf.h:652
cgltf_bool has_anisotropy
Definition cgltf.h:625
cgltf_sheen sheen
Definition cgltf.h:633
cgltf_bool has_foundation_materials
Definition cgltf.h:627
cgltf_bool has_sheen
Definition cgltf.h:620
cgltf_bool unlit
Definition cgltf.h:650
cgltf_bool has_diffuse_transmission
Definition cgltf.h:623
cgltf_specular specular
Definition cgltf.h:632
cgltf_float emissive_factor[3]
Definition cgltf.h:646
cgltf_emissive_strength emissive_strength
Definition cgltf.h:636
cgltf_bool has_ior
Definition cgltf.h:618
cgltf_anisotropy anisotropy
Definition cgltf.h:640
cgltf_bool has_transmission
Definition cgltf.h:616
cgltf_extension * extensions
Definition cgltf.h:653
cgltf_bool has_pbr_metallic_roughness
Definition cgltf.h:613
cgltf_bool has_iridescence
Definition cgltf.h:622
cgltf_volume volume
Definition cgltf.h:635
cgltf_bool has_volume
Definition cgltf.h:617
cgltf_texture_view emissive_texture
Definition cgltf.h:645
cgltf_bool has_emissive_strength
Definition cgltf.h:621
cgltf_diffuse_transmission diffuse_transmission
Definition cgltf.h:638
cgltf_texture_view occlusion_texture
Definition cgltf.h:644
cgltf_transmission transmission
Definition cgltf.h:634
cgltf_bool has_clearcoat
Definition cgltf.h:615
cgltf_ior ior
Definition cgltf.h:631
cgltf_alpha_mode alpha_mode
Definition cgltf.h:647
cgltf_subsurface subsurface
Definition cgltf.h:639
cgltf_foundation_materials foundation_materials
Definition cgltf.h:642
cgltf_clearcoat clearcoat
Definition cgltf.h:630
cgltf_bool has_pbr_specular_glossiness
Definition cgltf.h:614
cgltf_texture_view normal_texture
Definition cgltf.h:643
cgltf_float alpha_cutoff
Definition cgltf.h:648
cgltf_bool has_specular
Definition cgltf.h:619
cgltf_bool has_dispersion
Definition cgltf.h:626
void(* free_func)(void *user, void *ptr)
Definition cgltf.h:137
void * user_data
Definition cgltf.h:138
void *(* alloc_func)(void *user, cgltf_size size)
Definition cgltf.h:136
cgltf_size attributes_count
Definition cgltf.h:676
cgltf_attribute * attributes
Definition cgltf.h:675
cgltf_primitive * primitives
Definition cgltf.h:698
cgltf_size primitives_count
Definition cgltf.h:699
cgltf_extras extras
Definition cgltf.h:704
cgltf_size weights_count
Definition cgltf.h:701
cgltf_extension * extensions
Definition cgltf.h:706
char * name
Definition cgltf.h:697
cgltf_float * weights
Definition cgltf.h:700
cgltf_size target_names_count
Definition cgltf.h:703
cgltf_size extensions_count
Definition cgltf.h:705
char ** target_names
Definition cgltf.h:702
cgltf_size count
Definition cgltf.h:356
cgltf_buffer * buffer
Definition cgltf.h:352
cgltf_meshopt_compression_filter filter
Definition cgltf.h:358
cgltf_size offset
Definition cgltf.h:353
cgltf_meshopt_compression_mode mode
Definition cgltf.h:357
cgltf_size stride
Definition cgltf.h:355
cgltf_size size
Definition cgltf.h:354
cgltf_size attributes_count
Definition cgltf.h:665
cgltf_attribute * attributes
Definition cgltf.h:664
cgltf_mesh_gpu_instancing mesh_gpu_instancing
Definition cgltf.h:835
cgltf_skin * skin
Definition cgltf.h:817
cgltf_extras extras
Definition cgltf.h:833
cgltf_size children_count
Definition cgltf.h:816
char * name
Definition cgltf.h:813
cgltf_size weights_count
Definition cgltf.h:824
cgltf_light * light
Definition cgltf.h:820
cgltf_float rotation[4]
Definition cgltf.h:830
cgltf_bool has_translation
Definition cgltf.h:825
cgltf_node * parent
Definition cgltf.h:814
cgltf_mesh * mesh
Definition cgltf.h:818
cgltf_node ** children
Definition cgltf.h:815
cgltf_curve * curve
Definition cgltf.h:822
cgltf_size extensions_count
Definition cgltf.h:836
cgltf_bool has_rotation
Definition cgltf.h:826
cgltf_light_area * light_area
Definition cgltf.h:821
cgltf_float matrix[16]
Definition cgltf.h:832
cgltf_bool has_matrix
Definition cgltf.h:828
cgltf_bool has_scale
Definition cgltf.h:827
cgltf_float scale[3]
Definition cgltf.h:831
cgltf_extension * extensions
Definition cgltf.h:837
cgltf_float * weights
Definition cgltf.h:823
cgltf_bool has_mesh_gpu_instancing
Definition cgltf.h:834
cgltf_camera * camera
Definition cgltf.h:819
cgltf_float translation[3]
Definition cgltf.h:829
cgltf_memory_options memory
Definition cgltf.h:152
cgltf_size json_token_count
Definition cgltf.h:151
cgltf_file_type type
Definition cgltf.h:150
cgltf_file_options file
Definition cgltf.h:153
cgltf_texture_view diffuse_texture
Definition cgltf.h:499
cgltf_float specular_factor[3]
Definition cgltf.h:503
cgltf_float diffuse_factor[4]
Definition cgltf.h:502
cgltf_float glossiness_factor
Definition cgltf.h:504
cgltf_texture_view specular_glossiness_texture
Definition cgltf.h:500
cgltf_draco_mesh_compression draco_mesh_compression
Definition cgltf.h:689
cgltf_size extensions_count
Definition cgltf.h:692
cgltf_size attributes_count
Definition cgltf.h:684
cgltf_size targets_count
Definition cgltf.h:686
cgltf_accessor * indices
Definition cgltf.h:681
cgltf_extension * extensions
Definition cgltf.h:693
cgltf_morph_target * targets
Definition cgltf.h:685
cgltf_bool has_draco_mesh_compression
Definition cgltf.h:688
cgltf_size mappings_count
Definition cgltf.h:691
cgltf_extras extras
Definition cgltf.h:687
cgltf_material_mapping * mappings
Definition cgltf.h:690
cgltf_attribute * attributes
Definition cgltf.h:683
cgltf_primitive_type type
Definition cgltf.h:680
cgltf_material * material
Definition cgltf.h:682
cgltf_extras extras
Definition cgltf.h:450
cgltf_extension * extensions
Definition cgltf.h:452
cgltf_wrap_mode wrap_t
Definition cgltf.h:449
cgltf_filter_type mag_filter
Definition cgltf.h:446
cgltf_wrap_mode wrap_s
Definition cgltf.h:448
char * name
Definition cgltf.h:445
cgltf_size extensions_count
Definition cgltf.h:451
cgltf_filter_type min_filter
Definition cgltf.h:447
cgltf_bool has_foundation_environment
Definition cgltf.h:844
cgltf_size extensions_count
Definition cgltf.h:847
char * name
Definition cgltf.h:841
cgltf_node ** nodes
Definition cgltf.h:842
cgltf_foundation_environment foundation_environment
Definition cgltf.h:845
cgltf_extension * extensions
Definition cgltf.h:848
cgltf_extras extras
Definition cgltf.h:846
cgltf_size nodes_count
Definition cgltf.h:843
cgltf_texture_view sheen_color_texture
Definition cgltf.h:546
cgltf_float sheen_color_factor[3]
Definition cgltf.h:547
cgltf_float sheen_roughness_factor
Definition cgltf.h:549
cgltf_texture_view sheen_roughness_texture
Definition cgltf.h:548
cgltf_extension * extensions
Definition cgltf.h:719
cgltf_extras extras
Definition cgltf.h:717
cgltf_node * skeleton
Definition cgltf.h:715
cgltf_node ** joints
Definition cgltf.h:713
cgltf_accessor * inverse_bind_matrices
Definition cgltf.h:716
cgltf_size joints_count
Definition cgltf.h:714
char * name
Definition cgltf.h:712
cgltf_size extensions_count
Definition cgltf.h:718
cgltf_float specular_factor
Definition cgltf.h:533
cgltf_float specular_color_factor[3]
Definition cgltf.h:532
cgltf_texture_view specular_color_texture
Definition cgltf.h:531
cgltf_texture_view specular_texture
Definition cgltf.h:530
cgltf_float subsurface_radius[3]
Definition cgltf.h:579
cgltf_float subsurface_scale
Definition cgltf.h:580
char * subsurface_method
Definition cgltf.h:577
cgltf_float subsurface_weight
Definition cgltf.h:578
cgltf_bool has_texcoord
Definition cgltf.h:474
cgltf_float rotation
Definition cgltf.h:472
cgltf_float scale[2]
Definition cgltf.h:473
cgltf_float offset[2]
Definition cgltf.h:471
cgltf_int texcoord
Definition cgltf.h:475
cgltf_float scale
Definition cgltf.h:482
cgltf_bool has_transform
Definition cgltf.h:483
cgltf_int texcoord
Definition cgltf.h:481
cgltf_texture_transform transform
Definition cgltf.h:484
cgltf_texture * texture
Definition cgltf.h:480
cgltf_bool has_basisu
Definition cgltf.h:460
cgltf_image * basisu_image
Definition cgltf.h:461
cgltf_sampler * sampler
Definition cgltf.h:459
char * name
Definition cgltf.h:457
cgltf_image * image
Definition cgltf.h:458
cgltf_bool has_webp
Definition cgltf.h:462
cgltf_extras extras
Definition cgltf.h:464
cgltf_extension * extensions
Definition cgltf.h:466
cgltf_size extensions_count
Definition cgltf.h:465
cgltf_image * webp_image
Definition cgltf.h:463
cgltf_float transmission_factor
Definition cgltf.h:520
cgltf_texture_view transmission_texture
Definition cgltf.h:519
cgltf_float attenuation_distance
Definition cgltf.h:541
cgltf_float thickness_factor
Definition cgltf.h:539
cgltf_texture_view thickness_texture
Definition cgltf.h:538
cgltf_float attenuation_color[3]
Definition cgltf.h:540