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

  1. /*
  2.  
  3. layere 2 (tie su uplne navrchu)
  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_16.h"
  16. #include "syncs.h"
  17.  
  18. extern int sync_id;
  19.  
  20. void efekt_16::draw_layer(int i)
  21. {
  22.   float timer=counter/refresh;
  23.  
  24.   if (timer>(l[i].k[l[i].kijnum-1]).time) return;
  25.   if (timer<(l[i].k[0]).time) return;
  26.   
  27.   while (timer>(l[i].k[l[i].kij+1]).time) l[i].kij++;
  28.   
  29.   glMatrixMode(GL_PROJECTION);
  30.   glLoadIdentity();
  31.   glMatrixMode(GL_MODELVIEW);
  32.   glLoadIdentity();
  33.   glEnable(GL_TEXTURE_2D);
  34.   glDisable(GL_LIGHTING);
  35.   glDisable(GL_DEPTH_TEST);
  36.   glDisable(GL_CULL_FACE);
  37.   glEnable(GL_BLEND);
  38.   if (l[i].type==0) glBlendFunc(GL_ONE,GL_ONE);
  39.   if (l[i].type==1) glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
  40.   if (l[i].type==2) glDisable(GL_BLEND);
  41.  
  42.   l[i].tex->GL();
  43.   int j=l[i].kij;
  44.  
  45.   float tm=(timer-(l[i].k[j]).time)/((l[i].k[j+1]).time-(l[i].k[j]).time);
  46.   float c=(l[i].k[j]).color+ tm*((l[i].k[j+1]).color-(l[i].k[j]).color);
  47.   float px=(l[i].k[j]).posx+ tm*((l[i].k[j+1]).posx-(l[i].k[j]).posx);
  48.   float py=(l[i].k[j]).posy+ tm*((l[i].k[j+1]).posy-(l[i].k[j]).posy);
  49.   float sc=(l[i].k[j]).scale+ tm*((l[i].k[j+1]).scale-(l[i].k[j]).scale);
  50.   float sx=l[i].px*sc;
  51.   float sy=l[i].py*sc;
  52.  
  53.   glBegin(GL_QUADS);
  54.     glColor3f(c,c,c);
  55.     glTexCoord2f( 1.0, 1.0);
  56.     glVertex2f  ( px + sx, py + sy);
  57.     glTexCoord2f( 0.001, 1.0);                                          
  58.     glVertex2f  ( px - sx, py + sy);
  59.     glTexCoord2f( 0.001, 0.001);                                          
  60.     glVertex2f  ( px - sx, py - sy);
  61.     glTexCoord2f( 1.0, 0.0);                                          
  62.     glVertex2f  ( px + sx, py - sy);
  63.   glEnd();
  64.   if (l[i].type==2) glEnable(GL_BLEND);
  65. }
  66.  
  67.  
  68. int  efekt_16::init()
  69. {
  70.     cout << "Efekt 16 init ... ";
  71.     start=TRUE;
  72.     counter=ZACIATOK16*refresh;
  73. //->init
  74.  
  75. //<-
  76.     cout << "ok" << endl;
  77.     return 1;
  78. }
  79.  
  80. int  efekt_16::load()
  81. {
  82.     cout << "Loading efekt16 ... ";
  83. // -> load
  84.  
  85.     float tt,tx,ty,tc,ts;
  86.     char name[30];
  87.     int typ;
  88.  
  89.     FILE *stream; 
  90.     stream=fopen(CFGNAME16,"r");
  91.     if (!stream) return 0;
  92.     if (stream)
  93.       {
  94.       fscanf(stream,"layer type           %i\n",&typ);
  95.       cout << "typ: " << typ << endl;
  96.  
  97.       lnum=0;
  98.       while ((typ!=-1)&&(lnum<laymax))
  99.         {
  100.         l[lnum].type=typ;
  101.         fscanf(stream,"layer name           %s\n",name);                            
  102.         cout << "Name: " << name << endl;
  103.         l[lnum].tex=texture_library->GetOrCreate(name);
  104.         fscanf(stream,"projected size       %f x %f\n",&l[lnum].px,&l[lnum].py);
  105.  
  106.  
  107.         fscanf(stream,"key: %f %f %f %f %f\n",&tt,&tx,&ty,&tc,&ts);
  108.     l[lnum].kijnum=0;
  109.         l[lnum].kij=-1;
  110.         while ((tt!=-1.0)&&(l[lnum].kijnum<kijmax))
  111.           {
  112.           (l[lnum].k[l[lnum].kijnum]).time =tt;
  113.           (l[lnum].k[l[lnum].kijnum]).posx =tx;
  114.           (l[lnum].k[l[lnum].kijnum]).posy =ty;
  115.           (l[lnum].k[l[lnum].kijnum]).color=tc;
  116.           (l[lnum].k[l[lnum].kijnum]).scale=ts;
  117.           l[lnum].kijnum++;
  118.       fscanf(stream,"key: %f %f %f %f %f\n",&tt,&tx,&ty,&tc,&ts);
  119.           }                          
  120.         lnum++;
  121.         fscanf(stream,"\nlayer type           %i\n",&typ);
  122.         }
  123.         fclose(stream);
  124.       }
  125.  
  126.     for (int j=0;j<lnum;j++)
  127.       {
  128.       cout << "layer " << j+1<< "/" << lnum << ": ";
  129.       cout  << l[j].kijnum << " keys"<< endl;
  130.       }
  131.  
  132. // <-
  133.     cout << "ok!"<<endl;
  134.     return 1;
  135. }
  136.  
  137. int  efekt_16::free()  //vrati 3 ako ok, 0 ak doslo k chybe
  138. {
  139.     end=true;
  140.     cout << "Efekt 08 free ... ";
  141. // -> free
  142.  
  143. // <-
  144.     cout << "ok!" << endl;
  145.     return 3;
  146. }
  147.  
  148. int  efekt_16::update()
  149. {
  150.     id=Sync[GetSyncNum(float(counter)/float(refresh))].id;
  151. // -> update
  152.  
  153. // <-
  154.     return 1;
  155. }
  156.  
  157. int efekt_16::go(double t)
  158. {
  159. if (t<ZACIATOK16) return 1;
  160. if (end) return 3;
  161. if (counter>=KONIEC16*refresh) return free();
  162.  
  163. if (!start) if (!init()) return 0;
  164. int cur_frm=(int)(t*refresh);
  165. if (cur_frm>KONIEC16*refresh) cur_frm=int(KONIEC16*refresh);
  166. if (cur_frm>counter)
  167.   while (counter<cur_frm)
  168.     {
  169.     counter++;
  170.     if (counter<KONIEC16*refresh) update();
  171.     }
  172. if (counter>=KONIEC16*refresh) return free();
  173. //tu sa kresli->
  174.  
  175. for (int i=0;i<lnum;i++)
  176.   draw_layer(i);
  177.  
  178. //<-
  179. return 2;
  180. }