Skip to content

Commit

Permalink
Add end beat and other flags to anim
Browse files Browse the repository at this point in the history
  • Loading branch information
PikminGuts92 committed Feb 8, 2025
1 parent 0863c43 commit 3c964c9
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 14 deletions.
9 changes: 9 additions & 0 deletions core/grim/src/model/import.rs
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,11 @@ impl GltfImporter2 {

let mut clip = CharClipSamples {
name: anim_name,
start_beat: 0.0,
end_beat: 0.0,
beats_per_sec: 2.5, // Match UI anims
play_flags: 512, // kPlayRealTime
blend_width: 1.0, // Match UI anims
one: CharBonesSamples {
compression: 2,
samples: EncodedSamples::Uncompressed(one_samples),
Expand All @@ -344,6 +349,10 @@ impl GltfImporter2 {
..Default::default()
};

// Update end time
let sample_count = clip.full.get_sample_count().max(1); // Assume at least one sample because of one anims
clip.end_beat = (sample_count as f32 / 30.0) * clip.beats_per_sec;

// Re-compute char bones from sample names
for sam in [&mut clip.one, &mut clip.full] {
sam.generate_bones_from_samples();
Expand Down
15 changes: 1 addition & 14 deletions core/grim/src/scene/char_bones_samples/io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,20 +179,7 @@ pub(crate) fn save_char_bones_samples_header(char_bones_samples: &CharBonesSampl
}

writer.write_uint32(char_bones_samples.compression)?;

let sample_count = match &char_bones_samples.samples {
EncodedSamples::Compressed(_, raw_samples) => raw_samples.len(),
EncodedSamples::Uncompressed(samples) => samples
.iter()
.fold(0, |acc, s| {
acc
.max(s.pos.as_ref().map(|(_, p)| p.len()).unwrap_or_default())
.max(s.quat.as_ref().map(|(_, q)| q.len()).unwrap_or_default())
.max(s.rotz.as_ref().map(|(_, r)| r.len()).unwrap_or_default())
}),
};

writer.write_uint32(sample_count as u32)?;
writer.write_uint32(char_bones_samples.get_sample_count() as u32)?;

// No frames for v11

Expand Down
14 changes: 14 additions & 0 deletions core/grim/src/scene/char_bones_samples/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,20 @@ impl CharBonesSamples {

bone_samples
}

pub(crate) fn get_sample_count(&self) -> usize {
match &self.samples {
EncodedSamples::Compressed(_, raw_samples) => raw_samples.len(),
EncodedSamples::Uncompressed(samples) => samples
.iter()
.fold(0, |acc, s| {
acc
.max(s.pos.as_ref().map(|(_, p)| p.len()).unwrap_or_default())
.max(s.quat.as_ref().map(|(_, q)| q.len()).unwrap_or_default())
.max(s.rotz.as_ref().map(|(_, r)| r.len()).unwrap_or_default())
}),
}
}
}

#[cfg(test)]
Expand Down

0 comments on commit 3c964c9

Please sign in to comment.