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.
134 lines
3.8 KiB
134 lines
3.8 KiB
//========= 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
|