mirror of
https://github.com/redstrate/Physis.git
synced 2025-05-04 01:37:46 +00:00
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.
42 lines
1.3 KiB
Rust
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,
|
|
}
|
|
}
|
|
}
|