You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.2 KiB
85 lines
2.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef BONE_MERGE_CACHE_H |
|
#define BONE_MERGE_CACHE_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
|
|
class C_BaseAnimating; |
|
class CStudioHdr; |
|
|
|
|
|
#include "mathlib/vector.h" |
|
|
|
|
|
class CBoneMergeCache |
|
{ |
|
public: |
|
|
|
CBoneMergeCache(); |
|
|
|
void Init( C_BaseAnimating *pOwner ); |
|
|
|
// Updates the lookups that let it merge bones quickly. |
|
void UpdateCache(); |
|
|
|
// This copies the transform from all bones in the followed entity that have |
|
// names that match our bones. |
|
void MergeMatchingBones( int boneMask ); |
|
|
|
// copy bones instead of matrices |
|
void CopyParentToChild( const Vector parentPos[], const Quaternion parentQ[], Vector childPos[], Quaternion childQ[], int boneMask ); |
|
void CopyChildToParent( const Vector childPos[], const Quaternion childQ[], Vector parentPos[], Quaternion parentQ[], int boneMask ); |
|
|
|
// Returns true if the specified bone is one that gets merged in MergeMatchingBones. |
|
int IsBoneMerged( int iBone ) const; |
|
|
|
// Gets the origin for the first merge bone on the parent. |
|
bool GetAimEntOrigin( Vector *pAbsOrigin, QAngle *pAbsAngles ); |
|
|
|
bool GetRootBone( matrix3x4_t &rootBone ); |
|
|
|
private: |
|
|
|
// This is the entity that we're keeping the cache updated for. |
|
C_BaseAnimating *m_pOwner; |
|
|
|
// All the cache data is based off these. When they change, the cache data is regenerated. |
|
// These are either all valid pointers or all NULL. |
|
C_BaseAnimating *m_pFollow; |
|
CStudioHdr *m_pFollowHdr; |
|
const studiohdr_t *m_pFollowRenderHdr; |
|
CStudioHdr *m_pOwnerHdr; |
|
|
|
// This is the mask we need to use to set up bones on the followed entity to do the bone merge |
|
int m_nFollowBoneSetupMask; |
|
|
|
// Cache data. |
|
class CMergedBone |
|
{ |
|
public: |
|
unsigned short m_iMyBone; |
|
unsigned short m_iParentBone; |
|
}; |
|
|
|
CUtlVector<CMergedBone> m_MergedBones; |
|
CUtlVector<unsigned char> m_BoneMergeBits; // One bit for each bone. The bit is set if the bone gets merged. |
|
}; |
|
|
|
|
|
inline int CBoneMergeCache::IsBoneMerged( int iBone ) const |
|
{ |
|
if ( m_pOwnerHdr ) |
|
return m_BoneMergeBits[iBone >> 3] & ( 1 << ( iBone & 7 ) ); |
|
else |
|
return 0; |
|
} |
|
|
|
|
|
#endif // BONE_MERGE_CACHE_H
|
|
|