123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /**
- * Sphere-AABB overlap test, based on Jim Arvo's code.
- * \param center [in] box center
- * \param extents [in] box extents
- * \return TRUE on overlap
- */
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- inline_ BOOL SphereCollider::SphereAABBOverlap(const Point& center, const Point& extents)
- {
- // Stats
- mNbVolumeBVTests++;
- float d = 0.0f;
- //find the square of the distance
- //from the sphere to the box
- #ifdef OLDIES
- for(udword i=0;i<3;i++)
- {
- float tmp = mCenter[i] - center[i];
- float s = tmp + extents[i];
- if(s<0.0f) d += s*s;
- else
- {
- s = tmp - extents[i];
- if(s>0.0f) d += s*s;
- }
- }
- #endif
- //#ifdef NEW_TEST
- // float tmp = mCenter.x - center.x;
- // float s = tmp + extents.x;
- float tmp,s;
- tmp = mCenter.x - center.x;
- s = tmp + extents.x;
- if(s<0.0f)
- {
- d += s*s;
- if(d>mRadius2) return FALSE;
- }
- else
- {
- s = tmp - extents.x;
- if(s>0.0f)
- {
- d += s*s;
- if(d>mRadius2) return FALSE;
- }
- }
- tmp = mCenter.y - center.y;
- s = tmp + extents.y;
- if(s<0.0f)
- {
- d += s*s;
- if(d>mRadius2) return FALSE;
- }
- else
- {
- s = tmp - extents.y;
- if(s>0.0f)
- {
- d += s*s;
- if(d>mRadius2) return FALSE;
- }
- }
- tmp = mCenter.z - center.z;
- s = tmp + extents.z;
- if(s<0.0f)
- {
- d += s*s;
- if(d>mRadius2) return FALSE;
- }
- else
- {
- s = tmp - extents.z;
- if(s>0.0f)
- {
- d += s*s;
- if(d>mRadius2) return FALSE;
- }
- }
- //#endif
- #ifdef OLDIES
- // Point Min = center - extents;
- // Point Max = center + extents;
- float d = 0.0f;
- //find the square of the distance
- //from the sphere to the box
- for(udword i=0;i<3;i++)
- {
- float Min = center[i] - extents[i];
- // if(mCenter[i]<Min[i])
- if(mCenter[i]<Min)
- {
- // float s = mCenter[i] - Min[i];
- float s = mCenter[i] - Min;
- d += s*s;
- }
- else
- {
- float Max = center[i] + extents[i];
- // if(mCenter[i]>Max[i])
- if(mCenter[i]>Max)
- {
- float s = mCenter[i] - Max;
- d += s*s;
- }
- }
- }
- #endif
- return d <= mRadius2;
- }
|