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