GLM AABB
Axis aligned bounding box built on GLM
glm-aabb/AABB.hpp
00001 #ifndef IAUNS_GLM_AABB_HPP
00002 #define IAUNS_GLM_AABB_HPP
00003 
00004 #include <glm/glm.hpp>
00005 
00006 namespace CPM_GLM_AABB_NS {
00007 
00009 class AABB
00010 {
00011 public:
00013   AABB();
00014 
00018   AABB(const glm::vec3& center, glm::float_t radius);
00019 
00021   AABB(const glm::vec3& p1, const glm::vec3& p2);
00022 
00023   AABB(const AABB& aabb);
00024   ~AABB();
00025 
00027   void setNull()      {mMin = glm::vec3(1.0); mMax = glm::vec3(-1.0);}
00028 
00030   bool isNull() const {return mMin.x > mMax.x || mMin.y > mMax.y || mMin.z > mMax.z;}
00031 
00033   void extend(glm::float_t val);
00034 
00036   void extend(const glm::vec3& p);
00037 
00042   void extend(const glm::vec3& center, glm::float_t radius);
00043 
00045   void extend(const AABB& aabb);
00046 
00050   void extendDisk(const glm::vec3& center, const glm::vec3& normal,
00051                   glm::float_t radius);
00052 
00054   void translate(const glm::vec3& v);
00055 
00060   void scale(const glm::vec3& scale, const glm::vec3& origin);
00061 
00063   glm::vec3 getCenter() const;
00064 
00067   glm::vec3 getDiagonal() const;
00068 
00071   glm::float_t getLongestEdge() const;
00072 
00075   glm::float_t getShortestEdge() const;
00076 
00078   glm::vec3 getMin() const {return mMin;}
00079 
00081   glm::vec3 getMax() const {return mMax;}
00082 
00085   bool overlaps(const AABB& bb) const;
00086 
00088   enum INTERSECTION_TYPE { INSIDE, INTERSECT, OUTSIDE };
00091   INTERSECTION_TYPE intersect(const AABB& bb) const;
00092 
00099   bool isSimilarTo(const AABB& b, glm::float_t diff = 0.5) const;
00100 
00101 private:
00102 
00103   glm::vec3 mMin;   
00104   glm::vec3 mMax;   
00105 };
00106 
00107 } // namespace CPM_GLM_AABB_NS 
00108 
00109 #endif