physis/havok/
skeleton.rs

1// SPDX-FileCopyrightText: 2020 Inseok Lee
2// SPDX-License-Identifier: MIT
3
4use 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}