summaryrefslogtreecommitdiff
path: root/world/src/animation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'world/src/animation.rs')
-rw-r--r--world/src/animation.rs31
1 files changed, 26 insertions, 5 deletions
diff --git a/world/src/animation.rs b/world/src/animation.rs
index 00c716f..cb10123 100644
--- a/world/src/animation.rs
+++ b/world/src/animation.rs
@@ -23,6 +23,7 @@ use gltf::{
use log::{debug, info};
use std::collections::BTreeMap;
use weareshared::{
+ Affine3A,
packets::Resource,
resources::{AnimationChannel, AnimationPart},
store::ResourceStore,
@@ -31,6 +32,7 @@ use weareshared::{
pub fn import_animation<'a>(
a: Animation<'a>,
store: &ResourceStore,
+ joint_index_to_ibm: &BTreeMap<usize, Affine3A>,
joint_index_to_arm_index: &BTreeMap<usize, usize>,
node_to_meshes: &BTreeMap<usize, Vec<usize>>,
buffers: &[Data],
@@ -41,11 +43,30 @@ pub fn import_animation<'a>(
let node = c.target().node().index();
let reader = c.reader(|i| Some(&buffers[i.index()].0));
let inputs: Vec<f32> = reader.read_inputs().unwrap().collect::<Vec<f32>>();
- let outputs: Vec<f32> = match reader.read_outputs().unwrap() {
- ReadOutputs::Translations(iter) => iter.flatten().collect(),
- ReadOutputs::Rotations(iter) => iter.into_f32().flatten().collect(),
- ReadOutputs::Scales(iter) => iter.flatten().collect(),
- ReadOutputs::MorphTargetWeights(iter) => iter.into_f32().collect(),
+ let outputs: Vec<f32> = if let Some(_ibm) = joint_index_to_ibm.get(&node) {
+ debug!("pre-applying inverse bind matricies");
+ // let ibm =
+ // match reader.read_outputs().unwrap() {
+ // // ReadOutputs::Translations(iter) => iter
+ // // .flat_map(|[x, y, z]| (ibm.matrix3 * vec3a(x, y, z)).to_array())
+ // // .collect(),
+ // ReadOutputs::Rotations(iter) => iter.into_f32().map(|[a,b,c,d]| {
+
+ // }).flatten().collect(),
+ // // ReadOutputs::Scales(iter) => iter
+ // // .flat_map(|[x, y, z]| (ibm.matrix3 * vec3a(x, y, z)).to_array())
+ // // .collect(),
+ // ReadOutputs::MorphTargetWeights(iter) => iter.into_f32().collect(),
+ // _ => continue,
+ // }
+ todo!()
+ } else {
+ match reader.read_outputs().unwrap() {
+ ReadOutputs::Translations(iter) => iter.flatten().collect(),
+ ReadOutputs::Rotations(iter) => iter.into_f32().flatten().collect(),
+ ReadOutputs::Scales(iter) => iter.flatten().collect(),
+ ReadOutputs::MorphTargetWeights(iter) => iter.into_f32().collect(),
+ }
};
for x in &inputs {
max_time = max_time.max(*x)