📄 mesh.cpp
字号:
#include <d3dx9.h>
//#include <crtdbg.h>
#include "Mesh.h"
CMesh::~CMesh ()
{
SafeRelease(m_pMesh);
for(DWORD i=0;i<m_dwNumOfMaterials;i++)
{
SafeRelease(m_pMeshTextures[i]);
}
SafeDeleteArray(m_pMeshTextures);
SafeDeleteArray(m_pMeshMaterials);
}
CMesh::CMesh(LPDIRECT3DDEVICE9 pDevice,char *strMesh,BOOL bOptimize)
{
LPD3DXBUFFER pD3DXMtrlBuffer=NULL;//材质缓冲区指针
D3DXMATERIAL *d3dxMaterials;//缓冲区中材质指针
m_pDevice=pDevice;
m_vPos.x=0;
m_vPos.y=0;
m_vPos.z=0;
m_fAngle=0;
//加载纹理
LRESULT ret=D3DXLoadMeshFromX(strMesh,0,m_pDevice,NULL,&pD3DXMtrlBuffer,NULL,&m_dwNumOfMaterials,&m_pMesh);
if(ret!=D3D_OK)
{
MessageBox(NULL,"加载场景纹理失败!\n可能是文件名或路径错误。",strMesh, MB_OK|MB_ICONERROR);
return;
}
d3dxMaterials=(D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();//获取材质地址
m_pMeshMaterials=new D3DMATERIAL9[m_dwNumOfMaterials];//材质指针数组
m_pMeshTextures=new LPDIRECT3DTEXTURE9[m_dwNumOfMaterials];//纹理指针数组
for(DWORD i=0; i<m_dwNumOfMaterials;i++)
{
m_pMeshMaterials[i]=d3dxMaterials[i].MatD3D;//从缓冲区中拷贝材质
m_pMeshMaterials[i].Ambient=m_pMeshMaterials[i].Diffuse;//设置环境光属性
m_pMeshTextures[i]=NULL;//初始贴图为空
D3DXCreateTextureFromFile(m_pDevice,d3dxMaterials[i].pTextureFilename,&m_pMeshTextures[i]);//根据材质中的纹理文件名加载纹理
}
if(pD3DXMtrlBuffer)//释放材质缓冲区
pD3DXMtrlBuffer->Release();
pD3DXMtrlBuffer=NULL;
if(bOptimize)
Optimize();
//计算方盒
D3DXVECTOR3 *pVertices;
m_pMesh->LockVertexBuffer(0,(void**)&pVertices);
D3DXComputeBoundingBox(
pVertices,
m_pMesh->GetNumVertices(),
m_pMesh->GetNumBytesPerVertex(),
&m_vMin,
&m_vMax);
m_pMesh->UnlockVertexBuffer();
}
void CMesh::Optimize()
{
LPD3DXMESH pOtimizedMesh;
m_pMesh->Optimize(
D3DXMESHOPT_COMPACT|D3DXMESHOPT_ATTRSORT|D3DXMESHOPT_DONOTSPLIT|
D3DXMESHOPT_DEVICEINDEPENDENT,NULL,NULL,NULL,NULL,&pOtimizedMesh);
m_pMesh->Release();
m_pMesh=pOtimizedMesh;
}
void CMesh::Render()
{
D3DMATRIX matWorld;
D3DXMatrixRotationY((D3DXMATRIX*)&matWorld,m_fAngle);
matWorld._41=m_vPos.x;
matWorld._42=m_vPos.y;
matWorld._43=m_vPos.z;//?
m_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
m_pDevice->SetFVF(m_pMesh->GetFVF());
for(DWORD i=0;i<m_dwNumOfMaterials;i++)
{
m_pDevice->SetMaterial(&m_pMeshMaterials[i]);
m_pDevice->SetTexture(0,m_pMeshTextures[i]);
m_pMesh->DrawSubset(i);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -