diff --git a/include/hexagram/anim.h b/include/hexagram/anim.h index b97dd66..ca2a6ba 100644 --- a/include/hexagram/anim.h +++ b/include/hexagram/anim.h @@ -43,9 +43,11 @@ typedef struct _hexagram_anim { struct timeval start, now; } hexagram_anim; +typedef double (hexagram_anim_progress_fn)(hexagram_anim_stop *, double); + void hexagram_anim_init(hexagram_anim *anim); -int hexagram_anim_step(hexagram_anim *anim); +int hexagram_anim_step(hexagram_anim *anim, hexagram_anim_progress_fn *fn); double hexagram_anim_duration(hexagram_anim *anim); diff --git a/src/anim.c b/src/anim.c index 9f402d4..6184bcf 100644 --- a/src/anim.c +++ b/src/anim.c @@ -22,7 +22,7 @@ static inline double stop_offset(hexagram_anim *anim, size_t index) { return offset; } -int hexagram_anim_step(hexagram_anim *anim) { +int hexagram_anim_step(hexagram_anim *anim, hexagram_anim_progress_fn *fn) { struct timeval tv; double offset = 0.0, interval, progress; size_t i, a; @@ -55,7 +55,12 @@ int hexagram_anim_step(hexagram_anim *anim) { } /* Determine current progress through current stop */ - progress = (interval - offset) / anim->stops[i].duration; + if (fn) { + progress = fn(&anim->stops[i], + (interval - offset) / anim->stops[i].duration); + } else { + progress = (interval - offset) / anim->stops[i].duration; + } for (a=0; astops[i].actionc; a++) { hexagram_anim_action *action = &anim->stops[i].actions[a];