nuclear@27: /* An animation track defines the values of a single scalar over time nuclear@27: * and supports various interpolation and extrapolation modes. nuclear@27: */ nuclear@27: #ifndef LIBANIM_TRACK_H_ nuclear@27: #define LIBANIM_TRACK_H_ nuclear@27: nuclear@27: #include nuclear@27: #include "config.h" nuclear@27: nuclear@27: enum anm_interpolator { nuclear@27: ANM_INTERP_STEP, nuclear@27: ANM_INTERP_LINEAR, nuclear@27: ANM_INTERP_CUBIC nuclear@27: }; nuclear@27: nuclear@27: enum anm_extrapolator { nuclear@27: ANM_EXTRAP_EXTEND, /* extend to infinity */ nuclear@27: ANM_EXTRAP_CLAMP, /* clamp to last value */ nuclear@27: ANM_EXTRAP_REPEAT, /* repeat motion */ nuclear@27: ANM_EXTRAP_PINGPONG /* repeat with mirroring */ nuclear@27: }; nuclear@27: nuclear@27: typedef long anm_time_t; nuclear@27: #define ANM_TIME_INVAL LONG_MIN nuclear@27: nuclear@27: #define ANM_SEC2TM(x) ((anm_time_t)((x) * 1000)) nuclear@27: #define ANM_MSEC2TM(x) ((anm_time_t)(x)) nuclear@27: #define ANM_TM2SEC(x) ((x) / 1000.0) nuclear@27: #define ANM_TM2MSEC(x) (x) nuclear@27: nuclear@27: struct anm_keyframe { nuclear@27: anm_time_t time; nuclear@27: float val; nuclear@27: }; nuclear@27: nuclear@27: struct anm_track { nuclear@27: char *name; nuclear@27: int count; nuclear@27: struct anm_keyframe *keys; nuclear@27: nuclear@27: float def_val; nuclear@27: nuclear@27: enum anm_interpolator interp; nuclear@27: enum anm_extrapolator extrap; nuclear@27: }; nuclear@27: nuclear@27: #ifdef __cplusplus nuclear@27: extern "C" { nuclear@27: #endif nuclear@27: nuclear@27: /* track constructor and destructor */ nuclear@27: int anm_init_track(struct anm_track *track); nuclear@27: void anm_destroy_track(struct anm_track *track); nuclear@27: nuclear@27: /* helper functions that use anm_init_track and anm_destroy_track internally */ nuclear@27: struct anm_track *anm_create_track(void); nuclear@27: void anm_free_track(struct anm_track *track); nuclear@27: nuclear@27: /* copies track src to dest nuclear@27: * XXX: dest must have been initialized first nuclear@27: */ nuclear@27: void anm_copy_track(struct anm_track *dest, struct anm_track *src); nuclear@27: nuclear@27: int anm_set_track_name(struct anm_track *track, const char *name); nuclear@27: const char *anm_get_track_name(struct anm_track *track); nuclear@27: nuclear@27: void anm_set_track_interpolator(struct anm_track *track, enum anm_interpolator in); nuclear@27: void anm_set_track_extrapolator(struct anm_track *track, enum anm_extrapolator ex); nuclear@27: nuclear@27: anm_time_t anm_remap_time(struct anm_track *track, anm_time_t tm, anm_time_t start, anm_time_t end); nuclear@27: nuclear@27: void anm_set_track_default(struct anm_track *track, float def); nuclear@27: nuclear@27: /* set or update a keyframe */ nuclear@27: int anm_set_keyframe(struct anm_track *track, struct anm_keyframe *key); nuclear@27: nuclear@27: /* get the idx-th keyframe, returns null if it doesn't exist */ nuclear@27: struct anm_keyframe *anm_get_keyframe(struct anm_track *track, int idx); nuclear@27: nuclear@27: /* Finds the 0-based index of the intra-keyframe interval which corresponds nuclear@27: * to the specified time. If the time falls exactly onto the N-th keyframe nuclear@27: * the function returns N. nuclear@27: * nuclear@27: * Special cases: nuclear@27: * - if the time is before the first keyframe -1 is returned. nuclear@27: * - if the time is after the last keyframe, the index of the last keyframe nuclear@27: * is returned. nuclear@27: */ nuclear@27: int anm_get_key_interval(struct anm_track *track, anm_time_t tm); nuclear@27: nuclear@27: int anm_set_value(struct anm_track *track, anm_time_t tm, float val); nuclear@27: nuclear@27: /* evaluates and returns the value of the track for a particular time */ nuclear@27: float anm_get_value(struct anm_track *track, anm_time_t tm); nuclear@27: nuclear@27: #ifdef __cplusplus nuclear@27: } nuclear@27: #endif nuclear@27: nuclear@27: nuclear@27: #endif /* LIBANIM_TRACK_H_ */