?? 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 + -