summaryrefslogtreecommitdiff
path: root/world/src/animation.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-02-25 20:21:40 +0100
committermetamuffin <metamuffin@disroot.org>2025-02-25 20:21:45 +0100
commitbe22ec62f2f692b5dc4ca0b334d905164fb45ff2 (patch)
treecd80efeea07a504eaa729d552211bd34b06da679 /world/src/animation.rs
parentae98273c288b0ba357b5d97231136d75273edd4e (diff)
downloadweareserver-be22ec62f2f692b5dc4ca0b334d905164fb45ff2.tar
weareserver-be22ec62f2f692b5dc4ca0b334d905164fb45ff2.tar.bz2
weareserver-be22ec62f2f692b5dc4ca0b334d905164fb45ff2.tar.zst
fix vrm first person bone
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)