📄 load3ds.h
字号:
// Load3DS.h: interface for the CLoad3DS class.
// 原始代码来自:GameTutorials
// 改编:
// 沈阳蓝雨视景科技
// http://www.bvrain.com
// bvrain@163.com chglei@163.com
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_LOAD3DS_H__69E7E7AC_7A07_4479_9687_AC19CED0E3CF__INCLUDED_)
#define AFX_LOAD3DS_H__69E7E7AC_7A07_4479_9687_AC19CED0E3CF__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "3dmath.h"
//向量STL
#include <vector>
using namespace std;
//>------ Primary Chunk, at the beginning of each file
#define PRIMARY 0x4D4D
//>------ Main Chunks
#define OBJECTINFO 0x3D3D // This gives the version of the mesh and is found right before the material and object information
#define VERSION 0x0002 // This gives the version of the .3ds file
#define EDITKEYFRAME 0xB000 // This is the header for all of the key frame info
//>------ sub defines of OBJECTINFO
#define MATERIAL 0xAFFF // This stored the texture info
#define OBJECT 0x4000 // This stores the faces, vertices, etc...
//>------ sub defines of MATERIAL
#define MATNAME 0xA000 // This holds the material name
#define MATDIFFUSE 0xA020 // This holds the color of the object/material
#define MATMAP 0xA200 // This is a header for a new material
#define MATMAPFILE 0xA300 // This holds the file name of the texture
//********************** 新增加标志 ***********************
#define MAT_AMBIENT 0xA010
#define MAT_SPECULAR 0xA030
#define MAT_EMISSIVE 0xA040
//********************** 新增加标志 ***********************
#define OBJECT_MESH 0x4100 // This lets us know that we are reading a new object
//>------ sub defines of OBJECT_MESH
#define OBJECT_VERTICES 0x4110 // The objects vertices
#define OBJECT_FACES 0x4120 // The objects faces
#define OBJECT_MATERIAL 0x4130 // This is found if the object has a material, either texture map or color
#define OBJECT_UV 0x4140 // The UV texture coordinates
// 加载3DS文件类
class CLoad3DS
{
//把这几个结构体声明到类里面,使封装更彻底
public:
// Here is our structure for our 3DS indicies (since .3DS stores 4 unsigned shorts)
struct tIndices {
unsigned short a, b, c, bVisible; // This will hold point1, 2, and 3 index's into the vertex array plus a visible flag
};
// This holds the chunk info
struct tChunk
{
unsigned short int ID; // The chunk's ID
unsigned int length; // The length of the chunk
unsigned int bytesRead; // The amount of bytes read within that chunk
};
// This is our face structure. This is is used for indexing into the vertex
// and texture coordinate arrays. From this information we know which vertices
// from our vertex array go to which face, along with the correct texture coordinates.
struct tFace
{
int vertIndex[3]; // indicies for the verts that make up this triangle
int coordIndex[3]; // indicies for the tex coords to texture this face
};
//材料信息类
struct tMaterialInfo
{
char strName[255]; // The texture name
char strFile[255]; // The texture file name (If this is set it's a texture map)
BYTE color[3]; // The color of the object (R, G, B)
//添加以下四个元素
float ambient[4]; // 泛光
float diffuse[4]; // 散光
float specular[4]; // 反光
float emissive[4]; // 发光(一般为0,0,0,1)
int texureId; // the texture ID
float uTile; // u tiling of texture (Currently not used)
float vTile; // v tiling of texture (Currently not used)
float uOffset; // u offset of texture (Currently not used)
float vOffset; // v offset of texture (Currently not used)
} ;
//材料引用类
class tMatREF
{
public:
int nMaterialID;
USHORT *pFaceIndexs;
int nFaceNum;
bool bHasTexture;
public:
tMatREF()
{
nMaterialID=-1;
nFaceNum=0;
pFaceIndexs=NULL;
bHasTexture=false;
}
};
// This holds all the information for our model/scene.
// You should eventually turn into a robust class that
// has loading/drawing/querying functions like:
struct t3DObject
{
int numOfVerts; // The number of verts in the model
int numOfFaces; // The number of faces in the model
int numTexVertex; // The number of texture coordinates
int numOfMaterials; // the 材料数量
int materialID; // The texture ID to use, which is the index into our texture array
bool bHasTexture; // This is TRUE if there is a texture map for this object
char strName[255]; // The name of the object
CVector3 *pVerts; // The object's vertices
CVector3 *pNormals; // The object's normals
CVector2 *pTexVerts; // The texture's UV coordinates
tFace *pFaces; // The faces information of the object
tMatREF *pMaterialREFS;// 材料IDS
};
// This holds our model information. This should also turn into a robust class.
// We use STL's (Standard Template Library) vector class to ease our link list burdens. :)
struct t3DModel
{
int numOfObjects; // The number of objects in the model
int numOfMaterials; // The number of materials for the model
//改名了
vector<tMaterialInfo> vctMaterials; // The list of material information (Textures and colors)
vector<t3DObject> vctObjects; // The object list for our model
};
public:
void Bytes2Floats(BYTE *pbs,float *pfs,int num,float fsk);
//构造
CLoad3DS();
//析构
~CLoad3DS();
// 载入3ds文件
bool Import3DS(t3DModel *pModel, char *strFileName);
private:
// This reads in a string and saves it in the char array passed in
int GetString(char *);
// This reads the next chunk
void ReadChunk(tChunk *);
// This reads the next large chunk
void ProcessNextChunk(t3DModel *pModel, tChunk *);
// This reads the object chunks
void ProcessNextObjectChunk(t3DModel *pModel, t3DObject *pObject, tChunk *);
// This reads the material chunks
void ProcessNextMaterialChunk(t3DModel *pModel, tChunk *);
// This reads the RGB value for the object's color
// 改造了,添加了一个标志
void ReadColorChunk(tMaterialInfo *pMaterial, tChunk *pChunk,USHORT typeFlag=0);
// This reads the objects vertices
void ReadVertices(t3DObject *pObject, tChunk *);
// This reads the objects face information
void ReadVertexIndices(t3DObject *pObject, tChunk *);
// This reads the texture coodinates of the object
void ReadUVCoordinates(t3DObject *pObject, tChunk *);
// This reads in the material name assigned to the object and sets the materialID
void ReadObjectMaterial(t3DModel *pModel, t3DObject *pObject, tChunk *pPreviousChunk,vector<tMatREF*> *pvmatids);
// This computes the vertex normals for the object (used for lighting)
void ComputeNormals(t3DModel *pModel);
// This frees memory and closes the file
void CleanUp();
// The file pointer
FILE *m_FilePointer;
};
#endif // !defined(AFX_LOAD3DS_H__69E7E7AC_7A07_4479_9687_AC19CED0E3CF__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -