home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / dev / misc / MC.lha / MC / mc_Plasma.c < prev    next >
C/C++ Source or Header  |  1995-11-06  |  7KB  |  300 lines

  1. /******************************************************************************
  2. **                                         **
  3. ** MultiColor-Demo-Plasma                             **
  4. **                                         **
  5. **---------------------------------------------------------------------------**
  6. ** V2.0 vom 01.10.95                                 **
  7. ******************************************************************************/
  8.  
  9. #include "sc:source/mc/multicolor.h"
  10.  
  11. /* Protos */
  12.  
  13. void OpenAll(void);
  14. void CloseAll(void);
  15. void Plasma(int frac);
  16. void Usage(void);
  17. /* defines */
  18.  
  19. extern struct ExecBase        *SysBase;
  20. struct IntuitionBase        *IntuitionBase=0l;
  21. struct GfxBase                *GfxBase=0l;
  22. struct Screen                *scr=0l;
  23. struct Window                *win=0l;
  24. MCHandle                    *mch=0l;
  25.  
  26. struct TagItem scrtags[]={
  27.     SA_Left,        0,
  28.     SA_Top,         0,
  29.     SA_Width,        0,
  30.     SA_Height,        0,
  31.     SA_Depth,        0,
  32.     SA_Colors,        0l,
  33.     SA_Type,        CUSTOMSCREEN,
  34.     SA_DisplayID,    PAL_MONITOR_ID,
  35.     TAG_DONE
  36. };
  37.  
  38. struct TagItem wintags[]={
  39.     WA_Left,        0,
  40.     WA_Top,         0,
  41.     WA_Width,        0,
  42.     WA_Height,        0,
  43.     WA_IDCMP,        IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY,
  44.     WA_Flags,        WFLG_SMART_REFRESH|WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_ACTIVATE,
  45.     WA_CustomScreen,0l,
  46.     TAG_DONE
  47. };
  48.  
  49. /* Funktions */
  50.  
  51. void OpenAll(void)
  52. {
  53. //    if(!(IntuitionBase=OpenLibrary("intuition.library",37))) CloseAll();
  54.     if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",39))) CloseAll();
  55.     if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37))) CloseAll();
  56.  
  57.     if(!(scr=OpenScreenTagList(0l,scrtags))) CloseAll();
  58.     wintags[6].ti_Data=(ULONG)scr;
  59.  
  60.     if(!(win=OpenWindowTagList(0l,wintags))) CloseAll();
  61. }
  62.  
  63. void CloseAll(void)
  64. {
  65.     if(win)                 CloseWindow(win);
  66.     if(scr)                 CloseScreen(scr);
  67.     if(GfxBase)             CloseLibrary((struct Library *)GfxBase);
  68.     if(IntuitionBase)       CloseLibrary((struct Library *)IntuitionBase);
  69.     exit(0);
  70. }
  71.  
  72. void Plasma(int ifrac)
  73. {
  74.     struct IntuiMessage *imsg;
  75.     ULONG iclass;
  76.     USHORT icode;
  77.     register UBYTE quit=0;
  78.     MCPoint akt,c1,c3,c5,c7,c9;
  79.     UWORD f[300][4],dimx,dimy;
  80.     WORD ptr=0;
  81.     UWORD x1,x2,x3,y1,y2,y3;
  82.     ULONG rndf;
  83.     ULONG xyres;
  84.  
  85.     xyres = mch->xres*mch->yres;
  86.  
  87.     srand48(time(NULL));                    /* init the random-number-generator */
  88.     f[0][0]=0;f[0][1]=0;f[0][2]=mch->xres-1;f[0][3]=mch->yres-1;
  89.  
  90.     /* akt.r=drand48();akt.g=drand48();akt.b=drand48(); */
  91.     akt.r=rand()&0xFF;akt.g=rand()&0xFF;akt.b=rand()&0xFF;
  92.     MC_PutPixel(mch,0,0,&akt);
  93.     akt.r=rand()&0xFF;akt.g=rand()&0xFF;akt.b=rand()&0xFF;
  94.     MC_PutPixel(mch,mch->xres-1,0,&akt);
  95.     akt.r=rand()&0xFF;akt.g=rand()&0xFF;akt.b=rand()&0xFF;
  96.     MC_PutPixel(mch,mch->xres-1,mch->yres-1,&akt);
  97.     akt.r=rand()&0xFF;akt.g=rand()&0xFF;akt.b=rand()&0xFF;
  98.     MC_PutPixel(mch,0,mch->xres-1,&akt);
  99.     while(ptr>-1)
  100.     {
  101.     dimx=f[ptr][2]-f[ptr][0];
  102.     dimy=f[ptr][3]-f[ptr][1];
  103.     if(dimx>1 || dimy>1)
  104.     {
  105.         rndf=(dimx*dimy)*ifrac/xyres;
  106.         x1=f[ptr][0];x3=f[ptr][2];x2=x1+((x3-x1)>>1);
  107.         y1=f[ptr][1];y3=f[ptr][3];y2=y1+((y3-y1)>>1);
  108.         MC_GetPixel(mch,x1,y1,&c1);
  109.         MC_GetPixel(mch,x3,y1,&c3);
  110.         MC_GetPixel(mch,x3,y3,&c9);
  111.         MC_GetPixel(mch,x1,y3,&c7);
  112.  
  113.         c5.r=((c1.r+c3.r+c7.r+c9.r)/4+(int)(rndf*(128-(rand()&0xFF))))&0xFF;
  114.         c5.g=((c1.g+c3.g+c7.g+c9.g)/4+(int)(rndf*(128-(rand()&0xFF))))&0xFF;
  115.         c5.b=((c1.b+c3.b+c7.b+c9.b)/4+(int)(rndf*(128-(rand()&0xFF))))&0xFF;
  116.         MC_PutPixel(mch,x2,y2,&c5);
  117.         MC_GetPixel(mch,x2,y1,&akt);
  118.         if(akt.r==0 && akt.g==0 && akt.b==0)
  119.         {
  120.         akt.r=(c1.r+c3.r+c5.r)/3;
  121.         akt.g=(c1.g+c3.g+c5.g)/3;
  122.         akt.b=(c1.b+c3.b+c5.b)/3;
  123.         MC_PutPixel(mch,x2,y1,&akt);
  124.         }
  125.         MC_GetPixel(mch,x1,y2,&akt);
  126.         if(akt.r==0 && akt.g==0 && akt.b==0)
  127.         {
  128.         akt.r=(c1.r+c7.r+c5.r)/3;
  129.         akt.g=(c1.g+c7.g+c5.g)/3;
  130.         akt.b=(c1.b+c7.b+c5.b)/3;
  131.         MC_PutPixel(mch,x1,y2,&akt);
  132.         }
  133.         MC_GetPixel(mch,x3,y2,&akt);
  134.         if(akt.r==0 && akt.g==0 && akt.b==0)
  135.         {
  136.         akt.r=(c3.r+c9.r+c5.r)/3;
  137.         akt.g=(c3.g+c9.g+c5.g)/3;
  138.         akt.b=(c3.b+c9.b+c5.b)/3;
  139.         MC_PutPixel(mch,x3,y2,&akt);
  140.         }
  141.         MC_GetPixel(mch,x2,y3,&akt);
  142.         if(akt.r==0 && akt.g==0 && akt.b==0)
  143.         {
  144.         akt.r=(c7.r+c9.r+c5.r)/3;
  145.         akt.g=(c7.g+c9.g+c5.g)/3;
  146.         akt.b=(c7.b+c9.b+c5.b)/3;
  147.         MC_PutPixel(mch,x2,y3,&akt);
  148.         }
  149.         f[ptr][2]=x2;f[ptr][3]=y2;ptr++;
  150.         f[ptr][0]=x2;f[ptr][1]=y1;f[ptr][2]=x3;f[ptr][3]=y2;ptr++;
  151.         f[ptr][0]=x2;f[ptr][1]=y2;f[ptr][2]=x3;f[ptr][3]=y3;ptr++;
  152.         f[ptr][0]=x1;f[ptr][1]=y2;f[ptr][2]=x2;f[ptr][3]=y3;
  153.         if(ptr>250)
  154.         {
  155.         printf("stack overflow\n");
  156.         ptr=-1;
  157.         }
  158.     }
  159.     else
  160.     {
  161.         ptr--;
  162.     }
  163.  
  164.     if(imsg=(struct IntuiMessage *)GetMsg(win->UserPort))
  165.     {
  166.         ReplyMsg((struct Message *)imsg);
  167.         quit=1;
  168.         break;
  169.     }
  170.     }
  171.  
  172.     while(!quit)
  173.     {
  174.     WaitPort(win->UserPort);
  175.     while(imsg=(struct IntuiMessage *)GetMsg(win->UserPort))
  176.     {
  177.         iclass  =imsg->Class;
  178.         icode   =imsg->Code;
  179.         ReplyMsg ((struct Message *)imsg);
  180.         switch(iclass)
  181.         {
  182.         case IDCMP_RAWKEY:
  183.         switch(icode)
  184.         {
  185.         case 0x45:        /* ESC */
  186.         case 0x40:        /* Space */
  187.             quit=1;
  188.             break;
  189.         }
  190.         break;
  191.         }
  192.     }
  193.     }
  194. }
  195.  
  196. void Usage(void)
  197. {
  198.     printf("Usage \n");
  199.     printf("\tmc_plasma typ res chaos\n");
  200.     printf("\tres\\typ | 0=ECS | 1=AGA,GFX-Card\n");
  201.     printf("\t--------+-------+---------------\n");
  202.     printf("\t e (ehb)| 64    | -             \n");
  203.     printf("\t l (low)| 32    | 256           \n");
  204.     printf("\t h (hi )| 16    | 256           \n");
  205.     printf("\t s (shi)| --    | 256           \n");
  206.     printf("\t--------+-------+---------------\n");
  207.     printf("\n\tchaos smothness\n");
  208. }
  209.  
  210. void main(int argc,char *argv[])
  211. {
  212.     UBYTE dep,typ,fail=0;
  213.     char res;
  214.     int frac=20;
  215.  
  216.     if(argc>=3)
  217.     {
  218.     if(argc==4) frac=atoi(argv[3]);
  219.     typ=atoi(argv[1])&1;
  220.     res=argv[2][0];
  221.  
  222.     switch(typ)
  223.     {
  224.     case 0:     /* ECS */
  225.         switch(res)
  226.         {
  227.         case 'E':
  228.         case 'e':
  229.         scrtags[4].ti_Data=dep=6;
  230.         wintags[2].ti_Data=scrtags[2].ti_Data=354;        /* 236 */
  231.         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  232.         scrtags[7].ti_Data|=EXTRAHALFBRITELACE_KEY;
  233.         break;
  234.         case 'L':
  235.         case 'l':
  236.         scrtags[4].ti_Data=dep=5;
  237.         wintags[2].ti_Data=scrtags[2].ti_Data=354;        /* 236 */
  238.         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  239.         scrtags[7].ti_Data|=LORESLACE_KEY;
  240.         break;
  241.         case 'H':
  242.         case 'h':
  243.         scrtags[4].ti_Data=dep=4;
  244.         wintags[2].ti_Data=scrtags[2].ti_Data=708;        /* 472 */
  245.         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  246.         scrtags[7].ti_Data|=HIRESLACE_KEY;
  247.         break;
  248.         case 'S':
  249.         case 's':
  250.         fail=1;
  251.         break;
  252.         }
  253.         break;
  254.     case 1:     /* AGA,GFX-Card */
  255.         switch(res)
  256.         {
  257.         case 'E':
  258.         case 'e':
  259.         fail=1;
  260.         break;
  261.         case 'L':
  262.         case 'l':
  263.         scrtags[4].ti_Data=dep=8;
  264.         wintags[2].ti_Data=scrtags[2].ti_Data=354;        /* 236 */
  265.         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  266.         scrtags[7].ti_Data|=LORESLACE_KEY;
  267.         break;
  268.         case 'H':
  269.         case 'h':
  270.         scrtags[4].ti_Data=dep=8;
  271.         wintags[2].ti_Data=scrtags[2].ti_Data=708;        /* 472 */
  272.         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  273.         scrtags[7].ti_Data|=HIRESLACE_KEY;
  274.         break;
  275.         case 'S':
  276.         case 's':
  277.         scrtags[4].ti_Data=dep=8;
  278.         wintags[2].ti_Data=scrtags[2].ti_Data=1416;        /* 944 */
  279.         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  280.         scrtags[7].ti_Data|=SUPERLACE_KEY;
  281.         break;
  282.         }
  283.         break;
  284.     }
  285.  
  286.     if(!fail)
  287.     {
  288.         OpenAll();
  289.         if(mch=MC_Init(scr,win,dep))
  290.         {
  291.         Plasma(frac);
  292.         MC_Free(mch);
  293.         }
  294.     }
  295.     else Usage();
  296.     }
  297.     else Usage();
  298.     CloseAll();
  299. }
  300.