//////// MilkShape 3D 1.4.0 File Format Specification////// This specifcation is written in C style.////// The data structures are defined in the order as they appear in the .ms3d file.////////////// max values//#define MAX_VERTICES 8192#define MAX_TRIANGLES 16384#define MAX_GROUPS 128#define MAX_MATERIALS 128#define MAX_JOINTS 128#define MAX_KEYFRAMES 216 // increase when needed//// flags//#define SELECTED 1#define HIDDEN 2#define SELECTED2 4#define DIRTY 8//// types//#ifndef bytetypedef unsigned char byte;#endif // byte#ifndef wordtypedef unsigned short word;#endif // word//// First comes the header.//typdef struct{ char id[10]; // always "MS3D000000" int version; // 3} ms3d_header_t;//// Then comes the number of vertices//word nNumVertices;//// Then comes nNumVertices * sizeof (ms3d_vertex_t)//typedef struct{ byte flags; // SELECTED | SELECTED2 | HIDDEN float vertex[3]; // char boneId; // -1 = no bone byte referenceCount;} ms3d_vertex_t;//// number of triangles//word nNumTriangles;//// nNumTriangles * sizeof (ms3d_triangle_t)//typedef struct{ word flags; // SELECTED | SELECTED2 | HIDDEN word vertexIndices[3]; // float vertexNormals[3][3]; // float s[3]; // float t[3]; // byte smoothingGroup; // 1 - 32 byte groupIndex; //} ms3d_triangle_t;//// number of groups//word nNumGroups;//// nNumGroups * sizeof (ms3d_group_t)//typedef struct{ byte flags; // SELECTED | HIDDEN char name[32]; // word numtriangles; // word triangleIndices[numtriangles]; // the groups group the triangles char materialIndex; // -1 = no material} ms3d_group_t;//// number of materials//word nNumMaterials;//// nNumMaterials * sizeof (ms3d_material_t)//typedef struct{ char name[32]; // float ambient[4]; // float diffuse[4]; // float specular[4]; // float emissive[4]; // float shininess; // 0.0f - 128.0f float transparency; // 0.0f - 1.0f char mode; // 0, 1, 2 is unused now char texture[128]; // texture.bmp char alphamap[128]; // alpha.bmp} ms3d_material_t;//// save some keyframer data//float fAnimationFPS;float fCurrentTime;int iTotalFrames;//// number of joints//word nNumJoints;//// nNumJoints * sizeof (ms3d_joint_t)////typedef struct{ float time; // time in seconds float rotation[3]; // x, y, z angles} ms3d_keyframe_rot_t;typedef struct{ float time; // time in seconds float position[3]; // local position} ms3d_keyframe_pos_t;typedef struct{ byte flags; // SELECTED | DIRTY char name[32]; // char parentName[32]; // float rotation[3]; // local reference matrix float position[3]; word numKeyFramesRot; // word numKeyFramesTrans; // ms3d_keyframe_rot_t keyFramesRot[numKeyFramesRot]; // local animation matrices ms3d_keyframe_pos_t keyFramesTrans[numKeyFramesTrans]; // local animation matrices} ms3d_joint_t;//// Mesh Transformation:// // 0. Build the transformation matrices from the rotation and position// 1. Multiply the vertices by the inverse of local reference matrix (lmatrix0)// 2. then translate the result by (lmatrix0 * keyFramesTrans)// 3. then multiply the result by (lmatrix0 * keyFramesRot)//// For normals skip step 2.//////// NOTE: this file format may change in future versions!////// - Mete Ciragan//