summaryrefslogtreecommitdiff
path: root/AnimationInterpolate.c
diff options
context:
space:
mode:
Diffstat (limited to 'AnimationInterpolate.c')
-rw-r--r--AnimationInterpolate.c74
1 files changed, 47 insertions, 27 deletions
diff --git a/AnimationInterpolate.c b/AnimationInterpolate.c
index a84b5a2..d949cc5 100644
--- a/AnimationInterpolate.c
+++ b/AnimationInterpolate.c
@@ -21,58 +21,78 @@ colorInterpolate(color ina, color inb, double percentage) {
ARGB
A_Interpolate(const Animation* anim, PixelRendererParams a) {
- struct A_Interpolate in = *(struct A_Interpolate*)a.priv;
+ struct A_Interpolate* in = a.priv;
- if (in.interpolate == NULL) {
+ if (in->interpolate == NULL) {
fprintf(stderr, "Interpolation function cannot be NULL!\n");
ARGB_set(&a.pixel, 0xFFFF00FF);
return a.pixel;
}
- if (a.frame.current == a.frame.start) {
- memcpy(in.initialValueTemp, in.value, in.initialValueTempSize);
- }
-
double perc = (double)(a.frame.current - a.frame.start) / (a.frame.end - a.frame.start);
if (perc < 0.0) perc = 0.0;
if (perc > 1.0) perc = 1.0;
- in.interpolate(in.value, in.initialValueTemp, in.goalValue, perc);
+ /*
+ ? ?
+ a*(1-p) + b*p = x
+ ?
+ a*(1-p1) + b*p1 = c ==> a = (c - b*p1) / (1 - p1)
+ ? ?
+ c*(1-p2) + b*p2 = x
+
+ ? ?
+ a*(1-p) + b*p = c*(1-p2) + b*p2
+ ?
+ (c - b*p1) / (1 - p1) * (1-p) + b*p = c*(1-p2) + b*p2
+ (c - b*p1) / (1 - p1) * (1-p) + b*p = c - c*p2 + b*p2
+ (c - b*p1) / (1 - p1) * (1-p) + b*p = c + (b - c) * p2
+ ((c - b*p1) / (1 - p1) * (1-p) + b*p - c) / (b - c) = p2
+ simplified:
+ (p - p1) / (1 - p1) = p2
+ */
+
+ in->interpolate(in->value, in->goalValue, (perc - in->prevPercentage) / (1.0 - in->prevPercentage));
+ if (a.row == 0 && a.col == 0) {
+ fprintf(stderr, "@ %f : %f -> %f ==> %d \n", perc, perc - in->prevPercentage, (perc - in->prevPercentage) / (1.0 - in->prevPercentage), ((struct AM_Linear*)in->value)->startCol);
+ }
+
+ in->prevPercentage = perc;
return a.pixel;
}
void
-AO_LineInterpolate(void* valueLine, const void* initialLine, const void* finalLine, double percentage) {
+AO_LineInterpolate(void* valueLine, const void* finalLine, double percentage) {
struct AO_Line* value = valueLine;
- const struct AO_Line* initial = initialLine, *final = finalLine;
+ const struct AO_Line* 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);
+ value->a = NUM_INTERPOLATE(value->a, final->a, percentage);
+ value->b = NUM_INTERPOLATE(value->b, final->b, percentage);
+ value->c = NUM_INTERPOLATE(value->c, final->c, percentage);
+ value->width = NUM_INTERPOLATE(value->width, final->width, percentage);
+ value->color = colorInterpolate(value->color, final->color, percentage);
}
void
-AM_LinearInterpolate(void* valueIn, const void* initialIn, const void* finalIn, double percentage) {
+AM_LinearInterpolate(void* valueIn, const void* finalIn, double percentage) {
struct AM_Linear* value = valueIn;
- const struct AM_Linear* initial = initialIn, *final = finalIn;
+ const struct AM_Linear* 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);
+ value->startRow = NUM_INTERPOLATE(value->startRow, final->startRow, percentage);
+ value->startCol = NUM_INTERPOLATE(value->startCol, final->startCol, percentage);
+ value->dRow = NUM_INTERPOLATE(value->dRow, final->dRow, percentage);
+ value->dCol = NUM_INTERPOLATE(value->dCol, final->dCol, percentage);
+ value->wrapCoordinates = NUM_INTERPOLATE(value->wrapCoordinates, final->wrapCoordinates, percentage);
}
void
-AM_SpinInterpolate(void* valueIn, const void* initialIn, const void* finalIn, double percentage) {
+AM_SpinInterpolate(void* valueIn, const void* finalIn, double percentage) {
struct AM_Spin* value = valueIn;
- const struct AM_Spin* initial = initialIn, *final = finalIn;
+ const struct AM_Spin* 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);
+ value->theta = NUM_INTERPOLATE(value->theta, final->theta, percentage);
+ value->dTheta = NUM_INTERPOLATE(value->dTheta, final->dTheta, percentage);
+ value->centerRow = NUM_INTERPOLATE(value->centerRow, final->centerRow, percentage);
+ value->centerCol = NUM_INTERPOLATE(value->centerCol, final->centerCol, percentage);
}