void cSkinnedMesh::UpdateSkinnedMesh( ST_BONE* pBone ) { // pCurrentBoneMatrices 를 계산하시오 // pCurrentBoneMatrices = pBoneOffsetMatrices * ppBoneMatrixPtrs if(pBone->pMeshContainer) { ST_BONE_MESH* pBoneMesh = (ST_BONE_MESH*)pBone->pMeshContainer; if(pBoneMesh->pSkinInfo) { LPD3DXSKININFO pSkinInfo = pBoneMesh->pSkinInfo; DWORD dwNumBones = pSkinInfo->GetNumBones(); for (DWORD i = 0; i < dwNumBones; ++i) { pBoneMesh->pCurrentBoneMatrices[i] = pBoneMesh->pBoneOffsetMatrices[i] * *(pBoneMesh->ppBoneMatrixPtrs[i]); } } BYTE* src = NULL; BYTE* dest = NULL; pBoneMesh->pOrigMesh->LockVertexBuffer( D3DLOCK_READONLY, (void**)&src ); pBoneMesh->MeshData.pMesh->LockVertexBuffer( 0, (void**)&dest ); //MeshData.pMesh을 업데이트 시켜준다. pBoneMesh->pSkinInfo->UpdateSkinnedMesh( pBoneMesh->pCurrentBoneMatrices, NULL, src, dest ); pBoneMesh->MeshData.pMesh->UnlockVertexBuffer(); pBoneMesh->pOrigMesh->UnlockVertexBuffer(); } //재귀적으로 모든 프레임에 대해서 실행. if(pBone->pFrameFirstChild) { UpdateSkinnedMesh((ST_BONE*)pBone->pFrameFirstChild); } if(pBone->pFrameSibling) { UpdateSkinnedMesh((ST_BONE*)pBone->pFrameSibling); } }
void cSkinnedMesh::Update() { m_pAnimController->AdvanceTime(g_pTimeManager->GetElapsedTime(), NULL); if (m_pRoot) { ((ST_BONE*)m_pRoot)->Update(NULL); } UpdateSkinnedMesh((ST_BONE*)m_pRoot); }
void XEnitity::FrameMove(float ElapsedTime,const D3DXMATRIX *pMatWorld) { //m_pAnimCtrl->ResetTime(); ElapsedTime/=m_SpeedAdjust; m_CurrentTime += ElapsedTime; if(m_pAnimCtrl) m_pAnimCtrl->AdvanceTime(ElapsedTime, NULL); UpdateFrameMatrices(m_pTopFrame, pMatWorld); UpdateSkinnedMesh(m_pTopFrame); return; }
void XEnitity::UpdateSkinnedMesh(const D3DXFRAME *pFrameBase) { CUSTOM_FRAME* pFrame = (CUSTOM_FRAME*) pFrameBase; CUSTOM_MESHCONTAINER* pMeshContainer = (CUSTOM_MESHCONTAINER*) pFrame->pMeshContainer; while(pMeshContainer && pMeshContainer->pSkinInfo){ unsigned int NumBones = pMeshContainer->pSkinInfo->GetNumBones(); for(unsigned int i = 0; i < NumBones; ++i){ D3DXMatrixMultiply(&m_pBoneMatrices[i],&pMeshContainer->pExBoneOffsets[i], pMeshContainer->pExFrameCombinedMatrixPointer[i]); } void* pSrc = 0; HRESULT hr = pMeshContainer->MeshData.pMesh->LockVertexBuffer(D3DLOCK_READONLY, (void**)&pSrc); if(FAILED(hr))return; void* pDest = 0; hr = pMeshContainer->pExSkinMesh->LockVertexBuffer(0, (void**)&pDest); hr = pMeshContainer->pSkinInfo->UpdateSkinnedMesh(m_pBoneMatrices, NULL, pSrc, pDest); pMeshContainer->MeshData.pMesh->UnlockVertexBuffer(); pMeshContainer->pExSkinMesh->UnlockVertexBuffer(); pMeshContainer = (CUSTOM_MESHCONTAINER*) pMeshContainer->pNextMeshContainer; }//end while if (pFrame->pFrameSibling) UpdateSkinnedMesh(pFrame->pFrameSibling); if(pFrame->pFrameFirstChild) UpdateSkinnedMesh(pFrame->pFrameFirstChild); return; }