home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Edition 11 / FreelogHS11.iso / Démos&Merveilles / Expiration / SOURCES / DEMO / EFEKT_17.CPP < prev    next >
C/C++ Source or Header  |  2000-08-20  |  5KB  |  186 lines

  1. /*
  2.  
  3. twirl
  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 "api3ds.h"
  14. #include "efekt.h"
  15. #include "efekt_17.h"
  16. #include "syncs.h"
  17.  
  18. extern int sync_id;
  19.  
  20. int  efekt_17::init()
  21. {
  22.     cout << "Efekt 17 init ... ";
  23.     start=TRUE;
  24.     counter=ZACIATOK17*refresh;
  25. //->init
  26.     cntr=0;
  27.     clr=1.0;
  28. //<-
  29.     cout << "ok" << endl;
  30.     return 1;
  31. }
  32.  
  33. int  efekt_17::load()
  34. {
  35.     cout << "Loading efekt17 ... ";
  36. // -> load
  37.  
  38.     FILE *stream; 
  39.     stream=fopen(CFGNAME17,"r");
  40.     if (!stream) return 0;
  41.     fscanf(stream,"texture              %s\n",tex_name);
  42.     fscanf(stream,"mriezka              %i x %i\n",&tw_x,&tw_y);
  43.     fscanf(stream,"otacaci bod          %i\n",&mode1);
  44.     fscanf(stream,"stred otacania       %i\n",&mode2);
  45.     fscanf(stream,"polomer              %f\n",&polomer);
  46.     fscanf(stream,"otocenie             %f\n",&otocenie);
  47.     fclose(stream);
  48.  
  49.   for (int x=0;x<tw_x;x++)
  50.     for (int y=0;y<tw_y;y++)
  51.       {
  52.       tw.posx[x][y]=-1.0+x*(2.0/(tw_x-1));
  53.       tw.posy[x][y]=-1.0+y*(2.0/(tw_y-1));
  54.  
  55.       tw.texx[x][y]=float(x)/(tw_x-1);
  56.       tw.texy[x][y]=float(y)/(tw_y-1);
  57.       }
  58.  
  59.    tex=texture_library->GetOrCreate(tex_name);
  60.  
  61. // <-
  62.     cout << "ok!"<<endl;
  63.     return 1;
  64. }
  65.  
  66. int  efekt_17::free()  //vrati 3 ako ok, 0 ak doslo k chybe
  67. {
  68.     end=true;
  69.     cout << "Efekt 17 free ... ";
  70. // -> free
  71.  
  72. // <-
  73.     cout << "ok!" << endl;
  74.     return 3;
  75. }
  76.  
  77. int  efekt_17::update()
  78. {
  79.     id=Sync[GetSyncNum(float(counter)/float(refresh))].id;
  80. // -> update
  81.     if (counter/refresh>157.0) 
  82.       {
  83.       if (clr>0.0) clr-=0.005;
  84.               else clr=0.0;
  85.       }
  86.     if (counter/refresh>157.0) cntr+=2;
  87. // <-
  88.     return 1;
  89. }
  90.  
  91. int efekt_17::go(double t)
  92. {
  93. if (t<ZACIATOK17) return 1;
  94. if (end) return 3;
  95. if (counter>=KONIEC17*refresh) return free();
  96.  
  97. if (!start) if (!init()) return 0;
  98. int cur_frm=(int)(t*refresh);
  99. if (cur_frm>KONIEC17*refresh) cur_frm=int(KONIEC17*refresh);
  100. if (cur_frm>counter)
  101.   while (counter<cur_frm)
  102.     {
  103.     counter++;
  104.     if (counter<KONIEC17*refresh) update();
  105.     }
  106. if (counter>=KONIEC17*refresh) return free();
  107.  
  108. //tu sa kresli->
  109.  
  110.      glEnable(GL_TEXTURE_2D);
  111.  
  112.      glDisable(GL_LIGHTING);
  113.      glDisable(GL_CULL_FACE);
  114.      glDisable(GL_DEPTH_TEST);
  115.      glDisable(GL_BLEND);
  116.  
  117.      glMatrixMode(GL_PROJECTION);
  118.      glLoadIdentity();
  119.      glMatrixMode(GL_MODELVIEW);
  120.      glLoadIdentity();
  121.  
  122.  
  123.    tex->GL();
  124.  
  125. tw.hmuch=otocenie*sin(cntr*PI/300);
  126. tw.c1x=0.3*cos(cntr*PI/1000);
  127. tw.c1y=0.3*sin(cntr*PI/1000);
  128. tw.c2x=0.7*sin(cntr*PI/530);
  129. tw.c2y=0.7*sin(cntr*PI/320);
  130.  
  131. for (int x=0;x<tw_x;x++)
  132.   for (int y=0;y<tw_y;y++)
  133.   {
  134.   float r1=sqrt(  (tw.posx[x][y]-tw.c1x)*(tw.posx[x][y]-tw.c1x)  +  (tw.posy[x][y]-tw.c1y)*(tw.posy[x][y]-tw.c1y) );
  135.   float r2=sqrt(  (tw.posx[x][y]-tw.c2x)*(tw.posx[x][y]-tw.c2x)  +  (tw.posy[x][y]-tw.c2y)*(tw.posy[x][y]-tw.c2y) );
  136.   float r;
  137.   switch(mode1)
  138.     {
  139.     case 0:      r=r1;        break;
  140.     case 1:      r=r2;        break;
  141.     case 2:      r=(r1+r2)/2; break;
  142.     }
  143.   if (r>polomer) r=polomer;
  144.   float am= tw.hmuch*sin(r*2*PI/polomer);
  145.  
  146.   switch(mode2)
  147.     {        
  148.     case 0:
  149.       tw.newx[x][y]= tw.c1x + cos(am)*(tw.posx[x][y]-tw.c1x)+sin(am)*(tw.posy[x][y]-tw.c1y);
  150.       tw.newy[x][y]= tw.c1y + cos(am)*(tw.posy[x][y]-tw.c1y)-sin(am)*(tw.posx[x][y]-tw.c1x);
  151.       break;
  152.     case 1:
  153.       tw.newx[x][y]= tw.c2x + cos(am)*(tw.posx[x][y]-tw.c2x)+sin(am)*(tw.posy[x][y]-tw.c2y);
  154.       tw.newy[x][y]= tw.c2y + cos(am)*(tw.posy[x][y]-tw.c2y)-sin(am)*(tw.posx[x][y]-tw.c2x);
  155.       break;
  156.     case 2:
  157.       tw.newx[x][y]= cos(am)*(tw.posx[x][y])+sin(am)*(tw.posy[x][y]);
  158.       tw.newy[x][y]= cos(am)*(tw.posy[x][y])-sin(am)*(tw.posx[x][y]);
  159.       break;
  160.     }
  161.   }
  162.  
  163.  
  164. for (int y=1;y<tw_y;y++)
  165.   {
  166.   glBegin(GL_QUAD_STRIP);
  167.   glColor3f( clr, clr, clr); 
  168.  
  169.   glTexCoord2f(    tw.texx[0][y  ],    tw.texy[0][y  ]);
  170.   glVertex2f  (    tw.newx[0][y  ],    tw.newy[0][y  ]);
  171.   glTexCoord2f(    tw.texx[0][y-1],    tw.texy[0][y-1]);
  172.   glVertex2f  (    tw.newx[0][y-1],    tw.newy[0][y-1]);
  173.  
  174.   for (int x=1;x<tw_x;x++)
  175.     {
  176.     glTexCoord2f(    tw.texx[x][y  ],    tw.texy[x][y  ]);
  177.     glVertex2f  (    tw.newx[x][y  ],    tw.newy[x][y  ]);
  178.     glTexCoord2f(    tw.texx[x][y-1],    tw.texy[x][y-1]);
  179.     glVertex2f  (    tw.newx[x][y-1],    tw.newy[x][y-1]); 
  180.     }
  181.   glEnd();
  182.   }
  183.  
  184. //<-
  185. return 2;
  186. }