Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/graphics/importer/md3/md3_data.h @ 10767

Last change on this file since 10767 was 8724, checked in by bensch, 19 years ago

merged the bsp-model-stuff back here

File size: 5.0 KB
Line 
1/*!
2 * @file md2Model.h
3  *  Definition of an MD2 Model, a model format invented by ID Software.
4
5    We are deeply thankfull for all the wunderfull things id software made for us gamers!
6
7    The md2 file format is structured in a very simple way: it contains animations which are made out of
8    frames (so called keyframes). Each frame is a complete draweable model in a specific position.
9    A frame is a collection of vertex and its compagnions (normals, texture coordinates).
10
11    A typical model has about 200 frames, the maximum frame count is fixed by MD2_MAX_FRAMES to currently
12    512 frames. The maximal vetices count is set to 2048 verteces, not enough?
13    You just have to change the MD2_MAX_* values if it doesn't fit your purposes...
14
15    Surface Culling is fully implemented in md2 models: quake2 uses front face culling.
16*/
17
18#ifndef _MD3_DATA_H
19#define _MD3_DATA_H
20
21#include "base_object.h"
22
23#include "model.h"
24#include "material.h"
25#include "md_model_structure.h"
26
27#include <map>
28
29
30//! These are the needed defines for the max values when loading .MD2 files
31#define MD3_IDENT                       (('3'<<24) + ('P'<<16) + ('D'<<8) + 'I') //!< the md3 identifier tag in the bin file
32#define MD3_VERSION                     15                                       //!< the md2 version in the header
33
34
35
36namespace md3
37{
38
39  class MD3BoneFrame;
40  class MD3Mesh;
41  class MD3Normal;
42  class MD3Animation;
43
44  //! This holds the header information that is read in at the beginning of the file: id software definition
45  typedef struct MD3Header
46  {
47    int ident;                           //!< This is used to identify the file
48    int version;                         //!< The version number of the file (Must be 8)
49
50    char filename[68];                   //!< The filename of the model
51
52    int boneFrameNum;                    //!< number of frames
53    int tagNum;                          //!< number of tags
54    int meshNum;                         //!< number of mesh
55    int maxTexNum;                       //!< number of texture
56
57    int boneFrameStart;                  //!< start of bone frames
58    int tagStart;                        //!< start of the tag
59    int meshStart;                       //!< mesh start
60
61    int fileSize;                        //!< file size
62  };
63
64  //!< holding the informations about the current animation state
65  typedef struct MD3AnimationState
66  {
67    int     currentFrame;          //!< currently rendered animation key frame of this model. Every part has its own current frame!
68    int     nextFrame;             //!< next animation key frame of the model.
69    float   interpolationFraction; //!< interpolation position between currentFrame and nextFrame [0,1]
70  };
71
72
73  //! class to store the md2 data in
74  class MD3Data : public BaseObject
75  {
76    public:
77      MD3Data(const std::string& modelFileName, const std::string& skinFileName, float scale = 1.0f);
78      virtual ~MD3Data();
79
80      void addLinkedModel(int tagIndex, MD3Data* child);
81      int getTagIndexByName(std::string name);
82
83    private:
84      bool loadModel(const std::string& fileName);
85      bool loadSkin(const std::string& fileName = "");
86
87      void init();
88
89      int readHeader(FILE* pFile, int fileOffset);
90      int readBoneFrames(FILE* pFile, int fileOffset);
91      int readTags(FILE* pFile, int fileOffset);
92      int readMeshes(FILE* pFile, int fileOffset);
93
94
95      int readMeshTriangles(FILE* pFile, int fileOffset, int mesh);
96      int readMeshTextures(FILE* pFile, int fileOffset, int mesh);
97      int readMeshTexVecs(FILE* pFile, int fileOffset, int mesh);
98      int readMeshVertices(FILE* pFile, int fileOffset, int mesh);
99
100
101    public:
102
103      MD3Header*                header;            //!< the header file
104
105      std::map<int, MD3Data*>   sortedMap;         //!< map
106      int                       parentTagIndex;    //!< the tag index of the parent model
107      MD3Data*                  parent;            //!< the parent model
108
109      std::string               filename;          //!< the name of the file as recorded in the .md3 file
110
111      MD3AnimationState         animationState;    //!< the animation state of this model
112
113      MD3BoneFrame**            boneFrames;        //!< array of bone frames, contains the metadata (bounding box, tags,...) for each frame
114      MD3Mesh**                 meshes;            //!< array of meshes in the model. each containing the mesh for each of the animation
115
116      MD3BoneFrame*             tmpBoneFrame;      //!< a temporary bone frame
117      sVec3D**                  tmpMesh;           //!< a temporary mesh frame
118      MD3Normal**               tmpNormal;         //!< a temporary normals frame
119      float**                   tmpMatrix;         //!< a temporary matrix
120
121
122     /* the animation part */
123     MD3Animation*              animation;         //!< animation
124     int                        op;                //!< the current operation
125     int                        upperBound;        //!< the upper bound
126     bool                       bInterpolate;      //!< interpolate the frames
127  };
128
129
130}
131
132
133
134#endif /* _MD3_DATA_H */
Note: See TracBrowser for help on using the repository browser.