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

📄 3dsloader.h

📁 三维模型数据格式3DS数据的读取。详细分解3DS数据格式
💻 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 + -