X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FAabb.hh;h=6a7e064c41116c65e611d6f0ced6c81ed7272942;hp=f66fb24fe6595f60d76a25f9498d38596aabe6c4;hb=a31d65a998121df0651c57bfb68782e2a07d2e2f;hpb=c2321281bf12a7efaedde930422c7ddbc92080d4 diff --git a/src/Moof/Aabb.hh b/src/Moof/Aabb.hh index f66fb24..6a7e064 100644 --- a/src/Moof/Aabb.hh +++ b/src/Moof/Aabb.hh @@ -1,5 +1,5 @@ -/****************************************************************************** +/******************************************************************************* Copyright (c) 2009, Charles McGarvey All rights reserved. @@ -24,12 +24,15 @@ 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 +#include #include +#include namespace Mf { @@ -39,21 +42,100 @@ namespace Mf { * Axis-aligned Bounding Box */ -struct Aabb +struct Aabb : public Cullable, public Drawable { - Aabb() {} - - 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) {} - Vector3 min; Vector3 max; + + Aabb() {} + + 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); + } + + 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]; + } + } + + Vector3 getCenter() const + { + return Vector3((min[0] + max[0]) / 2.0, + (min[1] + max[1]) / 2.0, + (min[2] + max[2]) / 2.0); + } + + void getOctant(Aabb& octant, int num) const; + + Plane getPlaneXY() const + { + Plane plane; + plane.normal = Vector3(0.0, 0.0, 1.0); + plane.d = cml::dot(-plane.normal, getCenter()); + return plane; + } + + Plane getPlaneXZ() const + { + Plane plane; + plane.normal = Vector3(0.0, 1.0, 0.0); + plane.d = cml::dot(-plane.normal, getCenter()); + return plane; + } + + Plane getPlaneYZ() const + { + Plane plane; + plane.normal = Vector3(1.0, 0.0, 0.0); + plane.d = cml::dot(-plane.normal, getCenter()); + return plane; + } + + void getCorners(Vector3 corners[8]) const; + + void encloseVertices(const Vector3 vertices[], unsigned count); + + void draw(Scalar alpha = 0.0) const; + bool isVisible(const Frustum& frustum) const; };