| 342 | } |
| 343 | |
| 344 | s32 parse(Buffer &buf) |
| 345 | { |
| 346 | TempAllocator4096 ta; |
| 347 | JsonObject obj(ta); |
| 348 | JsonArray states(ta); |
| 349 | JsonArray variables(ta); |
| 350 | |
| 351 | RETURN_IF_ERROR(sjson::parse(obj, buf)); |
| 352 | RETURN_IF_ERROR(sjson::parse_array(states, obj["states"])); |
| 353 | RETURN_IF_ERROR(sjson::parse_array(variables, obj["variables"])); |
| 354 | |
| 355 | // Parse animation type. |
| 356 | if (json_object::has(obj, "animation_type")) { |
| 357 | RETURN_IF_ERROR(sjson::parse_string(_animation_type, obj["animation_type"])); |
| 358 | } else { |
| 359 | _animation_type = "sprite_animation"; // For backwards compatibility. |
| 360 | } |
| 361 | RETURN_IF_FALSE(STATE_MACHINE_RESOURCE, StringId64(_animation_type.c_str()) == RESOURCE_TYPE_SPRITE_ANIMATION |
| 362 | || StringId64(_animation_type.c_str()) == RESOURCE_TYPE_MESH_ANIMATION |
| 363 | , _opts |
| 364 | , "Unknown animation type '%s'" |
| 365 | , _animation_type.c_str() |
| 366 | ); |
| 367 | |
| 368 | s32 err = 0; |
| 369 | err = parse_states(states); |
| 370 | ENSURE_OR_RETURN(STATE_MACHINE_RESOURCE, err == 0, _opts); |
| 371 | RETURN_IF_FALSE(STATE_MACHINE_RESOURCE, hash_map::size(_states) > 0 |
| 372 | , _opts |
| 373 | , "States cannot be empty" |
| 374 | ); |
| 375 | |
| 376 | _initial_state = RETURN_IF_ERROR(sjson::parse_guid(obj["initial_state"])); |
| 377 | RETURN_IF_FALSE(STATE_MACHINE_RESOURCE, hash_map::has(_states, _initial_state) |
| 378 | , _opts |
| 379 | , "Initial state references non-existing state" |
| 380 | ); |
| 381 | |
| 382 | // Parse skeleton, if any. |
| 383 | if (json_object::has(obj, "skeleton_name") |
| 384 | && sjson::type(obj["skeleton_name"]) == JsonValueType::STRING) { |
| 385 | DynamicString skeleton_name(ta); |
| 386 | RETURN_IF_ERROR(sjson::parse_string(skeleton_name, obj["skeleton_name"])); |
| 387 | WARN_IF_MISSING(STATE_MACHINE_RESOURCE, "mesh_skeleton", skeleton_name.c_str(), _opts); |
| 388 | _opts.add_requirement("mesh_skeleton", skeleton_name.c_str()); |
| 389 | _skeleton_name = StringId64(skeleton_name.c_str()); |
| 390 | } |
| 391 | |
| 392 | err = parse_variables(variables); |
| 393 | ENSURE_OR_RETURN(STATE_MACHINE_RESOURCE, err == 0, _opts); |
| 394 | |
| 395 | err = compute_state_offsets(); |
| 396 | ENSURE_OR_RETURN(STATE_MACHINE_RESOURCE, err == 0, _opts); |
| 397 | |
| 398 | return 0; |
| 399 | } |
| 400 | |
| 401 | s32 write() |
no test coverage detected