4 #include "goom_tools.h"
14 #define STOP_SPEED 128
17 /**-----------------------------------------------------**
19 **-----------------------------------------------------**/
20 static guint32 *pixel;
22 static guint32 *p1, *p2, *tmp;
25 guint32 resolx, resoly, buffsize;
28 goom_init (guint32 resx, guint32 resy)
31 printf ("GOOM: init (%d, %d);\n", resx, resy);
35 buffsize = resx * resy;
37 pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
38 back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
39 RAND_INIT (GPOINTER_TO_INT (pixel));
42 p1 = (void *) (((unsigned long) pixel + 0x7f) & (~0x7f));
43 p2 = (void *) (((unsigned long) back + 0x7f) & (~0x7f));
48 goom_set_resolution (guint32 resx, guint32 resy)
55 buffsize = resx * resy;
57 pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
58 memset (pixel, 0, buffsize * sizeof (guint32) + 128);
59 back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128);
60 memset (back, 0, buffsize * sizeof (guint32) + 128);
62 p1 = (void *) (((unsigned long) pixel + 0x7f) & (~0x7f));
63 p2 = (void *) (((unsigned long) back + 0x7f) & (~0x7f));
68 goom_update (gint16 data[2][512])
70 static int lockvar = 0; /* pour empecher de nouveaux changements */
71 static int goomvar = 0; /* boucle des gooms */
72 static int totalgoom = 0; /* nombre de gooms par seconds */
73 static int agoom = 0; /* un goom a eu lieu.. */
74 static int loopvar = 0; /* mouvement des points */
75 static int speedvar = 0; /* vitesse des particules */
76 static int lineMode = 0; /* l'effet lineaire a dessiner */
80 int incvar; /* volume du son */
81 int accelvar; /* acceleration des particules */
83 float largfactor; /* elargissement de l'intervalle d'évolution des points */
84 static char goomlimit = 2; /* sensibilité du goom */
85 static ZoomFilterData zfd = {
93 /* test if the config has changed, update it if so */
94 pointWidth = (resolx * 2) / 5;
95 pointHeight = (resoly * 2) / 5;
97 /* ! etude du signal ... */
99 for (i = 0; i < 512; i++) {
100 if (incvar < data[0][i])
104 accelvar = incvar / 5000;
113 speedvar += accelvar;
121 /* ! calcul du deplacement des petits points ... */
123 largfactor = ((float) speedvar / 40.0f + (float) incvar / 50000.0f) / 1.5f;
124 if (largfactor > 1.5f)
127 for (i = 1; i * 15 <= speedvar + 15; i++) {
128 loopvar += speedvar + 1;
132 ((pointWidth - 6.0f) * largfactor + 5.0f),
133 ((pointHeight - 6.0f) * largfactor + 5.0f),
134 i * 152.0f, 128.0f, loopvar + i * 2032);
135 pointFilter (p1, ORANGE,
136 ((pointWidth / 2) * largfactor) / i + 10.0f * i,
137 ((pointHeight / 2) * largfactor) / i + 10.0f * i,
138 96.0f, i * 80.0f, loopvar / i);
139 pointFilter (p1, VIOLET,
140 ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
141 ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i,
142 i + 122.0f, 134.0f, loopvar / i);
143 pointFilter (p1, BLACK,
144 ((pointHeight / 3) * largfactor + 20.0f),
145 ((pointHeight / 3) * largfactor + 20.0f),
146 58.0f, i * 66.0f, loopvar / i);
147 pointFilter (p1, WHITE,
148 (pointHeight * largfactor + 10.0f * i) / i,
149 (pointHeight * largfactor + 10.0f * i) / i,
150 66.0f, 74.0f, loopvar + i * 500);
153 /* par défaut pas de changement de zoom */
156 /* diminuer de 1 le temps de lockage */
157 /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */
158 /* changement d'etat du plugins juste apres un autre changement d'etat. oki ? */
166 /* on verifie qu'il ne se pas un truc interressant avec le son. */
167 if ((accelvar > goomlimit) || (accelvar < -goomlimit)) {
168 /* UN GOOM !!! YAHOO ! */
170 agoom = 20; /* mais pdt 20 cycles, il n'y en aura plus. */
171 lineMode = (lineMode + 1) % 20; /* Tous les 10 gooms on change de mode lineaire */
173 /* changement eventuel de mode */
174 switch (iRAND (10)) {
178 zfd.mode = WAVE_MODE;
179 zfd.vitesse = STOP_SPEED - 1;
184 zfd.mode = CRYSTAL_BALL_MODE;
187 zfd.mode = AMULETTE_MODE;
190 zfd.mode = WATER_MODE;
193 zfd.mode = SCRUNCH_MODE;
196 zfd.mode = NORMAL_MODE;
200 /* tout ceci ne sera fait qu'en cas de non-blocage */
202 /* reperage de goom (acceleration forte de l'acceleration du volume) */
203 /* -> coup de boost de la vitesse si besoin.. */
204 if ((accelvar > goomlimit) || (accelvar < -goomlimit)) {
206 /*if (goomvar % 1 == 0) */
211 newvit = STOP_SPEED - speedvar / 2;
212 /* retablir le zoom avant.. */
213 if ((zfd.reverse) && (!(cycle % 12)) && (rand () % 3 == 0)) {
215 zfd.vitesse = STOP_SPEED - 2;
218 if (iRAND (10) == 0) {
223 /* changement de milieu.. */
224 switch (iRAND (20)) {
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) {
241 zfd.middleX = resolx / 2;
242 zfd.middleY = resoly / 2;
245 switch (vtmp = (iRAND (27))) {
247 zfd.vPlaneEffect = iRAND (3);
248 zfd.vPlaneEffect -= iRAND (3);
249 zfd.hPlaneEffect = iRAND (3);
250 zfd.hPlaneEffect -= iRAND (3);
253 zfd.vPlaneEffect = 0;
254 zfd.hPlaneEffect = iRAND (8);
255 zfd.hPlaneEffect -= iRAND (8);
261 zfd.vPlaneEffect = iRAND (5);
262 zfd.vPlaneEffect -= iRAND (5);
263 zfd.hPlaneEffect = -zfd.vPlaneEffect;
266 zfd.hPlaneEffect = 5 + iRAND (8);
267 zfd.vPlaneEffect = -zfd.hPlaneEffect;
270 zfd.vPlaneEffect = 5 + iRAND (8);
271 zfd.hPlaneEffect = -zfd.hPlaneEffect;
274 zfd.hPlaneEffect = 0;
275 zfd.vPlaneEffect = iRAND (10);
276 zfd.vPlaneEffect -= iRAND (10);
280 zfd.vPlaneEffect = 0;
281 zfd.hPlaneEffect = 0;
288 zfd.noisify = iRAND (3) + 2;
292 if (zfd.mode == AMULETTE_MODE) {
293 zfd.vPlaneEffect = 0;
294 zfd.hPlaneEffect = 0;
298 if ((zfd.middleX == 1) || (zfd.middleX == resolx - 1)) {
299 zfd.vPlaneEffect = 0;
300 zfd.hPlaneEffect = iRAND (2) ? 0 : zfd.hPlaneEffect;
303 if (newvit < zfd.vitesse) { /* on accelere */
305 if (((newvit < STOP_SPEED - 7) &&
306 (zfd.vitesse < STOP_SPEED - 6) &&
307 (cycle % 3 == 0)) || (iRAND (40) == 0)) {
308 zfd.vitesse = STOP_SPEED - 1;
309 zfd.reverse = !zfd.reverse;
311 zfd.vitesse = (newvit + zfd.vitesse * 4) / 5;
318 if (iRAND (1000) == 0) {
320 printf ("coup du sort...\n") ;
323 zfd.vitesse = STOP_SPEED - 1;
331 /* gros frein si la musique est calme */
332 if ((speedvar < 1) && (zfd.vitesse < STOP_SPEED - 4) && (cycle % 16 == 0)) {
334 printf ("++slow part... %i\n", zfd.vitesse) ;
342 printf ("--slow part... %i\n", zfd.vitesse) ;
346 /* baisser regulierement la vitesse... */
347 if ((cycle % 73 == 0) && (zfd.vitesse < STOP_SPEED - 5)) {
349 printf ("slow down...\n") ;
355 /* arreter de decrémenter au bout d'un certain temps */
356 if ((cycle % 101 == 0) && (zfd.pertedec == 7)) {
363 printf ("GOOM: pzfd->mode = %d\n", pzfd->mode);
368 zoomFilterFastRGB (p1, p2, pzfd, resolx, resoly);
370 /* si on est dans un goom : afficher les lignes... */
373 (data, ((zfd.middleX == resolx / 2) && (zfd.middleY == resoly / 2)
374 && (zfd.mode != WATER_MODE))
375 ? (lineMode / 10) : 0, p2, agoom - 15);
382 /* affichage et swappage des buffers.. */
385 /* tous les 100 cycles : vérifier si le taux de goom est correct */
386 /* et le modifier sinon.. */
387 if (!(cycle % 100)) {
388 if (totalgoom > 15) {
389 /* printf ("less gooms\n") ; */
392 if ((totalgoom == 0) && (goomlimit > 1))