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

📄 game_mesh.cpp

📁 我做的毕业设计
💻 CPP
字号:
#include "Game_User.h"

CMesh::CMesh(LPDIRECT3DDEVICE9 pD3DDevice, LPSTR pFilename)
{
	LPD3DXBUFFER pMaterialsBuffer = NULL;
	LPD3DXMESH pMesh = NULL;	

	m_pD3DDevice = pD3DDevice;
	m_vMax=D3DXVECTOR3(0,0,0);
	m_vMin=D3DXVECTOR3(0,0,0);
	if(FAILED(D3DXLoadMeshFromX(pFilename, D3DXMESH_SYSTEMMEM, m_pD3DDevice, NULL, 
                                &pMaterialsBuffer,NULL, &m_dwNumMaterials, &pMesh)))
	{
		m_pMesh = NULL;
		m_pMeshMaterials = NULL;
		m_pMeshTextures = NULL;
		return;
	}
	
    D3DXMATERIAL* matMaterials = (D3DXMATERIAL*)pMaterialsBuffer->GetBufferPointer();
    
	//保存纹理和材质信息
	m_pMeshMaterials = new D3DMATERIAL9[m_dwNumMaterials];
    m_pMeshTextures  = new LPDIRECT3DTEXTURE9[m_dwNumMaterials];

    for(DWORD i = 0; i < m_dwNumMaterials; i++)
    {
        // 拷贝材质
        m_pMeshMaterials[i] = matMaterials[i].MatD3D;

        // 设置环境光
		m_pMeshMaterials[i].Ambient = m_pMeshMaterials[i].Diffuse;

		// 创建纹理
        if(FAILED(D3DXCreateTextureFromFile(m_pD3DDevice, 
                                            matMaterials[i].pTextureFilename, 
                                            &m_pMeshTextures[i])))
        {
            m_pMeshTextures[i] = NULL;
        }
    }
    //释放缓冲
    SAFE_RELEASE(pMaterialsBuffer);
	//优化
	pMesh->OptimizeInplace(D3DXMESHOPT_COMPACT|D3DXMESHOPT_ATTRSORT|D3DXMESHOPT_DONOTSPLIT|D3DXMESHOPT_DEVICEINDEPENDENT,
		NULL, NULL, NULL, NULL);
	//重新设置法线信息
	pMesh->CloneMeshFVF(D3DXMESH_MANAGED, MESH_D3DFVF_CUSTOMVERTEX, m_pD3DDevice, &m_pMesh);
	SAFE_RELEASE(pMesh);

	D3DXComputeNormals(m_pMesh,NULL);
	CalculateStaticBondingBox(m_pMesh, &m_vMin, &m_vMax);
}

CMesh::~CMesh()
{
	SAFE_DELETE(m_pMeshMaterials);

	if(m_pMeshTextures != NULL)
	{
		for(DWORD i = 0; i < m_dwNumMaterials; i++)
		{
			if(m_pMeshTextures[i])
			{
				SAFE_RELEASE(m_pMeshTextures[i]);
			}
		}
	}

	SAFE_DELARRAY(m_pMeshTextures);
	SAFE_RELEASE(m_pMesh);
}
//渲染
DWORD CMesh::Render()
{
	if(m_pMesh != NULL)
	{
		for(DWORD i = 0; i < m_dwNumMaterials; i++)
		{
			m_pD3DDevice->SetMaterial(&m_pMeshMaterials[i]);
			m_pD3DDevice->SetTexture(0, m_pMeshTextures[i]);        
			m_pMesh->DrawSubset(i);
		}
		return m_pMesh->GetNumFaces();
	}
	else
	{
		return 0;
	}
}

//设置世界变换
void CMesh::setTransform(float setScaling, float x, float y, float z, float angle)
{
	D3DXMATRIX matScale;
	m_fScale = setScaling;
	D3DXMatrixScaling(&matScale, setScaling,setScaling,setScaling);
	D3DXMATRIX matRotation;
	D3DXMatrixRotationY(&matRotation, angle);
	m_vRotation = D3DXVECTOR3(cosf(angle), 0, sinf(angle));
	D3DXMatrixMultiply(&matRotation, &matRotation, &matScale);
	D3DXMATRIX matWorld;
	D3DXMatrixTranslation(&matWorld, x, y, z);

	m_vPos = D3DXVECTOR3(x, y, z);
	D3DXMatrixMultiply(&matWorld ,&matRotation, &matWorld);
    m_pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld);
	m_p1MatMesh = matWorld;

}
void CMesh::setTransform(float setScaling, float x, float y, float z, float angle,D3DXMATRIX *ViewMatrix)
{
	D3DXMATRIX matScale ,matBillboard;
	D3DXMatrixIdentity( &matBillboard ); 
	matBillboard._11 = (*ViewMatrix)._11;
	matBillboard._13 = (*ViewMatrix)._13;
	matBillboard._31 = (*ViewMatrix)._31;
	matBillboard._33 = (*ViewMatrix)._33;
	D3DXMatrixInverse( &matBillboard, NULL, &matBillboard );
	m_fScale = setScaling;
	D3DXMatrixScaling(&matScale, setScaling,setScaling,setScaling);
	D3DXMATRIX matRotation;
	D3DXMatrixRotationY(&matRotation, angle);
	m_vRotation = D3DXVECTOR3(cosf(angle), 0, sinf(angle));
	D3DXMatrixMultiply(&matRotation, &matRotation, &matScale);
	D3DXMatrixMultiply(&matRotation, &matRotation, &matBillboard);
	D3DXMATRIX matWorld;
	D3DXMatrixTranslation(&matWorld, x, y, z);

	m_vPos = D3DXVECTOR3(x, y, z);
	D3DXMatrixMultiply(&matWorld ,&matRotation, &matWorld);
	m_pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld);
	m_p2MatMesh = matWorld;
}
//得到左下点和右上点坐标
HRESULT CMesh::CalculateStaticBondingBox(LPD3DXMESH pMesh, const LPD3DXVECTOR3 pVmin,const LPD3DXVECTOR3 pVmax)
{
	static D3DXVECTOR3 *pV; 
	static D3DXVECTOR3 vTransformed;
	pMesh->LockVertexBuffer(0,(void**)&pV); 
	DWORD nVertex=pMesh->GetNumVertices();
	DWORD nStride=pMesh->GetNumBytesPerVertex();
	DWORD i;
	for(i=0;i<nVertex;i++)
	{
		vTransformed.x=pV->x;
		vTransformed.y=pV->y;
		vTransformed.z=pV->z;

		if		 (vTransformed.x<pVmin->x)	pVmin->x=vTransformed.x;
		else if  (vTransformed.x>pVmax->x)	pVmax->x=vTransformed.x;

		if		(vTransformed.y<pVmin->y)	pVmin->y=vTransformed.y;
		else if	(vTransformed.y>pVmax->y)	pVmax->y=vTransformed.y;

		if		(vTransformed.z<pVmin->z)	pVmin->z=vTransformed.z;
		else if	(vTransformed.z>pVmax->z)	pVmax->z=vTransformed.z;
		pV=(D3DXVECTOR3*)((BYTE*)pV+nStride);
	}
	pMesh->UnlockVertexBuffer(); 
	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -