Anim.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. /*
  2. ===========================================================================
  3. Doom 3 GPL Source Code
  4. Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
  5. This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
  6. Doom 3 Source Code is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10. Doom 3 Source Code is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
  16. In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
  17. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
  18. ===========================================================================
  19. */
  20. #ifndef __ANIM_H__
  21. #define __ANIM_H__
  22. //
  23. // animation channels
  24. // these can be changed by modmakers and licensees to be whatever they need.
  25. const int ANIM_NumAnimChannels = 5;
  26. const int ANIM_MaxAnimsPerChannel = 3;
  27. const int ANIM_MaxSyncedAnims = 3;
  28. //
  29. // animation channels. make sure to change script/doom_defs.script if you add any channels, or change their order
  30. //
  31. const int ANIMCHANNEL_ALL = 0;
  32. const int ANIMCHANNEL_TORSO = 1;
  33. const int ANIMCHANNEL_LEGS = 2;
  34. const int ANIMCHANNEL_HEAD = 3;
  35. const int ANIMCHANNEL_EYELIDS = 4;
  36. // for converting from 24 frames per second to milliseconds
  37. ID_INLINE int FRAME2MS( int framenum ) {
  38. return ( framenum * 1000 ) / 24;
  39. }
  40. class idRenderModel;
  41. class idAnimator;
  42. class idAnimBlend;
  43. class function_t;
  44. class idEntity;
  45. class idSaveGame;
  46. class idRestoreGame;
  47. typedef struct {
  48. int cycleCount; // how many times the anim has wrapped to the begining (0 for clamped anims)
  49. int frame1;
  50. int frame2;
  51. float frontlerp;
  52. float backlerp;
  53. } frameBlend_t;
  54. typedef struct {
  55. int nameIndex;
  56. int parentNum;
  57. int animBits;
  58. int firstComponent;
  59. } jointAnimInfo_t;
  60. typedef struct {
  61. jointHandle_t num;
  62. jointHandle_t parentNum;
  63. int channel;
  64. } jointInfo_t;
  65. //
  66. // joint modifier modes. make sure to change script/doom_defs.script if you add any, or change their order.
  67. //
  68. typedef enum {
  69. JOINTMOD_NONE, // no modification
  70. JOINTMOD_LOCAL, // modifies the joint's position or orientation in joint local space
  71. JOINTMOD_LOCAL_OVERRIDE, // sets the joint's position or orientation in joint local space
  72. JOINTMOD_WORLD, // modifies joint's position or orientation in model space
  73. JOINTMOD_WORLD_OVERRIDE // sets the joint's position or orientation in model space
  74. } jointModTransform_t;
  75. typedef struct {
  76. jointHandle_t jointnum;
  77. idMat3 mat;
  78. idVec3 pos;
  79. jointModTransform_t transform_pos;
  80. jointModTransform_t transform_axis;
  81. } jointMod_t;
  82. #define ANIM_TX BIT( 0 )
  83. #define ANIM_TY BIT( 1 )
  84. #define ANIM_TZ BIT( 2 )
  85. #define ANIM_QX BIT( 3 )
  86. #define ANIM_QY BIT( 4 )
  87. #define ANIM_QZ BIT( 5 )
  88. typedef enum {
  89. FC_SCRIPTFUNCTION,
  90. FC_SCRIPTFUNCTIONOBJECT,
  91. FC_EVENTFUNCTION,
  92. FC_SOUND,
  93. FC_SOUND_VOICE,
  94. FC_SOUND_VOICE2,
  95. FC_SOUND_BODY,
  96. FC_SOUND_BODY2,
  97. FC_SOUND_BODY3,
  98. FC_SOUND_WEAPON,
  99. FC_SOUND_ITEM,
  100. FC_SOUND_GLOBAL,
  101. FC_SOUND_CHATTER,
  102. FC_SKIN,
  103. FC_TRIGGER,
  104. FC_TRIGGER_SMOKE_PARTICLE,
  105. FC_MELEE,
  106. FC_DIRECTDAMAGE,
  107. FC_BEGINATTACK,
  108. FC_ENDATTACK,
  109. FC_MUZZLEFLASH,
  110. FC_CREATEMISSILE,
  111. FC_LAUNCHMISSILE,
  112. FC_FIREMISSILEATTARGET,
  113. FC_FOOTSTEP,
  114. FC_LEFTFOOT,
  115. FC_RIGHTFOOT,
  116. FC_ENABLE_EYE_FOCUS,
  117. FC_DISABLE_EYE_FOCUS,
  118. FC_FX,
  119. FC_DISABLE_GRAVITY,
  120. FC_ENABLE_GRAVITY,
  121. FC_JUMP,
  122. FC_ENABLE_CLIP,
  123. FC_DISABLE_CLIP,
  124. FC_ENABLE_WALK_IK,
  125. FC_DISABLE_WALK_IK,
  126. FC_ENABLE_LEG_IK,
  127. FC_DISABLE_LEG_IK,
  128. FC_RECORDDEMO,
  129. FC_AVIGAME
  130. } frameCommandType_t;
  131. typedef struct {
  132. int num;
  133. int firstCommand;
  134. } frameLookup_t;
  135. typedef struct {
  136. frameCommandType_t type;
  137. idStr *string;
  138. union {
  139. const idSoundShader *soundShader;
  140. const function_t *function;
  141. const idDeclSkin *skin;
  142. int index;
  143. };
  144. } frameCommand_t;
  145. typedef struct {
  146. bool prevent_idle_override : 1;
  147. bool random_cycle_start : 1;
  148. bool ai_no_turn : 1;
  149. bool anim_turn : 1;
  150. } animFlags_t;
  151. /*
  152. ==============================================================================================
  153. idModelExport
  154. ==============================================================================================
  155. */
  156. class idModelExport {
  157. private:
  158. void Reset( void );
  159. bool ParseOptions( idLexer &lex );
  160. int ParseExportSection( idParser &parser );
  161. static bool CheckMayaInstall( void );
  162. static void LoadMayaDll( void );
  163. bool ConvertMayaToMD5( void );
  164. static bool initialized;
  165. public:
  166. idStr commandLine;
  167. idStr src;
  168. idStr dest;
  169. bool force;
  170. idModelExport();
  171. static void Shutdown( void );
  172. int ExportDefFile( const char *filename );
  173. bool ExportModel( const char *model );
  174. bool ExportAnim( const char *anim );
  175. int ExportModels( const char *pathname, const char *extension );
  176. };
  177. /*
  178. ==============================================================================================
  179. idMD5Anim
  180. ==============================================================================================
  181. */
  182. class idMD5Anim {
  183. private:
  184. int numFrames;
  185. int frameRate;
  186. int animLength;
  187. int numJoints;
  188. int numAnimatedComponents;
  189. idList<idBounds> bounds;
  190. idList<jointAnimInfo_t> jointInfo;
  191. idList<idJointQuat> baseFrame;
  192. idList<float> componentFrames;
  193. idStr name;
  194. idVec3 totaldelta;
  195. mutable int ref_count;
  196. public:
  197. idMD5Anim();
  198. ~idMD5Anim();
  199. void Free( void );
  200. bool Reload( void );
  201. size_t Allocated( void ) const;
  202. size_t Size( void ) const { return sizeof( *this ) + Allocated(); };
  203. bool LoadAnim( const char *filename );
  204. void IncreaseRefs( void ) const;
  205. void DecreaseRefs( void ) const;
  206. int NumRefs( void ) const;
  207. void CheckModelHierarchy( const idRenderModel *model ) const;
  208. void GetInterpolatedFrame( frameBlend_t &frame, idJointQuat *joints, const int *index, int numIndexes ) const;
  209. void GetSingleFrame( int framenum, idJointQuat *joints, const int *index, int numIndexes ) const;
  210. int Length( void ) const;
  211. int NumFrames( void ) const;
  212. int NumJoints( void ) const;
  213. const idVec3 &TotalMovementDelta( void ) const;
  214. const char *Name( void ) const;
  215. void GetFrameBlend( int framenum, frameBlend_t &frame ) const; // frame 1 is first frame
  216. void ConvertTimeToFrame( int time, int cyclecount, frameBlend_t &frame ) const;
  217. void GetOrigin( idVec3 &offset, int currentTime, int cyclecount ) const;
  218. void GetOriginRotation( idQuat &rotation, int time, int cyclecount ) const;
  219. void GetBounds( idBounds &bounds, int currentTime, int cyclecount ) const;
  220. };
  221. /*
  222. ==============================================================================================
  223. idAnim
  224. ==============================================================================================
  225. */
  226. class idAnim {
  227. private:
  228. const class idDeclModelDef *modelDef;
  229. const idMD5Anim *anims[ ANIM_MaxSyncedAnims ];
  230. int numAnims;
  231. idStr name;
  232. idStr realname;
  233. idList<frameLookup_t> frameLookup;
  234. idList<frameCommand_t> frameCommands;
  235. animFlags_t flags;
  236. public:
  237. idAnim();
  238. idAnim( const idDeclModelDef *modelDef, const idAnim *anim );
  239. ~idAnim();
  240. void SetAnim( const idDeclModelDef *modelDef, const char *sourcename, const char *animname, int num, const idMD5Anim *md5anims[ ANIM_MaxSyncedAnims ] );
  241. const char *Name( void ) const;
  242. const char *FullName( void ) const;
  243. const idMD5Anim *MD5Anim( int num ) const;
  244. const idDeclModelDef *ModelDef( void ) const;
  245. int Length( void ) const;
  246. int NumFrames( void ) const;
  247. int NumAnims( void ) const;
  248. const idVec3 &TotalMovementDelta( void ) const;
  249. bool GetOrigin( idVec3 &offset, int animNum, int time, int cyclecount ) const;
  250. bool GetOriginRotation( idQuat &rotation, int animNum, int currentTime, int cyclecount ) const;
  251. bool GetBounds( idBounds &bounds, int animNum, int time, int cyclecount ) const;
  252. const char *AddFrameCommand( const class idDeclModelDef *modelDef, int framenum, idLexer &src, const idDict *def );
  253. void CallFrameCommands( idEntity *ent, int from, int to ) const;
  254. bool HasFrameCommands( void ) const;
  255. // returns first frame (zero based) that command occurs. returns -1 if not found.
  256. int FindFrameForFrameCommand( frameCommandType_t framecommand, const frameCommand_t **command ) const;
  257. void SetAnimFlags( const animFlags_t &animflags );
  258. const animFlags_t &GetAnimFlags( void ) const;
  259. };
  260. /*
  261. ==============================================================================================
  262. idDeclModelDef
  263. ==============================================================================================
  264. */
  265. class idDeclModelDef : public idDecl {
  266. public:
  267. idDeclModelDef();
  268. ~idDeclModelDef();
  269. virtual size_t Size( void ) const;
  270. virtual const char * DefaultDefinition( void ) const;
  271. virtual bool Parse( const char *text, const int textLength );
  272. virtual void FreeData( void );
  273. void Touch( void ) const;
  274. const idDeclSkin * GetDefaultSkin( void ) const;
  275. const idJointQuat * GetDefaultPose( void ) const;
  276. void SetupJoints( int *numJoints, idJointMat **jointList, idBounds &frameBounds, bool removeOriginOffset ) const;
  277. idRenderModel * ModelHandle( void ) const;
  278. void GetJointList( const char *jointnames, idList<jointHandle_t> &jointList ) const;
  279. const jointInfo_t * FindJoint( const char *name ) const;
  280. int NumAnims( void ) const;
  281. const idAnim * GetAnim( int index ) const;
  282. int GetSpecificAnim( const char *name ) const;
  283. int GetAnim( const char *name ) const;
  284. bool HasAnim( const char *name ) const;
  285. const idDeclSkin * GetSkin( void ) const;
  286. const char * GetModelName( void ) const;
  287. const idList<jointInfo_t> & Joints( void ) const;
  288. const int * JointParents( void ) const;
  289. int NumJoints( void ) const;
  290. const jointInfo_t * GetJoint( int jointHandle ) const;
  291. const char * GetJointName( int jointHandle ) const;
  292. int NumJointsOnChannel( int channel ) const;
  293. const int * GetChannelJoints( int channel ) const;
  294. const idVec3 & GetVisualOffset( void ) const;
  295. private:
  296. void CopyDecl( const idDeclModelDef *decl );
  297. bool ParseAnim( idLexer &src, int numDefaultAnims );
  298. private:
  299. idVec3 offset;
  300. idList<jointInfo_t> joints;
  301. idList<int> jointParents;
  302. idList<int> channelJoints[ ANIM_NumAnimChannels ];
  303. idRenderModel * modelHandle;
  304. idList<idAnim *> anims;
  305. const idDeclSkin * skin;
  306. };
  307. /*
  308. ==============================================================================================
  309. idAnimBlend
  310. ==============================================================================================
  311. */
  312. class idAnimBlend {
  313. private:
  314. const class idDeclModelDef *modelDef;
  315. int starttime;
  316. int endtime;
  317. int timeOffset;
  318. float rate;
  319. int blendStartTime;
  320. int blendDuration;
  321. float blendStartValue;
  322. float blendEndValue;
  323. float animWeights[ ANIM_MaxSyncedAnims ];
  324. short cycle;
  325. short frame;
  326. short animNum;
  327. bool allowMove;
  328. bool allowFrameCommands;
  329. friend class idAnimator;
  330. void Reset( const idDeclModelDef *_modelDef );
  331. void CallFrameCommands( idEntity *ent, int fromtime, int totime ) const;
  332. void SetFrame( const idDeclModelDef *modelDef, int animnum, int frame, int currenttime, int blendtime );
  333. void CycleAnim( const idDeclModelDef *modelDef, int animnum, int currenttime, int blendtime );
  334. void PlayAnim( const idDeclModelDef *modelDef, int animnum, int currenttime, int blendtime );
  335. bool BlendAnim( int currentTime, int channel, int numJoints, idJointQuat *blendFrame, float &blendWeight, bool removeOrigin, bool overrideBlend, bool printInfo ) const;
  336. void BlendOrigin( int currentTime, idVec3 &blendPos, float &blendWeight, bool removeOriginOffset ) const;
  337. void BlendDelta( int fromtime, int totime, idVec3 &blendDelta, float &blendWeight ) const;
  338. void BlendDeltaRotation( int fromtime, int totime, idQuat &blendDelta, float &blendWeight ) const;
  339. bool AddBounds( int currentTime, idBounds &bounds, bool removeOriginOffset ) const;
  340. public:
  341. idAnimBlend();
  342. void Save( idSaveGame *savefile ) const;
  343. void Restore( idRestoreGame *savefile, const idDeclModelDef *modelDef );
  344. const char *AnimName( void ) const;
  345. const char *AnimFullName( void ) const;
  346. float GetWeight( int currenttime ) const;
  347. float GetFinalWeight( void ) const;
  348. void SetWeight( float newweight, int currenttime, int blendtime );
  349. int NumSyncedAnims( void ) const;
  350. bool SetSyncedAnimWeight( int num, float weight );
  351. void Clear( int currentTime, int clearTime );
  352. bool IsDone( int currentTime ) const;
  353. bool FrameHasChanged( int currentTime ) const;
  354. int GetCycleCount( void ) const;
  355. void SetCycleCount( int count );
  356. void SetPlaybackRate( int currentTime, float newRate );
  357. float GetPlaybackRate( void ) const;
  358. void SetStartTime( int startTime );
  359. int GetStartTime( void ) const;
  360. int GetEndTime( void ) const;
  361. int GetFrameNumber( int currenttime ) const;
  362. int AnimTime( int currenttime ) const;
  363. int NumFrames( void ) const;
  364. int Length( void ) const;
  365. int PlayLength( void ) const;
  366. void AllowMovement( bool allow );
  367. void AllowFrameCommands( bool allow );
  368. const idAnim *Anim( void ) const;
  369. int AnimNum( void ) const;
  370. };
  371. /*
  372. ==============================================================================================
  373. idAFPoseJointMod
  374. ==============================================================================================
  375. */
  376. typedef enum {
  377. AF_JOINTMOD_AXIS,
  378. AF_JOINTMOD_ORIGIN,
  379. AF_JOINTMOD_BOTH
  380. } AFJointModType_t;
  381. class idAFPoseJointMod {
  382. public:
  383. idAFPoseJointMod( void );
  384. AFJointModType_t mod;
  385. idMat3 axis;
  386. idVec3 origin;
  387. };
  388. ID_INLINE idAFPoseJointMod::idAFPoseJointMod( void ) {
  389. mod = AF_JOINTMOD_AXIS;
  390. axis.Identity();
  391. origin.Zero();
  392. }
  393. /*
  394. ==============================================================================================
  395. idAnimator
  396. ==============================================================================================
  397. */
  398. class idAnimator {
  399. public:
  400. idAnimator();
  401. ~idAnimator();
  402. size_t Allocated( void ) const;
  403. size_t Size( void ) const;
  404. void Save( idSaveGame *savefile ) const; // archives object for save game file
  405. void Restore( idRestoreGame *savefile ); // unarchives object from save game file
  406. void SetEntity( idEntity *ent );
  407. idEntity *GetEntity( void ) const ;
  408. void RemoveOriginOffset( bool remove );
  409. bool RemoveOrigin( void ) const;
  410. void GetJointList( const char *jointnames, idList<jointHandle_t> &jointList ) const;
  411. int NumAnims( void ) const;
  412. const idAnim *GetAnim( int index ) const;
  413. int GetAnim( const char *name ) const;
  414. bool HasAnim( const char *name ) const;
  415. void ServiceAnims( int fromtime, int totime );
  416. bool IsAnimating( int currentTime ) const;
  417. void GetJoints( int *numJoints, idJointMat **jointsPtr );
  418. int NumJoints( void ) const;
  419. jointHandle_t GetFirstChild( jointHandle_t jointnum ) const;
  420. jointHandle_t GetFirstChild( const char *name ) const;
  421. idRenderModel *SetModel( const char *modelname );
  422. idRenderModel *ModelHandle( void ) const;
  423. const idDeclModelDef *ModelDef( void ) const;
  424. void ForceUpdate( void );
  425. void ClearForceUpdate( void );
  426. bool CreateFrame( int animtime, bool force );
  427. bool FrameHasChanged( int animtime ) const;
  428. void GetDelta( int fromtime, int totime, idVec3 &delta ) const;
  429. bool GetDeltaRotation( int fromtime, int totime, idMat3 &delta ) const;
  430. void GetOrigin( int currentTime, idVec3 &pos ) const;
  431. bool GetBounds( int currentTime, idBounds &bounds );
  432. idAnimBlend *CurrentAnim( int channelNum );
  433. void Clear( int channelNum, int currentTime, int cleartime );
  434. void SetFrame( int channelNum, int animnum, int frame, int currenttime, int blendtime );
  435. void CycleAnim( int channelNum, int animnum, int currenttime, int blendtime );
  436. void PlayAnim( int channelNum, int animnum, int currenttime, int blendTime );
  437. // copies the current anim from fromChannelNum to channelNum.
  438. // the copied anim will have frame commands disabled to avoid executing them twice.
  439. void SyncAnimChannels( int channelNum, int fromChannelNum, int currenttime, int blendTime );
  440. void SetJointPos( jointHandle_t jointnum, jointModTransform_t transform_type, const idVec3 &pos );
  441. void SetJointAxis( jointHandle_t jointnum, jointModTransform_t transform_type, const idMat3 &mat );
  442. void ClearJoint( jointHandle_t jointnum );
  443. void ClearAllJoints( void );
  444. void InitAFPose( void );
  445. void SetAFPoseJointMod( const jointHandle_t jointNum, const AFJointModType_t mod, const idMat3 &axis, const idVec3 &origin );
  446. void FinishAFPose( int animnum, const idBounds &bounds, const int time );
  447. void SetAFPoseBlendWeight( float blendWeight );
  448. bool BlendAFPose( idJointQuat *blendFrame ) const;
  449. void ClearAFPose( void );
  450. void ClearAllAnims( int currentTime, int cleartime );
  451. jointHandle_t GetJointHandle( const char *name ) const;
  452. const char * GetJointName( jointHandle_t handle ) const;
  453. int GetChannelForJoint( jointHandle_t joint ) const;
  454. bool GetJointTransform( jointHandle_t jointHandle, int currenttime, idVec3 &offset, idMat3 &axis );
  455. bool GetJointLocalTransform( jointHandle_t jointHandle, int currentTime, idVec3 &offset, idMat3 &axis );
  456. const animFlags_t GetAnimFlags( int animnum ) const;
  457. int NumFrames( int animnum ) const;
  458. int NumSyncedAnims( int animnum ) const;
  459. const char *AnimName( int animnum ) const;
  460. const char *AnimFullName( int animnum ) const;
  461. int AnimLength( int animnum ) const;
  462. const idVec3 &TotalMovementDelta( int animnum ) const;
  463. private:
  464. void FreeData( void );
  465. void PushAnims( int channel, int currentTime, int blendTime );
  466. private:
  467. const idDeclModelDef * modelDef;
  468. idEntity * entity;
  469. idAnimBlend channels[ ANIM_NumAnimChannels ][ ANIM_MaxAnimsPerChannel ];
  470. idList<jointMod_t *> jointMods;
  471. int numJoints;
  472. idJointMat * joints;
  473. mutable int lastTransformTime; // mutable because the value is updated in CreateFrame
  474. mutable bool stoppedAnimatingUpdate;
  475. bool removeOriginOffset;
  476. bool forceUpdate;
  477. idBounds frameBounds;
  478. float AFPoseBlendWeight;
  479. idList<int> AFPoseJoints;
  480. idList<idAFPoseJointMod> AFPoseJointMods;
  481. idList<idJointQuat> AFPoseJointFrame;
  482. idBounds AFPoseBounds;
  483. int AFPoseTime;
  484. };
  485. /*
  486. ==============================================================================================
  487. idAnimManager
  488. ==============================================================================================
  489. */
  490. class idAnimManager {
  491. public:
  492. idAnimManager();
  493. ~idAnimManager();
  494. static bool forceExport;
  495. void Shutdown( void );
  496. idMD5Anim * GetAnim( const char *name );
  497. void ReloadAnims( void );
  498. void ListAnims( void ) const;
  499. int JointIndex( const char *name );
  500. const char * JointName( int index ) const;
  501. void ClearAnimsInUse( void );
  502. void FlushUnusedAnims( void );
  503. private:
  504. idHashTable<idMD5Anim *> animations;
  505. idStrList jointnames;
  506. idHashIndex jointnamesHash;
  507. };
  508. #endif /* !__ANIM_H__ */