D3DXVECTOR4* CSkeleton::updateAnimation(int frame)
{
D3DXVECTOR4 matrices[MAXBONES*3];
for(int i = 0 ; i < GetBoneCount(); i++)
{
CBone* pb = GetBone(i);
CBone* pbParent = GetBone(pb->m_nIdParent);
D3DXMATRIX pmxAnimation = pb->getAnimationMatrix(0, 0);
if(D3DXMatrixIsIdentity(&pmxAnimation))
pmxAnimation *= pb->getMatrixLocal();
pb->SetFinalMatrix( pmxAnimation /** pb->getMatrixLocal()*/);
if (pb->m_nIdParent >= 0)
pb->SetFinalMatrix(pb->getBoneFinalMatrix() * pbParent->getBoneFinalMatrix());
}
for(int i = 0 ; i < GetBoneCount(); i++)
{
CBone* pb = GetBone(i);
CBone* pbParent = GetBone(pb->m_nIdParent);
if(pbParent != NULL)
{
pb->SetFinalMatrix(pb->getInvBinMatrix() * pb->getBoneFinalMatrix()* pbParent->getBoneFinalMatrix());
D3DXMATRIX m = pb->getBoneFinalMatrix();
matrices[i*3 +0] = D3DXVECTOR4(m._11, m._21,m._31, m._41);
matrices[i*3 +1] = D3DXVECTOR4(m._12, m._22, m._32, m._42);
matrices[i*3 +2] = D3DXVECTOR4(m._13, m._23, m._33, m._43);
}
else
{
pb->SetFinalMatrix( pb->getInvBinMatrix() * pb->getBoneFinalMatrix());
D3DXMATRIX m = pb->getBoneFinalMatrix();
matrices[i*3 +0] = D3DXVECTOR4(m._11, m._21,m._31, m._41);
matrices[i*3 +1] = D3DXVECTOR4(m._12, m._22, m._32, m._42);
matrices[i*3 +2] = D3DXVECTOR4(m._13, m._23, m._33, m._43);
}
}
return matrices;
}
D3DXVECTOR4* matricesNew = m_pSkeleton->updateAnimation(nTime);
int nCountvfloat4 = sizeof(*matricesNew)/sizeof(*matricesNew[0]);;
HRESULT hr = m_pMatrices->SetRawValue(matricesNew, 0, nCountvfloat4* sizeof(D3DXVECTOR4));