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

天行健 君子當(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>
            国产偷国产偷精品高清尤物| 亚洲国产女人aaa毛片在线| 欧美新色视频| 欧美精品午夜视频| 欧美日韩精品一区二区在线播放| 欧美高清视频www夜色资源网| 欧美成人dvd在线视频| 欧美黄色免费网站| 欧美色欧美亚洲高清在线视频| 欧美婷婷六月丁香综合色| 国产精品视频免费在线观看| 国产精品一级久久久| 国模私拍一区二区三区| 亚洲国产欧美一区| 中文国产成人精品久久一| 欧美一级在线播放| 欧美国产日产韩国视频| av成人动漫| 久久―日本道色综合久久| 欧美国产视频在线| 国产精品一二三四| 亚洲电影观看| 午夜精品久久久久影视| 欧美jizz19性欧美| 亚洲午夜视频| 欧美二区乱c少妇| 国产日韩欧美自拍| 亚洲午夜成aⅴ人片| 久久久久久**毛片大全| 99天天综合性| 欧美激情91| 亚洲大胆在线| 久久久99免费视频| 中文欧美字幕免费| 欧美激情一区二区三区在线视频观看 | 亚洲一区二区高清| 欧美寡妇偷汉性猛交| 国产欧美视频一区二区三区| 亚洲国产导航| 久久久国产精彩视频美女艺术照福利| 亚洲精品日韩在线| 亚洲日本中文| 久久久久久亚洲精品杨幂换脸| 欧美三级视频在线观看| 亚洲国产精品久久久久婷婷老年| 午夜在线a亚洲v天堂网2018| 亚洲黄色一区| 久久亚裔精品欧美| 好看的日韩av电影| 欧美伊人精品成人久久综合97| 最新国产拍偷乱拍精品| 久久午夜精品一区二区| 激情综合中文娱乐网| 欧美一区二区三区婷婷月色| 99精品热视频只有精品10| 欧美成va人片在线观看| 亚洲第一区中文99精品| 欧美jizz19性欧美| 美女主播一区| 亚洲精品国产视频| 最新日韩欧美| 欧美日韩精品久久久| 一区二区欧美日韩| 一本大道久久精品懂色aⅴ| 欧美日韩直播| 欧美一区二区三区久久精品| 亚洲在线视频免费观看| 国产精品日韩精品欧美在线| 午夜在线精品偷拍| 亚洲欧美日韩中文视频| 国产一区二区久久| 欧美1区3d| 欧美激情亚洲另类| 亚洲一级二级| 欧美一区二区黄色| 亚洲第一在线综合在线| 亚洲第一色中文字幕| 欧美人在线视频| 亚洲自拍16p| 久久福利电影| 99re这里只有精品6| 亚洲图片激情小说| 亚洲高清不卡一区| 一区二区三区福利| 伊人色综合久久天天| 亚洲动漫精品| 国产精品男女猛烈高潮激情| 久久夜色精品国产欧美乱| 欧美激情欧美狂野欧美精品| 亚洲一区二区三区在线观看视频| 午夜精品亚洲一区二区三区嫩草| 激情欧美日韩一区| 99国产麻豆精品| 极品日韩久久| 亚洲视频在线一区观看| 在线成人av.com| 亚洲视频碰碰| 亚洲激情自拍| 翔田千里一区二区| 一区二区三区欧美成人| 欧美在线观看一二区| 午夜欧美精品| 一本色道精品久久一区二区三区 | 中文国产成人精品| 久久精品视频在线看| 中文国产成人精品久久一| 欧美在线视频免费播放| 亚洲天堂成人在线观看| 久久伊伊香蕉| 久久精品人人做人人爽电影蜜月| 欧美国产亚洲精品久久久8v| 久久精品卡一| 国产精品xvideos88| 免费看精品久久片| 国产精品美女久久久久久2018| 欧美成人国产| 国产亚洲精品一区二区| 在线亚洲欧美专区二区| 亚洲免费av电影| 美女露胸一区二区三区| 久久精品一区二区国产| 亚洲激情二区| 亚洲人成在线观看| 久久综合国产精品| 久久疯狂做爰流白浆xx| 国产精品乱码人人做人人爱| 91久久久精品| 亚洲人成网在线播放| 久久男人资源视频| 久久全国免费视频| 国产一区视频观看| 午夜精品久久久久久| 亚洲在线免费视频| 国产精品福利网站| 亚洲视频中文字幕| 先锋影音国产一区| 国产欧美一区二区精品忘忧草| 在线综合视频| 欧美一区二区三区日韩视频| 国产欧美日韩一级| 久久成人免费网| 久久一区二区精品| 亚洲二区视频| 欧美精品v日韩精品v国产精品| 亚洲国产天堂久久综合网| 亚洲免费福利视频| 欧美日韩亚洲一区二| 夜夜嗨一区二区| 性色av香蕉一区二区| 国产日韩免费| 久久日韩精品| 亚洲国产精品悠悠久久琪琪| 亚洲精品在线观| 国产精品久久久久秋霞鲁丝| 亚洲欧美日韩在线一区| 久久久久久久久岛国免费| 国内精品嫩模av私拍在线观看| 久久久999| 亚洲免费观看高清完整版在线观看| 亚洲专区在线视频| 在线观看亚洲视频| 欧美日韩国产限制| 午夜国产一区| 欧美黄污视频| 亚洲欧美在线观看| 在线观看亚洲| 欧美网站在线观看| 久久福利精品| 欧美成人免费小视频| 国产在线视频欧美一区二区三区| 99精品久久免费看蜜臀剧情介绍| 欧美日韩日本视频| 欧美一区二区三区在线观看 | 亚洲欧洲精品一区二区| 亚洲一区二区三区免费观看 | 国产欧美精品久久| 免费视频久久| 亚洲综合首页| 亚洲茄子视频| 久久午夜激情| 亚洲欧美在线另类| 亚洲精品久久在线| 国产一区二区成人| 欧美日韩一区二区精品| 久久精品2019中文字幕| aa级大片欧美三级| 亚洲第一中文字幕| 久久aⅴ乱码一区二区三区| 日韩视频免费在线| 狠狠色丁香久久综合频道| 国产精品成人免费精品自在线观看| 久久一区二区三区av| 亚洲一区二区高清视频| 亚洲国产三级网| 美女精品国产| 久久综合色88| 久久久综合精品| 久久黄色影院| 欧美一区二区三区视频在线| 亚洲视频网站在线观看|