www.pudn.com > D3DITEM01.rar > D3DMesh.cpp


#include"D3DMesh.h" 
 
CMesh::CMesh() 
:m_pDevice(0),m_pMesh(0),m_dwNumMaterials(0),m_pMaterial(0),m_pTexture(0) 
{ 
	//不做任何事情 
} 
CMesh::~CMesh() 
{ 
	//释放网格模型 
	if(m_pMesh) 
		m_pMesh->Release(); 
 
	//释放模型纹理 
	for(unsigned int i = 0; i < m_dwNumMaterials; ++i) 
	{ 
		if(m_pTexture[i]) 
			m_pTexture[i]->Release(); 
	} 
 
	//释放材质缓冲 
	if(m_pMaterial) 
		delete []m_pMaterial; 
 
	//释放纹理缓冲 
	if(m_pTexture) 
		delete []m_pTexture; 
} 
 
bool CMesh::Init(LPDIRECT3DDEVICE9 pDevice, const char* pFileName) 
{ 
	//检查D3D设备以及模型文件名的有效性 
	if(!pDevice || !pFileName) 
	{ 
		MessageBox(0, "出错 - 检查D3D设备以及模型文件名的有效性!", 0, 0); 
		return false; 
	} 
 
	//得到D3D设备和模型文件名 
	this->m_pDevice = pDevice; 
 
	strcpy(m_FileName, pFileName); 
 
	//读取模型文件 
	LPD3DXBUFFER pXBuffer = 0; 
	if(FAILED(D3DXLoadMeshFromX(m_FileName, D3DPOOL_SYSTEMMEM, m_pDevice, 0, &pXBuffer, 0, &m_dwNumMaterials, &m_pMesh))) 
	{ 
		MessageBox(0, "出错 - 读取模型文件!", 0, 0); 
		return false; 
	} 
 
	//创建材质缓冲 
	m_pMaterial = new D3DMATERIAL9[m_dwNumMaterials]; 
	if(!m_pMaterial) 
	{ 
		MessageBox(0, "出错 - 创建材质缓冲!", 0, 0); 
		pXBuffer->Release(); 
		m_pMesh->Release(); 
		return false; 
	} 
 
	//创建纹理缓冲 
	m_pTexture = new LPDIRECT3DTEXTURE9[m_dwNumMaterials]; 
	if(!m_pTexture) 
	{ 
		MessageBox(0, "出错 - 创建纹理缓冲!", 0, 0); 
		delete []m_pMaterial; 
		pXBuffer->Release(); 
		m_pMesh->Release(); 
		return false; 
	} 
 
	//获取材质、纹理 
	D3DXMATERIAL* pD3DXMaterial = (D3DXMATERIAL*)(pXBuffer->GetBufferPointer()); 
	for(unsigned int i = 0; i < m_dwNumMaterials; ++i) 
	{ 
		m_pMaterial[i] = pD3DXMaterial[i].MatD3D; 
		if(FAILED(D3DXCreateTextureFromFile(m_pDevice, pD3DXMaterial[i].pTextureFilename, &m_pTexture[i]))) 
			m_pTexture[i] = 0; 
	} 
 
	//释放临时缓冲 
	pXBuffer->Release(); 
 
	return true; 
} 
 
bool CMesh::SetTextureFromFile(unsigned int ID, const char* pFileName) 
{ 
	//检查ID号的有效性 
	if(m_dwNumMaterials <= ID) 
	{ 
		MessageBox(0, "出错 - 检查ID号的有效性!", 0, 0); 
		return false; 
	} 
 
	//释放需要重置的纹理 
	if(m_pTexture[ID]) 
		m_pTexture[ID]->Release(); 
 
	//读取模型文件 
	if(FAILED(D3DXCreateTextureFromFile(m_pDevice, pFileName, &m_pTexture[ID]))) 
	{ 
		MessageBox(0, "出错 - 读取模型文件!", 0, 0); 
		return false; 
	} 
 
	return true; 
} 
 
void CMesh::Render(const D3DXMATRIX* matWorld) 
{ 
	//设置世界变换 
	if(matWorld) 
		m_pDevice->SetTransform(D3DTS_WORLD, matWorld); 
 
	//渲染 
	for(unsigned int i = 0; i < m_dwNumMaterials; ++i) 
	{ 
		m_pDevice->SetMaterial(&m_pMaterial[i]); 
		m_pDevice->SetTexture(0, m_pTexture[i]); 
		m_pMesh->DrawSubset(i); 
	} 
} 
 
LPD3DXMESH CMesh::GetMesh() 
{ 
	return m_pMesh; 
}