Implement step-wise animation locked to time series

This commit is contained in:
Camden Dixie O'Brien committed 2025-10-02 15:49:42 +01:00
1 parent 4c94812b48
commit 381890892b
3 files changed
+39 -11

No files matched your search

+31 -7
View File
@@ -44,19 +44,43 @@ void animation_cleanup(animation_state_t *state)
void animation_start(animation_state_t *state, const model_t *model)
{
state->current_keyframe = model->animation.keyframe_count - 1;
state->next_keyframe = 0;
state->current = model->bones;
state->next = model->animation.keyframes;
state->duration_us = model->animation.times_us[0];
state->elapsed_us = 0;
}
void animation_update(animation_state_t *state, const model_t *model)
void animation_update(
animation_state_t *state, const model_t *model, uint32_t dt_us)
{
const size_t offset = state->keyframe * model->bone_count;
state->current = model->animation.keyframes + offset;
state->elapsed_us += dt_us;
if (state->elapsed_us >= state->duration_us) { // Move to next keyframe
state->elapsed_us -= state->duration_us;
state->current_keyframe = state->next_keyframe;
const uint32_t keyframe_count = model->animation.keyframe_count;
if (state->current_keyframe + 1 < keyframe_count) {
state->next_keyframe = state->current_keyframe + 1;
state->duration_us
= model->animation.times_us[state->next_keyframe]
- model->animation.times_us[state->current_keyframe];
} else {
// Handle loop-around
state->next_keyframe = 0;
state->duration_us
= model->animation.times_us[state->next_keyframe];
}
state->current = state->next;
const uint32_t offset = state->next_keyframe * model->bone_count;
state->next = model->animation.keyframes + offset;
}
compute_bone_matrices(
state->current, model->bone_count, model->bone_parents,
model->inverse_bind_matrices, state->bone_matrices);
++state->keyframe;
if (state->keyframe >= model->animation.keyframe_count)
state->keyframe = 0;
}