mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 06:36:54 +00:00
134 lines
3.8 KiB
C
134 lines
3.8 KiB
C
|
//========= 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
|