diff options
Diffstat (limited to 'world/src/animation.rs')
-rw-r--r-- | world/src/animation.rs | 31 |
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) |