#include "../sk_memory.h"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning( disable : 26451 )
#else
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunknown-pragmas"
#endif
#define CGLTF_IMPLEMENTATION
#define CGLTF_MALLOC sk::sk_malloc
#define CGLTF_FREE sk::_sk_free
#include "../libraries/cgltf.h"
#ifdef _MSC_VER
#pragma warning(pop)
#else
#pragma clang diagnostic pop
#endif
#include "stref.h"
#include "../stereokit.h"
namespace sk {
void gltf_parse_extras(model_t model, model_node_id node, const char *extras_json, size_t extras_size) {
jsmn_parser parser;
jsmn_init(&parser);
int32_t token_ct = jsmn_parse(&parser, extras_json, extras_size, nullptr, 0);
if (token_ct <= 0) return;
jsmntok_t* tokens = sk_malloc_t(jsmntok_t, token_ct);
jsmn_init(&parser);
token_ct = jsmn_parse(&parser, extras_json, extras_size, tokens, token_ct);
if (token_ct < 1 || tokens[0].type != JSMN_OBJECT) {
return;
}
for (int32_t i = 1; i < token_ct; i+=1) {
if (tokens[i].type == JSMN_STRING) {
if (tokens[i].size == 1) {
stref_t key = { extras_json + tokens[i ].start, (uint32_t)(tokens[i ].end-tokens[i ].start) };
stref_t val = { extras_json + tokens[i+1].start, (uint32_t)(tokens[i+1].end-tokens[i+1].start) };
char* key_str = stref_copy(key);
char* val_str = stref_copy(val);
model_node_info_set(model, node, key_str, val_str);
sk_free(key_str);
sk_free(val_str);
} else {
stref_t key = { extras_json + tokens[i].start, (uint32_t)(tokens[i].end - tokens[i].start) };
char* key_str = stref_copy(key);
model_node_info_set(model, node, key_str, "true");
sk_free(key_str);
}
} else if (tokens[i].type == JSMN_OBJECT) {
log_warn("SK node extras does not support object types");
} else if (tokens[i].type == JSMN_ARRAY) {
log_warn("SK node extras does not support array types");
}
i += tokens[i].size;
}
sk_free(tokens);
}
}