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

DirextX编程

开发平台:

Visual C++

  1. #include "dxstdafx.h"
  2. #include "plane.h"
  3. CPlane::CPlane( WORD widthSampleNum, 
  4.     WORD heightSampleNum, 
  5.     D3DXVECTOR3 leftBottomPt, 
  6.     D3DXVECTOR3 rightUpPt )
  7. {
  8. m_iWidthSampleNum  = widthSampleNum;
  9. m_iHeightSampleNum = heightSampleNum;
  10. m_leftBottomPt     = leftBottomPt;
  11. m_rightUpPt        = rightUpPt;
  12. m_pTexture = NULL;
  13. m_pVB = NULL;
  14. m_pIB = NULL;
  15. }
  16. CPlane::~CPlane()
  17. {
  18. OnDestroyDevice();
  19. }
  20. void CPlane::OnDestroyDevice()
  21. {
  22. SAFE_RELEASE( m_pTexture );
  23. SAFE_RELEASE( m_pVB );
  24. SAFE_RELEASE( m_pIB );
  25. }
  26. HRESULT CPlane::OnCreateDevice( IDirect3DDevice9* pd3dDevice )
  27. {
  28. HRESULT hr;
  29. if( m_leftBottomPt.y != m_rightUpPt.y )
  30. {
  31. MessageBox( NULL, L"所创建的平面不与XOZ平面平行", L"创建平面失败", MB_OK );
  32. return hr = 0;
  33. }
  34. //////////////////////////////////////创建Index Buffer//////////////////////////////////////////////
  35. int NumberIndices = 6 * (m_iWidthSampleNum - 1) * (m_iHeightSampleNum - 1);
  36. WORD* pIndices = new WORD[NumberIndices];
  37. int baseIndex = 0;
  38. for( WORD i=0; i < m_iWidthSampleNum - 1; i++ )
  39. {
  40. for( WORD j=0; j < m_iHeightSampleNum - 1; j++ )
  41. {
  42. pIndices[baseIndex] = i*m_iHeightSampleNum + j;
  43. pIndices[baseIndex + 1] = (i+1)*m_iHeightSampleNum + j+1;
  44. pIndices[baseIndex + 2] = (i+1)*m_iHeightSampleNum + j;
  45. pIndices[baseIndex + 3] = i*m_iHeightSampleNum + j;
  46. pIndices[baseIndex + 4] = i*m_iHeightSampleNum + j+1;
  47. pIndices[baseIndex + 5] = (i+1)*m_iHeightSampleNum + j+1;
  48. baseIndex += 6;
  49. }
  50. }
  51. hr = pd3dDevice->CreateIndexBuffer( NumberIndices * sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIB, NULL );
  52. if( FAILED(hr) )
  53. {
  54. MessageBox( NULL, L"Create Index buffer failed", L"Create Failed", MB_OK );
  55. return hr;
  56. }
  57. void* pVoidIndex;
  58. m_pIB->Lock( 0, NumberIndices * sizeof(WORD), (void**)&pVoidIndex, 0 );
  59. memcpy( pVoidIndex, pIndices, NumberIndices * sizeof(WORD) );
  60. m_pIB->Unlock();
  61. //////////////////////////////////////创建Index Buffer完毕//////////////////////////////////////////////
  62. ////////////////////////////////////创建Vertex Buffer///////////////////////////////////////////
  63. int NumberVertex = m_iWidthSampleNum * m_iHeightSampleNum;
  64. PLANEVERTEX* pVertices = new PLANEVERTEX[ NumberVertex ];
  65. for(int i=0;i<m_iWidthSampleNum;i++)
  66. {
  67. for(int j=0;j<m_iHeightSampleNum;j++)
  68. {
  69. float x, y, z;
  70. y = m_leftBottomPt.y;
  71. x = m_leftBottomPt.x + ( (float)i/(float)m_iWidthSampleNum )*( m_rightUpPt.x - m_leftBottomPt.x );
  72. z = m_leftBottomPt.z + ( (float)j/(float)m_iHeightSampleNum)*( m_rightUpPt.z - m_leftBottomPt.z );
  73. pVertices[( i*m_iHeightSampleNum ) + j].position = D3DXVECTOR3( x, y, z );
  74. pVertices[( i*m_iHeightSampleNum ) + j].color = 0xffffffff;
  75. pVertices[( i*m_iHeightSampleNum ) + j].normal = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
  76. pVertices[( i*m_iHeightSampleNum ) + j].tu = (float)i/(float)m_iWidthSampleNum * 2.0f;
  77. pVertices[( i*m_iHeightSampleNum ) + j].tv = (float)j/(float)m_iHeightSampleNum *2.0f;
  78. }
  79. }
  80. hr = pd3dDevice->CreateVertexBuffer( NumberVertex * sizeof(PLANEVERTEX),
  81. 0 /*Usage*/, D3D_PLANEVT_FVF, D3DPOOL_MANAGED, &m_pVB, NULL );
  82. if( FAILED(hr) )
  83. {
  84. MessageBox( NULL, L"Create vertex buffer failed", L"Create Failed", MB_OK );
  85. return hr;
  86. }
  87. void* pVoidVertex;
  88. hr = m_pVB->Lock( 0, NumberVertex * sizeof(PLANEVERTEX), (void**)&pVoidVertex, 0);
  89. if( FAILED(hr) )
  90. {
  91. MessageBox( NULL, L"Lock vertex buffer failed", L"Lock Buffer Failed", MB_OK );
  92. return hr;
  93. }
  94. memcpy( pVoidVertex, pVertices, NumberVertex * sizeof(PLANEVERTEX) );
  95. m_pVB->Unlock();
  96. ////////////////////////////////////创建Vertex Buffer完毕///////////////////////////////////////////
  97. //////////////////////////////////////创建纹理///////////////////////////////////////////
  98. hr = D3DXCreateTextureFromFile( pd3dDevice, L"plane.bmp", &m_pTexture );
  99. if( FAILED(hr) )
  100. {
  101. MessageBox( NULL, L"plane.bmp不在当前目录下", L"创建纹理失败", MB_OK );
  102. return hr;
  103. }
  104. ////////////////////////////////////创建纹理完毕///////////////////////////////////////////
  105. delete [] pIndices;
  106. delete [] pVertices;
  107. return hr;
  108. }
  109. void CPlane::OnRender( IDirect3DDevice9* pd3dDevice )
  110. {
  111. HRESULT hr;
  112. pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
  113. // pd3dDevice->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1 );
  114. // pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );
  115. D3DXMATRIX matWorld;
  116. D3DXMatrixIdentity( &matWorld );
  117. pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  118. pd3dDevice->SetTexture( 0, m_pTexture );
  119. pd3dDevice->SetFVF( D3D_PLANEVT_FVF );
  120. pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(PLANEVERTEX) );
  121. pd3dDevice->SetIndices( m_pIB );
  122. hr = pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,  // PrimitiveType
  123. 0,                  // BaseVertexIndex
  124. 0,                  // MinIndex
  125. m_iWidthSampleNum * m_iHeightSampleNum,                  // NumVertices
  126. 0,                  // StartIndex
  127. 2*( m_iWidthSampleNum - 1 ) * ( m_iHeightSampleNum - 1 ));// PrimitiveCount
  128. if( FAILED(hr) )
  129. {
  130. MessageBox( NULL, L"Draw Indexed Primitive failed", L"Draw Plane Failed", MB_OK );
  131. return;
  132. }
  133. // pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
  134. }