int CCollisionEvent::ShouldSolvePenetration( IPhysicsObject *pObj0, IPhysicsObject *pObj1, void *pGameData0, void *pGameData1, float dt ) { CallbackContext callback(this); // solve it yourself here and return 0, or have the default implementation do it if ( pGameData0 == pGameData1 ) { if ( pObj0->GetGameFlags() & FVPHYSICS_PART_OF_RAGDOLL ) { // this is a ragdoll, self penetrating C_BaseEntity *pEnt = reinterpret_cast<C_BaseEntity *>(pGameData0); C_BaseAnimating *pAnim = pEnt->GetBaseAnimating(); if ( pAnim && pAnim->m_pRagdoll ) { IPhysicsConstraintGroup *pGroup = pAnim->m_pRagdoll->GetConstraintGroup(); if ( pGroup ) { pGroup->SolvePenetration( pObj0, pObj1 ); return false; } } } } return true; }
int CCollisionEvent::ShouldSolvePenetration( IPhysicsObject *pObj0, IPhysicsObject *pObj1, void *pGameData0, void *pGameData1, float dt ) { CallbackContext callback(this); C_BaseEntity *pEntity0 = static_cast<C_BaseEntity *>(pGameData0); C_BaseEntity *pEntity1 = static_cast<C_BaseEntity *>(pGameData1); // solve it yourself here and return 0, or have the default implementation do it if ( pEntity0 > pEntity1 ) { // swap sort CBaseEntity *pTmp = pEntity0; pEntity0 = pEntity1; pEntity1 = pTmp; IPhysicsObject *pTmpObj = pObj0; pObj0 = pObj1; pObj1 = pTmpObj; } if ( !pEntity0 || !pEntity1 ) return 1; unsigned short gameFlags0 = pObj0->GetGameFlags(); unsigned short gameFlags1 = pObj1->GetGameFlags(); // solve it yourself here and return 0, or have the default implementation do it if ( pGameData0 == pGameData1 ) { if ( gameFlags0 & FVPHYSICS_PART_OF_RAGDOLL ) { // this is a ragdoll, self penetrating C_BaseEntity *pEnt = reinterpret_cast<C_BaseEntity *>(pGameData0); C_BaseAnimating *pAnim = pEnt->GetBaseAnimating(); if ( pAnim && pAnim->m_pRagdoll ) { IPhysicsConstraintGroup *pGroup = pAnim->m_pRagdoll->GetConstraintGroup(); if ( pGroup ) { pGroup->SolvePenetration( pObj0, pObj1 ); return false; } } } } else if ( (gameFlags0|gameFlags1) & FVPHYSICS_PART_OF_RAGDOLL ) { // ragdoll penetrating shadow object, just give up for now if ( pObj0->GetShadowController() || pObj1->GetShadowController() ) { FindOrAddPenetrateEvent( pEntity0, pEntity1 ); return true; } } return true; }