home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 February / Chip_2001-02_cd1.bin / bonus / demos / CS / exp / SOURCES / DEMO / EFEKT_03.CPP < prev    next >
C/C++ Source or Header  |  2000-08-17  |  8KB  |  350 lines

  1. /*
  2.  
  3. default efekt
  4.  
  5. return:
  6.   0 - doslo k chybe
  7.   1 - este nezacal
  8.   2 - prebehol v poriadku
  9.   3 - uz skoncil
  10. */
  11.  
  12. #include <iostream>
  13. #include <cstdlib>
  14. #include "api3ds.h"
  15. #include "efekt.h"
  16. #include "efekt_03.h"
  17. #include "syncs.h"
  18.  
  19. extern int sync_id;
  20.  
  21. float drnd(float o_d,float d_o)
  22. {
  23. if (d_o==0) return o_d;
  24. return o_d-d_o+0.02*(rand()%int(100*d_o));
  25. }
  26.  
  27. void setinvtarcam(CameraTarget3DS& cmr,TUNEL& tun,float p,float angle,float r)
  28. {
  29. INFO3D or=tun.getinfo(p+18);   //origin
  30. INFO3D tg=tun.getinfo(p+13); //target
  31.  
  32. float c=cos(angle)*r;
  33. float s=sin(angle)*r;
  34. or.pos=or.pos+c*or.v+s*or.n;
  35.  
  36. cmr.Origin((or.pos).x,(or.pos).y,(or.pos).z);
  37. cmr.Target((tg.pos).x,(tg.pos).y,(tg.pos).z);
  38. cmr.GL();
  39. }
  40.  
  41.  
  42. void settarcam(CameraTarget3DS& cmr,TUNEL& tun,float p,float angle,float r)
  43. {
  44. INFO3D or=tun.getinfo(p);   //origin
  45. INFO3D tg=tun.getinfo(p+5); //target
  46.  
  47. float c=cos(angle)*r;
  48. float s=sin(angle)*r;
  49. or.pos=or.pos+c*or.v+s*or.n;
  50.  
  51. cmr.Origin((or.pos).x,(or.pos).y,(or.pos).z);
  52. cmr.Target((tg.pos).x,(tg.pos).y,(tg.pos).z);
  53. cmr.GL();
  54. }
  55.  
  56. void setdesccam(CameraDescent3DS& cmr,TUNEL& tun,float p,float angle,float r)
  57. {
  58. INFO3D or=tun.getinfo(p);   //position
  59. INFO3D tg=tun.getinfo(p+2); //orientation
  60.  
  61. float c=cos(angle)*r;
  62. float s=sin(angle)*r;
  63. (or.pos).x=(or.pos).x+c*(or.v).x+s*(or.n).x;
  64. (or.pos).y=(or.pos).y+c*(or.v).y+s*(or.n).y;
  65. (or.pos).z=(or.pos).z+c*(or.v).z+s*(or.n).z;
  66.  
  67. cmr.SetAll( or.pos, tg.n, tg.v, tg.u);
  68. cmr.GL();
  69. }
  70.  
  71. void setinvdesccam(CameraDescent3DS& cmr,TUNEL& tun,float p,float angle,float r)
  72. {
  73. INFO3D or=tun.getinfo(p+18); //position
  74. INFO3D tg=tun.getinfo(p+16); //orientation
  75.  
  76. float c=cos(angle)*r;
  77. float s=sin(angle)*r;
  78. (or.pos).x=(or.pos).x+c*(or.v).x+s*(or.n).x;
  79. (or.pos).y=(or.pos).y+c*(or.v).y+s*(or.n).y;
  80. (or.pos).z=(or.pos).z+c*(or.v).z+s*(or.n).z;
  81.  
  82. cmr.SetAll( or.pos, -tg.n, -tg.v, -tg.u);
  83. cmr.GL();
  84. }
  85.  
  86.  
  87. void setlight(OmniLight3DS *l, TUNEL& tun, float po, float angle, float r)
  88. {
  89. INFO3D or=tun.getinfo(po);
  90.  
  91. float c=cos(angle)*r;
  92. float s=sin(angle)*r;
  93. (or.pos)=(or.pos)+c*(or.v)+s*(or.n);
  94. l->Position((or.pos).x,(or.pos).y,(or.pos).z);
  95. }
  96.  
  97.  
  98.  
  99. int  efekt_03::init()
  100. {
  101.     cout << "Efekt 03 init ... ";
  102.     start=TRUE;
  103.     counter=ZACIATOK03*refresh;
  104. //->init
  105.  
  106.     time=a1=a2=a3=d1=d2=d3=0.0;
  107.     campos=1.0;
  108.     nxt=2;
  109.     wav_counter=0.0;
  110.     wav_scale=0.0;
  111.  
  112.     fade=0.0;
  113.     fadeset=FALSE;
  114.     cnter=0;
  115.     waved=TRUE;
  116.  
  117.     obal.reset(outen,270);
  118.     obal.step=100;
  119.     obal.rgb(cout_r,cout_g,cout_b);
  120.  
  121.     transp.reset(inen,80);
  122.     transp.step=100;
  123.     transp.rgb(cin_r,cin_g,cin_b);
  124.     for (int i=0;i<TRLEN;i++)
  125.       {
  126.       transp.pridaj_obruc(1);
  127.       obal.pridaj_obruc(1);
  128.       }
  129.  
  130.     l1 = new OmniLight3DS;
  131.     l2 = new OmniLight3DS;
  132.     l1->LinearAttenuation(0.009);
  133.     l2->LinearAttenuation(0.009);
  134.     lgts+=l1;
  135.     lgts+=l2;
  136.  
  137.     ca.HorizontalFOV(PI/3);
  138.     ca.VerticalFOV(PI/4);
  139.     ca.FarClipplane(vis);
  140.     ca.NearClipplane(minvis);
  141.  
  142.     cam.HorizontalFOV(PI/3);
  143.     cam.VerticalFOV(PI/4);
  144.     cam.FarClipplane(vis);
  145.     cam.NearClipplane(minvis);
  146.  
  147. //<-
  148.     cout << "ok" << endl;
  149.     return 1;
  150. }
  151.  
  152. int  efekt_03::load()
  153. {
  154.     cout << "Loading efekt03 ... ";
  155. // -> load
  156.  
  157.     char texin_name[30];
  158.     char texout_name[30];
  159.  
  160.     FILE *stream;
  161.     
  162.     stream=fopen(CFGNAME03,"r");
  163.     if (!stream) return 0;
  164.     fscanf(stream,"camera speed         %f\n\n",&cam_speed);
  165.     fscanf(stream,"inner texture        %s\n",texin_name);
  166.     fscanf(stream,"inner tunel color    %f,%f,%f\n",&cin_r,&cin_g,&cin_b);
  167.     fscanf(stream,"steny in-tunela      %i\n\n",&inen);    
  168.     fscanf(stream,"outer texture        %s\n",texout_name);
  169.     fscanf(stream,"outer tunel color    %f,%f,%f\n",&cout_r,&cout_g,&cout_b);
  170.     fscanf(stream,"steny out-tunela     %i\n\n",&outen);    
  171.     fscanf(stream,"visibility           %f\n",&vis);
  172.     fscanf(stream,"minvisibility        %f\n",&minvis);
  173.     fclose(stream);
  174.  
  175.     texin=texture_library->GetOrCreate(texin_name);
  176.     texout=texture_library->GetOrCreate(texout_name);
  177.  
  178.    tunel_material1.Diffuse(cout_r,cout_g,cout_b);
  179.    tunel_material1.Texture1(texout);
  180.    tunel_material2.Diffuse(cin_r,cin_g,cin_b);
  181.    tunel_material2.Texture1(texin);
  182.  
  183. // <-
  184.     cout << "ok!"<<endl;
  185.     return 1;
  186. }
  187.  
  188. int  efekt_03::free()  //vrati 3 ako ok, 0 ak doslo k chybe
  189. {
  190.     end=true;
  191.     cout << "Efekt 08 free ... ";
  192. // -> free
  193.  
  194. // <-
  195.     cout << "ok!" << endl;
  196.     return 3;
  197. }
  198.  
  199. int  efekt_03::update()
  200. {
  201. if (fade<1.0) fade+=0.01;
  202.         else {fade=1.0;fadeset=true;}
  203.  
  204. id=Sync[GetSyncNum(float(counter)/float(refresh))].id;
  205. // -> update
  206. if (id>=SYNC_TUNEL_WAVING)
  207.   {
  208.   if(wav_scale<0.3) wav_scale+=0.01;
  209.   wav_counter-=0.2;
  210.   }
  211.  
  212.  
  213. campos+=cam_speed;
  214. if (id>=SYNC_TUNEL_3RD_CHANGE)
  215.   {
  216.   cnter++;
  217.   if ((cnter==60)&&(transp.en>3))
  218.     {
  219.     transp.en--;
  220.     cnter=0;
  221.     }
  222.   campos+=cam_speed;
  223.   wav_scale=0.15;
  224.   }
  225. if (campos>=nxt)
  226.   {
  227.   transp.pridaj_obruc(1);
  228.   obal.pridaj_obruc(1);
  229.   nxt++;
  230.   if (!time)
  231.     {
  232.     time=10+rand()%10;
  233.     d1=drnd(0,0.1);
  234.     d2=drnd(0,0.1);
  235.     d3=drnd(0,0.1);
  236.     }
  237.   (transp.t).Rotate(a1,a2,a3);
  238.   (obal.t).Rotate(a1,a2,a3);
  239.   if (a1>d1+0.01) a1-=0.01;
  240.   if (a2>d2+0.01) a2-=0.01;
  241.   if (a3>d3+0.01) a3-=0.01;
  242.   if (a1<d1-0.01) a1+=0.01;
  243.   if (a2<d2-0.01) a2+=0.01;
  244.   if (a3<d3-0.01) a3+=0.01;
  245.   time--;
  246.   }
  247. // <-
  248. return 1;
  249. }
  250.  
  251. int efekt_03::go(double t)
  252. {
  253. if (t<ZACIATOK03) return 1;
  254. if (end) return 3;
  255. if (counter>=KONIEC03*refresh) return free();
  256.  
  257. if (!start) if (!init()) return 0;
  258. int cur_frm=(int)(t*refresh);
  259. if (cur_frm>KONIEC03*refresh) cur_frm=int(KONIEC03*refresh);
  260. if (cur_frm>counter)
  261.   while (counter<cur_frm)
  262.     {
  263.     counter++;
  264.     if (counter<KONIEC03*refresh) update();
  265.     }
  266. if (counter>=KONIEC03*refresh) return free();
  267. //tu sa kresli->
  268.  
  269.   if (!fadeset)
  270.     {
  271.       tunel_material1.Diffuse(cout_r*fade,cout_g*fade,cout_b*fade);
  272.       tunel_material2.Diffuse(cin_r*fade,cin_g*fade,cin_b*fade);
  273.     }
  274.   if ((id==SYNC_TUNEL_WAVING)||(id==SYNC_TUNEL_2ND_CHANGE))
  275.     {
  276.     for (int i=0;i<TRLEN;i++)
  277.       {
  278.       float a=sin(  (i*4*PI/TRLEN)  +wav_counter*0.6);
  279.       float b=cos(  (i*5*PI/TRLEN)  +wav_counter*0.7);
  280.       (transp.data)->polomerx[i]=1.0+ wav_scale*a;
  281.       (transp.data)->polomery[i]=1.0+ wav_scale*b;
  282.       }
  283.     transp.rebuild();
  284.     }
  285.  
  286.   if (waved&&(id==SYNC_TUNEL_3RD_CHANGE))
  287.     {
  288.     for (int i=0;i<TRLEN;i++)
  289.       {
  290.       (transp.data)->polomerx[i]=1.0;
  291.       (transp.data)->polomerx[i]=1.0;
  292.       }
  293.     transp.rebuild();
  294.     waved=false;
  295.     }
  296.  
  297.  
  298.    if ((id==SYNC_TUNEL_WAVING)||(id==SYNC_TUNEL_3RD_CHANGE))
  299.          {
  300.  
  301.          tunel_material1.Diffuse(1.0F,1.0F,1.0F);
  302.          tunel_material2.Diffuse(1.9F,1.9F,0.9F);
  303.  
  304.          setinvtarcam(ca,transp,campos,0, 0);
  305. //        glFrontFace(GL_CW);
  306. //         setinvdesccam(cam,transp,campos,0, 0);
  307.          }
  308.       else
  309.          {
  310.          settarcam(ca,transp,campos,0, 0);
  311. //         setdesccam(cam,transp,campos,0, 0);
  312.          if (fadeset)
  313.            {
  314.            tunel_material1.Diffuse( cout_r, cout_g, cout_b);
  315.            tunel_material2.Diffuse( cin_r, cin_g, cin_b);
  316.            }
  317.  
  318.          }
  319.  
  320.    setlight(l1,transp,campos+3 , 0,40);
  321.    setlight(l2,transp,campos+10, 0, 0);
  322.    l1->Diffuse(0.55F, 0.55F, 0.30F);
  323.    l2->Diffuse(0.8F, 0.3F, 0.0F);
  324.  
  325.  
  326.    glEnable(GL_LIGHTING);
  327.    lgts.GL();
  328.  
  329.    tunel_material1.GL();
  330.    glEnable(GL_CULL_FACE);
  331.    glDepthMask(GL_ONE);  
  332.    glDisable(GL_BLEND);
  333.    obal.render();
  334.  
  335.    tunel_material2.GL();
  336.    glDisable(GL_CULL_FACE);
  337.    glEnable(GL_BLEND);
  338.    glBlendFunc(GL_ONE,GL_ONE);
  339.    glDepthMask(GL_ZERO);
  340.  
  341.    transp.render();
  342.  
  343.    glDepthMask(GL_ONE);  
  344.    glDisable(GL_BLEND);
  345.  
  346.  
  347. //   glFrontFace(GL_CCW);
  348. //<-
  349. return 2;
  350. }