]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Plane.hh
experimental shapes hierarchy and raycasting
[chaz/yoink] / src / Moof / Plane.hh
index 248a3128161afe0cadbdde10fa781d6b3e89c405..5ec59eab28e1c6115f4923b92892de9fd5e9d572 100644 (file)
 
 #ifndef _MOOF_PLANE_HH_
 #define _MOOF_PLANE_HH_
-       
+
 #include <Moof/Math.hh>
+#include <Moof/Shape.hh>
 
 
 namespace Mf {
 
 
-class Aabb;
-class Sphere;
+template <int D> class Aabb;
+template <int D> class Sphere;
+
 
+/*
+ * A plane in 3-space defined by the equation Ax + By + Cz = D, where [A, B, C]
+ * is normal to the plane.
+ */
 
-struct Plane
+struct Plane : public Shape<3>
 {
        Vector3 normal;
        Scalar  d;
@@ -60,6 +66,41 @@ struct Plane
                d(scalar) {}
 
 
+       Scalar intersectRay(const Ray<3>& ray, Ray<3>::Intersection& intersection)
+       {
+               // solve: [(ray.point + t*ray.direction) dot normal] + d = 0
+
+               Scalar denominator = cml::dot(ray.direction, normal);
+
+               // check for parallel condition
+               if (denominator == SCALAR(0.0))
+               {
+                       if (isEqual(cml::dot(ray.point, normal), -d))
+                       {
+                               // the ray lies on the plane
+                               intersection.point = ray.point;
+                               intersection.normal = normal;
+                               return SCALAR(0.0);
+                       }
+
+                       // no solution
+                       return SCALAR(-1.0);
+               }
+
+               Scalar t = (cml::dot(ray.point, normal) + d) / denominator;
+               if (t > SCALAR(0.0))
+               {
+                       ray.solve(intersection.point, t);
+                       intersection.normal = normal;
+               }
+
+               return t;
+       }
+
+
+       /* Causes the normal of the plane to become normalized.  The scalar may also
+        * be changed to keep the equation true.  Word to the wise: don't normalize
+        * a plane if the normal is the zero vector. */
        void normalize()
        {
                Scalar mag = normal.length();
@@ -68,12 +109,15 @@ struct Plane
                d /= mag;
        }
 
-       inline Scalar getDistanceToPoint(const Vector3& point) const
+       /**
+        * Determine the shortest distance between a point and the plane. */
+
+       Scalar getDistanceToPoint(const Vector3& point) const
        {
                return cml::dot(point, normal) + d;
        }
 
-       inline Halfspace intersectsPoint(const Vector3& point) const
+       Halfspace intersects(const Vector3& point) const
        {
                Scalar distance = getDistanceToPoint(point);
 
@@ -82,8 +126,8 @@ struct Plane
                else                        return POSITIVE;
        }
 
-       Halfspace intersectsAabb(const Aabb& aabb) const;
-       Halfspace intersectsSphere(const Sphere& sphere) const;
+       Halfspace intersects(const Aabb<3>& aabb) const;
+       Halfspace intersects(const Sphere<3>& sphere) const;
 };
 
 
This page took 0.018908 seconds and 4 git commands to generate.