gst/goom/Makefile.am: Remove the warnings being disabled, fix linkage on x86, spotted...
[platform/upstream/gst-plugins-good.git] / gst / goom / tentacle3d.c
1 #include <stdlib.h>
2
3 #include "v3d.h"
4 #include "surf3d.h"
5 #include "goom_tools.h"
6 #include "goom_config.h"
7 #include "goom_plugin_info.h"
8 #include "tentacle3d.h"
9
10 #define D 256.0f
11
12 #define nbgrid 6
13 #define definitionx 15
14 #define definitionz 45
15
16 typedef struct _TENTACLE_FX_DATA
17 {
18   PluginParam enabled_bp;
19   PluginParameters params;
20
21   float cycle;
22   grid3d *grille[nbgrid];
23   float *vals;
24
25 #define NB_TENTACLE_COLORS 4
26   int colors[NB_TENTACLE_COLORS];
27
28   int col;
29   int dstcol;
30   float lig;
31   float ligs;
32
33   /* statics from pretty_move */
34   float distt;
35   float distt2;
36   float rot;                    /* entre 0 et 2 * M_PI */
37   int happens;
38   int rotation;
39   int lock;
40 } TentacleFXData;
41
42 static void tentacle_new (TentacleFXData * data);
43 static void tentacle_update (PluginInfo * goomInfo, Pixel * buf, Pixel * back,
44     int W, int H, short[2][512], float, int drawit, TentacleFXData * data);
45 static void tentacle_free (TentacleFXData * data);
46
47 /* 
48  * VisualFX wrapper for the tentacles
49  */
50
51 static void
52 tentacle_fx_init (VisualFX * _this, PluginInfo * info)
53 {
54
55   TentacleFXData *data = (TentacleFXData *) malloc (sizeof (TentacleFXData));
56
57   data->enabled_bp = secure_b_param ("Enabled", 1);
58   data->params = plugin_parameters ("3D Tentacles", 1);
59   data->params.params[0] = &data->enabled_bp;
60
61   data->cycle = 0.0f;
62   data->col =
63       (0x28 << (ROUGE * 8)) | (0x2c << (VERT * 8)) | (0x5f << (BLEU * 8));
64   data->dstcol = 0;
65   data->lig = 1.15f;
66   data->ligs = 0.1f;
67
68   data->distt = 10.0f;
69   data->distt2 = 0.0f;
70   data->rot = 0.0f;             /* entre 0 et 2 * M_PI */
71   data->happens = 0;
72
73   data->rotation = 0;
74   data->lock = 0;
75   data->colors[0] =
76       (0x18 << (ROUGE * 8)) | (0x4c << (VERT * 8)) | (0x2f << (BLEU * 8));
77   data->colors[1] =
78       (0x48 << (ROUGE * 8)) | (0x2c << (VERT * 8)) | (0x6f << (BLEU * 8));
79   data->colors[2] =
80       (0x58 << (ROUGE * 8)) | (0x3c << (VERT * 8)) | (0x0f << (BLEU * 8));
81   data->colors[3] =
82       (0x87 << (ROUGE * 8)) | (0x55 << (VERT * 8)) | (0x74 << (BLEU * 8));
83   tentacle_new (data);
84
85   _this->params = &data->params;
86   _this->fx_data = (void *) data;
87 }
88
89 static void
90 tentacle_fx_apply (VisualFX * _this, Pixel * src, Pixel * dest,
91     PluginInfo * goomInfo)
92 {
93   TentacleFXData *data = (TentacleFXData *) _this->fx_data;
94
95   if (BVAL (data->enabled_bp)) {
96     tentacle_update (goomInfo, dest, src, goomInfo->screen.width,
97         goomInfo->screen.height, goomInfo->sound.samples,
98         (float) goomInfo->sound.accelvar,
99         goomInfo->curGState->drawTentacle, data);
100   }
101 }
102
103 static void
104 tentacle_fx_free (VisualFX * _this)
105 {
106   tentacle_free ((TentacleFXData *) _this->fx_data);
107   free (_this->fx_data);
108 }
109
110 VisualFX
111 tentacle_fx_create (void)
112 {
113   VisualFX fx;
114
115   fx.init = tentacle_fx_init;
116   fx.apply = tentacle_fx_apply;
117   fx.free = tentacle_fx_free;
118   fx.fx_data = NULL;
119   fx.params = NULL;
120   return fx;
121 }
122
123 /* ----- */
124
125 static void
126 tentacle_free (TentacleFXData * data)
127 {
128   /* TODO : un vrai FREE GRID!! */
129   free (data->vals);
130 }
131
132 static void
133 tentacle_new (TentacleFXData * data)
134 {
135   int tmp;
136
137   v3d center = { 0, -17.0, 0 };
138   data->vals = (float *) malloc ((definitionx + 20) * sizeof (float));
139
140   for (tmp = 0; tmp < nbgrid; tmp++) {
141     int x, z;
142
143     z = 45 + rand () % 30;
144     x = 85 + rand () % 5;
145     center.z = z;
146     data->grille[tmp] =
147         grid3d_new (x, definitionx, z, definitionz + rand () % 10, center);
148     center.y += 8;
149   }
150 }
151
152 static inline unsigned char
153 lighten (unsigned char value, float power)
154 {
155   int val = value;
156   float t = (float) val * log10 (power) / 2.0;
157
158   if (t > 0) {
159     val = (int) t;              /* (32.0f * log (t)); */
160     if (val > 255)
161       val = 255;
162     if (val < 0)
163       val = 0;
164     return val;
165   } else {
166     return 0;
167   }
168 }
169
170 static void
171 lightencolor (int *col, float power)
172 {
173   unsigned char *color;
174
175   color = (unsigned char *) col;
176   *color = lighten (*color, power);
177   color++;
178   *color = lighten (*color, power);
179   color++;
180   *color = lighten (*color, power);
181   color++;
182   *color = lighten (*color, power);
183 }
184
185 /* retourne x>>s , en testant le signe de x */
186 #define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s))
187
188 static int
189 evolutecolor (unsigned int src, unsigned int dest,
190     unsigned int mask, unsigned int incr)
191 {
192
193   int color = src & (~mask);
194
195   src &= mask;
196   dest &= mask;
197
198   if ((src != mask)
199       && (src < dest))
200     src += incr;
201
202   if (src > dest)
203     src -= incr;
204   return (src & mask) | color;
205 }
206
207 static void
208 pretty_move (PluginInfo * goomInfo, float cycle, float *dist, float *dist2,
209     float *rotangle, TentacleFXData * fx_data)
210 {
211
212   float tmp;
213
214   /* many magic numbers here... I don't really like that. */
215   if (fx_data->happens)
216     fx_data->happens -= 1;
217   else if (fx_data->lock == 0) {
218     fx_data->happens =
219         goom_irand (goomInfo->gRandom,
220         200) ? 0 : 100 + goom_irand (goomInfo->gRandom, 60);
221     fx_data->lock = fx_data->happens * 3 / 2;
222   } else
223     fx_data->lock--;
224
225   tmp = fx_data->happens ? 8.0f : 0;
226   *dist2 = fx_data->distt2 = (tmp + 15.0f * fx_data->distt2) / 16.0f;
227
228   tmp = 30 + D - 90.0f * (1.0f + sin (cycle * 19 / 20));
229   if (fx_data->happens)
230     tmp *= 0.6f;
231
232   *dist = fx_data->distt = (tmp + 3.0f * fx_data->distt) / 4.0f;
233
234   if (!fx_data->happens) {
235     tmp = M_PI * sin (cycle) / 32 + 3 * M_PI / 2;
236   } else {
237     fx_data->rotation =
238         goom_irand (goomInfo->gRandom,
239         500) ? fx_data->rotation : goom_irand (goomInfo->gRandom, 2);
240     if (fx_data->rotation)
241       cycle *= 2.0f * M_PI;
242     else
243       cycle *= -1.0f * M_PI;
244     tmp = cycle - (M_PI * 2.0) * floor (cycle / (M_PI * 2.0));
245   }
246
247   if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot + 2.0 * M_PI))) {
248     fx_data->rot = (tmp + 15.0f * (fx_data->rot + 2 * M_PI)) / 16.0f;
249     if (fx_data->rot > 2.0 * M_PI)
250       fx_data->rot -= 2.0 * M_PI;
251     *rotangle = fx_data->rot;
252   } else if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot - 2.0 * M_PI))) {
253     fx_data->rot = (tmp + 15.0f * (fx_data->rot - 2.0 * M_PI)) / 16.0f;
254     if (fx_data->rot < 0.0f)
255       fx_data->rot += 2.0 * M_PI;
256     *rotangle = fx_data->rot;
257   } else
258     *rotangle = fx_data->rot = (tmp + 15.0f * fx_data->rot) / 16.0f;
259 }
260
261 static void
262 tentacle_update (PluginInfo * goomInfo, Pixel * buf, Pixel * back, int W, int H,
263     short data[2][512], float rapport, int drawit, TentacleFXData * fx_data)
264 {
265
266   int tmp;
267   int tmp2;
268
269   int color;
270   int colorlow;
271
272   float dist, dist2, rotangle;
273
274   if ((!drawit) && (fx_data->ligs > 0.0f))
275     fx_data->ligs = -fx_data->ligs;
276
277   fx_data->lig += fx_data->ligs;
278
279   if (fx_data->lig > 1.01f) {
280     if ((fx_data->lig > 10.0f) | (fx_data->lig < 1.1f))
281       fx_data->ligs = -fx_data->ligs;
282
283     if ((fx_data->lig < 6.3f) && (goom_irand (goomInfo->gRandom, 30) == 0))
284       fx_data->dstcol = goom_irand (goomInfo->gRandom, NB_TENTACLE_COLORS);
285
286     fx_data->col =
287         evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff,
288         0x01);
289     fx_data->col =
290         evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff00,
291         0x0100);
292     fx_data->col =
293         evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff0000,
294         0x010000);
295     fx_data->col =
296         evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol],
297         0xff000000, 0x01000000);
298
299     color = fx_data->col;
300     colorlow = fx_data->col;
301
302     lightencolor (&color, fx_data->lig * 2.0f + 2.0f);
303     lightencolor (&colorlow, (fx_data->lig / 3.0f) + 0.67f);
304
305     rapport = 1.0f + 2.0f * (rapport - 1.0f);
306     rapport *= 1.2f;
307     if (rapport > 1.12f)
308       rapport = 1.12f;
309
310     pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
311
312     for (tmp = 0; tmp < nbgrid; tmp++) {
313       for (tmp2 = 0; tmp2 < definitionx; tmp2++) {
314         float val =
315             (float) (ShiftRight (data[0][goom_irand (goomInfo->gRandom, 511)],
316                 10)) * rapport;
317
318         fx_data->vals[tmp2] = val;
319       }
320
321       grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2);
322     }
323     fx_data->cycle += 0.01f;
324     for (tmp = 0; tmp < nbgrid; tmp++)
325       grid3d_draw (goomInfo, fx_data->grille[tmp], color, colorlow, dist, buf,
326           back, W, H);
327   } else {
328     fx_data->lig = 1.05f;
329     if (fx_data->ligs < 0.0f)
330       fx_data->ligs = -fx_data->ligs;
331     pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
332     fx_data->cycle += 0.1f;
333     if (fx_data->cycle > 1000)
334       fx_data->cycle = 0;
335   }
336 }