1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3 * Contains code to compute the minimal bounding sphere.
4 * \file IceBoundingSphere.h
5 * \author Pierre Terdiman
6 * \date January, 29, 2000
8 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
12 #ifndef __ICEBOUNDINGSPHERE_H__
13 #define __ICEBOUNDINGSPHERE_H__
21 BS_FORCE_DWORD
= 0x7fffffff
24 class ICEMATHS_API Sphere
30 inline_
Sphere(const Point
& center
, float radius
) : mCenter(center
), mRadius(radius
) {}
32 Sphere(udword nb_verts
, const Point
* verts
);
34 inline_
Sphere(const Sphere
& sphere
) : mCenter(sphere
.mCenter
), mRadius(sphere
.mRadius
) {}
38 BSphereMethod
Compute(udword nb_verts
, const Point
* verts
);
39 bool FastCompute(udword nb_verts
, const Point
* verts
);
42 inline_
const Point
& GetCenter() const { return mCenter
; }
43 inline_
float GetRadius() const { return mRadius
; }
45 inline_
const Point
& Center() const { return mCenter
; }
46 inline_
float Radius() const { return mRadius
; }
48 inline_ Sphere
& Set(const Point
& center
, float radius
) { mCenter
= center
; mRadius
= radius
; return *this; }
49 inline_ Sphere
& SetCenter(const Point
& center
) { mCenter
= center
; return *this; }
50 inline_ Sphere
& SetRadius(float radius
) { mRadius
= radius
; return *this; }
52 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
54 * Tests if a point is contained within the sphere.
55 * \param p [in] the point to test
56 * \return true if inside the sphere
58 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
59 inline_
bool Contains(const Point
& p
) const
61 return mCenter
.SquareDistance(p
) <= mRadius
*mRadius
;
64 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
66 * Tests if a sphere is contained within the sphere.
67 * \param sphere [in] the sphere to test
68 * \return true if inside the sphere
70 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
71 inline_
bool Contains(const Sphere
& sphere
) const
73 // If our radius is the smallest, we can't possibly contain the other sphere
74 if(mRadius
< sphere
.mRadius
) return false;
75 // So r is always positive or null now
76 float r
= mRadius
- sphere
.mRadius
;
77 return mCenter
.SquareDistance(sphere
.mCenter
) <= r
*r
;
80 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
82 * Tests if a box is contained within the sphere.
83 * \param aabb [in] the box to test
84 * \return true if inside the sphere
86 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
87 inline_ BOOL
Contains(const AABB
& aabb
) const
89 // I assume if all 8 box vertices are inside the sphere, so does the whole box.
90 // Sounds ok but maybe there's a better way?
91 float R2
= mRadius
* mRadius
;
93 const Point
& Max
= ((ShadowAABB
&)&aabb
).mMax
;
94 const Point
& Min
= ((ShadowAABB
&)&aabb
).mMin
;
96 Point Max
; aabb
.GetMax(Max
);
97 Point Min
; aabb
.GetMin(Min
);
100 p
.x
=Max
.x
; p
.y
=Max
.y
; p
.z
=Max
.z
; if(mCenter
.SquareDistance(p
)>=R2
) return FALSE
;
101 p
.x
=Min
.x
; if(mCenter
.SquareDistance(p
)>=R2
) return FALSE
;
102 p
.x
=Max
.x
; p
.y
=Min
.y
; if(mCenter
.SquareDistance(p
)>=R2
) return FALSE
;
103 p
.x
=Min
.x
; if(mCenter
.SquareDistance(p
)>=R2
) return FALSE
;
104 p
.x
=Max
.x
; p
.y
=Max
.y
; p
.z
=Min
.z
; if(mCenter
.SquareDistance(p
)>=R2
) return FALSE
;
105 p
.x
=Min
.x
; if(mCenter
.SquareDistance(p
)>=R2
) return FALSE
;
106 p
.x
=Max
.x
; p
.y
=Min
.y
; if(mCenter
.SquareDistance(p
)>=R2
) return FALSE
;
107 p
.x
=Min
.x
; if(mCenter
.SquareDistance(p
)>=R2
) return FALSE
;
112 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
114 * Tests if the sphere intersects another sphere
115 * \param sphere [in] the other sphere
116 * \return true if spheres overlap
118 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
119 inline_
bool Intersect(const Sphere
& sphere
) const
121 float r
= mRadius
+ sphere
.mRadius
;
122 return mCenter
.SquareDistance(sphere
.mCenter
) <= r
*r
;
125 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
127 * Checks the sphere is valid.
128 * \return true if the box is valid
130 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
131 inline_ BOOL
IsValid() const
133 // Consistency condition for spheres: Radius >= 0.0f
134 if(mRadius
< 0.0f
) return FALSE
;
138 Point mCenter
; //!< Sphere center
139 float mRadius
; //!< Sphere radius
142 #endif // __ICEBOUNDINGSPHERE_H__