]> git.localhorst.tv Git - blank.git/commitdiff
plug box intersection into shapes
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 23 Jun 2015 15:41:55 +0000 (17:41 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Tue, 23 Jun 2015 15:41:55 +0000 (17:41 +0200)
src/model/Shape.hpp
src/model/shape.cpp
src/model/shapes.hpp

index 5d4036b6d30e925ab77c256f80326b1490b3853b..39dd50f3b93048ad2edfe999113cf4e8fa4b13d5 100644 (file)
@@ -11,6 +11,7 @@
 
 namespace blank {
 
+class AABB;
 class Ray;
 
 struct Shape {
@@ -73,6 +74,14 @@ struct Shape {
                glm::vec3 &normal
        ) const noexcept = 0;
 
+       /// Check for intersection with given OBB.
+       /// The OBB is defined by box and box_M, M is applied to the shape.
+       virtual bool Intersects(
+               const glm::mat4 &M,
+               const AABB &box,
+               const glm::mat4 &box_M
+       ) const noexcept = 0;
+
 protected:
        void SetShape(const Model::Positions &pos, const Model::Normals &nrm, const Model::Indices &idx) {
                vtx_pos = pos;
index 1c831498e6e36a16cd6d1710c806405f7ca6c076..82659437f60fc87506f3847e181494514a99a7cd 100644 (file)
@@ -80,6 +80,14 @@ bool NullShape::Intersects(
        return false;
 }
 
+bool NullShape::Intersects(
+       const glm::mat4 &,
+       const AABB &,
+       const glm::mat4 &
+) const noexcept {
+       return false;
+}
+
 
 CuboidShape::CuboidShape(const AABB &b)
 : Shape()
@@ -167,6 +175,14 @@ bool CuboidShape::Intersects(
        return Intersection(ray, bb, M, &dist, &normal);
 }
 
+bool CuboidShape::Intersects(
+       const glm::mat4 &M,
+       const AABB &box,
+       const glm::mat4 &box_M
+) const noexcept {
+       return Intersection(bb, M, box, box_M);
+}
+
 
 StairShape::StairShape(const AABB &bb, const glm::vec2 &clip)
 : Shape()
@@ -326,4 +342,12 @@ bool StairShape::Intersects(
        }
 }
 
+bool StairShape::Intersects(
+       const glm::mat4 &M,
+       const AABB &box,
+       const glm::mat4 &box_M
+) const noexcept {
+       return Intersection(bot, M, box, box_M) || Intersection(top, M, box, box_M);
+}
+
 }
index b5e965a1c8f1e2e302f2ae656397b631bac02c08..8ead23d7cfea66ebd061cb22f663b57dd3fef54e 100644 (file)
@@ -17,6 +17,7 @@ public:
        NullShape();
 
        bool Intersects(const Ray &, const glm::mat4 &, float &, glm::vec3 &) const noexcept override;
+       bool Intersects(const glm::mat4 &, const AABB &, const glm::mat4 &) const noexcept override;
 
 };
 
@@ -28,6 +29,7 @@ public:
        CuboidShape(const AABB &bounds);
 
        bool Intersects(const Ray &, const glm::mat4 &, float &, glm::vec3 &) const noexcept override;
+       bool Intersects(const glm::mat4 &, const AABB &, const glm::mat4 &) const noexcept override;
 
 private:
        AABB bb;
@@ -42,6 +44,7 @@ public:
        StairShape(const AABB &bounds, const glm::vec2 &clip);
 
        bool Intersects(const Ray &, const glm::mat4 &, float &, glm::vec3 &) const noexcept override;
+       bool Intersects(const glm::mat4 &, const AABB &, const glm::mat4 &) const noexcept override;
 
 private:
        AABB top, bot;