Irrlicht 3D Engine
IAnimatedMeshMD3.h
Go to the documentation of this file.
1 // Copyright (C) 2007-2012 Nikolaus Gebhardt / Thomas Alten
2 // This file is part of the "Irrlicht Engine".
3 // For conditions of distribution and use, see copyright notice in irrlicht.h
4 
5 #ifndef __I_ANIMATED_MESH_MD3_H_INCLUDED__
6 #define __I_ANIMATED_MESH_MD3_H_INCLUDED__
7 
8 #include "IAnimatedMesh.h"
9 #include "IQ3Shader.h"
10 #include "quaternion.h"
11 
12 namespace irr
13 {
14 namespace scene
15 {
16 
18  {
19  EMD3_HEAD = 0,
24  };
25 
28  {
29  // Animations for both lower and upper parts of the player
36 
37  // Animations for the upper part
45 
46  // Animations for the lower part
59 
62  };
63 
65  {
74  };
75 
76 
77 // byte-align structures
78 #include "irrpack.h"
79 
81  struct SMD3Header
82  {
83  c8 headerID[4]; //id of file, always "IDP3"
84  s32 Version; //this is a version number, always 15
85  s8 fileName[68]; //sometimes left Blank... 65 chars, 32bit aligned == 68 chars
86  s32 numFrames; //number of KeyFrames
87  s32 numTags; //number of 'tags' per frame
88  s32 numMeshes; //number of meshes/skins
89  s32 numMaxSkins; //maximum number of unique skins used in md3 file. artefact md2
90  s32 frameStart; //starting position of frame-structur
91  s32 tagStart; //starting position of tag-structures
92  s32 tagEnd; //ending position of tag-structures/starting position of mesh-structures
94  } PACK_STRUCT;
95 
98  {
99  c8 meshID[4]; //id, must be IDP3
100  c8 meshName[68]; //name of mesh 65 chars, 32 bit aligned == 68 chars
101 
102  s32 numFrames; //number of meshframes in mesh
103  s32 numShader; //number of skins in mesh
104  s32 numVertices; //number of vertices
105  s32 numTriangles; //number of Triangles
106 
107  s32 offset_triangles; //starting position of Triangle data, relative to start of Mesh_Header
108  s32 offset_shaders; //size of header
109  s32 offset_st; //starting position of texvector data, relative to start of Mesh_Header
110  s32 vertexStart; //starting position of vertex data,relative to start of Mesh_Header
112  } PACK_STRUCT;
113 
114 
116  struct SMD3Vertex
117  {
119  u8 normal[2];
120  } PACK_STRUCT;
121 
124  {
127  } PACK_STRUCT;
128 
130  struct SMD3Face
131  {
132  s32 Index[3];
133  } PACK_STRUCT;
134 
135 
136 // Default alignment
137 #include "irrunpack.h"
138 
141  {
143 
148  };
149 
151 
153  {
155  {
156  position.X = 0.f;
157  }
158 
159  // construct copy constructor
161  {
162  *this = copyMe;
163  }
164 
165  // construct for searching
167  : Name ( name ) {}
168 
169  // construct from a position and euler angles in degrees
170  SMD3QuaternionTag ( const core::vector3df &pos, const core::vector3df &angle )
171  : position(pos), rotation(angle * core::DEGTORAD) {}
172 
173  // set to matrix
174  void setto ( core::matrix4 &m )
175  {
176  rotation.getMatrix ( m, position );
177  }
178 
179  bool operator == ( const SMD3QuaternionTag &other ) const
180  {
181  return Name == other.Name;
182  }
183 
185  {
186  Name = copyMe.Name;
187  position = copyMe.position;
188  rotation = copyMe.rotation;
189  return *this;
190  }
191 
195  };
196 
199  {
201  {
202  Container.setAllocStrategy(core::ALLOC_STRATEGY_SAFE);
203  }
204 
205  // construct copy constructor
207  {
208  *this = copyMe;
209  }
210 
212 
214  {
215  SMD3QuaternionTag search ( name );
216  s32 index = Container.linear_search ( search );
217  if ( index >= 0 )
218  return &Container[index];
219  return 0;
220  }
221 
222  u32 size () const
223  {
224  return Container.size();
225  }
226 
227  void set_used(u32 new_size)
228  {
229  s32 diff = (s32) new_size - (s32) Container.allocated_size();
230  if ( diff > 0 )
231  {
232  SMD3QuaternionTag e("");
233  for ( s32 i = 0; i < diff; ++i )
234  Container.push_back(e);
235  }
236  }
237 
238  const SMD3QuaternionTag& operator[](u32 index) const
239  {
240  return Container[index];
241  }
242 
244  {
245  return Container[index];
246  }
247 
248  void push_back(const SMD3QuaternionTag& other)
249  {
250  Container.push_back(other);
251  }
252 
254  {
255  Container = copyMe.Container;
256  return *this;
257  }
258 
259  private:
261  };
262 
263 
266  {
268  {
269  MD3Header.numFrames = 0;
270  }
271 
272  virtual ~SMD3Mesh()
273  {
274  for (u32 i=0; i<Buffer.size(); ++i)
275  Buffer[i]->drop();
276  }
277 
282  };
283 
284 
287  {
288  public:
289 
291  virtual void setInterpolationShift(u32 shift, u32 loopMode) =0;
292 
294  virtual SMD3QuaternionTagList* getTagList(s32 frame, s32 detailLevel, s32 startFrameLoop, s32 endFrameLoop) =0;
295 
297  virtual SMD3Mesh* getOriginalMesh() =0;
298  };
299 
300 } // end namespace scene
301 } // end namespace irr
302 
303 #endif
304 
irr::scene::SMD3Header::fileName
s8 fileName[68]
Definition: IAnimatedMeshMD3.h:85
irr::scene::SMD3Header::numMeshes
s32 numMeshes
Definition: IAnimatedMeshMD3.h:88
irr::scene::SMD3TexCoord
Texture Coordinate.
Definition: IAnimatedMeshMD3.h:123
irr::scene::SMD3MeshHeader::offset_shaders
s32 offset_shaders
Definition: IAnimatedMeshMD3.h:108
irr::scene::SMD3Vertex::position
s16 position[3]
Definition: IAnimatedMeshMD3.h:118
irr::scene::EMD3_LEGS_RUN
@ EMD3_LEGS_RUN
Definition: IAnimatedMeshMD3.h:49
irr::scene::SMD3Header::numFrames
s32 numFrames
Definition: IAnimatedMeshMD3.h:86
irr::scene::EMD3_ANIMATION_TYPE
EMD3_ANIMATION_TYPE
Animation list.
Definition: IAnimatedMeshMD3.h:27
irr::scene::SMD3Mesh::Buffer
core::array< SMD3MeshBuffer * > Buffer
Definition: IAnimatedMeshMD3.h:279
irr::scene::SMD3AnimationInfo::first
s32 first
First frame.
Definition: IAnimatedMeshMD3.h:67
irrpack.h
irr::scene::SMD3Mesh::SMD3Mesh
SMD3Mesh()
Definition: IAnimatedMeshMD3.h:267
irr::scene::SMD3MeshBuffer
Holding Frame Data for a Mesh.
Definition: IAnimatedMeshMD3.h:140
irr::scene::EMD3_TORSO_ATTACK_2
@ EMD3_TORSO_ATTACK_2
Definition: IAnimatedMeshMD3.h:40
irr::scene::EMD3_TORSO_STAND_1
@ EMD3_TORSO_STAND_1
Definition: IAnimatedMeshMD3.h:43
irr::scene::SMD3QuaternionTagList::get
SMD3QuaternionTag * get(const core::stringc &name)
Definition: IAnimatedMeshMD3.h:213
irr::scene::IAnimatedMeshMD3::getTagList
virtual SMD3QuaternionTagList * getTagList(s32 frame, s32 detailLevel, s32 startFrameLoop, s32 endFrameLoop)=0
get the tag list of the mesh.
irr::scene::SMD3Header
this holds the header info of the MD3 file
Definition: IAnimatedMeshMD3.h:81
irr::scene::EMD3_LEGS_JUMP_2
@ EMD3_LEGS_JUMP_2
Definition: IAnimatedMeshMD3.h:54
irr::scene::SMD3MeshBuffer::Vertices
core::array< SMD3Vertex > Vertices
Definition: IAnimatedMeshMD3.h:146
irr::scene::EMD3_TORSO_GESTURE
@ EMD3_TORSO_GESTURE
Definition: IAnimatedMeshMD3.h:38
irr::core::DEGTORAD
const f32 DEGTORAD
32bit Constant for converting from degrees to radians
Definition: irrMath.h:74
irr::scene::SMD3QuaternionTagList::push_back
void push_back(const SMD3QuaternionTag &other)
Definition: IAnimatedMeshMD3.h:248
irr::scene::EMD3_LEGS_LAND_1
@ EMD3_LEGS_LAND_1
Definition: IAnimatedMeshMD3.h:53
irrunpack.h
irr::scene::PACK_STRUCT
struct irr::scene::SMD3Header PACK_STRUCT
irr::c8
char c8
8 bit character variable.
Definition: irrTypes.h:31
irr::core::ALLOC_STRATEGY_SAFE
@ ALLOC_STRATEGY_SAFE
Definition: irrAllocator.h:114
irr::scene::EMD3_LEGS_BACK
@ EMD3_LEGS_BACK
Definition: IAnimatedMeshMD3.h:50
irr::scene::SMD3MeshHeader::offset_triangles
s32 offset_triangles
Definition: IAnimatedMeshMD3.h:107
irr::scene::SMD3QuaternionTagList::size
u32 size() const
Definition: IAnimatedMeshMD3.h:222
irr::scene::EMD3_LEGS_JUMP_1
@ EMD3_LEGS_JUMP_1
Definition: IAnimatedMeshMD3.h:52
irr::scene::SMD3QuaternionTag::SMD3QuaternionTag
SMD3QuaternionTag(const core::stringc &name)
Definition: IAnimatedMeshMD3.h:166
irr::scene::EMD3_LOWER
@ EMD3_LOWER
Definition: IAnimatedMeshMD3.h:21
irr::scene::SMD3Mesh::Name
core::stringc Name
Definition: IAnimatedMeshMD3.h:278
irr::scene::EMD3_TORSO_RAISE
@ EMD3_TORSO_RAISE
Definition: IAnimatedMeshMD3.h:42
irr::IReferenceCounted::drop
bool drop() const
Drops the object. Decrements the reference counter by one.
Definition: IReferenceCounted.h:116
irr::s16
signed short s16
16 bit signed variable.
Definition: irrTypes.h:48
irr::scene::SMD3MeshHeader::meshID
c8 meshID[4]
Definition: IAnimatedMeshMD3.h:99
quaternion.h
irr::scene::SMD3MeshBuffer::Tex
core::array< SMD3TexCoord > Tex
Definition: IAnimatedMeshMD3.h:147
IAnimatedMesh.h
irr::scene::SMD3QuaternionTag::Name
core::stringc Name
Definition: IAnimatedMeshMD3.h:192
irr::scene::SMD3QuaternionTagList
holds a associative list of named quaternions
Definition: IAnimatedMeshMD3.h:198
irr::scene::SMD3QuaternionTagList::SMD3QuaternionTagList
SMD3QuaternionTagList()
Definition: IAnimatedMeshMD3.h:200
irr::scene::EMD3_TORSO_DROP
@ EMD3_TORSO_DROP
Definition: IAnimatedMeshMD3.h:41
irr::scene::SMD3AnimationInfo::looping
s32 looping
Looping frames.
Definition: IAnimatedMeshMD3.h:71
irr::scene::SMD3QuaternionTagList::~SMD3QuaternionTagList
virtual ~SMD3QuaternionTagList()
Definition: IAnimatedMeshMD3.h:211
irr::scene::SMD3MeshHeader::numTriangles
s32 numTriangles
Definition: IAnimatedMeshMD3.h:105
irr::scene::EMD3_BOTH_DEAD_3
@ EMD3_BOTH_DEAD_3
Definition: IAnimatedMeshMD3.h:35
irr::core::quaternion
Quaternion class for representing rotations.
Definition: quaternion.h:26
irr::scene::SMD3MeshHeader::offset_end
s32 offset_end
Definition: IAnimatedMeshMD3.h:111
irr::scene::IAnimatedMeshMD3::getOriginalMesh
virtual SMD3Mesh * getOriginalMesh()=0
get the original md3 mesh.
irr::scene::SMD3MeshHeader::numShader
s32 numShader
Definition: IAnimatedMeshMD3.h:103
irr::scene::SMD3QuaternionTagList::operator=
SMD3QuaternionTagList & operator=(const SMD3QuaternionTagList &copyMe)
Definition: IAnimatedMeshMD3.h:253
irr::scene::EMD3_HEAD
@ EMD3_HEAD
Definition: IAnimatedMeshMD3.h:19
irr::scene::SMD3QuaternionTag::rotation
core::quaternion rotation
Definition: IAnimatedMeshMD3.h:194
irr::scene::SMD3MeshHeader::numVertices
s32 numVertices
Definition: IAnimatedMeshMD3.h:104
irr::scene::SMD3AnimationInfo::fps
s32 fps
Frames per second.
Definition: IAnimatedMeshMD3.h:73
irr::scene::SMD3Header::numTags
s32 numTags
Definition: IAnimatedMeshMD3.h:87
irr::scene::EMD3_BOTH_DEATH_3
@ EMD3_BOTH_DEATH_3
Definition: IAnimatedMeshMD3.h:34
irr::scene::SMD3MeshBuffer::Indices
core::array< s32 > Indices
Definition: IAnimatedMeshMD3.h:145
irr::scene::SMD3QuaternionTag::position
core::vector3df position
Definition: IAnimatedMeshMD3.h:193
irr::scene::IAnimatedMesh
Interface for an animated mesh.
Definition: IAnimatedMesh.h:62
irr::s32
signed int s32
32 bit signed variable.
Definition: irrTypes.h:66
irr::scene::EMD3_UPPER
@ EMD3_UPPER
Definition: IAnimatedMeshMD3.h:20
irr::scene::EMD3_TORSO_ATTACK_1
@ EMD3_TORSO_ATTACK_1
Definition: IAnimatedMeshMD3.h:39
irr::scene::SMD3Header::Version
s32 Version
Definition: IAnimatedMeshMD3.h:84
irr::scene::SMD3Header::tagStart
s32 tagStart
Definition: IAnimatedMeshMD3.h:91
irr::scene::SMD3QuaternionTagList::operator[]
const SMD3QuaternionTag & operator[](u32 index) const
Definition: IAnimatedMeshMD3.h:238
irr::scene::SMD3MeshBuffer::MeshHeader
SMD3MeshHeader MeshHeader
Definition: IAnimatedMeshMD3.h:142
irr::core::CMatrix4
4x4 matrix. Mostly used as transformation matrix for 3d calculations.
Definition: matrix4.h:45
irr::scene::IAnimatedMeshMD3
Interface for using some special functions of MD3 meshes.
Definition: IAnimatedMeshMD3.h:286
irr::s8
signed char s8
8 bit signed variable.
Definition: irrTypes.h:26
irr::scene::SMD3Vertex::normal
u8 normal[2]
Definition: IAnimatedMeshMD3.h:119
irr::scene::EMD3_BOTH_DEAD_2
@ EMD3_BOTH_DEAD_2
Definition: IAnimatedMeshMD3.h:33
irr::IReferenceCounted
Base class of most objects of the Irrlicht Engine.
Definition: IReferenceCounted.h:41
irr::scene::SMD3Vertex
Compressed Vertex Data.
Definition: IAnimatedMeshMD3.h:116
irr::scene::SMD3QuaternionTag::~SMD3QuaternionTag
virtual ~SMD3QuaternionTag()
Definition: IAnimatedMeshMD3.h:154
irr::scene::EMD3_WEAPON
@ EMD3_WEAPON
Definition: IAnimatedMeshMD3.h:22
irr::scene::SMD3AnimationInfo
Definition: IAnimatedMeshMD3.h:64
irr::core::quaternion::getMatrix
matrix4 getMatrix() const
Creates a matrix from this quaternion.
Definition: quaternion.h:338
irr::f32
float f32
32 bit floating point variable.
Definition: irrTypes.h:104
irr::scene::EMD3_TORSO_STAND_2
@ EMD3_TORSO_STAND_2
Definition: IAnimatedMeshMD3.h:44
irr::scene::SMD3QuaternionTag
hold a tag info for connecting meshes
Definition: IAnimatedMeshMD3.h:152
irr::scene::EMD3_LEGS_SWIM
@ EMD3_LEGS_SWIM
Definition: IAnimatedMeshMD3.h:51
irr::scene::SMD3Mesh
Holding Frames Buffers and Tag Infos.
Definition: IAnimatedMeshMD3.h:265
irr::scene::SMD3MeshHeader
this holds the header info of an MD3 mesh section
Definition: IAnimatedMeshMD3.h:97
irr::scene::SMD3Header::tagEnd
s32 tagEnd
Definition: IAnimatedMeshMD3.h:92
irr::scene::SMD3TexCoord::v
f32 v
Definition: IAnimatedMeshMD3.h:126
irr::scene::EMD3_LEGS_WALK_CROUCH
@ EMD3_LEGS_WALK_CROUCH
Definition: IAnimatedMeshMD3.h:47
irr::scene::SMD3Mesh::TagList
SMD3QuaternionTagList TagList
Definition: IAnimatedMeshMD3.h:280
irr::scene::SMD3MeshHeader::vertexStart
s32 vertexStart
Definition: IAnimatedMeshMD3.h:110
irr::scene::SMD3QuaternionTag::SMD3QuaternionTag
SMD3QuaternionTag(const core::vector3df &pos, const core::vector3df &angle)
Definition: IAnimatedMeshMD3.h:170
irr::scene::SMD3QuaternionTagList::operator[]
SMD3QuaternionTag & operator[](u32 index)
Definition: IAnimatedMeshMD3.h:243
irr::scene::SMD3Face::Index
s32 Index[3]
Definition: IAnimatedMeshMD3.h:132
irr::scene::EMD3_BOTH_DEATH_1
@ EMD3_BOTH_DEATH_1
Definition: IAnimatedMeshMD3.h:30
irr::scene::SMD3QuaternionTag::SMD3QuaternionTag
SMD3QuaternionTag(const SMD3QuaternionTag &copyMe)
Definition: IAnimatedMeshMD3.h:160
irr::scene::SMD3QuaternionTagList::set_used
void set_used(u32 new_size)
Definition: IAnimatedMeshMD3.h:227
irr::scene::SMD3TexCoord::u
f32 u
Definition: IAnimatedMeshMD3.h:125
irr::core::string
Definition: irrString.h:73
irr::scene::EMD3_LEGS_WALK
@ EMD3_LEGS_WALK
Definition: IAnimatedMeshMD3.h:48
irr::scene::SMD3MeshHeader::numFrames
s32 numFrames
Definition: IAnimatedMeshMD3.h:102
irr::scene::EMD3_LEGS_IDLE_CROUCH
@ EMD3_LEGS_IDLE_CROUCH
Definition: IAnimatedMeshMD3.h:57
irr::scene::IAnimatedMeshMD3::setInterpolationShift
virtual void setInterpolationShift(u32 shift, u32 loopMode)=0
tune how many frames you want to render inbetween.
irr::scene::SMD3Header::frameStart
s32 frameStart
Definition: IAnimatedMeshMD3.h:90
irr::scene::SMD3MeshHeader::meshName
c8 meshName[68]
Definition: IAnimatedMeshMD3.h:100
irr
Everything in the Irrlicht Engine can be found in this namespace.
Definition: aabbox3d.h:12
irr::scene::SMD3QuaternionTag::operator==
bool operator==(const SMD3QuaternionTag &other) const
Definition: IAnimatedMeshMD3.h:179
IQ3Shader.h
irr::u32
unsigned int u32
32 bit unsigned variable.
Definition: irrTypes.h:58
irr::scene::SMD3Header::headerID
c8 headerID[4]
Definition: IAnimatedMeshMD3.h:83
irr::scene::SMD3QuaternionTagList::SMD3QuaternionTagList
SMD3QuaternionTagList(const SMD3QuaternionTagList &copyMe)
Definition: IAnimatedMeshMD3.h:206
irr::scene::SMD3Face
Triangle Index.
Definition: IAnimatedMeshMD3.h:130
irr::scene::EMD3_ANIMATION_COUNT
@ EMD3_ANIMATION_COUNT
Not an animation, but amount of animation types.
Definition: IAnimatedMeshMD3.h:61
irr::core::array< s32 >
irr::scene::SMD3MeshHeader::offset_st
s32 offset_st
Definition: IAnimatedMeshMD3.h:109
irr::scene::SMD3QuaternionTag::setto
void setto(core::matrix4 &m)
Definition: IAnimatedMeshMD3.h:174
irr::scene::EMD3_BOTH_DEATH_2
@ EMD3_BOTH_DEATH_2
Definition: IAnimatedMeshMD3.h:32
irr::scene::eMD3Models
eMD3Models
Definition: IAnimatedMeshMD3.h:17
irr::scene::EMD3_LEGS_LAND_2
@ EMD3_LEGS_LAND_2
Definition: IAnimatedMeshMD3.h:55
irr::scene::SMD3QuaternionTag::operator=
SMD3QuaternionTag & operator=(const SMD3QuaternionTag &copyMe)
Definition: IAnimatedMeshMD3.h:184
irr::scene::EMD3_NUMMODELS
@ EMD3_NUMMODELS
Definition: IAnimatedMeshMD3.h:23
irr::core::vector3d< f32 >
irr::scene::SMD3Header::fileSize
s32 fileSize
Definition: IAnimatedMeshMD3.h:93
irr::scene::SMD3MeshBuffer::Shader
core::stringc Shader
Definition: IAnimatedMeshMD3.h:144
irr::scene::EMD3_LEGS_IDLE
@ EMD3_LEGS_IDLE
Definition: IAnimatedMeshMD3.h:56
irr::scene::EMD3_BOTH_DEAD_1
@ EMD3_BOTH_DEAD_1
Definition: IAnimatedMeshMD3.h:31
irr::scene::SMD3Header::numMaxSkins
s32 numMaxSkins
Definition: IAnimatedMeshMD3.h:89
irr::u8
unsigned char u8
8 bit unsigned variable.
Definition: irrTypes.h:18
irr::core::vector3d::X
T X
X coordinate of the vector.
Definition: vector3d.h:408
irr::scene::SMD3Mesh::MD3Header
SMD3Header MD3Header
Definition: IAnimatedMeshMD3.h:281
irr::scene::EMD3_LEGS_TURN
@ EMD3_LEGS_TURN
Definition: IAnimatedMeshMD3.h:58
irr::scene::SMD3Mesh::~SMD3Mesh
virtual ~SMD3Mesh()
Definition: IAnimatedMeshMD3.h:272
irr::scene::SMD3AnimationInfo::num
s32 num
Last frame.
Definition: IAnimatedMeshMD3.h:69