📄 3dsloader.h
字号:
//----------------------------------------------------------------------------
//
// 版权所有 Copyright (c) 2003
// Leon Lee
// Leon8086 in CSDN
//
// 允许在不必征得作者的同意的情况下使用、拷贝、分发该代码,或将将该代码使用
// 于除了商业用途之外的其他用途,但请将以上这些说明放置于所有的拷贝之上。
// 未征得作者同意,请勿将该代码用于商业用途。
//
// 允许在该代码基础上进行修改,或在此基础上进行二次开发,但请保持本说明,保证所进行的
// 修改是在本版权说明允许的范围之内的,并保证所开发代码也遵循上述版权说明。
//----------------------------------------------------------------------------
#if !defined _GL3DSLOADER_H_
#define _GL3DSLOADER_H_
#ifndef _BYTE_DEFINED
#define _BYTE_DEFINED
typedef unsigned char BYTE;
#endif
#ifndef _WORD_DEFINED
#define _WORD_DEFINED
typedef unsigned short WORD;
#endif
#ifndef _DWORD_DEFINED
#define _DWORD_DEFINED
typedef unsigned long DWORD;
#endif
#ifndef _HRESULT_DEFINED
#define _HRESULT_DEFINED
typedef long HRESULT;
#endif
#include <string>
#include <list>
#include <fstream>
extern const DWORD MESH_USINGTEXCOORD; /* == 0x00000001 */
extern const long GL3DSLOADERERR_CANNOTOPENFILE; /* == 0x80000000 | 0x00000001*/
extern const long GL3DSLOADERERR_NOT3DSFILE; /* == 0x80000000 | 0x00000002*/
extern const long GL3DSLOADERERR_IOERROR; /* == 0x80000000 | 0x00000003*/
using namespace std;
struct GL3DSMATERIAL
{
bool m_IsOK;
float m_lpAmbient[4]; //环境
float m_lpDiffuse[4]; //散射
float m_lpSpecular[4]; //反射
DWORD m_dwTexture; //纹理索引
};
class CGL3DSLoader
{
protected:
//data type define
struct MESHDATA //描述网格对象的中间数据类型
{
DWORD dwVertexNum;
DWORD dwFaceNum;
DWORD dwFlags;
DWORD dwMaterialNum;
string* lpMaterialName;
DWORD* lpMaterialID;
DWORD** lplpFaceMaterialIndex;
DWORD* lpFaceMaterialNum;
GLVERTEX3* lpVertex;
GLTEXCOORD* lpTexcoord;
MESHTRIANGLEINDEX*
lpTriangles;
string strName;
GLVERTEX3 vtxCenter;
MESHDATA();
~MESHDATA();
};
struct MATERIALDATA //描述材质对象的中间数据类型
{
float pAmbient[4];
float pDiffuse[4];
float pSpecular[4];
string strName;
string strTexture;
float fOffsetU;
float fOffsetV;
float fTilingU;
float fTilingV;
float fRotationW;
MATERIALDATA();
};
//一些常量的定义
enum
{
CHUNK_RGB1 = 0x0010, // 3 floats of RGB
CHUNK_RGB2 = 0x0011, // 3 bytes of RGB
CHUNK_RGB3 = 0x0012, //?
CHUNK_AMOUNT = 0x0030,
CHUNK_MAIN = 0x4D4D, //主块(==整个文件)
CHUNK_OBJMESH = 0x3D3D, //ObjMesh
CHUNK_BKGCOLOR = 0x1200,
CHUNK_AMBCOLOR = 0x2100,
CHUNK_OBJBLOCK = 0x4000, //物体块
CHUNK_TRIMESH = 0x4100, //网格块
CHUNK_VERTLIST = 0x4110, //顶点块
CHUNK_FACELIST = 0x4120, //面列表块
CHUNK_FACEMAT = 0x4130, //面材质块
CHUNK_MAPLIST = 0x4140,
CHUNK_SMOOLIST = 0x4150,
CHUNK_TRMATRIX = 0x4160,
CHUNK_LIGHT = 0x4600,
CHUNK_SPOTLIGHT = 0x4610,
CHUNK_CAMERA = 0x4700,
CHUNK_MATERIAL = 0xAFFF, //材质块
CHUNK_MATNAME = 0xA000,
CHUNK_AMBIENT = 0xA010,
CHUNK_DIFFUSE = 0xA020, //diffuse
CHUNK_SPECULAR = 0xA030,
CHUNK_SHININESS = 0xA040,
CHUNK_SHINE_STRENGTH= 0xA041,
CHUNK_DOUBLESIDED = 0xA081,
CHUNK_TEXTURE = 0xA200, //贴图块
CHUNK_BUMPMAP = 0xA230,
CHUNK_MAPFILENAME = 0xA300,
CHUNK_MAPOPTIONS = 0xA351,
CHUNK_TILINGU = 0xA354, //U方向缩放系数
CHUNK_TILINGV = 0xA356, //V方向缩放系数
CHUNK_OFFSETU = 0xA358, //U方向偏移系数
CHUNK_OFFSETV = 0xA35A, //V方向偏移系数
CHUNK_ROTATEW = 0xA35C, //W方向旋转角
CHUNK_KEYFRAMER = 0xB000, //关键帧块
};
//attributes
//Material
DWORD m_dwMaterialNum; //定义材质的数目
GL3DSMATERIAL* m_lpMaterial; //材质数组
//Texture
DWORD m_dwTextureNum; //使用纹理的数目
string* m_lpstrTexture; //纹理名称字符串
//Object
DWORD m_dwObjectNum; //网格物体的数目
string* m_lpstrName; //网格物体的名称字符串
DWORD* m_lpVertexNum; //每个物体的顶点数目
DWORD* m_lpFaceNum; //每个物体的面数目
DWORD* m_lpFlags; //物体的属性
GLVERTEX3** m_lplpVertex; //物体的顶点数组
GLTEXCOORD** m_lplpTexcoord; //物体的纹理坐标数组
MESHTRIANGLEINDEX**
m_lplpFaceIndex; //物体的面索引数组
DWORD* m_lpFaceMaterialNum; //面使用的材质的数目
DWORD** m_lplpFaceMaterialID; //面材质的ID
DWORD** m_lplpFaceMaterialBegin;//对应的每个面材质的起始面索引
DWORD** m_lplpFaceMaterialEnd; //对应的每个面材质的结束面索引
bool m_IsOK; //是否成功建立
//operator
//文件处理函数
DWORD Seek3DSChunk( fstream& , WORD, DWORD ); //找指定块
MESHDATA* Read3DSObjectChunk( fstream&, DWORD ); //读取物体块
MATERIALDATA* Read3DSMaterialChunk( fstream&, DWORD ); //读取材质块
bool Read3DSTextureChunk( fstream&, DWORD, MATERIALDATA* ); //读取纹理块
bool Read3DSColorChunk( fstream&, WORD, float&, float&, float& ); //读取颜色块
bool Read3DSFaceListChunk( fstream&, DWORD, MESHDATA* ); //读取面块
HRESULT LoadData( string, MATERIALDATA**&, MESHDATA**&, DWORD&, DWORD& );//导入文件数据生成中间数据
//重新生成网格
void GenerateData( DWORD, const MESHDATA*, const MATERIALDATA* const* );//根据中间数据填充this对象
void RebuildMesh(const MESHDATA*, //重排顶点和面索引
const MATERIALDATA* const *,
list<GLVERTEX3>*&,
list<GLTEXCOORD>*&,
MESHTRIANGLEINDEX**& );
GLTEXCOORD TranslateTexcoord( const GLTEXCOORD&, float, float, float, float, float);//将局部纹理坐标映射到全局纹理坐标
public:
//constructor
CGL3DSLoader();
CGL3DSLoader( string );
//distructor
~CGL3DSLoader();
//create Object;
HRESULT Create( string );
//clean object
void Cleanup( void );
//output
//*******************************Assert********************************************
inline bool IsOK()const;
//*****************************Material************************************************
inline DWORD GetMaterialNum()const;
inline const GL3DSMATERIAL* GetMaterial( DWORD dwIndex)const;
//*****************************Texture************************************************
inline DWORD GetTextureNum( )const;
inline string GetTexture( DWORD dwIndex )const;
//*****************************Object************************************************
inline DWORD GetObjectNum()const;
inline string GetObjectName( DWORD dwIndex )const;
inline DWORD GetFlags( DWORD dwIndex)const;
//*****************************Vertex************************************************
inline DWORD GetVertexNum( DWORD dwIndex )const;
inline const GLVERTEX3* GetVertexList( DWORD dwIndex ) const;
inline const GLTEXCOORD* GetTexcoordList( DWORD dwIndex ) const;
//*****************************Face************************************************
inline DWORD GetFaceNum( DWORD dwIndex )const;
inline const MESHTRIANGLEINDEX* GetFaceIndex( DWORD dwIndex)const;
inline DWORD GetFaceMaterialNum( DWORD dwIndex )const;
inline const DWORD* GetFaceMaterialID( DWORD dwIndex )const;
inline const DWORD* GetFaceMaterialBegin( DWORD dwIndex )const;
inline const DWORD* GetFaceMaterialEnd( DWORD dwIndex )const;
};
inline bool CGL3DSLoader::IsOK()const
{
return m_IsOK;
}
//material
inline DWORD CGL3DSLoader::GetMaterialNum()const
{
if(m_IsOK)
return m_dwMaterialNum;
return 0;
};
inline const GL3DSMATERIAL* CGL3DSLoader::GetMaterial( DWORD dwIndex )const
{
if(m_lpMaterial&&m_IsOK)
return m_lpMaterial+dwIndex;
return NULL;
};
//Texture
inline DWORD CGL3DSLoader::GetTextureNum()const
{
if(m_IsOK)
return m_dwTextureNum;
return 0;
};
inline string CGL3DSLoader::GetTexture( DWORD dwIndex )const
{
if(m_lpstrTexture&&m_IsOK)
return m_lpstrTexture[dwIndex];
return "";
};
//object
inline DWORD CGL3DSLoader::GetObjectNum()const
{
if( m_IsOK )
return m_dwObjectNum;
return 0;
};
inline DWORD CGL3DSLoader::GetFlags( DWORD dwIndex)const
{
if(m_lpFlags&&m_IsOK)
return m_lpFlags[dwIndex];
return NULL;
};
inline string CGL3DSLoader::GetObjectName( DWORD dwIndex ) const
{
if(m_lpstrName&&m_IsOK)
return m_lpstrName[dwIndex];
return "";
};
//vertex
inline DWORD CGL3DSLoader::GetVertexNum( DWORD dwIndex )const
{
if(m_lpVertexNum&&m_IsOK)
return m_lpVertexNum[dwIndex];
return 0;
};
inline const GLVERTEX3* CGL3DSLoader::GetVertexList( DWORD dwIndex ) const
{
if( m_lplpVertex&&m_IsOK )
return m_lplpVertex[dwIndex];
return NULL;
};
inline const GLTEXCOORD* CGL3DSLoader::GetTexcoordList( DWORD dwIndex ) const
{
if(m_lplpTexcoord&&m_IsOK)
return m_lplpTexcoord[dwIndex];
return NULL;
};
//face
inline DWORD CGL3DSLoader::GetFaceNum( DWORD dwIndex )const
{
if(m_lpFaceNum&&m_IsOK)
return m_lpFaceNum[dwIndex];
return 0;
};
inline const MESHTRIANGLEINDEX*
CGL3DSLoader::GetFaceIndex( DWORD dwIndex)const
{
if(m_lplpFaceIndex&&m_IsOK)
return m_lplpFaceIndex[dwIndex];
return NULL;
};
inline DWORD CGL3DSLoader::GetFaceMaterialNum( DWORD dwIndex )const
{
if( m_IsOK && m_lpFaceMaterialNum )
return m_lpFaceMaterialNum[dwIndex];
return 0;
}
inline const DWORD* CGL3DSLoader::GetFaceMaterialID( DWORD dwIndex )const
{
if( m_IsOK && m_lplpFaceMaterialID )
return m_lplpFaceMaterialID[dwIndex];
return NULL;
}
inline const DWORD* CGL3DSLoader::GetFaceMaterialBegin( DWORD dwIndex )const
{
if( m_IsOK && m_lplpFaceMaterialBegin )
return m_lplpFaceMaterialBegin[dwIndex];
return NULL;
}
inline const DWORD* CGL3DSLoader::GetFaceMaterialEnd( DWORD dwIndex )const
{
if( m_IsOK && m_lplpFaceMaterialEnd )
return m_lplpFaceMaterialEnd[dwIndex];
return NULL;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -