1
Fork 0
mirror of https://github.com/redstrate/Physis.git synced 2025-05-04 01:37:46 +00:00
physis/src/havok/skeleton.rs
Joshua Goins 07582775cd Add support for reading binary SKLB and PBD
This removes the dependency of the Havok SDK or getting the decompiled
skeleton files from TexTools or some other place. Code courtesy of
FFXIVTools. The other two ways of reading skeletons (SKEL and Packfile)
are removed which gets rid of two dependencies.
2023-10-13 14:55:27 -04:00

42 lines
1.3 KiB
Rust

// SPDX-FileCopyrightText: 2020 Inseok Lee
// SPDX-License-Identifier: MIT
use core::cell::RefCell;
use std::sync::Arc;
use crate::havok::object::HavokObject;
use crate::havok::transform::HavokTransform;
#[derive(Debug)]
pub struct HavokSkeleton {
pub bone_names: Vec<String>,
pub parent_indices: Vec<usize>,
pub reference_pose: Vec<HavokTransform>,
}
impl HavokSkeleton {
pub fn new(object: Arc<RefCell<HavokObject>>) -> Self {
let root = object.borrow();
let bones = root.get("bones").as_array();
let bone_names = bones
.iter()
.map(|x| {
let bone = x.as_object();
let bone_obj = bone.borrow();
bone_obj.get("name").as_string().to_owned()
})
.collect::<Vec<_>>();
let raw_parent_indices = root.get("parentIndices").as_array();
let parent_indices = raw_parent_indices.iter().map(|x| x.as_int() as usize).collect::<Vec<_>>();
let raw_reference_pose = root.get("referencePose").as_array();
let reference_pose = raw_reference_pose.iter().map(|x| HavokTransform::new(x.as_vec())).collect::<Vec<_>>();
Self {
bone_names,
parent_indices,
reference_pose,
}
}
}