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

📄 mesh.cpp

📁 使用shader语言在vs阶段编写光照效果的演示程序及全部源代码
💻 CPP
字号:
#include "D3DBase.h"
#include "mesh.h"
#include <fstream>
using namespace std;


#define MAKERGBA(r,g,b,a)  ((COLORREF)((((BYTE)(r)|( (WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))|(((DWORD)(BYTE)(a))<<24)))

bool CD3DMesh::calcBoundBox(sVertex_t * pVertex , int nVertex)
{
	m_VertexMin.x = pVertex[0].x;
	m_VertexMin.y = pVertex[0].y;
	m_VertexMin.z = pVertex[0].z;


	m_VertexMax.x = pVertex[0].x;
	m_VertexMax.y = pVertex[0].y;
	m_VertexMax.z = pVertex[0].z;


	for(int i = 1 ; i < nVertex ; i ++)
	{
		if(pVertex[i].x > m_VertexMax.x)  m_VertexMax.x = pVertex[i].x;
		if(pVertex[i].y > m_VertexMax.y)  m_VertexMax.y = pVertex[i].y;
		if(pVertex[i].z > m_VertexMax.z)  m_VertexMax.z = pVertex[i].z;

		if(pVertex[i].x < m_VertexMin.x)  m_VertexMin.x = pVertex[i].x;
		if(pVertex[i].y < m_VertexMin.y)  m_VertexMin.y = pVertex[i].y;
		if(pVertex[i].z < m_VertexMin.z)  m_VertexMin.z = pVertex[i].z;

	}
	return true;

}

bool CD3DMesh::load(const char* filename)
{




	IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
	m_Stride = sizeof(sVertex_t);

	D3DVERTEXELEMENT9 dwDecl[] = 
	{
		{0, 0 ,  D3DDECLTYPE_FLOAT3  ,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION , 0},
		{0, 12,  D3DDECLTYPE_FLOAT3  ,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL   , 0},
		{0, 24,  D3DDECLTYPE_FLOAT3  ,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT  , 0},
		{0, 36,  D3DDECLTYPE_D3DCOLOR,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR    , 0},
		{0, 40,  D3DDECLTYPE_FLOAT2  ,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD , 0},
		D3DDECL_END()
	};

	pDevice->CreateVertexDeclaration(dwDecl, &m_pVertexDecl);
	pDevice->SetVertexDeclaration(m_pVertexDecl);


	ifstream inFile;
	inFile.open(filename , ios::binary);
	if(inFile.fail())
		return false;

	sMaterial_t mat;
	sModel_t model;
	inFile.read((char*)&model,sizeof(model));
	inFile.read((char*)&mat,sizeof(mat));


	sVertex_t* pVertex = new sVertex_t [model.nVertex];
	m_pVertexBuffers = new LPDIRECT3DVERTEXBUFFER9[model.nFrame];
	HRESULT hr;
	for(int iFrame = 0 ;iFrame < model.nFrame ; iFrame ++)
	{
		hr = pDevice->CreateVertexBuffer(model.nVertex * sizeof(sVertex_t) , 0 , 0 , D3DPOOL_MANAGED,&m_pVertexBuffers[iFrame],NULL);
		if(FAILED(hr))
		{
			return false;
		}


		inFile.read((char*)pVertex, sizeof(sVertex_t)*model.nVertex);
		void* pVertexData = NULL;
		hr = m_pVertexBuffers[iFrame]->Lock(0,model.nVertex * sizeof(sVertex_t),(void**)&pVertexData,D3DLOCK_NOSYSLOCK);
		memcpy(pVertexData,pVertex,model.nVertex * sizeof(sVertex_t));
		m_pVertexBuffers[iFrame]->Unlock();

		//计算出包围盒
		calcBoundBox(pVertex,model.nVertex);
	}


	//记录需要用到的数据。材质,面的数目等
	m_Material = mat.m_Mat;
	m_nFace    = model.nVertex / 3;
	m_nFrame   = model.nFrame;

	delete[] pVertex;
	loadTexture(mat.m_TextureName);
	return true;
}
void CD3DMesh::setState()
{
	IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
	pDevice->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE);
	pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
	pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
	pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
	pDevice->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000001);
	pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); 
	pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
}

void CD3DMesh::endSetState()
{
	IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
	pDevice->SetRenderState(D3DRS_ALPHATESTENABLE,FALSE);
	pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
}
void CD3DMesh::getTransform(D3DXMATRIX* mat)
{
	*mat = m_WorldMatrix;
}

void CD3DMesh::render(long passedTime)
{
	setState();
	m_iCurFrame +=  int(passedTime/1000.0f * 24);
	int iCurFrame = (int)m_iCurFrame;
	iCurFrame %= m_nFrame;
	IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
	pDevice->SetTransform(D3DTS_WORLD,&m_WorldMatrix);
	pDevice->SetMaterial(&m_Material);
	pDevice->SetVertexDeclaration(m_pVertexDecl);
	pDevice->SetStreamSource(0,m_pVertexBuffers[iCurFrame],0,m_Stride);
	pDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,m_nFace);
	endSetState();

}
void CD3DMesh::loadTexture(const char* pTextureName)
{
	m_pTexture = NULL;
	IDirect3DDevice9* pDevice = CD3DApplication::getApp()->getDevice();
	D3DXCreateTextureFromFile(pDevice,pTextureName,&m_pTexture);
}

bool CD3DMesh::release()
{
	for(int iFrame = 0 ;iFrame < m_nFrame ; iFrame ++)
	{
		m_pVertexBuffers[iFrame]->Release();
		m_pVertexBuffers[iFrame] = NULL;
	}
	delete [] m_pVertexBuffers;
	if(m_pTexture)
		m_pTexture->Release();
	m_pTexture=NULL;
	if(m_pVertexDecl)
		m_pVertexDecl->Release();
	m_pVertexDecl=NULL;

	return true;
}

⌨️ 快捷键说明

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