游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4521|回复: 8

DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectXFile

[复制链接]

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2008-8-17 20:18:00 | 显示全部楼层 |阅读模式
void ParseXFileData(IDirectXFileData *pDataObj, sFrame *ParentFrame)
{
  IDirectXFileObject *pSubObj  = NULL;
  IDirectXFileData   *pSubData = NULL;
  IDirectXFileDataReference *pDataRef = NULL;
  ID3DXBuffer        *Adjacency = NULL;
  const GUID *Type = NULL;
  char       *Name = NULL;
  DWORD       Size;

  sFrame     *Frame = NULL;
  sFrame     *SubFrame = NULL;

  sMesh         *Mesh = NULL;
  ID3DXBuffer   *MaterialBuffer = NULL;
  D3DXMATERIAL  *Materials = NULL;

  DWORD i;

  // Get the template type
  if(FAILED(pDataObj->GetType(&Type)))
    return;

  // Get the template name (if any)
  if(FAILED(pDataObj->GetName(NULL, &Size)))
    return;
  if(Size) {
    if((Name = new char[Size]) != NULL)
      pDataObj->GetName(Name, &Size);
  }

  // Give template a default name if none found
  if(Name == NULL) {
    if((Name = new char[9]) == NULL)
      return;
    strcpy(Name, "Template");
  }

  // Set sub frame
  SubFrame = ParentFrame;

  // Process the templates

  // Frame
  if(*Type == TID_D3DRMFrame) {
    // Create a new frame structure
    Frame = new sFrame();

    // Store the name
    Frame->m_Name = Name;
    Name = NULL;

    // Add to parent frame
    Frame->m_Sibling = ParentFrame->m_Child;
    ParentFrame->m_Child = Frame;

    // Set sub frame parent
    SubFrame = Frame;
  }

  // Load a mesh
  if(*Type == TID_D3DRMMesh) {

    // Create a new mesh structure
    Mesh = new sMesh();

    // Store the name
    Mesh->m_Name = Name;
    Name = NULL;

    // Load mesh data (as a skinned mesh)
    if(FAILED(D3DXLoadSkinMeshFromXof(pDataObj, 0,
                g_pD3DDevice,
                &Adjacency, &MaterialBuffer, NULL, &Mesh->m_NumMaterials,
                &Mesh->m_SkinInfo,
                &Mesh->m_Mesh))) {
      delete Mesh;
      return;
    }
    ReleaseCOM(Adjacency);

    // Clone skin mesh is bones exist
    if(Mesh->m_SkinInfo != NULL && Mesh->m_SkinInfo->GetNumBones() != 0) {
      if(FAILED(Mesh->m_Mesh->CloneMeshFVF(0, Mesh->m_Mesh->GetFVF(), g_pD3DDevice, &Mesh->m_SkinMesh))) {
        Mesh->m_SkinInfo->Release();
        Mesh->m_SkinInfo = NULL;
      }
    }

    // Load materials or create a default one if none
    if(!Mesh->m_NumMaterials) {

      // Create a default one
      Mesh->m_Materials = new D3DMATERIAL9[1];
      Mesh->m_Textures  = new LPDIRECT3DTEXTURE9[1];

      ZeroMemory(Mesh->m_Materials, sizeof(D3DMATERIAL9));
      Mesh->m_Materials[0].Diffuse.r = 1.0f;
      Mesh->m_Materials[0].Diffuse.g = 1.0f;
      Mesh->m_Materials[0].Diffuse.b = 1.0f;
      Mesh->m_Materials[0].Diffuse.a = 1.0f;
      Mesh->m_Materials[0].Ambient   = Mesh->m_Materials[0].Diffuse;
      Mesh->m_Materials[0].Specular  = Mesh->m_Materials[0].Diffuse;
      Mesh->m_Textures[0] = NULL;

      Mesh->m_NumMaterials = 1;
    } else {
      // Load the materials
      Materials = (D3DXMATERIAL*)MaterialBuffer->GetBufferPointer();
      Mesh->m_Materials = new D3DMATERIAL9[Mesh->m_NumMaterials];
      Mesh->m_Textures  = new LPDIRECT3DTEXTURE9[Mesh->m_NumMaterials];

      for(i=0;i<Mesh->m_NumMaterials;i++) {
        Mesh->m_Materials = Materials.MatD3D;
        Mesh->m_Materials.Ambient = Mesh->m_Materials.Diffuse;
     
        // Build a texture path and load it
        if(FAILED(D3DXCreateTextureFromFile(g_pD3DDevice,
                                            Materials.pTextureFilename,
                                            &Mesh->m_Textures))) {
          Mesh->m_Textures = NULL;
        }
      }
    }
    ReleaseCOM(MaterialBuffer);

    // Link in mesh
    Mesh->m_Next = ParentFrame->m_Mesh;
    ParentFrame->m_Mesh = Mesh;
  }

  // Skip animation sets and animations
  if(*Type == TID_D3DRMAnimationSet || *Type == TID_D3DRMAnimation || *Type == TID_D3DRMAnimationKey) {
    delete [] Name;
    return;
  }

  // Release name buffer
  delete [] Name;

  // Scan for embedded templates
  while(SUCCEEDED(pDataObj->GetNextObject(&pSubObj))) {

    // Process embedded references
    if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileDataReference, (void**)&pDataRef))) {
      if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
        ParseXFileData(pSubData, SubFrame);
        ReleaseCOM(pSubData);
      }
      ReleaseCOM(pDataRef);
    }

    // Process non-referenced embedded templates
    if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
      ParseXFileData(pSubData, SubFrame);
      ReleaseCOM(pSubData);
    }
    ReleaseCOM(pSubObj);
  }

  return;
}

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-8-17 20:35:00 | 显示全部楼层

Re: DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectX

kuailekabausa: DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectXFile为新的ID3DXFile

void ParseXFileData(IDirectXFileData *pDataObj, sFrame *ParentFrame)
{
  IDirectXFileObject *pSubO...

[em7]

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2008-8-18 08:59:00 | 显示全部楼层

Re: DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectX

楼上的,看着晕啊?

0

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2008-8-19 12:49:00 | 显示全部楼层

Re:DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectXF

类型转换

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2008-8-19 19:36:00 | 显示全部楼层

Re:DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectXF

用强制类型转换会出错得!

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2008-8-19 20:55:00 | 显示全部楼层

Re:DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectXF

问题已经解决!自己把代码贴上来!呵呵
sFrame *ParseXFile(char *Filename)
{
  ID3DXFile           *pDXFile = NULL;
  ID3DXFileEnumObject *pDXEnum = NULL;
  ID3DXFileData       *pDXData = NULL;
  sFrame                 *Frame;

  // Create the file object
  if(FAILED(D3DXFileCreate(&pDXFile)))
    return FALSE;

  // Register the 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;
  }

  // Allocate a frame that becomes root
  Frame = new sFrame();
  SIZE_T num_child;
  pDXEnum->GetChildren(&num_child);
  for(SIZE_T i=0;i<num_child;i++)
  {
          if(FAILED(pDXEnum->GetChild(i,&pDXData)))
                  return FALSE;
          ParseXFileData(pDXData,Frame);
          ReleaseCOM(pDXData);
  }


  //// Loop through all objects looking for the frames and meshes
  //while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
  //  ParseXFileData(pDXData, Frame);
  //  ReleaseCOM(pDXData);
  //}

  // Release used COM objects
  ReleaseCOM(pDXEnum);
  ReleaseCOM(pDXFile);

  // Return root frame
  return Frame;
}

void ParseXFileData(ID3DXFileData *pDataObj, sFrame *ParentFrame)
{
  //IDirectXFileObject *pSubObj  = NULL;
  ID3DXFileData   *pSubObj = NULL;
  //IDirectXFileDataReference *pDataRef = NULL;
  ID3DXBuffer        *Adjacency = NULL;
  //const GUID *Type = NULL;
  GUID Type;
  char       *Name = NULL;
  DWORD       Size;

  sFrame     *Frame = NULL;
  sFrame     *SubFrame = NULL;

  sMesh         *Mesh = NULL;
  ID3DXBuffer   *MaterialBuffer = NULL;
  D3DXMATERIAL  *Materials = NULL;

  DWORD i;

  // Get the template type
  if(FAILED(pDataObj->GetType(&Type)))
    return;

  // Get the template name (if any)
  if(FAILED(pDataObj->GetName(NULL, &Size)))
    return;
  if(Size) {
    if((Name = new char[Size]) != NULL)
      pDataObj->GetName(Name, &Size);
  }

  // Give template a default name if none found
  if(Name == NULL) {
    if((Name = new char[9]) == NULL)
      return;
    strcpy_s(Name,sizeof("Template"), "Template");
  }

  // Set sub frame
  SubFrame = ParentFrame;

  // Process the templates

  // Frame
  if(Type == TID_D3DRMFrame) {
    // Create a new frame structure
    Frame = new sFrame();

    // Store the name
    Frame->m_Name = Name;
    Name = NULL;

    // Add to parent frame
    Frame->m_Sibling = ParentFrame->m_Child;
    ParentFrame->m_Child = Frame;

    // Set sub frame parent
    SubFrame = Frame;
  }

  // Load a mesh
  if(Type == TID_D3DRMMesh) {

    // Create a new mesh structure
    Mesh = new sMesh();

    // Store the name
    Mesh->m_Name = Name;
    Name = NULL;

    // Load mesh data (as a skinned mesh)
    if(FAILED(D3DXLoadSkinMeshFromXof(pDataObj, 0,
                g_pD3DDevice,
                &Adjacency, &MaterialBuffer, NULL, &Mesh->m_NumMaterials,
                &Mesh->m_SkinInfo,
                &Mesh->m_Mesh))) {
      delete Mesh;
      return;
    }
    ReleaseCOM(Adjacency);

    // Clone skin mesh is bones exist
    if(Mesh->m_SkinInfo != NULL && Mesh->m_SkinInfo->GetNumBones() != 0) {
      if(FAILED(Mesh->m_Mesh->CloneMeshFVF(0, Mesh->m_Mesh->GetFVF(), g_pD3DDevice, &Mesh->m_SkinMesh))) {
        Mesh->m_SkinInfo->Release();
        Mesh->m_SkinInfo = NULL;
      }
    }

    // Load materials or create a default one if none
    if(!Mesh->m_NumMaterials) {

      // Create a default one
      Mesh->m_Materials = new D3DMATERIAL9[1];
      Mesh->m_Textures  = new LPDIRECT3DTEXTURE9[1];

      ZeroMemory(Mesh->m_Materials, sizeof(D3DMATERIAL9));
      Mesh->m_Materials[0].Diffuse.r = 1.0f;
      Mesh->m_Materials[0].Diffuse.g = 1.0f;
      Mesh->m_Materials[0].Diffuse.b = 1.0f;
      Mesh->m_Materials[0].Diffuse.a = 1.0f;
      Mesh->m_Materials[0].Ambient   = Mesh->m_Materials[0].Diffuse;
      Mesh->m_Materials[0].Specular  = Mesh->m_Materials[0].Diffuse;
      Mesh->m_Textures[0] = NULL;

      Mesh->m_NumMaterials = 1;
    } else {
      // Load the materials
      Materials = (D3DXMATERIAL*)MaterialBuffer->GetBufferPointer();
      Mesh->m_Materials = new D3DMATERIAL9[Mesh->m_NumMaterials];
      Mesh->m_Textures  = new LPDIRECT3DTEXTURE9[Mesh->m_NumMaterials];

      for(i=0;i<Mesh->m_NumMaterials;i++) {
        Mesh->m_Materials = Materials.MatD3D;
        Mesh->m_Materials.Ambient = Mesh->m_Materials.Diffuse;
     
        // Build a texture path and load it
        if(FAILED(D3DXCreateTextureFromFile(g_pD3DDevice,
                                            Materials.pTextureFilename,
                                            &Mesh->m_Textures))) {
          Mesh->m_Textures = NULL;
        }
      }
    }
    ReleaseCOM(MaterialBuffer);

    // Link in mesh
    Mesh->m_Next = ParentFrame->m_Mesh;
    ParentFrame->m_Mesh = Mesh;
  }

  // Skip animation sets and animations
  if(Type == TID_D3DRMAnimationSet || Type == TID_D3DRMAnimation || Type == TID_D3DRMAnimationKey) {
    delete [] Name;
    return;
  }

  // Release name buffer
  delete [] Name;

  SIZE_T num_child;
  pDataObj->GetChildren(&num_child);
  for(SIZE_T i=0;i<num_child;i++)
  {
          pDataObj->GetChild(i,&pSubObj);
          ParseXFileData(pSubObj,SubFrame);
          ReleaseCOM(pSubObj);
  }

  //// Scan for embedded templates
  //while(SUCCEEDED(pDataObj->GetNextObject(&pSubObj))) {

  //  // Process embedded references
  //  if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileDataReference, (void**)&pDataRef))) {
  //    if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
  //      ParseXFileData(pSubData, SubFrame);
  //      ReleaseCOM(pSubData);
  //    }
  //    ReleaseCOM(pDataRef);
  //  }

  //  // Process non-referenced embedded templates
  //  if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
  //    ParseXFileData(pSubData, SubFrame);
  //    ReleaseCOM(pSubData);
  //  }
  //  ReleaseCOM(pSubObj);
  //}

  return;
}

10

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2008-8-31 13:43:00 | 显示全部楼层

Re:DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectXF

现在才发现找错地方啊

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2008-9-2 11:12:00 | 显示全部楼层

Re:DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectXF

楼上的加载过动画吗
我加动画之后发现效率很低
不要去加载书里那个人,那个没几个点速度依旧很快,去加载下TINY.X看看
我用了TINY.X那个走路的动画后CPU就100%了


35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-9-3 16:55:00 | 显示全部楼层

Re:DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectXF

唉,出来混,总是要还的.....
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 11:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表