1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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
|