Go to the documentation of this file.00001
00002
00008
00009 inline_ BOOL SphereCollider::SphereAABBOverlap(const Point& center, const Point& extents)
00010 {
00011
00012 mNbVolumeBVTests++;
00013
00014 float d = 0.0f;
00015
00016
00017
00018 #ifdef OLDIES
00019 for(udword i=0;i<3;i++)
00020 {
00021 float tmp = mCenter[i] - center[i];
00022 float s = tmp + extents[i];
00023
00024 if(s<0.0f) d += s*s;
00025 else
00026 {
00027 s = tmp - extents[i];
00028 if(s>0.0f) d += s*s;
00029 }
00030 }
00031 #endif
00032
00033
00034
00035
00036
00037
00038 float tmp,s;
00039
00040 tmp = mCenter.x - center.x;
00041 s = tmp + extents.x;
00042
00043 if(s<0.0f)
00044 {
00045 d += s*s;
00046 if(d>mRadius2) return FALSE;
00047 }
00048 else
00049 {
00050 s = tmp - extents.x;
00051 if(s>0.0f)
00052 {
00053 d += s*s;
00054 if(d>mRadius2) return FALSE;
00055 }
00056 }
00057
00058 tmp = mCenter.y - center.y;
00059 s = tmp + extents.y;
00060
00061 if(s<0.0f)
00062 {
00063 d += s*s;
00064 if(d>mRadius2) return FALSE;
00065 }
00066 else
00067 {
00068 s = tmp - extents.y;
00069 if(s>0.0f)
00070 {
00071 d += s*s;
00072 if(d>mRadius2) return FALSE;
00073 }
00074 }
00075
00076 tmp = mCenter.z - center.z;
00077 s = tmp + extents.z;
00078
00079 if(s<0.0f)
00080 {
00081 d += s*s;
00082 if(d>mRadius2) return FALSE;
00083 }
00084 else
00085 {
00086 s = tmp - extents.z;
00087 if(s>0.0f)
00088 {
00089 d += s*s;
00090 if(d>mRadius2) return FALSE;
00091 }
00092 }
00093
00094
00095 #ifdef OLDIES
00096
00097
00098
00099 float d = 0.0f;
00100
00101
00102
00103 for(udword i=0;i<3;i++)
00104 {
00105 float Min = center[i] - extents[i];
00106
00107
00108 if(mCenter[i]<Min)
00109 {
00110
00111 float s = mCenter[i] - Min;
00112 d += s*s;
00113 }
00114 else
00115 {
00116 float Max = center[i] + extents[i];
00117
00118
00119 if(mCenter[i]>Max)
00120 {
00121 float s = mCenter[i] - Max;
00122 d += s*s;
00123 }
00124 }
00125 }
00126 #endif
00127 return d <= mRadius2;
00128 }