关于DirectX高级动画书中使用的9.0bsdk的升级说明 cXParser类(dx9.0c sdk vs2003编译运行通过)

原创 2011年01月19日 18:39:00

#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编译运行通过)

转自:http://blog.csdn.net/dotnet90/article/details/6153361 #ifndef _XPARSER_H_ #define _XPARSER_...
  • ronghuahh
  • ronghuahh
  • 2014年02月26日 19:36
  • 621

关于网狐游戏vs2003移植到vs2013

GamePlaza游戏广场 AvatarControl 形象组件 DownLoad ` 下载组件 GameProperty 游戏道具 PlatformData 平台数据 ProcessContr...
  • singleroot
  • singleroot
  • 2014年12月25日 12:39
  • 3915

最完整网狐棋牌源码编译、搭建、架设教程

本人酷爱棋牌游戏,自己也有多套网狐的棋牌源码,有空的时候也经常自己专研,网狐的代码质量很高,基本上都能编译通过。不过要搭建一个棋牌平台,肯定是很耗费时间跟经历的。        我先用的是660...
  • chunjisha9291
  • chunjisha9291
  • 2017年07月25日 11:24
  • 1383

视频聊天vs2003工程转vs2010工程问题记录

今天需要将一份vs2003上面的工程转成vs2010下面的,在转换过程中出现了如下问题,特作此记录。 1.头文件streams.h与qedit.h找不见 streams.h是directshow工程中...
  • fengshuiyue
  • fengshuiyue
  • 2013年12月02日 13:35
  • 1736

关于网狐棋牌6603源码的整理、编译和搭建

最近换工作,趁着有一段清闲时间,整理了一下网狐棋牌的源码,这份源码下载很久了,一直呆在硬盘。这次正好好好看看。        网狐的代码质量很高,流露出来的代码也比较完整,基本上都能编译通过。但...
  • liujiayu2
  • liujiayu2
  • 2015年06月30日 21:33
  • 1800

第4讲(客户端的编译与游戏的升级)

1>安装 INNO INNO的安装很简单,直接下一步下一步就行了(有些安装包也许有插件,请注意选择) 2>认识 安装包 安装程序:编译好的安装程序所在地方 安装脚本:编译安装程序的脚本 安装...
  • zxq1474477147
  • zxq1474477147
  • 2015年06月10日 17:51
  • 1377

关于网狐棋牌6603源码的整理、编译和搭建

最近换工作,趁着有一段清闲时间,整理了一下网狐棋牌的源码,这份源码下载很久了,一直呆在硬盘。这次正好好好看看。        网狐的代码质量很高,流露出来的代码也比较完整,基本上都能编译通过。但...
  • mergerly
  • mergerly
  • 2014年11月17日 10:39
  • 49294

网狐架构及代码讲解

原文地址:http://blog.csdn.net/jalen_yuchi/article/details/11770861 基本设计概念和处理流程   调用模型 模仿COM组件接口模式,...
  • u010097616
  • u010097616
  • 2017年04月11日 15:43
  • 2815

网狐自动更新模块_教程+模块下载_【2013.11.6第三次更新修正】

第一步:修改源码下载文件路径 打开 “更新模块” --“AutoUpdateClientDlg.cpp”源文件,在104行左右。如图。 蓝色选中的地方是你XML文件的在你网站的具体路径。 修改完了,...
  • piazini
  • piazini
  • 2013年08月23日 15:05
  • 13703

网狐6603服务器管理器使用方法

网狐6603服务器管理器使用方法 简介:深圳网狐科技有限公司棋牌6603服务端启动由三个地方组成:协调服务器、游戏服务、登陆服务器。协调服务器负责游戏房间的注册,游戏列表的读取等。游...
  • changsons
  • changsons
  • 2016年11月01日 22:50
  • 6028
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于DirectX高级动画书中使用的9.0bsdk的升级说明 cXParser类(dx9.0c sdk vs2003编译运行通过)
举报原因:
原因补充:

(最多只允许输入30个字)