//----------------------------------------------------------------------------- // Name: // Desc: //----------------------------------------------------------------------------- HRESULT CD3DFile::LoadMesh( LPDIRECT3DDEVICE9 pd3dDevice, LPDIRECTXFILEDATA pFileData, CD3DFrame* pParentFrame ) { // Currently only allowing one mesh per frame if( pParentFrame->m_pMesh ) return E_FAIL; // Get the mesh name CHAR strAnsiName[512] = {0}; TCHAR strName[512]; DWORD dwNameLength = 512; HRESULT hr; if( FAILED( hr = pFileData->GetName( strAnsiName, &dwNameLength ) ) ) return hr; DXUtil_ConvertAnsiStringToGenericCb( strName, strAnsiName, sizeof(strName) ); // Create the mesh pParentFrame->m_pMesh = new CD3DMesh( strName ); if( pParentFrame->m_pMesh == NULL ) return E_OUTOFMEMORY; pParentFrame->m_pMesh->Create( pd3dDevice, pFileData ); return S_OK; }
//----------------------------------------------------------------------------- // Name: // Desc: //----------------------------------------------------------------------------- HRESULT CD3DFile::LoadFrame( LPDIRECT3DDEVICE9 pd3dDevice, LPDIRECTXFILEDATA pFileData, CD3DFrame* pParentFrame ) { LPDIRECTXFILEDATA pChildData = NULL; LPDIRECTXFILEOBJECT pChildObj = NULL; const GUID* pGUID; DWORD cbSize; CD3DFrame* pCurrentFrame; HRESULT hr; // Get the type of the object if( FAILED( hr = pFileData->GetType( &pGUID ) ) ) return hr; if( *pGUID == TID_D3DRMMesh ) { hr = LoadMesh( pd3dDevice, pFileData, pParentFrame ); if( FAILED(hr) ) return hr; } if( *pGUID == TID_D3DRMFrameTransformMatrix ) { D3DXMATRIX* pmatMatrix; hr = pFileData->GetData( NULL, &cbSize, (void**)&pmatMatrix ); if( FAILED(hr) ) return hr; // Update the parent's matrix with the new one pParentFrame->SetMatrix( pmatMatrix ); } if( *pGUID == TID_D3DRMFrame ) { // Get the frame name CHAR strAnsiName[512] = ""; TCHAR strName[512]; DWORD dwNameLength = 512; if( FAILED( hr = pFileData->GetName( strAnsiName, &dwNameLength ) ) ) return hr; DXUtil_ConvertAnsiStringToGenericCb( strName, strAnsiName, sizeof(strName) ); // Create the frame pCurrentFrame = new CD3DFrame( strName ); if( pCurrentFrame == NULL ) return E_OUTOFMEMORY; pCurrentFrame->m_pNext = pParentFrame->m_pChild; pParentFrame->m_pChild = pCurrentFrame; // Enumerate child objects while( SUCCEEDED( pFileData->GetNextObject( &pChildObj ) ) ) { // Query the child for its FileData hr = pChildObj->QueryInterface( IID_IDirectXFileData, (void**)&pChildData ); if( SUCCEEDED(hr) ) { hr = LoadFrame( pd3dDevice, pChildData, pCurrentFrame ); pChildData->Release(); } pChildObj->Release(); if( FAILED(hr) ) return hr; } } return S_OK; }
//----------------------------------------------------------------------------- // Name: // Desc: //----------------------------------------------------------------------------- HRESULT CD3DMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, TCHAR* strFilename ) { TCHAR strPath[MAX_PATH]; LPD3DXBUFFER pAdjacencyBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; HRESULT hr; // Find the path for the file, and convert it to ANSI (for the D3DX API) DXUtil_FindMediaFileCb( strPath, sizeof(strPath), strFilename ); // Load the mesh if( FAILED( hr = D3DXLoadMeshFromX( strPath, D3DXMESH_SYSTEMMEM, pd3dDevice, &pAdjacencyBuffer, &pMtrlBuffer, NULL, &m_dwNumMaterials, &m_pSysMemMesh ) ) ) { return hr; } // Optimize the mesh for performance if( FAILED( hr = m_pSysMemMesh->OptimizeInplace( D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE, (DWORD*)pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) ) { SAFE_RELEASE( pAdjacencyBuffer ); SAFE_RELEASE( pMtrlBuffer ); return hr; } // Get material info for the mesh // Get the array of materials out of the buffer if( pMtrlBuffer && m_dwNumMaterials > 0 ) { // Allocate memory for the materials and textures D3DXMATERIAL* d3dxMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials]; if( m_pMaterials == NULL ) { hr = E_OUTOFMEMORY; goto LEnd; } m_pTextures = new LPDIRECT3DTEXTURE9[m_dwNumMaterials]; if( m_pTextures == NULL ) { hr = E_OUTOFMEMORY; goto LEnd; } // Copy each material and create its texture for( DWORD i=0; i<m_dwNumMaterials; i++ ) { // Copy the material m_pMaterials[i] = d3dxMtrls[i].MatD3D; m_pTextures[i] = NULL; // Create a texture if( d3dxMtrls[i].pTextureFilename ) { TCHAR strTexture[MAX_PATH]; TCHAR strTextureTemp[MAX_PATH]; DXUtil_ConvertAnsiStringToGenericCb( strTextureTemp, d3dxMtrls[i].pTextureFilename, sizeof(strTextureTemp) ); DXUtil_FindMediaFileCb( strTexture, sizeof(strTexture), strTextureTemp ); if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, strTexture, &m_pTextures[i] ) ) ) m_pTextures[i] = NULL; } } } hr = S_OK; LEnd: SAFE_RELEASE( pAdjacencyBuffer ); SAFE_RELEASE( pMtrlBuffer ); return hr; }
//----------------------------------------------------------------------------- // Name: // Desc: create from a file or build-in object // See paraworldassets for more details. //----------------------------------------------------------------------------- HRESULT CD3DMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCTSTR strFilename ) { // --Paraworld: Create built-in objects // -- modified by [email protected] if(strFilename[0] == '_') { if(strcmp(strFilename,_T("_floor")) == 0) { RestorePolygonMesh(pd3dDevice, 1, 4, &(m_pSysMemMesh)); return S_OK; } } // -- file based mesh object creation. Below are original code by directx sdk sample TCHAR strPath[MAX_PATH]; LPD3DXBUFFER pAdjacencyBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; HRESULT hr; // Find the path for the file, and convert it to ANSI (for the D3DX API) DXUtil_FindMediaFileCb( strPath, sizeof(strPath), strFilename ); // Load the mesh if( FAILED( hr = D3DXLoadMeshFromX( strPath, D3DXMESH_SYSTEMMEM, pd3dDevice, &pAdjacencyBuffer, &pMtrlBuffer, NULL, &m_dwNumMaterials, &m_pSysMemMesh ) ) ) { return hr; } // Optimize the mesh for performance if( FAILED( hr = m_pSysMemMesh->OptimizeInplace( D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE, (DWORD*)pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) ) { SAFE_RELEASE( pAdjacencyBuffer ); SAFE_RELEASE( pMtrlBuffer ); return hr; } // Get material info for the mesh // Get the array of materials out of the buffer if( pMtrlBuffer && m_dwNumMaterials > 0 ) { // Allocate memory for the materials and textures D3DXMATERIAL* d3dxMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials]; if( m_pMaterials == NULL ) { hr = E_OUTOFMEMORY; goto LEnd; } m_pTextures = new LPDIRECT3DTEXTURE9[m_dwNumMaterials]; if( m_pTextures == NULL ) { hr = E_OUTOFMEMORY; goto LEnd; } // Copy each material and create its texture for( DWORD i=0; i<m_dwNumMaterials; i++ ) { // Copy the material m_pMaterials[i] = d3dxMtrls[i].MatD3D; m_pTextures[i] = NULL; // Create a texture if( d3dxMtrls[i].pTextureFilename ) { TCHAR strTexture[MAX_PATH]; TCHAR strTextureTemp[MAX_PATH]; DXUtil_ConvertAnsiStringToGenericCb( strTextureTemp, d3dxMtrls[i].pTextureFilename, sizeof(strTextureTemp) ); DXUtil_FindMediaFileCb( strTexture, sizeof(strTexture), strTextureTemp ); if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, strTexture, &m_pTextures[i] ) ) ) m_pTextures[i] = NULL; } } } hr = S_OK; LEnd: SAFE_RELEASE( pAdjacencyBuffer ); SAFE_RELEASE( pMtrlBuffer ); return hr; }