void json_set_value(const jsonvalue& json, vector<mat4f>& value) { value.resize(json.array_size()/16); json_set_values(json, &value[0].x.x, value.size()*16); }
void json_set_value(const jsonvalue& json, vector<int>& value) { value.resize(json.array_size()); json_set_values(json, &value[0], value.size()); }
void json_set_value(const jsonvalue& json, vector<vec4i>& value) { value.resize(json.array_size()/4); json_set_values(json, &value[0].x, value.size()*4); }
void json_set_value(const jsonvalue& json, float& value) { value = json.as_double(); }
void json_set_value(const jsonvalue& json, vector<bool>& value) { value.resize(json.array_size()); for(auto i : range(value.size())) value[i] = json.array_element(i).as_bool(); }
void json_set_value(const jsonvalue& json, bool& value) { value = json.as_bool(); }
void json_set_value(const jsonvalue& json, int& value) { value = json.as_int(); }
vector<Light*> json_parse_lights(const jsonvalue& json) { auto lights = vector<Light*>(); for(auto& value : json.as_array_ref()) lights.push_back( json_parse_light(value) ); return lights; }
void json_set_values(const jsonvalue& json, int* value, int n) { error_if_not(n == json.array_size(), "incorrect array size"); for(auto i : range(n)) value[i] = json.array_element(i).as_int(); }
vector<Surface*> json_parse_surfaces(const jsonvalue& json) { auto surfaces = vector<Surface*>(); for(auto value : json.as_array_ref()) surfaces.push_back( json_parse_surface(value) ); return surfaces; }
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]); }
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); } }
vector<Mesh*> json_parse_meshes(const jsonvalue& json) { auto meshes = vector<Mesh*>(); for(auto& value : json.as_array_ref()) meshes.push_back( json_parse_mesh(value) ); return meshes; }
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); }