|
??????.X????????????????????????
?DirectX ??????????p104?
??.X??????????
???.X???????
???.X?????????
---------------------------------------------------------
??.X??????
BOOL ParseXFile(char *Filename)
{
?IDirectXFile *pDXFile = NULL;
?IDirectXFileEnumObject *pDXEnum = NULL;
?IDirectXFileData *pDXData = NULL;
?// ??DirectXFile??
?if(FAILED(DirectXFileCreate(&pDXFile)))
??return FALSE;
?// ???????
?// ?????Direct3D??????
?if(FAILED(pDXFile->RegisterTemplates((LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES))) {
??pDXFile->Release();
??return FALSE;
?}
?// ???????
?if(FAILED(pDXFile->CreateEnumObject((LPVOID)Filename, DXFILELOAD_FROMFILE, &pDXEnum))) {
??pDXFile->Release();
??return FALSE;
?}
?// ?????????
?while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
??ParseXFileData(pDXData);
??ReleaseCOM(pDXData);
?}
?// ????
?ReleaseCOM(pDXEnum);
?ReleaseCOM(pDXFile);
?// ??
?return TRUE;
}
void ParseXFileData(IDirectXFileData *pData)
{
?IDirectXFileObject *pSubObj = NULL;
?IDirectXFileData *pSubData = NULL;
?IDirectXFileDataReference *pDataRef = NULL;
?const GUID *pType = NULL;
?char *pName = NULL;
?DWORD dwSize;
?char *pBuffer;
?// ??????
?if(FAILED(pData->GetType(&pType)))
??return;
?// ???????????
?if(FAILED(pData->GetName(NULL, &dwSize)))
??return;
?if(dwSize) {
??if((pName = new char[dwSize]) != NULL)
???pData->GetName(pName, &dwSize);
?}
?// ??????????????????
?if(pName == NULL) {
??if((pName = new char[9]) == NULL)
???return;
??strcpy(pName, "Template");
?}
?// ????????????????
?// ??????????????
?if(*pType == TID_D3DRMFrame) {
??MessageBox(NULL, pName, "Frame template found", MB_OK);
?}
?if(*pType == TID_D3DRMMesh) {
??MessageBox(NULL, pName, "Mesh template found", MB_OK);
?}
?if(*pType == TID_D3DRMMaterial) {
??MessageBox(NULL, pName, "Material template found", MB_OK);
?}
?if(*pType == TID_D3DRMFrameTransformMatrix) {
??MessageBox(NULL, pName, "Frame transformation matrix template found", MB_OK);
??// ????????Get the template data
??if(FAILED(pData->GetData(NULL, &dwSize, (PVOID*)&pBuffer)))
???return;
??// ??????????????
??// ?????????????????????
?}
?// ?????????
?while(SUCCEEDED(pData->GetNextObject(&pSubObj))) {
??// ??????????
??if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileDataReference, (void**)&pDataRef))) {
???if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
????ParseXFileData(pSubData);
????ReleaseCOM(pSubData);
???}
???ReleaseCOM(pDataRef);
??}
??// Process non-referenced embedded templates
??if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
???ParseXFileData(pSubData);
???ReleaseCOM(pSubData);
??}
??ReleaseCOM(pSubObj);
?}
?// ??????
?delete pName;
}
????http://unfadinglove.bokee.com/1484772.html?
-------------------------------------------------------------
??ParseXFile?????IDirectXFile?????????????.X ????????????????(Register)?????.X????????????
?????????????????????
???
// ?????????
?while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
??ParseXFileData(pDXData);
??ReleaseCOM(pDXData);
?}
???????????
|->??
???-?? |->??
| |->??
| |->?
|
|->??
|->??
|->?
?????????????????????????
------
const GUID *pType = NULL;
// ??????
?if(FAILED(pData->GetType(&pType)))
??return;
// ????????????????
?// ??????????????
?if(*pType == TID_D3DRMFrame) {
??MessageBox(NULL, pName, "Frame template found", MB_OK);
?}
?if(*pType == TID_D3DRMMesh) {
??MessageBox(NULL, pName, "Mesh template found", MB_OK);
?}
?if(*pType == TID_D3DRMMaterial) {
??MessageBox(NULL, pName, "Material template found", MB_OK);
?}
?if(*pType == TID_D3DRMFrameTransformMatrix) {
??MessageBox(NULL, pName, "Frame transformation matrix template found", MB_OK);
globally unique identifier (GUID)?????????????
----------------------------------------------------------------
?DirectX ??????????p106?
?????.X?????????????????????????????????????????????????????????????????????????????????
??if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileDataReference, (void**)&pDataRef))) {
???if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
????ParseXFileData(pSubData);
????ReleaseCOM(pSubData);
???}
???ReleaseCOM(pDataRef);
??}
??// Process non-referenced embedded templates
??if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
???ParseXFileData(pSubData);
???ReleaseCOM(pSubData);
??}
??ReleaseCOM(pSubObj);
?}
.X?????????????????
pDataRef->Resolve(&pSubData)??????
|
|