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

📄 model.cpp

📁 Battle Balls v1.0 nice
💻 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 + -