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

📄 model.cpp

📁 3D赛车游戏源代码-用Visual Studio 2005
💻 CPP
字号:
#include "StdAfx.h"
#include "Model.h"
#include "TriMesh.h"
#include "OGLutil.h"
#include "../res/3ds.h"
#include "../res/Texture.h"

//-------------------------------------------------------------------------------
// 构造函数
//-------------------------------------------------------------------------------
Model::Model() 
{
	m_partCount = 0;
	m_partMeshList = NULL;
	m_partTextureList = NULL;
}


//-------------------------------------------------------------------------------
// 析构函数
//-------------------------------------------------------------------------------
Model::~Model() 
{
	FreeMemory();
}


//-------------------------------------------------------------------------------
// 分配需要的内存
//-------------------------------------------------------------------------------
void Model::AllocateMemory(int nPartCount) 
{
	FreeMemory();

	if (nPartCount < 1) 
	{
		return;
	}

	m_partMeshList = new TriMesh[nPartCount];
	m_partTextureList = new TextureReference[nPartCount];

	// 清空纹理表数据
	memset(m_partTextureList, 0, sizeof(m_partTextureList[0]) * nPartCount);
	m_partCount = nPartCount;
}


//-------------------------------------------------------------------------------
// 释放内存
//-------------------------------------------------------------------------------
void Model::FreeMemory() 
{
	delete [] m_partMeshList;
	m_partMeshList = NULL;
	delete [] m_partTextureList;
	m_partTextureList = NULL;
	m_partCount = 0;
}

//-------------------------------------------------------------------------------
// 获取网孔部件
//-------------------------------------------------------------------------------
TriMesh	*Model::GetPartMesh(int index) 
{
	assert(index >= 0);
	assert(index < m_partCount);
	assert(m_partMeshList != NULL);

	return &m_partMeshList[index];
}

//-------------------------------------------------------------------------------
// 获取纹理部件
//-------------------------------------------------------------------------------
TextureReference *Model::GetPartTexture(int index) 
{
	assert(index >= 0);
	assert(index < m_partCount);
	assert(m_partTextureList != NULL);

	return &m_partTextureList[index];
}

//-------------------------------------------------------------------------------
// 设置纹理部件名
//-------------------------------------------------------------------------------
void Model::SetPartTextureName(int index, const char *name) 
{
	assert(index >= 0);
	assert(index < m_partCount);
	assert(m_partTextureList != NULL);

	strcpy(m_partTextureList[index].name, name);
}

//-------------------------------------------------------------------------------
// Cache 纹理
//-------------------------------------------------------------------------------
void Model::Cache() const 
{
}

//-------------------------------------------------------------------------------
// 渲染模型
//-------------------------------------------------------------------------------
void Model::Render() const 
{
	for (int i = 0 ; i < m_partCount ; ++i) 
	{
		RenderPart(i);
	}
}


//-------------------------------------------------------------------------------
// 渲染部件
//-------------------------------------------------------------------------------
void Model::RenderPart(int index) const 
{
	assert(index >= 0);
	assert(index < m_partCount);
	assert(m_partMeshList != NULL);
	assert(m_partTextureList != NULL);

	g_Renderer.SelectTexture(m_partTextureList[index]);
	m_partMeshList[index].Render();
}

//-------------------------------------------------------------------------------
// 快捷导入一个3DS模型
//-------------------------------------------------------------------------------
void Model::Import3DS(const char *modelFilename)
{
	t3DModel model;
	printf("%s: \n", modelFilename);
	g_Load3DS.Import3DS(&model, modelFilename);
	FromT3DModel(model);
}

//-------------------------------------------------------------------------------
// 从3DS文件模型转换过来
//-------------------------------------------------------------------------------
void Model::FromT3DModel(t3DModel &model)
{
	int partCount = model.numOfObjects;
	AllocateMemory(partCount);

	for (int i=0; i<partCount; ++i)
	{
		t3DObject &obj = model.pObject[i];
		TriMesh &mesh = m_partMeshList[i];
		TextureReference &texRef = m_partTextureList[i];

		if (obj.bHasTexture)
		{
			tMaterialInfo &material = model.pMaterials[obj.materialID];
			strcpy(texRef.name, material.strFile);
			g_TextureManager.LoadTexture(&texRef);
		}

		int numVerts = obj.numOfVerts;
		int numTris  = obj.numOfFaces;

		// 3DS文件一般是顶点和纹理顶点数目一样。
		assert(numVerts == obj.numTexVertex); 

		mesh.AllocateMemory(numVerts, numTris);
		RenderVertex* verList = mesh.GetVertexList();
		RenderTri* triList    = mesh.GetTriList();

		for (int j=0; j<numVerts; ++j)
		{
			verList[j].p.x = obj.pVerts[j].x;
			verList[j].p.y = obj.pVerts[j].y;
			verList[j].p.z = obj.pVerts[j].z;
			verList[j].u   = obj.pTexVerts[j].x;
			verList[j].v   = obj.pTexVerts[j].y;
		}

		for (int j=0; j<numTris; ++j)
		{
			triList[j].index[0] = obj.pFaces[j].vertIndex[0];
			triList[j].index[1] = obj.pFaces[j].vertIndex[1];
			triList[j].index[2] = obj.pFaces[j].vertIndex[2];
		}

		mesh.ComputeBoundingBox();

		const AABB3& box = mesh.GetBoundingBox();
		Vector3 center = box.Center();
		Vector3 size = box.Size();
		printf("box: min(%4.4f, %4.4f, %4.4f),"
			" max(%4.4f, %4.4f, %4.4f).\n"
			"center(%4.4f, %4.4f, %4.4f), "
			"size(%4.4f, %4.4f, %4.4f)\n\n",
			box.min.x, box.min.y, box.min.z, 
			box.max.x, box.max.y, box.max.z,
			center.x, center.y, center.z, 
			size.x, size.y, size.z);
	}
}

⌨️ 快捷键说明

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