//----------------------------------------------------------------------------- // Computes the surrounding collision bounds based on whatever algorithm we want... //----------------------------------------------------------------------------- void CCollisionProperty::WorldSpaceSurroundingBounds( Vector *pVecMins, Vector *pVecMaxs ) { const Vector &vecAbsOrigin = GetCollisionOrigin(); if ( GetOuter()->IsEFlagSet( EFL_DIRTY_SURROUNDING_COLLISION_BOUNDS )) { GetOuter()->RemoveEFlags( EFL_DIRTY_SURROUNDING_COLLISION_BOUNDS ); ComputeSurroundingBox( pVecMins, pVecMaxs ); VectorSubtract( *pVecMins, vecAbsOrigin, m_vecSurroundingMins ); VectorSubtract( *pVecMaxs, vecAbsOrigin, m_vecSurroundingMaxs ); ASSERT_COORD( m_vecSurroundingMins ); ASSERT_COORD( m_vecSurroundingMaxs ); } else { VectorAdd( m_vecSurroundingMins, vecAbsOrigin, *pVecMins ); VectorAdd( m_vecSurroundingMaxs, vecAbsOrigin, *pVecMaxs ); } }
//----------------------------------------------------------------------------- // Sets the method by which the surrounding collision bounds is set //----------------------------------------------------------------------------- void CCollisionProperty::SetSurroundingBoundsType( SurroundingBoundsType_t type, const Vector *pMins, const Vector *pMaxs ) { m_nSurroundType = type; if (type != USE_SPECIFIED_BOUNDS) { Assert( !pMins && !pMaxs ); MarkSurroundingBoundsDirty(); } else { Assert( pMins && pMaxs ); m_vecSpecifiedSurroundingMinsPreScaled = *pMins; m_vecSpecifiedSurroundingMaxsPreScaled = *pMaxs; // Check if it's a scaled model CBaseAnimating *pAnim = GetOuter()->GetBaseAnimating(); if ( pAnim && pAnim->GetModelScale() != 1.0f ) { // Do the scaling Vector vecNewMins = *pMins * pAnim->GetModelScale(); Vector vecNewMaxs = *pMaxs * pAnim->GetModelScale(); m_vecSpecifiedSurroundingMins = vecNewMins; m_vecSpecifiedSurroundingMaxs = vecNewMaxs; m_vecSurroundingMins = vecNewMins; m_vecSurroundingMaxs = vecNewMaxs; } else { // No scaling needed! m_vecSpecifiedSurroundingMins = *pMins; m_vecSpecifiedSurroundingMaxs = *pMaxs; m_vecSurroundingMins = *pMins; m_vecSurroundingMaxs = *pMaxs; } ASSERT_COORD( m_vecSurroundingMins ); ASSERT_COORD( m_vecSurroundingMaxs ); } }
//----------------------------------------------------------------------------- // Sets the method by which the surrounding collision bounds is set //----------------------------------------------------------------------------- void CCollisionProperty::SetSurroundingBoundsType( SurroundingBoundsType_t type, const Vector *pMins, const Vector *pMaxs ) { m_nSurroundType = type; if (type != USE_SPECIFIED_BOUNDS) { Assert( !pMins && !pMaxs ); MarkSurroundingBoundsDirty(); } else { Assert( pMins && pMaxs ); m_vecSpecifiedSurroundingMins = *pMins; m_vecSpecifiedSurroundingMaxs = *pMaxs; m_vecSurroundingMins = *pMins; m_vecSurroundingMaxs = *pMaxs; ASSERT_COORD( m_vecSurroundingMins ); ASSERT_COORD( m_vecSurroundingMaxs ); } }