129 lines
2.2 KiB
C
129 lines
2.2 KiB
C
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
/**
|
||
|
* 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;
|
||
|
}
|