BOOL cXMeshParser::ParseObject( \ IDirectXFileData *pDataObj, \ IDirectXFileData *pParentDataObj, \ DWORD Depth, \ void **Data, BOOL Reference) { const GUID *Type = GetObjectGUID(pDataObj); // Make sure template being parsed is a mesh (non-referenced) if(*Type == TID_D3DRMMesh && Reference == FALSE) { // Load the mesh data D3DXMESHCONTAINER_EX *Mesh = NULL; LoadMesh(&Mesh, g_pD3DDevice, pDataObj); // Assign a name if none already if(Mesh && !Mesh->Name) Mesh->Name = strdup("NoNameMesh"); // Link mesh into head of list if(Mesh) Mesh->pNextMeshContainer = m_RootMesh; m_RootMesh = Mesh; Mesh = NULL; } return ParseChildObjects(pDataObj, Depth, Data, Reference); }
BOOL XAnimationParser::ParseObject(ID3DXFileData* pDataObj, ID3DXFileData* pParentObj, DWORD Depth, void** Data, BOOL Reference) { HRESULT hr=0; //Gets the GUID to know what is this XFileData object GUID* pGuid = GetObjectGUID(pDataObj); //if it is an AnimationSet if( *pGuid == TID_D3DRMAnimationSet ) { XAnimationSet* pNewAnimationSet = new XAnimationSet(); pNewAnimationSet->m_Name = GetObjectName(pDataObj); pNewAnimationSet->m_Next = m_AnimationSets;//Link this new AnimationSet to the main list m_AnimationSets = pNewAnimationSet; m_NumOfAnimationSets++; } //if it is an Animation Data if( *pGuid == TID_D3DRMAnimation && m_AnimationSets ) { XAnimation* pNewAnimation = new XAnimation(); pNewAnimation->m_Next = m_AnimationSets->m_Animations; m_AnimationSets->m_Animations = pNewAnimation;//Link this new Animation Data AnimationSet m_AnimationSets->m_NumOfAnimations++; } //if it is Frame(Bone) if( *pGuid == TID_D3DRMFrame && m_AnimationSets && m_AnimationSets->m_Animations && Reference) { if( *GetObjectGUID(pParentObj) == TID_D3DRMAnimation )//if inside an Animation Data m_AnimationSets->m_Animations->m_Name = GetObjectName(pDataObj); } //if it is a KeyFrame of the Animation if( *pGuid == TID_D3DRMAnimationKey && m_AnimationSets && m_AnimationSets->m_Animations ) { XAnimation* CurAnim = m_AnimationSets->m_Animations; DWORD* pData = NULL; SIZE_T size; pDataObj->Lock(&size,(LPCVOID*)&pData); //Read the XFile Template Properties DWORD Type = *pData++; DWORD NumOfKeys = *pData++; #pragma region Loads KeyFrame Data switch(Type) { case 0://Rotacion { delete[] CurAnim->m_QuaternionKeys; CurAnim->m_NumOfQuaternionKey = NumOfKeys; CurAnim->m_QuaternionKeys = new XAnimationQuaternionKey[NumOfKeys]; for(int i=0; i < NumOfKeys ; ++i) { CurAnim->m_QuaternionKeys[i].m_Time = *pData++; if( CurAnim->m_QuaternionKeys[i].m_Time > m_AnimationSets->m_Length ) m_AnimationSets->m_Length = CurAnim->m_QuaternionKeys[i].m_Time; pData++;//Esto se que es 4*4 = 16 bits, asi que no me molesto en leerlo CurAnim->m_QuaternionKeys[i].m_QuatKey.w = *pData++; CurAnim->m_QuaternionKeys[i].m_QuatKey.x = *pData++; CurAnim->m_QuaternionKeys[i].m_QuatKey.y = *pData++; CurAnim->m_QuaternionKeys[i].m_QuatKey.z = *pData++; } } break; case 1: //Escalado { delete[] CurAnim->m_VectorKeys; CurAnim->m_NumOfVectorKey = NumOfKeys; CurAnim->m_VectorKeys = new XAnimationVectorKey[NumOfKeys]; for(int i=0; i < NumOfKeys ; ++i) { CurAnim->m_VectorKeys[i].m_Time = *pData++; if( CurAnim->m_QuaternionKeys[i].m_Time > m_AnimationSets->m_Length ) m_AnimationSets->m_Length = CurAnim->m_QuaternionKeys[i].m_Time; pData++;//Esto se que es 4*4 = 16 bits, asi que no me molesto en leerlo D3DXVECTOR3* vecPtr = (D3DXVECTOR3*)pData; CurAnim->m_VectorKeys[i].m_VecKey = *vecPtr; pData += 3; } } break; case 2: //Traslacion { delete[] CurAnim->m_TranslationKeys; CurAnim->m_NumOfVectorKey = NumOfKeys; CurAnim->m_TranslationKeys = new XAnimationVectorKey[NumOfKeys]; for(int i=0; i < NumOfKeys ; ++i) { CurAnim->m_TranslationKeys[i].m_Time = *pData++; if( CurAnim->m_TranslationKeys[i].m_Time > m_AnimationSets->m_Length ) m_AnimationSets->m_Length = CurAnim->m_TranslationKeys[i].m_Time; pData++;//Esto se que es 4*4 = 16 bits, asi que no me molesto en leerlo D3DXVECTOR3* vecPtr = (D3DXVECTOR3*)pData; CurAnim->m_VectorKeys[i].m_VecKey = *vecPtr; pData += 3; } } break; case 4: // Matriz de Transformacion { delete[] CurAnim->m_MatrixKeys; CurAnim->m_NumOfMatrixKey = NumOfKeys; CurAnim->m_MatrixKeys = new XAnimationMatrixKey[NumOfKeys]; for(int i=0; i < NumOfKeys ; ++i) { CurAnim->m_MatrixKeys[i].m_Time = *pData++; if( CurAnim->m_MatrixKeys[i].m_Time > m_AnimationSets->m_Length ) m_AnimationSets->m_Length = CurAnim->m_MatrixKeys[i].m_Time; pData++;//Esto se que es 4*4 = 16 bits, asi que no me molesto en leerlo D3DXMATRIX* matPtr = (D3DXMATRIX*)pData; CurAnim->m_MatrixKeys[i].m_MatKey = *matPtr; pData += 16; } } break; } #pragma endregion pDataObj->Unlock(); } //Parse Children return ParseChildObject(pDataObj,Depth,Data,Reference); }