zfxBillBoard.cpp
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:5k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include ".zfxbillboard.h"
  3. #include "zfxCamera.h"
  4. //////////////////////////////////////////////////////////////////////////////////////////////////////
  5. // CZFXBillBoard Impletation
  6. //////////////////////////////////////////////////////////////////////////////////////////////////////
  7. CZFXBillBoard::CZFXBillBoard(void)
  8. {
  9. m_posVec = D3DXVECTOR3(0, 0, 0);
  10. m_width = 0;
  11. m_height = 0;
  12. m_pVB = NULL;
  13. }
  14. CZFXBillBoard::~CZFXBillBoard(void)
  15. {
  16. SAFE_RELEASE(m_pVB);
  17. }
  18. // 创建公告板对象,主要是顶点缓冲
  19. HRESULT CZFXBillBoard::CreateBoard(LPDIRECT3DDEVICE9 pd3dDevice, D3DXVECTOR3& posVec, float width, float height)
  20. {
  21. m_posVec.x = posVec.x;
  22. m_posVec.y = posVec.y;
  23. m_posVec.z = posVec.z;
  24. m_width = width;
  25. m_height = height;
  26. ZFXBBDVERTEX bbdVertex[4] = {
  27. {-width/2, 0, 0, 0xffffffff, 0, 1, },/*左下角*/
  28. { width/2, 0, 0, 0xffffffff, 1, 1, },/*右下角*/
  29. {-width/2, height, 0, 0xffffffff, 0, 0, },/*左上角*/
  30. { width/2, height, 0, 0xffffffff, 1, 0, },/*右上角*/
  31. };
  32. if( FAILED( pd3dDevice->CreateVertexBuffer( 4*sizeof(ZFXBBDVERTEX),
  33. 0 /*Usage*/, D3DFVF_ZFXBBDVERTEX, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) )
  34. return E_FAIL;
  35. VOID* pVertices;
  36. if( FAILED( m_pVB->Lock( 0, sizeof(bbdVertex), (void**)&pVertices, 0 ) ) )
  37. return E_FAIL;
  38. memcpy( pVertices, bbdVertex, sizeof(bbdVertex) );
  39. m_pVB->Unlock();
  40. return D3D_OK;
  41. }
  42. // 更新公告板的朝向,视点移动之后,一定要调用该函数
  43. void CZFXBillBoard::UpdateOrient(CZFXCamera* camera)
  44. {
  45. float deltaX = m_posVec.x - camera->GetPosX();
  46. float deltaZ = m_posVec.z - camera->GetPosZ();
  47. float mod = sqrt(deltaX * deltaX + deltaZ * deltaZ);
  48. D3DXMatrixIdentity(&m_matWorld);
  49. D3DXMatrixTranslation(&m_matWorld, m_posVec.x, m_posVec.y, m_posVec.z);
  50. D3DXMATRIX matRot;
  51. D3DXMatrixIdentity(&matRot);
  52. // rotation angle == theta////////////////
  53. // cos(theta) 0 -sin(theta) 0 
  54. //    0       1       0     0
  55. // sin(theta) 0 cos(theta)  0
  56. //    0       0       0     1
  57. //////////////////////////////////////////
  58. matRot(0,0) = deltaZ/mod;   matRot(0,2) = -deltaX/mod;
  59. matRot(2,0) = -matRot(0,2); matRot(2,2) = matRot(0,0);
  60. D3DXMatrixMultiply(&m_matWorld, &matRot, &m_matWorld);
  61. }
  62. // 渲染公告板
  63. void CZFXBillBoard::OnRender(LPDIRECT3DDEVICE9 pd3dDevice)
  64. {
  65. pd3dDevice->SetTransform(D3DTS_WORLD, &m_matWorld);
  66. pd3dDevice->SetStreamSource(0, m_pVB, 0, sizeof(ZFXBBDVERTEX));
  67. pd3dDevice->SetFVF(D3DFVF_ZFXBBDVERTEX);
  68. pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
  69. }
  70. void CZFXBillBoard::preRender(LPDIRECT3DDEVICE9 pd3dDevice)
  71. {
  72. pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);
  73. pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, true);
  74. pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 0x08);
  75. pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
  76. pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
  77. }
  78. void CZFXBillBoard::postRender(LPDIRECT3DDEVICE9 pd3dDevice)
  79. {
  80. pd3dDevice->SetRenderState(D3DRS_LIGHTING, true);
  81. pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, false);
  82. pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );
  83. }
  84. //////////////////////////////////////////////////////////////////////////////////////////////////////
  85. // CZFXBillBoard Impletation End
  86. //////////////////////////////////////////////////////////////////////////////////////////////////////
  87. //////////////////////////////////////////////////////////////////////////////////////////////////////
  88. // CZFXBillBoardMgr Impletation
  89. //////////////////////////////////////////////////////////////////////////////////////////////////////
  90. CZFXBillBoardMgr::CZFXBillBoardMgr()
  91. {
  92. m_list.clear();
  93. m_pTexture = NULL;
  94. }
  95. CZFXBillBoardMgr::~CZFXBillBoardMgr()
  96. {
  97. SAFE_RELEASE(m_pTexture);
  98. }
  99. int CZFXBillBoardMgr::GetBoardNum()
  100. {
  101. return (int)m_list.size();
  102. }
  103. HRESULT CZFXBillBoardMgr::LoadTextureFromFile(LPDIRECT3DDEVICE9 pd3dDevice, LPCTSTR texFileName)
  104. {
  105. if(FAILED(D3DXCreateTextureFromFileEx(pd3dDevice, texFileName, D3DX_DEFAULT, D3DX_DEFAULT,
  106. D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT,
  107. D3DCOLOR_RGBA(0, 0, 0, 255), NULL, NULL, &m_pTexture)))
  108. return E_FAIL;
  109. return D3D_OK;
  110. }
  111. void CZFXBillBoardMgr::AddBillBoard(CZFXBillBoard& billBoard)
  112. {
  113. m_list.push_back(billBoard);
  114. }
  115. void CZFXBillBoardMgr::UpdateBoardOrient(CZFXCamera* camera)
  116. {
  117. for(std::list<CZFXBillBoard>::iterator iter = m_list.begin();iter != m_list.end();iter++)
  118. {
  119. iter->UpdateOrient(camera);
  120. }
  121. }
  122. void CZFXBillBoardMgr::OnRender(LPDIRECT3DDEVICE9 pd3dDevice)
  123. {
  124. pd3dDevice->SetTexture(0, m_pTexture);
  125. CZFXBillBoard::preRender(pd3dDevice);
  126. for(std::list<CZFXBillBoard>::iterator iter = m_list.begin();iter != m_list.end();iter++)
  127. {
  128. iter->OnRender(pd3dDevice);
  129. }
  130. CZFXBillBoard::postRender(pd3dDevice);
  131. }
  132. //////////////////////////////////////////////////////////////////////////////////////////////////////
  133. // CZFXBillBoardMgr Impletation End
  134. //////////////////////////////////////////////////////////////////////////////////////////////////////