home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / commodities / superdark / blankers / anim.dark.c < prev    next >
C/C++ Source or Header  |  1993-03-20  |  10KB  |  410 lines

  1.  /* Fichier star.dark.c                */
  2. /* Module appele par le programme principal    */
  3. /* pour effectuer un effet defini..appele par    */
  4. /* loadseg                    */
  5.  
  6. #include <time.h>
  7. #include <exec/types.h>
  8. #include <intuition/intuition.h>
  9. #include <intuition/gadgetclass.h>
  10. #include <graphics/gfx.h>
  11. #include <graphics/gfxmacros.h>
  12. #include <graphics/rastport.h>
  13. #include <graphics/displayinfo.h>
  14. #include <graphics/gfxbase.h>
  15. #include <clib/exec_protos.h>
  16. #include <clib/intuition_protos.h>
  17. #include <clib/gadtools_protos.h>
  18. #include    "/includes/struct.h"
  19. #include    "/includes/tom_gadget.h"
  20.  
  21. char    p_ver[]="$VER: Anim v1.2 (20/03/93)";
  22.  
  23. char    *p_text_info="   anim\n\nThis effect just show you\na 3d object on screen\nbut this effect is still\nin developement!\n\nBy Thomas Landspurg";
  24.  
  25. UBYTE         *TypeLabels[] = {
  26.     "Computer",
  27.     "Logo commodore",
  28.     0l };
  29.  
  30.  
  31. struct tom_gadget my_gadg[]={
  32.     {"_Object",    MX,    167,14,17,20,0, 0,0,0,(char *)TypeLabels},
  33.     {0,        END_LISTE,  0,  0,   0, 0, 0,0,0,0,0}
  34. };
  35. extern    struct    GfxBase    *GfxBase;
  36.  
  37. #define    DEPTH    1
  38. #define    WIDTH    320
  39. #define    HEIGHT    256
  40. #define    MAX_PT    100
  41.  
  42. UWORD    ColorTable[]={0,0xf0};
  43. extern    struct    Screen        *s;
  44. extern    struct    RastPort    *rp;
  45.  
  46. typedef    struct    pt{
  47.     int    x,y,z;
  48. };
  49. typedef    struct    line{
  50.     int    deb,fin;
  51. };
  52. typedef    struct    pt_2d{
  53.     int    x,y;
  54. };
  55. typedef    struct    obj{
  56.     int    nb_pt;            /* Nombre de pt de l'element    */
  57.     int    nb_lines;        /* nombre de lignes        */
  58.     int    ax,ay,az;        /* Angles relatifs        */
  59.     int    cx,cy,cz;        /* Deplacements relatifs    */
  60.     struct    pt    *p_pt;        /* tableau des pts de l'elem    */
  61.     struct    line    *p_lines;    /* tableau des lignes        */
  62. };
  63.  
  64.  
  65. struct    pt pt_comm[]={
  66.     {40,-20,10},{-10,-20,10},{-20,-10,10},
  67.     {-20,10,10},{-10, 20,10},{ 40, 20,10},
  68.     {25, 10,10},{10,10,10},  {10,35,10},
  69.     {-15,35,10},{-35,20,10},{-35,-20,10},
  70.     {-15,-35,10},{10,-35,10},{10,-10,10},{25,-10,10},
  71.  
  72.     {40,-20,-10},{-10,-20,-10},{-20,-10,-10},
  73.     {-20,10,-10},{-10, 20,-10},{ 40, 20,-10},
  74.     {25, 10,-10},{10,10,-10},  {10,35,-10},
  75.     {-15,35,-10},{-35,20,-10},{-35,-20,-10},
  76.     {-15,-35,-10},{10,-35,-10},{10,-10,-10},{25,-10,-10}
  77.  
  78.     };
  79. struct    line    lines_comm[]={
  80.     {0,1},{1,2},{2,3},{3,4},{4,5},{5,6},{6,7},{7,8},{8,9},{9,10},{10,11},
  81.     {11,12},{12,13},{13,14},{14,15},{15,0},
  82.     {16,17},{17,18},{18,19},{19,20},{20,21},{21,22},{22,23},{23,24},{24,25},
  83.     {25,26},{26,27},{27,28},{28,29},{29,30},{30,31},{31,16},
  84.     {0,16},{5,21},{6,22},{7,23},{14,30},{15,31},
  85.     {8,24},{13,29},{10,26},{11,27}
  86.     
  87.     };
  88. struct    obj    logo_comm={32,32+10,0,0,0,0,0,0,pt_comm,lines_comm};
  89.  
  90. struct    pt pt_corps[]={
  91.     {-20, 20,-20},{ 20, 20,-20},{ 20,-20,-20},{-20,-20,-20},
  92.     {-20, 20, 20},{ 20, 20, 20},{ 20,-20, 20},{-20,-20, 20},
  93.     {-28,-30,20},{28,-30,20},{30,-40,40},{-30,-40,40},
  94.     {-28,-30,10},{28,-30,10},{30,-40,10},{-30,-40,10},
  95.  
  96.     {10,-5,10},{5,-10,10},{-10,10,10},
  97.     {7,-3,10},{4,-6,10},
  98.     {1,-7,10},{-2,-10,10},{-13,5,10}
  99.     };
  100. struct    line    lines_corps[]={
  101.     {0,1},{1,2},{2,3},{3,0},
  102.     {4,5},{5,6},{6,7},{7,4},
  103.     {0,4},{1,5},{2,6},{3,7},
  104.     {8,9},{9,10},{10,11},{11,8},
  105.     {12,13},{13,14},{14,15},{15,12},
  106.     {8,12},{9,13},{10,14},{11,15},
  107.  
  108.     {16,17},{17,18},{19,20},{21,22},{22,23}
  109.     };
  110. struct    obj    corp={24,29,0,0,0,0,0,0,pt_corps,lines_corps};
  111.  
  112. int    de=300;    /* distance de l'ecran a l'observateur */
  113. int    d=600;    /* distance de l'observateur au pt 0   */
  114.  
  115.  
  116.     /* tables de sinus et cosinus */
  117. int    t_cos[360]={
  118.  
  119. 256,255,255,255,255,255,254,254,
  120. 253,252,252,251,250,249,248,247,
  121. 246,244,243,242,240,238,237,235,
  122. 233,232,230,228,226,223,221,219,
  123. 217,214,212,209,207,204,201,198,
  124. 196,193,190,187,184,181,177,174,
  125. 171,167,164,161,157,154,150,146,
  126. 143,139,135,131,127,124,120,116,
  127. 112,108,104,100,95,91,87,83,
  128. 79,74,70,66,61,57,53,48,
  129. 44,40,35,31,26,22,17,13,
  130. 8,4,0,-4,-8,-13,-17,-22,
  131. -26,-31,-35,-40,-44,-48,-53,-57,
  132. -61,-66,-70,-74,-79,-83,-87,-91,
  133. -95,-100,-104,-108,-112,-116,-120,-124,
  134. -128,-131,-135,-139,-143,-146,-150,-154,
  135. -157,-161,-164,-167,-171,-174,-177,-181,
  136. -184,-187,-190,-193,-196,-198,-201,-204,
  137. -207,-209,-212,-214,-217,-219,-221,-223,
  138. -226,-228,-230,-232,-233,-235,-237,-238,
  139. -240,-242,-243,-244,-246,-247,-248,-249,
  140. -250,-251,-252,-252,-253,-254,-254,-255,
  141. -255,-255,-255,-255,-256,-255,-255,-255,
  142. -255,-255,-254,-254,-253,-252,-252,-251,
  143. -250,-249,-248,-247,-246,-244,-243,-242,
  144. -240,-238,-237,-235,-233,-232,-230,-228,
  145. -226,-223,-221,-219,-217,-214,-212,-209,
  146. -207,-204,-201,-198,-196,-193,-190,-187,
  147. -184,-181,-177,-174,-171,-167,-164,-161,
  148. -157,-154,-150,-146,-143,-139,-135,-131,
  149. -127,-124,-120,-116,-112,-108,-104,-100,
  150. -95,-91,-87,-83,-79,-74,-70,-66,
  151. -61,-57,-53,-48,-44,-40,-35,-31,
  152. -26,-22,-17,-13,-8,-4,0,4,
  153. 8,13,17,22,26,31,35,40,
  154. 44,48,53,57,61,66,70,74,
  155. 79,83,87,91,95,100,104,108,
  156. 112,116,120,124,128,131,135,139,
  157. 143,146,150,154,157,161,164,167,
  158. 171,174,177,181,184,187,190,193,
  159. 196,198,201,204,207,209,212,214,
  160. 217,219,221,223,226,228,230,232,
  161. 233,235,237,238,240,242,243,244,
  162. 246,247,248,249,250,251,252,252,
  163. 253,254,254,255,255,255,255,255};
  164.  
  165. int    t_sin[360]={
  166. 0,4,8,13,17,22,26,31,
  167. 35,40,44,48,53,57,61,66,
  168. 70,74,79,83,87,91,95,100,
  169. 104,108,112,116,120,124,128,131,
  170. 135,139,143,146,150,154,157,161,
  171. 164,167,171,174,177,181,184,187,
  172. 190,193,196,198,201,204,207,209,
  173. 212,214,217,219,221,223,226,228,
  174. 230,232,233,235,237,238,240,242,
  175. 243,244,246,247,248,249,250,251,
  176. 252,252,253,254,254,255,255,255,
  177. 255,255,256,255,255,255,255,255,
  178. 254,254,253,252,252,251,250,249,
  179. 248,247,246,244,243,242,240,238,
  180. 237,235,233,232,230,228,226,223,
  181. 221,219,217,214,212,209,207,204,
  182. 201,198,196,193,190,187,184,181,
  183. 177,174,171,167,164,161,157,154,
  184. 150,146,143,139,135,131,127,124,
  185. 120,116,112,108,104,100,95,91,
  186. 87,83,79,74,70,66,61,57,
  187. 53,48,44,40,35,31,26,22,
  188. 17,13,8,4,0,-4,-8,-13,
  189. -17,-22,-26,-31,-35,-40,-44,-48,
  190. -53,-57,-61,-66,-70,-74,-79,-83,
  191. -87,-91,-95,-100,-104,-108,-112,-116,
  192. -120,-124,-128,-131,-135,-139,-143,-146,
  193. -150,-154,-157,-161,-164,-167,-171,-174,
  194. -177,-181,-184,-187,-190,-193,-196,-198,
  195. -201,-204,-207,-209,-212,-214,-217,-219,
  196. -221,-223,-226,-228,-230,-232,-233,-235,
  197. -237,-238,-240,-242,-243,-244,-246,-247,
  198. -248,-249,-250,-251,-252,-252,-253,-254,
  199. -254,-255,-255,-255,-255,-255,-256,-255,
  200. -255,-255,-255,-255,-254,-254,-253,-252,
  201. -252,-251,-250,-249,-248,-247,-246,-244,
  202. -243,-242,-240,-238,-237,-235,-233,-232,
  203. -230,-228,-226,-223,-221,-219,-217,-214,
  204. -212,-209,-207,-204,-201,-198,-196,-193,
  205. -190,-187,-184,-181,-177,-174,-171,-167,
  206. -164,-161,-157,-154,-150,-146,-143,-139,
  207. -135,-131,-128,-124,-120,-116,-112,-108,
  208. -104,-100,-95,-91,-87,-83,-79,-74,
  209. -70,-66,-61,-57,-53,-48,-44,-40,
  210. -35,-31,-26,-22,-17,-13,-8,-4
  211. };
  212.  
  213. /********************* Rotation dans le plan ************/
  214. void    rot(angle,p_x,p_y)
  215. int    angle,*p_x,*p_y;
  216. {
  217.     int    x,y;
  218.     x= (*p_x)*t_cos[angle]+(*p_y)*t_sin[angle];
  219.     y=-(*p_x)*t_sin[angle]+(*p_y)*t_cos[angle];
  220.  
  221.     *p_x=x>>8;
  222.     *p_y=y>>8;
  223. }
  224. /***************** Calcul de la projection 3D->2D ******/
  225. void    calc_coord(p_pt,p_x,p_y)
  226. struct    pt    *p_pt;
  227. int    *p_x,*p_y;
  228. {
  229.     if(d+p_pt->z!=NULL){
  230.         *p_x= WIDTH/2+(p_pt->x*de)/(d+p_pt->z);
  231.         *p_y=HEIGHT/2-(p_pt->y*de)/(d+p_pt->z);
  232.     }
  233. }
  234. /************** Affichage de l'objet ******************/
  235.  
  236. void    AffObj(rp,p_obj,ax,ay,az,ox,oy,oz,old_pt)
  237. struct    RastPort    *rp;
  238. struct    obj    *p_obj;
  239. int    ax,ay,az;
  240. int    ox,oy,oz;
  241. struct    pt_2d    *old_pt;
  242. {
  243.     int    i;
  244.     struct    line    *p_lines;
  245.     struct    pt    *p_pt,pt_cour;
  246.     int    cx,cy,cz,deb,fin;
  247.     struct    pt_2d    tab_pt[MAX_PT];
  248.  
  249.     /* Calcul du point de depart */
  250.     cx=4*p_obj->cx;
  251.     cy=4*p_obj->cy;
  252.     cz=4*p_obj->cz;
  253.     
  254.     rot(az,&cx,&cy);
  255.     rot(ax,&cy,&cz);
  256.     rot(ay,&cz,&cx);
  257.  
  258.     /* nouveau angles de rotation */
  259.     p_pt=p_obj->p_pt;
  260.     ax=((360+ax+p_obj->ax))%360;
  261.     ay=((360+ay+p_obj->ay))%360;
  262.     az=((360+az+p_obj->az))%360;
  263.  
  264.     /* rotation et passage 3d/2D pour tt les points */
  265.     for(i=0;i<p_obj->nb_pt;i++){
  266.         pt_cour.x=4*(p_pt->x);
  267.         pt_cour.y=4*(p_pt->y);
  268.         pt_cour.z=4*(p_pt->z);
  269.         rot(az,&pt_cour.x,&pt_cour.y);
  270.         rot(ax,&pt_cour.y,&pt_cour.z);
  271.         rot(ay,&pt_cour.z,&pt_cour.x);
  272.         pt_cour.x+=cx+ox;
  273.         pt_cour.y+=cy+oy;
  274.         pt_cour.z+=cz+oz;
  275.         calc_coord(&pt_cour,&tab_pt[i].x,&tab_pt[i].y);
  276.         p_pt++;
  277.     }
  278.     p_pt=p_obj->p_pt;
  279.     p_lines=p_obj->p_lines;
  280.     /* affichage des lignes */
  281.     for(i=0;i<p_obj->nb_lines;i++){
  282.         deb=p_lines->deb;
  283.         if(deb>=0){
  284.             Move(rp,tab_pt[deb].x,tab_pt[deb].y);
  285.         }else{
  286.             if(deb==-MAX_PT)deb=0;
  287.             Move(rp,old_pt[-deb].x,old_pt[-deb].y);
  288.         }
  289.         fin=p_lines->fin;
  290.         if(fin>=0){
  291.             Draw(rp,tab_pt[fin].x,tab_pt[fin].y);
  292.         }else{
  293.             if(fin==-MAX_PT)fin=0;
  294.             Draw(rp,old_pt[-fin].x,old_pt[-fin].y);
  295.         }
  296.         p_lines++;
  297.     }
  298. }
  299. /************** Programme principal ********************************/
  300. void    __saveds    dark()
  301. {
  302.     int    i,dir;
  303.     struct    RasInfo    ri;
  304.     struct    BitMap    b1,b2,*b;
  305.     struct ViewPort vp;
  306.     struct    View    v,*oldview;
  307.     struct RastPort rp1,rp2,*rp;
  308.     struct    obj    *p_obj;
  309.      int    flg_err;
  310.     oldview=((struct GfxBase *)GfxBase)->ActiView;
  311.  
  312.     InitView(&v);
  313.     v.ViewPort=&vp;
  314.  
  315.     InitVPort(&vp);
  316.     vp.DWidth=WIDTH;
  317.     vp.DHeight=HEIGHT;
  318.     vp.RasInfo=&ri;
  319.     vp.ColorMap=(struct    ColorMap *)GetColorMap(1<<DEPTH);
  320.     
  321.     flg_err=FALSE;
  322.     InitBitMap(&b1,DEPTH,WIDTH,HEIGHT);
  323.     InitBitMap(&b2,DEPTH,WIDTH,HEIGHT);
  324.     for(i=0;i<DEPTH;i++){
  325.         b1.Planes[i]=(PLANEPTR)AllocRaster(WIDTH,HEIGHT);
  326.         if(b1.Planes[i]==0){
  327.             flg_err=TRUE;
  328.         }
  329.         b2.Planes[i]=(PLANEPTR)AllocRaster(WIDTH,HEIGHT);
  330.         if(b2.Planes[i]==0){
  331.             flg_err=TRUE;
  332.         }
  333.     }
  334.     InitRastPort(&rp1);
  335.     InitRastPort(&rp2);
  336.     rp1.BitMap=&b1;
  337.     rp2.BitMap=&b2;
  338.     ri.BitMap=&b1;
  339.     ri.RxOffset=0;
  340.     ri.RyOffset=0;
  341.     ri.Next=NULL;
  342.     LoadRGB4(&vp,ColorTable,1<<DEPTH);
  343.  
  344.     FreeSprite (0);
  345.     GfxBase->SpriteReserved|=1;
  346.     dir=2;
  347.     switch(my_gadg[0].value){
  348.         case 0:
  349.             p_obj=&corp;
  350.             break;
  351.         case 1:
  352.         default:
  353.             p_obj=&logo_comm;
  354.             break;
  355.     }
  356.     p_obj->cz=2000;
  357.     while((tst_end()==FALSE)&&(flg_err==FALSE)){
  358.         i++;
  359.         if(p_obj->cz>0)p_obj->cz-=10;
  360.         if((i%2)==1){
  361.             b=&b1;
  362.             rp=&rp1;
  363.         }else{
  364.             b=&b2;
  365.             rp=&rp2;
  366.         }
  367.         SetRast(rp,0);
  368.  
  369.         SetAPen(rp,1);
  370.  
  371.         /* affichage de l'objet */
  372.         AffObj(rp,p_obj,0,0,0,0,0,100,NULL);
  373.  
  374.         /* Calcul du mvt des ailes */
  375.         p_obj->ay+=1;
  376.  
  377.         ri.BitMap=b;
  378.         MakeVPort(&v,&vp);
  379.         MrgCop(&v);
  380.         LoadView(&v);
  381.  
  382.         WaitTOF();
  383.  
  384.     }    
  385. cleanup3:
  386.     for(i=0;i<DEPTH;i++){
  387.         if(b1.Planes[i]!=0){
  388.             FreeRaster(b1.Planes[i],WIDTH,HEIGHT);
  389.         }
  390.         if(b2.Planes[i]!=0){
  391.             FreeRaster(b2.Planes[i],WIDTH,HEIGHT);
  392.         }
  393.     }
  394.     LoadView(oldview);
  395.     FreeColorMap(vp.ColorMap);
  396.     FreeVPortCopLists(&vp);
  397.     FreeCprList(v.LOFCprList);
  398. }
  399.  
  400. void    proc_init()
  401. {
  402. }
  403. void    proc_save()
  404. {
  405. }
  406. void    proc_end()
  407. {
  408. }
  409.  
  410.