diff options
Diffstat (limited to 'game/shared/ragdoll_shared.h')
| -rw-r--r-- | game/shared/ragdoll_shared.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/game/shared/ragdoll_shared.h b/game/shared/ragdoll_shared.h new file mode 100644 index 0000000..b51cca8 --- /dev/null +++ b/game/shared/ragdoll_shared.h @@ -0,0 +1,157 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef RAGDOLL_SHARED_H +#define RAGDOLL_SHARED_H +#ifdef _WIN32 +#pragma once +#endif + +class IPhysicsObject; +class IPhysicsConstraint; +class IPhysicsConstraintGroup; +class IPhysicsCollision; +class IPhysicsEnvironment; +class IPhysicsSurfaceProps; +struct matrix3x4_t; + +struct vcollide_t; +struct studiohdr_t; +class CStudioHdr; +class CBoneAccessor; + +#include "mathlib/vector.h" +#include "bone_accessor.h" + +// UNDONE: Remove and make dynamic? +#define RAGDOLL_MAX_ELEMENTS 24 +#define RAGDOLL_INDEX_BITS 5 // NOTE 1<<RAGDOLL_INDEX_BITS >= RAGDOLL_MAX_ELEMENTS + +#define CORE_DISSOLVE_FADE_START 0.2f +#define CORE_DISSOLVE_MODEL_FADE_START 0.1f +#define CORE_DISSOLVE_MODEL_FADE_LENGTH 0.05f +#define CORE_DISSOLVE_FADEIN_LENGTH 0.1f + +struct ragdollelement_t +{ + Vector originParentSpace; + IPhysicsObject *pObject; // all valid elements have an object + IPhysicsConstraint *pConstraint; // all valid elements have a constraint (except the root) + int parentIndex; +}; + +struct ragdollanimatedfriction_t +{ + float flFrictionTimeIn; + float flFrictionTimeOut; + float flFrictionTimeHold; + int iMinAnimatedFriction; + int iMaxAnimatedFriction; +}; + +struct ragdoll_t +{ + int listCount; + bool allowStretch; + bool unused; + IPhysicsConstraintGroup *pGroup; + // store these in separate arrays for save/load + ragdollelement_t list[RAGDOLL_MAX_ELEMENTS]; + int boneIndex[RAGDOLL_MAX_ELEMENTS]; + ragdollanimatedfriction_t animfriction; +}; + +struct ragdollparams_t +{ + void *pGameData; + vcollide_t *pCollide; + CStudioHdr *pStudioHdr; + int modelIndex; + Vector forcePosition; + Vector forceVector; + int forceBoneIndex; + const matrix3x4_t *pCurrentBones; + float jointFrictionScale; + bool allowStretch; + bool fixedConstraints; +}; + +//----------------------------------------------------------------------------- +// This hooks the main game systems callbacks to allow the AI system to manage memory +//----------------------------------------------------------------------------- +class CRagdollLRURetirement : public CAutoGameSystemPerFrame +{ +public: + CRagdollLRURetirement( char const *name ) : CAutoGameSystemPerFrame( name ) + { + } + + // Methods of IGameSystem + virtual void Update( float frametime ); + virtual void FrameUpdatePostEntityThink( void ); + + // Move it to the top of the LRU + void MoveToTopOfLRU( CBaseAnimating *pRagdoll, bool bImportant = false ); + void SetMaxRagdollCount( int iMaxCount ){ m_iMaxRagdolls = iMaxCount; } + + virtual void LevelInitPreEntity( void ); + int CountRagdolls( bool bOnlySimulatingRagdolls ) { return bOnlySimulatingRagdolls ? m_iSimulatedRagdollCount : m_iRagdollCount; } + +private: + typedef CHandle<CBaseAnimating> CRagdollHandle; + CUtlLinkedList< CRagdollHandle > m_LRU; + CUtlLinkedList< CRagdollHandle > m_LRUImportantRagdolls; + + int m_iMaxRagdolls; + int m_iSimulatedRagdollCount; + int m_iRagdollCount; +}; + +extern CRagdollLRURetirement s_RagdollLRU; + +// Manages ragdolls fading for the low violence versions +class CRagdollLowViolenceManager +{ +public: + CRagdollLowViolenceManager(){ m_bLowViolence = false; } + // Turn the low violence ragdoll stuff off if we're in the HL2 Citadel maps because + // the player has the super gravity gun and fading ragdolls will break things. + void SetLowViolence( const char *pMapName ); + bool IsLowViolence( void ){ return m_bLowViolence; } + +private: + bool m_bLowViolence; +}; + +extern CRagdollLowViolenceManager g_RagdollLVManager; + + +bool RagdollCreate( ragdoll_t &ragdoll, const ragdollparams_t ¶ms, IPhysicsEnvironment *pPhysEnv ); + +void RagdollActivate( ragdoll_t &ragdoll, vcollide_t *pCollide, int modelIndex, bool bForceWake = true ); +void RagdollSetupCollisions( ragdoll_t &ragdoll, vcollide_t *pCollide, int modelIndex ); +void RagdollDestroy( ragdoll_t &ragdoll ); + +// Gets the bone matrix for a ragdoll object +// NOTE: This is different than the object's position because it is +// forced to be rigidly attached in parent space +bool RagdollGetBoneMatrix( const ragdoll_t &ragdoll, CBoneAccessor &pBoneToWorld, int objectIndex ); + +// Parse the ragdoll and obtain the mapping from each physics element index to a bone index +// returns num phys elements +int RagdollExtractBoneIndices( int *boneIndexOut, CStudioHdr *pStudioHdr, vcollide_t *pCollide ); + +// computes an exact bbox of the ragdoll's physics objects +void RagdollComputeExactBbox( const ragdoll_t &ragdoll, const Vector &origin, Vector &outMins, Vector &outMaxs ); +bool RagdollIsAsleep( const ragdoll_t &ragdoll ); +void RagdollSetupAnimatedFriction( IPhysicsEnvironment *pPhysEnv, ragdoll_t *ragdoll, int iModelIndex ); + +void RagdollApplyAnimationAsVelocity( ragdoll_t &ragdoll, const matrix3x4_t *pBoneToWorld ); +void RagdollApplyAnimationAsVelocity( ragdoll_t &ragdoll, const matrix3x4_t *pPrevBones, const matrix3x4_t *pCurrentBones, float dt ); + +void RagdollSolveSeparation( ragdoll_t &ragdoll, CBaseEntity *pEntity ); + +#endif // RAGDOLL_SHARED_H |