goat3d
diff libs/anim/track.h @ 27:4deb0b12fe14
wtf... corrupted heap?
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 29 Sep 2013 08:20:19 +0300 |
parents | |
children | 0ecb788a87f7 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libs/anim/track.h Sun Sep 29 08:20:19 2013 +0300 1.3 @@ -0,0 +1,101 @@ 1.4 +/* An animation track defines the values of a single scalar over time 1.5 + * and supports various interpolation and extrapolation modes. 1.6 + */ 1.7 +#ifndef LIBANIM_TRACK_H_ 1.8 +#define LIBANIM_TRACK_H_ 1.9 + 1.10 +#include <limits.h> 1.11 +#include "config.h" 1.12 + 1.13 +enum anm_interpolator { 1.14 + ANM_INTERP_STEP, 1.15 + ANM_INTERP_LINEAR, 1.16 + ANM_INTERP_CUBIC 1.17 +}; 1.18 + 1.19 +enum anm_extrapolator { 1.20 + ANM_EXTRAP_EXTEND, /* extend to infinity */ 1.21 + ANM_EXTRAP_CLAMP, /* clamp to last value */ 1.22 + ANM_EXTRAP_REPEAT, /* repeat motion */ 1.23 + ANM_EXTRAP_PINGPONG /* repeat with mirroring */ 1.24 +}; 1.25 + 1.26 +typedef long anm_time_t; 1.27 +#define ANM_TIME_INVAL LONG_MIN 1.28 + 1.29 +#define ANM_SEC2TM(x) ((anm_time_t)((x) * 1000)) 1.30 +#define ANM_MSEC2TM(x) ((anm_time_t)(x)) 1.31 +#define ANM_TM2SEC(x) ((x) / 1000.0) 1.32 +#define ANM_TM2MSEC(x) (x) 1.33 + 1.34 +struct anm_keyframe { 1.35 + anm_time_t time; 1.36 + float val; 1.37 +}; 1.38 + 1.39 +struct anm_track { 1.40 + char *name; 1.41 + int count; 1.42 + struct anm_keyframe *keys; 1.43 + 1.44 + float def_val; 1.45 + 1.46 + enum anm_interpolator interp; 1.47 + enum anm_extrapolator extrap; 1.48 +}; 1.49 + 1.50 +#ifdef __cplusplus 1.51 +extern "C" { 1.52 +#endif 1.53 + 1.54 +/* track constructor and destructor */ 1.55 +int anm_init_track(struct anm_track *track); 1.56 +void anm_destroy_track(struct anm_track *track); 1.57 + 1.58 +/* helper functions that use anm_init_track and anm_destroy_track internally */ 1.59 +struct anm_track *anm_create_track(void); 1.60 +void anm_free_track(struct anm_track *track); 1.61 + 1.62 +/* copies track src to dest 1.63 + * XXX: dest must have been initialized first 1.64 + */ 1.65 +void anm_copy_track(struct anm_track *dest, struct anm_track *src); 1.66 + 1.67 +int anm_set_track_name(struct anm_track *track, const char *name); 1.68 +const char *anm_get_track_name(struct anm_track *track); 1.69 + 1.70 +void anm_set_track_interpolator(struct anm_track *track, enum anm_interpolator in); 1.71 +void anm_set_track_extrapolator(struct anm_track *track, enum anm_extrapolator ex); 1.72 + 1.73 +anm_time_t anm_remap_time(struct anm_track *track, anm_time_t tm, anm_time_t start, anm_time_t end); 1.74 + 1.75 +void anm_set_track_default(struct anm_track *track, float def); 1.76 + 1.77 +/* set or update a keyframe */ 1.78 +int anm_set_keyframe(struct anm_track *track, struct anm_keyframe *key); 1.79 + 1.80 +/* get the idx-th keyframe, returns null if it doesn't exist */ 1.81 +struct anm_keyframe *anm_get_keyframe(struct anm_track *track, int idx); 1.82 + 1.83 +/* Finds the 0-based index of the intra-keyframe interval which corresponds 1.84 + * to the specified time. If the time falls exactly onto the N-th keyframe 1.85 + * the function returns N. 1.86 + * 1.87 + * Special cases: 1.88 + * - if the time is before the first keyframe -1 is returned. 1.89 + * - if the time is after the last keyframe, the index of the last keyframe 1.90 + * is returned. 1.91 + */ 1.92 +int anm_get_key_interval(struct anm_track *track, anm_time_t tm); 1.93 + 1.94 +int anm_set_value(struct anm_track *track, anm_time_t tm, float val); 1.95 + 1.96 +/* evaluates and returns the value of the track for a particular time */ 1.97 +float anm_get_value(struct anm_track *track, anm_time_t tm); 1.98 + 1.99 +#ifdef __cplusplus 1.100 +} 1.101 +#endif 1.102 + 1.103 + 1.104 +#endif /* LIBANIM_TRACK_H_ */