|
我看了这本书<DirectX高级动画制作>但是里面的源码已经很旧了。很多借口也换了。我改了一下老是不对,很郁闷。。
这是我改的解析x文件的源码,麻烦大侠帮我看看那里错了好吗?
- BOOL SkinParser::ParseObject(ID3DXFileData *pDataObj,
- ID3DXFileData *pParentDataObj, DWORD depth, void ** ppData, BOOL reference)
- {
- HRESULT hr;
- GUID Type;
- hr = pDataObj->GetType(&Type);
- if(FAILED(hr))
- {
- ::MessageBoxA(NULL, "GetGUID failed!", "error", 0);
- return hr;
- }
- if(Type == TID_D3DRMFrame && m_Flags & 2 && reference == FALSE)
- {
- XFrame_EX* pFrame = new XFrame_EX;
- pFrame->Name = GetObjectName(pDataObj);
- if(ppData == NULL)
- {
- // Link as sibling of root
- pFrame->pFrameSibling = m_RootFrame;
- m_RootFrame = pFrame; pFrame = NULL;
- ppData = (void**)&m_RootFrame;
- }
- else
- {
- // Link as child of supplied frame
- XFrame_EX *pFramePtr = (XFrame_EX*)*ppData;
- pFrame->pFrameSibling = pFramePtr->pFrameFirstChild;
- pFramePtr->pFrameFirstChild = pFrame; pFrame = NULL;
- ppData = (void**)&pFramePtr->pFrameFirstChild;
- }
- }
- if(Type == TID_D3DRMFrameTransformMatrix && reference == FALSE && m_Flags & 2 && ppData)
- {
- XFrame_EX *Frame = (XFrame_EX*)*ppData;
- if(Frame)
- {
- SIZE_T dataSize;
- LPCVOID buffer = NULL;
- hr = pDataObj->Lock( &dataSize, &buffer );
- if( FAILED( hr ) )
- return false;
- // 拷贝数据
- if( dataSize == sizeof( D3DXMATRIX ) )
- {
- /*char test[20];
- sprintf(test, "%d", dataSize);
- ::MessageBox(NULL, test, "a" , 0);*/
- memcpy( &Frame->TransformationMatrix, buffer, dataSize );
- pDataObj->Unlock();
- Frame->matOriginal = Frame->TransformationMatrix;
- }
- }
- }
- if(Type == TID_D3DRMMesh && m_Flags & 1) {
- // Only load non-referenced skin meshes into memory
- if(reference == FALSE) {
- // Load the mesh using the data object load method
- MeshContainer_EX *pMesh = NULL;
- LoadMesh(pDataObj, m_pD3DDevice, &pMesh, m_TexturePath, m_NewFVF);
- // Link mesh to head of list of meshes
- if(pMesh)
- {
- pMesh->pNextMeshContainer = m_RootMesh;
- m_RootMesh = pMesh; pMesh = NULL;
- // Link mesh to frame if needed
- if(ppData)
- {
- XFrame_EX *pFrame = (XFrame_EX*)*ppData;
- if(m_Flags & 2 && pFrame)
- pFrame->pMeshContainer = m_RootMesh;
- }
- }
- }
- else
- {
- // If referenced, then check if wanting to link to frame
- if(ppData) {
- XFrame_EX *pFrame = (XFrame_EX*)*ppData;
- if(m_Flags & 2 && m_RootMesh && pFrame) {
- // Get name of mesh reference to link to
- char *tempName = GetObjectName(pDataObj);
- if(tempName) {
- // Find matching mesh by name and store result
- pFrame->pMeshContainer = m_RootMesh->Find(tempName);
- // Clear name
- delete [] tempName; tempName = NULL;
- }
- }
- }
- }
- }
- SIZE_T childNum;
- pDataObj->GetChildren(&childNum);
- if(childNum == 0)
- return TRUE;
- ID3DXFileData* pSubData;
- for(DWORD i = 0; i != childNum; i++)
- {
- pDataObj->GetChild(i, &pSubData);
- ParseObject(pSubData, pParentDataObj, depth, ppData, pSubData->IsReference());
- }
- return TRUE;
- }
复制代码
没有ParserChildObject了,就是重复调用ParserObject.原来的源码的ParserChildObject只是多了QueryInterface不加有关系吗?还有就是为什么书上说如果Frame是引用就直接跳过?不需要连接到框架中吗?麻烦帮我看一下勒。谢谢啊。

我的运行结果是这样的。不知道哪里错了。麻烦指点一下。
|
|