Skip to content

Commit

Permalink
Write compressed quats
Browse files Browse the repository at this point in the history
  • Loading branch information
PikminGuts92 committed Feb 8, 2025
1 parent ced0814 commit f4248b6
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 2 deletions.
2 changes: 2 additions & 0 deletions core/grim/src/model/import.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()),
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_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| {
Expand Down Expand Up @@ -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)?;
}
}

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 @@ -274,5 +274,15 @@ pub (crate) fn save_quat(quat: &Quat, writer: &mut Box<BinaryStream>) -> Result<
writer.write_float32(quat.z)?;
writer.write_float32(quat.w)?;

Ok(())
}

pub (crate) fn save_quat_packed(quat: &Quat, writer: &mut Box<BinaryStream>) -> Result<(), Box<dyn Error>> {
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(())
}

0 comments on commit f4248b6

Please sign in to comment.