HRESULT CXFrameNode::MergeFromXData(char* Filename, CXModel* Model, LPDIRECTXFILEDATA XObj)
{
	HRESULT res = S_OK;

	// get the type of the object
	const GUID* ObjectType;
	res = XObj->GetType(&ObjectType);
	if(FAILED(res))
	{
		Game->LOG(res, "Error getting object type");
		return res;
	}
	// load animation set
	else if(*ObjectType == TID_D3DRMAnimationSet )
	{
		return Model->LoadAnimationSet(Filename, XObj);
	}

	// load a single animation (shouldn't happen here)
	else if(*ObjectType == TID_D3DRMAnimation)
	{
		return Model->LoadAnimation(Filename, XObj);
	}

	// scan child frames
	else if(*ObjectType == TID_D3DRMFrame)
	{
		// Enumerate child objects.
		// Child object can be data, data reference or binary.
		// Use QueryInterface() to find what objecttype of object a child is.
		LPDIRECTXFILEDATA XChildData;
		LPDIRECTXFILEOBJECT XChildObj;
		res = E_FAIL;
		while(SUCCEEDED(XObj->GetNextObject(&XChildObj)))
		{
			// Query the child for it's FileData
			res = XChildObj->QueryInterface(IID_IDirectXFileData, (void**)&XChildData);
			if(SUCCEEDED(res))
			{
				// load the child's object
				res = MergeFromXData(Filename, Model, XChildData);
				RELEASE(XChildData);
			}
			RELEASE(XChildObj);
		}
		return res;
	}
	return S_OK; // unknown type, ignore
}
Example #2
0
//-----------------------------------------------------------------------------
// Name:
// Desc:
//-----------------------------------------------------------------------------
HRESULT CD3DFile::LoadFrame( LPDIRECT3DDEVICE9 pd3dDevice,
                             LPDIRECTXFILEDATA pFileData,
                             CD3DFrame* pParentFrame )
{
    LPDIRECTXFILEDATA   pChildData = NULL;
    LPDIRECTXFILEOBJECT pChildObj = NULL;
    const GUID* pGUID;
    DWORD       cbSize;
    CD3DFrame*  pCurrentFrame;
    HRESULT     hr;

    // Get the type of the object
    if( FAILED( hr = pFileData->GetType( &pGUID ) ) )
        return hr;

    if( *pGUID == TID_D3DRMMesh )
    {
        hr = LoadMesh( pd3dDevice, pFileData, pParentFrame );
        if( FAILED(hr) )
            return hr;
    }
    if( *pGUID == TID_D3DRMFrameTransformMatrix )
    {
        D3DXMATRIX* pmatMatrix;
        hr = pFileData->GetData( NULL, &cbSize, (void**)&pmatMatrix );
        if( FAILED(hr) )
            return hr;

        // Update the parent's matrix with the new one
        pParentFrame->SetMatrix( pmatMatrix );
    }
    if( *pGUID == TID_D3DRMFrame )
    {
        // Get the frame name
        CHAR  strAnsiName[512] = "";
        TCHAR strName[512];
        DWORD dwNameLength = 512;
        if( FAILED( hr = pFileData->GetName( strAnsiName, &dwNameLength ) ) )
            return hr;
        DXUtil_ConvertAnsiStringToGenericCb( strName, strAnsiName, sizeof(strName) );

        // Create the frame
        pCurrentFrame = new CD3DFrame( strName );
        if( pCurrentFrame == NULL )
            return E_OUTOFMEMORY;

        pCurrentFrame->m_pNext = pParentFrame->m_pChild;
        pParentFrame->m_pChild = pCurrentFrame;

        // Enumerate child objects
        while( SUCCEEDED( pFileData->GetNextObject( &pChildObj ) ) )
        {
            // Query the child for its FileData
            hr = pChildObj->QueryInterface( IID_IDirectXFileData,
                                            (void**)&pChildData );
            if( SUCCEEDED(hr) )
            {
                hr = LoadFrame( pd3dDevice, pChildData, pCurrentFrame );
                pChildData->Release();
            }

            pChildObj->Release();

            if( FAILED(hr) )
                return hr;
        }
    }

    return S_OK;
}
HRESULT CXFrameNode::LoadFromXData(char* Filename, CXModel* Model, LPDIRECTXFILEDATA XObj)
{
	Game->MiniUpdate();

	HRESULT res = S_OK;

	// {9E415A43-7BA6-4a73-8743-B73D47E88476}
	GUID DXFILEOBJ_AnimTicksPerSecond = { 0x9e415a43, 0x7ba6, 0x4a73, { 0x87, 0x43, 0xb7, 0x3d, 0x47, 0xe8, 0x84, 0x76 } };

	// get the type of the object
	const GUID* ObjectType;
	res = XObj->GetType(&ObjectType);
	if(FAILED(res))
	{
		Game->LOG(res, "Error getting object type");
		return res;
	}

	// load a child mesh
	if(*ObjectType == TID_D3DRMMesh)
	{
		CXMesh* Mesh = new CXMesh(Game);
		res = Mesh->LoadFromXData(Filename, XObj);
		if(SUCCEEDED(res))
		{
			m_Meshes.Add(Mesh);
			return S_OK;
		}
		else
		{
			SAFE_DELETE(Mesh);
			return res;
		}		
	}

	
	// load the transformation matrix
	else if(*ObjectType == TID_D3DRMFrameTransformMatrix)
	{		
		D3DXMATRIX* mat;
		DWORD Size;

		res = XObj->GetData(NULL, &Size, (void**)&mat);
		if(FAILED(res))
		{
			Game->LOG(res, "Error loading transformation matrix");
			return res;
		}
		else
		{
			m_TransformationMatrix = *mat;
			m_OriginalMatrix = *mat;
			return S_OK;
		}
	}
	
	// load animation set
	else if(*ObjectType == TID_D3DRMAnimationSet )
	{
		return Model->LoadAnimationSet(Filename, XObj);
	}

	// load a single animation (shouldn't happen here)
	else if(*ObjectType == TID_D3DRMAnimation)
	{
		return Model->LoadAnimation(Filename, XObj);
	}

	// create a new child frame
	else if(*ObjectType == TID_D3DRMFrame)
	{
		CXFrameNode* ChildFrame = new CXFrameNode(Game);

		// get the name of the child frame
		res = CXModel::LoadName(ChildFrame, XObj);
		if(FAILED(res))
		{
			Game->LOG(res, "Error loading frame name");
			SAFE_DELETE(ChildFrame);
			return res;
		}

		// Enumerate child objects.
		// Child object can be data, data reference or binary.
		// Use QueryInterface() to find what objecttype of object a child is.
		LPDIRECTXFILEDATA XChildData;
		LPDIRECTXFILEOBJECT XChildObj;
		res = E_FAIL;
		while(SUCCEEDED(XObj->GetNextObject(&XChildObj)))
		{
			// Query the child for it's FileData
			res = XChildObj->QueryInterface(IID_IDirectXFileData, (void**)&XChildData);
			if(SUCCEEDED(res))
			{
				// load the child's object
				res = ChildFrame->LoadFromXData(Filename, Model, XChildData);
				RELEASE(XChildData);
			}
			RELEASE(XChildObj);
		}
		if(SUCCEEDED(res)) m_Frames.Add(ChildFrame);
		else
		{
			SAFE_DELETE(ChildFrame);
		}
		return res;
	}

	else if(*ObjectType == DXFILEOBJ_AnimTicksPerSecond)
	{
		DWORD* TicksPerSecond;
		DWORD Size;

		res = XObj->GetData(NULL, &Size, (void**)&TicksPerSecond);
		if(FAILED(res))
		{
			Game->LOG(res, "Error loading ticks per seconds info");
			return res;
		}
		else
		{
			Model->m_TicksPerSecond = *TicksPerSecond;
			return S_OK;
		}
	}

	return S_OK; // unknown type, ignore
}