]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Aabb.hh
improved new vorbisfile compatibility
[chaz/yoink] / src / Moof / Aabb.hh
index f66fb24fe6595f60d76a25f9498d38596aabe6c4..0f7bbb9ff74fa2495e6b6582f2515c3b99f7cef2 100644 (file)
@@ -1,5 +1,5 @@
 
-/******************************************************************************
+/*******************************************************************************
 
  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/Cullable.hh>
+#include <Moof/Drawable.hh>
 #include <Moof/Math.hh>
+#include <Moof/Plane.hh>
 
 
 namespace Mf {
@@ -39,21 +42,101 @@ namespace Mf {
  * Axis-aligned Bounding Box
  */
 
-struct Aabb
+struct Aabb : public Cullable, 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);
+       }
+
+       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;
 };
 
 
This page took 0.019625 seconds and 4 git commands to generate.