5 #include "goom_tools.h"
6 #include "goom_config.h"
7 #include "goom_plugin_info.h"
8 #include "tentacle3d.h"
13 #define definitionx 15
14 #define definitionz 45
16 typedef struct _TENTACLE_FX_DATA
18 PluginParam enabled_bp;
19 PluginParameters params;
22 grid3d *grille[nbgrid];
25 #define NB_TENTACLE_COLORS 4
26 int colors[NB_TENTACLE_COLORS];
33 /* statics from pretty_move */
36 float rot; /* entre 0 et 2 * M_PI */
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);
48 * VisualFX wrapper for the tentacles
52 tentacle_fx_init (VisualFX * _this, PluginInfo * info)
55 TentacleFXData *data = (TentacleFXData *) malloc (sizeof (TentacleFXData));
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;
63 (0x28 << (ROUGE * 8)) | (0x2c << (VERT * 8)) | (0x5f << (BLEU * 8));
70 data->rot = 0.0f; /* entre 0 et 2 * M_PI */
76 (0x18 << (ROUGE * 8)) | (0x4c << (VERT * 8)) | (0x2f << (BLEU * 8));
78 (0x48 << (ROUGE * 8)) | (0x2c << (VERT * 8)) | (0x6f << (BLEU * 8));
80 (0x58 << (ROUGE * 8)) | (0x3c << (VERT * 8)) | (0x0f << (BLEU * 8));
82 (0x87 << (ROUGE * 8)) | (0x55 << (VERT * 8)) | (0x74 << (BLEU * 8));
85 _this->params = &data->params;
86 _this->fx_data = (void *) data;
90 tentacle_fx_apply (VisualFX * _this, Pixel * src, Pixel * dest,
91 PluginInfo * goomInfo)
93 TentacleFXData *data = (TentacleFXData *) _this->fx_data;
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);
104 tentacle_fx_free (VisualFX * _this)
106 tentacle_free ((TentacleFXData *) _this->fx_data);
107 free (_this->fx_data);
111 tentacle_fx_create (void)
115 fx.init = tentacle_fx_init;
116 fx.apply = tentacle_fx_apply;
117 fx.free = tentacle_fx_free;
126 tentacle_free (TentacleFXData * data)
131 for (tmp = 0; tmp < nbgrid; tmp++)
132 grid3d_free (data->grille[tmp]);
135 goom_plugin_parameters_free (&data->params);
139 tentacle_new (TentacleFXData * data)
143 v3d center = { 0, -17.0, 0 };
144 data->vals = (float *) malloc ((definitionx + 20) * sizeof (float));
146 for (tmp = 0; tmp < nbgrid; tmp++) {
149 z = 45 + rand () % 30;
150 x = 85 + rand () % 5;
153 grid3d_new (x, definitionx, z, definitionz + rand () % 10, center);
158 static inline unsigned char
159 lighten (unsigned char value, float power)
162 float t = (float) val * log10 (power) / 2.0;
165 val = (int) t; /* (32.0f * log (t)); */
177 lightencolor (int *col, float power)
179 unsigned char *color;
181 color = (unsigned char *) col;
182 *color = lighten (*color, power);
184 *color = lighten (*color, power);
186 *color = lighten (*color, power);
188 *color = lighten (*color, power);
191 /* retourne x>>s , en testant le signe de x */
192 #define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s))
195 evolutecolor (unsigned int src, unsigned int dest,
196 unsigned int mask, unsigned int incr)
199 int color = src & (~mask);
210 return (src & mask) | color;
214 pretty_move (PluginInfo * goomInfo, float cycle, float *dist, float *dist2,
215 float *rotangle, TentacleFXData * fx_data)
220 /* many magic numbers here... I don't really like that. */
221 if (fx_data->happens)
222 fx_data->happens -= 1;
223 else if (fx_data->lock == 0) {
225 goom_irand (goomInfo->gRandom,
226 200) ? 0 : 100 + goom_irand (goomInfo->gRandom, 60);
227 fx_data->lock = fx_data->happens * 3 / 2;
231 tmp = fx_data->happens ? 8.0f : 0;
232 *dist2 = fx_data->distt2 = (tmp + 15.0f * fx_data->distt2) / 16.0f;
234 tmp = 30 + D - 90.0f * (1.0f + sin (cycle * 19 / 20));
235 if (fx_data->happens)
238 *dist = fx_data->distt = (tmp + 3.0f * fx_data->distt) / 4.0f;
240 if (!fx_data->happens) {
241 tmp = M_PI * sin (cycle) / 32 + 3 * M_PI / 2;
244 goom_irand (goomInfo->gRandom,
245 500) ? fx_data->rotation : goom_irand (goomInfo->gRandom, 2);
246 if (fx_data->rotation)
247 cycle *= 2.0f * M_PI;
249 cycle *= -1.0f * M_PI;
250 tmp = cycle - (M_PI * 2.0) * floor (cycle / (M_PI * 2.0));
253 if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot + 2.0 * M_PI))) {
254 fx_data->rot = (tmp + 15.0f * (fx_data->rot + 2 * M_PI)) / 16.0f;
255 if (fx_data->rot > 2.0 * M_PI)
256 fx_data->rot -= 2.0 * M_PI;
257 *rotangle = fx_data->rot;
258 } else if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot - 2.0 * M_PI))) {
259 fx_data->rot = (tmp + 15.0f * (fx_data->rot - 2.0 * M_PI)) / 16.0f;
260 if (fx_data->rot < 0.0f)
261 fx_data->rot += 2.0 * M_PI;
262 *rotangle = fx_data->rot;
264 *rotangle = fx_data->rot = (tmp + 15.0f * fx_data->rot) / 16.0f;
268 tentacle_update (PluginInfo * goomInfo, Pixel * buf, Pixel * back, int W, int H,
269 short data[2][512], float rapport, int drawit, TentacleFXData * fx_data)
278 float dist, dist2, rotangle;
280 if ((!drawit) && (fx_data->ligs > 0.0f))
281 fx_data->ligs = -fx_data->ligs;
283 fx_data->lig += fx_data->ligs;
285 if (fx_data->lig > 1.01f) {
286 if ((fx_data->lig > 10.0f) | (fx_data->lig < 1.1f))
287 fx_data->ligs = -fx_data->ligs;
289 if ((fx_data->lig < 6.3f) && (goom_irand (goomInfo->gRandom, 30) == 0))
290 fx_data->dstcol = goom_irand (goomInfo->gRandom, NB_TENTACLE_COLORS);
293 evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff,
296 evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff00,
299 evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff0000,
302 evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol],
303 0xff000000, 0x01000000);
305 color = fx_data->col;
306 colorlow = fx_data->col;
308 lightencolor (&color, fx_data->lig * 2.0f + 2.0f);
309 lightencolor (&colorlow, (fx_data->lig / 3.0f) + 0.67f);
311 rapport = 1.0f + 2.0f * (rapport - 1.0f);
316 pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
318 for (tmp = 0; tmp < nbgrid; tmp++) {
319 for (tmp2 = 0; tmp2 < definitionx; tmp2++) {
321 (float) (ShiftRight (data[0][goom_irand (goomInfo->gRandom, 511)],
324 fx_data->vals[tmp2] = val;
327 grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2);
329 fx_data->cycle += 0.01f;
330 for (tmp = 0; tmp < nbgrid; tmp++)
331 grid3d_draw (goomInfo, fx_data->grille[tmp], color, colorlow, dist, buf,
334 fx_data->lig = 1.05f;
335 if (fx_data->ligs < 0.0f)
336 fx_data->ligs = -fx_data->ligs;
337 pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data);
338 fx_data->cycle += 0.1f;
339 if (fx_data->cycle > 1000)