⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mesh.cpp

📁 自己做的一个3D场景
💻 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 + -