From 52d9a62410840bc2b6534c4076466deb6334dd30 Mon Sep 17 00:00:00 2001 From: PikminGuts92 Date: Sat, 8 Feb 2025 02:06:17 -0500 Subject: [PATCH] Compress vector3 positions in anims --- core/grim/src/model/import.rs | 4 ++-- core/grim/src/scene/char_bones_samples/io.rs | 10 ++++++++-- core/grim/src/scene/io.rs | 10 ++++++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/core/grim/src/model/import.rs b/core/grim/src/model/import.rs index b2959d8..fcf0437 100644 --- a/core/grim/src/model/import.rs +++ b/core/grim/src/model/import.rs @@ -274,12 +274,12 @@ impl GltfImporter2 { let mut clip = CharClipSamples { name: anim_name, one: CharBonesSamples { - compression: 1, + compression: 2, samples: EncodedSamples::Uncompressed(one_samples), ..Default::default() }, full: CharBonesSamples { - compression: 1, + compression: 2, 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 7a7cd37..015a29e 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_vector = if char_bones_samples.compression < 2 { + save_vector3 + } else { + save_vector3_packed + }; + let write_quat = if char_bones_samples.compression == 0 { save_quat } else { @@ -240,9 +246,9 @@ pub(crate) fn save_char_bones_samples_data(char_bones_samples: &CharBonesSamples .or_else(|| pos.last()); if let Some(sample) = sample { - save_vector3(sample, writer)?; + write_vector(sample, writer)?; } else { - save_vector3(&empty_vector3, writer)?; + write_vector(&empty_vector3, writer)?; } } diff --git a/core/grim/src/scene/io.rs b/core/grim/src/scene/io.rs index 74f5d59..d0f05d3 100644 --- a/core/grim/src/scene/io.rs +++ b/core/grim/src/scene/io.rs @@ -259,6 +259,16 @@ pub (crate) fn save_vector3(vector: &Vector3, writer: &mut Box) -> Ok(()) } +pub (crate) fn save_vector3_packed(vector: &Vector3, writer: &mut Box) -> Result<(), Box> { + for v in [vector.x, vector.y, vector.z] { + // Convert to signed short and write + let s = ((v / 1345.) * 32767.0).round() as i16; + writer.write_int16(s)?; + } + + Ok(()) +} + pub (crate) fn load_quat(quat: &mut Quat, reader: &mut Box) -> Result<(), Box> { quat.x = reader.read_float32()?; quat.y = reader.read_float32()?;