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