configure.ac: Add checks for Flex/Yacc/Bison and other furry animals, for the new...
[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   return fx;
119 }
120
121 /* ----- */
122
123 static void
124 tentacle_free (TentacleFXData * data)
125 {
126   /* TODO : un vrai FREE GRID!! */
127   free (data->vals);
128 }
129
130 static void
131 tentacle_new (TentacleFXData * data)
132 {
133   int tmp;
134
135   v3d center = { 0, -17.0, 0 };
136   data->vals = (float *) malloc ((definitionx + 20) * sizeof (float));
137
138   for (tmp = 0; tmp < nbgrid; tmp++) {
139     int x, z;
140
141     z = 45 + rand () % 30;
142     x = 85 + rand () % 5;
143     center.z = z;
144     data->grille[tmp] =
145         grid3d_new (x, definitionx, z, definitionz + rand () % 10, center);
146     center.y += 8;
147   }
148 }
149
150 static inline unsigned char
151 lighten (unsigned char value, float power)
152 {
153   int val = value;
154   float t = (float) val * log10 (power) / 2.0;
155
156   if (t > 0) {
157     val = (int) t;              /* (32.0f * log (t)); */
158     if (val > 255)
159       val = 255;
160     if (val < 0)
161       val = 0;
162     return val;
163   } else {
164     return 0;
165   }
166 }
167
168 static void
169 lightencolor (int *col, float power)
170 {
171   unsigned char *color;
172
173   color = (unsigned char *) col;
174   *color = lighten (*color, power);
175   color++;
176   *color = lighten (*color, power);
177   color++;
178   *color = lighten (*color, power);
179   color++;
180   *color = lighten (*color, power);
181 }
182
183 /* retourne x>>s , en testant le signe de x */
184 #define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s))
185
186 static int
187 evolutecolor (unsigned int src, unsigned int dest,
188     unsigned int mask, unsigned int incr)
189 {
190
191   int color = src & (~mask);
192
193   src &= mask;
194   dest &= mask;
195
196   if ((src != mask)
197       && (src < dest))
198     src += incr;
199
200   if (src > dest)
201     src -= incr;
202   return (src & mask) | color;
203 }
204
205 static void
206 pretty_move (PluginInfo * goomInfo, float cycle, float *dist, float *dist2,
207     float *rotangle, TentacleFXData * fx_data)
208 {
209
210   float tmp;
211
212   /* many magic numbers here... I don't really like that. */
213   if (fx_data->happens)
214     fx_data->happens -= 1;
215   else if (fx_data->lock == 0) {
216     fx_data->happens =
217         goom_irand (goomInfo->gRandom,
218         200) ? 0 : 100 + goom_irand (goomInfo->gRandom, 60);
219     fx_data->lock = fx_data->happens * 3 / 2;
220   } else
221     fx_data->lock--;
222
223   tmp = fx_data->happens ? 8.0f : 0;
224   *dist2 = fx_data->distt2 = (tmp + 15.0f * fx_data->distt2) / 16.0f;
225
226   tmp = 30 + D - 90.0f * (1.0f + sin (cycle * 19 / 20));
227   if (fx_data->happens)
228     tmp *= 0.6f;
229
230   *dist = fx_data->distt = (tmp + 3.0f * fx_data->distt) / 4.0f;
231
232   if (!fx_data->happens) {
233     tmp = M_PI * sin (cycle) / 32 + 3 * M_PI / 2;
234   } else {
235     fx_data->rotation =
236         goom_irand (goomInfo->gRandom,
237         500) ? fx_data->rotation : goom_irand (goomInfo->gRandom, 2);
238     if (fx_data->rotation)
239       cycle *= 2.0f * M_PI;
240     else
241       cycle *= -1.0f * M_PI;
242     tmp = cycle - (M_PI * 2.0) * floor (cycle / (M_PI * 2.0));
243   }
244
245   if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot + 2.0 * M_PI))) {
246     fx_data->rot = (tmp + 15.0f * (fx_data->rot + 2 * M_PI)) / 16.0f;
247     if (fx_data->rot > 2.0 * M_PI)
248       fx_data->rot -= 2.0 * M_PI;
249     *rotangle = fx_data->rot;
250   } else if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot - 2.0 * M_PI))) {
251     fx_data->rot = (tmp + 15.0f * (fx_data->rot - 2.0 * M_PI)) / 16.0f;
252     if (fx_data->rot < 0.0f)
253       fx_data->rot += 2.0 * M_PI;
254     *rotangle = fx_data->rot;
255   } else
256     *rotangle = fx_data->rot = (tmp + 15.0f * fx_data->rot) / 16.0f;
257 }
258
259 static void
260 tentacle_update (PluginInfo * goomInfo, Pixel * buf, Pixel * back, int W, int H,
261     short data[2][512], float rapport, int drawit, TentacleFXData * fx_data)
262 {
263
264   int tmp;
265   int tmp2;
266
267   int color;
268   int colorlow;
269
270   float dist, dist2, rotangle;
271
272   if ((!drawit) && (fx_data->ligs > 0.0f))
273     fx_data->ligs = -fx_data->ligs;
274
275   fx_data->lig += fx_data->ligs;
276
277   if (fx_data->lig > 1.01f) {
278     if ((fx_data->lig > 10.0f) | (fx_data->lig < 1.1f))
279       fx_data->ligs = -fx_data->ligs;
280
281     if ((fx_data->lig < 6.3f) && (goom_irand (goomInfo->gRandom, 30) == 0))
282       fx_data->dstcol = goom_irand (goomInfo->gRandom, NB_TENTACLE_COLORS);
283
284     fx_data->col =
285         evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff,
286         0x01);
287     fx_data->col =
288         evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff00,
289         0x0100);
290     fx_data->col =
291         evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff0000,
292         0x010000);
293     fx_data->col =
294         evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol],
295         0xff000000, 0x01000000);
296
297     color = fx_data->col;
298     colorlow = fx_data->col;
299
300     lightencolor (&color, fx_data->lig * 2.0f + 2.0f);
301     lightencolor (&colorlow, (fx_data->lig / 3.0f) + 0.67f);
302
303     rapport = 1.0f + 2.0f * (rapport - 1.0f);
304     rapport *= 1.2f;
305     if (rapport > 1.12f)
306       rapport = 1.12f;
307
308     pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
309
310     for (tmp = 0; tmp < nbgrid; tmp++) {
311       for (tmp2 = 0; tmp2 < definitionx; tmp2++) {
312         float val =
313             (float) (ShiftRight (data[0][goom_irand (goomInfo->gRandom, 511)],
314                 10)) * rapport;
315         fx_data->vals[tmp2] = val;
316       }
317
318       grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2);
319     }
320     fx_data->cycle += 0.01f;
321     for (tmp = 0; tmp < nbgrid; tmp++)
322       grid3d_draw (goomInfo, fx_data->grille[tmp], color, colorlow, dist, buf,
323           back, W, H);
324   } else {
325     fx_data->lig = 1.05f;
326     if (fx_data->ligs < 0.0f)
327       fx_data->ligs = -fx_data->ligs;
328     pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
329     fx_data->cycle += 0.1f;
330     if (fx_data->cycle > 1000)
331       fx_data->cycle = 0;
332   }
333 }