csgo-2018-source/game/client/ragdoll.h
2021-07-24 21:11:47 -07:00

133 lines
3.7 KiB
C++

//========= Copyright © 1996-2005, 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, const 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,
bool bBleedOutOnSleep=true);
virtual void RagdollBone( C_BaseEntity *ent, const 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; }
virtual bool TransformVectorToWorld( int iBoneIndex, const Vector *vTemp, Vector *vOut );
void SetInitialBonePosition( CStudioHdr *pstudiohdr, const CBoneAccessor &pDesiredBonePosition );
bool IsValid() { return m_ragdoll.listCount > 0; }
bool IsAsleep( void ) const { return m_allAsleep; }
void ResetRagdollSleepAfterTime( void );
float GetLastVPhysicsUpdateTime() const { return m_lastUpdate; }
IPhysicsObject *RagdollPhysicsObject( int i ) { return m_ragdoll.list[ i ].pObject; }
public:
void CheckSettleStationaryRagdoll();
void PhysForceRagdollToSleep();
void CreateBloodPool();
private:
ragdoll_t m_ragdoll;
Vector m_mins, m_maxs;
Vector m_origin;
float m_lastUpdate;
bool m_allAsleep;
Vector m_vecLastOrigin;
float m_flLastOriginChangeTime;
float m_flAwakeTime;
bool m_doBleedOut;
#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,
bool bBleedOutOnSleep=true);
// 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