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);
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}