4 #include "goom_tools.h"
14 #define STOP_SPEED 128
17 /**-----------------------------------------------------**
19 **-----------------------------------------------------**/
20 static guint32 *pixel ;
21 static guint32 *back ;
22 static guint32 *p1,*p2,*tmp;
25 guint32 resolx, resoly, buffsize;
27 void goom_init (guint32 resx, guint32 resy)
30 printf ("GOOM: init (%d, %d);\n", resx,resy);
34 buffsize = resx * resy;
36 pixel = (guint32 *) malloc (buffsize * sizeof(guint32) + 128);
37 back = (guint32 *) malloc (buffsize * sizeof(guint32) + 128);
38 RAND_INIT (GPOINTER_TO_INT(pixel));
41 p1 = (void *)(((unsigned long)pixel + 0x7f)&(~0x7f));
42 p2 = (void *)(((unsigned long)back + 0x7f)&(~0x7f));
46 void goom_set_resolution (guint32 resx, guint32 resy)
53 buffsize = resx * resy;
55 pixel = (guint32 *) malloc (buffsize * sizeof(guint32) + 128);
56 memset(pixel,0,buffsize * sizeof(guint32) + 128);
57 back = (guint32 *) malloc (buffsize * sizeof(guint32) + 128);
58 memset(back,0,buffsize * sizeof(guint32) + 128);
60 p1 = (void *)(((unsigned long)pixel + 0x7f)&(~0x7f));
61 p2 = (void *)(((unsigned long)back + 0x7f)&(~0x7f));
65 guint32 * goom_update (gint16 data [2][512])
67 static int lockvar = 0 ; /* pour empecher de nouveaux changements */
68 static int goomvar = 0 ; /* boucle des gooms */
69 static int totalgoom = 0 ; /* nombre de gooms par seconds */
70 static int agoom = 0 ; /* un goom a eu lieu.. */
71 static int loopvar = 0 ; /* mouvement des points */
72 static int speedvar = 0 ; /* vitesse des particules */
73 static int lineMode = 0 ; /* l'effet lineaire a dessiner */
77 int incvar ; /* volume du son */
78 int accelvar ; /* acceleration des particules */
80 float largfactor ; /* elargissement de l'intervalle d'évolution des points */
81 static char goomlimit = 2 ; /* sensibilité du goom */
82 static ZoomFilterData zfd =
90 /* test if the config has changed, update it if so */
91 pointWidth = (resolx * 2) / 5;
92 pointHeight = (resoly * 2) / 5;
94 /* ! etude du signal ... */
98 if (incvar < data[0][i]) incvar = data[0][i] ;
101 accelvar = incvar / 5000 ;
105 if (speedvar>20) accelvar -- ;
106 if (speedvar>40) speedvar = 40 ;
109 speedvar += accelvar ;
111 if (speedvar<0) speedvar=0;
112 if (speedvar>40) speedvar = 40 ;
115 /* ! calcul du deplacement des petits points ... */
117 largfactor = ((float)speedvar / 40.0f + (float)incvar / 50000.0f) / 1.5f ;
118 if (largfactor>1.5f) largfactor = 1.5f ;
120 for (i = 1 ; i*15 <= speedvar + 15; i ++) {
121 loopvar += speedvar + 1 ;
125 ((pointWidth - 6.0f) * largfactor + 5.0f),
126 ((pointHeight - 6.0f) * largfactor + 5.0f),
129 pointFilter(p1, ORANGE,
130 ((pointWidth / 2) * largfactor) / i + 10.0f * i,
131 ((pointHeight / 2) * largfactor) / i + 10.0f * i,
132 96.0f, i * 80.0f, loopvar / i);
133 pointFilter(p1, VIOLET,
134 ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
135 ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
136 i + 122.0f, 134.0f, loopvar / i);
137 pointFilter(p1, BLACK,
138 ((pointHeight / 3) * largfactor + 20.0f),
139 ((pointHeight / 3) * largfactor + 20.0f),
140 58.0f, i * 66.0f, loopvar / i);
141 pointFilter(p1, WHITE,
142 (pointHeight * largfactor + 10.0f * i) / i,
143 (pointHeight * largfactor + 10.0f * i) / i,
144 66.0f, 74.0f, loopvar + i * 500);
147 /* par défaut pas de changement de zoom */
150 /* diminuer de 1 le temps de lockage */
151 /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */
152 /* changement d'etat du plugins juste apres un autre changement d'etat. oki ? */
153 if (--lockvar < 0) lockvar = 0 ;
156 if (--agoom < 0) agoom = 0 ;
158 /* on verifie qu'il ne se pas un truc interressant avec le son. */
159 if ((accelvar>goomlimit) || (accelvar<-goomlimit))
161 /* UN GOOM !!! YAHOO ! */
163 agoom = 20 ; /* mais pdt 20 cycles, il n'y en aura plus. */
164 lineMode = (lineMode + 1)%20; /* Tous les 10 gooms on change de mode lineaire */
166 /* changement eventuel de mode */
173 zfd.vitesse=STOP_SPEED-1;
178 zfd.mode=CRYSTAL_BALL_MODE;
181 zfd.mode=AMULETTE_MODE;
184 zfd.mode = WATER_MODE ;
187 zfd.mode=SCRUNCH_MODE;
190 zfd.mode=NORMAL_MODE;
194 /* tout ceci ne sera fait qu'en cas de non-blocage */
197 /* reperage de goom (acceleration forte de l'acceleration du volume) */
198 /* -> coup de boost de la vitesse si besoin.. */
199 if ( (accelvar>goomlimit) || (accelvar<-goomlimit) )
202 /*if (goomvar % 1 == 0) */
206 newvit = STOP_SPEED - speedvar / 2 ;
207 /* retablir le zoom avant.. */
213 zfd.vitesse = STOP_SPEED - 2 ;
222 /* changement de milieu.. */
226 zfd.middleY = resoly - 1 ;
227 zfd.middleX = resolx / 2 ;
230 zfd.middleX = resolx - 1 ;
236 zfd.middleY = resoly / 2 ;
237 zfd.middleX = resolx / 2 ;
240 if (zfd.mode == WATER_MODE)
242 zfd.middleX = resolx / 2;
243 zfd.middleY = resoly / 2;
246 switch (vtmp = (iRAND (27)))
249 zfd.vPlaneEffect = iRAND(3);
250 zfd.vPlaneEffect -= iRAND(3);
251 zfd.hPlaneEffect = iRAND(3);
252 zfd.hPlaneEffect -= iRAND(3);
255 zfd.vPlaneEffect = 0 ;
256 zfd.hPlaneEffect = iRAND(8);
257 zfd.hPlaneEffect -= iRAND(8);
263 zfd.vPlaneEffect = iRAND(5);
264 zfd.vPlaneEffect -= iRAND(5);
265 zfd.hPlaneEffect = - zfd.vPlaneEffect;
268 zfd.hPlaneEffect = 5 + iRAND (8);
269 zfd.vPlaneEffect = - zfd.hPlaneEffect ;
272 zfd.vPlaneEffect = 5 + iRAND (8);
273 zfd.hPlaneEffect = - zfd.hPlaneEffect ;
276 zfd.hPlaneEffect = 0;
277 zfd.vPlaneEffect = iRAND(10);
278 zfd.vPlaneEffect -= iRAND(10);
283 zfd.vPlaneEffect = 0;
284 zfd.hPlaneEffect = 0;
288 if (iRAND (3) != 0) zfd.noisify = 0 ;
291 zfd.noisify = iRAND (3) + 2 ;
295 if (zfd.mode == AMULETTE_MODE)
297 zfd.vPlaneEffect = 0;
298 zfd.hPlaneEffect = 0;
302 if ((zfd.middleX == 1) || (zfd.middleX == resolx - 1))
304 zfd.vPlaneEffect = 0 ;
305 zfd.hPlaneEffect = iRAND (2) ? 0 : zfd.hPlaneEffect;
308 if (newvit < zfd.vitesse) /* on accelere */
311 if ( ( (newvit < STOP_SPEED - 7) &&
312 (zfd.vitesse < STOP_SPEED - 6) &&
316 zfd.vitesse = STOP_SPEED - 1 ;
317 zfd.reverse = ! zfd.reverse ;
321 zfd.vitesse = (newvit + zfd.vitesse * 4) / 5 ;
328 if (iRAND(1000) == 0)
331 printf ("coup du sort...\n") ;
334 zfd.vitesse = STOP_SPEED - 1 ;
342 /* gros frein si la musique est calme */
343 if ((speedvar < 1) && (zfd.vitesse < STOP_SPEED - 4) && (cycle % 16 == 0))
346 printf ("++slow part... %i\n", zfd.vitesse) ;
354 printf ("--slow part... %i\n", zfd.vitesse) ;
358 /* baisser regulierement la vitesse... */
359 if ( (cycle % 73 == 0) && (zfd.vitesse < STOP_SPEED - 5))
362 printf ("slow down...\n") ;
368 /* arreter de decrémenter au bout d'un certain temps */
369 if ((cycle % 101 == 0) && (zfd.pertedec == 7))
379 printf ("GOOM: pzfd->mode = %d\n", pzfd->mode);
384 zoomFilterFastRGB (p1, p2, pzfd, resolx, resoly) ;
386 /* si on est dans un goom : afficher les lignes... */
387 if (agoom > 15) goom_lines
389 ((zfd.middleX==resolx/2) && (zfd.middleY==resoly/2) && (zfd.mode!=WATER_MODE))
398 /* affichage et swappage des buffers.. */
401 /* tous les 100 cycles : vérifier si le taux de goom est correct */
402 /* et le modifier sinon.. */
407 /* printf ("less gooms\n") ; */
412 if ((totalgoom==0) && (goomlimit>1))
422 if (pixel!=NULL) free (pixel) ;
423 if (back!=NULL) free (back) ;