fix remapping behavior. Remapping is only necessary if we are rendering on the workbe...
[AROS-Contrib.git] / Demo / DawaFire / dawafire.c
bloba317feae4124eb057ec1c2d30a459c27db073608
2 #include <dos/dos.h>
3 #include <intuition/intuition.h>
4 #include <graphics/gfx.h>
5 #include <cybergraphx/cybergraphics.h>
6 #include <proto/exec.h>
7 #include <proto/dos.h>
8 #include <proto/graphics.h>
9 #include <proto/cybergraphics.h>
10 #include <proto/intuition.h>
12 #include <math.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <memory.h>
19 /***********************************************************************************/
21 struct IntuitionBase *IntuitionBase;
22 struct GfxBase *GfxBase;
23 struct Library *CyberGfxBase;
24 struct Screen *scr;
25 struct Window *win;
26 struct RastPort *rp;
27 ULONG cgfx_coltab[256];
28 UBYTE remaptable[256];
29 UBYTE Keys[128];
30 char s[256];
31 WORD winx = -1, winy = -1;
32 BOOL forcescreen, forcewindow;
33 BOOL mustremap, truecolor, remapped, wbscreen = TRUE;
35 static void cleanup(char *msg);
37 /***********************************************************************************/
39 #define random rand
41 #define W 320
42 #define H 200
44 /***********************************************************************************/
46 unsigned char * buffy256, *buffy256_remapped;
47 unsigned int pal[256];
49 struct particle {
50 int X0,Y0;
51 int V0x,V0y;
52 int power;
53 int time;
54 struct particle *next;
57 typedef struct particle particle;
59 particle * firstparticle;
61 void initdawafire(void)
63 int i;
65 /* 8bpp buffer */
67 for ( i=0 ; i<256 ; i++ ) {
69 int r,g,b;
71 r = g = b = 0 ;
73 if ( (i > 7) && (i < 32) )
74 r = 10 * ( i - 7 );
75 if ( i > 31 )
76 r = 255;
78 if ( (i > 32 ) && (i < 57 ) )
79 g = 10 * ( i - 32 );
80 if ( i > 56 )
81 g = 255;
83 if ( i < 8 )
84 b = 8 * i;
85 if ( (i > 7) && (i < 17) )
86 b = 8 * ( 16 - i );
87 if ( (i > 57) && (i < 82) )
88 b = 10 * ( i - 57 );
89 if ( i > 81 )
90 b = 255;
92 if (truecolor)
94 cgfx_coltab[i] = (r<<16) + (g<<8) + (b);
96 else if (mustremap)
98 ULONG red = r * 0x01010101;
99 ULONG green = g * 0x01010101;
100 ULONG blue = b * 0x01010101;
102 remaptable[i] = ObtainBestPen(scr->ViewPort.ColorMap,
103 red,
104 green,
105 blue,
106 OBP_Precision, PRECISION_IMAGE,
107 OBP_FailIfBad, FALSE,
108 TAG_DONE);
109 remapped = TRUE;
111 else
114 ULONG red = r * 0x01010101;
115 ULONG green = g * 0x01010101;
116 ULONG blue = b * 0x01010101;
118 SetRGB32(&scr->ViewPort, i, red, green, blue);
123 buffy256 = (unsigned char *) calloc ( W*H , 1 );
124 if (!buffy256) cleanup("Out of memory!");
126 if (mustremap)
128 buffy256_remapped = (unsigned char *) calloc ( W*H , 1 );
129 if (!buffy256_remapped) cleanup("Out of memory!");
134 void refresh () {
136 /* B G R X */
138 static double k=0;
139 int i;
141 unsigned char * blur = buffy256;
143 particle * precurrentparticle;
144 particle * currentparticle;
146 /* Add new particles */
148 for (i=0; i<8; i++) {
150 int ii;
152 for (ii=0; ii<8; ii++) {
154 precurrentparticle = (particle *) malloc (sizeof(particle));
156 precurrentparticle->V0x = (random() & 31) - 16;
157 precurrentparticle->V0y = (random() & 31);
159 precurrentparticle->X0 = W/2+
160 W/2.5*
161 sin((20*sin(k/20))+i*70)*
162 (sin(10+k/(10+i))+0.2)*
163 cos((k+i*25)/10);
164 precurrentparticle->Y0 = H/2+
165 H/2.5*
166 cos((20*sin(k/(20+i)))+i*70)*
167 (sin(10+k/10)+0.2)*
168 cos((k+i*25)/10);
170 precurrentparticle->power = 110+50*sin(k/3);
171 precurrentparticle->time = 0;
172 precurrentparticle->next = firstparticle;
174 firstparticle = precurrentparticle;
178 k += 0.02;
183 * Physics:
185 * Vx(t) = V0x
186 * Vy(t) = V0y - G.t
188 * X(t) = X0 + V0x.t
189 * Y(t) = Y0 + V0y.t - G.t^2
193 currentparticle = firstparticle->next;
195 while (currentparticle != NULL) {
197 int dawa;
198 int tx,ty;
199 int time;
201 time = currentparticle->time / 16;
203 tx =
204 (currentparticle->X0) +
205 time*(currentparticle->V0x);
206 ty =
207 (currentparticle->Y0) +
208 time*(currentparticle->V0y) -
209 time*time*2;
211 ty = H-ty;
213 if ((tx<W) && (ty>3) && (ty<H)) {
214 dawa = buffy256 [ty*W+tx];
215 dawa += currentparticle->power;
216 if (dawa>255)
217 dawa = 255;
218 buffy256 [ty*W+tx] = dawa;
221 currentparticle->time += 1;
223 currentparticle->power -= ((currentparticle->power >> 4) + 1);
225 if (currentparticle->power <= 1) {
226 precurrentparticle->next = currentparticle->next;
227 free (currentparticle);
228 } else
229 precurrentparticle = currentparticle;
231 currentparticle = precurrentparticle->next;
236 * Blur :
238 * &&&
239 * &@&
243 blur += 2*W;
245 for (i=0; i<W*(H-3); i++)
247 * (blur) =
248 ( * (blur-W-1) +
249 * (blur-W) +
250 * (blur-W+1) +
251 * (blur-1) +
252 * (blur) +
253 ( (*blur) >> 1 ) +
254 ( (*blur) >> 2 ) +
255 * (blur+1) +
256 * (blur+W) ) >> 3;
258 blur++;
260 if (truecolor)
262 WriteLUTPixelArray(buffy256,
267 cgfx_coltab,
268 win->BorderLeft,
269 win->BorderTop,
272 CTABFMT_XRGB8);
274 else if (mustremap)
276 LONG i;
277 UBYTE *src = buffy256;
278 UBYTE *dest = buffy256_remapped;
280 for(i = 0; i < W * H; i++)
282 *dest++ = remaptable[*src++];
284 WriteChunkyPixels(rp,
285 win->BorderLeft,
286 win->BorderTop,
287 win->BorderLeft + W - 1,
288 win->BorderTop + H - 1,
289 buffy256_remapped,
293 else
295 WriteChunkyPixels(rp,
296 win->BorderLeft,
297 win->BorderTop,
298 win->BorderLeft + W - 1,
299 win->BorderTop + H - 1,
300 buffy256,
306 /***********************************************************************************/
308 static void cleanup(char *msg)
311 if (msg)
313 printf("DawaFire: %s\n",msg);
316 if (win) CloseWindow(win);
318 if (remapped)
320 WORD i;
322 for(i = 0; i < 256; i++)
324 ReleasePen(scr->ViewPort.ColorMap, remaptable[i]);
328 if (scr)
330 if (wbscreen)
331 UnlockPubScreen(0, scr);
332 else
333 CloseScreen(scr);
336 if (CyberGfxBase) CloseLibrary(CyberGfxBase);
337 if (GfxBase) CloseLibrary((struct Library *)GfxBase);
338 if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
340 exit(0);
343 /***********************************************************************************/
345 #define ARG_TEMPLATE "WINPOSX=X/N/K,WINPOSY=Y/N/K,FORCESCREEN=SCR/S,FORCEWINDOW=WIN/S"
346 #define ARG_X 0
347 #define ARG_Y 1
348 #define ARG_SCR 2
349 #define ARG_WIN 3
350 #define NUM_ARGS 4
352 static IPTR args[NUM_ARGS];
354 static void getarguments(void)
356 struct RDArgs *myargs;
358 if ((myargs = ReadArgs(ARG_TEMPLATE, args, NULL)))
360 if (args[ARG_SCR])
361 forcescreen = TRUE;
362 else if (args[ARG_WIN])
363 forcewindow = TRUE;
365 if (args[ARG_X]) winx = *(IPTR *)args[ARG_X];
366 if (args[ARG_Y]) winy = *(IPTR *)args[ARG_Y];
368 FreeArgs(myargs);
372 /***********************************************************************************/
374 static void openlibs(void)
376 if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 39)))
378 cleanup("Can't open intuition.library V39!");
381 if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 39)))
383 cleanup("Can't open graphics.library V39!");
386 if (!(CyberGfxBase = OpenLibrary("cybergraphics.library",0)))
388 cleanup("Can't open cybergraphics.library!");
393 /***********************************************************************************/
395 static void getvisual(void)
397 if (forcescreen)
398 wbscreen = FALSE;
400 if (!wbscreen)
402 scr = OpenScreenTags(NULL, SA_Width , W ,
403 SA_Height , H ,
404 SA_Depth , 8 ,
405 TAG_DONE);
406 if (!scr) cleanup("Failed to open specified screen!");
408 else if (!(scr = LockPubScreen(NULL)))
410 cleanup("Failed to lock pub screen (workbench)!");
413 truecolor = (GetBitMapAttr(scr->RastPort.BitMap, BMA_DEPTH) >= 15) ? TRUE : FALSE;
415 if ((!truecolor) && (wbscreen))
416 mustremap = TRUE;
419 /***********************************************************************************/
421 static void makewin(void)
423 struct TagItem winonwbtags[] =
425 {WA_DragBar , TRUE },
426 {WA_DepthGadget , TRUE },
427 {WA_CloseGadget , TRUE },
428 {WA_Title , (IPTR)"DawaFire" },
429 {TAG_DONE }
432 struct TagItem winonscrtags[] =
434 {WA_Borderless, TRUE },
435 {TAG_DONE }
438 if (winx == -1) winx = (scr->Width - W - scr->WBorLeft - scr->WBorRight) / 2;
439 if (winy == -1) winy = (scr->Height - H - scr->WBorTop - scr->WBorTop - scr->Font->ta_YSize - 1) / 2;
441 win = OpenWindowTags(NULL, WA_CustomScreen , (IPTR)scr,
442 WA_Left , winx,
443 WA_Top , winy,
444 WA_InnerWidth , W,
445 WA_InnerHeight , H,
446 WA_AutoAdjust , TRUE,
447 WA_Activate , TRUE,
448 WA_IDCMP , IDCMP_CLOSEWINDOW |
449 IDCMP_RAWKEY,
450 TAG_MORE , wbscreen ? winonwbtags : winonscrtags);
452 if (!win) cleanup("Can't open window");
454 rp = win->RPort;
457 /***********************************************************************************/
459 #define KC_LEFT 0x4F
460 #define KC_RIGHT 0x4E
461 #define KC_UP 0x4C
462 #define KC_DOWN 0x4D
463 #define KC_ESC 0x45
465 /***********************************************************************************/
467 static void getevents(void)
469 struct IntuiMessage *msg;
471 while ((msg = (struct IntuiMessage *)GetMsg(win->UserPort)))
473 switch(msg->Class)
475 case IDCMP_CLOSEWINDOW:
476 Keys[KC_ESC] = 1;
477 break;
479 case IDCMP_RAWKEY:
481 WORD code = msg->Code & ~IECODE_UP_PREFIX;
483 Keys[code] = (code == msg->Code) ? 1 : 0;
486 break;
489 ReplyMsg((struct Message *)msg);
494 /***********************************************************************************/
496 static void action(void)
498 initdawafire();
500 /* Init Particle */
502 firstparticle = NULL;
504 /* Init FPS */
506 //init_fps ();
508 while (!Keys[KC_ESC])
510 getevents();
512 refresh();
514 WaitTOF();
515 //next_fps();
518 /* Aff FPS */
520 //aff_fps (NAME);
524 /***********************************************************************************/
526 int main(void)
528 getarguments();
529 openlibs();
530 getvisual();
531 makewin();
532 action();
533 cleanup(0);
535 return 0;
538 /***********************************************************************************/