青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

Using the .X File Format(6)

Enumerating Data Objects

At this point, you have opened your .X file and registered the templates you'll be using (such as the DirectX standard templates). The enumeration object has been created, and you are now ready to pull data from the .X file.

In its current state, the IDirectXFileEnumObject object you created points to the first data object in the file, which is typically the Header object. All top−level data objects are siblings of the Header object (or the first object in the file). Each data object you read might contain embedded objects (child objects) or references to other data objects; you can query for both of these.

The enumerator object itself doesn't handle a data object's data. Rather, you need to obtain a data object interface, called IDirectXFileData, to access the data.

Applications use the methods of the IDirectXFileData interface to build or to access the immediate hierarchy of the data object. Template restrictions determine the hierarchy. Data types allowed by the template are called optional members. The optional members are not required, but an object might miss important information without them. These optional members are saved as children of the data object. The children can be another data object, a reference to an earlier data object, or a binary object. Deprecated.

IDirectXFileData Members

Method Description
IDirectXFileData::AddBinaryObject Creates a binary object and adds it as a child object. Deprecated.
IDirectXFileData::AddDataObject Adds a data object as a child object. Deprecated.
IDirectXFileData::AddDataReference Creates and adds a data reference object as a child object. Deprecated.
IDirectXFileData::GetData Retrieves the data for one of the object's members or the data for all members. Deprecated.
IDirectXFileData::GetNextObject Retrieves the next child data object, data reference object, or binary object in the DirectX file. Deprecated.
IDirectXFileData::GetType Retrieves the GUID of the object's template. Deprecated.

Remarks

The GUID for the IDirectXFileData interface is IID_IDirectXFileData.

The LPDIRECTXFILEDATA type is defined as a pointer to this interface.

typedef interface IDirectXFileData *LPDIRECTXFILEDATA;

To obtain an IDirectXFileData interface, you need to call the IDirectXFileEnumObject::GetNextDataObject function.

Retrieves the next top-level object in the DirectX file. Deprecated.

HRESULT GetNextDataObject(
LPDIRECTXFILEDATA * ppDataObj
);

Parameters

ppDataObj
[out] Address of a pointer to an IDirectXFileData interface, representing the returned file data object.

Return Values

If the method succeeds, the return value is DXFILE_OK. If the method fails, the return value can be one of the following values: DXFILEERR_BADVALUE, DXFILEERR_NOMOREOBJECTS

Remarks

Top-level objects are always data objects. Data reference objects and binary objects can only be children of data objects.

With only one parameter, the GetNextDataObject is a breeze to use. You just need to instance an IDirectXFileData object and use it in your call to GetNextDataObject.

IDirectXFileData *pData;
HRESULT hr = pEnum−>GetNextDataObject(&pData);

Notice how I'm saving the return value of the GetNextDataObject call? If the return code is an error(which you can check by using the FAILED macro), it signifies that the enumeration is complete. If the call to GetNextDataObject is successful, then you have yourself a spiffy new interface for accessing the data object's data!

Before you get into working with the object's data, let's finish the discussion on enumeration. So far, you've been able to enumerate the first data object in a file and retrieve its data interface. What do you do when you want to go to the next data object in the .X file or query for embedded data objects?

Once you're finished with a data interface, you need to free it to go to the next data object. Simply calling IDirectXFileData::Release will free the data interface, and repeating the call to IDirectXFileEnumObject::GetNextDataObject will get the next enumerated sibling (top−level) data object for you. You can wrap the entire enumeration of siblings (grabbing their respective data interfaces)
into a code bite such as this one:

while(SUCCEEDED(pEnum−>GetNextDataObject(&pData))) {
  // Do something with pData data object
  // Free the data interface in order to continue
  pData−>Release();
}

All that's left is to add the ability to query for child (lower−level) data objects, and to allow those child objects to be enumerated and accessed. To query for a child data object, you use the IDirectXFileData::GetNextObject function to first see whether a data object contains any embedded objects.

Retrieves the next child data object, data reference object, or binary object in the DirectX file. Deprecated.

HRESULT GetNextObject(
LPDIRECTXFILEOBJECT * ppChildObj
);

Parameters

ppChildObj
[out, retval] Address of a pointer to an IDirectXFileObject interface, representing the returned child object's file object interface.

Return Values

If the method succeeds, the return value is DXFILE_OK. If the method fails, the return value can be one of the following values: DXFILEERR_BADVALUE, DXFILEERR_NOMOREOBJECTS.

Remarks

To determine the type of object retrieved, use QueryInterface to query the retrieved object for support of IDirectXFileData, IDirectXFileDataReference, or IDirectXFileBinary interfaces. The interface supported indicates the type of object (data, data reference, or binary).

This is another simple function with only one parameter−the pointer to an IDirectXFileObject interface. If the call to GetNextObject is successful, then you need to process the child data object. Once you've done that, you can free it (by calling Release) and continue calling GetNextObject until it returns an error code, which signifies that no more child objects remain.

You can wrap the continuous calling of GetNextObject into a small loop, as I have done here.

IDirectXFileObject *pObject;

while(SUCCEEDED(pData−>GetNextObject(&pObject))) {
  // A child data object exists, need to query for it
  // Free file object interface
  pObject−>Release();
}

Once you have a valid IDirectFileObject interface (after the call to GetNextObject), you can quickly determine which child data object it is currently enumerating (using the techniques coming up in the next section). There's a slight snag, however. A data object can either be referenced or instanced, and the way you access the object varies a bit depending on which type it is.

For instanced objects (those defined normally in an .X file), you can query the IDirectXFileObject for an IDirectXFileData interface.

IDirectXFileData *pSubData;

// Check if child object is instanced (fails if not)
if(SUCCEEDED(pObject−>QueryInterface( IID_IDirectXFileData, (void**)&pSubData))) {
  // Child data object exists, do something with it.
  // Free data object
  pSubData−>Release();
}

Using what you've just learned, you can query a child data object's IDirectXFileData object for its own embedded child objects.

As for referenced data objects, you need to first query for the IDirectXFileDataReference object and resolve the reference into an IDirectXFileData object.

Applications use the methods of the IDirectXFileDataReference interface to support data reference objects. A data reference object refers to a data object that is defined earlier in the file. This enables you to use the same object multiple times without repeating it in the file. Deprecated.

IDirectXFileDataReference Members

Method Description
IDirectXFileDataReference::Resolve Resolves data references. Deprecated.

Remarks

After you have determined that an object is a data reference object, use the IDirectXFileDataReference::Resolve method to retrieve the referenced object defined earlier in the file. For information about how to identify a data reference object, see the IDirectXFileData interface.

The GUID for the IDirectXFileDataReference interface is IID_IDirectXFileDataReference.

The LPDIRECTXFILEDataReference type is defined as a pointer to this interface.

typedef interface IDirectXFileDataReference *LPDIRECTXFILEDATAREFERENCE;

IDirectXFileDataReference::Resolve

Resolves data references. Deprecated.

HRESULT Resolve(
LPDIRECTXFILEDATA * ppDataObj
);

Parameters

ppDataObj
[out, retval] Address of a pointer to an IDirectXFileData interface, representing the returned file data object.

Return Values

If the method succeeds, the return value is DXFILE_OK. If the method fails, the return value can be one of the following values: DXFILEERR_BADVALUE, DXFILEERR_NOTFOUND.

The following code will query and resolve the referenced data object for you.

Tip If an instanced data object does not exist when you query for it, the call to QueryInterface will fail. This is a quick way to tell the type of the data object. The same goes for referenced objects−the query will fail, meaning the object is not referenced.

IDirectXFileDataReference *pRef;
IDirectXFileData *pSubData;

// Check if the data object is referenced (fails if not)
if(SUCCEEDED(pSubObj−>QueryInterface(IID_IDirectXFileDataReference, (void**)&pRef))) {
  // A data object reference exists. Resolve the reference
  pRef−>Resolve(&pSubData);

  // Do something with data object
  // Release the interfaces used
  pRef−>Release();
  pSubData−>Release();
}

Would you believe me if I told you that the hardest part is over? Enumerating the data objects and child objects is simple, and if that's as hard as it gets, then you're in for an easy ride! To make your programming job much easier, I suggest wrapping up the entire enumeration of data objects into two simple functions.

The first function (called Parse) will open an .X file, create the enumeration object, and enumerate all top−level data objects. The function will then take each enumerated object and pass it to the second function (ParseObject), which will process the data object data based on its template type and scan for embedded child data objects. The ParseObject function will call itself using any child objects it finds, thus processing a child's embedded objects.

The code for the Parse function follows.

// Need to include rmxftmpl.h and rmxfguid.h
BOOL Parse(char *Filename)
{
IDirectXFile *pFile = NULL;
IDirectXFileEnumObject *pEnum = NULL;
IDirectXFileData *pData = NULL;
	// Create the enumeration object, return on error
if(FAILED(DirectXFileCreate(&pFile)))
return FALSE;
	// Register the standard templates, return on error
if(FAILED(pFile−>RegisterTemplates((LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES)))
return FALSE;
	// Create the enumeration object, return on error
if(FAILED(pDXFile−>CreateEnumObject((LPVOID)Filename, DXFILELOAD_FROMFILE, &pEnum))) {
pFile−>Release();
return FALSE;
}
	// Loop through all top−level data objects
while(SUCCEEDED(pEnum−>GetNextDataObject(&pData))) {
// Parse the data object by calling ParseObject
ParseObject(pData);
		// Release the data object
pData−>Release();
}
	// Release used COM objects
pEnum−>Release();
pFile−>Release();
return TRUE;
}

The Parse function doesn't hold back any punches, and it certainly isn't overly complicated. I have already explained everything in the function, so there's no need to recap here. Instead, move on to the ParseObject function, which takes a data object and queries it for child objects.

void ParseObject(IDirectXFileData *pData)
{
IDirectXFileObject *pObject = NULL;
IDirectXFileData *pSubData = NULL;
IDirectXFileDataReference *pRef = NULL;
	// Scan for embedded objects
while(SUCCEEDED(pData−>GetNextObject(&pObject))) {
// Look for referenced objects
if(SUCCEEDED(pObject−>QueryInterface(IID_IDirectXFileDataReference, (void**)&pRef))) {
// Resolve the data object
pRef−>Resolve(&pSubData);
			// Parse the object by calling ParseObject
ParseObject(pSubData);
			// Free interfaces
pSubData−>Release();
pRef−>Release();
}
		// Look for instanced objects
if(SUCCEEDED(pObject−>QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
// Parse the object by calling ParseObject
ParseObject(pSubData);
// Free the object interface
pSubData−>Release();
}
		// Free the interface for next object to use
pObject−>Release();
}
}

Again, the ParseObject function doesn't contain anything new. The one thing you'll notice about Parse and ParseObject is that they don't really do anything except enumerate every data object in an .X file. When it comes time to work with an object's data, what do you do?


posted on 2008-04-17 18:44 lovedday 閱讀(684) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久热综合在线亚洲精品| 亚洲永久免费| 麻豆91精品91久久久的内涵| 欧美亚洲色图校园春色| 国产一二三精品| 裸体一区二区三区| 欧美国产三区| 中文高清一区| 亚洲女性裸体视频| 在线精品一区二区| 99国产精品一区| 国产欧美日韩亚洲精品| 久久亚洲精品视频| 欧美精品九九99久久| 午夜久久影院| 免费日韩视频| 午夜免费在线观看精品视频| 久久精品国产亚洲一区二区三区 | 久久精品国产999大香线蕉| 激情成人在线视频| 亚洲欧洲三级电影| 欧美日韩激情小视频| 久久成人免费网| 麻豆精品网站| 午夜精品一区二区三区电影天堂 | 久久久久国色av免费观看性色| 曰韩精品一区二区| 夜夜精品视频一区二区| 激情五月综合色婷婷一区二区| 亚洲国产精品一区二区www| 国产精品日韩欧美一区二区三区| 蜜桃久久精品乱码一区二区| 欧美午夜女人视频在线| 美女网站久久| 国产精品婷婷| 日韩一级黄色片| 在线精品亚洲一区二区| 午夜精品久久| 一本大道久久a久久精品综合| 欧美一区二区三区在线看| 日韩一级在线| 麻豆精品精华液| 久久精品首页| 国产女人精品视频| 亚洲伦伦在线| 亚洲精品乱码久久久久久黑人 | 国产精品欧美一区喷水| 91久久国产综合久久蜜月精品| 国产日韩av在线播放| 一区二区欧美日韩视频| 亚洲全部视频| 噜噜噜在线观看免费视频日韩| 久久精品国产91精品亚洲| 国产精品成人一区二区网站软件| 欧美华人在线视频| 亚洲成人自拍视频| 久久精品一区二区三区四区| 久久成人亚洲| 国产欧美三级| 香蕉成人啪国产精品视频综合网| 亚洲欧美美女| 国产精品国产a级| 夜久久久久久| 亚洲欧美日韩在线一区| 国产精品v亚洲精品v日韩精品| 日韩一级二级三级| 亚洲视频在线一区| 欧美午夜精品久久久久久浪潮| 亚洲精品免费一区二区三区| 99视频一区| 欧美日韩一区二区三区在线观看免| 91久久久亚洲精品| 99国内精品久久| 欧美日韩中文字幕精品| 一个人看的www久久| 亚洲男人第一av网站| 国产精品女主播| 欧美一区三区二区在线观看| 久久久一区二区三区| 在线欧美一区| 欧美精品在线免费播放| 日韩亚洲欧美一区二区三区| 亚洲欧美99| 国产一二三精品| 欧美成人性生活| 日韩视频一区二区| 欧美一区二区三区的| 国内综合精品午夜久久资源| 嫩草国产精品入口| 999亚洲国产精| 久久精品在这里| 亚洲高清网站| 欧美jizzhd精品欧美喷水| 免费观看成人www动漫视频| 亚洲人成人一区二区三区| 欧美日韩美女| 久久精品国产91精品亚洲| 亚洲日本va午夜在线影院| 亚洲欧美日韩视频二区| 经典三级久久| 欧美色大人视频| 久久全国免费视频| 一区二区三区|亚洲午夜| 久久夜色精品国产噜噜av| av成人激情| 一区视频在线播放| 国产精品理论片在线观看| 久久偷看各类wc女厕嘘嘘偷窃| 99国内精品| 亚洲电影免费在线观看| 欧美一级专区| 99精品国产99久久久久久福利| 国产精品美女www爽爽爽| 欧美xx69| 久久精品理论片| 在线亚洲一区观看| 欧美福利视频在线| 欧美一区二区三区在线免费观看| 亚洲人成77777在线观看网| 国内久久精品视频| 国产美女精品视频免费观看| 欧美精品少妇一区二区三区| 久久成人精品| 性做久久久久久| 一区二区三区导航| 亚洲日本成人| 欧美电影专区| 免费观看久久久4p| 久久久天天操| 久久岛国电影| 香蕉久久夜色| 亚洲欧美资源在线| 亚洲午夜激情免费视频| 9人人澡人人爽人人精品| 亚洲破处大片| 亚洲欧洲在线视频| 亚洲日本va午夜在线影院| 亚洲第一久久影院| 在线观看成人网| 一区精品在线| 在线观看一区二区视频| 狠狠色丁香婷婷综合| 激情国产一区二区| 国内精品久久久久久| 国外成人在线视频网站| 国语精品中文字幕| 尤物九九久久国产精品的分类| 黄网动漫久久久| 亚洲国产日韩精品| 亚洲乱码国产乱码精品精天堂 | 亚洲精品无人区| 一本一道久久综合狠狠老精东影业| 99热免费精品在线观看| 一区二区三区欧美成人| 亚洲影院色无极综合| 亚洲欧美综合网| 久久精品91久久久久久再现| 久久久xxx| 亚洲第一二三四五区| 日韩亚洲不卡在线| 亚洲欧美网站| 久久久久久网站| 欧美精品不卡| 国产日产欧产精品推荐色 | 国内成人精品一区| 91久久精品日日躁夜夜躁欧美| 亚洲人www| 香蕉乱码成人久久天堂爱免费| 久久久久久久久久码影片| 欧美国产一区二区在线观看 | 免费欧美电影| 一区二区三区偷拍| 久久99伊人| 欧美日本不卡| 国内精品视频666| 亚洲精品中文在线| 久久国产福利国产秒拍| 欧美激情精品久久久六区热门| 亚洲美女av网站| 久久久久久久久久久成人| 欧美日韩精品免费看| 激情一区二区三区| 亚洲小少妇裸体bbw| 美女精品网站| 亚洲午夜精品在线| 欧美 日韩 国产精品免费观看| 欧美亚州一区二区三区| 亚洲国产成人久久| 亚洲欧美在线网| 亚洲人成啪啪网站| 久久久av网站| 国产美女一区二区| 一区二区三区 在线观看视| 免费在线亚洲| 欧美在线观看视频一区二区三区| 欧美日韩不卡视频| 亚洲国产精品久久| 久久天天狠狠| 午夜精品一区二区三区在线播放| 欧美片第一页|