基本设计格式
1.定义字符串长度为: strlen(szText) + 1
2.所有偏移位置均指以文件头为起点.
3.文件存储各段数据实际以16字节对齐占用,即若strlen为16,加尾部\0字符,长度为17,但实际要占用32字节. 即,除非该段Offset为0(无数据),则该段至少占用16字节的整数倍空间.
4.vec3_type: 3D向量点 vec2_type:2D向量点
// M2文件头部信息结构
struct M2_HEADER // 336 bytes, 84 DWORDs.
{
DWORD dwIdent; // M2 File Identity
DWORD dwVersion; // version: 256
DWORD nModelNameSize; // strlen(szModelName) + 1
DWORD nModelNameOffset; // always 336(header size), points to ModelName.
DWORD dwUnk1; // All 0s, occasionally 1,3(World\SkillActivated\Containers\TreasureChest01: 3)
DWORD nGlobalSequences;
DWORD nGlobalSequencesOffset; // points to array of DWORD
DWORD nNumAnimations;
DWORD nAnimationsOffset; // points to M2_ANIMATION_INFO
DWORD nUnkIndices;
DWORD nUnkIndicesOffset; // points to array of unsigned short
DWORD nUnkLongs;
DWORD nUnkLongsOffset; // points to array of longs
DWORD nBonesCount;
DWORD nBonesOffset; // points to M2_BONE_DATA
DWORD nUnkIndices2;
DWORD nUnkIndicesOffset2; // points to array of unsigned short
DWORD nNumVertices;
DWORD nVerticesOffset; // points to M2_Vertex!!!
DWORD nNumGeoMeshs;
DWORD nGeoMeshsOffset; // Points to M2_GEOMETRY_MESH!!!
DWORD dwMagic[2]; // 0s
DWORD nNumTextures;
DWORD nTexturesOffset; // points to M2_TEXTURE_INFO.
DWORD dwUnk6[10]; // Other chunks
DWORD nGroupBoneIDs; // Bone groups data
DWORD nGroupBoneIDsOffset; // points to array of unsigned short which is bone id.
DWORD nNumMaterials;
DWORD nMaterialsOffset;
DWORD nStruct1Count; // 16 bytes, only 1.
DWORD nStruct1Offset;
DWORD nStruct2Count; // 16 bytes, only 1.
DWORD nStruct2Offset;
DWORD nStruct3Count; // 16 bytes, only 1.
DWORD nStruct3Offset;
vec3_type vMinBox; // Bounding box
vec3_type vMaxBox;
float fUnk4; // Unknown but it's right before min box when former mdx format.
float fUnk[5];
DWORD dwUnk8; // Unknown 0
float fUnk9;
DWORD dwUnk10; // Always 36
DWORD dwUnk11[5];
DWORD nAttachments;
DWORD nAttachmentsOffset;
DWORD dwUnk12;
DWORD dwUnkOffset12;
DWORD nNumEvents;
DWORD nEventsOffset;
DWORD dwUnk13;
DWORD dwUnkOffset13;
DWORD nCameras1;
DWORD nCameras1Offset;
DWORD nCameras2;
DWORD nCameras2Offset;
DWORD dwUnk14;
DWORD dwUnk15[6];
};
// 纹理信息结构
struct M2_TEXTURE_INFO
{
DWORD nReplaceableId; // 非0时,表示换装(Creature/Character部分全部为换装类型).
DWORD dwUnk2; // 换装参数?
DWORD nNameSize; // 字符串长度,为1则空.
DWORD nNameOffset; // 字符串偏移位置
};
// 顶点信息结构
struct M2_VERTEX // 48 bytes
{
vec3_type v;
unsigned long bwgt; // ?
unsigned short bidx; // ?
unsigned short gndx; // ?
vec3_type n;
vec2_type u;
unsigned long unk[2]; // Reserved 0 until now 1.12
};
// 几何 Mesh 信息结构
struct M2_GEOMETRY_MESH // 44 bytes
{
DWORD nNumIndexedVertices; // Indexed vertices count
DWORD nIndicesOffset; // Vertices indices array, points to unsigned shorts.
DWORD nPrimitivesCount; // Primitives count, Triangle's count * 3
DWORD nPrimitivesOffset; // Points to primitive vertex indices, MDL_TRIANGLEs.
DWORD nNumGroupIndices; // Group indices count
DWORD nGroupIndicesOffset; // M2_4GROUP_INDICES array correlative with vertex.
DWORD nNumGeoParts; // per 32 bytes
DWORD nGeoPartsOffset; // points to M2_GEOMESH_GROUP_DATA
DWORD nUnk; // per 24 bypes
DWORD nUnkOffset; // points to M2_GROUP_BONE_DATA
DWORD dwUnk3; // one of 256, 75, 53, 21
};
struct M2_ANIMATION_INFO // 68 bytes
{
DWORD nAnimationClass; // Refer to AnimationData.dbc's first field.
DWORD nFrameBegin;
DWORD nFrameEnd;
float fMoveSpeed;
int bNonLooping;
int nUnk1;
DWORD nUnk2;
DWORD nUnk3;
DWORD nUnk4;
vec3_type vMins; // Unsure?
vec3_type vMaxs;
float fBoundsRadius;
DWORD nUnk5;
};
struct M2_ANIM_FRAME_SEQUENCE // Animation Frame Sequence
{
short wType;
short wFlags;
DWORD dwLineTypeCount; // Interpolate type?
DWORD dwLineTypeOffset;
DWORD nFramesCount; // num of frame indices
DWORD nFramesOffset; // points to frame indices array
DWORD nMtDataCount; // num of frame matrix transform data(translate/rotate/scale)
DWORD nMtDataOffset; // frame matrix transform data offset
};
struct M2_BONE_DATA
{
int nParentID;
short wObjTag;
short wUnk;
short nGeosetAnimID;
short nGeosetID;
M2_ANIM_FRAME_SEQUENCE infoTranslate;
M2_ANIM_FRAME_SEQUENCE infoRotate;
M2_ANIM_FRAME_SEQUENCE infoScale;
vec3_type vPivotPoint;
};
struct M2_TRANSLATE_DATA
{
vec3_type vTrans;
};
struct M2_ROTATE_DATA
{
quaternion_type qRotate;
};
struct M2_SCALE_DATA
{
vec3_type vScale;
};
struct M2_GEOMESH_GROUP_DATA
{
DWORD dwUnk;
unsigned short nUnk0;
unsigned short nNumVertices;
unsigned short nUnk2;
unsigned short nPrimitivesCount;
unsigned short nGroupCount;
unsigned short nUnk4;
unsigned short nUnk5;
unsigned short nUnk6;
vec3_type vUnk;
};
struct M2_GROUP_BONE_DATA
{
short dwUnk[12];
};
struct M2_4GROUP_INDICES
{
unsigned char idx[4];
};