📄 game_mesh.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 + -