diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/bone_merge_cache.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/bone_merge_cache.h')
| -rw-r--r-- | game/client/bone_merge_cache.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/game/client/bone_merge_cache.h b/game/client/bone_merge_cache.h new file mode 100644 index 0000000..6123c9b --- /dev/null +++ b/game/client/bone_merge_cache.h @@ -0,0 +1,85 @@ +//========= 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 |