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.
104 lines
3.5 KiB
104 lines
3.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef PHYSICS_BONE_FOLLOWER_H |
|
#define PHYSICS_BONE_FOLLOWER_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
class CBoneFollower; |
|
|
|
// |
|
// To use bone followers in an entity, contain a CBoneFollowerManager in it. Then: |
|
// - Call InitBoneFollowers() in the entity's CreateVPhysics(). |
|
// - Call UpdateBoneFollowers() after you move your bones. |
|
// - Call DestroyBoneFollowers() when your entity's removed |
|
|
|
struct physfollower_t |
|
{ |
|
DECLARE_SIMPLE_DATADESC(); |
|
int boneIndex; |
|
CHandle<CBoneFollower> hFollower; |
|
}; |
|
|
|
struct vcollide_t; |
|
|
|
// create a manager and a list of followers directly from a ragdoll |
|
void CreateBoneFollowersFromRagdoll( CBaseAnimating *pEntity, class CBoneFollowerManager *pManager, vcollide_t *pCollide ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
class CBoneFollowerManager |
|
{ |
|
DECLARE_SIMPLE_DATADESC(); |
|
public: |
|
CBoneFollowerManager(); |
|
~CBoneFollowerManager(); |
|
|
|
// Use either of these to create the bone followers in your entity's CreateVPhysics() |
|
void InitBoneFollowers( CBaseAnimating *pParentEntity, int iNumBones, const char **pFollowerBoneNames ); |
|
void AddBoneFollower( CBaseAnimating *pParentEntity, const char *pFollowerBoneName, solid_t *pSolid = NULL ); // Adds a single bone follower |
|
|
|
// Call this after you move your bones |
|
void UpdateBoneFollowers( CBaseAnimating *pParentEntity ); |
|
|
|
// Call this when your entity's removed |
|
void DestroyBoneFollowers( void ); |
|
|
|
physfollower_t *GetBoneFollower( int iFollowerIndex ); |
|
int GetBoneFollowerIndex( CBoneFollower *pFollower ); |
|
int GetNumBoneFollowers( void ) const { return m_iNumBones; } |
|
|
|
private: |
|
bool CreatePhysicsFollower( CBaseAnimating *pParentEntity, physfollower_t &follow, const char *pBoneName, solid_t *pSolid ); |
|
|
|
private: |
|
int m_iNumBones; |
|
CUtlVector<physfollower_t> m_physBones; |
|
}; |
|
|
|
|
|
class CBoneFollower : public CBaseEntity |
|
{ |
|
DECLARE_CLASS( CBoneFollower, CBaseEntity ); |
|
DECLARE_DATADESC(); |
|
DECLARE_SERVERCLASS(); |
|
public: |
|
// CBaseEntity |
|
void VPhysicsUpdate( IPhysicsObject *pPhysics ); |
|
int UpdateTransmitState(void); |
|
|
|
// NOTE: These are forwarded to the parent object! |
|
void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent ); |
|
void VPhysicsFriction( IPhysicsObject *pObject, float energy, int surfaceProps, int surfacePropsHit ); |
|
void VPhysicsShadowCollision( int index, gamevcollisionevent_t *pEvent ); |
|
|
|
bool TestCollision( const Ray_t &ray, unsigned int mask, trace_t& trace ); |
|
int ObjectCaps( void ); |
|
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); |
|
|
|
void Touch( CBaseEntity *pOther ); |
|
|
|
void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator ); |
|
|
|
// locals |
|
bool Init( CBaseEntity *pOwner, const char *pModelName, solid_t &solid, const Vector &position, const QAngle &orientation ); |
|
void UpdateFollower( const Vector &position, const QAngle &orientation, float flInterval ); |
|
void SetTraceData( int physicsBone, int hitGroup ); |
|
|
|
// factory |
|
static CBoneFollower *Create( CBaseEntity *pOwner, const char *pModelName, solid_t &solid, const Vector &position, const QAngle &orientation ); |
|
|
|
private: |
|
CNetworkVar( int, m_modelIndex ); |
|
CNetworkVar( int, m_solidIndex ); |
|
int m_physicsBone; |
|
int m_hitGroup; |
|
}; |
|
|
|
#endif // PHYSICS_BONE_FOLLOWER_H
|
|
|