MD2.H
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 3k
Category:

OpenCV

Development Platform:

Visual C++

  1. #ifndef __MD2_H
  2. #define __MD2_H
  3. #include <windows.h> // standard Windows app include
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <gl/gl.h> // standard OpenGL include
  8. #include <gl/glu.h> // OpenGL utilties
  9. #include "object.h"
  10. #include "texture.h"
  11. #include "vector.h"
  12. #define MAX_FRAMES 512
  13. // 模型动画状态
  14. enum modelState_t
  15. {
  16. MODEL_IDLE, // “空闲动画”
  17. MODEL_CROUCH, // “低蹲动画”
  18. MODEL_RUN, // “跑步动画”
  19. MODEL_JUMP, // “跳跃动画”
  20. MODEL_FIRE // “射击动画”
  21. };
  22. // 单个顶点
  23. typedef struct
  24. {
  25.    float point[3];
  26. } vector_t;
  27. vector_t operator-(vector_t a, vector_t b);
  28. vector_t operator*(float f, vector_t b);
  29. vector_t operator/(vector_t a, vector_t b);
  30. vector_t operator+(vector_t a, vector_t b);
  31. void CalculateNormal( float *p1, float *p2, float *p3 );
  32. // 纹理坐标
  33. typedef struct
  34. {
  35.    float s;
  36.    float t;
  37. } texCoord_t;
  38. // 纹理坐标索引
  39. typedef struct
  40. {
  41.    short s;
  42.    short t;
  43. } stIndex_t;
  44. // 某一帧位置的信息
  45. typedef struct
  46. {
  47.    unsigned char v[3];
  48.    unsigned char normalIndex;
  49. } framePoint_t;
  50. // 某一单帧信息
  51. typedef struct
  52. {
  53.    float scale[3];
  54.    float translate[3];
  55.    char name[16];
  56.    framePoint_t fp[1];
  57. } frame_t;
  58. // 某一单个三角形数据
  59. typedef struct
  60. {
  61.    unsigned short meshIndex[3]; // 顶点索引
  62.    unsigned short stIndex[3]; // 纹理坐标索引
  63. } mesh_t;
  64. typedef struct
  65. {
  66.    int ident;  // MD2文件的标识 "IDP2"
  67.    int version;  // 版本号
  68.    int skinwidth;    // 纹理的宽度
  69.    int skinheight;   // 纹理的高度
  70.    int framesize;    // 每一帧的大小(字节数)
  71.    int numSkins;     // 纹理数目
  72.    int numXYZ;       // 点的数目
  73.    int numST;        // 纹理坐标数目
  74.    int numTris;      // 三角形数目
  75.    int numGLcmds;
  76.    int numFrames;    // 帧的总数目
  77.    int offsetSkins;  // 纹理名称偏移量(64字节)
  78.    int offsetST;     // 纹理的s-t值偏移
  79.    int offsetTris;   // 三角形网格偏移
  80.    int offsetFrames; // 帧数据偏移
  81.    int offsetGLcmds; // 使用的OpenGL命令类型
  82.    int offsetEnd;    // 文件结尾
  83. } modelHeader_t;
  84. class CMD2Model : public CObject
  85. {
  86. private:
  87.      int numFrames;       // 帧的数目
  88.      int numVertices;         // 顶点的数目
  89.      int numTriangles;        // 三角形数目
  90.      int numST;               // 纹理数目
  91.      int frameSize;           // 每一帧的大小
  92.      mesh_t *triIndex;        // 三角形链表
  93.      texCoord_t *st;          // 纹理坐标链表
  94.      vector_t *vertexList;    // 顶点链表
  95.      CTexture *modelTex;      // 纹理数据
  96.      void SetupSkin(CTexture *thisTexture);
  97. protected:
  98. modelState_t modelState; // 当前的模型动画状态
  99.      int currentFrame;        // 动画中的当前帧
  100.      int nextFrame;           // 动画中的下一帧
  101. public:
  102.      float interpol;          // 当前帧的插值百分数
  103.      CMD2Model();        // 构造函数
  104.      ~CMD2Model();       // 析构函数
  105.      // 同时装入模型和纹理
  106.      int Load(char *modelFile, char *skinFile);
  107.      // 装入模型
  108.      int LoadModel(char *modelFile);
  109.      // 装入模型的纹理
  110.      int LoadSkin(char *skinFile);
  111.      // 设置模型的纹理
  112.      int SetTexture(CTexture *texture);
  113.      // 以插值法渲染模型,获取动画效果
  114.      int AnimateModel(int startFrame, int endFrame, float percent);
  115.      // 渲染一单帧
  116.      int RenderFrame(int keyFrame);
  117.      // 释放模型占用的内存资源
  118.      void Unload();
  119. // 设置模型的动画状态
  120. void SetState(modelState_t state);
  121. // 获取模型的动画状态
  122. modelState_t GetState();
  123. };
  124. #endif