Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "PhysicsMesh.h"
- #include "ObjPhysicsReader.h"
- #include "InputMesh.h"
- #include "D3DUtil.h"
- #include "Level.h"
- #include "GraphCamera.h"
- #include "CookingStream.h"
- 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)
- {
- }
- PhysicsMesh::~PhysicsMesh(void)
- {
- for (UINT i = 0; i<m_Meshes.size();++i)
- delete m_Meshes[i];
- for (UINT i = 0; i<m_pVertexBuffers.size();++i)
- m_pVertexBuffers[i]->Release();
- for (UINT i = 0; i<m_pVertexBuffers.size();++i)
- m_pIndexBuffers[i]->Release();
- SafeRelease(m_pVertexLayout);
- }
- void PhysicsMesh::Initialize(ContentManager *pContentManager)
- {
- CreateEffect(pContentManager);
- ObjPhysicsReader *physRdr = new ObjPhysicsReader(m_filename);
- physRdr->Read();
- m_Meshes.assign(physRdr->GetInputMeshBegin(), physRdr->GetInputMeshEnd());
- delete physRdr;
- DefineInputlayout();
- BuildVertexBuffer();
- BuildIndexBuffer();
- Rotate(D3DXVECTOR3(-1.57079633f,0,0));
- if(m_Type == Concave)
- BuildConcave();
- else
- BuildConvex();
- }
- void PhysicsMesh::CreateEffect(ContentManager *pContentManager)
- {
- m_pDefaultEffect = pContentManager->GetEffect(m_pLevel->GetDevice(), _T("./Effect/checker.fx"));
- //get first technique found
- m_pDefaultTechnique = m_pDefaultEffect->GetTechniqueByIndex(0);
- GetEffectVariables(m_pDefaultEffect);
- }
- bool PhysicsMesh::BuildConcave()
- {
- string str = string(m_physicsFileName.begin(), m_physicsFileName.end());
- // INSERT CODE HERE
- return m_pActor != 0;
- }
- bool PhysicsMesh::BuildConvex()
- {
- string str = string(m_physicsFileName.begin(), m_physicsFileName.end());
- // INSERT CODE HERE
- return m_pActor != 0;
- }
- void PhysicsMesh::BuildIndexBuffer()
- {
- MIT meshIt = m_Meshes.begin();
- for(meshIt; meshIt != m_Meshes.end(); ++meshIt){
- m_NumIndices = (*meshIt)->GetNumFaces()*3;
- ID3D10Buffer *buffer;
- D3D10_BUFFER_DESC bd;
- bd.Usage = D3D10_USAGE_DEFAULT;
- bd.ByteWidth = sizeof(float3) * (*meshIt)->GetNumFaces() *3;
- bd.BindFlags = D3D10_BIND_INDEX_BUFFER;
- bd.CPUAccessFlags = 0;
- bd.MiscFlags = 0;
- D3D10_SUBRESOURCE_DATA initData;
- initData.pSysMem = (*meshIt)->GetTrianglesPointer();
- HR(m_pLevel->GetDevice()->CreateBuffer(&bd, &initData, &buffer));
- m_pIndexBuffers.push_back(buffer);
- }
- }
- void PhysicsMesh::BuildVertexBuffer()
- {
- MIT meshIt = m_Meshes.begin();
- for(meshIt; meshIt != m_Meshes.end(); ++meshIt){
- ID3D10Buffer *buffer;
- D3D10_BUFFER_DESC bd;
- bd.Usage = D3D10_USAGE_DEFAULT;
- bd.ByteWidth = sizeof(float3) * (*meshIt)->GetNumVertices();
- bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
- bd.CPUAccessFlags = 0;
- bd.MiscFlags = 0;
- D3D10_SUBRESOURCE_DATA initData;
- initData.pSysMem = (*meshIt)->GetVertexPointer();
- HR(m_pLevel->GetDevice()->CreateBuffer(&bd, &initData, &buffer));
- m_pVertexBuffers.push_back(buffer);
- }
- }
- void PhysicsMesh::GetEffectVariables(ID3D10Effect* effect)
- {
- m_pDefaultTechnique = effect->GetTechniqueByName("CheckersTech");
- m_pWorldViewProjectionVariable = effect->GetVariableByName("gWVP")->AsMatrix();
- }
- void PhysicsMesh::SetPhysXGlobalPose()
- {
- SetPhysXGlobalPose(m_World);
- }
- void PhysicsMesh::SetPhysXGlobalPose(const D3DXMATRIX& World)
- {
- NxMat34 mat;
- mat.setColumnMajor44(World);
- if(m_pActor !=0) m_pActor->setGlobalPose(mat);
- }
- void PhysicsMesh::DefineInputlayout()
- {
- m_VertexBufferStride = sizeof(float3);
- // Define the input layout
- D3D10_INPUT_ELEMENT_DESC layout[] =
- {
- { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
- };
- UINT numElements = sizeof(layout)/sizeof(layout[0]);
- // Create the input layout
- D3D10_PASS_DESC PassDesc;
- // Get the pass descriptor from the effect technique
- m_pDefaultTechnique->GetPassByIndex(0)->GetDesc(&PassDesc);
- m_pLevel->GetDevice()->CreateInputLayout(layout, numElements, PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize, &m_pVertexLayout);
- }
- void PhysicsMesh::Tick(const InputState & refInputState)
- {
- }
- void PhysicsMesh::Draw(const RenderContext* pRenderContext)
- {
- // Update Shader matrix variables
- D3DXMATRIX matView = pRenderContext->GetCamera()->GetView();
- D3DXMATRIX matProj = pRenderContext->GetCamera()->GetProj();
- m_pWorldViewProjectionVariable->SetMatrix((float*)&(m_World*matView*matProj));
- // Set the input layout
- m_pLevel->GetDevice()->IASetInputLayout(m_pVertexLayout);
- for(UINT i = 0; i < m_pVertexBuffers.size(); ++i){
- // Set vertex buffer(s)
- UINT offset = 0;
- m_pLevel->GetDevice()->IASetVertexBuffers( 0, 1, &m_pVertexBuffers.at(i), &m_VertexBufferStride, &offset);
- // Set index buffer
- m_pLevel->GetDevice()->IASetIndexBuffer(m_pIndexBuffers.at(i), DXGI_FORMAT_R32_UINT, 0);
- // Set primitive topology
- m_pLevel->GetDevice()->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- D3D10_TECHNIQUE_DESC techDesc;
- m_pDefaultTechnique->GetDesc( &techDesc );
- for( UINT p = 0; p < techDesc.Passes; ++p )
- {
- m_pDefaultTechnique->GetPassByIndex(p)->Apply(0);
- m_pLevel->GetDevice()->DrawIndexed(m_NumIndices, 0, 0 );
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement