-/******************************************************************************
+/*******************************************************************************
Copyright (c) 2009, Charles McGarvey
All rights reserved.
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-******************************************************************************/
+*******************************************************************************/
#ifndef _MOOF_AABB_HH_
#define _MOOF_AABB_HH_
+#include <Moof/Drawable.hh>
#include <Moof/Math.hh>
* Axis-aligned Bounding Box
*/
-struct Aabb
+struct Aabb : public Drawable
{
- Aabb() {}
+ Vector3 min;
+ Vector3 max;
- Aabb(const Vector3& minPoint, const Vector3& maxPoint) :
- min(minPoint),
- max(maxPoint) {}
- Aabb (Scalar minX, Scalar minY, Scalar minZ,
- Scalar maxX, Scalar maxY, Scalar maxZ) :
- min(minX, minY, minZ),
- max(maxX, maxY, maxZ) {}
+ Aabb() {}
- Vector3 min;
- Vector3 max;
+ Aabb(const Vector3& a, const Vector3& b)
+ {
+ init(a, b);
+ }
+
+ Aabb(Scalar ax, Scalar ay, Scalar az,
+ Scalar bx, Scalar by, Scalar bz)
+ {
+ Vector3 a(ax, ay, az);
+ Vector3 b(bx, by, bz);
+
+ init(a, b);
+ }
+
+ inline void init(const Vector3& a, const Vector3& b)
+ {
+ if (a[0] < b[0])
+ {
+ min[0] = a[0];
+ max[0] = b[0];
+ }
+ else
+ {
+ min[0] = b[0];
+ max[0] = a[0];
+ }
+ if (a[1] < b[1])
+ {
+ min[1] = a[1];
+ max[1] = b[1];
+ }
+ else
+ {
+ min[1] = b[1];
+ max[1] = a[1];
+ }
+ if (a[2] < b[2])
+ {
+ min[2] = a[2];
+ max[2] = b[2];
+ }
+ else
+ {
+ min[2] = b[2];
+ max[2] = a[2];
+ }
+ }
+
+ inline Vector3 getCenter() const
+ {
+ return Vector3((min[0] + max[0]) / 2.0,
+ (min[1] + max[1]) / 2.0,
+ (min[2] + max[2]) / 2.0);
+ }
+
+ void draw(Scalar alpha) const;
};