diff options
Diffstat (limited to 'AnimationInterpolate.c')
| -rw-r--r-- | AnimationInterpolate.c | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/AnimationInterpolate.c b/AnimationInterpolate.c index f24c678..37a0990 100644 --- a/AnimationInterpolate.c +++ b/AnimationInterpolate.c @@ -1,5 +1,7 @@ #include "AnimationInterpolate.h" #include "AnimationObject.h" +#include "AnimationMove.h" +#include <string.h> #define NUM_INTERPOLATE(a, b, perc) (a * (1.0 - (perc)) + b * (perc)) @@ -18,25 +20,59 @@ colorInterpolate(color ina, color inb, double percentage) { } ARGB -A_Interpolate(const Animation* anim, u32 frameIndex, ARGB pixel, i32 r, i32 c, void* priv) { - struct A_Interpolate in = *(struct A_Interpolate*)priv; +A_Interpolate(const Animation* anim, u32 frameIndex, ARGB pixel, i32 r, i32 c, void* value) { + struct A_Interpolate in = *(struct A_Interpolate*)value; + + if (in.interpolate == NULL) { + fprintf(stderr, "Interpolation function cannot be NULL!\n"); + ARGB_set(&pixel, 0xFFFF00FF); + return pixel; + } + + if (frameIndex == in.startFrame) { + memcpy(in.initialValueTemp, in.value, in.initialValueTempSize); + } double perc = (double)(frameIndex - in.startFrame) / (in.endFrame - in.startFrame); if (perc < 0.0) perc = 0.0; if (perc > 1.0) perc = 1.0; - in.interpolate(in.value, in.initialState, in.finalState, perc); + in.interpolate(in.value, in.initialValueTemp, in.goalValue, perc); - return in.callback(anim, frameIndex, pixel, r, c, in.priv); + return pixel; } void AO_LineInterpolate(void* valueLine, const void* initialLine, const void* finalLine, double percentage) { struct AO_Line* value = valueLine; const struct AO_Line* initial = initialLine, *final = finalLine; + value->a = NUM_INTERPOLATE(initial->a, final->a, percentage); value->b = NUM_INTERPOLATE(initial->b, final->b, percentage); value->c = NUM_INTERPOLATE(initial->c, final->c, percentage); value->width = NUM_INTERPOLATE(initial->width, final->width, percentage); value->color = colorInterpolate(initial->color, final->color, percentage); } + +void +AM_LinearInterpolate(void* valueIn, const void* initialIn, const void* finalIn, double percentage) { + struct AM_Linear* value = valueIn; + const struct AM_Linear* initial = initialIn, *final = finalIn; + + value->startRow = NUM_INTERPOLATE(initial->startRow, final->startRow, percentage); + value->startCol = NUM_INTERPOLATE(initial->startCol, final->startCol, percentage); + value->dRow = NUM_INTERPOLATE(initial->dRow, final->dRow, percentage); + value->dCol = NUM_INTERPOLATE(initial->dCol, final->dCol, percentage); + value->wrapCoordinates = NUM_INTERPOLATE(initial->wrapCoordinates, final->wrapCoordinates, percentage); +} + +void +AM_SpinInterpolate(void* valueIn, const void* initialIn, const void* finalIn, double percentage) { + struct AM_Spin* value = valueIn; + const struct AM_Spin* initial = initialIn, *final = finalIn; + + value->theta = NUM_INTERPOLATE(initial->theta, final->theta, percentage); + value->dTheta = NUM_INTERPOLATE(initial->dTheta, final->dTheta, percentage); + value->centerRow = NUM_INTERPOLATE(initial->centerRow, final->centerRow, percentage); + value->centerCol = NUM_INTERPOLATE(initial->centerCol, final->centerCol, percentage); +} |
