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);
}    
Example #2
0
		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);
		}