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

  1. /*
  2.  
  3. HORSKA DRAHA
  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_07.h"
  16. #include "syncs.h"
  17. #include "vlacik2c.h"
  18. #include "vlacik2.h"
  19.  
  20. train_track track;   // neciste !!! (flash to tak chcel)
  21. extern int sync_id;
  22. extern BOOL usefog;
  23.  
  24. // raytracingove veci
  25.  
  26. #define grid_width 16
  27. #define grid_height 12
  28. #define grid_x (grid_width+1)
  29. #define grid_y (grid_width+1)
  30.  
  31. #define sphere_x 0.0F
  32. #define sphere_y 0.0F
  33. #define sphere_z 0.0F
  34. #define sphere_radius 1000.0F
  35.  
  36. Texture3DS* skytex;
  37. Texture3DS* skyshadow;
  38.  
  39. Vertex3DS rtgrid[grid_x*grid_y];
  40. Vertex3DS rtgrid2[grid_x*grid_y];
  41. Vertex3DS rtgrid3[grid_x*grid_y];
  42. GLuint rtindices[(grid_x*2)*grid_height];
  43.  
  44. void init_rtgrid () {
  45.   Vertex3DS* v = rtgrid;
  46.   for(GLuint i=0; i<=grid_height; i++)
  47.     for(GLuint j=0; j<=grid_width; j++) {
  48.       v->x = 2.0*(GLfloat)j/grid_width - 1.0;
  49.       v->y = 2.0*(GLfloat)i/grid_height - 1.0;
  50.       v->z = 0.0;
  51.       v->w = 1.0;
  52.       v->s = (GLfloat)j/grid_width;
  53.       v->t = (GLfloat)i/grid_height;
  54.       v->r = 0.0; v->q = 1.0;
  55.       v->R = v->G = v->B = v->A = 1.0;
  56.       v->i = v->j = v->k = 0.0;
  57.       v++;
  58.     }
  59.   GLuint* p = rtindices;
  60.   for(GLuint i=0; i<grid_height; i++)
  61.     for(GLuint j=0; j<grid_x; j++) {
  62.       *p = grid_x*i+j; p++;
  63.       *p = grid_x*(i+1)+j; p++;
  64.     }
  65. }
  66.  
  67. void init_rtgrid2 () {
  68.   Vertex3DS* v = rtgrid2;
  69.   for(GLuint i=0; i<=grid_height; i++)
  70.     for(GLuint j=0; j<=grid_width; j++) {
  71.       v->x = 2.0*(GLfloat)j/grid_width - 1.0;
  72.       v->y = 2.0*(GLfloat)i/grid_height - 1.0;
  73.       v->z = 0.0;
  74.       v->w = 1.0;
  75.       v->s = (GLfloat)j/grid_width;
  76.       v->t = (GLfloat)i/grid_height;
  77.       v->r = 0.0; v->q = 1.0;
  78.       v->R = v->G = v->B = v->A = 1.0;
  79.       v->i = v->j = v->k = 0.0;
  80.       v++;
  81.     }
  82. }
  83.  
  84. void init_rtgrid3 () {
  85.   Vertex3DS* v = rtgrid3;
  86.   for(GLuint i=0; i<=grid_height; i++)
  87.     for(GLuint j=0; j<=grid_width; j++) {
  88.       v->x = 2.0*(GLfloat)j/grid_width - 1.0;
  89.       v->y = 2.0*(GLfloat)i/grid_height - 1.0;
  90.       v->z = 0.0;
  91.       v->w = 1.0;
  92.       v->s = (GLfloat)j/grid_width;
  93.       v->t = (GLfloat)i/grid_height;
  94.       v->r = 0.0; v->q = 1.0;
  95.       v->R = v->G = v->B = v->A = 1.0;
  96.       v->i = v->j = v->k = 0.0;
  97.       v++;
  98.     }
  99. }
  100.  
  101. void draw_rtgrid2 () {
  102.   glMatrixMode(GL_PROJECTION);
  103.   glPushMatrix();
  104.   glLoadIdentity();
  105.   glMatrixMode(GL_MODELVIEW);
  106.   glPushMatrix();
  107.   glLoadIdentity();
  108.  
  109.   glDisable(GL_LIGHTING);
  110.   glDisable(GL_DEPTH_TEST);
  111.   glDisable(GL_CULL_FACE);
  112.   glEnable(GL_TEXTURE_2D);
  113.   glEnable(GL_BLEND);
  114.   glBlendFunc(GL_ZERO, GL_SRC_COLOR);
  115.  
  116.   skyshadow->GL();
  117.  
  118.   glInterleavedArrays(GL_T4F_C4F_N3F_V4F, 0, (void*)rtgrid2);
  119.  
  120.   for(int i=0; i<grid_height; i++) {
  121.     glDrawElements(GL_QUAD_STRIP, grid_x*2, GL_UNSIGNED_INT,
  122.                         (void*)(rtindices+i*grid_x*2));
  123.   }
  124.  
  125.   glEnable(GL_LIGHTING);
  126.   glDisable(GL_TEXTURE_2D);
  127.   glDisable(GL_BLEND);
  128.   glBlendFunc(GL_ONE, GL_ONE);
  129.  
  130.   glPopMatrix();
  131.   glMatrixMode(GL_PROJECTION);
  132.   glPopMatrix();
  133.   glMatrixMode(GL_MODELVIEW);
  134. }
  135.  
  136. void draw_rtgrid3 () {
  137.   glMatrixMode(GL_PROJECTION);
  138.   glPushMatrix();
  139.   glLoadIdentity();
  140.   glMatrixMode(GL_MODELVIEW);
  141.   glPushMatrix();
  142.   glLoadIdentity();
  143.  
  144.   glDisable(GL_LIGHTING);
  145.   glDisable(GL_DEPTH_TEST);
  146.   glDisable(GL_CULL_FACE);
  147.   glEnable(GL_TEXTURE_2D);
  148.   glEnable(GL_BLEND);
  149.   glBlendFunc(GL_ZERO, GL_SRC_COLOR);
  150.  
  151.   skyshadow->GL();
  152.  
  153.   glInterleavedArrays(GL_T4F_C4F_N3F_V4F, 0, (void*)rtgrid3);
  154.  
  155.   for(int i=0; i<grid_height; i++) {
  156.     glDrawElements(GL_QUAD_STRIP, grid_x*2, GL_UNSIGNED_INT,
  157.                         (void*)(rtindices+i*grid_x*2));
  158.   }
  159.  
  160.   glEnable(GL_LIGHTING);
  161.   glDisable(GL_TEXTURE_2D);
  162.   glDisable(GL_BLEND);
  163.   glBlendFunc(GL_ONE, GL_ONE);
  164.  
  165.   glPopMatrix();
  166.   glMatrixMode(GL_PROJECTION);
  167.   glPopMatrix();
  168.   glMatrixMode(GL_MODELVIEW);
  169. }
  170.  
  171. void draw_rtgrid () {
  172.   glMatrixMode(GL_PROJECTION);
  173.   glPushMatrix();
  174.   glLoadIdentity();
  175.   glMatrixMode(GL_MODELVIEW);
  176.   glPushMatrix();
  177.   glLoadIdentity();
  178.  
  179.   glDisable(GL_LIGHTING);
  180.   glDisable(GL_DEPTH_TEST);
  181.   glDisable(GL_BLEND);
  182.   glDisable(GL_CULL_FACE);
  183.   glEnable(GL_TEXTURE_2D);
  184.   skytex->GL();
  185.  
  186.   glInterleavedArrays(GL_T4F_C4F_N3F_V4F, 0, (void*)rtgrid);
  187.  
  188.   for(int i=0; i<grid_height; i++) {
  189.     glDrawElements(GL_QUAD_STRIP, grid_x*2, GL_UNSIGNED_INT,
  190.                         (void*)(rtindices+i*grid_x*2));
  191.   }
  192.  
  193.   glEnable(GL_LIGHTING);
  194.   glDisable(GL_TEXTURE_2D);
  195.  
  196.   glPopMatrix();
  197.   glMatrixMode(GL_PROJECTION);
  198.   glPopMatrix();
  199.   glMatrixMode(GL_MODELVIEW);
  200. }
  201.  
  202. inline GLfloat Sq (GLfloat x) {
  203.   return x*x;
  204. }
  205.  
  206.  
  207. void drawsphere (double mytime) {
  208.   GLfloat thfov2 = (PI/3);
  209.   GLfloat tvfov2 = (PI/4);
  210.  
  211. //  GLfloat thfov2 = tan(PI/3);
  212. //  GLfloat tvfov2 = tan(PI/4);
  213.  
  214.   GLfloat d = 10.0;
  215.   GLmatrix m;
  216.   glGetFloatv(GL_MODELVIEW_MATRIX, m());
  217.   m.OrthoInverse();
  218.   Vector3f O(m[12], m[13], m[14]);
  219.   Vector3f U(m[0], m[1], m[2]);
  220.   Vector3f V(m[4], m[5], m[6]);
  221.   Vector3f N(m[8], m[9], m[10]);
  222.   Vector3f K;
  223.  
  224.   Vector3f S = O - (N + V*tvfov2 + U*thfov2)*d;
  225.   Vector3f deltaU = (U*d*thfov2*2.0F)*(1.0F/(GLfloat)grid_width);
  226.   Vector3f deltaV = (V*d*tvfov2*2.0F)*(1.0F/(GLfloat)grid_height);
  227.  
  228.   Vertex3DS* v = rtgrid;
  229.   Vertex3DS* v2 = rtgrid2;
  230.   Vertex3DS* v3 = rtgrid3;
  231.   for(int i=0; i<=grid_height; i++) {
  232.     Vector3f A = S+deltaV*(GLfloat)i;
  233.     for(int j=0; j<=grid_width; j++) {
  234.       K = A - O;
  235.       GLfloat a = Sq(K.x) + Sq(K.y) + Sq(K.z);
  236.       GLfloat b = 0;
  237.       GLfloat c =  - Sq(sphere_radius);
  238.       GLfloat t = (-b + sqrt(b*b - 4.0F*a*c))/(2.0F*a);
  239.       GLfloat x = t*K.x;
  240.       GLfloat y = t*K.y;
  241.       GLfloat z = t*K.z;
  242.       v->s = fabs(atan2(x,z)/PI);
  243.       v->t = 0.5*y/(GLfloat)sphere_radius + 0.5;
  244.  
  245.       v2->s=fabs(sin(atan2(x,z) + mytime*0.002));
  246.       v2->t=0.5*y/(GLfloat)sphere_radius + 0.5 + mytime*0.002;
  247.  
  248.       v3->s=fabs(sin(atan2(x,z) + mytime*0.00065));
  249.       v3->t=0.5*y/(GLfloat)sphere_radius + 0.5 - mytime*0.002;
  250.  
  251.       A += deltaU;
  252.       v++;
  253.       v2++;
  254.       v3++;
  255.     }
  256.   }
  257.  
  258. }
  259.  
  260.  
  261. int  efekt_07::init()
  262. {
  263.   cout << "Efekt 7 init ... ";
  264.   start=TRUE;
  265.   counter=ZACIATOK07*refresh;
  266. //->init
  267.   mytime=0.0;
  268.   mytime2=0.0;
  269.   vlak=1;
  270.   animcounter=0.0;
  271.   glClearColor (0.0, 0.0, 0.0, 1.0);
  272. //<-
  273.   cout << "ok!"<<endl;
  274.   return 1;
  275. }
  276.  
  277. int  efekt_07::load()
  278. {
  279.     cout << "Loading efekt07 ... ";
  280. // -> load
  281.     FILE *stream; 
  282.     stream=fopen(CFGNAME07,"r");
  283.     if (stream==NULL) return 0;
  284.     if (stream)
  285.       {
  286.       fscanf(stream,"vagony            %s\n",vagony);
  287.       fscanf(stream,"raytrace          %s\n",raytrace);
  288.  
  289.       fscanf(stream,"hfov,vfov (PI/x)  %f,%f\n",&h,&v);
  290.       fscanf(stream,"visibility        %f\n",&far_clipplane);
  291.       fscanf(stream,"minvisibility     %f\n",&near_clipplane);
  292.  
  293.       fscanf(stream,"%f\n",&cntr1);
  294.       fscanf(stream,"%f %f %f %f\n",&anim1[0],&anim1[4],&anim1[ 8],&anim1[12]);
  295.       fscanf(stream,"%f %f %f %f\n",&anim1[1],&anim1[5],&anim1[ 9],&anim1[13]);
  296.       fscanf(stream,"%f %f %f %f\n",&anim1[2],&anim1[6],&anim1[10],&anim1[14]);
  297.       fscanf(stream,"%f %f %f %f\n\n",&anim1[3],&anim1[7],&anim1[11],&anim1[15]);
  298.       fscanf(stream,"%f\n",&cntr2);
  299.       fscanf(stream,"%f %f %f %f\n",&anim2[0],&anim2[4],&anim2[ 8],&anim2[12]);
  300.       fscanf(stream,"%f %f %f %f\n",&anim2[1],&anim2[5],&anim2[ 9],&anim2[13]);
  301.       fscanf(stream,"%f %f %f %f\n",&anim2[2],&anim2[6],&anim2[10],&anim2[14]);
  302.       fscanf(stream,"%f %f %f %f\n\n",&anim2[3],&anim2[7],&anim2[11],&anim2[15]);
  303.       fscanf(stream,"%f\n",&cntr3);
  304.       fscanf(stream,"%f %f %f %f\n",&anim3[0],&anim3[4],&anim3[ 8],&anim3[12]);
  305.       fscanf(stream,"%f %f %f %f\n",&anim3[1],&anim3[5],&anim3[ 9],&anim3[13]);
  306.       fscanf(stream,"%f %f %f %f\n",&anim3[2],&anim3[6],&anim3[10],&anim3[14]);
  307.       fscanf(stream,"%f %f %f %f\n\n",&anim3[3],&anim3[7],&anim3[11],&anim3[15]);
  308.       fscanf(stream,"%f\n",&cntr4);
  309.       fscanf(stream,"%f %f %f %f\n",&anim4[0],&anim4[4],&anim4[ 8],&anim4[12]);
  310.       fscanf(stream,"%f %f %f %f\n",&anim4[1],&anim4[5],&anim4[ 9],&anim4[13]);
  311.       fscanf(stream,"%f %f %f %f\n",&anim4[2],&anim4[6],&anim4[10],&anim4[14]);
  312.       fscanf(stream,"%f %f %f %f\n",&anim4[3],&anim4[7],&anim4[11],&anim4[15]);
  313.       fclose(stream);
  314.       };
  315.     anim1.OrthoInverse();
  316.     anim2.OrthoInverse();
  317.     anim3.OrthoInverse();
  318.     anim4.OrthoInverse();
  319.  
  320.   float hf = sin(PI/(2*h)) / cos(PI/(2*h)); // tan(hfov/2)
  321.   float vf = sin(PI/(2*v)) / cos(PI/(2*v)); // tan(vfov/2)
  322.   h=hf;
  323.   v=vf;
  324.  
  325.   Loader3DS loader;
  326.   wagons = loader.Load(vagony);
  327.   if (wagons==NULL) return 0;
  328.   locomotive = dynamic_cast<Object3DS*>(wagons->GetObject("lokomotiva"));
  329.   wagon = dynamic_cast<Object3DS*>(wagons->GetObject("vozen"));
  330.   if (!locomotive) return 0;
  331.   if (!wagon) return 0;
  332.  
  333.   OmniLight3DS* l1 = new OmniLight3DS;
  334.   l1->Diffuse(0.7F, 0.7F, 1.0F);
  335.   l1->Position(-1500.0F, 1000.0F, 500.0F);
  336.   scene.Add(l1);
  337.  
  338.   OmniLight3DS* l2 = new OmniLight3DS;
  339.   l2->Diffuse(1.0F, 0.7F, 0.5F);
  340.   l2->Position(1000.0F, 600.0F, -200.0F);
  341.   scene.Add(l2);
  342.  
  343.   Material3DS* mrails = new Material3DS;
  344.   mrails->Name("Rail material");
  345.   mrails->Diffuse(0.3F, 0.3, 0.3F);
  346.   track_base::rail_material = mrails;
  347.  
  348.   Material3DS* mtube = new Material3DS;
  349.   mtube->Name("Tube material");
  350.   mtube->Ambient(0.0F, 0.0F, 0.0F);
  351.   mtube->Diffuse(0.1F, 0.1F, 0.3F);
  352.   mtube->Transparency(50);
  353.   track_base::tube_material = mtube;
  354.  
  355.   skytex=texture_library->GetOrCreate(raytrace);
  356.   skyshadow=texture_library->GetOrCreate("SKYSHAD.JPG");
  357.  
  358.   train_track_desc track_description[] = {
  359.     { STRAIGHT,          100,   0, 0 },
  360.     { ASCEND,            100,   0, 0 },
  361.     { DESCEND,           100,   0, 0 },
  362.     { STRAIGHT,       80,   0, 0 },
  363.     { LOOPING,           200,   0, 0 },
  364.     { STRAIGHT,           50,   0, 0 },
  365.     { UTURN_LEFT,         90,   0, 0 },
  366.     { UTURN_LEFT,         80,   0, 0 },
  367.     { ASCEND,             70,   0, 0 },
  368.     { UTURN_LEFT,         70,   0, 0 },
  369.     { UTURN_LEFT,         50,   0, 0 },
  370.     { DESCEND,            70,   0, 0 },
  371.     { HALFTURN_LEFT,      80,   0, HAS_TUBE },
  372.     { HALFTURN_LEFT,      80,   0, HAS_TUBE },
  373.     { DESCEND,            70,   0, HAS_TUBE },
  374.     { ASCEND,             70,   0, HAS_TUBE },
  375.     { STRAIGHT,           50,   0, 0 },
  376.     { FULLWHIRL,         460,   0, 0 }, //
  377.     { QUARTERTURN_LEFT,  115,   0, 0 },
  378.     { QUARTERTURN_LEFT,  115,   0, HAS_TUBE },
  379.     { HALFTURN_LEFT,     115,   0, HAS_TUBE },
  380.     { DESCEND,           100,   0, HAS_TUBE },
  381.     { ASCEND,            100,   0, HAS_TUBE }
  382.   };
  383.  
  384.   scene.Add(*track.Construct(
  385.       sizeof(track_description)/sizeof(track_description[0]),
  386.       track_description));
  387.  
  388.   turn_matrix.LoadIdentity();
  389.   turn_matrix[0] = -1.0F;
  390.   turn_matrix[10] = -1.0F;
  391.  
  392.   init_rtgrid();
  393.   init_rtgrid2();
  394.   init_rtgrid3();
  395. // <-
  396.     cout << "ok!"<<endl;
  397.     return 1;
  398. }
  399.  
  400. int  efekt_07::free()  //vrati 3 ako ok, 0 ak doslo k chybe
  401. {
  402. end=true;
  403. cout << "Efekt 7 free" << endl;
  404. // -> free
  405.  
  406. // <-
  407. return 3;
  408. }
  409.  
  410. int  efekt_07::update()
  411. {
  412. id=Sync[GetSyncNum(float(counter)/float(refresh))].id;
  413. // -> update
  414.   if (id==SYNC_VLAK2) vlak=2;
  415.   if (id>=SYNC_VLAK3) vlak=3;
  416.   mytime+=1.3;
  417.   mytime2+=0.7;
  418.   mycounter+=0.03;
  419. // <-
  420. return 1;
  421. }
  422.  
  423. void efekt_07::DrawTrain(double placement, int numwagons) {
  424.   GLmatrix m;
  425.   m = track.coordinate_system(placement);
  426.   locomotive->CoordinateSystem(m);
  427.   locomotive->Render();
  428.   placement-=loco_len + wagon_spacing - 6.0;
  429.   for(int i=0; i<numwagons; i++) {
  430.     m = track.coordinate_system(placement);
  431.     wagon->CoordinateSystem(m);
  432.     wagon->Render();
  433.     placement-=wago_len + wagon_spacing;
  434.   }
  435.   m = track.coordinate_system(placement)*turn_matrix;
  436.   locomotive->CoordinateSystem(m);
  437.   locomotive->Render();
  438. }
  439.  
  440. int efekt_07::go(double t)
  441. {
  442. if (t<ZACIATOK07) return 1;
  443. if (end) return 3;
  444. if (counter>=KONIEC07*refresh) return free();
  445.  
  446. if (!start) if (!init()) return 0;
  447. int cur_frm=(int)(t*refresh);
  448. if (cur_frm>KONIEC07*refresh) cur_frm=int(KONIEC07*refresh);
  449. if (cur_frm>counter)
  450.   while (counter<cur_frm)
  451.     {
  452.     counter++;
  453.     if (counter<KONIEC07*refresh) update();
  454.     }
  455. if (counter>=KONIEC07*refresh) return free();
  456. //tu sa kresli->
  457.  
  458.   glMatrixMode(GL_PROJECTION);
  459.   glLoadIdentity();
  460.   glFrustum(-near_clipplane*h, near_clipplane*h,
  461.             -near_clipplane*v, near_clipplane*v,
  462.              near_clipplane, far_clipplane);
  463.   glMatrixMode(GL_MODELVIEW);
  464.  
  465.   glEnable(GL_LIGHTING);
  466.   glDisable(GL_FOG);
  467.  
  468.   if (vlak==1)
  469.     {
  470.     animcounter=(t-VL1)/(VL2-VL1);
  471.     mytime=cntr1+animcounter*(cntr2-cntr1);
  472.     GLmatrix mm=Mslerp((float)animcounter, anim1, anim2);
  473.     mm.OrthoInverse();
  474.     glLoadMatrixf(mm());
  475.     }
  476.  
  477.   if (vlak==3)
  478.     {
  479.     animcounter=(t-VL3)/(VL4-VL3);
  480.     mytime=cntr3+animcounter*(cntr4-cntr3);
  481.     GLmatrix mm=Mslerp((float)animcounter, anim3, anim4);
  482.     mm.OrthoInverse();
  483.     glLoadMatrixf(mm());
  484.     }
  485.  
  486.   if (vlak==2)
  487.     {
  488.     GLmatrix m3 = track.coordinate_system(mytime);
  489.   
  490.     quaternion<float> q1 = track.orientation(mytime-100+track.length()*0.4);
  491.     quaternion<float> q2 = track.orientation(mytime+100+track.length()*0.4);
  492.     quaternion<float> q = slerp(0.5F, q1, q2);
  493.     GLmatrix m = Quaternion2Matrix(q);
  494.     m[12] = m3[12];
  495.     m[13] = m3[13];
  496.     m[14] = m3[14];
  497.   
  498.     GLmatrix P;
  499.     P.Identity();
  500.     P.Translate(20.0*cos(mycounter), -20.0+6.0*sin(mycounter), -130.0);
  501.     P.Rotate(10.0, 1.0, 0.0, 0.0);
  502.     P.Rotate(45.0, 0.0, 1.0, 0.0);
  503.     m.OrthoInverse();
  504.     m = P*m;
  505.     glLoadMatrixf(m());
  506.   
  507.     }
  508.     
  509.   drawsphere(mytime2);
  510.   draw_rtgrid();
  511.   draw_rtgrid2();
  512.   DrawTrain(mytime, 2);
  513.   DrawTrain(mytime+track.length()*0.4, 1);
  514.   DrawTrain(mytime+track.length()*0.66, 1);
  515.   draw_rtgrid3();
  516.   scene.Render();
  517. //<-
  518. return 2;
  519. }