summaryrefslogtreecommitdiff
path: root/AnimationInterpolate.c
blob: 44bdafca1b99b9f084deeed112d35b660dc39a9a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "AnimationInterpolate.h"
#include "AnimationObject.h"
#include "AnimationMove.h"
#include <string.h>

#define NUM_INTERPOLATE(a, b, perc) (a * (1.0 - (perc)) + b * (perc))

color
colorInterpolate(color ina, color inb, double percentage) {
	ARGB a, b;
	ARGB_set(&a, ina);
	ARGB_set(&b, inb);

	a.a = NUM_INTERPOLATE(a.a, b.a, percentage);
	a.r = NUM_INTERPOLATE(a.r, b.r, percentage);
	a.g = NUM_INTERPOLATE(a.g, b.g, percentage);
	a.b = NUM_INTERPOLATE(a.b, b.b, percentage);

	return a.a << 24 | a.r << 16 | a.g << 8 | a.b;
}

ARGB
A_Interpolate(const Animation* anim, PixelRendererParams a) {
	struct A_Interpolate in = *(struct A_Interpolate*)a.priv;

	if (in.interpolate == NULL) {
		fprintf(stderr, "Interpolation function cannot be NULL!\n");
		ARGB_set(&a.pixel, 0xFFFF00FF);
		return a.pixel;
	}

	if (a.frame.current == in.startFrame) {
		memcpy(in.initialValueTemp, in.value, in.initialValueTempSize);
	}

	double perc = (double)(a.frame.current - 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.initialValueTemp, in.goalValue, perc);

	return a.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);
}