adding mirror plane options other than auto
[laserbrain_demo] / src / geom.h
index 24a0b86..5de6a62 100644 (file)
@@ -12,7 +12,8 @@ enum GeomObjectType {
        GOBJ_SPHERE,
        GOBJ_AABOX,
        GOBJ_BOX,
-       GOBJ_PLANE
+       GOBJ_PLANE,
+       GOBJ_DISC
 };
 
 class GeomObject;
@@ -33,11 +34,17 @@ public:
        GeomObject();
        virtual ~GeomObject();
 
+       virtual bool valid() const;
+       virtual void invalidate();
+
        virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const = 0;
        virtual bool contains(const Vec3 &pt) const = 0;
 
-       virtual float distance(const Vec3 &v) const = 0;
-       virtual float signed_distance(const Vec3 &v) const = 0;
+       virtual float distance(const Vec3 &v) const;
+       virtual float signed_distance(const Vec3 &v) const;
+
+       virtual float distance_sq(const Vec3 &v) const = 0;
+       virtual float signed_distance_sq(const Vec3 &v) const = 0;
 };
 
 class Sphere : public GeomObject {
@@ -48,11 +55,14 @@ public:
        Sphere();
        Sphere(const Vec3 &center, float radius);
 
+       virtual bool valid() const;
+       virtual void invalidate();
+
        virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const;
        virtual bool contains(const Vec3 &pt) const;
 
-       virtual float distance(const Vec3 &v) const;
-       virtual float signed_distance(const Vec3 &v) const;
+       virtual float distance_sq(const Vec3 &v) const;
+       virtual float signed_distance_sq(const Vec3 &v) const;
 };
 
 class AABox : public GeomObject {
@@ -62,13 +72,17 @@ public:
        AABox();
        AABox(const Vec3 &min, const Vec3 &max);
 
+       virtual bool valid() const;
+       virtual void invalidate();
+
        virtual Vec3 get_corner(int idx) const;
+       virtual Plane get_plane(int pidx) const;
 
        virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const;
        virtual bool contains(const Vec3 &pt) const;
 
-       virtual float distance(const Vec3 &v) const;
-       virtual float signed_distance(const Vec3 &v) const;
+       virtual float distance_sq(const Vec3 &v) const;
+       virtual float signed_distance_sq(const Vec3 &v) const;
 };
 
 class Box : public AABox {
@@ -76,17 +90,21 @@ public:
        Mat4 xform;
 
        Box();
+       Box(const AABox &aabox, const Mat4 &xform);
        Box(const Vec3 &min, const Vec3 &max);
+       Box(const Vec3 &min, const Vec3 &max, const Mat4 &xform);
        Box(const Vec3 &pos, const Vec3 &vi, const Vec3 &vj, const Vec3 &vk);
        Box(const Vec3 *varr, int vcount);
 
+       virtual void invalidate();
+
        virtual Vec3 get_corner(int idx) const;
 
        virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const;
        virtual bool contains(const Vec3 &pt) const;
 
-       virtual float distance(const Vec3 &v) const;
-       virtual float signed_distance(const Vec3 &v) const;
+       virtual float distance_sq(const Vec3 &v) const;
+       virtual float signed_distance_sq(const Vec3 &v) const;
 };
 
 
@@ -104,6 +122,9 @@ public:
 
        virtual float distance(const Vec3 &v) const;
        virtual float signed_distance(const Vec3 &v) const;
+
+       virtual float distance_sq(const Vec3 &v) const;
+       virtual float signed_distance_sq(const Vec3 &v) const;
 };
 
 class Disc : public Plane {
@@ -114,12 +135,15 @@ public:
        Disc(const Vec3 &pt, const Vec3 &normal, float rad);
        Disc(const Vec3 &normal, float dist, float rad);
 
+       virtual bool valid() const;
+       virtual void invalidate();
+
        virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const;
        //! true if the projection of pt to the plane is contained within the disc radius
        virtual bool contains(const Vec3 &pt) const;
 
-       virtual float distance(const Vec3 &v) const;
-       virtual float signed_distance(const Vec3 &v) const;
+       virtual float distance_sq(const Vec3 &v) const;
+       virtual float signed_distance_sq(const Vec3 &v) const;
 };
 
 //! project point to plane
@@ -143,6 +167,9 @@ bool calc_bounding_aabox(AABox *box, const GeomObject **objv, int num);
 //! calculate the bounding axis-aligned box of multiple points, optionally transformed by `xform`
 bool calc_bounding_aabox(AABox *box, const Vec3 *v, int num, const Mat4 &xform = Mat4::identity);
 
+//! calculate the bounding box of any object
+bool calc_bounding_box(Box *box, const GeomObject *obj);
+
 //! calculate the intersection plane of two spheres. false if there is no plane or infinite planes.
 bool intersect_sphere_sphere(Plane *result, const Sphere &a, const Sphere &b);
 //! calculate the intersection line of two planes. returns false if planes are exactly parallel.
@@ -157,4 +184,7 @@ bool intersect_plane_sphere(Sphere *result, const Plane &p, const Sphere &s);
 //! calculate the intersection of two axis-aligned bounding boxes
 bool intersect_aabox_aabox(AABox *res, const AABox &a, const AABox &b);
 
+//! determine if a sphere and an axis-aligned box collide
+bool collision_sphere_aabox(const Sphere &s, const AABox &b);
+
 #endif // GEOMOBJ_H_