📄 sdkmesh.cpp
字号:
//--------------------------------------------------------------------------------------
IDirect3DVertexBuffer9* CDXUTSDKMesh::GetVB9At( UINT iVB )
{
return m_pVertexBufferArray[ iVB ].pVB9;
}
//--------------------------------------------------------------------------------------
IDirect3DIndexBuffer9* CDXUTSDKMesh::GetIB9At( UINT iIB )
{
return m_pIndexBufferArray[ iIB ].pIB9;
}
//--------------------------------------------------------------------------------------
ID3D10Buffer* CDXUTSDKMesh::GetVB10At( UINT iVB )
{
return m_pVertexBufferArray[ iVB ].pVB10;
}
//--------------------------------------------------------------------------------------
ID3D10Buffer* CDXUTSDKMesh::GetIB10At( UINT iIB )
{
return m_pIndexBufferArray[ iIB ].pIB10;
}
//--------------------------------------------------------------------------------------
SDKMESH_MATERIAL* CDXUTSDKMesh::GetMaterial( UINT iMaterial )
{
return &m_pMaterialArray[ iMaterial ];
}
//--------------------------------------------------------------------------------------
SDKMESH_MESH* CDXUTSDKMesh::GetMesh( UINT iMesh )
{
return &m_pMeshArray[ iMesh ];
}
//--------------------------------------------------------------------------------------
UINT CDXUTSDKMesh::GetNumSubsets( UINT iMesh )
{
return m_pMeshArray[ iMesh ].NumSubsets;
}
//--------------------------------------------------------------------------------------
SDKMESH_SUBSET* CDXUTSDKMesh::GetSubset( UINT iMesh, UINT iSubset )
{
return &m_pSubsetArray[ m_pMeshArray[ iMesh ].pSubsets[iSubset] ];
}
//--------------------------------------------------------------------------------------
UINT CDXUTSDKMesh::GetVertexStride( UINT iMesh, UINT iVB )
{
return (UINT)m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].StrideBytes;
}
//--------------------------------------------------------------------------------------
SDKMESH_FRAME* CDXUTSDKMesh::FindFrame( char* pszName )
{
for( UINT i=0; i<m_pMeshHeader->NumFrames; i++ )
{
if( _stricmp( m_pFrameArray[i].Name, pszName ) == 0 )
{
return &m_pFrameArray[i];
}
}
return NULL;
}
//--------------------------------------------------------------------------------------
UINT64 CDXUTSDKMesh::GetNumVertices( UINT iMesh, UINT iVB )
{
return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].NumVertices;
}
//--------------------------------------------------------------------------------------
UINT64 CDXUTSDKMesh::GetNumIndices( UINT iMesh )
{
return m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].NumIndices;
}
//--------------------------------------------------------------------------------------
D3DXVECTOR3 CDXUTSDKMesh::GetMeshBBoxCenter( UINT iMesh )
{
return m_pMeshArray[iMesh].BoundingBoxCenter;
}
//--------------------------------------------------------------------------------------
D3DXVECTOR3 CDXUTSDKMesh::GetMeshBBoxExtents( UINT iMesh )
{
return m_pMeshArray[iMesh].BoundingBoxExtents;
}
//--------------------------------------------------------------------------------------
UINT CDXUTSDKMesh::GetOutstandingResources()
{
UINT outstandingResources = 0;
if( !m_pMeshHeader )
return 1;
outstandingResources += GetOutstandingBufferResources();
if( m_pDev10 )
{
for( UINT i=0; i<m_pMeshHeader->NumMaterials; i++ )
{
if( m_pMaterialArray[i].DiffuseTexture[0] != 0 )
{
if( !m_pMaterialArray[i].pDiffuseRV10 && !IsErrorResource( m_pMaterialArray[i].pDiffuseRV10 ) )
outstandingResources ++;
}
if( m_pMaterialArray[i].NormalTexture[0] != 0 )
{
if( !m_pMaterialArray[i].pNormalRV10 && !IsErrorResource( m_pMaterialArray[i].pNormalRV10 ) )
outstandingResources ++;
}
if( m_pMaterialArray[i].SpecularTexture[0] != 0 )
{
if( !m_pMaterialArray[i].pSpecularRV10 && !IsErrorResource( m_pMaterialArray[i].pSpecularRV10 ) )
outstandingResources ++;
}
}
}
else
{
for( UINT i=0; i<m_pMeshHeader->NumMaterials; i++ )
{
if( m_pMaterialArray[i].DiffuseTexture[0] != 0 )
{
if( !m_pMaterialArray[i].pDiffuseTexture9 && !IsErrorResource( m_pMaterialArray[i].pDiffuseTexture9 ) )
outstandingResources ++;
}
if( m_pMaterialArray[i].NormalTexture[0] != 0 )
{
if( !m_pMaterialArray[i].pNormalTexture9 && !IsErrorResource( m_pMaterialArray[i].pNormalTexture9 ) )
outstandingResources ++;
}
if( m_pMaterialArray[i].SpecularTexture[0] != 0 )
{
if( !m_pMaterialArray[i].pSpecularTexture9 && !IsErrorResource( m_pMaterialArray[i].pSpecularTexture9 ) )
outstandingResources ++;
}
}
}
return outstandingResources;
}
//--------------------------------------------------------------------------------------
UINT CDXUTSDKMesh::GetOutstandingBufferResources()
{
UINT outstandingResources = 0;
if( !m_pMeshHeader )
return 1;
for( UINT i=0; i<m_pMeshHeader->NumVertexBuffers; i++ )
{
if( !m_pVertexBufferArray[i].pVB9 && !IsErrorResource( m_pVertexBufferArray[i].pVB9 ) )
outstandingResources ++;
}
for( UINT i=0; i<m_pMeshHeader->NumIndexBuffers; i++ )
{
if( !m_pIndexBufferArray[i].pIB9 && !IsErrorResource( m_pIndexBufferArray[i].pIB9 ) )
outstandingResources ++;
}
return outstandingResources;
}
//--------------------------------------------------------------------------------------
bool CDXUTSDKMesh::CheckLoadDone()
{
if( 0 == GetOutstandingResources() )
{
m_bLoading = false;
return true;
}
return false;
}
//--------------------------------------------------------------------------------------
bool CDXUTSDKMesh::IsLoaded()
{
if( m_pStaticMeshData && !m_bLoading )
{
return true;
}
return false;
}
//--------------------------------------------------------------------------------------
bool CDXUTSDKMesh::IsLoading()
{
return m_bLoading;
}
//--------------------------------------------------------------------------------------
void CDXUTSDKMesh::SetLoading( bool bLoading )
{
m_bLoading = bLoading;
}
//--------------------------------------------------------------------------------------
BOOL CDXUTSDKMesh::HadLoadingError()
{
if( m_pMeshHeader )
{
for( UINT i=0; i<m_pMeshHeader->NumVertexBuffers; i++ )
{
if( IsErrorResource( m_pVertexBufferArray[i].pVB9 ) )
return TRUE;
}
for( UINT i=0; i<m_pMeshHeader->NumIndexBuffers; i++ )
{
if( IsErrorResource( m_pIndexBufferArray[i].pIB9 ) )
return TRUE;
}
}
return FALSE;
}
//--------------------------------------------------------------------------------------
UINT CDXUTSDKMesh::GetNumInfluences( UINT iMesh )
{
return m_pMeshArray[iMesh].NumFrameInfluences;
}
//--------------------------------------------------------------------------------------
D3DXMATRIX* CDXUTSDKMesh::GetMeshInfluenceMatrix( UINT iMesh, UINT iInfluence )
{
UINT iFrame = m_pMeshArray[iMesh].pFrameInfluences[ iInfluence ];
return &m_pTransformedFrameMatrices[iFrame];
}
//--------------------------------------------------------------------------------------
UINT CDXUTSDKMesh::GetAnimationKeyFromTime( double fTime )
{
UINT iTick = (UINT)(m_pAnimationHeader->AnimationFPS * fTime);
iTick = iTick % (m_pAnimationHeader->NumAnimationKeys-1);
iTick ++;
return iTick;
}
//-------------------------------------------------------------------------------------
// CDXUTXFileMesh implementation.
//-------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------
CDXUTXFileMesh::CDXUTXFileMesh( LPCWSTR strName )
{
StringCchCopy( m_strName, 512, strName );
m_pMesh = NULL;
m_pMaterials = NULL;
m_pTextures = NULL;
m_bUseMaterials = TRUE;
m_pVB = NULL;
m_pIB = NULL;
m_pDecl = NULL;
m_strMaterials = NULL;
m_dwNumMaterials = 0;
m_dwNumVertices = 0;
m_dwNumFaces = 0;
m_dwBytesPerVertex = 0;
}
//-----------------------------------------------------------------------------
CDXUTXFileMesh::~CDXUTXFileMesh()
{
Destroy();
}
//-----------------------------------------------------------------------------
HRESULT CDXUTXFileMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename )
{
WCHAR strPath[MAX_PATH];
LPD3DXBUFFER pAdjacencyBuffer = NULL;
LPD3DXBUFFER pMtrlBuffer = NULL;
HRESULT hr;
// Cleanup previous mesh if any
Destroy();
// Find the path for the file, and convert it to ANSI (for the D3DX API)
DXUTFindDXSDKMediaFileCch( strPath, sizeof(strPath) / sizeof(WCHAR), strFilename );
// Load the mesh
if( FAILED( hr = D3DXLoadMeshFromX( strPath, D3DXMESH_MANAGED, pd3dDevice,
&pAdjacencyBuffer, &pMtrlBuffer, NULL,
&m_dwNumMaterials, &m_pMesh ) ) )
{
return hr;
}
// Optimize the mesh for performance
if( FAILED( hr = m_pMesh->OptimizeInplace(
D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE,
(DWORD*)pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) )
{
SAFE_RELEASE( pAdjacencyBuffer );
SAFE_RELEASE( pMtrlBuffer );
return hr;
}
// Set strPath to the path of the mesh file
WCHAR *pLastBSlash = wcsrchr( strPath, L'\\' );
if( pLastBSlash )
*(pLastBSlash + 1) = L'\0';
else
*strPath = L'\0';
D3DXMATERIAL* d3dxMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer();
hr = CreateMaterials( strPath, pd3dDevice, d3dxMtrls, m_dwNumMaterials );
SAFE_RELEASE( pAdjacencyBuffer );
SAFE_RELEASE( pMtrlBuffer );
// Extract data from m_pMesh for easy access
D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
m_dwNumVertices = m_pMesh->GetNumVertices();
m_dwNumFaces = m_pMesh->GetNumFaces();
m_dwBytesPerVertex = m_pMesh->GetNumBytesPerVertex();
m_pMesh->GetIndexBuffer( &m_pIB );
m_pMesh->GetVertexBuffer( &m_pVB );
m_pMesh->GetDeclaration( dec
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -