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

📄 3dsfile.h

📁 VC++ DEMO, used for the beginners and the amour
💻 H
字号:
#ifdef CGE_HEADER_H

#ifndef CGE_3DSFILE_H
#define CGE_3DSFILE_H

namespace CGE
{
	namespace MODEL
	{
		namespace _3DSFILE
		{
			#define MAIN3DS       0x4D4D	//------ 主块
			
			#define EDIT3DS       0x3D3D	// this is the start of the editor config
			#define KEYFRAME3DS   0xB000	// this is the start of the keyframer config
			
			//------ 3DS编辑块的子块
			
			#define EDIT_MATERIAL 0xAFFF
			#define EDIT_CONFIG1  0x0100
			#define EDIT_CONFIG2  0x3E3D
			#define EDIT_VIEW_P1  0x7012
			#define EDIT_VIEW_P2  0x7011
			#define EDIT_VIEW_P3  0x7020
			#define EDIT_VIEW1    0x7001
			#define EDIT_BACKGR   0x1200
			#define EDIT_AMBIENT  0x2100
			#define EDIT_OBJECT   0x4000
			
			#define EDIT_UNKNW01  0x1100
			#define EDIT_UNKNW02  0x1201
			#define EDIT_UNKNW03  0x1300
			#define EDIT_UNKNW04  0x1400
			#define EDIT_UNKNW05  0x1420
			#define EDIT_UNKNW06  0x1450
			#define EDIT_UNKNW07  0x1500
			#define EDIT_UNKNW08  0x2200
			#define EDIT_UNKNW09  0x2201
			#define EDIT_UNKNW10  0x2210
			#define EDIT_UNKNW11  0x2300
			#define EDIT_UNKNW12  0x2302 
			#define EDIT_UNKNW13  0x3000
			#define EDIT_UNKNW14  0x3D3E
			#define EDIT_UNKNW15  0xAFFF

			//------ 材质的子块
			#define MAT_NAME01    0xA000
			#define MAT_AMBIENT   0xA010
			#define MAT_DIFFUSE   0xA020
			#define MAT_SPECULAR  0xA030
		//	#define MAT_EMISSIVE  0xA040

			#define MAT_SHININESS    0xA040
			#define MAT_TRANSPARENCY 0xA050
			#define MAT_TEXMAP	  0xA200
			#define MAT_TEXFILE	  0xA300 

			#define MAT_UNKNW01	  0xA041
			#define MAT_UNKNW02	  0xA052
			#define MAT_UNKNW03	  0xA053
			#define MAT_UNKNW04	  0xA084
			#define MAT_UNKNW05	  0xA087
			#define MAT_UNKNW06	  0xA08A
			#define MAT_UNKNW07	  0xA100

			//------ 对象块的子块
			#define OBJ_TRIMESH   0x4100
			#define OBJ_LIGHT     0x4600
			#define OBJ_CAMERA    0x4700
			
			#define OBJ_UNKNWN01  0x4010
			#define OBJ_UNKNWN02  0x4012 //---- 阴影块
			
			//------ 摄象机块的子块
			#define CAM_UNKNWN01  0x4710 
			#define CAM_UNKNWN02  0x4720 
			
			//------ 光源块的子块
			#define LIT_OFF       0x4620
			#define LIT_SPOT      0x4610
			#define LIT_UNKNWN01  0x465A
			
			//------ 三角形列表块的子块
			#define TRI_VERTEXL   0x4110
			#define TRI_VERTEXOP  0x4111 
			#define TRI_FACEL     0x4120
			#define TRI_FACEMATL  0x4130
			#define TRI_TEXCOORD  0x4140
			#define TRI_SMOOTH    0x4150
			#define TRI_LOCAL     0x4160
			#define TRI_VISIBLE   0x4165
			
			//------ 关键帧快的子块
			
			#define KEYF_UNKNWN01 0xB009
			#define KEYF_UNKNWN02 0xB00A
			#define KEYF_FRAMES   0xB008
			#define KEYF_OBJDES   0xB002
			
			//------  下面定义了颜色块
			#define COL_RGB  0x0010
			#define COL_TRU  0x0011
			#define COL_UNK  0x0013
			
			// --------定义3ds顶点结构

			struct _3DSVect
			{
				FLOAT x,y,z;
			};

			struct _3DSClr
			{
				FLOAT r,g,b;
			};

			struct _3DSVert
			{
				_3DSVect vPos;
				_3DSVect vNormal;
			};

			struct _3DSTexCoord
			{
				FLOAT u,v;
			};

			struct _3DSFace
			{
				WORD	 m_usIndices[3]; //Vertex indices
				WORD	 m_usInfo;
				_3DSVect m_vecNormal; //Face Normal
			};

			struct _3DSUseMat
			{
				_3DSUseMat()
				{
					m_strName[0] = '\0';
					m_usMatIdx = -1;
					m_vFaceIndices.clear();
				}
				~_3DSUseMat()
				{
					m_vFaceIndices.clear();
				}
				WORD				m_usMatIdx;
				TCHAR				m_strName[256];
				std::vector<WORD>	m_vFaceIndices;
			};	
			
			struct _3DSTriMesh
			{

				_3DSTriMesh()
				{
					m_vVertices.clear();
					m_vTexCoords.clear();
					m_vFaces.clear();
					m_vSmooths.clear();
					m_vUseMaterials.clear();
					m_bVisible = 0;
					m_vMin.x = m_vMin.y = m_vMin.z = 0;
					m_vMax.x = m_vMax.y = m_vMax.z = 0;
					m_fRadius = 0.0f;		
				}
				~_3DSTriMesh()
				{
					m_vUseMaterials.clear();
					m_vVertices.clear();
					m_vTexCoords.clear();
					m_vFaces.clear();
					m_vSmooths.clear();
				}

				BYTE  m_bVisible;
				std::vector<_3DSVert> m_vVertices;
				std::vector<_3DSTexCoord> m_vTexCoords;
				std::vector<_3DSFace> m_vFaces;
				std::vector<_3DSUseMat> m_vUseMaterials;
				std::vector<DWORD> m_vSmooths;
				D3DXVECTOR3 m_vMin;
				D3DXVECTOR3 m_vMax;
				FLOAT m_fRadius;
			};



			struct _3DSLight
			{
				_3DSVect m_vPos;
				_3DSVect m_vSpotlightDir;
				_3DSClr  m_Diffuseclr;
				FLOAT	 m_fSpot;
				FLOAT	 m_fAngle;
				BYTE	 m_bOn;
			};

			struct _3DSMaterial
			{

				FLOAT	m_fShininess;
				FLOAT	m_fTransparency;
				
				TCHAR   m_strName[256];					// The material name
				TCHAR   m_strDiffuseTexture[256];

				_3DSClr m_fDiffuseclr;				// The diffuse color of the object (R, G, B)
								
				_3DSClr m_fAmbientclr;				// The ambient color of the object (R, G, B)				
				
				_3DSClr	m_fSpecularclr;				// The specular color of the object (R, G, B)
				
				_3DSClr	m_fEmissionclr;				// The emission color of the object (R, G, B)

				_3DSMaterial()
				{
					m_strName[0] = '\0';
					m_strDiffuseTexture[0] = '\0';
					
					m_fDiffuseclr.r = 1.0f;
					m_fDiffuseclr.g = 1.0f;
					m_fDiffuseclr.b = 1.0f;
					
					m_fAmbientclr.r = 1.0f;
					m_fAmbientclr.g = 1.0f;
					m_fAmbientclr.b = 1.0f;
					
					m_fSpecularclr.r = 1.0f;
					m_fSpecularclr.g = 1.0f;
					m_fSpecularclr.b = 1.0f;
					
					m_fShininess = 10.0f;
					m_fTransparency = 1.0f;					
				}

				~_3DSMaterial()
				{
				}
			};

			struct _3DSObject
			{

				_3DSObject()
				{
					m_vTriMeshs.clear();
					m_vLight.clear();
					m_strName[0] = '\0';
				}
				~_3DSObject()
				{
					m_vTriMeshs.clear();
					m_vLight.clear();
				}

				std::vector<_3DSTriMesh>  m_vTriMeshs;
				std::vector<_3DSLight>	 m_vLight;
				TCHAR					 m_strName[256];
			};

			struct _3DSModel
			{
				
				_3DSModel()
				{
					m_vUseMaterials.clear();
					m_vTextures.clear();
					m_vMaterials.clear();
					m_vObjects.clear();
					m_bHasAmbient = FALSE;
					m_bHasBackgr = FALSE;
				}
				~_3DSModel()
				{
					m_vMaterials.clear();
					m_vObjects.clear();
					m_vUseMaterials.clear();
					m_vTextures.clear();
				}

				BYTE	m_bHasAmbient;
				_3DSClr m_fAmbientclr;
				BYTE	m_bHasBackgr;
				_3DSClr m_fBackgrclr;
				std::vector<_3DSMaterial> m_vMaterials;		// The list of material information (Textures and colors)
				std::vector<_3DSObject> m_vObjects;			// The object list for our model				
				std::vector<D3DMATERIAL8> m_vUseMaterials;
				std::vector<LPDIRECT3DTEXTURE8> m_vTextures;
			};

			struct _3DSKeyFrame
			{
				DWORD m_dwStart;
				DWORD m_dwEnd;
			};

			struct _3DSFile
			{
				_3DSFile()
				{
					m_vModels.clear();
					m_vKeyFrames.clear();
				}
				~_3DSFile()
				{
					m_vModels.clear();
					m_vKeyFrames.clear();
				}

				std::vector<_3DSModel> m_vModels;
				std::vector<_3DSKeyFrame> m_vKeyFrames;
				WORD Version;
			};

			typedef class _3DS
			{
				public:
					VOID DrawModel(LPDIRECT3DVERTEXBUFFER8 vb);
					VOID Read3DSFile(LPDIRECT3DDEVICE8 device,TCHAR * strFileName,TCHAR * strFilePath = "");
					_3DS();
					virtual ~_3DS();
				protected:

					BYTE  ReadChar();
					UINT  ReadInt();
					FLOAT ReadFloat();
					DWORD ReadLong();
					DWORD ReadName( TCHAR * strName, WORD buffSize);
					DWORD ReadBooleanChunk( BYTE * boolean);

					VOID  ChangeChunkPointer( DWORD temp_pointer);
					DWORD GetChunkPointer();
					DWORD ReadNameChunk( TCHAR * strName, WORD buffSize);
					DWORD ReadChunkPointer();

					DWORD ReadMainChunk();
					BOOL  ReadPrimaryChunk();

					DWORD ReadMeshTexCoordChunk(_3DSTriMesh & Mesh);
					DWORD ReadMeshUseMatChunk(_3DSUseMat &Mat);
					DWORD ReadMeshFacesChunk(_3DSTriMesh & Mesh);
					DWORD ReadMeshVertsChunk(_3DSTriMesh & Mesh );
					DWORD ReadTriMeshChunk( _3DSTriMesh & Mesh );

					DWORD ReadMaterialChunk(_3DSMaterial & Mat);
					DWORD ReadMatDefChunk( FLOAT & value);

					DWORD ReadObjectChunk(_3DSObject & Obj);
					DWORD ReadColorChunk(_3DSClr & clr);
					DWORD ReadUnknownChunk();

					VOID CalculateBoundingMesh();
					VOID ArrangeVertex();
					VOID CalculateFaceNormals();

					DWORD ReadKeyFrameChunk(_3DSKeyFrame & KeyFrame);
					DWORD ReadEditChunk(_3DSModel & Model);
					DWORD ReadLightChunk(_3DSLight & Light);

					VOID  Parse3DSFile();
				public:
					D3DXVECTOR3 m_vMin;
					D3DXVECTOR3 m_vMax;
					FLOAT m_fRadius;
					_3DSFile m_3DSFile;
					
				private:
					LPDIRECT3DDEVICE8 m_pD3DDevice;
					TCHAR m_strFilePath[MAX_PATH];
					FILE * m_fpBin3ds;
			}*LP3DS;
		}
	}
}
#endif
#endif

⌨️ 快捷键说明

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