123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- // Copyright (C) 2000 Sean Cavanaugh
- // This file is licensed under the terms of the Lesser GNU Public License
- // (see LPGL.txt, or http://www.gnu.org/copyleft/lesser.txt)
- // AJM:
- #ifdef SYSTEM_WIN32
- #pragma warning(disable:4305) // truncation from 'const double' to 'float'
- #endif
- #ifndef BOUNDINGBOX_H__
- #define BOUNDINGBOX_H__
- #if _MSC_VER >= 1000
- #pragma once
- #endif
- class BoundingBox
- {
- public:
- typedef enum
- {
- eDisjoint, // neither boxes touch
- eUnion, // this box intersects with the other box
- eSubset, // this box is inside the other box
- eSuperset // this box is completly envelops the other box
- } eBoundingState;
- // Tests if other box is completely outside of this box
- bool testDisjoint(const BoundingBox& other) const
- {
- if ((m_Mins[0] > other.m_Maxs[0]) ||
- (m_Mins[1] > other.m_Maxs[1]) ||
- (m_Mins[2] > other.m_Maxs[2]) ||
- (m_Maxs[0] < other.m_Mins[0]) ||
- (m_Maxs[1] < other.m_Mins[1]) ||
- (m_Maxs[2] < other.m_Mins[2]))
- {
- return true;
- }
- return false;
- }
- // returns true if this box is completely inside other box
- bool testSubset(const BoundingBox& other) const
- {
- if (
- (m_Mins[0] >= other.m_Mins[0]) &&
- (m_Maxs[0] <= other.m_Maxs[0]) &&
- (m_Mins[1] >= other.m_Mins[1]) &&
- (m_Maxs[1] <= other.m_Maxs[1]) &&
- (m_Mins[2] >= other.m_Mins[2]) &&
- (m_Maxs[2] <= other.m_Maxs[2])
- )
- {
- return true;
- }
- return false;
- }
- // returns true if this box contains the other box completely
- bool testSuperset(const BoundingBox& other) const
- {
- return other.testSubset(*this);
- }
- // returns true if this box partially intersects the other box
- bool testUnion(const BoundingBox& other) const
- {
- BoundingBox tmpBox;
- tmpBox.m_Mins[0] = max(m_Mins[0], other.m_Mins[0]);
- tmpBox.m_Mins[1] = max(m_Mins[1], other.m_Mins[1]);
- tmpBox.m_Mins[2] = max(m_Mins[2], other.m_Mins[2]);
- tmpBox.m_Maxs[0] = min(m_Maxs[0], other.m_Maxs[0]);
- tmpBox.m_Maxs[1] = min(m_Maxs[1], other.m_Maxs[1]);
- tmpBox.m_Maxs[2] = min(m_Maxs[2], other.m_Maxs[2]);
- if ((tmpBox.m_Mins[0] > tmpBox.m_Maxs[0]) ||
- (tmpBox.m_Mins[1] > tmpBox.m_Maxs[1]) ||
- (tmpBox.m_Mins[2] > tmpBox.m_Maxs[2]))
- {
- return false;
- }
- return true;
- }
- eBoundingState test(const BoundingBox& other) const
- {
- eBoundingState rval;
- if (testDisjoint(other))
- {
- rval = eDisjoint;
- }
- else if (testSubset(other))
- {
- rval = eSubset;
- }
- else if (testSuperset(other))
- {
- rval = eSuperset;
- }
- else
- {
- rval = eUnion;
- }
- return rval;
- }
- void set(const vec3_t mins, const vec3_t maxs)
- {
- VectorCopy(mins, m_Mins);
- VectorCopy(maxs, m_Maxs);
- }
- void reset()
- {
- VectorFill(m_Mins, 999999999.999);
- VectorFill(m_Maxs, -999999999.999);
- }
- void add(const vec3_t point)
- {
- m_Mins[0] = min(m_Mins[0], point[0]);
- m_Maxs[0] = max(m_Maxs[0], point[0]);
- m_Mins[1] = min(m_Mins[1], point[1]);
- m_Maxs[1] = max(m_Maxs[1], point[1]);
- m_Mins[2] = min(m_Mins[2], point[2]);
- m_Maxs[2] = max(m_Maxs[2], point[2]);
- }
- void add(const BoundingBox& other)
- {
- add(other.m_Mins);
- add(other.m_Maxs);
- }
- public:
- // BoundingBox(const BoundingBox& other) // Default copy constructor ok
- // BoundingBox& operator=(const BoundingBox& other); // Default copy operator ok
- BoundingBox()
- {
- reset();
- }
- BoundingBox(const vec3_t& mins, const vec3_t& maxs)
- {
- VectorCopy(mins, m_Mins);
- VectorCopy(maxs, m_Maxs);
- }
- ~BoundingBox() {}
- public:
- // Bounding box
- vec3_t m_Mins;
- vec3_t m_Maxs;
- };
- #endif//BOUNDINGBOX_H__
|