const QAngle& CCollisionProperty::GetCollisionAngles() const { if ( IsBoundsDefinedInEntitySpace() ) { return m_pOuter->GetAbsAngles(); } return vec3_angle; }
const Vector &CECollisionProperty::WorldToCollisionSpace( const Vector &in, Vector *pResult ) const { if ( !IsBoundsDefinedInEntitySpace() || ( GetCollisionAngles() == vec3_angle ) ) { VectorSubtract( in, GetCollisionOrigin(), *pResult ); } else { VectorITransform( in, CollisionToWorldTransform(), *pResult ); } return *pResult; }
//----------------------------------------------------------------------------- // Transforms an AABB measured in entity space to a box that surrounds it in world space //----------------------------------------------------------------------------- void CCollisionProperty::CollisionAABBToWorldAABB( const Vector &entityMins, const Vector &entityMaxs, Vector *pWorldMins, Vector *pWorldMaxs ) const { if ( !IsBoundsDefinedInEntitySpace() || (GetCollisionAngles() == vec3_angle) ) { VectorAdd( entityMins, GetCollisionOrigin(), *pWorldMins ); VectorAdd( entityMaxs, GetCollisionOrigin(), *pWorldMaxs ); } else { TransformAABB( CollisionToWorldTransform(), entityMins, entityMaxs, *pWorldMins, *pWorldMaxs ); } }
//----------------------------------------------------------------------------- // Transforms a point in OBB space to world space //----------------------------------------------------------------------------- const Vector &CECollisionProperty::CollisionToWorldSpace( const Vector &in, Vector *pResult ) const { // Makes sure we don't re-use the same temp twice if ( !IsBoundsDefinedInEntitySpace() || ( GetCollisionAngles() == vec3_angle ) ) { VectorAdd( in, GetCollisionOrigin(), *pResult ); } else { VectorTransform( in, CollisionToWorldTransform(), *pResult ); } return *pResult; }
const matrix3x4_t& CCollisionProperty::CollisionToWorldTransform() const { static matrix3x4_t s_matTemp[4]; static int s_nIndex = 0; matrix3x4_t &matResult = s_matTemp[s_nIndex]; s_nIndex = (s_nIndex+1) & 0x3; if ( IsBoundsDefinedInEntitySpace() ) { return m_pOuter->EntityToWorldTransform(); } SetIdentityMatrix( matResult ); MatrixSetColumn( GetCollisionOrigin(), 3, matResult ); return matResult; }
//----------------------------------------------------------------------------- // Computes the surrounding collision bounds from the the OBB (not vphysics) //----------------------------------------------------------------------------- void CCollisionProperty::ComputeRotationExpandedBounds( Vector *pVecWorldMins, Vector *pVecWorldMaxs ) { if ( !IsBoundsDefinedInEntitySpace() ) { *pVecWorldMins = m_vecMins; *pVecWorldMaxs = m_vecMaxs; } else { float flMaxVal; flMaxVal = max( FloatMakePositive(m_vecMins.Get().x), FloatMakePositive(m_vecMaxs.Get().x) ); pVecWorldMins->x = -flMaxVal; pVecWorldMaxs->x = flMaxVal; flMaxVal = max( FloatMakePositive(m_vecMins.Get().y), FloatMakePositive(m_vecMaxs.Get().y) ); pVecWorldMins->y = -flMaxVal; pVecWorldMaxs->y = flMaxVal; flMaxVal = max( FloatMakePositive(m_vecMins.Get().z), FloatMakePositive(m_vecMaxs.Get().z) ); pVecWorldMins->z = -flMaxVal; pVecWorldMaxs->z = flMaxVal; } }