Implement step-wise animation locked to time series
This commit is contained in:
1 parent
4c94812b48
commit
381890892b
3 files changed
+39
-11
No files matched your search
+31
-7
@@ -44,19 +44,43 @@ void animation_cleanup(animation_state_t *state)
|
|||||||
|
|
||||||
void animation_start(animation_state_t *state, const model_t *model)
|
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->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->elapsed_us += dt_us;
|
||||||
state->current = model->animation.keyframes + offset;
|
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(
|
compute_bone_matrices(
|
||||||
state->current, model->bone_count, model->bone_parents,
|
state->current, model->bone_count, model->bone_parents,
|
||||||
model->inverse_bind_matrices, state->bone_matrices);
|
model->inverse_bind_matrices, state->bone_matrices);
|
||||||
|
|
||||||
++state->keyframe;
|
|
||||||
if (state->keyframe >= model->animation.keyframe_count)
|
|
||||||
state->keyframe = 0;
|
|
||||||
}
|
}
|
||||||
+5
-3
@@ -5,14 +5,16 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
mat4_t *bone_matrices;
|
mat4_t *bone_matrices;
|
||||||
bone_t *current;
|
const bone_t *current, *next;
|
||||||
unsigned keyframe;
|
uint32_t current_keyframe, next_keyframe;
|
||||||
|
uint32_t duration_us, elapsed_us;
|
||||||
} animation_state_t;
|
} animation_state_t;
|
||||||
|
|
||||||
animation_state_t animation_init(const model_t *model);
|
animation_state_t animation_init(const model_t *model);
|
||||||
void animation_cleanup(animation_state_t *state);
|
void animation_cleanup(animation_state_t *state);
|
||||||
|
|
||||||
void animation_start(animation_state_t *state, const model_t *model);
|
void animation_start(animation_state_t *state, const model_t *model);
|
||||||
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);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -10,6 +10,8 @@
|
|||||||
#define W 800
|
#define W 800
|
||||||
#define H 600
|
#define H 600
|
||||||
|
|
||||||
|
#define DT (1'000'000 / 60) // Assume 60 Hz for now
|
||||||
|
|
||||||
static void
|
static void
|
||||||
key_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
|
key_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
|
||||||
{
|
{
|
||||||
@@ -79,7 +81,7 @@ int main(int argc, char *argv[])
|
|||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
|
||||||
mvp.model = mat4_mul(rot, mvp.model);
|
mvp.model = mat4_mul(rot, mvp.model);
|
||||||
animation_update(&anim, &model);
|
animation_update(&anim, &model, DT);
|
||||||
gpu_render(&gpu, &mvp, anim.bone_matrices);
|
gpu_render(&gpu, &mvp, anim.bone_matrices);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user