#ifndef __IQM_H__ #define __IQM_H__ #define IQM_MAGIC "INTERQUAKEMODEL" #define IQM_VERSION 2 struct iqmheader { char magic[16]; unsigned int version; unsigned int filesize; unsigned int flags; unsigned int num_text, ofs_text; unsigned int num_meshes, ofs_meshes; unsigned int num_vertexarrays, num_vertexes, ofs_vertexarrays; unsigned int num_triangles, ofs_triangles, ofs_adjacency; unsigned int num_joints, ofs_joints; unsigned int num_poses, ofs_poses; unsigned int num_anims, ofs_anims; unsigned int num_frames, num_framechannels, ofs_frames, ofs_bounds; unsigned int num_comment, ofs_comment; unsigned int num_extensions, ofs_extensions; }; struct iqmmesh { unsigned int name; unsigned int material; unsigned int first_vertex, num_vertexes; unsigned int first_triangle, num_triangles; }; enum { IQM_POSITION = 0, IQM_TEXCOORD = 1, IQM_NORMAL = 2, IQM_TANGENT = 3, IQM_BLENDINDEXES = 4, IQM_BLENDWEIGHTS = 5, IQM_COLOR = 6, IQM_CUSTOM = 0x10 }; enum { IQM_BYTE = 0, IQM_UBYTE = 1, IQM_SHORT = 2, IQM_USHORT = 3, IQM_INT = 4, IQM_UINT = 5, IQM_HALF = 6, IQM_FLOAT = 7, IQM_DOUBLE = 8 }; struct iqmtriangle { unsigned int vertex[3]; }; struct iqmadjacency { unsigned int triangle[3]; }; struct iqmjointv1 { unsigned int name; int parent; float translate[3], rotate[3], scale[3]; }; struct iqmjoint { unsigned int name; int parent; float translate[3], rotate[4], scale[3]; }; struct iqmposev1 { int parent; unsigned int mask; float channeloffset[9]; float channelscale[9]; }; struct iqmpose { int parent; unsigned int mask; float channeloffset[10]; float channelscale[10]; }; struct iqmanim { unsigned int name; unsigned int first_frame, num_frames; float framerate; unsigned int flags; }; enum { IQM_LOOP = 1<<0 }; struct iqmvertexarray { unsigned int type; unsigned int flags; unsigned int format; unsigned int size; unsigned int offset; }; struct iqmbounds { float bbmin[3], bbmax[3]; float xyradius, radius; }; struct iqmextension { unsigned int name; unsigned int num_data, ofs_data; unsigned int ofs_extensions; // pointer to next extension }; struct iqmext_fte_mesh { unsigned int contents; //default CONTENTS_BODY unsigned int surfaceflags; //propagates to trace_surfaceflags unsigned int body; //the part of the body that this mesh is meant to be from unsigned int geomset; unsigned int geomid; float mindist; float maxdist; }; struct iqmext_fte_events { unsigned int anim; float timestamp; unsigned int evcode; unsigned int evdata_str; }; //skin lump is made of 3 parts struct iqmext_fte_skin { unsigned int nummeshskins; unsigned int numskinframes; //unsigned int numskins[nummeshes]; //iqmext_fte_skin_skinframe[numskinframes]; //iqmext_fte_skin_meshskin mesh0[numskins[0]]; //iqmext_fte_skin_meshskin mesh1[numskins[1]]; etc }; struct iqmext_fte_skin_skinframe { //as many as needed unsigned int material_idx; unsigned int shadertext_idx; }; struct iqmext_fte_skin_meshskin { unsigned int firstframe; //index into skinframes unsigned int countframes; //skinframes float interval; }; #endif