# HG changeset patch # User John Tsiombikas # Date 1365827252 -10800 # Node ID fb9659ca5cf247446475c8dd7ded5fb73cc8058b # Parent 9915b036863d8ef7257c8c3f090529a4a4158406 added ping-pong extrapolator diff -r 9915b036863d -r fb9659ca5cf2 src/track.c --- a/src/track.c Sun Mar 10 18:52:57 2013 +0200 +++ b/src/track.c Sat Apr 13 07:27:32 2013 +0300 @@ -14,6 +14,7 @@ static anm_time_t remap_extend(anm_time_t tm, anm_time_t start, anm_time_t end); static anm_time_t remap_clamp(anm_time_t tm, anm_time_t start, anm_time_t end); static anm_time_t remap_repeat(anm_time_t tm, anm_time_t start, anm_time_t end); +static anm_time_t remap_pingpong(anm_time_t tm, anm_time_t start, anm_time_t end); /* XXX keep this in sync with enum anm_interpolator at track.h */ static float (*interp[])(float, float, float, float, float) = { @@ -28,6 +29,7 @@ remap_extend, remap_clamp, remap_repeat, + remap_pingpong, 0 }; @@ -304,3 +306,11 @@ } return (tm - start) % interv + start;*/ } + +static anm_time_t remap_pingpong(anm_time_t tm, anm_time_t start, anm_time_t end) +{ + anm_time_t interv = end - start; + anm_time_t x = remap_repeat(tm, start, end + interv); + + return x > end ? end + interv - x : x; +} diff -r 9915b036863d -r fb9659ca5cf2 src/track.h --- a/src/track.h Sun Mar 10 18:52:57 2013 +0200 +++ b/src/track.h Sat Apr 13 07:27:32 2013 +0300 @@ -16,7 +16,8 @@ enum anm_extrapolator { ANM_EXTRAP_EXTEND, /* extend to infinity */ ANM_EXTRAP_CLAMP, /* clamp to last value */ - ANM_EXTRAP_REPEAT /* repeat motion */ + ANM_EXTRAP_REPEAT, /* repeat motion */ + ANM_EXTRAP_PINGPONG /* repeat with mirroring */ }; typedef long anm_time_t;