home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 July & August / PCWorld_2006-07-08_cd.bin / temacd / planearcade / planearcade.exe / Tank3.bmp / model.cpp < prev    next >
C/C++ Source or Header  |  2004-10-03  |  49KB  |  1,801 lines

  1.  
  2. #include "main.h"
  3.  
  4. //------------------------------------------------------------------
  5. // Name: MODEL()
  6. // Desc: konstruktor
  7. //------------------------------------------------------------------
  8. MODEL::MODEL()
  9. {
  10.  
  11.     g_pVB      = NULL; 
  12.     g_pTexture = NULL;  
  13.     g_pEnviroMap = NULL; 
  14.  
  15.     ModelFrame;
  16.  
  17.     Color = GetColor(1.0f,1.0f,1.0f,1.0f);
  18.     Lighting = true ;
  19.     Specular = false ;
  20.     BumpMap = false;
  21.     EnviromentMapping = false;
  22.     MultiTexture = false; 
  23.     OnlyShadow = false;
  24.     Textured = true;
  25.     FrustrumTest = true;
  26.     SmoothShading = true;
  27.     Normals = true;
  28.     Frame = 0.0f;
  29.  
  30.     NumFrames = 0;
  31.     NumFaces = 0;
  32.  
  33.     Pos = Get3D(0.0f,0.0f,0.0f);
  34.     Rot = Get3D(0.0f,0.0f,0.0f);
  35.     Sca = Get3D(1.0f,1.0f,1.0f);
  36. }
  37.  
  38.  
  39. //------------------------------------------------------------------
  40. // Name: ~MODEL()
  41. // Desc: destruktor
  42. //------------------------------------------------------------------
  43. MODEL::~MODEL()
  44. {
  45.  
  46.     if (g_pTexture != NULL)
  47.         g_pTexture->Release();
  48.     g_pTexture = NULL;
  49.  
  50.     if (g_pEnviroMap != NULL)
  51.         g_pEnviroMap->Release();
  52.     g_pEnviroMap = NULL;
  53.  
  54.     if (g_pVB != NULL)
  55.         g_pVB->Release();
  56.     g_pVB = NULL;
  57.  
  58.     //znicmodel
  59.     DestroyModel(&ModelFrame);
  60.  
  61.  
  62. }
  63.  
  64. //------------------------------------------------------------------
  65. // Name: DestroyModel()
  66. // Desc: Znic model
  67. //------------------------------------------------------------------
  68. void MODEL::DestroyModel(MODELFRAME *Mod)
  69. {
  70.  
  71.     if (Mod->FaceList != NULL)
  72.         delete [] Mod->FaceList;
  73.     Mod->FaceList = NULL;
  74.     
  75. }
  76.  
  77. //------------------------------------------------------------------
  78. // Name: InitializeModel()
  79. // Desc: inicializuj model podla poctu trojholnikov
  80. //------------------------------------------------------------------
  81. void MODEL::InitializeModel(MODELFRAME *Mod,int NFaces)
  82. {
  83.     Mod->FaceList = new MODELFACE[NFaces];
  84.     Mod->NumFaces = NFaces;
  85.     Mod->ActFace = 0;
  86.  
  87.     Mod->Centre = Get3D(0.0f,0.0f,0.0f);
  88. }
  89.  
  90. //------------------------------------------------------------------
  91. // Name: GetNumFace()
  92. // Desc: Zisti pocet Face z Ase suboru
  93. //------------------------------------------------------------------
  94. int MODEL::GetNumFace(char *FileName)
  95. {
  96.     FILE *fp;
  97.     char cBuf[80]; 
  98.     int Vys = 0;
  99.     int Pom = 0;
  100.  
  101.     fp = fopen(FileName,"r");
  102.  
  103.     if (fp == NULL)
  104.     {
  105.         sprintf(cBuf,"  Nenasiel som subor %s",FileName);
  106.         LogPrint(cBuf);
  107.     }
  108.  
  109.     while(!feof(fp))
  110.     {
  111.         fscanf(fp,"%s",cBuf);
  112.  
  113.         if (strcmp("*MESH_NUMFACES",cBuf) == 0)
  114.         {
  115.             fscanf(fp,"%d",&Pom);
  116.             Vys = Vys + Pom;
  117.         }
  118.         
  119.     }
  120.  
  121.     fclose(fp);
  122.  
  123.     return Vys;
  124. }
  125.  
  126.  
  127. //------------------------------------------------------------------
  128. // Name: InitializeAse()
  129. // Desc: zinicializuje polia podla Ase modelu
  130. //------------------------------------------------------------------
  131. void MODEL::InitializeAse(int NFrames,char *FileName)
  132. {
  133.  
  134.     char cBuf[80];
  135.     LogPrint("Inicializujem ASE model");
  136.  
  137.     //nacita pocet trojholnikov z Ase suboru
  138.     NumFrames = NFrames;
  139.     NumFaces = GetNumFace(FileName);
  140.     
  141.     sprintf(cBuf,"  NumFrames: %d",NumFrames);
  142.     LogPrint(cBuf);
  143.     sprintf(cBuf,"  NumFaces: %d",NumFaces);
  144.     LogPrint(cBuf);
  145.  
  146.     //inicializuje model
  147.     InitializeModel(&ModelFrame,NumFaces);
  148.  
  149.     //vytvaranie vertex buffera
  150.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  151.                                    D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEXMODEL,
  152.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  153.       {
  154.         LogPrint("  Chyba pri vytvarani VB");
  155.     }
  156.     else
  157.     {
  158.         LogPrint("  Vertex Buffer vytvoreny");
  159.     }
  160.  
  161.     
  162. }
  163.  
  164.  
  165. //------------------------------------------------------------------
  166. // Name: LoadAse()
  167. // Desc: loadne ase model
  168. //------------------------------------------------------------------
  169. void MODEL::LoadAse(int IntoFrame,char *FileName)
  170. {
  171.  
  172.     FILE *fp;     //subor
  173.     char cBuf[130]; //nacitavanie
  174.  
  175.     fp = fopen(FileName,"r");
  176.  
  177.     if (fp == NULL)
  178.     {
  179.         sprintf(cBuf,"  Nenasiel som subor %s",FileName);
  180.         LogPrint(cBuf);
  181.     }
  182.  
  183.     //ak narazis na GEOMOBJECT nacitaj node
  184.     while(!feof(fp))
  185.     {
  186.         fscanf(fp,"%s",cBuf);
  187.         
  188.         //----------------*GEOMOBJECT----------------
  189.         if (strcmp(cBuf,"*GEOMOBJECT") == 0)
  190.         {
  191.             AddNode(&ModelFrame,fp);
  192.             continue;
  193.         }
  194.  
  195.     }
  196.  
  197.     fclose(fp);
  198.  
  199.     //vypocitajminmax
  200.     CalcBoxPoints(&ModelFrame);
  201.  
  202.     //vypocitaj normaly
  203.     if (Normals == true)
  204.         CalcFaceNormals(&ModelFrame);
  205.  
  206.     //vypocitaj smooth shading
  207.     if (SmoothShading == true)
  208.         CalcSmoothShading(&ModelFrame);
  209.  
  210.     //------------------
  211.     // Naplni VB
  212.     //------------------
  213.     int ActVertex = 0;
  214.  
  215.     //pomocne
  216.     int u,i;
  217.     
  218.     //Vertex do ktoreho sa uklada
  219.     CUSTOMVERTEXMODEL *Vertex;
  220.  
  221.     //Otvor VB
  222.     g_pVB->Lock(0, 0,(void**)&Vertex,D3DLOCK_NOSYSLOCK) ;
  223.  
  224.     //zobrazi model do pola vertexov
  225.     for (i = 0;i<NumFaces;i++)
  226.     {
  227.         for (u=0;u<3;u++)
  228.         {
  229.  
  230.             Vertex[ActVertex].pos.x = ModelFrame.FaceList[i].P[u].X;
  231.             Vertex[ActVertex].pos.y = ModelFrame.FaceList[i].P[u].Y;
  232.             Vertex[ActVertex].pos.z = ModelFrame.FaceList[i].P[u].Z;
  233.  
  234.             Vertex[ActVertex].normal.x = ModelFrame.FaceList[i].N[u].X;
  235.             Vertex[ActVertex].normal.y = ModelFrame.FaceList[i].N[u].Y;
  236.             Vertex[ActVertex].normal.z = ModelFrame.FaceList[i].N[u].Z;
  237.         
  238.             Vertex[ActVertex].tu = ModelFrame.FaceList[i].T[u].X;
  239.             Vertex[ActVertex].tv = ModelFrame.FaceList[i].T[u].Y;
  240.         
  241.             Vertex[ActVertex].color = D3DCOLOR_COLORVALUE(Color.R,
  242.                                                     Color.G,
  243.                                                     Color.B,
  244.                                                     Color.A);
  245.  
  246.     
  247.             ActVertex = ActVertex + 1;                
  248.         }    
  249.  
  250.     }
  251.  
  252.  
  253.     //uzavri VB
  254.     g_pVB->Unlock() ;
  255.  
  256. }
  257.  
  258.  
  259. //------------------------------------------------------------------
  260. // Name: AddNode()
  261. // Desc: prida do modelu geom objekt
  262. //------------------------------------------------------------------
  263. void MODEL::AddNode(MODELFRAME *Mod,FILE *fp)
  264. {
  265.  
  266.     //zasobniky vertexov
  267.     VECTOR3D *V = NULL;
  268.     VECTOR3D *T = NULL;
  269.  
  270.     char cBuf[80]; //nacitavanie
  271.  
  272.     int NumV;  //pocet vertexov
  273.     int NumT;  //pocet texture vertexov   
  274.     int NumF;  //pocet facov
  275.  
  276.     D3DXMATRIX RotationMatrix;
  277.     D3DXVECTOR3 RotVector;
  278.     float RotAngle;
  279.  
  280.     while(1==1)
  281.     {
  282.         //nacitaj retazec
  283.         fscanf(fp,"%s",cBuf);
  284.  
  285.         //-----------*TM_ROTAXIS---------------- 
  286.         if (strcmp(cBuf,"*TM_ROTAXIS") == 0)
  287.         {
  288.             fscanf(fp,"%f %f %f",&RotVector.x,&RotVector.z,&RotVector.y);    
  289.             continue;
  290.         }
  291.  
  292.         //-----------*TM_ROTANGLE---------------
  293.         if (strcmp(cBuf,"*TM_ROTANGLE") == 0)
  294.         {
  295.             fscanf(fp,"%f",&RotAngle);    
  296.  
  297.             //vypocita maticu rotacie
  298.             D3DXMatrixIdentity(&RotationMatrix);     
  299.             D3DXMatrixRotationAxis(&RotationMatrix,&RotVector,RotAngle);
  300.             continue;
  301.         }
  302.  
  303.         //-----------*MESH_NUMVERTEX------------
  304.         if (strcmp(cBuf,"*MESH_NUMVERTEX") == 0)
  305.         {
  306.             fscanf(fp,"%d",&NumV);    
  307.             V = new VECTOR3D[NumV];
  308.             continue;
  309.         }
  310.  
  311.         //-----------*MESH_NUMTVERTEX------------
  312.         if (strcmp(cBuf,"*MESH_NUMTVERTEX") == 0)
  313.         {
  314.             fscanf(fp,"%d",&NumT);    
  315.             T = new VECTOR3D[NumT];
  316.             continue;
  317.         }
  318.         //-----------*MESH_NUMFACES-------------
  319.         if (strcmp(cBuf,"*MESH_NUMFACES") == 0)
  320.         {
  321.             fscanf(fp,"%d",&NumF);    
  322.             continue;
  323.         }
  324.  
  325.         //-----------*MESH_VERTEX---------------
  326.         if (strcmp(cBuf,"*MESH_VERTEX") == 0)
  327.         {
  328.             int Id;
  329.             float Xs, Ys, Zs;
  330.  
  331.             fscanf(fp,"%d %f %f %f",&Id,&Xs,&Zs,&Ys);
  332.             
  333.             V[Id] = Get3D(Xs,Ys,Zs);
  334.  
  335.             continue;
  336.         }
  337.  
  338.         //-----------*MESH_FACE-----------------
  339.         if (strcmp(cBuf,"*MESH_FACE") == 0)
  340.         {
  341.             int Id = Mod->ActFace;
  342.  
  343.             int V1,V2,V3;
  344.  
  345.             fscanf(fp,"%s %s %d %s %d %s %d",cBuf,cBuf,&V1,cBuf,&V2,cBuf,&V3);
  346.         
  347.             Mod->FaceList[Id].P[0] = V[V3];
  348.             Mod->FaceList[Id].P[1] = V[V2];
  349.             Mod->FaceList[Id].P[2] = V[V1];
  350.  
  351.             Mod->ActFace = Mod->ActFace + 1;
  352.  
  353.             continue;
  354.         }
  355.         //-----------*MESH_TVERT----------------
  356.         if (strcmp(cBuf,"*MESH_TVERT") == 0)
  357.         {
  358.             int Idf;
  359.             float Xs, Ys, Zs;
  360.  
  361.             fscanf(fp,"%d %f %f %f",&Idf,&Xs,&Ys,&Zs);
  362.  
  363.             T[Idf] = Get3D(Xs,-Ys,Zs);
  364.             continue;
  365.         }
  366.         //-----------*MESH_TFACE----------------
  367.         if (strcmp(cBuf,"*MESH_TFACE") == 0)
  368.         {
  369.             int Id = Mod->ActFace;
  370.         
  371.             int Idf; 
  372.             int V1,V2,V3;
  373.  
  374.             fscanf(fp,"%d %d %d %d",&Idf,&V1,&V2,&V3);
  375.     
  376.             Mod->FaceList[Id - NumF + Idf].T[0].X = T[V3].X;
  377.             Mod->FaceList[Id - NumF + Idf].T[0].Y = T[V3].Y;
  378.         
  379.             Mod->FaceList[Id - NumF + Idf].T[1].X = T[V2].X;
  380.             Mod->FaceList[Id - NumF + Idf].T[1].Y = T[V2].Y;
  381.             
  382.             Mod->FaceList[Id - NumF + Idf].T[2].X = T[V1].X;
  383.             Mod->FaceList[Id - NumF + Idf].T[2].Y = T[V1].Y;
  384.  
  385.             continue;
  386.         }
  387.  
  388.         //---------*MESH_FACENORMAL----------------
  389.         if (strcmp(cBuf,"*MESH_FACENORMAL") == 0)
  390.         {
  391.             
  392.             float X,Y,Z;
  393.             int Id ;
  394.             int VId;
  395.  
  396.             fscanf(fp,"%d",&Id);
  397.             Id = Mod->ActFace-NumF+Id;
  398.  
  399.             fscanf(fp,"%d %f %f %f",&VId,&X,&Z,&Y);
  400.             
  401.             //v0
  402.             fscanf(fp,"%s %d %f %f %f",cBuf,&VId,&X,&Z,&Y);
  403.             Mod->FaceList[Id].N[2] = Get3D(X,Y,Z);
  404.             Mod->FaceList[Id].N[2] = TransformNormal(Mod->FaceList[Id].N[2], RotationMatrix);
  405.  
  406.             //v1
  407.             fscanf(fp,"%s %d %f %f %f",cBuf,&VId,&X,&Z,&Y);
  408.             Mod->FaceList[Id].N[1] = Get3D(X,Y,Z);
  409.             Mod->FaceList[Id].N[1] = TransformNormal(Mod->FaceList[Id].N[1], RotationMatrix);
  410.  
  411.             //v2
  412.             fscanf(fp,"%s %d %f %f %f",cBuf,&VId,&X,&Z,&Y);
  413.             Mod->FaceList[Id].N[0] = Get3D(X,Y,Z);
  414.             Mod->FaceList[Id].N[0] = TransformNormal(Mod->FaceList[Id].N[0], RotationMatrix);
  415.  
  416.             //plane
  417.             VECTOR3D N,V1,V2;
  418.             Sub(&V1,Mod->FaceList[Id].P[0],Mod->FaceList[Id].P[1]);
  419.             Sub(&V2,Mod->FaceList[Id].P[2],Mod->FaceList[Id].P[1]);
  420.             Cross(&N,V1,V2);
  421.             Normalize(&N);
  422.  
  423.             Mod->FaceList[Id].Plane.Normal = N;
  424.             Mod->FaceList[Id].Plane.D = -(N.X * Mod->FaceList[Id].P[1].X) 
  425.                                         -(N.Y * Mod->FaceList[Id].P[1].Y)
  426.                                         -(N.Z * Mod->FaceList[Id].P[1].Z);
  427.  
  428.  
  429.             continue;
  430.             
  431.         }
  432.  
  433.         //-----------END GEOM OBJ--------------
  434.         if (strcmp(cBuf,"*PROP_MOTIONBLUR") == 0)
  435.         {
  436.             break;
  437.         }
  438.  
  439.         
  440.  
  441.  
  442.     }
  443.  
  444.     if (V != NULL)
  445.         delete [] V;
  446.  
  447.     if (T != NULL)
  448.         delete [] T;
  449.  
  450. }
  451.  
  452.  
  453. //------------------------------------------------------------------
  454. // Name: LoadTexture()
  455. // Desc: Loadne texturu
  456. //------------------------------------------------------------------
  457. void MODEL::LoadTexture(char *FileName,COLOR ColorKey)
  458. {
  459.  
  460.     char cBuf[80];
  461.  
  462.     sprintf(cBuf,"  Textura: %s",FileName);
  463.     LogPrint(cBuf);
  464.     
  465.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  466.                                   FileName,    
  467.                                   D3DX_DEFAULT, 
  468.                                   D3DX_DEFAULT, 
  469.                                   Engine.MipMapLevels,   //MipLevels
  470.                                   0,            
  471.                                   Engine.TextureFormat, 
  472.                                   Engine.TextureCreatingFlag,
  473.                                   D3DX_DEFAULT, //Filter
  474.                                   D3DX_DEFAULT, //MipFilter
  475.                                   D3DXCOLOR    (ColorKey.R,
  476.                                                 ColorKey.G,
  477.                                                 ColorKey.B,
  478.                                                 ColorKey.A),   //ColourKey
  479.                                   NULL,         
  480.                                   NULL,         
  481.                                   &g_pTexture)))  
  482.     {
  483.         sprintf(cBuf,"  chyba pri vytvarani textury: %s",FileName);
  484.         LogPrint(cBuf);
  485.     }
  486.     else
  487.     {
  488.         LogPrint("  Textura modelu vytvorena");
  489.     }    
  490.  
  491. }
  492.  
  493. //------------------------------------------------------------------
  494. // Name: LoadTexture()
  495. // Desc: Loadne texturu
  496. //------------------------------------------------------------------
  497. void MODEL::LoadEnviroMap(char *FileName)
  498. {
  499.  
  500.     char cBuf[80];
  501.  
  502.     sprintf(cBuf,"  Enviroment Textura: %s",FileName);
  503.     LogPrint(cBuf);
  504.     
  505.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  506.                                   FileName,    
  507.                                   D3DX_DEFAULT, 
  508.                                   D3DX_DEFAULT, 
  509.                                   Engine.MipMapLevels,   //MipLevels
  510.                                   0,            
  511.                                   Engine.TextureFormat, 
  512.                                   Engine.TextureCreatingFlag,
  513.                                   D3DX_DEFAULT, //Filter
  514.                                   D3DX_DEFAULT, //MipFilter
  515.                                   0,   //ColourKey
  516.                                   NULL,         
  517.                                   NULL,         
  518.                                   &g_pEnviroMap)))  
  519.     {
  520.         sprintf(cBuf,"  chyba pri vytvarani Enviroment Textury: %s",FileName);
  521.         LogPrint(cBuf);
  522.     }
  523.     else
  524.     {
  525.         LogPrint("  Enviroment Textura modelu vytvorena");
  526.     }    
  527.  
  528. }
  529.  
  530.  
  531. //------------------------------------------------------------------
  532. // Name: RenderModelNormal()
  533. // Desc: Ulozi model do Vertex pola + vyrenderuje normalne
  534. //------------------------------------------------------------------
  535. void MODEL::RenderModelNormal(MODELFRAME Mod)
  536. {
  537.     
  538.     //
  539.     //TEXTURED
  540.     //
  541.     if (Textured == true)
  542.     {
  543.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  544.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  545.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  546.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  547.     }
  548.     else
  549.     {
  550.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  551.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
  552.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  553.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  554.     }
  555.  
  556.     //nastav material
  557.     g_pd3dDevice->SetMaterial(&Material);
  558.  
  559.     //zapni vypni svetla
  560.     Engine.SetLighting(Lighting);
  561.  
  562.     //zapni specular ak je zapnuty
  563.     Engine.SetSpecular(Specular);
  564.  
  565.     //zapni dx back face culling
  566.     Engine.SetCullMode(D3DCULL_CCW);
  567.  
  568.     //renderuje z VB
  569.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  570.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  571.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  572.             
  573.     //reset to default
  574.     Engine.ResetToDefault();
  575.  
  576.     
  577. }
  578.  
  579. //------------------------------------------------------------------
  580. // Name: RenderModelOnlyShadow()
  581. // Desc: Ulozi model do Vertex pola + iba pre tien
  582. //------------------------------------------------------------------
  583. void MODEL::RenderModelOnlyShadow(MODELFRAME Mod)
  584. {
  585.     
  586.     int ActVertex = 0;
  587.  
  588.     //
  589.     //TEXTURED
  590.     //
  591.     if (Textured == true)
  592.     {
  593.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  594.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  595.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  596.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  597.     }
  598.     else
  599.     {
  600.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  601.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
  602.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  603.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  604.     }
  605.  
  606.     //reset to default
  607.     Engine.ResetToDefault();
  608.  
  609.     
  610. }
  611.  
  612. //------------------------------------------------------------------
  613. // Name: RenderModelEnvironment()
  614. // Desc: Ulozi model do Vertex pola + vyrenderuje cez enviro mapping
  615. //------------------------------------------------------------------
  616. void MODEL::RenderModelEnvironment(MODELFRAME Mod)
  617. {
  618.     
  619.     int ActVertex = 0;
  620.  
  621.     //pomocne
  622.     VECTOR3D P,N;
  623.     int u,i;
  624.     
  625.     //Vertex do ktoreho sa uklada
  626.     CUSTOMVERTEXMODEL *Vertex;
  627.  
  628.     //Otvor VB
  629.     g_pVB->Lock(0, 0, (void**)&Vertex, D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE ) ;
  630.  
  631.     //zobrazi model do pola vertexov
  632.     for (i = 0;i<NumFaces;i++)
  633.     {
  634.         for (u=0;u<3;u++)
  635.         {
  636.  
  637.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  638.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  639.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  640.  
  641.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  642.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  643.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  644.         
  645.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  646.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  647.         
  648.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  649.                                                 Color.G,
  650.                                                 Color.B,
  651.                                                 Color.A);
  652.  
  653.             //////////////////////
  654.             //ENVIROMENT MAPPING//
  655.             //////////////////////
  656.             P = TransformPoint(Mod.FaceList[i].P[u],Matica);
  657.             N = TransformNormal(Mod.FaceList[i].N[u],Matica);
  658.  
  659.             Mod.FaceList[i].T[u] = EnvironmentMapping(P,N,400.0f,matView);
  660.         
  661.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  662.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  663.  
  664.         
  665.     
  666.             ActVertex = ActVertex + 1;                
  667.         }    
  668.  
  669.     }
  670.  
  671.  
  672.     //uzavri VB
  673.     g_pVB->Unlock() ;
  674.  
  675.     g_pd3dDevice->SetTexture( 0, g_pTexture );
  676.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  677.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  678.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  679.  
  680.     //nastav material
  681.     g_pd3dDevice->SetMaterial(&Material);
  682.  
  683.     //zapni vypni svetla
  684.     Engine.SetLighting(Lighting);
  685.  
  686.     //zapni specular ak je zapnuty
  687.     Engine.SetSpecular(Specular);
  688.  
  689.     //renderuje z VB
  690.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  691.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  692.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  693.             
  694.     //reset to default
  695.     Engine.ResetToDefault();
  696.  
  697.  
  698. }
  699.  
  700. //------------------------------------------------------------------
  701. // Name: RenderModelMultiTexture()
  702. // Desc: Ulozi model do Vertex pola + vyrenderuje cez enviro mapping
  703. //------------------------------------------------------------------
  704. void MODEL::RenderModelMultiTexture(MODELFRAME Mod)
  705. {
  706.     
  707.     int ActVertex = 0;
  708.  
  709.  
  710.     g_pd3dDevice->SetTexture( 0,  g_pTexture );
  711.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
  712.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  713.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  714.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  715.  
  716.     g_pd3dDevice->SetTexture( 1,  g_pEnviroMap );
  717.     D3DXMATRIX mat;
  718.     mat._11 = 0.65f; mat._12 = 0.00f; mat._13 = 0.00f; mat._14 = 0.00f;
  719.     mat._21 = 0.00f; mat._22 = 0.65f; mat._23 = 0.00f; mat._24 = 0.00f;
  720.     mat._31 = 0.00f; mat._32 = 0.00f; mat._33 = 1.00f; mat._34 = 0.00f;
  721.     mat._41 = 0.00f; mat._42 = 0.00f; mat._43 = 0.00f; mat._44 = 1.00f;
  722.     g_pd3dDevice->SetTransform( D3DTS_TEXTURE1, &mat );
  723.     g_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
  724.     g_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS,  D3DTTFF_COUNT3);
  725.  
  726.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
  727.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  728.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
  729.  
  730.     //nastav material
  731.     g_pd3dDevice->SetMaterial(&Material);
  732.  
  733.     //zapni vypni svetla
  734.     Engine.SetLighting(Lighting);
  735.  
  736.     //zapni specular ak je zapnuty
  737.     Engine.SetSpecular(Specular);
  738.  
  739.     //renderuje z VB
  740.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  741.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  742.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  743.             
  744.     //reset to default
  745.     Engine.ResetToDefault();
  746.     D3DXMatrixIdentity(&mat);
  747.     g_pd3dDevice->SetTransform( D3DTS_TEXTURE1,&mat );
  748.  
  749.  
  750. }
  751.  
  752. //------------------------------------------------------------------
  753. // Name: RenderModelBumpMap()
  754. // Desc: Ulozi model do Vertex pola + vyrenderuje cez bump mapping
  755. //------------------------------------------------------------------
  756. void MODEL::RenderModelBumpMap(MODELFRAME Mod)
  757. {
  758.     
  759.     int ActVertex = 0;
  760.  
  761.     //pomocne
  762. //    VECTOR3D N;
  763. //    VECTOR2D T;
  764.     int u,i;
  765.     
  766.     //Vertex do ktoreho sa uklada
  767.     CUSTOMVERTEXMODEL *Vertex;
  768.  
  769.     //Otvor VB
  770.     g_pVB->Lock(0, 0, (void**)&Vertex,D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE) ;
  771.  
  772.     //zobrazi model do pola vertexov
  773.     for (i = 0;i<NumFaces;i++)
  774.     {
  775.         for (u=0;u<3;u++)
  776.         {
  777.  
  778.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  779.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  780.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  781.  
  782.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  783.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  784.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  785.         
  786.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  787.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  788.         
  789.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  790.                                                 Color.G,
  791.                                                 Color.B,
  792.                                                 Color.A);
  793.  
  794.             /*
  795.             ////////////////
  796.             //BUMP MAPPING//
  797.             ////////////////
  798.             N = TransformNormal(Mod.FaceList[i].N[u],Matica);
  799.  
  800.             T = BumpMapping(N,Mod.FaceList[i].T[u],0.05f,matView);
  801.     
  802.             //suradnice pre bump map
  803.             Vertex[ActVertex].tu2 = T.X;
  804.             Vertex[ActVertex].tv2 = T.Y;
  805.             */
  806.  
  807.             
  808.             
  809.             ActVertex = ActVertex + 1;                
  810.         }    
  811.  
  812.     }
  813.  
  814.  
  815.     //uzavri VB
  816.     g_pVB->Unlock() ;
  817.  
  818.     ////////////////
  819.     //BUMP MAPPING//
  820.     ////////////////
  821.     g_pd3dDevice->SetTexture( 0,  g_pTexture );
  822.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
  823.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  824.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  825.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  826.  
  827.     g_pd3dDevice->SetTexture( 1,  g_pTexture );
  828.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
  829.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
  830.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  831.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
  832.  
  833.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_ADDSIGNED );
  834.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT );
  835.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
  836.     
  837.     Engine.SetBlendCustom(D3DBLEND_SRCALPHA,D3DBLEND_ZERO);
  838.  
  839.  
  840.  
  841.     //nastav material
  842.     g_pd3dDevice->SetMaterial(&Material);
  843.  
  844.     //zapni vypni svetla
  845.     Engine.SetLighting(Lighting);
  846.  
  847.     //zapni specular ak je zapnuty
  848.     Engine.SetSpecular(Specular);
  849.  
  850.     //renderuje z VB
  851.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  852.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  853.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  854.             
  855.     //reset to default
  856.     Engine.ResetToDefault();
  857.  
  858.     //zresetuj blending
  859.     Engine.SetBlendNone();
  860.  
  861.  
  862. }
  863.  
  864.  
  865. //------------------------------------------------------------------
  866. // Name: Render()
  867. // Desc: Vyrenderuje 
  868. //------------------------------------------------------------------
  869. void MODEL::Render()
  870. {
  871.  
  872.     if (Frame >= NumFrames)
  873.             Frame = 0.0f;
  874.  
  875.     //vypocita maticu
  876.     Matica = GetMatrix(Pos,Rot,Sca);
  877.  
  878.     //ziska polomer a minmax
  879.     CalcMinMax(&ModelFrame,Matica);    
  880.     
  881.     //ak model vidno renderuj ho
  882.     if ((Camera.FrustrumSphere(ModelFrame.Centre,ModelFrame.Polomer) == true) ||
  883.         (FrustrumTest == false))
  884.     {
  885.         //nastavi maticu
  886.         g_pd3dDevice->SetTransform(D3DTS_WORLD, &Matica);
  887.  
  888.         //renderuj model
  889.         if (EnviromentMapping == true)
  890.             RenderModelEnvironment(ModelFrame);
  891.         if (MultiTexture == true && SpecularEffects == 1)
  892.             RenderModelMultiTexture(ModelFrame);
  893.         else if (BumpMap == true)
  894.             RenderModelBumpMap(ModelFrame);
  895.         else if (OnlyShadow == true)
  896.             RenderModelOnlyShadow(ModelFrame);
  897.         else
  898.             RenderModelNormal(ModelFrame);
  899.     }
  900. }
  901.  
  902. //------------------------------------------------------------------
  903. // Name: RenderFast()
  904. // Desc: Rychle vykreslenie
  905. //------------------------------------------------------------------
  906. void MODEL::RenderFast()
  907. {
  908. /*
  909.     if (Frame >= NumFrames)
  910.             Frame = 0.0f;
  911.  
  912.     //vypocita maticu
  913.     Matica = GetMatrix(Pos,Rot,Sca);
  914.  
  915.     //ziska polomer a minmax
  916.     CalcMinMax(&ModelFrame[(int)Frame],Matica);
  917.  
  918.     //ulozi min max do transformacneho modelu
  919.     ModelT.Min = ModelFrame[(int)Frame].Min;
  920.     ModelT.Max = ModelFrame[(int)Frame].Max;
  921.     ModelT.Centre = ModelFrame[(int)Frame].Centre;
  922.     ModelT.Polomer = ModelFrame[(int)Frame].Polomer;
  923.  
  924.     //ak model vidno renderuj ho
  925.     if ((Camera.FrustrumSphere(ModelT.Centre,ModelT.Polomer) == true) ||
  926.         (FrustrumTest == false))
  927.     {
  928.         //interpoluje model podla animacie
  929.         InterpolateModel(&ModelT);
  930.         
  931.         //nastavi maticu
  932.         g_pd3dDevice->SetTransform( D3DTS_WORLD, &Matica);
  933.  
  934.         //renderuj model
  935.         if (EnviromentMapping == true)
  936.             RenderModelEnvironment(ModelT);
  937.         else if (BumpMap == true)
  938.             RenderModelBumpMap(ModelT);
  939.         else
  940.             RenderModelNormal(ModelT);
  941.     }*/
  942. }
  943.  
  944. //------------------------------------------------------------------
  945. // Name: CalcFaceNormals()
  946. // Desc: Vypocita normaly
  947. //------------------------------------------------------------------
  948. void MODEL::CalcFaceNormals(MODELFRAME *Mod)
  949. {
  950.  
  951.     VECTOR3D V1;
  952.     VECTOR3D V2;
  953.     VECTOR3D N;
  954.     
  955.     for (int i=0;i<NumFaces;i++)
  956.     {
  957.         //normalovy vektor
  958.         Sub(&V1,Mod->FaceList[i].P[0],Mod->FaceList[i].P[1]);
  959.         Sub(&V2,Mod->FaceList[i].P[2],Mod->FaceList[i].P[1]);
  960.         Cross(&N,V1,V2);
  961.         Normalize(&N);
  962.  
  963.         //kazdy vertex
  964.         Mod->FaceList[i].N[0] = N;
  965.         Mod->FaceList[i].N[1] = N;
  966.         Mod->FaceList[i].N[2] = N;
  967.  
  968.         //vypocet plane trojholnika
  969.         Mod->FaceList[i].Plane.Normal = N;
  970.         Mod->FaceList[i].Plane.D = -(N.X * Mod->FaceList[i].P[1].X) 
  971.                                    -(N.Y * Mod->FaceList[i].P[1].Y)
  972.                                    -(N.Z * Mod->FaceList[i].P[1].Z);
  973.  
  974.     }
  975.     
  976. }
  977. //------------------------------------------------------------------
  978. // Name: CalcBoxPoints()
  979. // Desc: Vypocita body krabice
  980. //------------------------------------------------------------------
  981. void MODEL::CalcBoxPoints(MODELFRAME *Mod)
  982. {
  983.     VECTOR3D Min = {10000.0f,10000.0f,10000.0f};
  984.     VECTOR3D Max = {-10000.0f,-10000.0f,-10000.0f};
  985.  
  986.     for (int i=0;i<NumFaces;i++)
  987.     {
  988.     
  989.         //
  990.         //min max
  991.         //
  992.         for (int u=0;u<3;u++)
  993.         {
  994.             if (Mod->FaceList[i].P[u].X < Min.X)
  995.                 Min.X = Mod->FaceList[i].P[u].X;
  996.             if (Mod->FaceList[i].P[u].Y < Min.Y)
  997.                 Min.Y = Mod->FaceList[i].P[u].Y;
  998.             if (Mod->FaceList[i].P[u].Z < Min.Z)
  999.                 Min.Z = Mod->FaceList[i].P[u].Z;
  1000.     
  1001.             if (Mod->FaceList[i].P[u].X > Max.X)
  1002.                 Max.X = Mod->FaceList[i].P[u].X;
  1003.             if (Mod->FaceList[i].P[u].Y > Max.Y)
  1004.                 Max.Y = Mod->FaceList[i].P[u].Y;
  1005.             if (Mod->FaceList[i].P[u].Z > Max.Z)
  1006.                 Max.Z = Mod->FaceList[i].P[u].Z;
  1007.         }
  1008.             
  1009.     }
  1010.  
  1011.     //
  1012.     //body
  1013.     //
  1014.  
  1015.     //spodna plocha
  1016.     Mod->P[0].X = Min.X;
  1017.     Mod->P[0].Y = Min.Y;
  1018.     Mod->P[0].Z = Min.Z;
  1019.  
  1020.     Mod->P[1].X = Max.X;
  1021.     Mod->P[1].Y = Min.Y;
  1022.     Mod->P[1].Z = Min.Z;
  1023.  
  1024.     Mod->P[2].X = Max.X;
  1025.     Mod->P[2].Y = Min.Y;
  1026.     Mod->P[2].Z = Max.Z;
  1027.  
  1028.     Mod->P[3].X = Min.X;
  1029.     Mod->P[3].Y = Min.Y;
  1030.     Mod->P[3].Z = Max.Z;
  1031.  
  1032.     //vrchna plocha
  1033.     Mod->P[4].X = Min.X;
  1034.     Mod->P[4].Y = Max.Y;
  1035.     Mod->P[4].Z = Min.Z;
  1036.  
  1037.     Mod->P[5].X = Max.X;
  1038.     Mod->P[5].Y = Max.Y;
  1039.     Mod->P[5].Z = Min.Z;
  1040.  
  1041.     Mod->P[6].X = Max.X;
  1042.     Mod->P[6].Y = Max.Y;
  1043.     Mod->P[6].Z = Max.Z;
  1044.  
  1045.     Mod->P[7].X = Min.X;
  1046.     Mod->P[7].Y = Max.Y;
  1047.     Mod->P[7].Z = Max.Z;
  1048. }
  1049.  
  1050.  
  1051. //------------------------------------------------------------------
  1052. // Name: CalcBoxPoints()
  1053. // Desc: Vypocita body krabice
  1054. //------------------------------------------------------------------
  1055. void MODEL::CalcMinMax(MODELFRAME *Mod,D3DXMATRIXA16 Matica)
  1056. {
  1057.     VECTOR3D Min = {10000.0f,10000.0f,10000.0f};
  1058.     VECTOR3D Max = {-10000.0f,-10000.0f,-10000.0f};
  1059.  
  1060.     VECTOR3D P[8];
  1061.  
  1062.     P[0] = TransformPoint(Mod->P[0],Matica);
  1063.     P[1] = TransformPoint(Mod->P[1],Matica);
  1064.     P[2] = TransformPoint(Mod->P[2],Matica);
  1065.     P[3] = TransformPoint(Mod->P[3],Matica);
  1066.     P[4] = TransformPoint(Mod->P[4],Matica);
  1067.     P[5] = TransformPoint(Mod->P[5],Matica);
  1068.     P[6] = TransformPoint(Mod->P[6],Matica);
  1069.     P[7] = TransformPoint(Mod->P[7],Matica);
  1070.  
  1071.     for (int i=0;i<8;i++)
  1072.     {
  1073.         //
  1074.         //min max
  1075.         //
  1076.     
  1077.         if (P[i].X < Min.X)
  1078.             Min.X = P[i].X;
  1079.         if (P[i].Y < Min.Y)
  1080.             Min.Y = P[i].Y;
  1081.         if (P[i].Z < Min.Z)
  1082.             Min.Z = P[i].Z;
  1083.     
  1084.         if (P[i].X > Max.X)
  1085.             Max.X = P[i].X;
  1086.         if (P[i].Y > Max.Y)
  1087.             Max.Y = P[i].Y;
  1088.         if (P[i].Z > Max.Z)
  1089.             Max.Z = P[i].Z;
  1090.  
  1091.             
  1092.     }
  1093.  
  1094.     //
  1095.     //uloz hodnoty
  1096.     //
  1097.  
  1098.     Mod->Centre.X = (Max.X + Min.X)/2.0f;
  1099.     Mod->Centre.Y = (Max.Y + Min.Y)/2.0f;
  1100.     Mod->Centre.Z = (Max.Z + Min.Z)/2.0f;
  1101.  
  1102.     Mod->Min = Min;
  1103.     Mod->Max = Max;
  1104.  
  1105.     Mod->Polomer = CalcDistance(Min,Mod->Centre);
  1106.     
  1107.     
  1108. }
  1109.  
  1110.  
  1111. //------------------------------------------------------------------
  1112. // Name: TransformModel()
  1113. // Desc: 
  1114. //------------------------------------------------------------------
  1115. void MODEL::TransformModel(MODELFRAME *Mod,D3DXMATRIXA16 Matica)
  1116. {
  1117.  
  1118.  
  1119.     for (int i=0;i<NumFaces;i++)
  1120.     {
  1121.         Mod->FaceList[i].P[0] = TransformPoint(Mod->FaceList[i].P[0],Matica);    
  1122.         Mod->FaceList[i].P[1] = TransformPoint(Mod->FaceList[i].P[1],Matica);    
  1123.         Mod->FaceList[i].P[2] = TransformPoint(Mod->FaceList[i].P[2],Matica);    
  1124.  
  1125.         Mod->FaceList[i].N[0] = TransformNormal(Mod->FaceList[i].N[0],Matica);    
  1126.         Mod->FaceList[i].N[1] = TransformNormal(Mod->FaceList[i].N[1],Matica);    
  1127.         Mod->FaceList[i].N[2] = TransformNormal(Mod->FaceList[i].N[2],Matica);
  1128.         
  1129.         Mod->FaceList[i].Plane = TransformPlane(Mod->FaceList[i].Plane,Matica);
  1130.     
  1131.         Mod->ZeroPoint = TransformPoint(Mod->ZeroPoint,Matica);
  1132.     }
  1133. }
  1134.  
  1135.  
  1136.  
  1137. //------------------------------------------------------------------
  1138. // Name: InterpolateModel()
  1139. // Desc: interpoluje model a posle ho do ModelT
  1140. //------------------------------------------------------------------
  1141. void MODEL::InterpolateModel(MODELFRAME *Mod)
  1142. {
  1143. /*    
  1144.     //dolny horny snimok
  1145.     int F1 = (int)Frame;
  1146.     int F2 = ((int)Frame) + 1;
  1147.  
  1148.     if (F2 == NumFrames)
  1149.         F2 = 0;
  1150.  
  1151.     //Interpolant
  1152.     float Int = Frame - ((float)F1);
  1153.  
  1154.     //netreba zbytocne interpolovat ak je interpolant rovny nule
  1155.     if (Int != 0.0f)
  1156.     {
  1157.     
  1158.         for (int i=0;i<NumFaces;i++)
  1159.         {
  1160.  
  1161.             for (int u=0;u<3;u++)
  1162.             {
  1163.                 Mod->FaceList[i].P[u].X = ModelFrame[F1].FaceList[i].P[u].X + (Int *(ModelFrame[F2].FaceList[i].P[u].X - ModelFrame[F1].FaceList[i].P[u].X));    
  1164.                 Mod->FaceList[i].P[u].Y = ModelFrame[F1].FaceList[i].P[u].Y + (Int *(ModelFrame[F2].FaceList[i].P[u].Y - ModelFrame[F1].FaceList[i].P[u].Y));    
  1165.                 Mod->FaceList[i].P[u].Z = ModelFrame[F1].FaceList[i].P[u].Z + (Int *(ModelFrame[F2].FaceList[i].P[u].Z - ModelFrame[F1].FaceList[i].P[u].Z));    
  1166.  
  1167.                 Mod->FaceList[i].N[u].X = ModelFrame[F1].FaceList[i].N[u].X + (Int *(ModelFrame[F2].FaceList[i].N[u].X - ModelFrame[F1].FaceList[i].N[u].X));    
  1168.                 Mod->FaceList[i].N[u].Y = ModelFrame[F1].FaceList[i].N[u].Y + (Int *(ModelFrame[F2].FaceList[i].N[u].Y - ModelFrame[F1].FaceList[i].N[u].Y));    
  1169.                 Mod->FaceList[i].N[u].Z = ModelFrame[F1].FaceList[i].N[u].Z + (Int *(ModelFrame[F2].FaceList[i].N[u].Z - ModelFrame[F1].FaceList[i].N[u].Z));    
  1170.     
  1171.                 Mod->FaceList[i].T[u].X = ModelFrame[F1].FaceList[i].T[u].X;    
  1172.                 Mod->FaceList[i].T[u].Y = ModelFrame[F1].FaceList[i].T[u].Y;    
  1173.     
  1174.             }
  1175.  
  1176.             Mod->FaceList[i].Plane.Normal.X = ModelFrame[F1].FaceList[i].Plane.Normal.X + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.X - ModelFrame[F1].FaceList[i].Plane.Normal.X));    
  1177.             Mod->FaceList[i].Plane.Normal.Y = ModelFrame[F1].FaceList[i].Plane.Normal.Y + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.Y - ModelFrame[F1].FaceList[i].Plane.Normal.Y));    
  1178.             Mod->FaceList[i].Plane.Normal.Z = ModelFrame[F1].FaceList[i].Plane.Normal.Z + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.Z - ModelFrame[F1].FaceList[i].Plane.Normal.Z));    
  1179.             Mod->FaceList[i].Plane.D = ModelFrame[F1].FaceList[i].Plane.D + (Int *(ModelFrame[F2].FaceList[i].Plane.D - ModelFrame[F1].FaceList[i].Plane.D));    
  1180.     
  1181.  
  1182.             for (u=0;u<8;u++)
  1183.             {
  1184.                 Mod->P[u] = ModelFrame[F1].P[u];
  1185.             }
  1186.         }
  1187.     
  1188.     }
  1189.  
  1190.     else  ////////
  1191.  
  1192.     {
  1193.         for (int i=0;i<NumFaces;i++)
  1194.         {
  1195.             for (int u=0;u<3;u++)
  1196.             {
  1197.                 Mod->FaceList[i].P[u] = ModelFrame[F1].FaceList[i].P[u] ;    
  1198.                 Mod->FaceList[i].N[u] = ModelFrame[F1].FaceList[i].N[u] ;    
  1199.                 Mod->FaceList[i].Plane = ModelFrame[F1].FaceList[i].Plane;    
  1200.                 Mod->FaceList[i].T[u] = ModelFrame[F1].FaceList[i].T[u];    
  1201.                 Mod->FaceList[i].T[u] = ModelFrame[F1].FaceList[i].T[u];    
  1202.     
  1203.             }
  1204.  
  1205.             for (u=0;u<8;u++)
  1206.             {
  1207.                 Mod->P[u] = ModelFrame[F1].P[u];
  1208.             }
  1209.         }
  1210.     
  1211.     }*/
  1212. }
  1213.  
  1214. //------------------------------------------------------------------
  1215. // Name: Smooth Shading
  1216. // Desc: vypocita smooth shading
  1217. //------------------------------------------------------------------
  1218. void MODEL::CalcSmoothShading(MODELFRAME *Mod)
  1219. {
  1220.  
  1221.     VECTOR3D *Normal = NULL;
  1222.     Normal = new VECTOR3D[NumFaces];
  1223.     
  1224.     for (int i=0;i<NumFaces;i=i+1)
  1225.     {
  1226.     for (int u=0;u<3;u=u+1)
  1227.     {
  1228.  
  1229.         //bod
  1230.         VECTOR3D B = Mod->FaceList[i].P[u];
  1231.         
  1232.         VECTOR3D NormalVys = Get3D(0.0f,0.0f,0.0f);
  1233.         int ActNormal = 0;
  1234.  
  1235.         //ziskaj normaly
  1236.         for (int j=0;j<NumFaces;j=j+1)
  1237.         {
  1238.         for (int k=0;k<3;k=k+1)
  1239.         {
  1240.             
  1241.  
  1242.             if((B.X == Mod->FaceList[j].P[k].X)  &&
  1243.                (B.Y == Mod->FaceList[j].P[k].Y)  &&
  1244.                (B.Z == Mod->FaceList[j].P[k].Z) )
  1245.             {
  1246.         
  1247.                 Normal[ActNormal] = Mod->FaceList[j].Plane.Normal ;
  1248.                 ActNormal++;
  1249.                             
  1250.             }
  1251.  
  1252.         }
  1253.         }
  1254.  
  1255.         //vypocitaj normalu
  1256.         for (int a=0;a<ActNormal;a++)
  1257.         {
  1258.             Add(&NormalVys,NormalVys,Normal[a]);
  1259.         }
  1260.         
  1261.         //normalizuj vyslednu normalu
  1262.         Normalize(&NormalVys);
  1263.  
  1264.         //zapis nove normaly
  1265.         for (j=0;j<NumFaces;j++)
  1266.         {
  1267.         for (int k=0;k<3;k++)
  1268.         {
  1269.  
  1270.             if((B.X == Mod->FaceList[j].P[k].X)  &&
  1271.                (B.Y == Mod->FaceList[j].P[k].Y)  &&
  1272.                (B.Z == Mod->FaceList[j].P[k].Z) )
  1273.             {
  1274.                 Mod->FaceList[j].N[k] = NormalVys;
  1275.             }
  1276.  
  1277.         }
  1278.         }
  1279.  
  1280.  
  1281.     }
  1282.     }
  1283.  
  1284.     if (Normal != NULL)
  1285.         delete [] Normal;
  1286.     Normal = NULL;
  1287.  
  1288.  
  1289.  
  1290. }
  1291.  
  1292.  
  1293. //------------------------------------------------------------------
  1294. // Name: SetMaterial()
  1295. // Desc: nastavy material
  1296. //------------------------------------------------------------------
  1297. void MODEL::SetMaterial(D3DMATERIAL9 Mat)
  1298. {
  1299.     Material = Mat;
  1300. }
  1301.  
  1302.  
  1303. //------------------------------------------------------------------
  1304. // Name: CollisionBox()
  1305. // Desc: Bouring box kolizia
  1306. //------------------------------------------------------------------
  1307. bool MODEL::CollisionBox(VECTOR3D P1, VECTOR3D P2,D3DXMATRIX PomMatrix)
  1308. {
  1309.  
  1310.     //transformuj body
  1311.     P1 = UnTransformPoint(P1,PomMatrix);
  1312.     P2 = UnTransformPoint(P2,PomMatrix);
  1313.  
  1314.     if (CollisionBoxEdge(P1,P2,ModelFrame.P[0],ModelFrame.P[6]))
  1315.         return true;
  1316.     else
  1317.         return false;
  1318.  
  1319. }
  1320.  
  1321.  
  1322. //------------------------------------------------------------------
  1323. // Name: CollisionDetail()
  1324. // Desc: detailna kolizia
  1325. //------------------------------------------------------------------
  1326. bool MODEL::CollisionDetail(VECTOR3D P1,VECTOR3D P2,D3DXMATRIX PomMatrix)
  1327. {
  1328.  
  1329.     //iba ak collision BOX == true
  1330.     if (CollisionBox(P1,P2,PomMatrix) == false)
  1331.         return false;
  1332.     else
  1333.     {
  1334.  
  1335.  
  1336.     //uhly
  1337.     float U,U1,U2,U3;
  1338.  
  1339.     //
  1340.     //testuj pre vsetky face
  1341.     //
  1342.  
  1343.  
  1344.     //transformuj body
  1345.     P1 = UnTransformPoint(P1,PomMatrix);
  1346.     P2 = UnTransformPoint(P2,PomMatrix);
  1347.  
  1348.     VECTOR3D Inter; //priesecnik
  1349.  
  1350.     for (int i=0;i<NumFaces;i++)
  1351.     {
  1352.  
  1353.         if (CalcPriesEdge(&Inter,ModelFrame.FaceList[i].Plane,P1,P2) == true)
  1354.         {
  1355.             
  1356.             U1 = CalcAngleCentre(Inter,ModelFrame.FaceList[i].P[0],
  1357.                                        ModelFrame.FaceList[i].P[1]);
  1358.             U2 = CalcAngleCentre(Inter,ModelFrame.FaceList[i].P[1],
  1359.                                        ModelFrame.FaceList[i].P[2]);
  1360.             U3 = CalcAngleCentre(Inter,ModelFrame.FaceList[i].P[2],
  1361.                                        ModelFrame.FaceList[i].P[0]);
  1362.  
  1363.             U = U1+U2+U3;
  1364.  
  1365.             if (U > 6.2f && U < 6.35f)
  1366.             {
  1367.                 ColPosition = TransformPoint(Inter,PomMatrix);
  1368.                 ColNormal = TransformNormal(ModelFrame.FaceList[i].Plane.Normal,PomMatrix);
  1369.             
  1370.                 return true;
  1371.             }
  1372.         }
  1373.     }
  1374.  
  1375.     return false;
  1376.  
  1377.     }
  1378.  
  1379. }
  1380.  
  1381. //------------------------------------------------------------------
  1382. // Name: LoadMD2
  1383. // Desc: Nacita MD2 model
  1384. //------------------------------------------------------------------
  1385. void MODEL::LoadMD2(char *FileName,int NFrames)
  1386. {
  1387.  
  1388. /*    //info pre Log
  1389.     char cBuf[80];
  1390.     LogPrint("Inicializujem MD2 model");
  1391.     sprintf(cBuf,"  Subor: %s",FileName);
  1392.     
  1393.  
  1394.     FILE *File = NULL;  //subor z ktoreho sa bude citat
  1395.  
  1396.     tMd2Header m_Header;
  1397.  
  1398.     ////////////////
  1399.     //otvori subor//
  1400.     ////////////////
  1401.     File = fopen(FileName, "rb");
  1402.     if (File == NULL)
  1403.         LogPrint("  Subor sa nenasiel");
  1404.  
  1405.  
  1406.     ////////////////////
  1407.     //nacitaj hlavicku//
  1408.     ////////////////////
  1409.     fread(&m_Header, 1, sizeof(tMd2Header), File);
  1410.     
  1411.     NumFaces = m_Header.numTriangles;
  1412.     NumFrames = NFrames;
  1413.  
  1414.     //info pre log
  1415.     sprintf(cBuf,"  Pocet snimkov: %d",m_Header.numFrames);
  1416.     LogPrint(cBuf);
  1417.     sprintf(cBuf,"  Pocet vertex: %d",m_Header.numVertices);
  1418.     LogPrint(cBuf);
  1419.     sprintf(cBuf,"  Pocet trojholnikov: %d",m_Header.numTriangles);
  1420.     LogPrint(cBuf);
  1421.  
  1422.  
  1423.     /////////////////////////
  1424.     //inicializacia modelov//
  1425.     /////////////////////////
  1426.  
  1427.     //vytvori zasobnik modelov
  1428.     ModelFrame = new MODELFRAME [NumFrames];
  1429.  
  1430.     //inicializuje zasobnik modelov
  1431.     for (int i=0;i<NumFrames;i++)
  1432.     {
  1433.         InitializeModel(&ModelFrame[i],NumFaces);
  1434.     }
  1435.  
  1436.     //inicializuje transformovany model
  1437.     InitializeModel(&ModelT,NumFaces);
  1438.  
  1439.     ////////////////////////////
  1440.     //vytvaranie vertex buffer//
  1441.     ////////////////////////////
  1442.  
  1443.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  1444.                                    D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXMODEL,
  1445.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  1446.       {
  1447.         LogPrint("  Chyba pri vytvarani VB");
  1448.     }
  1449.     else
  1450.     {
  1451.         LogPrint("  Vertex Buffer vytvoreny");
  1452.     }
  1453.  
  1454.     ///////////////////////////////////
  1455.     //veci potrebne pre nacitanie MD2//
  1456.     ///////////////////////////////////
  1457.     unsigned char buffer[MD2_MAX_FRAMESIZE];
  1458.  
  1459.     tMd2Skin *m_pSkins         = new tMd2Skin [m_Header.numSkins];
  1460.     tMd2TexCoord *m_pTexCoords = new tMd2TexCoord [m_Header.numTexCoords];
  1461.     tMd2Face *m_pTriangles     = new tMd2Face [m_Header.numTriangles];
  1462.     tMd2Frame *m_pFrames       = new tMd2Frame [m_Header.numFrames];
  1463.  
  1464.  
  1465.     //////////////////////
  1466.     //Nacitavanie udajov//
  1467.     //////////////////////
  1468.     
  1469.     fseek(File, m_Header.offsetSkins, SEEK_SET);
  1470.     fread(m_pSkins, sizeof(tMd2Skin), m_Header.numSkins, File);
  1471.     
  1472.     fseek(File, m_Header.offsetTexCoords, SEEK_SET);
  1473.     fread(m_pTexCoords, sizeof(tMd2TexCoord), m_Header.numTexCoords, File);
  1474.  
  1475.     fseek(File, m_Header.offsetTriangles, SEEK_SET);
  1476.     fread(m_pTriangles, sizeof(tMd2Face), m_Header.numTriangles, File);
  1477.             
  1478.     fseek(File, m_Header.offsetFrames, SEEK_SET);
  1479.  
  1480.     for (i=0; i < m_Header.numFrames; i++)
  1481.     {
  1482.         // Assign our alias frame to our buffer memory
  1483.         tMd2AliasFrame *pFrame = (tMd2AliasFrame *) buffer;
  1484.  
  1485.         // Allocate the memory for the first frame of animation's vertices
  1486.         m_pFrames[i].pVertices = new tMd2Triangle [m_Header.numVertices];
  1487.  
  1488.         // Read in the first frame of animation
  1489.         fread(pFrame, 1, m_Header.frameSize, File);
  1490.  
  1491.         // Store off a vertex array pointer to cut down large lines of code
  1492.         tMd2Triangle *pVertices = m_pFrames[i].pVertices;
  1493.         
  1494.         // Go through all of the number of vertices and assign the scale and translations.
  1495.         // Store the vertices in our current frame's vertex list array, while swapping Y and Z.
  1496.         // Notice we also negate the Z axis as well to make the swap correctly.
  1497.         for (int j=0; j < m_Header.numVertices; j++)
  1498.         {
  1499.             pVertices[j].vertex[0] = pFrame->aliasVertices[j].vertex[0] * pFrame->scale[0] + pFrame->translate[0];
  1500.             pVertices[j].vertex[2] = -1 * (pFrame->aliasVertices[j].vertex[1] * pFrame->scale[1] + pFrame->translate[1]);
  1501.             pVertices[j].vertex[1] = pFrame->aliasVertices[j].vertex[2] * pFrame->scale[2] + pFrame->translate[2];
  1502.         }
  1503.     }
  1504.  
  1505.  
  1506.     fclose(File);
  1507.  
  1508.     /////////////////
  1509.     //Konvertovanie// 
  1510.     /////////////////
  1511.     //opakuj pre kazdy frame
  1512.     for (i=0;i<NFrames;i++)
  1513.     {
  1514.  
  1515.         //pre vsetky trojholniky vo frame
  1516.         for (int u=0;u<m_Header.numTriangles;u++)
  1517.         {
  1518.             int V1,V2,V3; //index vertexov
  1519.             int T1,T2,T3; //index texturovych kordinatov
  1520.  
  1521.  
  1522.             V1 = m_pTriangles[u].vertexIndices[0];
  1523.             V2 = m_pTriangles[u].vertexIndices[1];
  1524.             V3 = m_pTriangles[u].vertexIndices[2];
  1525.  
  1526.             T1 = m_pTriangles[u].textureIndices[0];
  1527.             T2 = m_pTriangles[u].textureIndices[1];
  1528.             T3 = m_pTriangles[u].textureIndices[2];
  1529.  
  1530.             ModelFrame[i].FaceList[u].P[2].X =     m_pFrames[i].pVertices[V1].vertex[0];        
  1531.             ModelFrame[i].FaceList[u].P[2].Y =     m_pFrames[i].pVertices[V1].vertex[1];    
  1532.             ModelFrame[i].FaceList[u].P[2].Z =     m_pFrames[i].pVertices[V1].vertex[2];
  1533.             ModelFrame[i].FaceList[u].T[2].X =     m_pTexCoords[T1].u/float(m_Header.skinWidth) ;        
  1534.             ModelFrame[i].FaceList[u].T[2].Y =     m_pTexCoords[T1].v/float(m_Header.skinHeight);
  1535.  
  1536.             ModelFrame[i].FaceList[u].P[1].X =     m_pFrames[i].pVertices[V2].vertex[0];        
  1537.             ModelFrame[i].FaceList[u].P[1].Y =     m_pFrames[i].pVertices[V2].vertex[1];    
  1538.             ModelFrame[i].FaceList[u].P[1].Z =     m_pFrames[i].pVertices[V2].vertex[2];
  1539.             ModelFrame[i].FaceList[u].T[1].X =     m_pTexCoords[T2].u/float(m_Header.skinWidth);        
  1540.             ModelFrame[i].FaceList[u].T[1].Y =     m_pTexCoords[T2].v/float(m_Header.skinHeight);
  1541.  
  1542.             ModelFrame[i].FaceList[u].P[0].X =     m_pFrames[i].pVertices[V3].vertex[0];        
  1543.             ModelFrame[i].FaceList[u].P[0].Y =     m_pFrames[i].pVertices[V3].vertex[1];    
  1544.             ModelFrame[i].FaceList[u].P[0].Z =     m_pFrames[i].pVertices[V3].vertex[2];
  1545.             ModelFrame[i].FaceList[u].T[0].X =     m_pTexCoords[T3].u/float(m_Header.skinWidth);        
  1546.             ModelFrame[i].FaceList[u].T[0].Y =     m_pTexCoords[T3].v/float(m_Header.skinHeight);
  1547.  
  1548.         }
  1549.  
  1550.         //vypocitajminmax
  1551.         CalcBoxPoints(&ModelFrame[i]);
  1552.  
  1553.         //vypocitaj normaly
  1554.         if (Normals == true)
  1555.             CalcFaceNormals(&ModelFrame[i]);
  1556.  
  1557.         //vypocitaj smooth shading
  1558.         if (SmoothShading == true)
  1559.             CalcSmoothShading(&ModelFrame[i]);
  1560.  
  1561.     }*/
  1562.  
  1563.                             
  1564.  
  1565. }
  1566.  
  1567. //------------------------------------------------------------------
  1568. // Name: SaveSHD
  1569. // Desc: Ulozi model ako SHD
  1570. //------------------------------------------------------------------
  1571. void MODEL::SaveSHD(char *FileName)
  1572. {
  1573.  
  1574. /*    //struktury pre zapis
  1575.     Shd_Header Header;
  1576.     Shd_Face Face;
  1577.  
  1578.     //subor
  1579.     FILE *File;
  1580.     File = fopen(FileName,"wb");
  1581.  
  1582.     //nastavy header
  1583.     Header.NumFaces = NumFaces;
  1584.     Header.NumFrames = NumFrames;
  1585.     Header.Version = 1;
  1586.  
  1587.     //zapis header
  1588.     fwrite(&Header,sizeof(Header),1,File);
  1589.  
  1590.     //zapise pole
  1591.     for (int i=0;i<NumFrames;i++)
  1592.     {
  1593.         for (int u=0;u<NumFaces;u++)
  1594.         {
  1595.  
  1596.             Face.Vertex[0].P[0] = ModelFrame[i].FaceList[u].P[0].X;
  1597.             Face.Vertex[0].P[1] = ModelFrame[i].FaceList[u].P[0].Y;
  1598.             Face.Vertex[0].P[2] = ModelFrame[i].FaceList[u].P[0].Z;
  1599.             Face.Vertex[0].N[0] = ModelFrame[i].FaceList[u].N[0].X;
  1600.             Face.Vertex[0].N[1] = ModelFrame[i].FaceList[u].N[0].Y;
  1601.             Face.Vertex[0].N[2] = ModelFrame[i].FaceList[u].N[0].Z;
  1602.             Face.Vertex[0].T[0] = ModelFrame[i].FaceList[u].T[0].X;
  1603.             Face.Vertex[0].T[1] = ModelFrame[i].FaceList[u].T[0].Y;
  1604.  
  1605.             Face.Vertex[1].P[0] = ModelFrame[i].FaceList[u].P[1].X;
  1606.             Face.Vertex[1].P[1] = ModelFrame[i].FaceList[u].P[1].Y;
  1607.             Face.Vertex[1].P[2] = ModelFrame[i].FaceList[u].P[1].Z;
  1608.             Face.Vertex[1].N[0] = ModelFrame[i].FaceList[u].N[1].X;
  1609.             Face.Vertex[1].N[1] = ModelFrame[i].FaceList[u].N[1].Y;
  1610.             Face.Vertex[1].N[2] = ModelFrame[i].FaceList[u].N[1].Z;
  1611.             Face.Vertex[1].T[0] = ModelFrame[i].FaceList[u].T[1].X;
  1612.             Face.Vertex[1].T[1] = ModelFrame[i].FaceList[u].T[1].Y;
  1613.  
  1614.             Face.Vertex[2].P[0] = ModelFrame[i].FaceList[u].P[2].X;
  1615.             Face.Vertex[2].P[1] = ModelFrame[i].FaceList[u].P[2].Y;
  1616.             Face.Vertex[2].P[2] = ModelFrame[i].FaceList[u].P[2].Z;
  1617.             Face.Vertex[2].N[0] = ModelFrame[i].FaceList[u].N[2].X;
  1618.             Face.Vertex[2].N[1] = ModelFrame[i].FaceList[u].N[2].Y;
  1619.             Face.Vertex[2].N[2] = ModelFrame[i].FaceList[u].N[2].Z;
  1620.             Face.Vertex[2].T[0] = ModelFrame[i].FaceList[u].T[2].X;
  1621.             Face.Vertex[2].T[1] = ModelFrame[i].FaceList[u].T[2].Y;
  1622.     
  1623.             Face.Normal[0] = ModelFrame[i].FaceList[u].Plane.Normal.X;
  1624.             Face.Normal[1] = ModelFrame[i].FaceList[u].Plane.Normal.Y;
  1625.             Face.Normal[2] = ModelFrame[i].FaceList[u].Plane.Normal.Z;
  1626.             Face.D         = ModelFrame[i].FaceList[u].Plane.D;
  1627.  
  1628.             fwrite(&Face,sizeof(Face),1,File);
  1629.  
  1630.         }
  1631.     }
  1632.  
  1633.  
  1634.     //zavri subor
  1635.     fclose(File);*/
  1636.  
  1637. }
  1638.  
  1639. //------------------------------------------------------------------
  1640. // Name: LoadSHD
  1641. // Desc: Loadne SHD model
  1642. //------------------------------------------------------------------
  1643. void MODEL::LoadSHD(char *FileName)
  1644. {
  1645. /*
  1646.     //log
  1647.     char cBuf[80];
  1648.     LogPrint("Inicializujem SHD subor");
  1649.     sprintf(cBuf,"  Subor: %s",FileName);
  1650.     LogPrint(cBuf);
  1651.  
  1652.     //struktury pre citanie
  1653.     Shd_Header Header;
  1654.     Shd_Face Face;
  1655.  
  1656.     /////////
  1657.     //subor//
  1658.     /////////
  1659.     FILE *File = NULL;
  1660.     File = fopen(FileName,"rb");
  1661.     if (File == NULL)
  1662.         LogPrint("  Subor sa nenasiel");
  1663.  
  1664.     ////////////////////
  1665.     //precita hlavicku//
  1666.     ////////////////////
  1667.     fread(&Header,sizeof(Header),1,File);
  1668.  
  1669.     ////////////////////
  1670.     //nastavy premenne//
  1671.     ////////////////////
  1672.     NumFaces = Header.NumFaces;
  1673.     NumFrames = Header.NumFrames;
  1674.  
  1675.     sprintf(cBuf,"  Pocet trojholnikov: %d",NumFaces);
  1676.     LogPrint(cBuf);
  1677.  
  1678.     sprintf(cBuf,"  Pocet snimkov: %d",NumFrames);
  1679.     LogPrint(cBuf);
  1680.  
  1681.     /////////////////////////
  1682.     //inicializacia modelov//
  1683.     /////////////////////////
  1684.  
  1685.     //vytvori zasobnik modelov
  1686.     ModelFrame = new MODELFRAME [NumFrames];
  1687.  
  1688.     //inicializuje zasobnik modelov
  1689.     for (int i=0;i<NumFrames;i++)
  1690.     {
  1691.         InitializeModel(&ModelFrame[i],NumFaces);
  1692.     }
  1693.  
  1694.     //inicializuje transformovany model
  1695.     InitializeModel(&ModelT,NumFaces);
  1696.  
  1697.     ////////////////////////////
  1698.     //vytvaranie vertex buffer//
  1699.     ////////////////////////////
  1700.  
  1701.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  1702.                                    D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXMODEL,
  1703.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  1704.       {
  1705.         LogPrint("  Chyba pri vytvarani VB");
  1706.     }
  1707.     else
  1708.     {
  1709.         LogPrint("  Vertex Buffer vytvoreny");
  1710.     }
  1711.  
  1712.     /////////////////
  1713.     //Konvertovanie// 
  1714.     /////////////////
  1715.     for (i=0;i<NumFrames;i++)
  1716.     {
  1717.         for (int u=0;u<NumFaces;u++)
  1718.         {
  1719.             fread(&Face,sizeof(Face),1,File);
  1720.  
  1721.             ModelFrame[i].FaceList[u].P[0].X = Face.Vertex[0].P[0];
  1722.             ModelFrame[i].FaceList[u].P[0].Y = Face.Vertex[0].P[1];
  1723.             ModelFrame[i].FaceList[u].P[0].Z = Face.Vertex[0].P[2];
  1724.             ModelFrame[i].FaceList[u].N[0].X = Face.Vertex[0].N[0];
  1725.             ModelFrame[i].FaceList[u].N[0].Y = Face.Vertex[0].N[1];
  1726.             ModelFrame[i].FaceList[u].N[0].Z = Face.Vertex[0].N[2];
  1727.             ModelFrame[i].FaceList[u].T[0].X = Face.Vertex[0].T[0] ;
  1728.             ModelFrame[i].FaceList[u].T[0].Y = Face.Vertex[0].T[1];
  1729.  
  1730.             ModelFrame[i].FaceList[u].P[1].X = Face.Vertex[1].P[0];
  1731.             ModelFrame[i].FaceList[u].P[1].Y = Face.Vertex[1].P[1];
  1732.             ModelFrame[i].FaceList[u].P[1].Z = Face.Vertex[1].P[2];
  1733.             ModelFrame[i].FaceList[u].N[1].X = Face.Vertex[1].N[0];
  1734.             ModelFrame[i].FaceList[u].N[1].Y = Face.Vertex[1].N[1];
  1735.             ModelFrame[i].FaceList[u].N[1].Z = Face.Vertex[1].N[2] ;
  1736.             ModelFrame[i].FaceList[u].T[1].X = Face.Vertex[1].T[0];
  1737.             ModelFrame[i].FaceList[u].T[1].Y = Face.Vertex[1].T[1];
  1738.  
  1739.             ModelFrame[i].FaceList[u].P[2].X = Face.Vertex[2].P[0];
  1740.             ModelFrame[i].FaceList[u].P[2].Y = Face.Vertex[2].P[1];
  1741.             ModelFrame[i].FaceList[u].P[2].Z = Face.Vertex[2].P[2];
  1742.             ModelFrame[i].FaceList[u].N[2].X = Face.Vertex[2].N[0];
  1743.             ModelFrame[i].FaceList[u].N[2].Y = Face.Vertex[2].N[1];
  1744.             ModelFrame[i].FaceList[u].N[2].Z = Face.Vertex[2].N[2];
  1745.             ModelFrame[i].FaceList[u].T[2].X = Face.Vertex[2].T[0];
  1746.             ModelFrame[i].FaceList[u].T[2].Y = Face.Vertex[2].T[1];
  1747.     
  1748.             ModelFrame[i].FaceList[u].Plane.Normal.X = Face.Normal[0];
  1749.             ModelFrame[i].FaceList[u].Plane.Normal.Y = Face.Normal[1];
  1750.             ModelFrame[i].FaceList[u].Plane.Normal.Z = Face.Normal[2];
  1751.             ModelFrame[i].FaceList[u].Plane.D = Face.D;
  1752.         
  1753.  
  1754.         }
  1755.  
  1756.         //vypocitaj min max pre kazdy snimok
  1757.         CalcBoxPoints(&ModelFrame[i]);
  1758.     }
  1759.     
  1760.  
  1761.     //zavri subor
  1762.     fclose(File);*/
  1763.  
  1764. }
  1765.  
  1766. //------------------------------------------------------------------
  1767. // Name: BuildShadow()
  1768. // Desc: urobi tien do stencil class
  1769. //------------------------------------------------------------------
  1770. void MODEL::BuildShadow(STENCIL *Stn)
  1771. {
  1772.  
  1773.     //nastavi maticu
  1774.     g_pd3dDevice->SetTransform( D3DTS_WORLD, &Matica);
  1775.  
  1776.     //transformuje svetlo do priestoru modelu
  1777.     VECTOR3D LightPos = UnTransformPoint(Stn->LightPosition,Matica);
  1778.         
  1779.     for (int i=0;i<ModelFrame.NumFaces;i++)
  1780.     {
  1781.         
  1782.         //ak je face otoceny k svetlu vynechaj
  1783.         if (( ModelFrame.FaceList[i].Plane.Normal.X*LightPos.X + 
  1784.               ModelFrame.FaceList[i].Plane.Normal.Y*LightPos.Y + 
  1785.               ModelFrame.FaceList[i].Plane.Normal.Z*LightPos.Z + 
  1786.               ModelFrame.FaceList[i].Plane.D) <= 0.0f)
  1787.               continue;
  1788.  
  1789.         Stn->AddEdge(ModelFrame.FaceList[i].P[0],ModelFrame.FaceList[i].P[1]);
  1790.         Stn->AddEdge(ModelFrame.FaceList[i].P[1],ModelFrame.FaceList[i].P[2]);
  1791.         Stn->AddEdge(ModelFrame.FaceList[i].P[2],ModelFrame.FaceList[i].P[0]);
  1792.           
  1793.     }
  1794.  
  1795.     //vyberie quady ktore su nakraji
  1796.     Stn->ProcessEdge(LightPos);
  1797.  
  1798.     //vyrenderuje hotovy tien
  1799.     Stn->RenderShadow();
  1800.  
  1801. }