94#ifndef CGLTF_H_INCLUDED__
95#define CGLTF_H_INCLUDED__
1024 const char* gltf_path);
1088#if defined(__INTELLISENSE__) || defined(__JETBRAINS_IDE__)
1090#define CGLTF_IMPLEMENTATION
1093#ifdef CGLTF_IMPLEMENTATION
1101#if !defined(CGLTF_MALLOC) || !defined(CGLTF_FREE) || !defined(CGLTF_ATOI) || !defined(CGLTF_ATOF) || !defined(CGLTF_ATOLL)
1106#define JSMN_PARENT_LINKS
1125 JSMN_ERROR_NOMEM = -1,
1127 JSMN_ERROR_INVAL = -2,
1129 JSMN_ERROR_PART = -3
1136#ifdef JSMN_PARENT_LINKS
1142 unsigned int toknext;
1145static void jsmn_init(jsmn_parser *parser);
1146static int jsmn_parse(jsmn_parser *parser,
const char *js,
size_t len, jsmntok_t *tokens,
size_t num_tokens);
1153#define GlbHeaderSize 12
1154#define GlbChunkHeaderSize 8
1155static const uint32_t GlbVersion = 2;
1156static const uint32_t GlbMagic = 0x46546C67;
1157static const uint32_t GlbMagicJsonChunk = 0x4E4F534A;
1158static const uint32_t GlbMagicBinChunk = 0x004E4942;
1163#define CGLTF_MALLOC(size) malloc(size)
1166#define CGLTF_FREE(ptr) free(ptr)
1169#define CGLTF_ATOI(str) atoi(str)
1172#define CGLTF_ATOF(str) atof(str)
1175#define CGLTF_ATOLL(str) atoll(str)
1177#ifndef CGLTF_VALIDATE_ENABLE_ASSERTS
1178#define CGLTF_VALIDATE_ENABLE_ASSERTS 0
1181static void* cgltf_default_alloc(
void* user,
cgltf_size size)
1184 return CGLTF_MALLOC(size);
1187static void cgltf_default_free(
void* user,
void* ptr)
1195 if (SIZE_MAX / element_size < count)
1204 memset(result, 0, element_size * count);
1212 void (*memory_free)(
void*,
void*) = memory_options->
free_func ? memory_options->
free_func : &cgltf_default_free;
1214 FILE* file = fopen(path,
"rb");
1224 fseek(file, 0, SEEK_END);
1227 __int64 length = _ftelli64(file);
1229 long length = ftell(file);
1238 fseek(file, 0, SEEK_SET);
1242 char* file_data = (
char*)memory_alloc(memory_options->
user_data, file_size);
1249 cgltf_size read_size = fread(file_data, 1, file_size, file);
1253 if (read_size != file_size)
1255 memory_free(memory_options->
user_data, file_data);
1274 void (*memfree)(
void*,
void*) = memory_options->
free_func ? memory_options->
free_func : &cgltf_default_free;
1275 memfree(memory_options->
user_data, data);
1282 if (size < GlbHeaderSize)
1287 if (options == NULL)
1304 memcpy(&tmp, data, 4);
1305 if (tmp != GlbMagic)
1319 cgltf_result json_result = cgltf_parse_json(&fixed_options, (
const uint8_t*)data, size, out_data);
1330 const uint8_t* ptr = (
const uint8_t*)data;
1332 memcpy(&tmp, ptr + 4, 4);
1333 uint32_t version = tmp;
1334 if (version != GlbVersion)
1340 memcpy(&tmp, ptr + 8, 4);
1346 const uint8_t* json_chunk = ptr + GlbHeaderSize;
1348 if (GlbHeaderSize + GlbChunkHeaderSize > size)
1354 uint32_t json_length;
1355 memcpy(&json_length, json_chunk, 4);
1356 if (json_length > size - GlbHeaderSize - GlbChunkHeaderSize)
1362 memcpy(&tmp, json_chunk + 4, 4);
1363 if (tmp != GlbMagicJsonChunk)
1368 json_chunk += GlbChunkHeaderSize;
1370 const void* bin = NULL;
1373 if (GlbChunkHeaderSize <= size - GlbHeaderSize - GlbChunkHeaderSize - json_length)
1376 const uint8_t* bin_chunk = json_chunk + json_length;
1379 uint32_t bin_length;
1380 memcpy(&bin_length, bin_chunk, 4);
1381 if (bin_length > size - GlbHeaderSize - GlbChunkHeaderSize - json_length - GlbChunkHeaderSize)
1387 memcpy(&tmp, bin_chunk + 4, 4);
1388 if (tmp != GlbMagicBinChunk)
1393 bin_chunk += GlbChunkHeaderSize;
1396 bin_size = bin_length;
1399 cgltf_result json_result = cgltf_parse_json(&fixed_options, json_chunk, json_length, out_data);
1406 (*out_data)->bin = bin;
1407 (*out_data)->bin_size = bin_size;
1414 if (options == NULL)
1422 void* file_data = NULL;
1430 result =
cgltf_parse(options, file_data, file_size, out_data);
1434 file_release(&options->
memory, &options->
file, file_data);
1438 (*out_data)->file_data = file_data;
1443static void cgltf_combine_paths(
char* path,
const char* base,
const char* uri)
1445 const char* s0 = strrchr(base,
'/');
1446 const char* s1 = strrchr(base,
'\\');
1447 const char* slash = s0 ? (s1 && s1 > s0 ? s1 : s0) : s1;
1451 size_t prefix = slash - base + 1;
1453 strncpy(path, base, prefix);
1454 strcpy(path + prefix, uri);
1468 char* path = (
char*)memory_alloc(options->
memory.
user_data, strlen(uri) + strlen(gltf_path) + 1);
1474 cgltf_combine_paths(path, gltf_path, uri);
1479 void* file_data = NULL;
1494 unsigned char* data = (
unsigned char*)memory_alloc(options->
memory.
user_data, size);
1500 unsigned int buffer = 0;
1501 unsigned int buffer_bits = 0;
1505 while (buffer_bits < 8)
1507 char ch = *base64++;
1510 (unsigned)(ch -
'A') < 26 ? (ch -
'A') :
1511 (unsigned)(ch -
'a') < 26 ? (ch -
'a') + 26 :
1512 (unsigned)(ch -
'0') < 10 ? (ch -
'0') + 52 :
1523 buffer = (buffer << 6) | index;
1527 data[i] = (
unsigned char)(buffer >> (buffer_bits - 8));
1536static int cgltf_unhex(
char ch)
1539 (
unsigned)(ch -
'0') < 10 ? (ch -
'0') :
1540 (unsigned)(ch -
'A') < 6 ? (ch -
'A') + 10 :
1541 (unsigned)(ch -
'a') < 6 ? (ch -
'a') + 10 :
1547 char*
read =
string + strcspn(
string,
"\\");
1550 return read - string;
1552 char* write = string;
1553 char* last = string;
1559 memmove(write, last, written);
1570 case '\"': *write++ =
'\"';
break;
1571 case '/': *write++ =
'/';
break;
1572 case '\\': *write++ =
'\\';
break;
1573 case 'b': *write++ =
'\b';
break;
1574 case 'f': *write++ =
'\f';
break;
1575 case 'r': *write++ =
'\r';
break;
1576 case 'n': *write++ =
'\n';
break;
1577 case 't': *write++ =
'\t';
break;
1584 character = (character << 4) + cgltf_unhex(*
read++);
1587 if (character <= 0x7F)
1589 *write++ = character & 0xFF;
1591 else if (character <= 0x7FF)
1593 *write++ = 0xC0 | ((character >> 6) & 0xFF);
1594 *write++ = 0x80 | (character & 0x3F);
1598 *write++ = 0xE0 | ((character >> 12) & 0xFF);
1599 *write++ = 0x80 | ((character >> 6) & 0x3F);
1600 *write++ = 0x80 | (character & 0x3F);
1613 return write - string;
1625 int ch1 = cgltf_unhex(i[1]);
1629 int ch2 = cgltf_unhex(i[2]);
1633 *write++ = (char)(ch1 * 16 + ch2);
1649 if (options == NULL)
1679 if (strncmp(uri,
"data:", 5) == 0)
1681 const char* comma = strchr(uri,
',');
1683 if (comma && comma - uri >= 7 && strncmp(comma - 7,
";base64", 7) == 0)
1698 else if (strstr(uri,
"://") == NULL && gltf_path)
1719 char* data = (
char*)buffer_view->
buffer->
data + offset + buffer_view->
offset;
1722 switch (component_type)
1725 for (
size_t i = 0; i < count; ++i)
1728 bound = bound > v ? bound : v;
1733 for (
size_t i = 0; i < count; ++i)
1736 bound = bound > v ? bound : v;
1741 for (
size_t i = 0; i < count; ++i)
1744 bound = bound > v ? bound : v;
1755#if CGLTF_VALIDATE_ENABLE_ASSERTS
1756#define CGLTF_ASSERT_IF(cond, result) assert(!(cond)); if (cond) return result;
1758#define CGLTF_ASSERT_IF(cond, result) if (cond) return result;
1873 CGLTF_ASSERT_IF(indices &&
1980 *dest_size = json_size + 1;
1986 if (*dest_size + 1 < json_size)
1989 dest[*dest_size - 1] = 0;
1994 dest[json_size] = 0;
2007 for (
cgltf_size i = 0; i < extensions_count; ++i)
2309 cgltf_free_extras(data, &data->
extras);
2336 memcpy(lm, node->
matrix,
sizeof(
float) * 16);
2349 float sx = node->
scale[0];
2350 float sy = node->
scale[1];
2351 float sz = node->
scale[2];
2353 lm[0] = (1 - 2 * qy*qy - 2 * qz*qz) * sx;
2354 lm[1] = (2 * qx*qy + 2 * qz*qw) * sx;
2355 lm[2] = (2 * qx*qz - 2 * qy*qw) * sx;
2358 lm[4] = (2 * qx*qy - 2 * qz*qw) * sy;
2359 lm[5] = (1 - 2 * qx*qx - 2 * qz*qz) * sy;
2360 lm[6] = (2 * qy*qz + 2 * qx*qw) * sy;
2363 lm[8] = (2 * qx*qz + 2 * qy*qw) * sz;
2364 lm[9] = (2 * qy*qz - 2 * qx*qw) * sz;
2365 lm[10] = (1 - 2 * qx*qx - 2 * qy*qy) * sz;
2387 for (
int i = 0; i < 4; ++i)
2389 float l0 = lm[i * 4 + 0];
2390 float l1 = lm[i * 4 + 1];
2391 float l2 = lm[i * 4 + 2];
2393 float r0 = l0 * pm[0] + l1 * pm[4] + l2 * pm[8];
2394 float r1 = l0 * pm[1] + l1 * pm[5] + l2 * pm[9];
2395 float r2 = l0 * pm[2] + l1 * pm[6] + l2 * pm[10];
2412 switch (component_type)
2415 return *((
const int16_t*) in);
2417 return *((
const uint16_t*) in);
2419 return *((
const uint32_t*) in);
2421 return *((
const int8_t*) in);
2423 return *((
const uint8_t*) in);
2431 switch (component_type)
2434 return *((
const uint16_t*) in);
2436 return *((
const uint32_t*) in);
2438 return *((
const uint8_t*) in);
2448 return *((
const float*) in);
2453 switch (component_type)
2457 return *((
const int16_t*) in) / (
cgltf_float)32767;
2459 return *((
const uint16_t*) in) / (
cgltf_float)65535;
2469 return (
cgltf_float)cgltf_component_read_integer(in, component_type);
2476 if (element_size < num_components) {
2486 out[0] = cgltf_component_read_float(element, component_type, normalized);
2487 out[1] = cgltf_component_read_float(element + 1, component_type, normalized);
2488 out[2] = cgltf_component_read_float(element + 4, component_type, normalized);
2489 out[3] = cgltf_component_read_float(element + 5, component_type, normalized);
2495 out[0] = cgltf_component_read_float(element, component_type, normalized);
2496 out[1] = cgltf_component_read_float(element + 1, component_type, normalized);
2497 out[2] = cgltf_component_read_float(element + 2, component_type, normalized);
2498 out[3] = cgltf_component_read_float(element + 4, component_type, normalized);
2499 out[4] = cgltf_component_read_float(element + 5, component_type, normalized);
2500 out[5] = cgltf_component_read_float(element + 6, component_type, normalized);
2501 out[6] = cgltf_component_read_float(element + 8, component_type, normalized);
2502 out[7] = cgltf_component_read_float(element + 9, component_type, normalized);
2503 out[8] = cgltf_component_read_float(element + 10, component_type, normalized);
2509 out[0] = cgltf_component_read_float(element, component_type, normalized);
2510 out[1] = cgltf_component_read_float(element + 2, component_type, normalized);
2511 out[2] = cgltf_component_read_float(element + 4, component_type, normalized);
2512 out[3] = cgltf_component_read_float(element + 8, component_type, normalized);
2513 out[4] = cgltf_component_read_float(element + 10, component_type, normalized);
2514 out[5] = cgltf_component_read_float(element + 12, component_type, normalized);
2515 out[6] = cgltf_component_read_float(element + 16, component_type, normalized);
2516 out[7] = cgltf_component_read_float(element + 18, component_type, normalized);
2517 out[8] = cgltf_component_read_float(element + 20, component_type, normalized);
2521 for (
cgltf_size i = 0; i < num_components; ++i)
2523 out[i] = cgltf_component_read_float(element + component_size * i, component_type, normalized);
2531 return (
const uint8_t*)view->
data;
2536 const uint8_t* result = (
const uint8_t*)view->
buffer->
data;
2546 if (attr->
type == type && attr->
index == index)
2561 memset(out, 0, element_size *
sizeof(
cgltf_float));
2565 if (element == NULL)
2569 element += accessor->
offset + accessor->
stride * index;
2579 return available_floats;
2582 float_count = available_floats < float_count ? available_floats : float_count;
2583 cgltf_size element_count = float_count / floats_per_element;
2588 memset(out, 0, element_count * floats_per_element *
sizeof(
cgltf_float));
2593 if (element == NULL)
2597 element += accessor->
offset;
2601 memcpy(out, element, element_count * floats_per_element *
sizeof(
cgltf_float));
2607 for (
cgltf_size index = 0; index < element_count; index++, dest += floats_per_element, element += accessor->
stride)
2625 if (index_data == NULL || reader_head == NULL)
2634 for (
cgltf_size reader_index = 0; reader_index < sparse->
count; reader_index++, index_data += index_stride, reader_head += accessor->
stride)
2637 float* writer_head = out + writer_index * floats_per_element;
2639 if (!cgltf_element_read_float(reader_head, accessor->
type, accessor->
component_type, accessor->
normalized, writer_head, floats_per_element))
2646 return element_count * floats_per_element;
2651 switch (component_type)
2654 return *((
const int8_t*) in);
2657 return *((
const uint8_t*) in);
2660 return *((
const int16_t*) in);
2663 return *((
const uint16_t*) in);
2666 return *((
const uint32_t*) in);
2677 if (element_size < num_components)
2690 for (
cgltf_size i = 0; i < num_components; ++i)
2692 out[i] = cgltf_component_read_uint(element + component_size * i, component_type);
2705 memset(out, 0, element_size *
sizeof(
cgltf_uint ));
2709 if (element == NULL)
2713 element += accessor->
offset + accessor->
stride * index;
2714 return cgltf_element_read_uint(element, accessor->
type, accessor->
component_type, out, element_size);
2728 if (element == NULL)
2732 element += accessor->
offset + accessor->
stride * index;
2733 return cgltf_component_read_index(element, accessor->
component_type);
2848 return accessor->
count;
2851 index_count = accessor->
count < index_count ? accessor->
count : index_count;
2862 if (index_component_size > out_component_size)
2867 if (element == NULL)
2871 element += accessor->
offset;
2873 if (index_component_size == out_component_size && accessor->
stride == out_component_size)
2875 memcpy(out, element, index_count * index_component_size);
2880 switch (out_component_size)
2883 for (
cgltf_size index = 0; index < index_count; index++, element += accessor->
stride)
2885 ((uint16_t*)out)[index] = (uint16_t)cgltf_component_read_index(element, accessor->
component_type);
2889 for (
cgltf_size index = 0; index < index_count; index++, element += accessor->
stride)
2891 ((uint32_t*)out)[index] = (uint32_t)cgltf_component_read_index(element, accessor->
component_type);
2901#define CGLTF_ERROR_JSON -1
2902#define CGLTF_ERROR_NOMEM -2
2903#define CGLTF_ERROR_LEGACY -3
2905#define CGLTF_CHECK_TOKTYPE(tok_, type_) if ((tok_).type != (type_)) { return CGLTF_ERROR_JSON; }
2906#define CGLTF_CHECK_TOKTYPE_RET(tok_, type_, ret_) if ((tok_).type != (type_)) { return ret_; }
2907#define CGLTF_CHECK_KEY(tok_) if ((tok_).type != JSMN_STRING || (tok_).size == 0) { return CGLTF_ERROR_JSON; }
2909#define CGLTF_PTRINDEX(type, idx) (type*)((cgltf_size)idx + 1)
2910#define CGLTF_PTRFIXUP(var, data, size) if (var) { if ((cgltf_size)var > size) { return CGLTF_ERROR_JSON; } var = &data[(cgltf_size)var-1]; }
2911#define CGLTF_PTRFIXUP_REQ(var, data, size) if (!var || (cgltf_size)var > size) { return CGLTF_ERROR_JSON; } var = &data[(cgltf_size)var-1];
2913static int cgltf_json_strcmp(jsmntok_t
const* tok,
const uint8_t* json_chunk,
const char* str)
2915 CGLTF_CHECK_TOKTYPE(*tok, JSMN_STRING);
2916 size_t const str_len = strlen(str);
2917 size_t const name_length = (size_t)(tok->end - tok->start);
2918 return (str_len == name_length) ? strncmp((
const char*)json_chunk + tok->start, str, str_len) : 128;
2921static int cgltf_json_to_int(jsmntok_t
const* tok,
const uint8_t* json_chunk)
2923 CGLTF_CHECK_TOKTYPE(*tok, JSMN_PRIMITIVE);
2925 int size = (size_t)(tok->end - tok->start) <
sizeof(tmp) ? (
int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1);
2926 strncpy(tmp, (
const char*)json_chunk + tok->start, size);
2928 return CGLTF_ATOI(tmp);
2931static cgltf_size cgltf_json_to_size(jsmntok_t
const* tok,
const uint8_t* json_chunk)
2933 CGLTF_CHECK_TOKTYPE_RET(*tok, JSMN_PRIMITIVE, 0);
2935 int size = (size_t)(tok->end - tok->start) <
sizeof(tmp) ? (
int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1);
2936 strncpy(tmp, (
const char*)json_chunk + tok->start, size);
2938 long long res = CGLTF_ATOLL(tmp);
2942static cgltf_float cgltf_json_to_float(jsmntok_t
const* tok,
const uint8_t* json_chunk)
2944 CGLTF_CHECK_TOKTYPE(*tok, JSMN_PRIMITIVE);
2946 int size = (size_t)(tok->end - tok->start) <
sizeof(tmp) ? (
int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1);
2947 strncpy(tmp, (
const char*)json_chunk + tok->start, size);
2952static cgltf_bool cgltf_json_to_bool(jsmntok_t
const* tok,
const uint8_t* json_chunk)
2954 int size = (int)(tok->end - tok->start);
2955 return size == 4 && memcmp(json_chunk + tok->start,
"true", 4) == 0;
2958static int cgltf_skip_json(jsmntok_t
const* tokens,
int i)
2964 switch (tokens[i].type)
2967 end += tokens[i].size * 2;
2971 end += tokens[i].size;
2974 case JSMN_PRIMITIVE:
2988static void cgltf_fill_float_array(
float* out_array,
int size,
float value)
2990 for (
int j = 0; j < size; ++j)
2992 out_array[j] = value;
2996static int cgltf_parse_json_float_array(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
float* out_array,
int size)
2998 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_ARRAY);
2999 if (tokens[i].size != size)
3001 return CGLTF_ERROR_JSON;
3004 for (
int j = 0; j < size; ++j)
3006 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
3007 out_array[j] = cgltf_json_to_float(tokens + i, json_chunk);
3013static int cgltf_parse_json_string(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
char** out_string)
3015 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_STRING);
3018 return CGLTF_ERROR_JSON;
3020 int size = (int)(tokens[i].end - tokens[i].start);
3024 return CGLTF_ERROR_NOMEM;
3026 strncpy(result, (
const char*)json_chunk + tokens[i].start, size);
3028 *out_string = result;
3032static 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)
3035 if (tokens[i].type != JSMN_ARRAY)
3037 return tokens[i].type == JSMN_OBJECT ? CGLTF_ERROR_LEGACY : CGLTF_ERROR_JSON;
3041 return CGLTF_ERROR_JSON;
3043 int size = tokens[i].size;
3044 void* result = cgltf_calloc(options, element_size, size);
3047 return CGLTF_ERROR_NOMEM;
3049 *out_array = result;
3054static 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)
3056 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_ARRAY);
3057 i = cgltf_parse_json_array(options, tokens, i, json_chunk,
sizeof(
char*), (
void**)out_array, out_size);
3065 i = cgltf_parse_json_string(options, tokens, i, json_chunk, j + (*out_array));
3074static void cgltf_parse_attribute_type(
const char* name,
cgltf_attribute_type* out_type,
int* out_index)
3082 const char* us = strchr(name,
'_');
3083 size_t len = us ? (size_t)(us - name) : strlen(name);
3085 if (len == 8 && strncmp(name,
"POSITION", 8) == 0)
3089 else if (len == 6 && strncmp(name,
"NORMAL", 6) == 0)
3093 else if (len == 7 && strncmp(name,
"TANGENT", 7) == 0)
3097 else if (len == 8 && strncmp(name,
"TEXCOORD", 8) == 0)
3101 else if (len == 5 && strncmp(name,
"COLOR", 5) == 0)
3105 else if (len == 6 && strncmp(name,
"JOINTS", 6) == 0)
3109 else if (len == 7 && strncmp(name,
"WEIGHTS", 7) == 0)
3120 *out_index = CGLTF_ATOI(us + 1);
3129static 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)
3131 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3133 if (*out_attributes)
3135 return CGLTF_ERROR_JSON;
3138 *out_attributes_count = tokens[i].size;
3142 if (!*out_attributes)
3144 return CGLTF_ERROR_NOMEM;
3147 for (
cgltf_size j = 0; j < *out_attributes_count; ++j)
3149 CGLTF_CHECK_KEY(tokens[i]);
3151 i = cgltf_parse_json_string(options, tokens, i, json_chunk, &(*out_attributes)[j].name);
3154 return CGLTF_ERROR_JSON;
3157 cgltf_parse_attribute_type((*out_attributes)[j].name, &(*out_attributes)[j].type, &(*out_attributes)[j].index);
3159 (*out_attributes)[j].data = CGLTF_PTRINDEX(
cgltf_accessor, cgltf_json_to_int(tokens + i, json_chunk));
3166static int cgltf_parse_json_extras(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_extras* out_extras)
3168 if (out_extras->
data)
3170 return CGLTF_ERROR_JSON;
3177 size_t start = tokens[i].start;
3178 size_t size = tokens[i].end - start;
3180 if (!out_extras->
data)
3182 return CGLTF_ERROR_NOMEM;
3184 strncpy(out_extras->
data, (
const char*)json_chunk + start, size);
3185 out_extras->
data[size] =
'\0';
3187 i = cgltf_skip_json(tokens, i);
3191static int cgltf_parse_json_unprocessed_extension(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_extension* out_extension)
3193 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_STRING);
3194 CGLTF_CHECK_TOKTYPE(tokens[i+1], JSMN_OBJECT);
3195 if (out_extension->
name)
3197 return CGLTF_ERROR_JSON;
3200 cgltf_size name_length = tokens[i].end - tokens[i].start;
3202 if (!out_extension->
name)
3204 return CGLTF_ERROR_NOMEM;
3206 strncpy(out_extension->
name, (
const char*)json_chunk + tokens[i].start, name_length);
3207 out_extension->
name[name_length] = 0;
3210 size_t start = tokens[i].start;
3211 size_t size = tokens[i].end - start;
3213 if (!out_extension->
data)
3215 return CGLTF_ERROR_NOMEM;
3217 strncpy(out_extension->
data, (
const char*)json_chunk + start, size);
3218 out_extension->
data[size] =
'\0';
3220 i = cgltf_skip_json(tokens, i);
3225static 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)
3229 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3232 return CGLTF_ERROR_JSON;
3235 int extensions_size = tokens[i].size;
3236 *out_extensions_count = 0;
3239 if (!*out_extensions)
3241 return CGLTF_ERROR_NOMEM;
3246 for (
int j = 0; j < extensions_size; ++j)
3248 CGLTF_CHECK_KEY(tokens[i]);
3250 cgltf_size extension_index = (*out_extensions_count)++;
3252 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, extension);
3264 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3266 int size = tokens[i].size;
3269 for (
int j = 0; j < size; ++j)
3271 CGLTF_CHECK_KEY(tokens[i]);
3273 if (cgltf_json_strcmp(tokens + i, json_chunk,
"attributes") == 0)
3275 i = cgltf_parse_json_attribute_list(options, tokens, i + 1, json_chunk, &out_draco_mesh_compression->
attributes, &out_draco_mesh_compression->
attributes_count);
3277 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"bufferView") == 0)
3285 i = cgltf_skip_json(tokens, i+1);
3299 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3301 int size = tokens[i].size;
3304 for (
int j = 0; j < size; ++j)
3306 CGLTF_CHECK_KEY(tokens[i]);
3308 if (cgltf_json_strcmp(tokens + i, json_chunk,
"attributes") == 0)
3310 i = cgltf_parse_json_attribute_list(options, tokens, i + 1, json_chunk, &out_mesh_gpu_instancing->
attributes, &out_mesh_gpu_instancing->
attributes_count);
3314 i = cgltf_skip_json(tokens, i+1);
3329 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_ARRAY);
3331 int size = tokens[i].size;
3334 for (
int j = 0; j < size; ++j)
3336 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3338 int obj_size = tokens[i].size;
3342 int variants_tok = -1;
3343 int extras_tok = -1;
3345 for (
int k = 0; k < obj_size; ++k)
3347 CGLTF_CHECK_KEY(tokens[i]);
3349 if (cgltf_json_strcmp(tokens + i, json_chunk,
"material") == 0)
3352 material = cgltf_json_to_int(tokens + i, json_chunk);
3355 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"variants") == 0)
3358 CGLTF_CHECK_TOKTYPE(tokens[variants_tok], JSMN_ARRAY);
3360 i = cgltf_skip_json(tokens, i+1);
3362 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
3365 i = cgltf_skip_json(tokens, extras_tok);
3369 i = cgltf_skip_json(tokens, i+1);
3378 if (material < 0 || variants_tok < 0)
3380 return CGLTF_ERROR_JSON;
3385 for (
int k = 0; k < tokens[variants_tok].size; ++k)
3387 int variant = cgltf_json_to_int(&tokens[variants_tok + 1 + k], json_chunk);
3392 out_mappings[*offset].
variant = variant;
3394 if (extras_tok >= 0)
3396 int e = cgltf_parse_json_extras(options, tokens, extras_tok, json_chunk, &out_mappings[*offset].extras);
3406 (*offset) += tokens[variants_tok].size;
3413static int cgltf_parse_json_material_mappings(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_primitive* out_prim)
3415 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3417 int size = tokens[i].size;
3420 for (
int j = 0; j < size; ++j)
3422 CGLTF_CHECK_KEY(tokens[i]);
3424 if (cgltf_json_strcmp(tokens + i, json_chunk,
"mappings") == 0)
3428 return CGLTF_ERROR_JSON;
3432 int k = cgltf_parse_json_material_mapping_data(options, tokens, i + 1, json_chunk, NULL, &mappings_offset);
3441 mappings_offset = 0;
3442 i = cgltf_parse_json_material_mapping_data(options, tokens, i + 1, json_chunk, out_prim->
mappings, &mappings_offset);
3446 i = cgltf_skip_json(tokens, i+1);
3458static cgltf_primitive_type cgltf_json_to_primitive_type(jsmntok_t
const* tok,
const uint8_t* json_chunk)
3460 int type = cgltf_json_to_int(tok, json_chunk);
3483static int cgltf_parse_json_primitive(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_primitive* out_prim)
3485 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3489 int size = tokens[i].size;
3492 for (
int j = 0; j < size; ++j)
3494 CGLTF_CHECK_KEY(tokens[i]);
3496 if (cgltf_json_strcmp(tokens+i, json_chunk,
"mode") == 0)
3499 out_prim->
type = cgltf_json_to_primitive_type(tokens+i, json_chunk);
3502 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"indices") == 0)
3508 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"material") == 0)
3514 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"attributes") == 0)
3518 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"targets") == 0)
3535 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
3537 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_prim->
extras);
3539 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
3543 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3546 return CGLTF_ERROR_JSON;
3549 int extensions_size = tokens[i].size;
3555 return CGLTF_ERROR_NOMEM;
3559 for (
int k = 0; k < extensions_size; ++k)
3561 CGLTF_CHECK_KEY(tokens[i]);
3563 if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_draco_mesh_compression") == 0)
3566 i = cgltf_parse_json_draco_mesh_compression(options, tokens, i + 1, json_chunk, &out_prim->
draco_mesh_compression);
3568 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_variants") == 0)
3570 i = cgltf_parse_json_material_mappings(options, tokens, i + 1, json_chunk, out_prim);
3574 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_prim->
extensions[out_prim->
extensions_count++]));
3585 i = cgltf_skip_json(tokens, i+1);
3597static int cgltf_parse_json_mesh(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_mesh* out_mesh)
3599 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3601 int size = tokens[i].size;
3604 for (
int j = 0; j < size; ++j)
3606 CGLTF_CHECK_KEY(tokens[i]);
3608 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
3610 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_mesh->
name);
3612 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"primitives") == 0)
3622 i = cgltf_parse_json_primitive(options, tokens, i, json_chunk, &out_mesh->
primitives[prim_index]);
3629 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"weights") == 0)
3637 i = cgltf_parse_json_float_array(tokens, i - 1, json_chunk, out_mesh->
weights, (
int)out_mesh->
weights_count);
3639 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
3646 if (tokens[i].type == JSMN_OBJECT)
3648 int extras_size = tokens[i].size;
3651 for (
int k = 0; k < extras_size; ++k)
3653 CGLTF_CHECK_KEY(tokens[i]);
3655 if (cgltf_json_strcmp(tokens+i, json_chunk,
"targetNames") == 0 && tokens[i+1].type == JSMN_ARRAY)
3661 i = cgltf_skip_json(tokens, i+1);
3672 i = cgltf_skip_json(tokens, i);
3675 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
3677 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_mesh->
extensions_count, &out_mesh->
extensions);
3681 i = cgltf_skip_json(tokens, i+1);
3693static int cgltf_parse_json_meshes(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
3703 i = cgltf_parse_json_mesh(options, tokens, i, json_chunk, &out_data->
meshes[j]);
3712static cgltf_component_type cgltf_json_to_component_type(jsmntok_t
const* tok,
const uint8_t* json_chunk)
3714 int type = cgltf_json_to_int(tok, json_chunk);
3735static int cgltf_parse_json_accessor_sparse(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_accessor_sparse* out_sparse)
3737 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3739 int size = tokens[i].size;
3742 for (
int j = 0; j < size; ++j)
3744 CGLTF_CHECK_KEY(tokens[i]);
3746 if (cgltf_json_strcmp(tokens+i, json_chunk,
"count") == 0)
3749 out_sparse->
count = cgltf_json_to_size(tokens + i, json_chunk);
3752 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"indices") == 0)
3755 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3757 int indices_size = tokens[i].size;
3760 for (
int k = 0; k < indices_size; ++k)
3762 CGLTF_CHECK_KEY(tokens[i]);
3764 if (cgltf_json_strcmp(tokens+i, json_chunk,
"bufferView") == 0)
3770 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
3776 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"componentType") == 0)
3784 i = cgltf_skip_json(tokens, i+1);
3793 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"values") == 0)
3796 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3798 int values_size = tokens[i].size;
3801 for (
int k = 0; k < values_size; ++k)
3803 CGLTF_CHECK_KEY(tokens[i]);
3805 if (cgltf_json_strcmp(tokens+i, json_chunk,
"bufferView") == 0)
3811 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
3819 i = cgltf_skip_json(tokens, i+1);
3830 i = cgltf_skip_json(tokens, i+1);
3842static int cgltf_parse_json_accessor(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_accessor* out_accessor)
3844 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3846 int size = tokens[i].size;
3849 for (
int j = 0; j < size; ++j)
3851 CGLTF_CHECK_KEY(tokens[i]);
3853 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
3855 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_accessor->
name);
3857 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"bufferView") == 0)
3863 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
3867 cgltf_json_to_size(tokens+i, json_chunk);
3870 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"componentType") == 0)
3873 out_accessor->
component_type = cgltf_json_to_component_type(tokens + i, json_chunk);
3876 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"normalized") == 0)
3879 out_accessor->
normalized = cgltf_json_to_bool(tokens+i, json_chunk);
3882 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"count") == 0)
3885 out_accessor->
count = cgltf_json_to_size(tokens+i, json_chunk);
3888 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"type") == 0)
3891 if (cgltf_json_strcmp(tokens+i, json_chunk,
"SCALAR") == 0)
3895 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"VEC2") == 0)
3899 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"VEC3") == 0)
3903 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"VEC4") == 0)
3907 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"MAT2") == 0)
3911 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"MAT3") == 0)
3915 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"MAT4") == 0)
3921 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"min") == 0)
3926 int min_size = tokens[i].size > 16 ? 16 : tokens[i].size;
3927 i = cgltf_parse_json_float_array(tokens, i, json_chunk, out_accessor->
min, min_size);
3929 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"max") == 0)
3934 int max_size = tokens[i].size > 16 ? 16 : tokens[i].size;
3935 i = cgltf_parse_json_float_array(tokens, i, json_chunk, out_accessor->
max, max_size);
3937 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"sparse") == 0)
3940 i = cgltf_parse_json_accessor_sparse(tokens, i + 1, json_chunk, &out_accessor->
sparse);
3942 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
3944 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_accessor->
extras);
3946 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
3948 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_accessor->
extensions_count, &out_accessor->
extensions);
3952 i = cgltf_skip_json(tokens, i+1);
3964static int cgltf_parse_json_texture_transform(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_texture_transform* out_texture_transform)
3966 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
3968 int size = tokens[i].size;
3971 for (
int j = 0; j < size; ++j)
3973 CGLTF_CHECK_KEY(tokens[i]);
3975 if (cgltf_json_strcmp(tokens + i, json_chunk,
"offset") == 0)
3977 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_texture_transform->
offset, 2);
3979 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"rotation") == 0)
3982 out_texture_transform->
rotation = cgltf_json_to_float(tokens + i, json_chunk);
3985 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"scale") == 0)
3987 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_texture_transform->
scale, 2);
3989 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"texCoord") == 0)
3993 out_texture_transform->
texcoord = cgltf_json_to_int(tokens + i, json_chunk);
3998 i = cgltf_skip_json(tokens, i + 1);
4010static 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)
4014 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4016 out_texture_view->
scale = 1.0f;
4017 cgltf_fill_float_array(out_texture_view->
transform.
scale, 2, 1.0f);
4019 int size = tokens[i].size;
4022 for (
int j = 0; j < size; ++j)
4024 CGLTF_CHECK_KEY(tokens[i]);
4026 if (cgltf_json_strcmp(tokens + i, json_chunk,
"index") == 0)
4029 out_texture_view->
texture = CGLTF_PTRINDEX(
cgltf_texture, cgltf_json_to_int(tokens + i, json_chunk));
4032 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"texCoord") == 0)
4035 out_texture_view->
texcoord = cgltf_json_to_int(tokens + i, json_chunk);
4038 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"scale") == 0)
4041 out_texture_view->
scale = cgltf_json_to_float(tokens + i, json_chunk);
4044 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"strength") == 0)
4047 out_texture_view->
scale = cgltf_json_to_float(tokens + i, json_chunk);
4050 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
4054 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4055 int extensions_size = tokens[i].size;
4059 for (
int k = 0; k < extensions_size; ++k)
4061 CGLTF_CHECK_KEY(tokens[i]);
4063 if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_texture_transform") == 0)
4066 i = cgltf_parse_json_texture_transform(tokens, i + 1, json_chunk, &out_texture_view->
transform);
4070 i = cgltf_skip_json(tokens, i + 1);
4081 i = cgltf_skip_json(tokens, i + 1);
4095 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4097 int size = tokens[i].size;
4100 for (
int j = 0; j < size; ++j)
4102 CGLTF_CHECK_KEY(tokens[i]);
4104 if (cgltf_json_strcmp(tokens+i, json_chunk,
"metallicFactor") == 0)
4108 cgltf_json_to_float(tokens + i, json_chunk);
4111 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"roughnessFactor") == 0)
4115 cgltf_json_to_float(tokens+i, json_chunk);
4118 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"baseColorFactor") == 0)
4120 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_pbr->
base_color_factor, 4);
4122 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"baseColorTexture") == 0)
4124 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_pbr->
base_color_texture);
4126 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"metallicRoughnessTexture") == 0)
4132 i = cgltf_skip_json(tokens, i+1);
4146 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4147 int size = tokens[i].size;
4150 for (
int j = 0; j < size; ++j)
4152 CGLTF_CHECK_KEY(tokens[i]);
4154 if (cgltf_json_strcmp(tokens+i, json_chunk,
"diffuseFactor") == 0)
4156 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_pbr->
diffuse_factor, 4);
4158 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularFactor") == 0)
4160 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_pbr->
specular_factor, 3);
4162 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"glossinessFactor") == 0)
4168 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"diffuseTexture") == 0)
4170 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_pbr->
diffuse_texture);
4172 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularGlossinessTexture") == 0)
4178 i = cgltf_skip_json(tokens, i+1);
4190static int cgltf_parse_json_clearcoat(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_clearcoat* out_clearcoat)
4192 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4193 int size = tokens[i].size;
4196 for (
int j = 0; j < size; ++j)
4198 CGLTF_CHECK_KEY(tokens[i]);
4200 if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatFactor") == 0)
4203 out_clearcoat->
clearcoat_factor = cgltf_json_to_float(tokens + i, json_chunk);
4206 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatRoughnessFactor") == 0)
4212 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatTexture") == 0)
4214 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_clearcoat->
clearcoat_texture);
4216 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatRoughnessTexture") == 0)
4220 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"clearcoatNormalTexture") == 0)
4226 i = cgltf_skip_json(tokens, i+1);
4238static int cgltf_parse_json_ior(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_ior* out_ior)
4240 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4241 int size = tokens[i].size;
4245 out_ior->
ior = 1.5f;
4247 for (
int j = 0; j < size; ++j)
4249 CGLTF_CHECK_KEY(tokens[i]);
4251 if (cgltf_json_strcmp(tokens+i, json_chunk,
"ior") == 0)
4254 out_ior->
ior = cgltf_json_to_float(tokens + i, json_chunk);
4259 i = cgltf_skip_json(tokens, i+1);
4271static int cgltf_parse_json_specular(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_specular* out_specular)
4273 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4274 int size = tokens[i].size;
4281 for (
int j = 0; j < size; ++j)
4283 CGLTF_CHECK_KEY(tokens[i]);
4285 if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularFactor") == 0)
4288 out_specular->
specular_factor = cgltf_json_to_float(tokens + i, json_chunk);
4291 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularColorFactor") == 0)
4293 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_specular->
specular_color_factor, 3);
4295 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"specularTexture") == 0)
4297 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_specular->
specular_texture);
4299 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"specularColorTexture") == 0)
4301 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_specular->
specular_color_texture);
4305 i = cgltf_skip_json(tokens, i+1);
4317static int cgltf_parse_json_transmission(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_transmission* out_transmission)
4319 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4320 int size = tokens[i].size;
4323 for (
int j = 0; j < size; ++j)
4325 CGLTF_CHECK_KEY(tokens[i]);
4327 if (cgltf_json_strcmp(tokens+i, json_chunk,
"transmissionFactor") == 0)
4333 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"transmissionTexture") == 0)
4335 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_transmission->
transmission_texture);
4339 i = cgltf_skip_json(tokens, i+1);
4351static int cgltf_parse_json_volume(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_volume* out_volume)
4353 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4354 int size = tokens[i].size;
4357 for (
int j = 0; j < size; ++j)
4359 CGLTF_CHECK_KEY(tokens[i]);
4361 if (cgltf_json_strcmp(tokens + i, json_chunk,
"thicknessFactor") == 0)
4364 out_volume->
thickness_factor = cgltf_json_to_float(tokens + i, json_chunk);
4367 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"thicknessTexture") == 0)
4369 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_volume->
thickness_texture);
4371 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"attenuationColor") == 0)
4373 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_volume->
attenuation_color, 3);
4375 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"attenuationDistance") == 0)
4383 i = cgltf_skip_json(tokens, i + 1);
4395static int cgltf_parse_json_sheen(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_sheen* out_sheen)
4397 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4398 int size = tokens[i].size;
4401 for (
int j = 0; j < size; ++j)
4403 CGLTF_CHECK_KEY(tokens[i]);
4405 if (cgltf_json_strcmp(tokens+i, json_chunk,
"sheenColorFactor") == 0)
4407 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_sheen->
sheen_color_factor, 3);
4409 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"sheenColorTexture") == 0)
4411 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_sheen->
sheen_color_texture);
4413 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"sheenRoughnessFactor") == 0)
4419 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"sheenRoughnessTexture") == 0)
4425 i = cgltf_skip_json(tokens, i+1);
4437static int cgltf_parse_json_emissive_strength(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_emissive_strength* out_emissive_strength)
4439 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4440 int size = tokens[i].size;
4446 for (
int j = 0; j < size; ++j)
4448 CGLTF_CHECK_KEY(tokens[i]);
4450 if (cgltf_json_strcmp(tokens + i, json_chunk,
"emissiveStrength") == 0)
4453 out_emissive_strength->
emissive_strength = cgltf_json_to_float(tokens + i, json_chunk);
4458 i = cgltf_skip_json(tokens, i + 1);
4470static int cgltf_parse_json_iridescence(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_iridescence* out_iridescence)
4472 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4473 int size = tokens[i].size;
4481 for (
int j = 0; j < size; ++j)
4483 CGLTF_CHECK_KEY(tokens[i]);
4485 if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceFactor") == 0)
4491 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceTexture") == 0)
4493 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_iridescence->
iridescence_texture);
4495 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceIor") == 0)
4498 out_iridescence->
iridescence_ior = cgltf_json_to_float(tokens + i, json_chunk);
4501 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceThicknessMinimum") == 0)
4507 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceThicknessMaximum") == 0)
4513 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"iridescenceThicknessTexture") == 0)
4519 i = cgltf_skip_json(tokens, i + 1);
4533 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4534 int size = tokens[i].size;
4541 for (
int j = 0; j < size; ++j)
4543 CGLTF_CHECK_KEY(tokens[i]);
4545 if (cgltf_json_strcmp(tokens + i, json_chunk,
"diffuseTransmissionFactor") == 0)
4551 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"diffuseTransmissionTexture") == 0)
4555 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"diffuseTransmissionColorFactor") == 0)
4559 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"diffuseTransmissionColorTexture") == 0)
4565 i = cgltf_skip_json(tokens, i + 1);
4577static int cgltf_parse_json_subsurface(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_subsurface* out_subsurface)
4579 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4580 int size = tokens[i].size;
4590 for (
int j = 0; j < size; ++j)
4592 CGLTF_CHECK_KEY(tokens[i]);
4594 if (cgltf_json_strcmp(tokens + i, json_chunk,
"subsurfaceMethod") == 0)
4596 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_subsurface->
subsurface_method);
4598 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"subsurfaceWeight") == 0)
4601 out_subsurface->
subsurface_weight = cgltf_json_to_float(tokens + i, json_chunk);
4604 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"subsurfaceRadius") == 0)
4606 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_subsurface->
subsurface_radius, 3);
4608 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"subsurfaceScale") == 0)
4611 out_subsurface->
subsurface_scale = cgltf_json_to_float(tokens + i, json_chunk);
4616 i = cgltf_skip_json(tokens, i + 1);
4628static int cgltf_parse_json_anisotropy(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_anisotropy* out_anisotropy)
4630 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4631 int size = tokens[i].size;
4635 for (
int j = 0; j < size; ++j)
4637 CGLTF_CHECK_KEY(tokens[i]);
4639 if (cgltf_json_strcmp(tokens + i, json_chunk,
"anisotropyStrength") == 0)
4645 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"anisotropyRotation") == 0)
4651 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"anisotropyTexture") == 0)
4653 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_anisotropy->
anisotropy_texture);
4657 i = cgltf_skip_json(tokens, i + 1);
4669static int cgltf_parse_json_dispersion(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_dispersion* out_dispersion)
4671 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4672 int size = tokens[i].size;
4676 for (
int j = 0; j < size; ++j)
4678 CGLTF_CHECK_KEY(tokens[i]);
4680 if (cgltf_json_strcmp(tokens + i, json_chunk,
"dispersion") == 0)
4683 out_dispersion->
dispersion = cgltf_json_to_float(tokens + i, json_chunk);
4688 i = cgltf_skip_json(tokens, i + 1);
4700static int cgltf_parse_json_foundation_materials(jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_foundation_materials* out_materials)
4702 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4707 int size = tokens[i].size;
4710 for (
int j = 0; j < size; ++j)
4712 CGLTF_CHECK_KEY(tokens[i]);
4714 if (cgltf_json_strcmp(tokens + i, json_chunk,
"shaderBlock") == 0)
4718 if (cgltf_json_strcmp(tokens + i, json_chunk,
"principled") == 0)
4722 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"hair") == 0)
4728 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"model") == 0)
4731 if (cgltf_json_strcmp(tokens + i, json_chunk,
"chiang") == 0)
4741 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"betaM") == 0)
4745 out_materials->
hair_beta_m = cgltf_json_to_float(tokens + i, json_chunk);
4748 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"betaN") == 0)
4752 out_materials->
hair_beta_n = cgltf_json_to_float(tokens + i, json_chunk);
4755 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"alpha") == 0)
4759 out_materials->
hair_alpha = cgltf_json_to_float(tokens + i, json_chunk);
4762 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"ior") == 0)
4766 out_materials->
ior = cgltf_json_to_float(tokens + i, json_chunk);
4771 i = cgltf_skip_json(tokens, i + 1);
4783static int cgltf_parse_json_image(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_image* out_image)
4785 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4787 int size = tokens[i].size;
4790 for (
int j = 0; j < size; ++j)
4792 CGLTF_CHECK_KEY(tokens[i]);
4794 if (cgltf_json_strcmp(tokens + i, json_chunk,
"uri") == 0)
4796 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_image->
uri);
4798 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"bufferView") == 0)
4804 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"mimeType") == 0)
4806 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_image->
mime_type);
4808 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
4810 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_image->
name);
4812 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
4814 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_image->
extras);
4816 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
4818 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_image->
extensions_count, &out_image->
extensions);
4822 i = cgltf_skip_json(tokens, i + 1);
4834static int cgltf_parse_json_sampler(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_sampler* out_sampler)
4837 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4842 int size = tokens[i].size;
4845 for (
int j = 0; j < size; ++j)
4847 CGLTF_CHECK_KEY(tokens[i]);
4849 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
4851 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_sampler->
name);
4853 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"magFilter") == 0)
4860 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"minFilter") == 0)
4867 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"wrapS") == 0)
4874 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"wrapT") == 0)
4881 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
4883 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sampler->
extras);
4885 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
4887 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sampler->
extensions_count, &out_sampler->
extensions);
4891 i = cgltf_skip_json(tokens, i + 1);
4903static int cgltf_parse_json_texture(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_texture* out_texture)
4905 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4907 int size = tokens[i].size;
4910 for (
int j = 0; j < size; ++j)
4912 CGLTF_CHECK_KEY(tokens[i]);
4914 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
4916 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_texture->
name);
4918 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"sampler") == 0)
4921 out_texture->
sampler = CGLTF_PTRINDEX(
cgltf_sampler, cgltf_json_to_int(tokens + i, json_chunk));
4924 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"source") == 0)
4927 out_texture->
image = CGLTF_PTRINDEX(
cgltf_image, cgltf_json_to_int(tokens + i, json_chunk));
4930 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
4932 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_texture->
extras);
4934 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
4938 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4941 return CGLTF_ERROR_JSON;
4944 int extensions_size = tokens[i].size;
4951 return CGLTF_ERROR_NOMEM;
4954 for (
int k = 0; k < extensions_size; ++k)
4956 CGLTF_CHECK_KEY(tokens[i]);
4958 if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_texture_basisu") == 0)
4962 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4963 int num_properties = tokens[i].size;
4966 for (
int t = 0; t < num_properties; ++t)
4968 CGLTF_CHECK_KEY(tokens[i]);
4970 if (cgltf_json_strcmp(tokens + i, json_chunk,
"source") == 0)
4978 i = cgltf_skip_json(tokens, i + 1);
4986 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"EXT_texture_webp") == 0)
4990 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
4991 int num_properties = tokens[i].size;
4994 for (
int t = 0; t < num_properties; ++t)
4996 CGLTF_CHECK_KEY(tokens[i]);
4998 if (cgltf_json_strcmp(tokens + i, json_chunk,
"source") == 0)
5006 i = cgltf_skip_json(tokens, i + 1);
5016 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_texture->
extensions[out_texture->
extensions_count++]));
5027 i = cgltf_skip_json(tokens, i + 1);
5039static int cgltf_parse_json_material(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_material* out_material)
5041 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5056 int size = tokens[i].size;
5059 for (
int j = 0; j < size; ++j)
5061 CGLTF_CHECK_KEY(tokens[i]);
5063 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
5065 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_material->
name);
5067 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"pbrMetallicRoughness") == 0)
5070 i = cgltf_parse_json_pbr_metallic_roughness(options, tokens, i + 1, json_chunk, &out_material->
pbr_metallic_roughness);
5072 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"emissiveFactor") == 0)
5074 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_material->
emissive_factor, 3);
5076 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"normalTexture") == 0)
5078 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk,
5081 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"occlusionTexture") == 0)
5083 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk,
5086 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"emissiveTexture") == 0)
5088 i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk,
5091 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"alphaMode") == 0)
5094 if (cgltf_json_strcmp(tokens + i, json_chunk,
"OPAQUE") == 0)
5098 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"MASK") == 0)
5102 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"BLEND") == 0)
5108 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"alphaCutoff") == 0)
5111 out_material->
alpha_cutoff = cgltf_json_to_float(tokens + i, json_chunk);
5114 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"doubleSided") == 0)
5118 cgltf_json_to_bool(tokens + i, json_chunk);
5121 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5123 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_material->
extras);
5125 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5129 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5132 return CGLTF_ERROR_JSON;
5135 int extensions_size = tokens[i].size;
5142 return CGLTF_ERROR_NOMEM;
5145 for (
int k = 0; k < extensions_size; ++k)
5147 CGLTF_CHECK_KEY(tokens[i]);
5149 if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_pbrSpecularGlossiness") == 0)
5152 i = cgltf_parse_json_pbr_specular_glossiness(options, tokens, i + 1, json_chunk, &out_material->
pbr_specular_glossiness);
5154 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_unlit") == 0)
5156 out_material->
unlit = 1;
5157 i = cgltf_skip_json(tokens, i+1);
5159 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_clearcoat") == 0)
5162 i = cgltf_parse_json_clearcoat(options, tokens, i + 1, json_chunk, &out_material->
clearcoat);
5164 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_ior") == 0)
5167 i = cgltf_parse_json_ior(tokens, i + 1, json_chunk, &out_material->
ior);
5169 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_specular") == 0)
5172 i = cgltf_parse_json_specular(options, tokens, i + 1, json_chunk, &out_material->
specular);
5174 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_transmission") == 0)
5177 i = cgltf_parse_json_transmission(options, tokens, i + 1, json_chunk, &out_material->
transmission);
5179 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_volume") == 0)
5182 i = cgltf_parse_json_volume(options, tokens, i + 1, json_chunk, &out_material->
volume);
5184 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_sheen") == 0)
5187 i = cgltf_parse_json_sheen(options, tokens, i + 1, json_chunk, &out_material->
sheen);
5189 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_emissive_strength") == 0)
5192 i = cgltf_parse_json_emissive_strength(tokens, i + 1, json_chunk, &out_material->
emissive_strength);
5194 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_iridescence") == 0)
5197 i = cgltf_parse_json_iridescence(options, tokens, i + 1, json_chunk, &out_material->
iridescence);
5199 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_diffuse_transmission") == 0)
5202 i = cgltf_parse_json_diffuse_transmission(options, tokens, i + 1, json_chunk, &out_material->
diffuse_transmission);
5204 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"EXT_materials_subsurface") == 0)
5207 i = cgltf_parse_json_subsurface(options, tokens, i + 1, json_chunk, &out_material->
subsurface);
5209 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_anisotropy") == 0)
5212 i = cgltf_parse_json_anisotropy(options, tokens, i + 1, json_chunk, &out_material->
anisotropy);
5214 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"KHR_materials_dispersion") == 0)
5217 i = cgltf_parse_json_dispersion(tokens, i + 1, json_chunk, &out_material->
dispersion);
5219 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"EXT_foundation_materials") == 0)
5222 i = cgltf_parse_json_foundation_materials(tokens, i + 1, json_chunk, &out_material->
foundation_materials);
5226 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_material->
extensions[out_material->
extensions_count++]));
5237 i = cgltf_skip_json(tokens, i+1);
5249static int cgltf_parse_json_accessors(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5259 i = cgltf_parse_json_accessor(options, tokens, i, json_chunk, &out_data->
accessors[j]);
5268static int cgltf_parse_json_materials(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5278 i = cgltf_parse_json_material(options, tokens, i, json_chunk, &out_data->
materials[j]);
5287static int cgltf_parse_json_images(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5297 i = cgltf_parse_json_image(options, tokens, i, json_chunk, &out_data->
images[j]);
5306static int cgltf_parse_json_textures(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5316 i = cgltf_parse_json_texture(options, tokens, i, json_chunk, &out_data->
textures[j]);
5325static int cgltf_parse_json_samplers(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5335 i = cgltf_parse_json_sampler(options, tokens, i, json_chunk, &out_data->
samplers[j]);
5347 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5349 int size = tokens[i].size;
5352 for (
int j = 0; j < size; ++j)
5354 CGLTF_CHECK_KEY(tokens[i]);
5356 if (cgltf_json_strcmp(tokens+i, json_chunk,
"buffer") == 0)
5359 out_meshopt_compression->
buffer = CGLTF_PTRINDEX(
cgltf_buffer, cgltf_json_to_int(tokens + i, json_chunk));
5362 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
5365 out_meshopt_compression->
offset = cgltf_json_to_size(tokens+i, json_chunk);
5368 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteLength") == 0)
5371 out_meshopt_compression->
size = cgltf_json_to_size(tokens+i, json_chunk);
5374 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteStride") == 0)
5377 out_meshopt_compression->
stride = cgltf_json_to_size(tokens+i, json_chunk);
5380 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"count") == 0)
5383 out_meshopt_compression->
count = cgltf_json_to_size(tokens+i, json_chunk);
5386 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"mode") == 0)
5389 if (cgltf_json_strcmp(tokens+i, json_chunk,
"ATTRIBUTES") == 0)
5393 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"TRIANGLES") == 0)
5397 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"INDICES") == 0)
5403 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"filter") == 0)
5406 if (cgltf_json_strcmp(tokens+i, json_chunk,
"NONE") == 0)
5410 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"OCTAHEDRAL") == 0)
5414 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"QUATERNION") == 0)
5418 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXPONENTIAL") == 0)
5426 i = cgltf_skip_json(tokens, i+1);
5438static 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)
5440 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5442 int size = tokens[i].size;
5445 for (
int j = 0; j < size; ++j)
5447 CGLTF_CHECK_KEY(tokens[i]);
5449 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
5451 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_buffer_view->
name);
5453 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"buffer") == 0)
5456 out_buffer_view->
buffer = CGLTF_PTRINDEX(
cgltf_buffer, cgltf_json_to_int(tokens + i, json_chunk));
5459 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteOffset") == 0)
5462 out_buffer_view->
offset =
5463 cgltf_json_to_size(tokens+i, json_chunk);
5466 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteLength") == 0)
5469 out_buffer_view->
size =
5470 cgltf_json_to_size(tokens+i, json_chunk);
5473 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteStride") == 0)
5476 out_buffer_view->
stride =
5477 cgltf_json_to_size(tokens+i, json_chunk);
5480 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"target") == 0)
5483 int type = cgltf_json_to_int(tokens+i, json_chunk);
5499 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5501 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_buffer_view->
extras);
5503 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5507 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5510 return CGLTF_ERROR_JSON;
5513 int extensions_size = tokens[i].size;
5519 return CGLTF_ERROR_NOMEM;
5523 for (
int k = 0; k < extensions_size; ++k)
5525 CGLTF_CHECK_KEY(tokens[i]);
5527 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_meshopt_compression") == 0)
5530 i = cgltf_parse_json_meshopt_compression(options, tokens, i + 1, json_chunk, &out_buffer_view->
meshopt_compression);
5534 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_buffer_view->
extensions[out_buffer_view->
extensions_count++]));
5545 i = cgltf_skip_json(tokens, i+1);
5557static int cgltf_parse_json_buffer_views(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5567 i = cgltf_parse_json_buffer_view(options, tokens, i, json_chunk, &out_data->
buffer_views[j]);
5576static int cgltf_parse_json_buffer(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_buffer* out_buffer)
5578 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5580 int size = tokens[i].size;
5583 for (
int j = 0; j < size; ++j)
5585 CGLTF_CHECK_KEY(tokens[i]);
5587 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
5589 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_buffer->
name);
5591 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"byteLength") == 0)
5595 cgltf_json_to_size(tokens+i, json_chunk);
5598 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"uri") == 0)
5600 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_buffer->
uri);
5602 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5604 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_buffer->
extras);
5606 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5608 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_buffer->
extensions_count, &out_buffer->
extensions);
5612 i = cgltf_skip_json(tokens, i+1);
5624static int cgltf_parse_json_buffers(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5634 i = cgltf_parse_json_buffer(options, tokens, i, json_chunk, &out_data->
buffers[j]);
5643static int cgltf_parse_json_skin(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_skin* out_skin)
5645 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5647 int size = tokens[i].size;
5650 for (
int j = 0; j < size; ++j)
5652 CGLTF_CHECK_KEY(tokens[i]);
5654 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
5656 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_skin->
name);
5658 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"joints") == 0)
5660 i = cgltf_parse_json_array(options, tokens, i + 1, json_chunk,
sizeof(
cgltf_node*), (
void**)&out_skin->
joints, &out_skin->
joints_count);
5668 out_skin->
joints[k] = CGLTF_PTRINDEX(
cgltf_node, cgltf_json_to_int(tokens + i, json_chunk));
5672 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"skeleton") == 0)
5675 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
5676 out_skin->
skeleton = CGLTF_PTRINDEX(
cgltf_node, cgltf_json_to_int(tokens + i, json_chunk));
5679 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"inverseBindMatrices") == 0)
5682 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
5686 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5688 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_skin->
extras);
5690 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5692 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_skin->
extensions_count, &out_skin->
extensions);
5696 i = cgltf_skip_json(tokens, i+1);
5708static int cgltf_parse_json_skins(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
5710 i = cgltf_parse_json_array(options, tokens, i, json_chunk,
sizeof(
cgltf_skin), (
void**)&out_data->
skins, &out_data->
skins_count);
5718 i = cgltf_parse_json_skin(options, tokens, i, json_chunk, &out_data->
skins[j]);
5727static 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)
5730 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5733 out_lens->
fstop = 2.8f;
5739 int size = tokens[i].size;
5742 for (
int j = 0; j < size; ++j)
5744 CGLTF_CHECK_KEY(tokens[i]);
5746 if (cgltf_json_strcmp(tokens+i, json_chunk,
"sensorSize") == 0)
5749 out_lens->
sensor_size = cgltf_json_to_float(tokens + i, json_chunk);
5752 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"fStop") == 0)
5755 out_lens->
fstop = cgltf_json_to_float(tokens + i, json_chunk);
5758 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"focusDistance") == 0)
5761 out_lens->
focus_distance = cgltf_json_to_float(tokens + i, json_chunk);
5764 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"apertureBlades") == 0)
5770 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"apertureRotation") == 0)
5776 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"apertureRatio") == 0)
5779 out_lens->
aperture_ratio = cgltf_json_to_float(tokens + i, json_chunk);
5784 i = cgltf_skip_json(tokens, i+1);
5796static int cgltf_parse_json_camera(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_camera* out_camera)
5798 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5800 int size = tokens[i].size;
5803 for (
int j = 0; j < size; ++j)
5805 CGLTF_CHECK_KEY(tokens[i]);
5807 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
5809 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_camera->
name);
5811 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"perspective") == 0)
5815 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5817 int data_size = tokens[i].size;
5822 return CGLTF_ERROR_JSON;
5827 for (
int k = 0; k < data_size; ++k)
5829 CGLTF_CHECK_KEY(tokens[i]);
5831 if (cgltf_json_strcmp(tokens+i, json_chunk,
"aspectRatio") == 0)
5838 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"yfov") == 0)
5844 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"zfar") == 0)
5851 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"znear") == 0)
5857 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5859 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_camera->
data.
perspective.
extras);
5863 i = cgltf_skip_json(tokens, i+1);
5872 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"orthographic") == 0)
5876 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5878 int data_size = tokens[i].size;
5883 return CGLTF_ERROR_JSON;
5888 for (
int k = 0; k < data_size; ++k)
5890 CGLTF_CHECK_KEY(tokens[i]);
5892 if (cgltf_json_strcmp(tokens+i, json_chunk,
"xmag") == 0)
5898 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"ymag") == 0)
5904 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"zfar") == 0)
5910 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"znear") == 0)
5916 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5922 i = cgltf_skip_json(tokens, i+1);
5931 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
5933 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_camera->
extras);
5935 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
5939 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
5942 return CGLTF_ERROR_JSON;
5945 int extensions_size = tokens[i].size;
5947 if (extensions_size > 0)
5952 if (extensions_size > 0 && !out_camera->
extensions)
5954 return CGLTF_ERROR_NOMEM;
5959 for (
int k = 0; k < extensions_size; ++k)
5961 CGLTF_CHECK_KEY(tokens[i]);
5963 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_camera_lens") == 0)
5966 i = cgltf_parse_json_camera_lens(options, tokens, i + 1, json_chunk, &out_camera->
lens);
5970 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_camera->
extensions[out_camera->
extensions_count++]));
5981 i = cgltf_skip_json(tokens, i+1);
5993static int cgltf_parse_json_cameras(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6003 i = cgltf_parse_json_camera(options, tokens, i, json_chunk, &out_data->
cameras[j]);
6012static int cgltf_parse_json_light(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_light* out_light)
6014 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6016 out_light->
color[0] = 1.f;
6017 out_light->
color[1] = 1.f;
6018 out_light->
color[2] = 1.f;
6029 int size = tokens[i].size;
6032 for (
int j = 0; j < size; ++j)
6034 CGLTF_CHECK_KEY(tokens[i]);
6036 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
6038 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_light->
name);
6040 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"color") == 0)
6042 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_light->
color, 3);
6044 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"intensity") == 0)
6047 out_light->
intensity = cgltf_json_to_float(tokens + i, json_chunk);
6050 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"type") == 0)
6053 if (cgltf_json_strcmp(tokens + i, json_chunk,
"directional") == 0)
6057 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"point") == 0)
6061 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"spot") == 0)
6067 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"range") == 0)
6070 out_light->
range = cgltf_json_to_float(tokens + i, json_chunk);
6073 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"spot") == 0)
6077 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6079 int data_size = tokens[i].size;
6082 for (
int k = 0; k < data_size; ++k)
6084 CGLTF_CHECK_KEY(tokens[i]);
6086 if (cgltf_json_strcmp(tokens+i, json_chunk,
"innerConeAngle") == 0)
6092 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"outerConeAngle") == 0)
6100 i = cgltf_skip_json(tokens, i+1);
6109 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
6111 CGLTF_CHECK_TOKTYPE(tokens[i + 1], JSMN_OBJECT);
6112 int extensions_size = tokens[i + 1].size;
6114 for (
int k = 0; k < extensions_size; ++k)
6116 CGLTF_CHECK_KEY(tokens[i]);
6117 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_lights") == 0)
6120 CGLTF_CHECK_TOKTYPE(tokens[i + 1], JSMN_OBJECT);
6121 int ext_size = tokens[i + 1].size;
6123 for (
int m = 0; m < ext_size; ++m)
6125 CGLTF_CHECK_KEY(tokens[i]);
6126 if (cgltf_json_strcmp(tokens+i, json_chunk,
"angularDiameter") == 0)
6132 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"radius") == 0)
6135 out_light->
radius = cgltf_json_to_float(tokens + i, json_chunk);
6138 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"useShadow") == 0)
6141 out_light->
use_shadow = cgltf_json_to_bool(tokens + i, json_chunk);
6146 i = cgltf_skip_json(tokens, i+1);
6148 if (i < 0)
return i;
6153 i = cgltf_skip_json(tokens, i+1);
6155 if (i < 0)
return i;
6158 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6160 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_light->
extras);
6164 i = cgltf_skip_json(tokens, i+1);
6176static int cgltf_parse_json_lights(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6186 i = cgltf_parse_json_light(options, tokens, i, json_chunk, &out_data->
lights[j]);
6195static 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)
6197 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6199 out_light->
color[0] = 1.f;
6200 out_light->
color[1] = 1.f;
6201 out_light->
color[2] = 1.f;
6204 out_light->
size = 1.f;
6207 int size = tokens[i].size;
6210 for (
int j = 0; j < size; ++j)
6212 CGLTF_CHECK_KEY(tokens[i]);
6214 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
6216 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_light->
name);
6218 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"color") == 0)
6220 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_light->
color, 3);
6222 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"intensity") == 0)
6225 out_light->
intensity = cgltf_json_to_float(tokens + i, json_chunk);
6228 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"type") == 0)
6231 if (cgltf_json_strcmp(tokens + i, json_chunk,
"rect") == 0)
6235 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"disk") == 0)
6241 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"size") == 0)
6244 out_light->
size = cgltf_json_to_float(tokens + i, json_chunk);
6247 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"rect") == 0)
6251 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6253 int data_size = tokens[i].size;
6256 for (
int k = 0; k < data_size; ++k)
6258 CGLTF_CHECK_KEY(tokens[i]);
6260 if (cgltf_json_strcmp(tokens + i, json_chunk,
"aspect") == 0)
6263 out_light->
rect_aspect = cgltf_json_to_float(tokens + i, json_chunk);
6268 i = cgltf_skip_json(tokens, i + 1);
6277 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6279 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_light->
extras);
6283 i = cgltf_skip_json(tokens, i + 1);
6295static int cgltf_parse_json_lights_area(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6305 i = cgltf_parse_json_light_area(options, tokens, i, json_chunk, &out_data->
lights_area[j]);
6314static int cgltf_parse_json_curve(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_curve* out_curve)
6316 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6321 int size = tokens[i].size;
6324 for (
int j = 0; j < size; ++j)
6326 CGLTF_CHECK_KEY(tokens[i]);
6328 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
6330 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_curve->
name);
6332 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"basis") == 0)
6335 if (cgltf_json_strcmp(tokens + i, json_chunk,
"linear") == 0)
6339 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"bezier") == 0)
6343 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"bspline") == 0)
6347 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"catmullRom") == 0)
6353 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"renderMode") == 0)
6356 if (cgltf_json_strcmp(tokens + i, json_chunk,
"capsule") == 0)
6362 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"points") == 0)
6365 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6369 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"curveVertexCounts") == 0)
6372 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6376 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"material") == 0)
6379 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6383 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6385 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_curve->
extras);
6389 i = cgltf_skip_json(tokens, i + 1);
6401static int cgltf_parse_json_curves(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6411 i = cgltf_parse_json_curve(options, tokens, i, json_chunk, &out_data->
curves[j]);
6420static int cgltf_parse_json_node(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_node* out_node)
6422 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6425 out_node->
scale[0] = 1.0f;
6426 out_node->
scale[1] = 1.0f;
6427 out_node->
scale[2] = 1.0f;
6428 out_node->
matrix[0] = 1.0f;
6429 out_node->
matrix[5] = 1.0f;
6430 out_node->
matrix[10] = 1.0f;
6431 out_node->
matrix[15] = 1.0f;
6433 int size = tokens[i].size;
6436 for (
int j = 0; j < size; ++j)
6438 CGLTF_CHECK_KEY(tokens[i]);
6440 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
6442 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_node->
name);
6444 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"children") == 0)
6454 out_node->
children[k] = CGLTF_PTRINDEX(
cgltf_node, cgltf_json_to_int(tokens + i, json_chunk));
6458 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"mesh") == 0)
6461 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6462 out_node->
mesh = CGLTF_PTRINDEX(
cgltf_mesh, cgltf_json_to_int(tokens + i, json_chunk));
6465 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"skin") == 0)
6468 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6469 out_node->
skin = CGLTF_PTRINDEX(
cgltf_skin, cgltf_json_to_int(tokens + i, json_chunk));
6472 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"camera") == 0)
6475 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6476 out_node->
camera = CGLTF_PTRINDEX(
cgltf_camera, cgltf_json_to_int(tokens + i, json_chunk));
6479 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"translation") == 0)
6482 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_node->
translation, 3);
6484 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"rotation") == 0)
6487 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_node->
rotation, 4);
6489 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"scale") == 0)
6492 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_node->
scale, 3);
6494 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"matrix") == 0)
6497 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_node->
matrix, 16);
6499 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"weights") == 0)
6507 i = cgltf_parse_json_float_array(tokens, i - 1, json_chunk, out_node->
weights, (
int)out_node->
weights_count);
6509 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6511 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_node->
extras);
6513 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
6517 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6520 return CGLTF_ERROR_JSON;
6523 int extensions_size = tokens[i].size;
6529 return CGLTF_ERROR_NOMEM;
6534 for (
int k = 0; k < extensions_size; ++k)
6536 CGLTF_CHECK_KEY(tokens[i]);
6538 if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_lights_punctual") == 0)
6542 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6544 int data_size = tokens[i].size;
6547 for (
int m = 0; m < data_size; ++m)
6549 CGLTF_CHECK_KEY(tokens[i]);
6551 if (cgltf_json_strcmp(tokens + i, json_chunk,
"light") == 0)
6554 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6555 out_node->
light = CGLTF_PTRINDEX(
cgltf_light, cgltf_json_to_int(tokens + i, json_chunk));
6560 i = cgltf_skip_json(tokens, i + 1);
6569 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_lights_area") == 0)
6573 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6575 int data_size = tokens[i].size;
6578 for (
int m = 0; m < data_size; ++m)
6580 CGLTF_CHECK_KEY(tokens[i]);
6582 if (cgltf_json_strcmp(tokens + i, json_chunk,
"light") == 0)
6585 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6591 i = cgltf_skip_json(tokens, i + 1);
6600 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_curves") == 0)
6603 i = cgltf_skip_json(tokens, i + 1);
6605 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"EXT_mesh_gpu_instancing") == 0)
6608 i = cgltf_parse_json_mesh_gpu_instancing(options, tokens, i + 1, json_chunk, &out_node->
mesh_gpu_instancing);
6612 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_node->
extensions[out_node->
extensions_count++]));
6623 i = cgltf_skip_json(tokens, i+1);
6635static int cgltf_parse_json_nodes(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
6637 i = cgltf_parse_json_array(options, tokens, i, json_chunk,
sizeof(
cgltf_node), (
void**)&out_data->
nodes, &out_data->
nodes_count);
6645 i = cgltf_parse_json_node(options, tokens, i, json_chunk, &out_data->
nodes[j]);
6656 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6658 int size = tokens[i].size;
6661 for (
int j = 0; j < size; ++j)
6663 CGLTF_CHECK_KEY(tokens[i]);
6665 if (cgltf_json_strcmp(tokens + i, json_chunk,
"postExposure") == 0)
6669 out_color_management->
post_exposure = cgltf_json_to_float(tokens + i, json_chunk);
6672 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"sdr") == 0)
6674 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_color_management->
sdr);
6676 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"hdr") == 0)
6678 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_color_management->
hdr);
6682 i = cgltf_skip_json(tokens, i + 1);
6696 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6701 int size = tokens[i].size;
6704 for (
int j = 0; j < size; ++j)
6706 CGLTF_CHECK_KEY(tokens[i]);
6708 if (cgltf_json_strcmp(tokens + i, json_chunk,
"animation") == 0)
6714 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"stripStart") == 0)
6717 out_strip->
strip_start = cgltf_json_to_float(tokens + i, json_chunk);
6720 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"stripEnd") == 0)
6723 out_strip->
strip_end = cgltf_json_to_float(tokens + i, json_chunk);
6726 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"clipStart") == 0)
6729 out_strip->
clip_start = cgltf_json_to_float(tokens + i, json_chunk);
6732 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"clipEnd") == 0)
6735 out_strip->
clip_end = cgltf_json_to_float(tokens + i, json_chunk);
6738 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"timeScale") == 0)
6741 out_strip->
time_scale = cgltf_json_to_float(tokens + i, json_chunk);
6744 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"influence") == 0)
6747 out_strip->
influence = cgltf_json_to_float(tokens + i, json_chunk);
6750 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"cyclic") == 0)
6753 out_strip->
cyclic = cgltf_json_to_bool(tokens + i, json_chunk);
6758 i = cgltf_skip_json(tokens, i + 1);
6772 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6774 int size = tokens[i].size;
6777 for (
int j = 0; j < size; ++j)
6779 CGLTF_CHECK_KEY(tokens[i]);
6781 if (cgltf_json_strcmp(tokens + i, json_chunk,
"name") == 0)
6783 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_track->
name);
6785 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"mute") == 0)
6788 out_track->
mute = cgltf_json_to_bool(tokens + i, json_chunk);
6791 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"strips") == 0)
6800 i = cgltf_parse_json_foundation_nla_strip(options, tokens, i, json_chunk, &out_track->
strips[k]);
6809 i = cgltf_skip_json(tokens, i + 1);
6823 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6825 int size = tokens[i].size;
6828 for (
int j = 0; j < size; ++j)
6830 CGLTF_CHECK_KEY(tokens[i]);
6832 if (cgltf_json_strcmp(tokens + i, json_chunk,
"tracks") == 0)
6841 i = cgltf_parse_json_foundation_nla_track(options, tokens, i, json_chunk, &out_animation->
tracks[k]);
6850 i = cgltf_skip_json(tokens, i + 1);
6864 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6867 out_environment->
color[0] = 0.25f;
6868 out_environment->
color[1] = 0.25f;
6869 out_environment->
color[2] = 0.25f;
6874 int size = tokens[i].size;
6877 for (
int j = 0; j < size; ++j)
6879 CGLTF_CHECK_KEY(tokens[i]);
6881 if (cgltf_json_strcmp(tokens + i, json_chunk,
"type") == 0)
6884 if (cgltf_json_strcmp(tokens + i, json_chunk,
"color") == 0)
6888 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"hdri") == 0 || cgltf_json_strcmp(tokens + i, json_chunk,
"envMap") == 0)
6894 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"color") == 0)
6896 i = cgltf_parse_json_float_array(tokens, i + 1, json_chunk, out_environment->
color, 3);
6898 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"strength") == 0)
6901 out_environment->
strength = cgltf_json_to_float(tokens + i, json_chunk);
6904 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"uri") == 0)
6906 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_environment->
uri);
6908 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"bufferView") == 0)
6911 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_PRIMITIVE);
6915 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"projection") == 0)
6918 if (cgltf_json_strcmp(tokens + i, json_chunk,
"longlat") == 0 || cgltf_json_strcmp(tokens + i, json_chunk,
"equirectangular") == 0)
6928 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"azimuthOffset") == 0)
6931 out_environment->
azimuth_offset = cgltf_json_to_float(tokens + i, json_chunk);
6936 i = cgltf_skip_json(tokens, i + 1);
6948static int cgltf_parse_json_scene(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_scene* out_scene)
6950 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6952 int size = tokens[i].size;
6955 for (
int j = 0; j < size; ++j)
6957 CGLTF_CHECK_KEY(tokens[i]);
6959 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
6961 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_scene->
name);
6963 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"nodes") == 0)
6965 i = cgltf_parse_json_array(options, tokens, i + 1, json_chunk,
sizeof(
cgltf_node*), (
void**)&out_scene->
nodes, &out_scene->
nodes_count);
6973 out_scene->
nodes[k] = CGLTF_PTRINDEX(
cgltf_node, cgltf_json_to_int(tokens + i, json_chunk));
6977 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
6979 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_scene->
extras);
6981 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
6985 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
6988 return CGLTF_ERROR_JSON;
6991 int extensions_size = tokens[i].size;
6997 return CGLTF_ERROR_NOMEM;
7002 for (
int k = 0; k < extensions_size; ++k)
7004 CGLTF_CHECK_KEY(tokens[i]);
7006 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_environment") == 0)
7009 i = cgltf_parse_json_foundation_environment(options, tokens, i + 1, json_chunk, &out_scene->
foundation_environment);
7013 i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_scene->
extensions[out_scene->
extensions_count++]));
7024 i = cgltf_skip_json(tokens, i+1);
7036static int cgltf_parse_json_scenes(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
7046 i = cgltf_parse_json_scene(options, tokens, i, json_chunk, &out_data->
scenes[j]);
7058 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7060 int size = tokens[i].size;
7063 for (
int j = 0; j < size; ++j)
7065 CGLTF_CHECK_KEY(tokens[i]);
7067 if (cgltf_json_strcmp(tokens+i, json_chunk,
"input") == 0)
7070 out_sampler->
input = CGLTF_PTRINDEX(
cgltf_accessor, cgltf_json_to_int(tokens + i, json_chunk));
7073 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"output") == 0)
7076 out_sampler->
output = CGLTF_PTRINDEX(
cgltf_accessor, cgltf_json_to_int(tokens + i, json_chunk));
7079 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"interpolation") == 0)
7082 if (cgltf_json_strcmp(tokens + i, json_chunk,
"LINEAR") == 0)
7086 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"STEP") == 0)
7090 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"CUBICSPLINE") == 0)
7096 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
7098 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sampler->
extras);
7100 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
7102 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sampler->
extensions_count, &out_sampler->
extensions);
7106 i = cgltf_skip_json(tokens, i+1);
7121 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7123 int size = tokens[i].size;
7126 for (
int j = 0; j < size; ++j)
7128 CGLTF_CHECK_KEY(tokens[i]);
7130 if (cgltf_json_strcmp(tokens+i, json_chunk,
"sampler") == 0)
7136 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"target") == 0)
7140 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7142 int target_size = tokens[i].size;
7145 for (
int k = 0; k < target_size; ++k)
7147 CGLTF_CHECK_KEY(tokens[i]);
7149 if (cgltf_json_strcmp(tokens+i, json_chunk,
"node") == 0)
7155 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"path") == 0)
7158 if (cgltf_json_strcmp(tokens+i, json_chunk,
"translation") == 0)
7162 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"rotation") == 0)
7166 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"scale") == 0)
7170 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"weights") == 0)
7176 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
7178 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_channel->
extras);
7180 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
7182 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_channel->
extensions_count, &out_channel->
extensions);
7186 i = cgltf_skip_json(tokens, i+1);
7197 i = cgltf_skip_json(tokens, i+1);
7209static int cgltf_parse_json_animation(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_animation* out_animation)
7211 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7213 int size = tokens[i].size;
7216 for (
int j = 0; j < size; ++j)
7218 CGLTF_CHECK_KEY(tokens[i]);
7220 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
7222 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_animation->
name);
7224 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"samplers") == 0)
7234 i = cgltf_parse_json_animation_sampler(options, tokens, i, json_chunk, &out_animation->
samplers[k]);
7241 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"channels") == 0)
7251 i = cgltf_parse_json_animation_channel(options, tokens, i, json_chunk, &out_animation->
channels[k]);
7258 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
7260 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_animation->
extras);
7262 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
7264 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_animation->
extensions_count, &out_animation->
extensions);
7268 i = cgltf_skip_json(tokens, i+1);
7280static int cgltf_parse_json_animations(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
7290 i = cgltf_parse_json_animation(options, tokens, i, json_chunk, &out_data->
animations[j]);
7301 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7303 int size = tokens[i].size;
7306 for (
int j = 0; j < size; ++j)
7308 CGLTF_CHECK_KEY(tokens[i]);
7310 if (cgltf_json_strcmp(tokens+i, json_chunk,
"name") == 0)
7312 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_variant->
name);
7314 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
7316 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_variant->
extras);
7320 i = cgltf_skip_json(tokens, i+1);
7332static int cgltf_parse_json_variants(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
7342 i = cgltf_parse_json_variant(options, tokens, i, json_chunk, &out_data->
variants[j]);
7351static int cgltf_parse_json_asset(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_asset* out_asset)
7353 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7355 int size = tokens[i].size;
7358 for (
int j = 0; j < size; ++j)
7360 CGLTF_CHECK_KEY(tokens[i]);
7362 if (cgltf_json_strcmp(tokens+i, json_chunk,
"copyright") == 0)
7364 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_asset->
copyright);
7366 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"generator") == 0)
7368 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_asset->
generator);
7370 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"version") == 0)
7372 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_asset->
version);
7374 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"minVersion") == 0)
7376 i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_asset->
min_version);
7378 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extras") == 0)
7380 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_asset->
extras);
7382 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
7384 i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_asset->
extensions_count, &out_asset->
extensions);
7388 i = cgltf_skip_json(tokens, i+1);
7399 return CGLTF_ERROR_LEGACY;
7428 switch (component_type)
7450 return 8 * component_size;
7452 else if (type ==
cgltf_type_mat3 && (component_size == 1 || component_size == 2))
7454 return 12 * component_size;
7459static int cgltf_fixup_pointers(
cgltf_data* out_data);
7461static int cgltf_parse_json_root(
cgltf_options* options, jsmntok_t
const* tokens,
int i,
const uint8_t* json_chunk,
cgltf_data* out_data)
7463 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7465 int size = tokens[i].size;
7468 for (
int j = 0; j < size; ++j)
7470 CGLTF_CHECK_KEY(tokens[i]);
7472 if (cgltf_json_strcmp(tokens + i, json_chunk,
"asset") == 0)
7474 i = cgltf_parse_json_asset(options, tokens, i + 1, json_chunk, &out_data->
asset);
7476 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"meshes") == 0)
7478 i = cgltf_parse_json_meshes(options, tokens, i + 1, json_chunk, out_data);
7480 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"accessors") == 0)
7482 i = cgltf_parse_json_accessors(options, tokens, i + 1, json_chunk, out_data);
7484 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"bufferViews") == 0)
7486 i = cgltf_parse_json_buffer_views(options, tokens, i + 1, json_chunk, out_data);
7488 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"buffers") == 0)
7490 i = cgltf_parse_json_buffers(options, tokens, i + 1, json_chunk, out_data);
7492 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"materials") == 0)
7494 i = cgltf_parse_json_materials(options, tokens, i + 1, json_chunk, out_data);
7496 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"images") == 0)
7498 i = cgltf_parse_json_images(options, tokens, i + 1, json_chunk, out_data);
7500 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"textures") == 0)
7502 i = cgltf_parse_json_textures(options, tokens, i + 1, json_chunk, out_data);
7504 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"samplers") == 0)
7506 i = cgltf_parse_json_samplers(options, tokens, i + 1, json_chunk, out_data);
7508 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"skins") == 0)
7510 i = cgltf_parse_json_skins(options, tokens, i + 1, json_chunk, out_data);
7512 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"cameras") == 0)
7514 i = cgltf_parse_json_cameras(options, tokens, i + 1, json_chunk, out_data);
7516 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"nodes") == 0)
7518 i = cgltf_parse_json_nodes(options, tokens, i + 1, json_chunk, out_data);
7520 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"scenes") == 0)
7522 i = cgltf_parse_json_scenes(options, tokens, i + 1, json_chunk, out_data);
7524 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"scene") == 0)
7527 out_data->
scene = CGLTF_PTRINDEX(
cgltf_scene, cgltf_json_to_int(tokens + i, json_chunk));
7530 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"animations") == 0)
7532 i = cgltf_parse_json_animations(options, tokens, i + 1, json_chunk, out_data);
7534 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"extras") == 0)
7536 i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_data->
extras);
7538 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensions") == 0)
7542 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7545 return CGLTF_ERROR_JSON;
7548 int extensions_size = tokens[i].size;
7554 return CGLTF_ERROR_NOMEM;
7559 for (
int k = 0; k < extensions_size; ++k)
7561 CGLTF_CHECK_KEY(tokens[i]);
7563 if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_colormanagement") == 0)
7568 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_lights_punctual") == 0)
7572 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7574 int data_size = tokens[i].size;
7577 for (
int m = 0; m < data_size; ++m)
7579 CGLTF_CHECK_KEY(tokens[i]);
7581 if (cgltf_json_strcmp(tokens + i, json_chunk,
"lights") == 0)
7583 i = cgltf_parse_json_lights(options, tokens, i + 1, json_chunk, out_data);
7587 i = cgltf_skip_json(tokens, i + 1);
7596 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_lights_area") == 0)
7600 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7602 int data_size = tokens[i].size;
7605 for (
int m = 0; m < data_size; ++m)
7607 CGLTF_CHECK_KEY(tokens[i]);
7609 if (cgltf_json_strcmp(tokens + i, json_chunk,
"lights") == 0)
7611 i = cgltf_parse_json_lights_area(options, tokens, i + 1, json_chunk, out_data);
7615 i = cgltf_skip_json(tokens, i + 1);
7624 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_curves") == 0)
7627 i = cgltf_skip_json(tokens, i + 1);
7629 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"EXT_foundation_animation") == 0)
7632 i = cgltf_parse_json_foundation_animation(options, tokens, i + 1, json_chunk, &out_data->
foundation_animation);
7634 else if (cgltf_json_strcmp(tokens+i, json_chunk,
"KHR_materials_variants") == 0)
7638 CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT);
7640 int data_size = tokens[i].size;
7643 for (
int m = 0; m < data_size; ++m)
7645 CGLTF_CHECK_KEY(tokens[i]);
7647 if (cgltf_json_strcmp(tokens + i, json_chunk,
"variants") == 0)
7649 i = cgltf_parse_json_variants(options, tokens, i + 1, json_chunk, out_data);
7653 i = cgltf_skip_json(tokens, i + 1);
7673 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensionsUsed") == 0)
7677 else if (cgltf_json_strcmp(tokens + i, json_chunk,
"extensionsRequired") == 0)
7683 i = cgltf_skip_json(tokens, i + 1);
7697 jsmn_parser parser = { 0, 0, 0 };
7701 int token_count = jsmn_parse(&parser, (
const char*)json_chunk, size, NULL, 0);
7703 if (token_count <= 0)
7720 int token_count = jsmn_parse(&parser, (
const char*)json_chunk, size, tokens, options->
json_token_count);
7722 if (token_count <= 0)
7730 tokens[token_count].type = JSMN_UNDEFINED;
7744 int i = cgltf_parse_json_root(options, tokens, 0, json_chunk, data);
7760 if (cgltf_fixup_pointers(data) < 0)
7766 data->
json = (
const char*)json_chunk;
7774static int cgltf_fixup_pointers(
cgltf_data* data)
7917 return CGLTF_ERROR_JSON;
7947 return CGLTF_ERROR_JSON;
8014static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
8015 jsmntok_t *tokens,
size_t num_tokens) {
8017 if (parser->toknext >= num_tokens) {
8020 tok = &tokens[parser->toknext++];
8021 tok->start = tok->end = -1;
8023#ifdef JSMN_PARENT_LINKS
8032static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
8033 ptrdiff_t start, ptrdiff_t end) {
8035 token->start = start;
8043static int jsmn_parse_primitive(jsmn_parser *parser,
const char *js,
8044 size_t len, jsmntok_t *tokens,
size_t num_tokens) {
8048 start = parser->pos;
8050 for (; parser->pos < len && js[parser->pos] !=
'\0'; parser->pos++) {
8051 switch (js[parser->pos]) {
8056 case '\t' :
case '\r' :
case '\n' :
case ' ' :
8057 case ',' :
case ']' :
case '}' :
8060 if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
8061 parser->pos = start;
8062 return JSMN_ERROR_INVAL;
8067 parser->pos = start;
8068 return JSMN_ERROR_PART;
8072 if (tokens == NULL) {
8076 token = jsmn_alloc_token(parser, tokens, num_tokens);
8077 if (token == NULL) {
8078 parser->pos = start;
8079 return JSMN_ERROR_NOMEM;
8081 jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
8082#ifdef JSMN_PARENT_LINKS
8083 token->parent = parser->toksuper;
8092static int jsmn_parse_string(jsmn_parser *parser,
const char *js,
8093 size_t len, jsmntok_t *tokens,
size_t num_tokens) {
8096 ptrdiff_t start = parser->pos;
8101 for (; parser->pos < len && js[parser->pos] !=
'\0'; parser->pos++) {
8102 char c = js[parser->pos];
8106 if (tokens == NULL) {
8109 token = jsmn_alloc_token(parser, tokens, num_tokens);
8110 if (token == NULL) {
8111 parser->pos = start;
8112 return JSMN_ERROR_NOMEM;
8114 jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos);
8115#ifdef JSMN_PARENT_LINKS
8116 token->parent = parser->toksuper;
8122 if (c ==
'\\' && parser->pos + 1 < len) {
8125 switch (js[parser->pos]) {
8127 case '\"':
case '/' :
case '\\' :
case 'b' :
8128 case 'f' :
case 'r' :
case 'n' :
case 't' :
8133 for(i = 0; i < 4 && parser->pos < len && js[parser->pos] !=
'\0'; i++) {
8135 if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) ||
8136 (js[parser->pos] >= 65 && js[parser->pos] <= 70) ||
8137 (js[parser->pos] >= 97 && js[parser->pos] <= 102))) {
8138 parser->pos = start;
8139 return JSMN_ERROR_INVAL;
8147 parser->pos = start;
8148 return JSMN_ERROR_INVAL;
8152 parser->pos = start;
8153 return JSMN_ERROR_PART;
8159static int jsmn_parse(jsmn_parser *parser,
const char *js,
size_t len,
8160 jsmntok_t *tokens,
size_t num_tokens) {
8164 int count = parser->toknext;
8166 for (; parser->pos < len && js[parser->pos] !=
'\0'; parser->pos++) {
8170 c = js[parser->pos];
8174 if (tokens == NULL) {
8177 token = jsmn_alloc_token(parser, tokens, num_tokens);
8179 return JSMN_ERROR_NOMEM;
8180 if (parser->toksuper != -1) {
8181 tokens[parser->toksuper].size++;
8182#ifdef JSMN_PARENT_LINKS
8183 token->parent = parser->toksuper;
8186 token->type = (c ==
'{' ? JSMN_OBJECT : JSMN_ARRAY);
8187 token->start = parser->pos;
8188 parser->toksuper = parser->toknext - 1;
8193 type = (c ==
'}' ? JSMN_OBJECT : JSMN_ARRAY);
8194#ifdef JSMN_PARENT_LINKS
8195 if (parser->toknext < 1) {
8196 return JSMN_ERROR_INVAL;
8198 token = &tokens[parser->toknext - 1];
8200 if (token->start != -1 && token->end == -1) {
8201 if (token->type != type) {
8202 return JSMN_ERROR_INVAL;
8204 token->end = parser->pos + 1;
8205 parser->toksuper = token->parent;
8208 if (token->parent == -1) {
8209 if(token->type != type || parser->toksuper == -1) {
8210 return JSMN_ERROR_INVAL;
8214 token = &tokens[token->parent];
8217 for (i = parser->toknext - 1; i >= 0; i--) {
8219 if (token->start != -1 && token->end == -1) {
8220 if (token->type != type) {
8221 return JSMN_ERROR_INVAL;
8223 parser->toksuper = -1;
8224 token->end = parser->pos + 1;
8229 if (i == -1)
return JSMN_ERROR_INVAL;
8230 for (; i >= 0; i--) {
8232 if (token->start != -1 && token->end == -1) {
8233 parser->toksuper = i;
8240 r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
8241 if (r < 0)
return r;
8243 if (parser->toksuper != -1 && tokens != NULL)
8244 tokens[parser->toksuper].size++;
8246 case '\t' :
case '\r' :
case '\n' :
case ' ':
8249 parser->toksuper = parser->toknext - 1;
8252 if (tokens != NULL && parser->toksuper != -1 &&
8253 tokens[parser->toksuper].type != JSMN_ARRAY &&
8254 tokens[parser->toksuper].type != JSMN_OBJECT) {
8255#ifdef JSMN_PARENT_LINKS
8256 parser->toksuper = tokens[parser->toksuper].parent;
8258 for (i = parser->toknext - 1; i >= 0; i--) {
8259 if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
8260 if (tokens[i].start != -1 && tokens[i].end == -1) {
8261 parser->toksuper = i;
8271 case '-':
case '0':
case '1' :
case '2':
case '3' :
case '4':
8272 case '5':
case '6':
case '7' :
case '8':
case '9':
8273 case 't':
case 'f':
case 'n' :
8275 if (tokens != NULL && parser->toksuper != -1) {
8276 jsmntok_t *t = &tokens[parser->toksuper];
8277 if (t->type == JSMN_OBJECT ||
8278 (t->type == JSMN_STRING && t->size != 0)) {
8279 return JSMN_ERROR_INVAL;
8286 r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
8287 if (r < 0)
return r;
8289 if (parser->toksuper != -1 && tokens != NULL)
8290 tokens[parser->toksuper].size++;
8296 return JSMN_ERROR_INVAL;
8301 if (tokens != NULL) {
8302 for (i = parser->toknext - 1; i >= 0; i--) {
8304 if (tokens[i].start != -1 && tokens[i].end == -1) {
8305 return JSMN_ERROR_PART;
8317static void jsmn_init(jsmn_parser *parser) {
8319 parser->toknext = 0;
8320 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:891
cgltf_extras extras
Definition cgltf.h:893
cgltf_animation_path_type target_path
Definition cgltf.h:892
cgltf_animation_sampler * sampler
Definition cgltf.h:890
cgltf_extension * extensions
Definition cgltf.h:895
cgltf_size extensions_count
Definition cgltf.h:894
cgltf_extras extras
Definition cgltf.h:884
cgltf_extension * extensions
Definition cgltf.h:886
cgltf_accessor * input
Definition cgltf.h:881
cgltf_accessor * output
Definition cgltf.h:882
cgltf_interpolation_type interpolation
Definition cgltf.h:883
cgltf_size extensions_count
Definition cgltf.h:885
cgltf_animation_sampler * samplers
Definition cgltf.h:900
cgltf_animation_channel * channels
Definition cgltf.h:902
cgltf_extension * extensions
Definition cgltf.h:906
cgltf_size extensions_count
Definition cgltf.h:905
cgltf_size channels_count
Definition cgltf.h:903
cgltf_size samplers_count
Definition cgltf.h:901
char * name
Definition cgltf.h:899
cgltf_extras extras
Definition cgltf.h:904
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:920
char * version
Definition cgltf.h:918
char * min_version
Definition cgltf.h:919
cgltf_extension * extensions
Definition cgltf.h:922
cgltf_size extensions_count
Definition cgltf.h:921
char * copyright
Definition cgltf.h:916
char * generator
Definition cgltf.h:917
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
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
union cgltf_camera::@2 data
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:794
char * name
Definition cgltf.h:789
cgltf_accessor * points
Definition cgltf.h:792
cgltf_accessor * curve_vertex_counts
Definition cgltf.h:793
cgltf_curve_basis basis
Definition cgltf.h:790
cgltf_curve_render_mode render_mode
Definition cgltf.h:791
cgltf_extras extras
Definition cgltf.h:795
cgltf_file_options file
Definition cgltf.h:1007
cgltf_size bin_size
Definition cgltf.h:1004
cgltf_size variants_count
Definition cgltf.h:983
cgltf_scene * scenes
Definition cgltf.h:974
cgltf_extension * data_extensions
Definition cgltf.h:988
const void * bin
Definition cgltf.h:1003
cgltf_size buffer_views_count
Definition cgltf.h:942
cgltf_asset asset
Definition cgltf.h:930
cgltf_memory_options memory
Definition cgltf.h:1006
cgltf_size extensions_required_count
Definition cgltf.h:998
cgltf_mesh * meshes
Definition cgltf.h:932
cgltf_size lights_area_count
Definition cgltf.h:966
cgltf_light * lights
Definition cgltf.h:962
cgltf_size json_size
Definition cgltf.h:1001
cgltf_foundation_animation foundation_animation
Definition cgltf.h:992
cgltf_size buffers_count
Definition cgltf.h:945
cgltf_buffer_view * buffer_views
Definition cgltf.h:941
cgltf_size cameras_count
Definition cgltf.h:960
cgltf_size extensions_used_count
Definition cgltf.h:995
cgltf_skin * skins
Definition cgltf.h:956
cgltf_bool has_foundation_color_management
Definition cgltf.h:989
cgltf_scene * scene
Definition cgltf.h:977
cgltf_size images_count
Definition cgltf.h:948
cgltf_material * materials
Definition cgltf.h:935
cgltf_sampler * samplers
Definition cgltf.h:953
cgltf_size skins_count
Definition cgltf.h:957
cgltf_size textures_count
Definition cgltf.h:951
cgltf_size curves_count
Definition cgltf.h:969
cgltf_animation * animations
Definition cgltf.h:979
cgltf_file_type file_type
Definition cgltf.h:927
cgltf_curve * curves
Definition cgltf.h:968
cgltf_node * nodes
Definition cgltf.h:971
void * file_data
Definition cgltf.h:928
cgltf_accessor * accessors
Definition cgltf.h:938
char ** extensions_required
Definition cgltf.h:997
cgltf_camera * cameras
Definition cgltf.h:959
cgltf_bool has_foundation_animation
Definition cgltf.h:991
cgltf_size samplers_count
Definition cgltf.h:954
cgltf_size animations_count
Definition cgltf.h:980
cgltf_image * images
Definition cgltf.h:947
cgltf_size nodes_count
Definition cgltf.h:972
cgltf_foundation_color_management foundation_color_management
Definition cgltf.h:990
cgltf_texture * textures
Definition cgltf.h:950
cgltf_size accessors_count
Definition cgltf.h:939
cgltf_size data_extensions_count
Definition cgltf.h:987
const char * json
Definition cgltf.h:1000
cgltf_size scenes_count
Definition cgltf.h:975
char ** extensions_used
Definition cgltf.h:994
cgltf_light_area * lights_area
Definition cgltf.h:965
cgltf_size meshes_count
Definition cgltf.h:933
cgltf_buffer * buffers
Definition cgltf.h:944
cgltf_extras extras
Definition cgltf.h:985
cgltf_size lights_count
Definition cgltf.h:963
cgltf_material_variant * variants
Definition cgltf.h:982
cgltf_size materials_count
Definition cgltf.h:936
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
cgltf_size tracks_count
Definition cgltf.h:838
cgltf_foundation_nla_track * tracks
Definition cgltf.h:837
char * sdr
Definition cgltf.h:811
cgltf_float post_exposure
Definition cgltf.h:810
char * hdr
Definition cgltf.h:812
cgltf_bool has_post_exposure
Definition cgltf.h:809
cgltf_float strength
Definition cgltf.h:801
cgltf_foundation_environment_projection projection
Definition cgltf.h:804
cgltf_foundation_environment_type type
Definition cgltf.h:799
cgltf_float color[3]
Definition cgltf.h:800
cgltf_buffer_view * buffer_view
Definition cgltf.h:803
cgltf_float azimuth_offset
Definition cgltf.h:805
char * uri
Definition cgltf.h:802
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
cgltf_float influence
Definition cgltf.h:825
cgltf_float strip_end
Definition cgltf.h:821
cgltf_float clip_end
Definition cgltf.h:823
cgltf_float clip_start
Definition cgltf.h:822
cgltf_float time_scale
Definition cgltf.h:824
cgltf_bool cyclic
Definition cgltf.h:826
cgltf_animation * animation
Definition cgltf.h:819
cgltf_float strip_start
Definition cgltf.h:820
cgltf_bool mute
Definition cgltf.h:831
cgltf_foundation_nla_strip * strips
Definition cgltf.h:832
char * name
Definition cgltf.h:830
cgltf_size strips_count
Definition cgltf.h:833
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:780
cgltf_float intensity
Definition cgltf.h:781
cgltf_extras extras
Definition cgltf.h:785
cgltf_light_area_type type
Definition cgltf.h:782
cgltf_float rect_aspect
Definition cgltf.h:784
char * name
Definition cgltf.h:779
cgltf_float size
Definition cgltf.h:783
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 use_shadow
Definition cgltf.h:775
cgltf_bool has_foundation_lights
Definition cgltf.h:772
cgltf_light_type type
Definition cgltf.h:767
cgltf_float radius
Definition cgltf.h:774
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:912
char * name
Definition cgltf.h:911
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:864
cgltf_skin * skin
Definition cgltf.h:846
cgltf_extras extras
Definition cgltf.h:862
cgltf_size children_count
Definition cgltf.h:845
char * name
Definition cgltf.h:842
cgltf_size weights_count
Definition cgltf.h:853
cgltf_light * light
Definition cgltf.h:849
cgltf_float rotation[4]
Definition cgltf.h:859
cgltf_bool has_translation
Definition cgltf.h:854
cgltf_node * parent
Definition cgltf.h:843
cgltf_mesh * mesh
Definition cgltf.h:847
cgltf_node ** children
Definition cgltf.h:844
cgltf_curve * curve
Definition cgltf.h:851
cgltf_size extensions_count
Definition cgltf.h:865
cgltf_bool has_rotation
Definition cgltf.h:855
cgltf_light_area * light_area
Definition cgltf.h:850
cgltf_float matrix[16]
Definition cgltf.h:861
cgltf_bool has_matrix
Definition cgltf.h:857
cgltf_bool has_scale
Definition cgltf.h:856
cgltf_float scale[3]
Definition cgltf.h:860
cgltf_extension * extensions
Definition cgltf.h:866
cgltf_float * weights
Definition cgltf.h:852
cgltf_bool has_mesh_gpu_instancing
Definition cgltf.h:863
cgltf_camera * camera
Definition cgltf.h:848
cgltf_float translation[3]
Definition cgltf.h:858
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:873
cgltf_size extensions_count
Definition cgltf.h:876
char * name
Definition cgltf.h:870
cgltf_node ** nodes
Definition cgltf.h:871
cgltf_foundation_environment foundation_environment
Definition cgltf.h:874
cgltf_extension * extensions
Definition cgltf.h:877
cgltf_extras extras
Definition cgltf.h:875
cgltf_size nodes_count
Definition cgltf.h:872
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