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

  1. /*
  2.  
  3. gula 3ds viewer
  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_15.h"
  16.  
  17. extern int sync_num;
  18.  
  19. int efekt_15::init()
  20. {
  21.   start=TRUE;
  22.   counter=ZACIATOK15*refresh;
  23.  
  24.   glClearColor (cl_r, cl_g, cl_b, 1.0);
  25.   if (lgt) 
  26.     {
  27.     glEnable(GL_LIGHTING);    
  28.     glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
  29.     }
  30.    else 
  31.     glDisable(GL_LIGHTING);    
  32.  
  33.   if (fog) 
  34.     {
  35.     GLfloat fc[4] = {fg_r,fg_g,fg_b, 1.0};
  36.     glEnable(GL_FOG);
  37.     glFogi(GL_FOG_MODE, GL_EXP2);
  38.     glFogfv(GL_FOG_COLOR, fc);
  39.     glFogf(GL_FOG_DENSITY, fgd);
  40.     }
  41.    else glDisable(GL_FOG);    
  42.  
  43.    new_x=0.0;
  44.    new_y=0.0;
  45.    new_z=0.0;
  46.    move_counter=0.0;
  47.    uhol_counter=0.0;
  48.    uhol=0.0;
  49.  
  50. return 1;
  51. }
  52.  
  53. int efekt_15::load()
  54. {
  55.    cout << "Loading efekt15 ... ";
  56.    FILE *stream=fopen(CFGNAME15,"r");
  57.    if (stream==NULL) return 0;
  58.    fscanf(stream,"mreza                %i x %i\n",&mreza_x,&mreza_y);
  59.    fscanf(stream,"file name            %s\n",scene_name);
  60.    fscanf(stream,"camera name          %s\n",camera_name);
  61.    fscanf(stream,"begin                %f\n",&begin3d);
  62.    fscanf(stream,"end                  %f\n",&end3d);
  63.    fscanf(stream,"background color     %f,%f,%f\n",&cl_r,&cl_g,&cl_b);
  64.    fscanf(stream,"lightning            %i\n",&lgt);
  65.    fscanf(stream,"fog                  %i\n",&fog);
  66.    fscanf(stream,"fog color            %f,%f,%f\n",&fg_r,&fg_g,&fg_b);
  67.    fscanf(stream,"fog density          %f\n",&fgd);
  68.    fscanf(stream,"visibility           %f\n",&vis);
  69.    fscanf(stream,"minvisibility        %f\n",&minvis);
  70.    fscanf(stream,"hfov,vfov (PI/x)     %f,%f\n",&hfov,&vfov);
  71.    fscanf(stream,"render               %i\n",&render);
  72.    fscanf(stream,"rays                 %i\n",&rays);
  73.    fscanf(stream,"outline              %i\n",&obrysy);
  74.    fscanf(stream,"outline color        %f,%f,%f\n",&ob_r,&ob_g,&ob_b);
  75.    fscanf(stream,"outline width        %i\n",&ob_wdt);
  76.    fscanf(stream,"object name          %s\n",object_name);
  77.    Vector3f o,i,j,k;
  78.    fscanf(stream,"Descent origin       (%f,%f,%f)\n",&o.x,&o.y,&o.z);
  79.    fscanf(stream,"Descent right        (%f,%f,%f)\n",&i.x,&i.y,&i.z);
  80.    fscanf(stream,"Descent up           (%f,%f,%f)\n",&j.x,&j.y,&j.z);
  81.    fscanf(stream,"Descent forward      (%f,%f,%f)\n",&k.x,&k.y,&k.z);
  82.    dkam.SetAll(o,i,j,k);
  83.  
  84.    fclose(stream);
  85.  
  86.    mreza=mreza_x*mreza_y;
  87.  
  88.    dkam.FarClipplane(vis);
  89.    dkam.NearClipplane(minvis);
  90.    dkam.HorizontalFOV(PI/hfov);
  91.    dkam.VerticalFOV(PI/vfov);
  92.  
  93.    Loader3DS loader;
  94.    sce = loader.Load(scene_name,texture_library);
  95.    if (sce==NULL) return 0;
  96.  
  97.  
  98.    tehla1=texture_library->GetOrCreate("TEHLA1.JPG");
  99.    phong= texture_library->GetOrCreate("PHONG.JPG");
  100.    tien=  texture_library->GetOrCreate("TIENE.JPG");
  101.  
  102.    dmat = new DmatrixOrientation<GLmatrix,GLfloat>;
  103.  
  104.  
  105.    object_gula     = dynamic_cast<Object3DS*>(sce->GetObject("Gula"));
  106.    int numver_gula = object_gula->NumVertices();
  107.    Vertex3DS *vtx  = object_gula->Vertices();
  108.  
  109.    for (int i=numver_gula;i;i--)
  110.      {
  111.      float x=0.5+(vtx->z*0.005);
  112.      float y=fabs(atan2(vtx->x,vtx->y)*(1.0/PI));
  113.      vtx->s=y;
  114.      vtx->t=x;
  115.      vtx++;
  116.      }
  117.  
  118.    StenaVx *vetes;
  119.    vetes=vtx_stena1;
  120.  
  121.    float x=-800.0;
  122.    float y=-100.0;
  123.    float z=-100.0;
  124.  
  125.    for (int j=0;j<mreza_y;j++)
  126.      {
  127.      for (int i=0;i<mreza_x;i++)
  128.        {
  129.        vetes->x=x;
  130.        vetes->y=y;
  131.        vetes->z=z;
  132.        x+=1600.0/(mreza_x-1);
  133.        vetes++;
  134.        }
  135.      x=-800.0;
  136.      z+=900.0/(mreza_y-1);
  137.      }
  138.  
  139.  
  140.    vetes=vtx_stena2;
  141.    x=-800.0;
  142.    y=-100.0;
  143.    z=-100.0;
  144.    for (int j=0;j<mreza_y;j++)
  145.      {
  146.      for (int i=0;i<mreza_x;i++)
  147.        {
  148.        vetes->x=x;
  149.        vetes->y=y;
  150.        vetes->z=z;
  151.        x+=1600.0/(mreza_x-1);
  152.        vetes++;
  153.        }
  154.      x=-800.0;
  155.      y+=900.0/(mreza_y-1);
  156.      }
  157.  
  158.  
  159.    cout << "ok!"<<endl;
  160. return 1;
  161. }
  162.  
  163. int efekt_15::free()
  164. {
  165. return 1;
  166. }
  167.  
  168. int efekt_15::update()
  169. {
  170.  
  171. move_counter+=0.01;
  172. uhol_counter+=0.003;
  173. uhol+=0.01;
  174.  
  175. return 1;
  176. }
  177.  
  178.  
  179. int efekt_15::go(double t)
  180. {
  181. if (t<ZACIATOK15) return 1;
  182. if (t<begin3d) return 1;
  183. if (end) return 3;
  184. if (counter>=KONIEC15*refresh) return free();
  185.  
  186. if (!start) if (!init()) return 0;
  187.  
  188. int cur_frm=(int)(t*refresh);
  189. if (cur_frm>KONIEC15*refresh) cur_frm=int(KONIEC15*refresh);
  190. if (cur_frm>counter)
  191.   while (counter<cur_frm)
  192.     {
  193.     counter++;
  194.     if (counter<KONIEC15*refresh) update();
  195.     }
  196. if (counter>=KONIEC15*refresh) return free();
  197.  
  198.  
  199. //tu sa kresli->
  200.  
  201.   float frejm=(t-begin3d)/(end3d-begin3d);
  202.   kam = sce->GetCamera(camera_name);
  203.   kam->FarClipplane(vis);
  204.   kam->NearClipplane(minvis);
  205.   kam->HorizontalFOV(PI/hfov);
  206.   kam->VerticalFOV(PI/vfov);
  207.   kam->GL(frejm);
  208. //    dkam.GL();
  209.  
  210. //posun
  211.    new_x=300*sin(0.8*move_counter);
  212.    new_y=fabs (300*cos(move_counter));
  213.    new_z=fabs(300*sin(2.77*move_counter));
  214. //vyrata os, okolo ktorej sa otaca
  215.    alfa=PI*sin(uhol_counter);
  216.    beta=PI*cos(uhol_counter);
  217.    gama=PI*sin(PI*cos(uhol_counter));
  218.    float sa=sin(alfa),sb=sin(beta),sg=sin(gama);
  219.    float ca=cos(alfa),cb=cos(beta),cg=cos(gama);
  220.    Vector3f os(ca*cg+sa*sb*sg , ca*cb , cb*cg);
  221.    float osl = (1.0/sqrt(os.x*os.x + os.y*os.y + os.z*os.z));
  222.    os*=osl;
  223. //nastavi transformacie gule
  224.    dmat->Orientation(uhol, os.x,os.y,os.z);
  225.    dmat->Translation(new_x,new_y,new_z);
  226.    object_gula->CoordinateSystem(dmat);
  227.    mat=dmat->operator()();
  228.    mat.OrthoInverse();
  229.    float l,x,y,xx,yy,zz,ww=1.0;
  230.  
  231.  
  232.    StenaVx *vtx;
  233.  
  234.    vtx=vtx_stena1;
  235.    for (int i=mreza;i;i--)
  236.      {
  237.      xx=vtx->x;
  238.      yy=vtx->y;
  239.      zz=vtx->z;
  240.      mat.MultVertex4f(xx,yy,zz,ww);
  241.      l=100.0/sqrt(xx*xx+yy*yy+zz*zz);
  242.      x=0.5+(l*zz*0.005);
  243.      y=fabs(atan2(xx,yy)*(1.0/PI));
  244.      vtx->s=y;
  245.      vtx->t=x;
  246.      vtx++;
  247.      }
  248.  
  249.    vtx=vtx_stena2;
  250.    for (int i=mreza;i;i--)
  251.      {
  252.      xx=vtx->x;
  253.      yy=vtx->y;
  254.      zz=vtx->z;
  255.      mat.MultVertex4f(xx,yy,zz,ww);
  256.      l=100.0/sqrt(xx*xx+yy*yy+zz*zz);
  257.      x=0.5+(l*zz*0.005);
  258.      y=fabs(atan2(xx,yy)*(1.0/PI));
  259.      vtx->s=y;
  260.      vtx->t=x;
  261.      vtx++;
  262.      }
  263.  
  264.    tien->GL();
  265.  
  266.    StenaVx *vtx1,*vtx2;
  267.  
  268.    glDisable(GL_DEPTH_TEST);
  269.    vtx1=vtx_stena1;
  270.    vtx2=vtx_stena1+mreza_x;
  271.    for (int j=0;j<mreza_y-1;j++)
  272.      {
  273.      glBegin(GL_QUAD_STRIP);
  274.      glColor3f(1.0,1.0,1.0);
  275.      for (int i=0;i<mreza_x;i++)
  276.        {
  277.        glTexCoord2f( vtx1->s , vtx1->t);
  278.        glVertex3f( vtx1->x , vtx1->y , vtx1->z );
  279.        glTexCoord2f( vtx2->s , vtx2->t);
  280.        glVertex3f( vtx2->x , vtx2->y , vtx2->z );
  281.        vtx1++;       
  282.        vtx2++;       
  283.        }
  284.      glEnd();
  285.      }
  286.  
  287.    vtx1=vtx_stena2;
  288.    vtx2=vtx_stena2+mreza_x;
  289.    for (int j=0;j<mreza_y-1;j++)
  290.      {
  291.      glBegin(GL_QUAD_STRIP);
  292.      for (int i=0;i<mreza_x;i++)
  293.        {
  294.        glTexCoord2f( vtx1->s , vtx1->t);
  295.        glVertex3f( vtx1->x , vtx1->y , vtx1->z );
  296.        glTexCoord2f( vtx2->s , vtx2->t);
  297.        glVertex3f( vtx2->x , vtx2->y , vtx2->z );
  298.        vtx1++;       
  299.        vtx2++;       
  300.        }
  301.      glEnd();
  302.      }
  303.  
  304.    glColor3f(0.5,0.5,0.5);
  305.  
  306.    glEnable(GL_BLEND);
  307.    glBlendFunc(GL_ONE,GL_ONE);
  308.    tehla1->GL();
  309.    glBegin(GL_QUADS);
  310.     glTexCoord2f(0.01,0.01);
  311.     glVertex3f( s1xmin ,s1ymax, s1zmin );
  312.     glTexCoord2f(0.01,0.99);
  313.     glVertex3f( s1xmin ,s1ymax, s1zmax );
  314.     glTexCoord2f(0.99,0.99);
  315.     glVertex3f( s1xmax ,s1ymax, s1zmax );
  316.     glTexCoord2f(0.99,0.01);
  317.     glVertex3f( s1xmax ,s1ymax, s1zmin );
  318.    glEnd();
  319.  
  320.    glBegin(GL_QUADS);
  321.     glTexCoord2f(0.01,0.01);
  322.     glVertex3f( s2xmin, s2ymin, s2zmax);
  323.     glTexCoord2f(0.01,0.99);             
  324.     glVertex3f( s2xmin, s2ymax, s2zmax);
  325.     glTexCoord2f(0.99,0.99);             
  326.     glVertex3f( s2xmax, s2ymax, s2zmax);
  327.     glTexCoord2f(0.99,0.01);             
  328.     glVertex3f( s2xmax, s2ymin, s2zmax);
  329.    glEnd();
  330.  
  331.    glColor3f(1.0,1.0,1.0);
  332.  
  333.    glBlendFunc(GL_ZERO,GL_SRC_COLOR);
  334.    phong->GL();
  335.    glBegin(GL_QUADS);
  336.     glTexCoord2f(0.01,0.01);
  337.     glVertex3f( s1xmin-prsh, s1ymax, s1zmin);
  338.     glTexCoord2f(0.01,0.99);
  339.     glVertex3f( s1xmin-prsh, s1ymax, s1zmax+prsh);
  340.     glTexCoord2f(0.99,0.99);
  341.     glVertex3f( s1xmax+prsh, s1ymax, s1zmax+prsh);
  342.     glTexCoord2f(0.99,0.01);
  343.     glVertex3f( s1xmax+prsh, s1ymax, s1zmin);
  344.  
  345.     glTexCoord2f(0.01,0.01);
  346.     glVertex3f( s2xmin-prsh, s2ymin, s2zmax);
  347.     glTexCoord2f(0.01,0.99);                
  348.     glVertex3f( s2xmin-prsh, s2ymax+prsh, s2zmax);
  349.     glTexCoord2f(0.99,0.99);                
  350.     glVertex3f( s2xmax+prsh, s2ymax+prsh, s2zmax);
  351.     glTexCoord2f(0.99,0.01);                
  352.     glVertex3f( s2xmax+prsh, s2ymin, s2zmax);
  353.    glEnd();
  354.    glBlendFunc(GL_ONE,GL_ONE);
  355.  
  356.    sce->Render();
  357. //<-
  358. return 2;
  359. }
  360.