7 #ifndef CAFU_HL2_MDL_ANIM_DATA_HPP_INCLUDED
8 #define CAFU_HL2_MDL_ANIM_DATA_HPP_INCLUDED
10 #include "Math3D/Vector3.hpp"
11 #include "Templates/Array.hpp"
13 #if defined(_WIN32) && _MSC_VER<1600
47 #define STUDIO_ANIM_RAWPOS 0x01 // Vector48
48 #define STUDIO_ANIM_RAWROT 0x02 // Quaternion48
49 #define STUDIO_ANIM_ANIMPOS 0x04 // StudioAnim_ValuePointerT
50 #define STUDIO_ANIM_ANIMROT 0x08 // StudioAnim_ValuePointerT
51 #define STUDIO_ANIM_DELTA 0x10
52 #define STUDIO_ANIM_RAWROT2 0x20 // Quaternion64
61 operator Quaternion()
const
66 tmp.x = ((int)x - 1048576) * (1 / 1048576.5f);
67 tmp.y = ((int)y - 1048576) * (1 / 1048576.5f);
68 tmp.z = ((int)z - 1048576) * (1 / 1048576.5f);
69 tmp.w = sqrt( 1 - tmp.x * tmp.x - tmp.y * tmp.y - tmp.z * tmp.z );
101 uint8_t *pData()
const {
return (((uint8_t*)
this) +
sizeof(
StudioAnimT)); }
102 StudioAnim_ValuePointerT* pRotV()
const {
return (StudioAnim_ValuePointerT*)(pData()); }
103 StudioAnim_ValuePointerT* pPosV()
const {
return (StudioAnim_ValuePointerT*)(pData()) + ((Flags & STUDIO_ANIM_ANIMROT) != 0); }
107 const Quaternion64* GetQuat64()
const {
return (Quaternion64*)(GetData()); };
113 Quaternion48 *pQuat48()
const {
return (Quaternion48 *)(pData()); };
114 Quaternion64 *pQuat64()
const {
return (Quaternion64 *)(pData()); };
115 Vector48 *pPos()
const {
return (Vector48 *)(pData() + ((flags & STUDIO_ANIM_RAWROT) != 0) *
sizeof( *pQuat48() ) + ((flags & STUDIO_ANIM_RAWROT2) != 0) *
sizeof( *pQuat64() ) ); };
120 std::ostream& print(std::ostream& os,
const char* indent)
const;
125 const uint8_t* GetData()
const {
return ((uint8_t*)
this) +
sizeof(
StudioAnimT); }
144 uint32_t NumMovements;
145 uint32_t MovementOffset;
153 uint32_t IkRuleIndex;
154 uint32_t AnimBlockIkRuleIndex;
156 uint32_t NumLocalHierarchy;
157 uint32_t LocalHierarchyIndex;
162 uint16_t ZeroFrameSpan;
163 uint16_t ZeroFrameCount;
164 uint32_t ZeroFrameIndex;
165 float ZeroFrameStallTime;
171 const char* GetName()
const {
return ((
char*)
this) + NameOffset; }
182 StudioAnimT* pAnimBlock(
int block,
int Index)
const;
183 StudioAnimT* pAnim(
int *piFrame,
float &flStall )
const;
189 mstudioikrule_t *pIKRule(
int i )
const;
190 mstudiolocalhierarchy_t *pHierarchy(
int i )
const;
191 uint8_t* pZeroFrameData()
const {
if (ZeroFrameIndex)
return (((uint8_t*)
this) + ZeroFrameIndex);
else return NULL; }
194 std::ostream& print(std::ostream& os,
const char* indent)
const;
203 const char * pszOptions()
const {
return options; }
206 uint32_t szeventindex;
207 char *
const pszEventName()
const {
return ((
char *)
this) + szeventindex; }
235 uint32_t LabelOffset;
236 uint32_t ActivityNameOffset;
243 uint32_t EventOffset;
254 uint32_t MovementOffset;
256 int32_t ParamIndex[2];
259 uint32_t ParamParent;
264 uint32_t LocalEntryNode;
265 uint32_t LocalExitNode;
276 uint32_t NumAutoLayers;
283 uint32_t IKLockOffset;
286 uint32_t KeyValueSize;
288 uint32_t CyclePoseIndex;
295 const char* GetLabel()
const {
return ((
char *)
this) + LabelOffset; }
296 const char* GetActivityName()
const {
return ((
char *)
this) + ActivityNameOffset; }
298 const StudioEventT* pEvent(uint32_t i)
const { assert(i <
NumEvents);
return (StudioEventT*)(((uint8_t*)
this) + EventOffset) + i; }
308 uint16_t
GetAnim(uint32_t x, uint32_t y)
const
314 const uint16_t* blends = (uint16_t*)(((uint8_t*)
this) +
AnimIndexOffset);
321 const float* pBoneweight(uint32_t i)
const {
return ((
float*)(((uint8_t*)
this) +
WeightListOffset) + i); }
322 const float GetWeight(uint32_t i)
const {
return *(pBoneweight(i)); }
324 const float* pPoseKey(uint32_t iParam,
int iAnim )
const {
return (
float *)(((uint8_t*)
this) +
PoseKeyOffset) + iParam *
GroupSize[0] + iAnim; }
325 const float GetPoseKey(uint32_t iParam,
int iAnim )
const {
return *(pPoseKey( iParam, iAnim )); }
328 const mstudioiklock_t* pIKLock(uint32_t i)
const { assert(i >= 0 && i <
NumIKLocks);
return (mstudioiklock_t*)(((uint8_t*)
this) + IKLockOffset) + i; }
330 const char* KeyValueText()
const {
return KeyValueSize != 0 ? ((
char*)
this) +
KeyValueOffset : NULL; }
332 std::ostream& print(std::ostream& os,
const char* indent)
const;
int HeaderOffset
A negative number that is the offset back to the StudioHeaderT.
Definition: Loader_mdl_hl2_anim.hpp:234
uint16_t NextOffset
see GetNext()
Definition: Loader_mdl_hl2_anim.hpp:92
uint32_t WeightListOffset
see GetWeight()
Definition: Loader_mdl_hl2_anim.hpp:279
uint32_t KeyValueOffset
see KeyValueText()
Definition: Loader_mdl_hl2_anim.hpp:285
uint16_t GetAnim(uint32_t x, uint32_t y) const
Afaics, we always have GroupSize[0] * GroupSize[1] (with GroupSize[1] == 1) animations (StudioAnimDes...
Definition: Loader_mdl_hl2_anim.hpp:308
Definition: Loader_mdl_hl2_anim.hpp:198
uint32_t NumBlends
Afaics, we always have NumBlends == GroupSize[0] * GroupSize[1] (with GroupSize[1] == 1)...
Definition: Loader_mdl_hl2_anim.hpp:251
Definition: Loader_mdl_hl2_anim.hpp:35
uint32_t AnimIndex
If zero, then anim data is kept in sections, see below.
Definition: Loader_mdl_hl2_anim.hpp:150
Definition: Loader_mdl_hl2_anim.hpp:55
int32_t HeaderOffset
A negative number that is the offset back to the StudioHeaderT.
Definition: Loader_mdl_hl2_anim.hpp:138
Sequences seem to be groups of animations that are supposed to be used together.
Definition: Loader_mdl_hl2_anim.hpp:232
Definition: Loader_mdl_hl2_anim.hpp:136
uint32_t GroupSize[2]
Among other code, GetAnim() refers to these values.
Definition: Loader_mdl_hl2_anim.hpp:255
uint32_t AnimIndexOffset
See NumBlends and GetAnim() for details.
Definition: Loader_mdl_hl2_anim.hpp:252
const StudioAnimT * GetAnimBlock() const
< A custom, minimal variant of pAnimBlock(int block, int Index) below.
Definition: Loader_mdl_hl2_anim.hpp:176
uint32_t NumIKLocks
see pIKLock()
Definition: Loader_mdl_hl2_anim.hpp:282
uint32_t SectionIndex
If zero, then anim data is kept directly at AnimIndex, see above.
Definition: Loader_mdl_hl2_anim.hpp:159
uint32_t AutoLayerOffset
see pAutoLayer()
Definition: Loader_mdl_hl2_anim.hpp:277
Definition: Loader_mdl_hl2_anim.hpp:88
uint32_t NumEvents
see pEvent()
Definition: Loader_mdl_hl2_anim.hpp:242
uint32_t AnimBlock
AnimBlocks are used for piecewise loading of animation data.
Definition: Loader_mdl_hl2_anim.hpp:149
uint32_t PoseKeyOffset
see GetPoseKey()
Definition: Loader_mdl_hl2_anim.hpp:280
uint8_t Bone
255 means "no animation data".
Definition: Loader_mdl_hl2_anim.hpp:90
Definition: Loader_mdl_hl2_anim.hpp:211
Definition: Loader_mdl_hl2_anim.hpp:129
Definition: Loader_mdl_hl1.h:215
Definition: Loader_mdl_hl2_anim.hpp:23
uint32_t SectionFrames
Number of frames used in each fast lookup section.
Definition: Loader_mdl_hl2_anim.hpp:160