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.
166 lines
3.5 KiB
166 lines
3.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "cbase.h" |
|
#include "death_pose.h" |
|
|
|
#ifdef CLIENT_DLL |
|
|
|
void GetRagdollCurSequenceWithDeathPose( C_BaseAnimating *entity, matrix3x4_t *curBones, float flTime, int activity, int frame ) |
|
{ |
|
// blow the cached prev bones |
|
entity->InvalidateBoneCache(); |
|
|
|
Vector vPrevOrigin = entity->GetAbsOrigin(); |
|
|
|
entity->Interpolate( flTime ); |
|
|
|
if ( activity != ACT_INVALID ) |
|
{ |
|
Vector vNewOrigin = entity->GetAbsOrigin(); |
|
Vector vDirection = vNewOrigin - vPrevOrigin; |
|
|
|
float flVelocity = VectorNormalize( vDirection ); |
|
|
|
Vector vAdjustedOrigin = vNewOrigin + vDirection * ( ( flVelocity * flVelocity ) * gpGlobals->frametime ); |
|
|
|
int iTempSequence = entity->GetSequence(); |
|
float flTempCycle = entity->GetCycle(); |
|
|
|
entity->SetSequence( activity ); |
|
|
|
entity->SetCycle( (float)frame / MAX_DEATHPOSE_FRAMES ); |
|
|
|
entity->SetAbsOrigin( vAdjustedOrigin ); |
|
|
|
// Now do the current bone setup |
|
entity->SetupBones( curBones, MAXSTUDIOBONES, BONE_USED_BY_ANYTHING, flTime ); |
|
|
|
entity->SetAbsOrigin( vNewOrigin ); |
|
|
|
// blow the cached prev bones |
|
entity->InvalidateBoneCache(); |
|
|
|
entity->SetSequence( iTempSequence ); |
|
entity->SetCycle( flTempCycle ); |
|
|
|
entity->Interpolate( gpGlobals->curtime ); |
|
|
|
entity->SetupBones( NULL, -1, BONE_USED_BY_ANYTHING, gpGlobals->curtime ); |
|
} |
|
else |
|
{ |
|
entity->SetupBones( curBones, MAXSTUDIOBONES, BONE_USED_BY_ANYTHING, flTime ); |
|
|
|
// blow the cached prev bones |
|
entity->InvalidateBoneCache(); |
|
|
|
entity->SetupBones( NULL, -1, BONE_USED_BY_ANYTHING, flTime ); |
|
} |
|
} |
|
|
|
#else // !CLIENT_DLL |
|
|
|
Activity GetDeathPoseActivity( CBaseAnimating *entity, const CTakeDamageInfo &info ) |
|
{ |
|
if ( !entity ) |
|
{ |
|
return ACT_INVALID; |
|
} |
|
|
|
Activity aActivity; |
|
|
|
Vector vForward, vRight; |
|
entity->GetVectors( &vForward, &vRight, NULL ); |
|
|
|
Vector vDir = -info.GetDamageForce(); |
|
VectorNormalize( vDir ); |
|
|
|
float flDotForward = DotProduct( vForward, vDir ); |
|
float flDotRight = DotProduct( vRight, vDir ); |
|
|
|
bool bNegativeForward = false; |
|
bool bNegativeRight = false; |
|
|
|
if ( flDotForward < 0.0f ) |
|
{ |
|
bNegativeForward = true; |
|
flDotForward = flDotForward * -1; |
|
} |
|
|
|
if ( flDotRight < 0.0f ) |
|
{ |
|
bNegativeRight = true; |
|
flDotRight = flDotRight * -1; |
|
} |
|
|
|
if ( flDotRight > flDotForward ) |
|
{ |
|
if ( bNegativeRight == true ) |
|
aActivity = ACT_DIE_LEFTSIDE; |
|
else |
|
aActivity = ACT_DIE_RIGHTSIDE; |
|
} |
|
else |
|
{ |
|
if ( bNegativeForward == true ) |
|
aActivity = ACT_DIE_BACKSIDE; |
|
else |
|
aActivity = ACT_DIE_FRONTSIDE; |
|
} |
|
|
|
return aActivity; |
|
} |
|
|
|
void SelectDeathPoseActivityAndFrame( CBaseAnimating *entity, const CTakeDamageInfo &info, int hitgroup, Activity& activity, int& frame ) |
|
{ |
|
activity = ACT_INVALID; |
|
frame = 0; |
|
|
|
if ( !entity->GetModelPtr() ) |
|
return; |
|
|
|
activity = GetDeathPoseActivity( entity, info ); |
|
frame = DEATH_FRAME_HEAD; |
|
|
|
switch( hitgroup ) |
|
{ |
|
//Do normal ragdoll stuff if no specific hitgroup was hit. |
|
case HITGROUP_GENERIC: |
|
default: |
|
{ |
|
return; |
|
} |
|
|
|
case HITGROUP_HEAD: |
|
{ |
|
frame = DEATH_FRAME_HEAD; |
|
break; |
|
} |
|
case HITGROUP_LEFTARM: |
|
frame = DEATH_FRAME_LEFTARM; |
|
break; |
|
|
|
case HITGROUP_RIGHTARM: |
|
frame = DEATH_FRAME_RIGHTARM; |
|
break; |
|
|
|
case HITGROUP_CHEST: |
|
case HITGROUP_STOMACH: |
|
frame = DEATH_FRAME_STOMACH; |
|
break; |
|
|
|
case HITGROUP_LEFTLEG: |
|
frame = DEATH_FRAME_LEFTLEG; |
|
break; |
|
|
|
case HITGROUP_RIGHTLEG: |
|
frame = DEATH_FRAME_RIGHTLEG; |
|
break; |
|
} |
|
} |
|
|
|
#endif // !CLIENT_DLL
|
|
|