d3dfile.cpp
上传用户:fengshi120
上传日期:2014-07-17
资源大小:6155k
文件大小:26k
源码类别:

3D图形编程

开发平台:

C/C++

  1. //-----------------------------------------------------------------------------
  2. // File: D3DFile.cpp
  3. //
  4. // Desc: Support code for loading DirectX .X files.
  5. //-----------------------------------------------------------------------------
  6. #define STRICT
  7. #include "stdafx.h"
  8. #include <tchar.h>
  9. #include <stdio.h>
  10. #include <d3d9.h>
  11. #include <d3dx9.h>
  12. #include <dxfile.h>
  13. #include <rmxfguid.h>
  14. #include <rmxftmpl.h>
  15. #include "D3DFile.h"
  16. #include "DXUtil.h"
  17. //-----------------------------------------------------------------------------
  18. // Name:
  19. // Desc:
  20. //-----------------------------------------------------------------------------
  21. CD3DMesh::CD3DMesh( TCHAR* strName )
  22. {
  23.     _tcsncpy( m_strName, strName, sizeof(m_strName) / sizeof(TCHAR) );
  24.     m_strName[sizeof(m_strName) / sizeof(TCHAR) - 1] = _T('');
  25.     m_pSysMemMesh        = NULL;
  26.     m_pLocalMesh         = NULL;
  27.     m_dwNumMaterials     = 0L;
  28.     m_pMaterials         = NULL;
  29.     m_pTextures          = NULL;
  30.     m_bUseMaterials      = FALSE;
  31. }
  32. //-----------------------------------------------------------------------------
  33. // Name:
  34. // Desc:
  35. //-----------------------------------------------------------------------------
  36. CD3DMesh::~CD3DMesh()
  37. {
  38.     Destroy();
  39. }
  40. //-----------------------------------------------------------------------------
  41. // Name:
  42. // Desc:
  43. //-----------------------------------------------------------------------------
  44. HRESULT CD3DMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, TCHAR* strFilename,float fAlpha)
  45. {
  46.     TCHAR        strPath[MAX_PATH];
  47.     LPD3DXBUFFER pAdjacencyBuffer = NULL;
  48.     LPD3DXBUFFER pMtrlBuffer = NULL;
  49.     HRESULT      hr;
  50.     // Find the path for the file, and convert it to ANSI (for the D3DX API)
  51.     DXUtil_FindMediaFileCb( strPath, sizeof(strPath), strFilename );
  52.     // Load the mesh
  53.     if( FAILED( hr = D3DXLoadMeshFromX( strPath, D3DXMESH_SYSTEMMEM, pd3dDevice, 
  54.                                         &pAdjacencyBuffer, &pMtrlBuffer, NULL,
  55.                                         &m_dwNumMaterials, &m_pSysMemMesh ) ) )
  56.     {
  57.         return hr;
  58.     }
  59. if(m_pSysMemMesh == NULL)
  60. {
  61. return E_OUTOFMEMORY;
  62. }
  63.     // Optimize the mesh for performance
  64.     if( FAILED( hr = m_pSysMemMesh->OptimizeInplace(
  65.                         D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE,
  66.                         (DWORD*)pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) )
  67.     {
  68.         SAFE_RELEASE( pAdjacencyBuffer );
  69.         SAFE_RELEASE( pMtrlBuffer );
  70.         return hr;
  71.     }
  72.     // Get material info for the mesh
  73.     // Get the array of materials out of the buffer
  74.     if( pMtrlBuffer && m_dwNumMaterials > 0 )
  75.     {
  76.         // Allocate memory for the materials and textures
  77.         D3DXMATERIAL* d3dxMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer();
  78.         m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials];
  79.         if( m_pMaterials == NULL )
  80.         {
  81.             hr = E_OUTOFMEMORY;
  82.             goto LEnd;
  83.         }
  84.         m_pTextures  = new LPDIRECT3DTEXTURE9[m_dwNumMaterials];
  85.         if( m_pTextures == NULL )
  86.         {
  87.             hr = E_OUTOFMEMORY;
  88.             goto LEnd;
  89.         }
  90.         // Copy each material and create its texture
  91.         for( DWORD i=0; i<m_dwNumMaterials; i++ )
  92.         {
  93.             // Copy the material
  94. d3dxMtrls[i].MatD3D.Diffuse.a = fAlpha;
  95. d3dxMtrls[i].MatD3D.Specular.a = fAlpha;
  96. d3dxMtrls[i].MatD3D.Emissive.a = fAlpha;
  97.             m_pMaterials[i]         = d3dxMtrls[i].MatD3D;
  98.             m_pTextures[i]          = NULL;
  99.             // Create a texture
  100.             if( d3dxMtrls[i].pTextureFilename )
  101.             {
  102.                 TCHAR strTexture[MAX_PATH];
  103.                 TCHAR strTextureTemp[MAX_PATH];
  104.                 DXUtil_ConvertAnsiStringToGenericCb( strTextureTemp, d3dxMtrls[i].pTextureFilename, sizeof(strTextureTemp) );
  105.                 DXUtil_FindMediaFileCb( strTexture, sizeof(strTexture), strTextureTemp );
  106.                 if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, strTexture, 
  107.                                                        &m_pTextures[i] ) ) )
  108.                     m_pTextures[i] = NULL;
  109.             }
  110.         }
  111.     }
  112.     hr = S_OK;
  113. LEnd:
  114.     SAFE_RELEASE( pAdjacencyBuffer );
  115.     SAFE_RELEASE( pMtrlBuffer );
  116.     return hr;
  117. }
  118. /*
  119. //-----------------------------------------------------------------------------
  120. // Name:
  121. // Desc:
  122. //-----------------------------------------------------------------------------
  123. //HRESULT CD3DMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice,
  124. //                          LPDIRECTXFILEDATA pFileData )
  125. HRESULT CD3DMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice,
  126.                           LPD3DXFILEDATA pFileData )
  127. {
  128.     LPD3DXBUFFER pMtrlBuffer = NULL;
  129.     LPD3DXBUFFER pAdjacencyBuffer = NULL;
  130.     HRESULT      hr;
  131.     // Load the mesh from the DXFILEDATA object
  132.     if( FAILED( hr = D3DXLoadMeshFromXof( pFileData, D3DXMESH_SYSTEMMEM, pd3dDevice,
  133.                                           &pAdjacencyBuffer, &pMtrlBuffer, NULL,
  134.                                           &m_dwNumMaterials, &m_pSysMemMesh ) ) )
  135.     {
  136.         return hr;
  137.     }
  138.     // Optimize the mesh for performance
  139.     if( FAILED( hr = m_pSysMemMesh->OptimizeInplace(
  140.                         D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE,
  141.                         (DWORD*)pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) )
  142.     {
  143.         SAFE_RELEASE( pAdjacencyBuffer );
  144.         SAFE_RELEASE( pMtrlBuffer );
  145.         return hr;
  146.     }
  147.     // Get material info for the mesh
  148.     // Get the array of materials out of the buffer
  149.     if( pMtrlBuffer && m_dwNumMaterials > 0 )
  150.     {
  151.         // Allocate memory for the materials and textures
  152.         D3DXMATERIAL* d3dxMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer();
  153.         m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials];
  154.         if( m_pMaterials == NULL )
  155.         {
  156.             hr = E_OUTOFMEMORY;
  157.             goto LEnd;
  158.         }
  159.         m_pTextures  = new LPDIRECT3DTEXTURE9[m_dwNumMaterials];
  160.         if( m_pTextures == NULL )
  161.         {
  162.             hr = E_OUTOFMEMORY;
  163.             goto LEnd;
  164.         }
  165.         // Copy each material and create its texture
  166.         for( DWORD i=0; i<m_dwNumMaterials; i++ )
  167.         {
  168.             // Copy the material
  169.             m_pMaterials[i]         = d3dxMtrls[i].MatD3D;
  170.             m_pTextures[i]          = NULL;
  171.             // Create a texture
  172.             if( d3dxMtrls[i].pTextureFilename )
  173.             {
  174.                 TCHAR strTexture[MAX_PATH];
  175.                 TCHAR strTextureTemp[MAX_PATH];
  176.                 DXUtil_ConvertAnsiStringToGenericCb( strTextureTemp, d3dxMtrls[i].pTextureFilename, sizeof(strTextureTemp) );
  177.                 DXUtil_FindMediaFileCb( strTexture, sizeof(strTexture), strTextureTemp );
  178.                 if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, strTexture, 
  179.                                                        &m_pTextures[i] ) ) )
  180.                     m_pTextures[i] = NULL;
  181.             }
  182.         }
  183.     }
  184.     hr = S_OK;
  185. LEnd:
  186.     SAFE_RELEASE( pAdjacencyBuffer );
  187.     SAFE_RELEASE( pMtrlBuffer );
  188.     return hr;
  189. }
  190. */
  191. //-----------------------------------------------------------------------------
  192. // Name:
  193. // Desc:
  194. //-----------------------------------------------------------------------------
  195. HRESULT CD3DMesh::SetFVF( LPDIRECT3DDEVICE9 pd3dDevice, DWORD dwFVF )
  196. {
  197.     LPD3DXMESH pTempSysMemMesh = NULL;
  198.     LPD3DXMESH pTempLocalMesh  = NULL;
  199.     if( m_pSysMemMesh )
  200.     {
  201.         if( FAILED( m_pSysMemMesh->CloneMeshFVF( D3DXMESH_32BIT | D3DXMESH_SYSTEMMEM, dwFVF,
  202.                                                  pd3dDevice, &pTempSysMemMesh ) ) )
  203.             return E_FAIL;
  204.     }
  205.     if( m_pLocalMesh )
  206.     {
  207.         if( FAILED( m_pLocalMesh->CloneMeshFVF( D3DXMESH_32BIT, dwFVF, pd3dDevice,
  208.                                                 &pTempLocalMesh ) ) )
  209.         {
  210.             SAFE_RELEASE( pTempSysMemMesh );
  211.             return E_FAIL;
  212.         }
  213.     }
  214.     SAFE_RELEASE( m_pSysMemMesh );
  215.     SAFE_RELEASE( m_pLocalMesh );
  216.     if( pTempSysMemMesh ) m_pSysMemMesh = pTempSysMemMesh;
  217.     if( pTempLocalMesh )  m_pLocalMesh  = pTempLocalMesh;
  218.     // Compute normals in case the meshes have them
  219.     if( m_pSysMemMesh )
  220.         D3DXComputeNormals( m_pSysMemMesh, NULL );
  221.     if( m_pLocalMesh )
  222.         D3DXComputeNormals( m_pLocalMesh, NULL );
  223.     return S_OK;
  224. }
  225. //-----------------------------------------------------------------------------
  226. // Name:
  227. // Desc:
  228. //-----------------------------------------------------------------------------
  229. HRESULT CD3DMesh::RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice )
  230. {
  231.     if( NULL == m_pSysMemMesh )
  232.         return E_FAIL;
  233.     // Make a local memory version of the mesh. Note: because we are passing in
  234.     // no flags, the default behavior is to clone into local memory.
  235.     if( FAILED( m_pSysMemMesh->CloneMeshFVF( D3DXMESH_32BIT, m_pSysMemMesh->GetFVF(),
  236.                                              pd3dDevice, &m_pLocalMesh ) ) )
  237.         return E_FAIL;
  238.     return S_OK;
  239. }
  240. //-----------------------------------------------------------------------------
  241. // Name:
  242. // Desc:
  243. //-----------------------------------------------------------------------------
  244. HRESULT CD3DMesh::InvalidateDeviceObjects()
  245. {
  246.     SAFE_RELEASE( m_pLocalMesh );
  247.     return S_OK;
  248. }
  249. //-----------------------------------------------------------------------------
  250. // Name:
  251. // Desc:
  252. //-----------------------------------------------------------------------------
  253. HRESULT CD3DMesh::Destroy()
  254. {
  255.     InvalidateDeviceObjects();
  256.     if(m_pTextures != NULL)
  257. {
  258. for( UINT i=0; i<m_dwNumMaterials; i++ )
  259.        SAFE_RELEASE( m_pTextures[i] );
  260. }
  261.     SAFE_DELETE_ARRAY( m_pTextures );
  262.     SAFE_DELETE_ARRAY( m_pMaterials );
  263.     SAFE_RELEASE( m_pSysMemMesh );
  264.     m_dwNumMaterials = 0L;
  265.     return S_OK;
  266. }
  267. //-----------------------------------------------------------------------------
  268. // Name:
  269. // Desc:
  270. //-----------------------------------------------------------------------------
  271. HRESULT CD3DMesh::Render( LPDIRECT3DDEVICE9 pd3dDevice, bool bDrawOpaqueSubsets,
  272.                           bool bDrawAlphaSubsets,int iSelectedSubset )
  273. {
  274.     if( NULL == m_pLocalMesh )
  275.         return E_FAIL;
  276. if(iSelectedSubset != -1)
  277. {
  278.     // Frist, draw the subsets without alpha
  279. if( bDrawOpaqueSubsets )
  280. {
  281.             if( m_bUseMaterials )
  282.             {
  283.                 if( m_pMaterials[iSelectedSubset].Diffuse.a == 1.0f )
  284. {
  285. pd3dDevice->SetMaterial( &m_pMaterials[iSelectedSubset] );
  286. pd3dDevice->SetTexture( 0, m_pTextures[iSelectedSubset] );
  287. m_pLocalMesh->DrawSubset( iSelectedSubset );
  288. }
  289. }
  290. else 
  291. m_pLocalMesh->DrawSubset( iSelectedSubset );
  292.         }
  293. // Then, draw the subsets with alpha
  294. if( bDrawAlphaSubsets && m_bUseMaterials )
  295. {
  296. if( m_pMaterials[iSelectedSubset].Diffuse.a < 1.0f )
  297. {
  298. // Set the material and texture
  299. pd3dDevice->SetMaterial( &m_pMaterials[iSelectedSubset] );
  300. pd3dDevice->SetTexture( 0, m_pTextures[iSelectedSubset] );
  301. m_pLocalMesh->DrawSubset( iSelectedSubset );
  302. }
  303. }
  304. return S_OK;
  305. }
  306.     // Frist, draw the subsets without alpha
  307.     if( bDrawOpaqueSubsets )
  308.     {
  309.         for( DWORD i=0; i<m_dwNumMaterials; i++ )
  310.         {
  311.             if( m_bUseMaterials )
  312.             {
  313.                 if( m_pMaterials[i].Diffuse.a < 1.0f )
  314.                     continue;
  315.                 pd3dDevice->SetMaterial( &m_pMaterials[i] );
  316.                 pd3dDevice->SetTexture( 0, m_pTextures[i] );
  317.             }
  318.             m_pLocalMesh->DrawSubset( i );
  319.         }
  320.     }
  321.     // Then, draw the subsets with alpha
  322.     if( bDrawAlphaSubsets && m_bUseMaterials )
  323.     {
  324.         for( DWORD i=0; i<m_dwNumMaterials; i++ )
  325.         {
  326.             if( m_pMaterials[i].Diffuse.a == 1.0f )
  327.                 continue;
  328.             // Set the material and texture
  329.             pd3dDevice->SetMaterial( &m_pMaterials[i] );
  330.             pd3dDevice->SetTexture( 0, m_pTextures[i] );
  331.             m_pLocalMesh->DrawSubset( i );
  332.         }
  333.     }
  334.     return S_OK;
  335. }
  336. /*
  337. //-----------------------------------------------------------------------------
  338. // Name:
  339. // Desc:
  340. //-----------------------------------------------------------------------------
  341. CD3DFrame::CD3DFrame( TCHAR* strName )
  342. {
  343.     _tcsncpy( m_strName, strName, sizeof(m_strName) / sizeof(TCHAR) );
  344.     m_strName[sizeof(m_strName) / sizeof(TCHAR) - 1] = _T('');
  345.     D3DXMatrixIdentity( &m_mat );
  346.     m_pMesh  = NULL;
  347.     m_pChild = NULL;
  348.     m_pNext  = NULL;
  349. }
  350. //-----------------------------------------------------------------------------
  351. // Name:
  352. // Desc:
  353. //-----------------------------------------------------------------------------
  354. CD3DFrame::~CD3DFrame()
  355. {
  356.     SAFE_DELETE( m_pChild );
  357.     SAFE_DELETE( m_pNext );
  358. }
  359. //-----------------------------------------------------------------------------
  360. // Name:
  361. // Desc:
  362. //-----------------------------------------------------------------------------
  363. bool CD3DFrame::EnumMeshes( bool (*EnumMeshCB)(CD3DMesh*,void*),
  364.                             void* pContext )
  365. {
  366.     if( m_pMesh )
  367.         EnumMeshCB( m_pMesh, pContext );
  368.     if( m_pChild )
  369.         m_pChild->EnumMeshes( EnumMeshCB, pContext );
  370.     if( m_pNext )
  371.         m_pNext->EnumMeshes( EnumMeshCB, pContext );
  372.     return TRUE;
  373. }
  374. */
  375. /*
  376. //-----------------------------------------------------------------------------
  377. // Name:
  378. // Desc:
  379. //-----------------------------------------------------------------------------
  380. CD3DMesh* CD3DFrame::FindMesh( TCHAR* strMeshName )
  381. {
  382.     CD3DMesh* pMesh;
  383.     if( m_pMesh )
  384.         if( !lstrcmpi( m_pMesh->m_strName, strMeshName ) )
  385.             return m_pMesh;
  386.     if( m_pChild )
  387.         if( NULL != ( pMesh = m_pChild->FindMesh( strMeshName ) ) )
  388.             return pMesh;
  389.     if( m_pNext )
  390.         if( NULL != ( pMesh = m_pNext->FindMesh( strMeshName ) ) )
  391.             return pMesh;
  392.     return NULL;
  393. }
  394. */
  395. /*
  396. //-----------------------------------------------------------------------------
  397. // Name:
  398. // Desc:
  399. //-----------------------------------------------------------------------------
  400. CD3DFrame* CD3DFrame::FindFrame( TCHAR* strFrameName )
  401. {
  402.     CD3DFrame* pFrame;
  403.     if( !lstrcmpi( m_strName, strFrameName ) )
  404.         return this;
  405.     if( m_pChild )
  406.         if( NULL != ( pFrame = m_pChild->FindFrame( strFrameName ) ) )
  407.             return pFrame;
  408.     if( m_pNext )
  409.         if( NULL != ( pFrame = m_pNext->FindFrame( strFrameName ) ) )
  410.             return pFrame;
  411.     return NULL;
  412. }
  413. */
  414. /*
  415. //-----------------------------------------------------------------------------
  416. // Name:
  417. // Desc:
  418. //-----------------------------------------------------------------------------
  419. HRESULT CD3DFrame::Destroy()
  420. {
  421.     if( m_pMesh )  m_pMesh->Destroy();
  422.     if( m_pChild ) m_pChild->Destroy();
  423.     if( m_pNext )  m_pNext->Destroy();
  424.     SAFE_DELETE( m_pMesh );
  425.     SAFE_DELETE( m_pNext );
  426.     SAFE_DELETE( m_pChild );
  427.     return S_OK;
  428. }
  429. //-----------------------------------------------------------------------------
  430. // Name:
  431. // Desc:
  432. //-----------------------------------------------------------------------------
  433. HRESULT CD3DFrame::RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice )
  434. {
  435.     if( m_pMesh )  m_pMesh->RestoreDeviceObjects( pd3dDevice );
  436.     if( m_pChild ) m_pChild->RestoreDeviceObjects( pd3dDevice );
  437.     if( m_pNext )  m_pNext->RestoreDeviceObjects( pd3dDevice );
  438.     return S_OK;
  439. }
  440. //-----------------------------------------------------------------------------
  441. // Name:
  442. // Desc:
  443. //-----------------------------------------------------------------------------
  444. HRESULT CD3DFrame::InvalidateDeviceObjects()
  445. {
  446.     if( m_pMesh )  m_pMesh->InvalidateDeviceObjects();
  447.     if( m_pChild ) m_pChild->InvalidateDeviceObjects();
  448.     if( m_pNext )  m_pNext->InvalidateDeviceObjects();
  449.     return S_OK;
  450. }
  451. //-----------------------------------------------------------------------------
  452. // Name:
  453. // Desc:
  454. //-----------------------------------------------------------------------------
  455. HRESULT CD3DFrame::Render( LPDIRECT3DDEVICE9 pd3dDevice, bool bDrawOpaqueSubsets,
  456.                            bool bDrawAlphaSubsets, D3DXMATRIX* pmatWorldMatrix )
  457. {
  458.     // For pure devices, specify the world transform. If the world transform is not
  459.     // specified on pure devices, this function will fail.
  460.     D3DXMATRIXA16 matSavedWorld, matWorld;
  461.     if ( NULL == pmatWorldMatrix )
  462.         pd3dDevice->GetTransform( D3DTS_WORLD, &matSavedWorld );
  463.     else
  464.         matSavedWorld = *pmatWorldMatrix;
  465.     D3DXMatrixMultiply( &matWorld, &m_mat, &matSavedWorld );
  466.     pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  467.     if( m_pMesh )
  468.         m_pMesh->Render( pd3dDevice, bDrawOpaqueSubsets, bDrawAlphaSubsets );
  469.     if( m_pChild )
  470.         m_pChild->Render( pd3dDevice, bDrawOpaqueSubsets, bDrawAlphaSubsets, &matWorld );
  471.     pd3dDevice->SetTransform( D3DTS_WORLD, &matSavedWorld );
  472.     if( m_pNext )
  473.         m_pNext->Render( pd3dDevice, bDrawOpaqueSubsets, bDrawAlphaSubsets, &matSavedWorld );
  474.     return S_OK;
  475. }
  476. /*
  477. //-----------------------------------------------------------------------------
  478. // Name:
  479. // Desc:
  480. //-----------------------------------------------------------------------------
  481. HRESULT CD3DFile::LoadFrame( LPDIRECT3DDEVICE9 pd3dDevice,
  482.                              LPDIRECTXFILEDATA pFileData,
  483.                              CD3DFrame* pParentFrame )
  484. {
  485.     LPD3DFILEDATA   pChildData = NULL;
  486.     LPDIRECTXFILEOBJECT pChildObj = NULL;
  487.     const GUID* pGUID;
  488.     DWORD       cbSize;
  489.     CD3DFrame*  pCurrentFrame;
  490.     HRESULT     hr;
  491.     // Get the type of the object
  492.     if( FAILED( hr = pFileData->GetType( &pGUID ) ) )
  493.         return hr;
  494.     if( *pGUID == TID_D3DRMMesh )
  495.     {
  496.         hr = LoadMesh( pd3dDevice, pFileData, pParentFrame );
  497.         if( FAILED(hr) )
  498.             return hr;
  499.     }
  500.     if( *pGUID == TID_D3DRMFrameTransformMatrix )
  501.     {
  502.         D3DXMATRIX* pmatMatrix;
  503.         hr = pFileData->GetData( NULL, &cbSize, (void**)&pmatMatrix );
  504.         if( FAILED(hr) )
  505.             return hr;
  506.         // Update the parent's matrix with the new one
  507.         pParentFrame->SetMatrix( pmatMatrix );
  508.     }
  509.     if( *pGUID == TID_D3DRMFrame )
  510.     {
  511.         // Get the frame name
  512.         CHAR  strAnsiName[512] = "";
  513.         TCHAR strName[512];
  514.         DWORD dwNameLength = 512;
  515.         if( FAILED( hr = pFileData->GetName( strAnsiName, &dwNameLength ) ) )
  516.             return hr;
  517.         DXUtil_ConvertAnsiStringToGenericCb( strName, strAnsiName, sizeof(strName) );
  518.         // Create the frame
  519.         pCurrentFrame = new CD3DFrame( strName );
  520.         if( pCurrentFrame == NULL )
  521.             return E_OUTOFMEMORY;
  522.         pCurrentFrame->m_pNext = pParentFrame->m_pChild;
  523.         pParentFrame->m_pChild = pCurrentFrame;
  524.         // Enumerate child objects
  525.         while( SUCCEEDED( pFileData->GetNextObject( &pChildObj ) ) )
  526.         {
  527.             // Query the child for its FileData
  528.             hr = pChildObj->QueryInterface( IID_IDirectXFileData,
  529.                                             (void**)&pChildData );
  530.             if( SUCCEEDED(hr) )
  531.             {
  532.                 hr = LoadFrame( pd3dDevice, pChildData, pCurrentFrame );
  533.                 pChildData->Release();
  534.             }
  535.             pChildObj->Release();
  536.             if( FAILED(hr) )
  537.                 return hr;
  538.         }
  539.     }
  540.     return S_OK;
  541. }
  542. */
  543. /*
  544. //-----------------------------------------------------------------------------
  545. // Name:
  546. // Desc:
  547. //-----------------------------------------------------------------------------
  548. HRESULT CD3DFile::LoadMesh( LPDIRECT3DDEVICE9 pd3dDevice,
  549.                             LPD3DXFILEDATA pFileData,
  550.                             CD3DFrame* pParentFrame )
  551. {
  552.     // Currently only allowing one mesh per frame
  553.     if( pParentFrame->m_pMesh )
  554.         return E_FAIL;
  555.     // Get the mesh name
  556.     CHAR  strAnsiName[512] = {0};
  557.     TCHAR strName[512];
  558.     DWORD dwNameLength = 512;
  559.     HRESULT hr;
  560.     if( FAILED( hr = pFileData->GetName( strAnsiName, &dwNameLength ) ) )
  561.         return hr;
  562.     DXUtil_ConvertAnsiStringToGenericCb( strName, strAnsiName, sizeof(strName) );
  563.     // Create the mesh
  564.     pParentFrame->m_pMesh = new CD3DMesh( strName );
  565.     if( pParentFrame->m_pMesh == NULL )
  566.         return E_OUTOFMEMORY;
  567.     pParentFrame->m_pMesh->Create( pd3dDevice, pFileData );
  568.     return S_OK;
  569. }
  570. */
  571. /*
  572. //-----------------------------------------------------------------------------
  573. // Name:
  574. // Desc:
  575. //-----------------------------------------------------------------------------
  576. HRESULT CD3DFile::CreateFromResource( LPDIRECT3DDEVICE9 pd3dDevice, TCHAR* strResource, TCHAR* strType )
  577. {
  578.     LPDIRECTXFILE           pDXFile   = NULL;
  579.     LPDIRECTXFILEENUMOBJECT pEnumObj  = NULL;
  580.     LPDIRECTXFILEDATA       pFileData = NULL;
  581.     HRESULT hr;
  582.     // Create a x file object
  583.     if( FAILED( hr = DirectXFileCreate( &pDXFile ) ) )
  584.         return E_FAIL;
  585.     // Register templates for d3drm and patch extensions.
  586.     if( FAILED( hr = pDXFile->RegisterTemplates( (void*)D3DRM_XTEMPLATES,
  587.                                                  D3DRM_XTEMPLATE_BYTES ) ) )
  588.     {
  589.         pDXFile->Release();
  590.         return E_FAIL;
  591.     }
  592.     
  593.     CHAR strTypeAnsi[MAX_PATH];
  594.     DXUtil_ConvertGenericStringToAnsiCb( strTypeAnsi, strType, sizeof(strTypeAnsi) );
  595.     DXFILELOADRESOURCE dxlr;
  596.     dxlr.hModule = NULL;
  597.     dxlr.lpName = strResource;
  598.     dxlr.lpType = (TCHAR*) strTypeAnsi;
  599.     // Create enum object
  600.     hr = pDXFile->CreateEnumObject( (void*)&dxlr, DXFILELOAD_FROMRESOURCE, 
  601.                                     &pEnumObj );
  602.     if( FAILED(hr) )
  603.     {
  604.         pDXFile->Release();
  605.         return hr;
  606.     }
  607.     // Enumerate top level objects (which are always frames)
  608.     while( SUCCEEDED( pEnumObj->GetNextDataObject( &pFileData ) ) )
  609.     {
  610.         hr = LoadFrame( pd3dDevice, pFileData, this );
  611.         pFileData->Release();
  612.         if( FAILED(hr) )
  613.         {
  614.             pEnumObj->Release();
  615.             pDXFile->Release();
  616.             return E_FAIL;
  617.         }
  618.     }
  619.     SAFE_RELEASE( pFileData );
  620.     SAFE_RELEASE( pEnumObj );
  621.     SAFE_RELEASE( pDXFile );
  622.     return S_OK;
  623. }
  624. //-----------------------------------------------------------------------------
  625. // Name:
  626. // Desc:
  627. //-----------------------------------------------------------------------------
  628. HRESULT CD3DFile::Create( LPDIRECT3DDEVICE9 pd3dDevice, TCHAR* strFilename )
  629. {
  630.     LPDIRECTXFILE           pDXFile   = NULL;
  631.     LPDIRECTXFILEENUMOBJECT pEnumObj  = NULL;
  632.     LPDIRECTXFILEDATA       pFileData = NULL;
  633.     HRESULT hr;
  634.     // Create a x file object
  635.     if( FAILED( hr = DirectXFileCreate( &pDXFile ) ) )
  636.         return E_FAIL;
  637.     // Register templates for d3drm and patch extensions.
  638.     if( FAILED( hr = pDXFile->RegisterTemplates( (void*)D3DRM_XTEMPLATES,
  639.                                                  D3DRM_XTEMPLATE_BYTES ) ) )
  640.     {
  641.         pDXFile->Release();
  642.         return E_FAIL;
  643.     }
  644.     // Find the path to the file, and convert it to ANSI (for the D3DXOF API)
  645.     TCHAR strPath[MAX_PATH];
  646.     CHAR  strPathANSI[MAX_PATH];
  647.     DXUtil_FindMediaFileCb( strPath, sizeof(strPath), strFilename );
  648.     DXUtil_ConvertGenericStringToAnsiCb( strPathANSI, strPath, sizeof(strPathANSI) );
  649.     
  650.     // Create enum object
  651.     hr = pDXFile->CreateEnumObject( (void*)strPathANSI, DXFILELOAD_FROMFILE, 
  652.                                     &pEnumObj );
  653.     if( FAILED(hr) )
  654.     {
  655.         pDXFile->Release();
  656.         return hr;
  657.     }
  658.     // Enumerate top level objects (which are always frames)
  659.     while( SUCCEEDED( pEnumObj->GetNextDataObject( &pFileData ) ) )
  660.     {
  661.         hr = LoadFrame( pd3dDevice, pFileData, this );
  662.         pFileData->Release();
  663.         if( FAILED(hr) )
  664.         {
  665.             pEnumObj->Release();
  666.             pDXFile->Release();
  667.             return E_FAIL;
  668.         }
  669.     }
  670.     SAFE_RELEASE( pFileData );
  671.     SAFE_RELEASE( pEnumObj );
  672.     SAFE_RELEASE( pDXFile );
  673.     return S_OK;
  674. }
  675. //-----------------------------------------------------------------------------
  676. // Name:
  677. // Desc:
  678. //-----------------------------------------------------------------------------
  679. HRESULT CD3DFile::Render( LPDIRECT3DDEVICE9 pd3dDevice, D3DXMATRIX* pmatWorldMatrix )
  680. {
  681.     // For pure devices, specify the world transform. If the world transform is not
  682.     // specified on pure devices, this function will fail.
  683.     // Set up the world transformation
  684.     D3DXMATRIX matSavedWorld, matWorld;
  685.     if ( NULL == pmatWorldMatrix )
  686.         pd3dDevice->GetTransform( D3DTS_WORLD, &matSavedWorld );
  687.     else
  688.         matSavedWorld = *pmatWorldMatrix;
  689.     D3DXMatrixMultiply( &matWorld, &matSavedWorld, &m_mat );
  690.     pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  691.     // Render opaque subsets in the meshes
  692.     if( m_pChild )
  693.         m_pChild->Render( pd3dDevice, TRUE, FALSE, &matWorld );
  694.     // Enable alpha blending
  695.     pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
  696.     pd3dDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
  697.     pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
  698.     // Render alpha subsets in the meshes
  699.     if( m_pChild )
  700.         m_pChild->Render( pd3dDevice, FALSE, TRUE, &matWorld );
  701.     // Restore state
  702.     pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
  703.     pd3dDevice->SetTransform( D3DTS_WORLD, &matSavedWorld );
  704.     return S_OK;
  705. }
  706. */