#include "F_Interpolate.h" #include #include #include void Interpolate_callback(Interpolate* self, struct FrameContext* fc) { if (self->interpolate == NULL) { fprintf(stderr, "Interpolation function cannot be NULL!\n"); return; } double p = (double)(fc->frame - fc->startFrame) / (fc->endFrame - fc->startFrame); if (0.0 <= p && p <= 1.0) self->interpolate(self->value, self->startValue, self->endValue, p); } FrameCallback* Interpolate_setup(Interpolate obj) { FrameCallback* fca = malloc(sizeof(struct FrameCallback)); fca->callback = (FrameCallback_callback)Interpolate_callback; fca->callback_self = malloc(sizeof(obj)); memcpy(fca->callback_self, &obj, sizeof(obj)); return fca; } #define NUM_INTERPOLATE(a, b, perc) ((a) * (1.0 - (perc)) + (b) * (perc)) void Interpolate_TransformCenter(TransformCenter* value, const TransformCenter* start, const TransformCenter* end, double progress) { value->centerX = NUM_INTERPOLATE(start->centerX, end->centerX, progress); value->centerY = NUM_INTERPOLATE(start->centerY, end->centerY, progress); } void Interpolate_TransformRotate(TransformRotate* value, const TransformRotate* start, const TransformRotate* end, double progress) { value->angle = NUM_INTERPOLATE(start->angle, end->angle, progress); }