24
24
#include "applet-struct.h"
25
25
#include "applet-wave.h"
27
static inline void _init_wave (GLfloat *pVertices, GLfloat *pCoords)
28
54
void cd_animations_init_wave (CDAnimationData *pData)
30
pData->pCoords[0] = .5;
31
pData->pCoords[1] = .5;
33
pData->pVertices[0] = 0.;
34
pData->pVertices[1] = 0.;
35
pData->pVertices[2] = 0.;
36
pData->fWavePosition = - myConfig.fWaveWidth / 2;
38
pData->iNumActiveNodes = 6;
39
pData->pVertices[3*1+0] = -.5;
40
pData->pVertices[3*1+1] = -.5;
41
pData->pVertices[3*2+0] = .5;
42
pData->pVertices[3*2+1] = -.5;
43
pData->pVertices[3*3+0] = .5;
44
pData->pVertices[3*3+1] = .5;
45
pData->pVertices[3*4+0] = -.5;
46
pData->pVertices[3*4+1] = .5;
47
pData->pVertices[3*5+0] = -.5;
48
pData->pVertices[3*5+1] = -.5;
49
pData->pCoords[2*1+0] = 0.;
50
pData->pCoords[2*1+1] = 1.;
51
pData->pCoords[2*2+0] = 1.;
52
pData->pCoords[2*2+1] = 1.;
53
pData->pCoords[2*3+0] = 1.;
54
pData->pCoords[2*3+1] = 0.;
55
pData->pCoords[2*4+0] = 0.;
56
pData->pCoords[2*4+1] = 0.;
57
pData->pCoords[2*5+0] = 0.;
58
pData->pCoords[2*5+1] = 1.;
56
_init_wave (pData->pVertices, pData->pCoords);
58
pData->iNumActiveNodes = 4;
59
pData->fWavePosition = - myConfig.fWaveWidth / 2 + .01; // on rajoute epsilon pour commencer avec 2 points.
59
60
pData->bIsWaving = TRUE;
63
64
gboolean cd_animations_update_wave (CairoDock *pDock, CDAnimationData *pData, double dt)
65
GLfloat *pVertices = &pData->pVertices[3];
66
GLfloat *pCoords = &pData->pCoords[2];
67
double x, y, a, a_, x_;
66
GLfloat *pVertices = pData->pVertices;
67
GLfloat *pCoords = pData->pCoords;
68
69
double p = pData->fWavePosition, w = myConfig.fWaveWidth;
69
int n = (CD_WAVE_NB_POINTS - 1) / 2; // nbre de points pour une demi-vague.
71
for (i = 0; i < CD_WAVE_NB_POINTS; i ++)
77
a_ = 1. * (i+1-n) / (n-1);
79
if (x_ > 0) // le point suivant est dedans.
81
y = myConfig.fWaveAmplitude * cos (G_PI/2 * a + x / (w/2) * G_PI/2);
93
else if (i == CD_WAVE_NB_POINTS-1)
97
a_ = 1. * (i-1-n) / (n-1);
99
if (x_ < 1) // le point precedent est dedans.
101
y = myConfig.fWaveAmplitude * cos (G_PI/2 * a - (x-1) / (w/2) * G_PI/2);
115
a = 1. * (i-n) / (n-1);
119
a_ = 1. * (i+1-n) / (n-1);
121
if (x_ > 0) // le point suivant est dedans.
123
y = myConfig.fWaveAmplitude * cos (G_PI/2 * a - x / (w/2) * G_PI/2);
131
a_ = 1. * (i-1-n) / (n-1);
133
if (x_ < 1) // le point precedent est dedans.
135
y = myConfig.fWaveAmplitude * cos (G_PI/2 * a - (x-1) / (w/2) * G_PI/2);
70
if (p + w/2 < 0 || p - w/2 > 1) // la vague est entierement en-dehors du cote.
72
_init_wave (pVertices, pCoords); // on s'assure d'avoir au moins un carre.
73
pData->iNumActiveNodes = 4;
77
int j = 0; // nombre de points calcules.
78
if (p - w/2 > 0) // la vague n'englobe pas le point du bas.
87
double x, x_, y; // position du point et du point precedent.
88
double a, a_; // position sur la vague dans [-1, 1].
89
int n = CD_WAVE_NB_POINTS / 2; // nbre de points pour une demi-vague (N est impair).
91
for (i = 0; i < CD_WAVE_NB_POINTS; i ++) // on discretise la vague.
93
a = 1. * (i-n) / (n); // position courante sur la vague, dans [-1, 1].
94
x = p + a * w/2; // abscisse correspondante.
96
a = 1. * (i-n) / n; // position courante sur la vague, dans [-1, 1].
97
x = p + a * w/2; // abscisse correspondante.
98
if (x < 0) // le point sort par le bas.
100
a_ = 1. * (i+1-n) / n;
102
if (x_ > 0) // le point suivant est dedans.
104
y = myConfig.fWaveAmplitude * cos (G_PI/2 * a - x / (w/2) * G_PI/2); // on depasse de x, donc on dephase d'autant.
105
x = 0.; // coin de la texture.
107
else // tout le segment est dehors, on zappe.
110
else if (x > 1) // le point sort par le haut.
112
a_ = 1. * (i-1-n) / n;
114
if (x_ < 1) // le point precedent est dedans.
116
y = myConfig.fWaveAmplitude * cos (G_PI/2 * a - (x-1) / (w/2) * G_PI/2); // on depasse de x-1, donc on dephase d'autant.
117
x = 1.; // coin de la texture.
119
else // tout le segment est dehors, on zappe.
122
else // le point est dans l'icone.
142
123
y = myConfig.fWaveAmplitude * cos (G_PI/2 * a);
148
pVertices[3*j] = -.5 - y;
149
pVertices[3*j+1] = .5 - x;
150
pVertices[3*j+2] = 0.;
155
for (i = 0; i < j; i ++)
159
pCoords[2*k+1] = pCoords[2*i+1];
161
pVertices[3*k] = - pVertices[3*i];
162
pVertices[3*k+1] = pVertices[3*i+1];
163
pVertices[3*k+2] = 0.;
168
pCoords[2*j] = pCoords[0];
169
pCoords[2*j+1] = pCoords[1];
171
pVertices[3*j] = pVertices[0];
172
pVertices[3*j+1] = pVertices[1];
173
pVertices[3*j+2] = 0.;
125
pVertices[4*j] = -.5 - y;
126
pVertices[4*j+1] = x - .5;
128
pCoords[4*j+1] = 1. - x;
132
if (p + w/2 < 1) // la vague n'englobe pas le point du haut.
134
pVertices[4*j] = -.5;
135
pVertices[4*j+1] = .5;
141
for (i = 0; i < j; i ++) // on complete l'autre cote symetriquement.
143
pVertices[4*i+2] = - pVertices[4*i];
144
pVertices[4*i+3] = pVertices[4*i+1];
146
pCoords[4*i+3] = pCoords[4*i+1];
148
pData->iNumActiveNodes = 2*j;
175
151
pData->fWavePosition += dt / myConfig.iWaveDuration;
176
pData->iNumActiveNodes = j + 2;
178
153
cairo_dock_redraw_container (CAIRO_CONTAINER (pDock));
179
154
return (pData->fWavePosition - w/2 < 1);