www.pudn.com > ATimeToKill.rar > md2.h
#ifndef __MD2_H #define __MD2_H /* MD2.H The CMD2Model class Author: Kevin Hawkins Date: 3/29/2001 Description: The CMD2Model class loads, animates, and displays Quake 2 (TM id Software) .MD2 model files. */ #include// standard Windows app include #include #include #include #include // standard OpenGL include #include // OpenGL utilties #include "object.h" #include "texture.h" #include "vector.h" #define MAX_FRAMES 512 // model animation states enum modelState_t { MODEL_IDLE, // idle animation MODEL_CROUCH, // crouch animation MODEL_RUN, // running animation MODEL_JUMP, // jumping animation MODEL_FIRE, // model shooting gun MODEL_DIE // model dying }; /* Vector Functionality */ // a single vertex typedef struct { float point[3]; } vector_t; vector_t operator-(vector_t a, vector_t b); vector_t operator*(float f, vector_t b); vector_t operator/(vector_t a, vector_t b); vector_t operator+(vector_t a, vector_t b); void CalculateNormal( float *p1, float *p2, float *p3 ); /* MD2 Model Functionality */ // texture coordinate typedef struct { float s; float t; } texCoord_t; // texture coordinate index typedef struct { short s; short t; } stIndex_t; // info for a single frame point typedef struct { unsigned char v[3]; unsigned char normalIndex; // not used } framePoint_t; // information for a single frame typedef struct { float scale[3]; float translate[3]; char name[16]; framePoint_t fp[1]; } frame_t; // data for a single triangle typedef struct { unsigned short meshIndex[3]; // vertex indices unsigned short stIndex[3]; // texture coordinate indices } mesh_t; typedef struct { int ident; // identifies as MD2 file "IDP2" int version; // mine is 8 int skinwidth; // width of texture int skinheight; // height of texture int framesize; // number of bytes per frame int numSkins; // number of textures int numXYZ; // number of points int numST; // number of texture int numTris; // number of triangles int numGLcmds; int numFrames; // total number of frames int offsetSkins; // offset to skin names (64 bytes each) int offsetST; // offset of texture s-t values int offsetTris; // offset of triangle mesh int offsetFrames; // offset of frame data (points) int offsetGLcmds; // type of OpenGL commands to use int offsetEnd; // end of file } modelHeader_t; class CMD2Model : public CObject { private: int numFrames; // number of model frames int numVertices; // number of vertices int numTriangles; // number of triangles int numST; // number of skins int frameSize; // size of each frame in bytes mesh_t *triIndex; // triangle list texCoord_t *st; // texture coordinate list vector_t *vertexList; // vertex list CTexture *modelTex; // texture data void SetupSkin(CTexture *thisTexture); protected: modelState_t modelState; // current model animation state int currentFrame; // current frame # in animation int nextFrame; // next frame # in animation public: float interpol; // percent through current frame CMD2Model(); // constructor ~CMD2Model(); // destructor // load model and skin/texture at the same time int Load(char *modelFile, char *skinFile); // load model only int LoadModel(char *modelFile); // load skin only int LoadSkin(char *skinFile); // set model's texture/skin int SetTexture(CTexture *texture); // render model with interpolation to get animation int AnimateModel(int startFrame, int endFrame, float percent); // render a single frame int RenderFrame(int keyFrame); // free memory of model void Unload(); // set animation state of model void SetState(modelState_t state); // retrieve animation state of model modelState_t GetState(); }; #endif