void json_set_value(const jsonvalue& json, frame3f& value) { value = identity_frame3f; if(json.object_contains("from") or json.object_contains("to") or json.object_contains("up")) { auto from = z3f, to = zero3f, up = y3f; if(json.object_contains("from")) json_set_value(json.object_element("from"), from); if(json.object_contains("to")) json_set_value(json.object_element("to"), to); if(json.object_contains("up")) json_set_value(json.object_element("up"), up); value = lookat_frame(from, to, up); } else { if(json.object_contains("o")) json_set_value(json.object_element("o"), value.o); if(json.object_contains("x")) json_set_value(json.object_element("x"), value.x); if(json.object_contains("y")) json_set_value(json.object_element("y"), value.y); if(json.object_contains("z")) json_set_value(json.object_element("z"), value.z); value = orthonormalize_zyx(value); } }
void json_set_optvalue(const jsonvalue& json, T& value, const string& name) { if(not json.object_contains(name)) return; json_set_value(json.object_element(name), value); }
void json_set_value(const jsonvalue& json, vector<vector<mat4f>>& value) { value.resize(json.array_size()); for(auto i : range(value.size())) json_set_value(json.array_element(i), value[i]); }
static int json_parse_object (const char **s, size_t *n, const char *objname, size_t objsize, void *obj, const json_t *table, size_t table_items) { ssr_t value; int rc; const json_t *element; uint64_t int_value; element = NULL; if (**s != '{') { WARN("Expected '{' at start of object parsing\n" "Current position: %.*s\n", (int)*n, *s); return (-1); } element = NULL; value.size = 0; value.data = NULL; (*s)++; (*n)--; while (*n) { if (**s == '"') { rc = json_parse_string(s, n, &value); if (rc == -1) { WARN("Value name for object %s failed at: %.*s\n", objname, (int)*n, *s); } if (element) { rc = json_set_value(obj, element, &value); if (rc == -1) {return (-1);} element = NULL; } else { element = json_find_element(&value, table, table_items); if (!element) { WARN("Could not find element '%.*s' in object '%s'\n", (int)value.size, value.data, objname); return (-1); } } } else if (**s == '{') { if (element && element->type == JSON_ELEMENT_STRUCT_POINTER) { rc = json_parse_object(s, n, element->name, element->size, *(void**)ELEMENTAT(obj, element->offset), element->json, element->json_size); if (rc == -1) { return (-1); } } else if (element && element->type == JSON_ELEMENT_STRUCT_EMBEDDED) { rc = json_parse_object(s, n, element->name, element->size, (void*)ELEMENTAT(obj, element->offset), element->json, element->json_size); if (rc == -1) { return (-1); } } else { WARN("Unexpected '{' at %.*s\n", (int)*n, *s); return (-1); } } else if (**s == '}') { return (0); } else if (**s >= '0' && **s <= '9') { if (!element) { WARN("Unexpected digit at %.*s", (int)*n, *s); return (-1); } json_parse_uint64(s, n, &int_value); rc = json_set_int_value(obj, element, int_value); if (rc == -1) {return (-1);} element = NULL; } (*s)++; (*n)--; } return (0); }