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/ragdoll.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/ragdoll.h')
| -rw-r--r-- | game/client/ragdoll.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/game/client/ragdoll.h b/game/client/ragdoll.h new file mode 100644 index 0000000..6f5056f --- /dev/null +++ b/game/client/ragdoll.h @@ -0,0 +1,134 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $Workfile: $ +// $Date: $ +// $NoKeywords: $ +//=============================================================================// + +#ifndef RAGDOLL_H +#define RAGDOLL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "ragdoll_shared.h" + +#define RAGDOLL_VISUALIZE 0 + +class C_BaseEntity; +class CStudioHdr; +struct mstudiobone_t; +class Vector; +class IPhysicsObject; +class CBoneAccessor; + +abstract_class IRagdoll +{ +public: + virtual ~IRagdoll() {} + + virtual void RagdollBone( C_BaseEntity *ent, mstudiobone_t *pbones, int boneCount, bool *boneSimulated, CBoneAccessor &pBoneToWorld ) = 0; + virtual const Vector& GetRagdollOrigin( ) = 0; + virtual void GetRagdollBounds( Vector &mins, Vector &maxs ) = 0; + virtual int RagdollBoneCount() const = 0; + virtual IPhysicsObject *GetElement( int elementNum ) = 0; + virtual void DrawWireframe( void ) = 0; + virtual void VPhysicsUpdate( IPhysicsObject *pObject ) = 0; + virtual bool TransformVectorToWorld(int boneIndex, const Vector *vTemp, Vector *vOut) = 0; +}; + +class CRagdoll : public IRagdoll +{ +public: + CRagdoll(); + ~CRagdoll( void ); + + DECLARE_SIMPLE_DATADESC(); + + void Init( + C_BaseEntity *ent, + CStudioHdr *pstudiohdr, + const Vector &forceVector, + int forceBone, + const matrix3x4_t *pDeltaBones0, + const matrix3x4_t *pDeltaBones1, + const matrix3x4_t *pCurrentBonePosition, + float boneDt, + bool bFixedConstraints=false ); + + virtual void RagdollBone( C_BaseEntity *ent, mstudiobone_t *pbones, int boneCount, bool *boneSimulated, CBoneAccessor &pBoneToWorld ); + virtual const Vector& GetRagdollOrigin( ); + virtual void GetRagdollBounds( Vector &theMins, Vector &theMaxs ); + void BuildRagdollBounds( C_BaseEntity *ent ); + + virtual IPhysicsObject *GetElement( int elementNum ); + virtual IPhysicsConstraintGroup *GetConstraintGroup() { return m_ragdoll.pGroup; } + virtual void DrawWireframe(); + virtual void VPhysicsUpdate( IPhysicsObject *pPhysics ); + virtual int RagdollBoneCount() const { return m_ragdoll.listCount; } + //============================================================================= + // HPE_BEGIN: + // [menglish] Transforms a vector from the given bone's space to world space + //============================================================================= + + virtual bool TransformVectorToWorld(int iBoneIndex, const Vector *vTemp, Vector *vOut); + + //============================================================================= + // HPE_END + //============================================================================= + + + void SetInitialBonePosition( CStudioHdr *pstudiohdr, const CBoneAccessor &pDesiredBonePosition ); + + bool IsValid() { return m_ragdoll.listCount > 0; } + + void ResetRagdollSleepAfterTime( void ); + float GetLastVPhysicsUpdateTime() const { return m_lastUpdate; } + +private: + + void CheckSettleStationaryRagdoll(); + void PhysForceRagdollToSleep(); + + ragdoll_t m_ragdoll; + Vector m_mins, m_maxs; + Vector m_origin; + float m_radius; + float m_lastUpdate; + bool m_allAsleep; + Vector m_vecLastOrigin; + float m_flLastOriginChangeTime; + +#if RAGDOLL_VISUALIZE + matrix3x4_t m_savedBone1[MAXSTUDIOBONES]; + matrix3x4_t m_savedBone2[MAXSTUDIOBONES]; + matrix3x4_t m_savedBone3[MAXSTUDIOBONES]; +#endif + +public: + + ragdoll_t *GetRagdoll( void ){ return &m_ragdoll; } +}; + + +CRagdoll *CreateRagdoll( + C_BaseEntity *ent, + CStudioHdr *pstudiohdr, + const Vector &forceVector, + int forceBone, + const matrix3x4_t *pDeltaBones0, + const matrix3x4_t *pDeltaBones1, + const matrix3x4_t *pCurrentBonePosition, + float boneDt, + bool bFixedConstraints=false ); + + +// save this ragdoll's creation as the current tick +void NoteRagdollCreationTick( C_BaseEntity *pRagdoll ); +// returns true if the ragdoll was created on this tick +bool WasRagdollCreatedOnCurrentTick( C_BaseEntity *pRagdoll ); + +#endif // RAGDOLL_H
\ No newline at end of file |