Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.28 KB | None | 0 0
  1. #include "PhysicsMesh.h"
  2. #include "ObjPhysicsReader.h"
  3. #include "InputMesh.h"
  4. #include "D3DUtil.h"
  5. #include "Level.h"
  6. #include "GraphCamera.h"
  7. #include "CookingStream.h"
  8.  
  9. PhysicsMesh::PhysicsMesh(tstring filename, tstring physicsFileName, Type type, PhysX *pPhysX) : LevelElement(), m_filename(filename), m_physicsFileName(physicsFileName), m_Type(type), m_pPhysX(pPhysX), m_pActor(NULL), m_pVertexLayout(0), m_pDefaultEffect(NULL), m_pDefaultTechnique(NULL), m_NumIndices(0), m_VertexBufferStride(0)
  10. {
  11.  
  12. }
  13.  
  14. PhysicsMesh::~PhysicsMesh(void)
  15. {
  16. for (UINT i = 0; i<m_Meshes.size();++i)
  17. delete m_Meshes[i];
  18.  
  19. for (UINT i = 0; i<m_pVertexBuffers.size();++i)
  20. m_pVertexBuffers[i]->Release();
  21.  
  22. for (UINT i = 0; i<m_pVertexBuffers.size();++i)
  23. m_pIndexBuffers[i]->Release();
  24.  
  25. SafeRelease(m_pVertexLayout);
  26. }
  27.  
  28. void PhysicsMesh::Initialize(ContentManager *pContentManager)
  29. {
  30. CreateEffect(pContentManager);
  31.  
  32. ObjPhysicsReader *physRdr = new ObjPhysicsReader(m_filename);
  33. physRdr->Read();
  34.  
  35. m_Meshes.assign(physRdr->GetInputMeshBegin(), physRdr->GetInputMeshEnd());
  36.  
  37. delete physRdr;
  38.  
  39. DefineInputlayout();
  40. BuildVertexBuffer();
  41. BuildIndexBuffer();
  42. Rotate(D3DXVECTOR3(-1.57079633f,0,0));
  43.  
  44. if(m_Type == Concave)
  45. BuildConcave();
  46. else
  47. BuildConvex();
  48. }
  49.  
  50.  
  51. void PhysicsMesh::CreateEffect(ContentManager *pContentManager)
  52. {
  53. m_pDefaultEffect = pContentManager->GetEffect(m_pLevel->GetDevice(), _T("./Effect/checker.fx"));
  54.  
  55. //get first technique found
  56. m_pDefaultTechnique = m_pDefaultEffect->GetTechniqueByIndex(0);
  57.  
  58. GetEffectVariables(m_pDefaultEffect);
  59. }
  60.  
  61. bool PhysicsMesh::BuildConcave()
  62. {
  63. string str = string(m_physicsFileName.begin(), m_physicsFileName.end());
  64. // INSERT CODE HERE
  65.  
  66. return m_pActor != 0;
  67. }
  68.  
  69. bool PhysicsMesh::BuildConvex()
  70. {
  71. string str = string(m_physicsFileName.begin(), m_physicsFileName.end());
  72. // INSERT CODE HERE
  73.  
  74. return m_pActor != 0;
  75. }
  76.  
  77. void PhysicsMesh::BuildIndexBuffer()
  78. {
  79. MIT meshIt = m_Meshes.begin();
  80. for(meshIt; meshIt != m_Meshes.end(); ++meshIt){
  81. m_NumIndices = (*meshIt)->GetNumFaces()*3;
  82.  
  83. ID3D10Buffer *buffer;
  84. D3D10_BUFFER_DESC bd;
  85. bd.Usage = D3D10_USAGE_DEFAULT;
  86. bd.ByteWidth = sizeof(float3) * (*meshIt)->GetNumFaces() *3;
  87. bd.BindFlags = D3D10_BIND_INDEX_BUFFER;
  88. bd.CPUAccessFlags = 0;
  89. bd.MiscFlags = 0;
  90.  
  91. D3D10_SUBRESOURCE_DATA initData;
  92. initData.pSysMem = (*meshIt)->GetTrianglesPointer();
  93.  
  94. HR(m_pLevel->GetDevice()->CreateBuffer(&bd, &initData, &buffer));
  95. m_pIndexBuffers.push_back(buffer);
  96. }
  97. }
  98.  
  99. void PhysicsMesh::BuildVertexBuffer()
  100. {
  101. MIT meshIt = m_Meshes.begin();
  102. for(meshIt; meshIt != m_Meshes.end(); ++meshIt){
  103. ID3D10Buffer *buffer;
  104. D3D10_BUFFER_DESC bd;
  105. bd.Usage = D3D10_USAGE_DEFAULT;
  106. bd.ByteWidth = sizeof(float3) * (*meshIt)->GetNumVertices();
  107. bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
  108. bd.CPUAccessFlags = 0;
  109. bd.MiscFlags = 0;
  110.  
  111. D3D10_SUBRESOURCE_DATA initData;
  112. initData.pSysMem = (*meshIt)->GetVertexPointer();
  113.  
  114. HR(m_pLevel->GetDevice()->CreateBuffer(&bd, &initData, &buffer));
  115. m_pVertexBuffers.push_back(buffer);
  116. }
  117. }
  118.  
  119.  
  120. void PhysicsMesh::GetEffectVariables(ID3D10Effect* effect)
  121. {
  122. m_pDefaultTechnique = effect->GetTechniqueByName("CheckersTech");
  123. m_pWorldViewProjectionVariable = effect->GetVariableByName("gWVP")->AsMatrix();
  124. }
  125.  
  126. void PhysicsMesh::SetPhysXGlobalPose()
  127. {
  128. SetPhysXGlobalPose(m_World);
  129. }
  130.  
  131. void PhysicsMesh::SetPhysXGlobalPose(const D3DXMATRIX& World)
  132. {
  133. NxMat34 mat;
  134. mat.setColumnMajor44(World);
  135. if(m_pActor !=0) m_pActor->setGlobalPose(mat);
  136. }
  137.  
  138. void PhysicsMesh::DefineInputlayout()
  139. {
  140. m_VertexBufferStride = sizeof(float3);
  141. // Define the input layout
  142. D3D10_INPUT_ELEMENT_DESC layout[] =
  143. {
  144. { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
  145. };
  146. UINT numElements = sizeof(layout)/sizeof(layout[0]);
  147.  
  148. // Create the input layout
  149. D3D10_PASS_DESC PassDesc;
  150. // Get the pass descriptor from the effect technique
  151. m_pDefaultTechnique->GetPassByIndex(0)->GetDesc(&PassDesc);
  152. m_pLevel->GetDevice()->CreateInputLayout(layout, numElements, PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize, &m_pVertexLayout);
  153. }
  154.  
  155.  
  156. void PhysicsMesh::Tick(const InputState & refInputState)
  157. {
  158. }
  159. void PhysicsMesh::Draw(const RenderContext* pRenderContext)
  160. {
  161. // Update Shader matrix variables
  162. D3DXMATRIX matView = pRenderContext->GetCamera()->GetView();
  163. D3DXMATRIX matProj = pRenderContext->GetCamera()->GetProj();
  164. m_pWorldViewProjectionVariable->SetMatrix((float*)&(m_World*matView*matProj));
  165.  
  166. // Set the input layout
  167. m_pLevel->GetDevice()->IASetInputLayout(m_pVertexLayout);
  168.  
  169. for(UINT i = 0; i < m_pVertexBuffers.size(); ++i){
  170. // Set vertex buffer(s)
  171. UINT offset = 0;
  172. m_pLevel->GetDevice()->IASetVertexBuffers( 0, 1, &m_pVertexBuffers.at(i), &m_VertexBufferStride, &offset);
  173.  
  174. // Set index buffer
  175. m_pLevel->GetDevice()->IASetIndexBuffer(m_pIndexBuffers.at(i), DXGI_FORMAT_R32_UINT, 0);
  176.  
  177. // Set primitive topology
  178. m_pLevel->GetDevice()->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  179.  
  180. D3D10_TECHNIQUE_DESC techDesc;
  181. m_pDefaultTechnique->GetDesc( &techDesc );
  182. for( UINT p = 0; p < techDesc.Passes; ++p )
  183. {
  184. m_pDefaultTechnique->GetPassByIndex(p)->Apply(0);
  185. m_pLevel->GetDevice()->DrawIndexed(m_NumIndices, 0, 0 );
  186. }
  187. }
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement