📄 model.cpp
字号:
#include "model.h"
CModel::CModel(char *File,IDirect3DDevice9 *device,bool pmesh)
{
pm=pmesh;
Device=device;
HRESULT hr;
ID3DXBuffer *mtrlBuf=0;
ID3DXBuffer *adjBuf=0;
DWORD NumMtrls=0;
hr=D3DXLoadMeshFromX(File,D3DXMESH_MANAGED,Device,&adjBuf,&mtrlBuf,0,&NumMtrls,&Mesh);
if(FAILED(hr))
{
MessageBox(0, "D3DXCreateMeshFromX() - FAILED", 0, 0);
PostQuitMessage(0);
}
if(!(Mesh->GetFVF()&D3DFVF_NORMAL))
{
ID3DXMesh *pTemp=0;
Mesh->CloneMeshFVF(D3DXMESH_MANAGED,Mesh->GetFVF()|D3DFVF_NORMAL,Device,&pTemp);
Mesh->Release();
Mesh=pTemp;
pTemp->Release();
pTemp=0;
}
if(mtrlBuf!=0&&NumMtrls!=0)
{
char buf[100];
D3DXMATERIAL *mtrls=(D3DXMATERIAL*)mtrlBuf->GetBufferPointer();
for(int i=0;i<NumMtrls;i++)
{
mtrls[i].MatD3D.Ambient=mtrls[i].MatD3D.Diffuse;
mtrls[i].MatD3D.Power=5;
Mtrls.push_back(mtrls[i].MatD3D);
if(mtrls[i].pTextureFilename!=0)
{
IDirect3DTexture9 *tex=0;
sprintf(buf,"%s",mtrls[i].pTextureFilename);
D3DXCreateTextureFromFile(Device,buf,&tex);
Textures.push_back(tex);
}
else
Textures.push_back(0);
}
}
mtrlBuf->Release();
hr = Mesh->OptimizeInplace(
D3DXMESHOPT_ATTRSORT |
D3DXMESHOPT_COMPACT |
D3DXMESHOPT_VERTEXCACHE,
(DWORD*)adjBuf->GetBufferPointer(),
(DWORD*)adjBuf->GetBufferPointer(), 0, 0);
if(FAILED(hr))
{
MessageBox(0, "OptimizeInplace() - FAILED", 0, 0);
PostQuitMessage(0);
adjBuf->Release();
}
if(pmesh)
{
hr = D3DXGeneratePMesh(Mesh,(DWORD*)adjBuf->GetBufferPointer(),0,0,1,
D3DXMESHSIMP_FACE,&pMesh);
if(FAILED(hr))
{
MessageBox(0, "D3DXGeneratePMesh() - FAILED", 0, 0);
PostQuitMessage(0);
}
pMesh->SetNumFaces(pMesh->GetMaxFaces());
if(Mesh)
Mesh->Release();
}
if(adjBuf)
adjBuf->Release();
//init vectors
vecRot=D3DXVECTOR3(0,0,0);
vecPos=D3DXVECTOR3(0,0,0);
vecScale=D3DXVECTOR3(1,1,1);
look = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
ComputeBoundingSphere(Mesh,&BS);
}
CModel::~CModel(void)
{
if(pMesh)
pMesh->Release();
if(Mesh)
Mesh->Release();
for(int i = 0; i < Textures.size(); i++)
Textures[i]->Release();
}
void CModel::Draw()
{
D3DXMATRIX World;
D3DXMATRIX Scale;
D3DXMATRIX pos;
D3DXMATRIX Rx;
D3DXMATRIX Ry;
D3DXMATRIX Rz;
D3DXMatrixRotationX(&Rx,vecRot.x);
D3DXMatrixRotationY(&Ry,vecRot.y);
D3DXMatrixRotationZ(&Rz,vecRot.z);
D3DXMatrixTranslation(&pos,vecPos.x,vecPos.y,vecPos.z);
D3DXMatrixScaling(&Scale,vecScale.x,vecScale.y,vecScale.z);
World=Rx*Ry*Rz*pos*Scale;
Device->SetTransform(D3DTS_WORLD,&World);
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,alpha);
for(int i=0;i<Mtrls.size();i++)
{
Mtrls[i].Diffuse.a=alphaLevel;
Device->SetMaterial(&Mtrls[i]);
Device->SetTexture(0,Textures[i]);
if(pm)
pMesh->DrawSubset(i);
else
Mesh->DrawSubset(i);
}
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
}
void CModel::walk(float units)
{
vecPos += D3DXVECTOR3(look.x, 0.0f, look.z) * units;
}
void CModel::yaw(float angle)
{
D3DXMATRIX T;
D3DXMatrixRotationY(&T, angle);
D3DXVec3TransformCoord(&look,&look, &T);
}
bool CModel::ComputeBoundingSphere(ID3DXMesh* mesh, BoundingSphere* sphere)
{
HRESULT hr = 0;
BYTE* v = 0;
mesh->LockVertexBuffer(0, (void**)&v);
hr = D3DXComputeBoundingSphere(
(D3DXVECTOR3*)v,
mesh->GetNumVertices(),
D3DXGetFVFVertexSize(mesh->GetFVF()),
&sphere->_center,
&sphere->_radius);
mesh->UnlockVertexBuffer();
if( FAILED(hr) )
return false;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -