1use crate::havok::object::HavokObject;
5use crate::havok::transform::HavokTransform;
6use core::cell::RefCell;
7use std::sync::Arc;
8
9#[derive(Debug)]
10pub struct HavokSkeleton {
11 pub bone_names: Vec<String>,
12 pub parent_indices: Vec<usize>,
13 pub reference_pose: Vec<HavokTransform>,
14}
15
16impl HavokSkeleton {
17 pub fn new(object: Arc<RefCell<HavokObject>>) -> Self {
18 let root = object.borrow();
19 let bones = root.get("bones").as_array();
20 let bone_names = bones
21 .iter()
22 .map(|x| {
23 let bone = x.as_object();
24 let bone_obj = bone.borrow();
25
26 bone_obj.get("name").as_string().to_owned()
27 })
28 .collect::<Vec<_>>();
29
30 let raw_parent_indices = root.get("parentIndices").as_array();
31 let parent_indices = raw_parent_indices
32 .iter()
33 .map(|x| x.as_int() as usize)
34 .collect::<Vec<_>>();
35
36 let raw_reference_pose = root.get("referencePose").as_array();
37 let reference_pose = raw_reference_pose
38 .iter()
39 .map(|x| HavokTransform::new(x.as_vec()))
40 .collect::<Vec<_>>();
41
42 Self {
43 bone_names,
44 parent_indices,
45 reference_pose,
46 }
47 }
48}