1 #ifndef AXISALIGNEDBOX_HPP
2 #define AXISALIGNEDBOX_HPP
4 #include "blub/core/classVersion.hpp"
5 #include "blub/math/vector3.hpp"
6 #include "blub/serialization/nameValuePair.hpp"
7 #include "blub/serialization/saveLoad.hpp"
51 NEAR_RIGHT_BOTTOM = 7,
58 #ifndef BLUB_NO_OGRE3D
60 operator Ogre::AxisAlignedBox()
const;
63 inline axisAlignedBox() : mMinimum(vector3::ZERO), mMaximum(vector3::UNIT_SCALE)
68 mExtent = EXTENT_NULL;
70 inline axisAlignedBox(Extent e) : mMinimum(vector3::ZERO), mMaximum(vector3::UNIT_SCALE)
90 : mMinimum(vector3::ZERO), mMaximum(vector3::UNIT_SCALE)
96 real mx, real my, real mz,
97 real Mx, real My, real Mz)
98 : mMinimum(vector3::ZERO), mMaximum(vector3::UNIT_SCALE)
159 mExtent = EXTENT_FINITE;
163 inline void setMinimum( real x, real y, real z )
165 mExtent = EXTENT_FINITE;
179 inline void setMinimumY(real y)
184 inline void setMinimumZ(real z)
193 mExtent = EXTENT_FINITE;
197 inline void setMaximum( real x, real y, real z )
199 mExtent = EXTENT_FINITE;
213 inline void setMaximumY( real y )
218 inline void setMaximumZ( real z )
227 BASSERT( (min.x <= max.x && min.y <= max.y && min.z <= max.z) &&
228 "The minimum corner of the box must be less than or equal to maximum corner" );
230 mExtent = EXTENT_FINITE;
236 real mx, real my, real mz,
237 real Mx, real My, real Mz )
239 BASSERT( (mx <= Mx && my <= My && mz <= Mz) &&
240 "The minimum corner of the box must be less than or equal to maximum corner" );
242 mExtent = EXTENT_FINITE;
260 case FAR_LEFT_BOTTOM:
263 return vector3(mMinimum.x, mMaximum.y, mMinimum.z);
265 return vector3(mMaximum.x, mMaximum.y, mMinimum.z);
266 case FAR_RIGHT_BOTTOM:
267 return vector3(mMaximum.x, mMinimum.y, mMinimum.z);
268 case NEAR_RIGHT_BOTTOM:
269 return vector3(mMaximum.x, mMinimum.y, mMaximum.z);
270 case NEAR_LEFT_BOTTOM:
271 return vector3(mMinimum.x, mMinimum.y, mMaximum.z);
273 return vector3(mMinimum.x, mMaximum.y, mMaximum.z);
287 if ((rhs.mExtent == EXTENT_NULL) || (mExtent == EXTENT_INFINITE))
292 else if (rhs.mExtent == EXTENT_INFINITE)
294 mExtent = EXTENT_INFINITE;
297 else if (mExtent == EXTENT_NULL)
329 case EXTENT_INFINITE:
333 BASSERT(
false &&
"Never reached" );
340 mExtent = EXTENT_NULL;
347 return (mExtent == EXTENT_NULL);
354 return (mExtent == EXTENT_FINITE);
361 mExtent = EXTENT_INFINITE;
368 return (mExtent == EXTENT_INFINITE);
383 if (mMaximum.x < b2.mMinimum.x)
385 if (mMaximum.y < b2.mMinimum.y)
387 if (mMaximum.z < b2.mMinimum.z)
390 if (mMinimum.x > b2.mMaximum.x)
392 if (mMinimum.y > b2.mMaximum.y)
394 if (mMinimum.z > b2.mMaximum.z)
425 if (intMin.x < intMax.x &&
426 intMin.y < intMax.y &&
442 if (mExtent != EXTENT_FINITE)
466 return(v.x >= mMinimum.x && v.x <= mMaximum.x &&
467 v.y >= mMinimum.y && v.y <= mMaximum.y &&
468 v.z >= mMinimum.z && v.z <= mMaximum.z);
470 case EXTENT_INFINITE:
474 BASSERT(
false &&
"Never reached" );
481 BASSERT( (mExtent == EXTENT_FINITE) &&
"Can't get center of a null or infinite AAB" );
484 (mMaximum.x + mMinimum.x) * 0.5f,
485 (mMaximum.y + mMinimum.y) * 0.5f,
486 (mMaximum.z + mMinimum.z) * 0.5f);
503 return mMinimum.x <= v.x && v.x <= mMaximum.x &&
504 mMinimum.y <= v.y && v.y <= mMaximum.y &&
505 mMinimum.z <= v.z && v.z <= mMaximum.z;
521 return this->mMinimum.x <= other.mMinimum.x &&
522 this->mMinimum.y <= other.mMinimum.y &&
523 this->mMinimum.z <= other.mMinimum.z &&
524 other.mMaximum.x <= this->mMaximum.x &&
525 other.mMaximum.y <= this->mMaximum.y &&
526 other.mMaximum.z <= this->mMaximum.z;
533 if (this->mExtent != rhs.mExtent)
539 return this->mMinimum == rhs.mMinimum &&
540 this->mMaximum == rhs.mMaximum;
547 return !(*
this == rhs);
557 axisAlignedBox operator * (
const real& mul)
const
561 axisAlignedBox& operator *= (
const real& mul)
567 axisAlignedBox operator / (
const real& mul)
const
572 void setMinimumAndMaximum(
const vector3& min,
const vector3& max)
579 BLUB_SERIALIZATION_ACCESS
581 template <
class formatType>
582 void save(formatType & readWrite,
const uint32& version)
const
586 const vector3 minumum(mMinimum);
587 const vector3 maximum(mMaximum);
588 readWrite & serialization::nameValuePair::create(
"minimum", minumum);
589 readWrite & serialization::nameValuePair::create(
"maximum", maximum);
590 readWrite & serialization::nameValuePair::create(
"extend", mExtent);
592 template <
class formatType>
593 void load(formatType & readWrite,
const uint32& version)
599 readWrite & serialization::nameValuePair::create(
"minimum", minumum);
600 readWrite & serialization::nameValuePair::create(
"maximum", maximum);
601 setMinimumAndMaximum(minumum, maximum);
602 readWrite & serialization::nameValuePair::create(
"extend", mExtent);
604 BLUB_SERIALIZATION_SAVELOAD()
608 std::ostream& operator<< (std::ostream& ostr,
const axisAlignedBox& toCast);
614 #endif // AXISALIGNEDBOX_HPP
real volume(void) const
Calculate the volume of this box.
Definition: axisAlignedBox.cpp:35
vector3 getCorner(CornerEnum cornerToGet) const
Definition: axisAlignedBox.hpp:256
vector3 getCenter(void) const
Gets the centre of the box.
Definition: axisAlignedBox.hpp:479
void setMinimum(const vector3 &vec)
Definition: axisAlignedBox.hpp:157
vector3 & getMinimum(void)
Definition: axisAlignedBox.hpp:134
axisAlignedBox intersection(const axisAlignedBox &b2) const
Calculate the area of intersection of this box and another.
Definition: axisAlignedBox.hpp:403
vector3 getSize(void) const
Gets the size of the box.
Definition: axisAlignedBox.cpp:57
void setExtents(const vector3 &min, const vector3 &max)
Definition: axisAlignedBox.hpp:225
bool operator==(const axisAlignedBox &rhs) const
Definition: axisAlignedBox.hpp:531
void makeCeil(const vector3 &cmp)
Definition: vector3.hpp:538
void scale(const vector3 &s)
Definition: axisAlignedBox.hpp:439
bool intersects(const vector3 &v) const
Definition: axisAlignedBox.hpp:458
bool isInfinite(void) const
Definition: axisAlignedBox.hpp:366
vector3 getHalfSize(void) const
Gets the half-size of the box.
Definition: axisAlignedBox.cpp:79
Definition: axisAlignedBoxInt32.hpp:12
void merge(const axisAlignedBox &rhs)
Definition: axisAlignedBox.hpp:284
bool isNull(void) const
Definition: axisAlignedBox.hpp:345
bool contains(const vector3 &v) const
Definition: axisAlignedBox.hpp:496
void setMaximum(const vector3 &vec)
Definition: axisAlignedBox.hpp:191
bool intersects(const axisAlignedBox &b2) const
Definition: axisAlignedBox.hpp:372
void makeFloor(const vector3 &cmp)
Definition: vector3.hpp:524
void setMinimumX(real x)
Definition: axisAlignedBox.hpp:174
Definition: vector3.hpp:26
Definition: axisAlignedBox.hpp:20
vector3 & getMaximum(void)
Definition: axisAlignedBox.hpp:149
bool operator!=(const axisAlignedBox &rhs) const
Definition: axisAlignedBox.hpp:545
void setMaximumX(real x)
Definition: axisAlignedBox.hpp:208
const vector3 & getMinimum(void) const
Definition: axisAlignedBox.hpp:126
void setNull()
Definition: axisAlignedBox.hpp:338
const vector3 & getMaximum(void) const
Definition: axisAlignedBox.hpp:141
void setInfinite()
Definition: axisAlignedBox.hpp:359
bool contains(const axisAlignedBox &other) const
Definition: axisAlignedBox.hpp:513
void merge(const vector3 &point)
Definition: axisAlignedBox.hpp:316
Definition: deadlineTimer.hpp:10
Definition: axisAlignedBox.hpp:10
bool isFinite(void) const
Definition: axisAlignedBox.hpp:352
real distance(const vector3 &v) const
Definition: axisAlignedBox.cpp:101
Definition: sphere.hpp:10