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

📄 loadmeshes.h

📁 VC++ DEMO, used for the beginners and the amour
💻 H
字号:
// ObjMesh_t.h: interface for the ObjMesh_t class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(_CGE_LOADMESHES_H_)
#define _CGE_LOADMESHES_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <vector>

// 确认结构以字节对齐
#pragma pack(push, 1)

namespace cge_mesh
{

	//--------------------------------------------------------------------------------
	// common structures 
	//--------------------------------------------------------------------------------
	struct TexCoord_s
	{
		float u;
		float v;
	};
	struct Vector3_s
	{
		float x;
		float y;
		float z;
	};

	//--------------------------------------------------------------------------------
	// structures for Obj
	//--------------------------------------------------------------------------------
	struct ObjTriangle_s								// Obj模型的表面结构
	{	
		unsigned int m_VertexIndices[3];				// 顶点索引
		unsigned int m_NormalIndices[3];				// 顶点法向索引
		unsigned int m_TexCoordIndices[3];				// 纹理索引
	};

	struct ObjMesh_s
	{													// Obj模型
		std::vector<TexCoord_s>		m_TexCoords;		// Obj模型的纹理坐标数据	
		std::vector<Vector3_s>		m_Vertices;			// Obj模型的顶点坐标数据
		std::vector<Vector3_s>		m_Normals;			// Obj模型的顶点法向数据
		std::vector<ObjTriangle_s>  m_Triangles;		// Obj模型的三角形面数据

		bool                        m_bHasTexCoords;	// 是否有纹理坐标数据
		bool                        m_bHasNormals;		// 是否有顶点法向量数据
	};

	//--------------------------------------------------------------------------------
	// structures for Md2
	//--------------------------------------------------------------------------------
	struct Md2Header_s									// Md2的文件头
	{												
		int m_iMagicNum;								// 标识号"IDP2"(844121161)
		int m_iVersion;									// Version:8
		int m_iSkinWidthPx;								// 纹理宽度
		int m_iSkinHeightPx;							// 纹理高度
		int m_iFrameSize;								// 帧的大小
		int m_iNumSkins;								// 纹理文件个数
		int m_iNumVertices;								// 顶点坐标数据个数
		int m_iNumTexCoords;							// 纹理坐标数据个数
		int m_iNumTriangles;							// 三角形的数目	
		int m_iNumGLCommands;							// OpenGL优化命今数目
		int m_iNumFrames;								// 帧的的数目
			
		int m_iOffsetSkins;								// 纹理数据在文件中的偏移(相对于文件头)
		int m_iOffsetTexCoords;							// 纹理坐标数据在文件中的偏移(相对于文件头)
		int m_iOffsetTriangles;							// 三角形数据在文件中的偏移(相对于文件头)
		int m_iOffsetFrames;							// 帧数据在文件中的偏移(相对于文件头)
		int m_iOffsetGLCommands;						// OpenGL优化数据在文件中的偏移(相对于文件头)
		int m_iFilesize;								// 文件大小
	};
	
	struct Md2Triangle_s								// Md2模型的表面结构
	{									
		unsigned short m_sVertIndices[3];				// 顶点索引
		unsigned short m_sTexIndices[3];				// 纹理索引
	};
	
	struct Md2Frame_s									// Md2模型的帧结构
	{
		float m_fScale[3];								// 此帧的顶点缩放数据
		float m_fTrans[3];								// 此帧的顶点平移数据
		char  m_szName[16];								// 帧名

		std::vector<Vector3_s> m_Vertices;				// 此帧的顶点数据
	};

	struct Md2Mesh_s									// Md2模型
	{
		typedef struct {char name[256];} skinname;  

		Md2Header_s	                m_Header;			// Md2的文件头
		std::vector<skinname>       m_Skins;			// Md2模型的纹理文件数据
		std::vector<Md2Frame_s>		m_Frames;			// Md2模型的帧数据
		std::vector<TexCoord_s>		m_TexCoords;		// Md2模型的纹理坐标数据
		std::vector<Md2Triangle_s>  m_Triangles;		// Md2模型的纹理坐标数据

		std::vector<long>           m_GLCommands;		// Md2模型的OpenGL优化命今数据
	};

	//--------------------------------------------------------------------------------
	// structures for Ms3d
	//--------------------------------------------------------------------------------
	struct Ms3dHeader_s									// Ms3d的文件头
	{
		char m_szFlags[10];								// Ms3d的标识"MS3D000000"
		int  m_iVersion;								// Version:3 or 4
	};

	struct Ms3dVertex_s									// Ms3d的顶点结构
	{
		unsigned char m_ucFlags;						// 编辑标识(0 = visible && selected, 1 = selected, 2 = hidden 3 = hidden && selected)
		Vector3_s     m_vVert;							// 顶点数据
		char           m_iBone;							// 骨骼ID(-1 = 无骨骼)
		unsigned char m_ucUnused;						
	};

	struct Ms3dTriangle_s								// Ms3d的表面结构
	{
		unsigned short m_usFlags;						// 编辑标识
		unsigned short m_VertexIndices[3];				// 顶点索引
		Vector3_s      m_vNormals[3];					// 表面法向
		float          m_TexCoords[2][3];				// 纹理坐标([0][0] = u1, [0][1] = u2, [0][2] = u3, [1][0] = v1, [1][1] = v2, [1][2] = v3)
		unsigned char  m_ucSmoothing;					
		unsigned char  m_ucGroup;						// 组号	
	};

	struct Ms3dGroup_s									// Ms3d的组结构
	{
		unsigned char				m_ucFlags;			// 编辑标识
		char						m_szName[32];		// 组名
		unsigned short				m_usNumTriangles;	// 组内包含的三角形数目
		std::vector<unsigned short> m_TriangleIndices;	// 三角形索引
		char                        m_cMaterial;		// 材质索引( -1 = 无材质)
	};

	struct Ms3dMaterial_s								// Ms3d的材质结构
	{
		char  m_szName[32];								// 材质名
		float m_Ambient[4];								// Ambient values
		float m_Diffuse[4];								// Diffuse values
		float m_Specular[4];							// Specular values
		float m_Emissive[4];							// Emissive values
		float m_fShininess;								// 材质光滑值(0 - 128)
		float m_fTransparent;							// 材质透明值(0 - 1)(0 = completely opaque, 1 = completely transprent)
		char  m_cMode;									// Unused
		char  m_szTextureFile[128];						// 纹理文件名
		char  m_szAlphaMapFile[128];					// 透明贴图文件名
	};

	struct Ms3dMesh_s									// Ms3d模型
	{
		Ms3dHeader_s				m_Header;			// Ms3d的文件头
		std::vector<Ms3dVertex_s>	m_Vertices;			// 顶点数据	
		std::vector<Ms3dTriangle_s> m_Triangles;		// 三角形数据
		std::vector<Ms3dGroup_s>    m_Groups;			// 组数据
		std::vector<Ms3dMaterial_s> m_Materials;		// 材质数据
	};


	//--------------------------------------------------------------------------------
	// The prototype of functions for loading meshes
	//--------------------------------------------------------------------------------
	bool LoadObjMesh(const char *pFilename, ObjMesh_s &Mesh);
	bool LoadMd2Mesh(const char *pFilename, Md2Mesh_s &OutMesh);
	bool LoadMs3dMesh(const char *pFilename, Ms3dMesh_s &Mesh);

}

#pragma pack(pop, 1)

#endif // !defined(_CGE_LOADMESHES_H_)

⌨️ 快捷键说明

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