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

  1.  
  2. #include "main.h"
  3.  
  4. //------------------------------------------------------------------
  5. // Name: 
  6. // Desc: konstruktor
  7. //------------------------------------------------------------------
  8. PARTICLE::PARTICLE()
  9. {
  10.  
  11.  
  12.     MaxParticles = 0;
  13.     MaxFrames = 0;
  14.  
  15.     ActParticle = 0;
  16.     ActVertex = 0;
  17.  
  18.     Vertex      = NULL;
  19.     g_pTexture  = NULL;
  20.     g_pVB       = NULL;
  21.     TextureID   = NULL;
  22.  
  23.  
  24. }
  25.  
  26.  
  27. //------------------------------------------------------------------
  28. // Name: 
  29. // Desc: destruktor
  30. //------------------------------------------------------------------
  31. PARTICLE::~PARTICLE()
  32. {
  33.  
  34.     //zmaz vertexi
  35.     if (Vertex != NULL)
  36.         delete [] Vertex;
  37.     Vertex = NULL;
  38.  
  39.     //zmaz textury
  40.     if (g_pTexture)
  41.     {
  42.         for (int i=0;i<MaxFrames;i++)
  43.         {
  44.             if(g_pTexture[i])
  45.             {
  46.                 g_pTexture[i]->Release();
  47.             }
  48.         }
  49.         delete[] g_pTexture ;
  50.     }
  51.  
  52.     //odstran VB
  53.     if( g_pVB != NULL )
  54.         g_pVB->Release();
  55.  
  56.  
  57.     //default vlastnosti
  58.     MaxParticles = 0;
  59.     MaxFrames = 0;
  60.  
  61.     ActParticle = 0;
  62.     ActVertex = 0;
  63.  
  64. }
  65.  
  66.  
  67. //------------------------------------------------------------------
  68. // Name: Initialize()
  69. // Desc: zinicializuje premenne podla poctu snimkov alebo particlov
  70. //------------------------------------------------------------------
  71. void PARTICLE::Initialize(int MParticles,int MFrames)
  72. {
  73.  
  74.     //log info
  75.     char cBuf[80];
  76.     LogPrint("Vytvaram Particle");
  77.     sprintf(cBuf,"  MaxParticles: %d",MParticles);
  78.     sprintf(cBuf,"  MaxFrames: %d",MFrames);
  79.  
  80.     MaxFrames = MFrames;
  81.     MaxParticles = MParticles;
  82.  
  83.     //vytvori vertex
  84.     Vertex = new CUSTOMVERTEXPARTICLE[MaxParticles*6];
  85.  
  86.     //inicializuje textruru
  87.     g_pTexture = new LPDIRECT3DTEXTURE9[MaxFrames];
  88.     for(int i=0;i<MaxFrames;i++)
  89.     {
  90.         g_pTexture[i] = NULL;
  91.     }
  92.  
  93.     //texture id
  94.     TextureID = new int[MaxParticles];
  95.  
  96.     //vytvori VB
  97.     if( FAILED( g_pd3dDevice->CreateVertexBuffer( MaxParticles*6*sizeof(CUSTOMVERTEXPARTICLE),
  98.                                                   D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXPARTICLE,
  99.                                                   D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
  100.     {
  101.         LogPrint("  chyba pri vytvarani Vertex Bufferu");
  102.     }
  103.     else
  104.     {
  105.         LogPrint("  Vertex Buffer vytvoreny");
  106.     }
  107.     
  108.     
  109.     
  110. }
  111.  
  112. //------------------------------------------------------------------
  113. // Name: RenderParticle()
  114. // Desc: prida particle, particle natoceny ku kamere
  115. //------------------------------------------------------------------
  116. void PARTICLE::RenderParticle(VECTOR3D Pos,COLOR Color,float Size,float Rotation,float Frame)
  117. {
  118.  
  119.     VECTOR3D P[4]; //pomocne body
  120.  
  121.     D3DXMATRIX Matica; //transformacna matica
  122.         D3DXMATRIX MatLook;
  123.         D3DXMATRIX MatRotZ;
  124.  
  125.     //zada poziciu
  126.     P[0] = Get3D(-Size,Size,0.0f);
  127.     P[1] = Get3D(Size,Size,0.0f);
  128.     P[2] = Get3D(Size,-Size,0.0f);
  129.     P[3] = Get3D(-Size,-Size,0.0f);
  130.  
  131.     //textura
  132.     TextureID[ActParticle] = (int)Frame;
  133.  
  134.     //vypocita maticu
  135.     D3DXMatrixIdentity(&Matica);
  136.     
  137.     D3DXVECTOR3 vEyePt( Pos.X, Pos.Y, Pos.Z );
  138.     D3DXVECTOR3 vLookatPt( Camera.Pos.X, Camera.Pos.Y,Camera.Pos.Z );
  139.     D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f );
  140.     D3DXMatrixLookAtLH( &MatLook, &vEyePt, &vLookatPt, &vUpVec );
  141.     D3DXMatrixInverse(&MatLook,NULL,&MatLook);
  142.  
  143.     D3DXMatrixRotationZ(&MatRotZ,Rotation);
  144.  
  145.     D3DXMatrixMultiply(&Matica,&Matica,&MatRotZ);
  146.     D3DXMatrixMultiply(&Matica,&Matica,&MatLook);
  147.  
  148.     //transformuje jednotlive body
  149.     P[0] = TransformPoint(P[0],Matica);
  150.     P[1] = TransformPoint(P[1],Matica);
  151.     P[2] = TransformPoint(P[2],Matica);
  152.     P[3] = TransformPoint(P[3],Matica);
  153.  
  154.     //vytvori triangle 1
  155.     //0
  156.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  157.     Vertex[ActVertex].pos = D3DXVECTOR3(P[0].X,P[0].Y,P[0].Z);
  158.     Vertex[ActVertex].tu = 0.0f;
  159.     Vertex[ActVertex].tv = 0.0f;
  160.     ActVertex++;
  161.  
  162.     //1
  163.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  164.     Vertex[ActVertex].pos = D3DXVECTOR3(P[1].X,P[1].Y,P[1].Z);
  165.     Vertex[ActVertex].tu = 1.0f;
  166.     Vertex[ActVertex].tv = 0.0f;
  167.     ActVertex++;
  168.  
  169.     //2
  170.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  171.     Vertex[ActVertex].pos = D3DXVECTOR3(P[2].X,P[2].Y,P[2].Z);
  172.     Vertex[ActVertex].tu = 1.0f;
  173.     Vertex[ActVertex].tv = 1.0f;
  174.     ActVertex++;
  175.  
  176.  
  177.     //vytvori triangle2
  178.  
  179.     //2
  180.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  181.     Vertex[ActVertex].pos = D3DXVECTOR3(P[2].X,P[2].Y,P[2].Z);
  182.     Vertex[ActVertex].tu = 1.0f;
  183.     Vertex[ActVertex].tv = 1.0f;
  184.     ActVertex++;
  185.  
  186.     //3
  187.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  188.     Vertex[ActVertex].pos = D3DXVECTOR3(P[3].X,P[3].Y,P[3].Z);
  189.     Vertex[ActVertex].tu = 0.0f;
  190.     Vertex[ActVertex].tv = 1.0f;
  191.     ActVertex++;
  192.  
  193.     //0
  194.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  195.     Vertex[ActVertex].pos = D3DXVECTOR3(P[0].X,P[0].Y,P[0].Z);
  196.     Vertex[ActVertex].tu = 0.0f;
  197.     Vertex[ActVertex].tv = 0.0f;
  198.     ActVertex++;
  199.  
  200.  
  201.     ActParticle++;
  202.  
  203.  
  204. }
  205.  
  206. //------------------------------------------------------------------
  207. // Name: RenderParticleSprite()
  208. // Desc: prida particle, particle nezavysli od kamery
  209. //------------------------------------------------------------------
  210. void PARTICLE::RenderParticleSprite(VECTOR3D Pos,VECTOR3D Normal,COLOR Color,float Size,float Frame)
  211. {
  212.  
  213.     VECTOR3D P[4]; //pomocne body
  214.     D3DXMATRIXA16 Matica; //transformacna matica
  215.     VECTOR3D Rot; //rotacia
  216.  
  217.     //zada poziciu
  218.     P[0] = Get3D(-Size,Size,0.0f);
  219.     P[1] = Get3D(Size,Size,0.0f);
  220.     P[2] = Get3D(Size,-Size,0.0f);
  221.     P[3] = Get3D(-Size,-Size,0.0f);
  222.  
  223.     //vypocita rotaciu
  224.     Rot = GetRotationSme(Normal);
  225.  
  226.     //textura
  227.     TextureID[ActParticle] = (int)Frame;
  228.  
  229.     //tranformuje maticu
  230.     Matica = GetMatrix(Pos,Rot,Get3D(1.0f,1.0f,1.0f));
  231.  
  232.     //transformuje jednotlive body
  233.     P[0] = TransformPoint(P[0],Matica);
  234.     P[1] = TransformPoint(P[1],Matica);
  235.     P[2] = TransformPoint(P[2],Matica);
  236.     P[3] = TransformPoint(P[3],Matica);
  237.  
  238.     //vytvori triangle 1
  239.     //0
  240.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  241.     Vertex[ActVertex].pos = D3DXVECTOR3(P[0].X,P[0].Y,P[0].Z);
  242.     Vertex[ActVertex].tu = 0.0f;
  243.     Vertex[ActVertex].tv = 0.0f;
  244.     ActVertex++;
  245.  
  246.     //1
  247.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  248.     Vertex[ActVertex].pos = D3DXVECTOR3(P[1].X,P[1].Y,P[1].Z);
  249.     Vertex[ActVertex].tu = 1.0f;
  250.     Vertex[ActVertex].tv = 0.0f;
  251.     ActVertex++;
  252.  
  253.     //2
  254.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  255.     Vertex[ActVertex].pos = D3DXVECTOR3(P[2].X,P[2].Y,P[2].Z);
  256.     Vertex[ActVertex].tu = 1.0f;
  257.     Vertex[ActVertex].tv = 1.0f;
  258.     ActVertex++;
  259.  
  260.  
  261.     //vytvori triangle2
  262.  
  263.     //2
  264.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  265.     Vertex[ActVertex].pos = D3DXVECTOR3(P[2].X,P[2].Y,P[2].Z);
  266.     Vertex[ActVertex].tu = 1.0f;
  267.     Vertex[ActVertex].tv = 1.0f;
  268.     ActVertex++;
  269.  
  270.     //3
  271.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  272.     Vertex[ActVertex].pos = D3DXVECTOR3(P[3].X,P[3].Y,P[3].Z);
  273.     Vertex[ActVertex].tu = 0.0f;
  274.     Vertex[ActVertex].tv = 1.0f;
  275.     ActVertex++;
  276.  
  277.     //0
  278.     Vertex[ActVertex].color = D3DXCOLOR(Color.R,Color.G,Color.B,Color.A);
  279.     Vertex[ActVertex].pos = D3DXVECTOR3(P[0].X,P[0].Y,P[0].Z);
  280.     Vertex[ActVertex].tu = 0.0f;
  281.     Vertex[ActVertex].tv = 0.0f;
  282.     ActVertex++;
  283.  
  284.     ActParticle++;
  285.  
  286. }
  287.  
  288. //------------------------------------------------------------------
  289. // Name: AddFrame()
  290. // Desc: prida texturu framu
  291. //------------------------------------------------------------------
  292. void PARTICLE::AddFrame(int FrameID,char *FileName,COLOR ColorKey)
  293. {
  294.  
  295.     char cBuf[80];
  296.  
  297.     sprintf(cBuf,"  Textura: %d %s ",FrameID,FileName);
  298.     LogPrint(cBuf);
  299.     
  300.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  301.                                   FileName,    
  302.                                   D3DX_DEFAULT, 
  303.                                   D3DX_DEFAULT, 
  304.                                   Engine.MipMapLevels,   //MipLevels
  305.                                   0,            
  306.                                   Engine.TextureFormat, 
  307.                                   Engine.TextureCreatingFlag,
  308.                                   D3DX_DEFAULT, //Filter
  309.                                   D3DX_DEFAULT, //MipFilter
  310.                                   D3DXCOLOR(ColorKey.R, 
  311.                                             ColorKey.G, 
  312.                                             ColorKey.B, 
  313.                                             ColorKey.A),
  314.                                   NULL,         
  315.                                   NULL,         
  316.                                   &g_pTexture[FrameID])))  
  317.     {
  318.         sprintf(cBuf,"  chyba pri vytvarani textury: %s",FileName);
  319.         LogPrint(cBuf);
  320.     }
  321.     else
  322.     {
  323.         LogPrint("  Textura particlu vytvorena");
  324.     }    
  325.  
  326. }
  327.  
  328. //------------------------------------------------------------------
  329. // Name: Render()
  330. // Desc: Vyrenderuje vsetky pridane particli
  331. //------------------------------------------------------------------
  332. void PARTICLE::Render()
  333. {
  334.  
  335.     if (ActParticle == 0)
  336.         return;
  337.  
  338.  
  339.     //napln VB podla ID textury
  340.     CUSTOMVERTEXPARTICLE* pVert;
  341.     g_pVB->Lock( 0, 0, (void**)&pVert, D3DLOCK_NOOVERWRITE|D3DLOCK_DISCARD ) ;
  342.  
  343.     int ActVer = 0;
  344.     
  345.  
  346.     int *Zaciatok = new int[MaxFrames*6]; //zaciatocny vertex
  347.     int *NumParticles =new int[MaxFrames]; //aktualny particle
  348.  
  349.  
  350.     for (int i=0;i<MaxFrames;i++)
  351.     {
  352.         
  353.         Zaciatok[i] = ActVer;  //zaciatok pola
  354.         NumParticles[i] = 0;   //pocet particlov
  355.  
  356.         for (int u=0;u<ActParticle;u++)
  357.         {
  358.             //ak je dany particle z materialu rpidaj
  359.             if (TextureID[u] == i)
  360.             {
  361.                 pVert[ActVer+0] = Vertex[u*6+0];
  362.                 pVert[ActVer+1] = Vertex[u*6+1];
  363.                 pVert[ActVer+2] = Vertex[u*6+2];
  364.                 pVert[ActVer+3] = Vertex[u*6+3];
  365.                 pVert[ActVer+4] = Vertex[u*6+4];
  366.                 pVert[ActVer+5] = Vertex[u*6+5];
  367.  
  368.                 ActVer = ActVer + 6 ;
  369.                 NumParticles[i]++;
  370.  
  371.             }
  372.  
  373.         }
  374.  
  375.  
  376.     }
  377.  
  378.  
  379.     g_pVB->Unlock();
  380.  
  381.     //vynuluje world maticu
  382.     D3DXMATRIXA16 NullMatrix;        
  383.     D3DXMatrixIdentity(&NullMatrix);
  384.     g_pd3dDevice->SetTransform( D3DTS_WORLD, &NullMatrix);
  385.  
  386.     //renderuj podla textury
  387.     for (i=0;i<MaxFrames;i++)
  388.     {
  389.  
  390.         if (g_pTexture[i] != NULL)
  391.             g_pd3dDevice->SetTexture( 0, g_pTexture[i]);
  392.  
  393.         g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXPARTICLE) );
  394.         g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEXPARTICLE );
  395.  
  396.         if (NumParticles[i] > 0)
  397.             g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, Zaciatok[i], NumParticles[i]*2);
  398.     }
  399.  
  400.  
  401.     //vymaz pomocne polia
  402.     if (Zaciatok != NULL)
  403.         delete [] Zaciatok;
  404.     if (NumParticles != NULL)
  405.         delete [] NumParticles;
  406.  
  407.     ActParticle = 0;
  408.     ActVertex = 0;
  409.  
  410. }