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

天行健 君子當自強而不息

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 閱讀(685) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 欧美激情一区| 亚洲一区二区三| 性色av一区二区三区| 母乳一区在线观看| 一区二区日本视频| 免费不卡视频| 一区二区三区视频在线看| 久久精品国产亚洲高清剧情介绍| 女仆av观看一区| 国产欧美日韩视频一区二区三区| 尤物在线观看一区| 亚洲制服丝袜在线| 亚洲精选91| 久久婷婷激情| 欧美精品自拍偷拍动漫精品| 欧美在线视频一区二区三区| 国产日韩精品在线观看| 亚洲日本无吗高清不卡| 国产一区二区三区精品欧美日韩一区二区三区 | 国产毛片一区二区| 一区二区三区四区精品| av72成人在线| 欧美二区在线看| 激情亚洲网站| 欧美黄在线观看| 免费成人性网站| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲欧美日韩另类精品一区二区三区| 欧美一区二区三区在线视频| 亚洲女女女同性video| 欧美黄色一区| 亚洲自拍偷拍麻豆| 91久久在线| 亚洲中字在线| 国产日韩欧美中文| 亚洲午夜激情网站| 欧美一区视频| 国产午夜精品在线观看| 午夜精品视频在线| 久久久无码精品亚洲日韩按摩| 国产麻豆日韩| 久久嫩草精品久久久久| 亚洲高清视频的网址| 亚洲视频一区二区免费在线观看| 欧美日韩另类丝袜其他| 午夜精品区一区二区三| 欧美国内亚洲| 麻豆精品视频在线观看| 欧美激情精品久久久久久变态| 9久草视频在线视频精品| 国产精品久久久久久久电影| 久久久久九九九九| 亚洲视频电影图片偷拍一区| 美日韩精品免费| 亚洲一区二区三区免费观看| 好吊视频一区二区三区四区 | 亚洲精品国产精品国产自| 99在线热播精品免费| 欧美影片第一页| 久久福利精品| 亚洲人成网站在线播| 亚洲私人黄色宅男| 国产精品国产成人国产三级| 亚洲第一偷拍| 亚洲嫩草精品久久| 欧美黄色免费网站| 羞羞视频在线观看欧美| 亚洲欧美一区二区原创| 欧美精品不卡| 午夜精品国产更新| 麻豆免费精品视频| 免费欧美电影| aa级大片欧美| 亚洲欧美日韩人成在线播放| 亚洲精品国产精品乱码不99按摩| 亚洲三级毛片| 国产亚洲精品久久久| 亚洲人成在线观看| 国产亚洲视频在线| 亚洲最新在线| 狠狠色综合一区二区| 99亚洲视频| 9l视频自拍蝌蚪9l视频成人| 久久gogo国模裸体人体| 午夜在线a亚洲v天堂网2018| 欧美成人在线免费视频| 欧美影院视频| 国产精品v日韩精品| 麻豆成人在线观看| 国产亚洲在线| 99视频超级精品| 亚洲三级免费| 久久青草久久| 亚洲欧美中文在线视频| 欧美日韩激情网| 欧美成人伊人久久综合网| 国产精品影音先锋| 136国产福利精品导航网址| 欧美激情精品久久久久久黑人| 免费欧美在线| 免费黄网站欧美| 国产精品网站在线| 另类av导航| 国产欧美精品日韩区二区麻豆天美| 亚洲人成网站精品片在线观看| 欧美日韩免费观看一区三区| 欧美一二三视频| 欧美无砖砖区免费| 亚洲精品久久久久久久久久久| 亚洲茄子视频| 蜜臀av在线播放一区二区三区| 亚洲午夜久久久久久尤物| 国产精品草莓在线免费观看| 一本色道久久综合亚洲精品不卡 | 亚洲国产日韩在线一区模特| 亚洲欧洲午夜| 另类激情亚洲| 久久av一区| 狠狠色噜噜狠狠色综合久| 欧美中文字幕不卡| 六月丁香综合| 在线精品视频免费观看| 久久综合影视| 亚洲人成高清| 亚洲一级免费视频| 国产精品国产三级国产a| 制服丝袜激情欧洲亚洲| 久久精品一本| 在线观看一区| 欧美日韩亚洲一区三区| 亚洲已满18点击进入久久| 久久一综合视频| 亚洲激情国产| 国产精品视频免费观看www| 久久av一区二区三区亚洲| 亚洲激情第一页| 亚洲午夜极品| 欧美性一二三区| 久久久久久久网站| 亚洲国产小视频| 亚洲黄色尤物视频| 欧美激情一区二区三区在线视频观看| 一道本一区二区| 久久黄色影院| 一二三四社区欧美黄| 国产精品视频一二三| 欧美成ee人免费视频| 亚洲视频每日更新| 欧美一区二区国产| 99人久久精品视频最新地址| 国产精品免费网站| 久久综合久久综合久久| 亚洲美女尤物影院| 久久久久高清| 亚洲欧美久久久久一区二区三区| 国产在线欧美| 国产精品日本精品| 欧美极品色图| 久久久久久久成人| 亚洲天堂免费观看| 亚洲国产精彩中文乱码av在线播放| 亚洲一区二区三区四区在线观看| 狠狠色综合播放一区二区| 欧美日韩免费视频| 99re66热这里只有精品4| 91久久夜色精品国产网站| 亚洲一区二区三区乱码aⅴ| 久久久久国产精品人| 亚洲在线观看视频| 国产精品福利在线观看| a4yy欧美一区二区三区| 91久久精品一区| 国产日产亚洲精品| 欧美激情女人20p| 国产一区二区三区在线观看视频 | 99国内精品久久| 欧美韩日一区二区| 欧美一区二区私人影院日本| 99亚洲一区二区| 精品va天堂亚洲国产| 国产欧美一区视频| 欧美日韩一级片在线观看| 欧美精品1区| 免费h精品视频在线播放| 久久国产直播| 亚洲在线免费视频| 亚洲一区国产一区| 亚洲少妇自拍| 亚洲免费影视第一页| 制服丝袜亚洲播放| 一区二区激情视频| 亚洲影视综合| 亚洲欧美国产va在线影院| 亚洲一区二区少妇| 日韩视频精品在线| 亚洲一区二区日本| 中文国产成人精品| 亚洲欧美激情一区| 亚洲主播在线|