bluecore/ode/OPCODE/OPC_SphereAABBOverlap.h

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;
}