| 313 | } |
| 314 | |
| 315 | s32 parse_geometries(Mesh &m, const char *sjson, CompileOptions &opts) |
| 316 | { |
| 317 | TempAllocator4096 ta; |
| 318 | JsonObject geometries(ta); |
| 319 | RETURN_IF_ERROR(sjson::parse(geometries, sjson)); |
| 320 | |
| 321 | auto cur = json_object::begin(geometries); |
| 322 | auto end = json_object::end(geometries); |
| 323 | for (; cur != end; ++cur) { |
| 324 | JSON_OBJECT_SKIP_HOLE(geometries, cur); |
| 325 | |
| 326 | Geometry geo(default_allocator()); |
| 327 | s32 err = mesh::parse_geometry(geo, cur->second, opts); |
| 328 | ENSURE_OR_RETURN(MESH_RESOURCE, err == 0, opts); |
| 329 | |
| 330 | DynamicString geometry_name(ta); |
| 331 | geometry_name = cur->first; |
| 332 | RETURN_IF_FALSE(MESH_RESOURCE, !hash_map::has(m._geometries, geometry_name) |
| 333 | , opts |
| 334 | , "Geometry redefined: '%s'" |
| 335 | , geometry_name.c_str() |
| 336 | ); |
| 337 | hash_map::set(m._geometries, geometry_name, geo); |
| 338 | } |
| 339 | |
| 340 | return 0; |
| 341 | } |
| 342 | |
| 343 | s32 parse_nodes(Mesh &m, const char *sjson, CompileOptions &opts) |
| 344 | { |