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;
}