📄 3dsfile.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 + -