mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-01-04 00:23:25 +08:00
161 lines
5.1 KiB
C
161 lines
5.1 KiB
C
|
//========= Copyright <20> 1996-2005, 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 "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;
|
|||
|
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;
|
|||
|
CBoneAccessor pPrevBones;
|
|||
|
CBoneAccessor pCurrentBones;
|
|||
|
float boneDt; // time delta between prev/cur samples
|
|||
|
float jointFrictionScale;
|
|||
|
};
|
|||
|
|
|||
|
//-----------------------------------------------------------------------------
|
|||
|
// 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 CBoneAccessor &pPrevBones,
|
|||
|
const CBoneAccessor &pCurrentBones,
|
|||
|
float dt );
|
|||
|
|
|||
|
void RagdollApplyAnimationAsVelocity( ragdoll_t &ragdoll, const CBoneAccessor &pBoneToWorld );
|
|||
|
|
|||
|
void RagdollSolveSeparation( ragdoll_t &ragdoll, CBaseEntity *pEntity );
|
|||
|
|
|||
|
#endif // RAGDOLL_SHARED_H
|