From be22ec62f2f692b5dc4ca0b334d905164fb45ff2 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 25 Feb 2025 20:21:40 +0100 Subject: fix vrm first person bone --- world/src/animation.rs | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'world/src/animation.rs') 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, joint_index_to_arm_index: &BTreeMap, node_to_meshes: &BTreeMap>, 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 = reader.read_inputs().unwrap().collect::>(); - let outputs: Vec = 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 = 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) -- cgit v1.2.3-70-g09d2