Skip to content

Commit

Permalink
Compress vector3 positions in anims
Browse files Browse the repository at this point in the history
  • Loading branch information
PikminGuts92 committed Feb 8, 2025
1 parent 1abd68c commit 52d9a62
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 4 deletions.
4 changes: 2 additions & 2 deletions core/grim/src/model/import.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()),
Expand Down
10 changes: 8 additions & 2 deletions core/grim/src/scene/char_bones_samples/io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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)?;
}
}

Expand Down
10 changes: 10 additions & 0 deletions core/grim/src/scene/io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,16 @@ pub (crate) fn save_vector3(vector: &Vector3, writer: &mut Box<BinaryStream>) ->
Ok(())
}

pub (crate) fn save_vector3_packed(vector: &Vector3, writer: &mut Box<BinaryStream>) -> Result<(), Box<dyn Error>> {
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<BinaryStream>) -> Result<(), Box<dyn Error>> {
quat.x = reader.read_float32()?;
quat.y = reader.read_float32()?;
Expand Down

0 comments on commit 52d9a62

Please sign in to comment.