关于DirectX高级动画书中使用的9.0bsdk的升级说明 cXParser类(dx9.0c sdk vs2003编译运行通过)
来源:互联网 发布:求好玩的网络手机游戏 编辑:程序博客网 时间:2024/06/05 18:26
转自:http://blog.csdn.net/dotnet90/article/details/6153361
#ifndef _XPARSER_H_
#define _XPARSER_H_
#include <windows.h>
#include "dxfile.h"
#include "XFile.h"
#include "D3dx9xof.h"
// A macro to quickly release and NULL a COM interface
#define XPReleaseCOM(x) { if(x) { x->Release(); x= NULL; } }
class cXParser
{
protected:
// Functions called when parsing begins and end
virtual BOOL BeginParse(void **Data) { return TRUE; }
virtual BOOL EndParse(void **Data) { return TRUE; }
// Function called for every template found
virtual BOOL ParseObject( /
ID3DXFileData *pDataObj, /
ID3DXFileData *pParentDataObj, /
DWORD Depth, /
void **Data, BOOL Reference)
{
return ParseChildObjects(pDataObj, Depth, /
Data, Reference);
}
// Function called to enumerate child templates
BOOL ParseChildObjects(ID3DXFileData *pDataObj, /
DWORD Depth, void **Data, /
BOOL ForceReference = FALSE);
public:
// Function to start parsing an .X file
BOOL Parse(char *Filename, void **Data = NULL);
// Functions to help retrieve template information
const GUID *GetObjectGUID(ID3DXFileData *pDataObj);
char *GetObjectName(ID3DXFileData *pDataObj);
void *GetObjectData(ID3DXFileData *pDataObj, /
DWORD *Size);
};
#endif
#include "XParser.h"
BOOL cXParser::Parse(char *Filename, void **Data)
{
ID3DXFile *pDXFile = NULL;
ID3DXFileEnumObject *pDXEnum = NULL;
ID3DXFileData *pDXData = NULL;
// Error checking
if(Filename == NULL)
return FALSE;
// Create the file object
if(FAILED(D3DXFileCreate(&pDXFile)))
return FALSE;
// Register the common templates
if(FAILED(pDXFile->RegisterTemplates( /
(LPVOID)D3DRM_XTEMPLATES, /
D3DRM_XTEMPLATE_BYTES))) {
pDXFile->Release();
return FALSE;
}
// Create an enumeration object
if(FAILED(pDXFile->CreateEnumObject((LPVOID)Filename, /
DXFILELOAD_FROMFILE, /
&pDXEnum))) {
pDXFile->Release();
return FALSE;
}
// Call the begin parse function, continuing if allowed
if(BeginParse(Data) == TRUE) {
//////// Loop through all top-level objects, breaking on errors
//////BOOL ParseResult;
//////while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
////// ParseResult = ParseObject(pDXData, NULL, 0, Data, FALSE);
////// XPReleaseCOM(pDXData);
////// if(ParseResult == FALSE)
////// break;
//////}
SIZE_T num_child;
pDXEnum->GetChildren(&num_child);
BOOL ParseResult;
for(SIZE_T i = 0; i < num_child; i++)
{
if(FAILED(pDXEnum->GetChild(i, &pDXData)))
return NULL;
ParseResult = ParseObject(pDXData, NULL,0,Data,FALSE);
XPReleaseCOM(pDXData);
if(ParseResult == FALSE)
break;
}
}
// Call end parse function
EndParse(Data);
// Release used COM objects
XPReleaseCOM(pDXEnum);
XPReleaseCOM(pDXFile);
return TRUE;
}
BOOL cXParser::ParseChildObjects( /
ID3DXFileData *pDataObj, /
DWORD Depth, void **Data, /
BOOL ForceReference)
{
ID3DXFileData *pSubObj = NULL;
SIZE_T num_child;
BOOL ParseResult = TRUE;
pDataObj->GetChildren(&num_child);
for(SIZE_T j = 0; j < num_child; j++)
{
pDataObj->GetChild(j, &pSubObj);
if(pSubObj->IsReference()){
ForceReference = true;
}
ParseResult = ParseObject(pSubObj,pDataObj,Depth+1, Data,ForceReference);
XPReleaseCOM(pSubObj);
// Return on parsing failure
if(ParseResult == FALSE)
return FALSE;
}
//////ID3DXFileData *pSubObj = NULL;
//////ID3DXFileData *pSubData = NULL;
//////IDirectXFileDataReference *pDataRef = NULL;
//////BOOL ParseResult = TRUE;
//////// Scan for embedded templates
//////while(SUCCEEDED(pDataObj->GetNextObject(&pSubObj))) {
////// // Process embedded references
////// if(SUCCEEDED(pSubObj->QueryInterface( /
////// IID_IDirectXFileDataReference, /
////// (void**)&pDataRef))) {
////// // Resolve the data object
////// if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
////// // Parse the object, remembering the return code
////// ParseResult = ParseObject(pSubData, pDataObj, /
////// Depth+1, Data, TRUE);
////// XPReleaseCOM(pSubData);
////// }
////// XPReleaseCOM(pDataRef);
////// // Return on parsing failure
////// if(ParseResult == FALSE)
////// return FALSE;
////// } else
////// // Process non-referenced embedded templates
////// if(SUCCEEDED(pSubObj->QueryInterface( /
////// IID_IDirectXFileData, /
////// (void**)&pSubData))) {
////// // Parse the object, remembering the return code
////// ParseResult = ParseObject(pSubData, pDataObj, /
////// Depth+1, Data, /
////// ForceReference);
////// XPReleaseCOM(pSubData);
////// }
////// // Release the data object
////// XPReleaseCOM(pSubObj);
////// // Return on parsing failure
////// if(ParseResult == FALSE)
////// return FALSE;
//////}
return TRUE;
}
const GUID *cXParser::GetObjectGUID( /
ID3DXFileData *pDataObj)
{
GUID* Type = new GUID;
// Error checking
if(pDataObj == NULL)
return NULL;
// Get the template type
if(FAILED(pDataObj->GetType(Type)))
return NULL;
return Type;
}
char *cXParser::GetObjectName(ID3DXFileData *pDataObj)
{
char *Name = NULL;
DWORD Size = 0;
// Error checking
if(pDataObj == NULL)
return NULL;
// Get the template name (if any)
if(FAILED(pDataObj->GetName(NULL, &Size)))
return NULL;
// Allocate a name buffer and retrieve name
if(Size) {
if((Name = new char[Size]) != NULL)
pDataObj->GetName(Name, &Size);
}
return Name;
}
void *cXParser::GetObjectData( /
ID3DXFileData *pDataObj, /
DWORD *Size)
{
void *TemplateData;
SIZE_T TemplateSize=0;;
// Error checking
if(pDataObj == NULL)
return NULL;
// Get a data pointer to template
pDataObj->Lock(&TemplateSize,(LPCVOID*)(VOID **)&TemplateData);
if (NULL==TemplateData)
{
return NULL;
}
// Save size if needed
if(Size != NULL)
*Size = TemplateSize;
pDataObj->Unlock();
return TemplateData;
}
- 关于DirectX高级动画书中使用的9.0bsdk的升级说明 cXParser类(dx9.0c sdk vs2003编译运行通过)
- 关于DirectX高级动画书中使用的9.0bsdk的升级说明 cXParser类(dx9.0c sdk vs2003编译运行通过)
- 关于DirectX高级动画书中使用的9.0bsdk的升级说明
- 关于DirectX高级动画书中使用的9.0bsdk的升级说明
- 关于DirectX高级动画书中的SDK升级问题
- 【零基础学习DirectX】之一:编译Freakout.cpp——关于 VC++ 配置SDK的说明
- Direct高级动画制作 第九章 关键帧渐变动画的运用 vs2008 directx 9.0c
- 关于vc6.0下使用DirectX 9的中输入输出设备编译不同过的问题
- 关于directx sdk 使用的几个小问题
- c#sdk的pfop使用代码说明
- DX9.0 sdk开发中遇到的 winNT.h中错误error C2146: 语法错误: 缺少“;”(在标识符“PVOID64”的前面)
- 用最新的Windows SDK + DirectX SDK 编译MPC-HC
- DX9.0 SDK下载
- 关于Vs 2005 中出现编译通过,但运行时出现“未使用调试信息生成二进制文件”的问题
- 关于SDK升级到5.0,使用ADT-Bundle中产生的appcompat_v7错误的解决办法.
- 关于Android编译中使用的Target Sdk Version,Min Sdk Version和Compile Sdk Version的含义
- DirectX SDK April 2005 在旧版本的VC6中可能造成编译问题
- 关于<<STL源码剖析>>中4.4.5节测试程序不能通过编译的说明
- win7配置MySQL的ODBC数据源出错解决办法
- linux常用命令
- poj3983 算24点
- HTTP就绪状态和HTTP状态码
- 搜索(A - Lake Counting)
- 关于DirectX高级动画书中使用的9.0bsdk的升级说明 cXParser类(dx9.0c sdk vs2003编译运行通过)
- Linux date命令详解
- mexFunction-解读数组结构
- Uboot的第二阶段
- FAFU-1043 最大和谐子方阵 DP
- 在校(应届)大学生JAVAEE职业规划图
- 关于jquery操作iframe中内容, 无法正常显示的问题
- make menuconfig 错误
- aop的实现原理