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

  1. /*
  2.  
  3. deformacia gule
  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_10.h"
  16. #include "syncs.h"
  17.  
  18. extern int sync_id;
  19.  
  20. int  efekt_10::init()
  21. {
  22.     cout << "Efekt 10 init ... ";
  23.     start=TRUE;
  24.     counter=ZACIATOK10*refresh;
  25. //->init
  26.     f_cntr=0.0;
  27.     amount=0.0;
  28.  
  29.  
  30. //<-
  31.     cout << "ok" << endl;
  32.     return 1;
  33. }
  34.  
  35. int  efekt_10::load()
  36. {
  37.     cout << "Loading efekt10 ... ";
  38. // -> load
  39.     FILE *stream;
  40.     stream=fopen(CFGNAME10,"r");
  41.     if (!stream) return 0;
  42.  
  43.     fscanf(stream,"file name            %s\n",scene_name);
  44.     fscanf(stream,"object name          %s\n",object_name);
  45.     fscanf(stream,"visibility           %f\n",&vis);
  46.     fscanf(stream,"minvisibility        %f\n",&minvis);
  47.     Vector3f o,i,j,k;
  48.     fscanf(stream,"Descent origin       (%f,%f,%f)\n",&o.x,&o.y,&o.z);
  49.     fscanf(stream,"Descent right        (%f,%f,%f)\n",&i.x,&i.y,&i.z);
  50.     fscanf(stream,"Descent up           (%f,%f,%f)\n",&j.x,&j.y,&j.z);
  51.     fscanf(stream,"Descent forward      (%f,%f,%f)\n",&k.x,&k.y,&k.z);
  52.     cam.SetAll(o,i,j,k);
  53.     fclose(stream);
  54.     cam.FarClipplane(vis);
  55.     cam.NearClipplane(minvis);
  56.     cam.HorizontalFOV(PI/3);
  57.     cam.VerticalFOV(PI/4);
  58.  
  59.     Loader3DS loader;
  60.     sce = loader.Load(scene_name, texture_library);
  61.  
  62.     obj  = dynamic_cast<Object3DS*>(sce->GetObject(object_name));
  63.     numver = obj->NumVertices();
  64.     vtx  = obj->Vertices();
  65.   
  66.     Vertex3DS *v=vtx;
  67.     DeformVtx *d=infoDV;
  68.     for (int i=numver;i;i--)
  69.       {
  70.       d->x=v->x;
  71.       d->y=v->y;
  72.       d->z=v->z;
  73.       d->a1=atan2(v->x,v->y);
  74.       d->a2=atan2(v->x,v->z);
  75.       d->a3=atan2(v->y,v->z);
  76.       v++;
  77.       d++;
  78.       }
  79.     
  80.   
  81. // <-
  82.     cout << "ok!"<<endl;
  83.     return 1;
  84. }
  85.  
  86. int  efekt_10::free()  //vrati 3 ako ok, 0 ak doslo k chybe
  87. {
  88.     end=true;
  89.     cout << "Efekt 08 free ... ";
  90. // -> free
  91.  
  92. // <-
  93.     cout << "ok!" << endl;
  94.     return 3;
  95. }
  96.  
  97. int  efekt_10::update()
  98. {
  99.     id=Sync[GetSyncNum(float(counter)/float(refresh))].id;
  100. // -> update
  101.     f_cntr+=0.01;
  102.     if (amount<(0.7-0.0055)) amount+=0.0055;
  103.                else amount=0.7;
  104.  
  105. // <-
  106.     return 1;
  107. }
  108.  
  109. int efekt_10::go(double t)
  110. {
  111. if (t<ZACIATOK10) return 1;
  112. if (end) return 3;
  113. if (counter>=KONIEC10*refresh) return free();
  114.  
  115. if (!start) if (!init()) return 0;
  116. int cur_frm=(int)(t*refresh);
  117. if (cur_frm>KONIEC10*refresh) cur_frm=int(KONIEC10*refresh);
  118. if (cur_frm>counter)
  119.   while (counter<cur_frm)
  120.     {
  121.     counter++;
  122.     if (counter<KONIEC10*refresh) update();
  123.     }
  124. if (counter>=KONIEC10*refresh) return free();
  125. //tu sa kresli->
  126.    glDisable(GL_LIGHTING);    
  127.    glDisable(GL_FOG);    
  128.    cam.GL();
  129.  
  130.    Vertex3DS *v=vtx;
  131.    DeformVtx *d=infoDV;
  132.  if (amount>0.0)
  133.    {
  134.    for (int i=numver;i;i--)
  135.      {
  136.      float aa=( sin(3*d->a1+f_cntr)*cos(3*d->a2-f_cntr*0.7)+sin(2*d->a3+1.4*f_cntr) )*0.5;
  137.  
  138.      v->R=fabs(aa);
  139.      v->G=fabs(aa);
  140.      v->B=fabs(aa);
  141.  
  142.      v->s+=cos(aa-f_cntr)/1000;
  143.      v->t+=sin(aa+f_cntr)/1000;
  144.  
  145.      aa=1/ (amount*(1+0.15*sin(f_cntr*5.64))*(1+0.7*aa));
  146.      v->w=aa;
  147.      v++;
  148.      d++;
  149.      }
  150.    sce->Render();
  151.    }
  152. //<-
  153. return 2;
  154. }