From f4248b63ed41c61c624fbb1f3eeb1d4e2e456f9e Mon Sep 17 00:00:00 2001 From: PikminGuts92 Date: Sat, 8 Feb 2025 00:17:33 -0500 Subject: [PATCH] Write compressed quats --- core/grim/src/model/import.rs | 2 ++ core/grim/src/scene/char_bones_samples/io.rs | 10 ++++++++-- core/grim/src/scene/io.rs | 10 ++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/core/grim/src/model/import.rs b/core/grim/src/model/import.rs index bba80a8..10243cb 100644 --- a/core/grim/src/model/import.rs +++ b/core/grim/src/model/import.rs @@ -230,10 +230,12 @@ impl GltfImporter2 { let mut clip = CharClipSamples { name: anim_name, one: CharBonesSamples { + compression: 1, samples: EncodedSamples::Uncompressed(one_samples), ..Default::default() }, full: CharBonesSamples { + compression: 1, samples: EncodedSamples::Uncompressed(full_samples .into_values() .collect()), diff --git a/core/grim/src/scene/char_bones_samples/io.rs b/core/grim/src/scene/char_bones_samples/io.rs index 3e9dea9..7a7cd37 100644 --- a/core/grim/src/scene/char_bones_samples/io.rs +++ b/core/grim/src/scene/char_bones_samples/io.rs @@ -207,6 +207,12 @@ pub(crate) fn save_char_bones_samples_data(char_bones_samples: &CharBonesSamples let empty_vector3 = Vector3::default(); let empty_quat = Quat::default(); + let write_quat = if char_bones_samples.compression == 0 { + save_quat + } else { + save_quat_packed + }; + let (sample_count, pos_samples, quat_samples, rotz_samples) = samples .iter() .fold((0, Vec::new(), Vec::new(), Vec::new()), |(mut sample_count, mut pos_samples, mut quat_samples, mut rotz_samples), s| { @@ -247,9 +253,9 @@ pub(crate) fn save_char_bones_samples_data(char_bones_samples: &CharBonesSamples .or_else(|| quat.last()); if let Some(sample) = sample { - save_quat(sample, writer)?; + write_quat(sample, writer)?; } else { - save_quat(&empty_quat, writer)?; + write_quat(&empty_quat, writer)?; } } diff --git a/core/grim/src/scene/io.rs b/core/grim/src/scene/io.rs index 373a073..74f5d59 100644 --- a/core/grim/src/scene/io.rs +++ b/core/grim/src/scene/io.rs @@ -274,5 +274,15 @@ pub (crate) fn save_quat(quat: &Quat, writer: &mut Box) -> Result< writer.write_float32(quat.z)?; writer.write_float32(quat.w)?; + Ok(()) +} + +pub (crate) fn save_quat_packed(quat: &Quat, writer: &mut Box) -> Result<(), Box> { + for v in [quat.x, quat.y, quat.z, quat.w] { + // Convert to signed short and write + let s = (v * 32767.0).round() as i16; + writer.write_int16(s)?; + } + Ok(()) } \ No newline at end of file