X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fgeom.h;h=0d8dd003658fa44c4cccbd32dda21586788a04b0;hp=f28f878c12c1d643df66f2239c90efead96fd5db;hb=2f5ee2007d258d947f2efab3bf3460479fe34813;hpb=ad052fc67fe4e76d2f4a01b2381a738da1708cdb diff --git a/src/geom.h b/src/geom.h index f28f878..0d8dd00 100644 --- a/src/geom.h +++ b/src/geom.h @@ -12,10 +12,21 @@ enum GeomObjectType { GOBJ_SPHERE, GOBJ_AABOX, GOBJ_BOX, - GOBJ_PLANE + GOBJ_PLANE, + GOBJ_DISC +}; + +enum { + AABOX_PLANE_PX, + AABOX_PLANE_NX, + AABOX_PLANE_PY, + AABOX_PLANE_NY, + AABOX_PLANE_PZ, + AABOX_PLANE_NZ }; class GeomObject; +class Plane; struct HitPoint { float dist; // parametric distance along the ray @@ -33,11 +44,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 +65,14 @@ public: Sphere(); Sphere(const Vec3 ¢er, 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 +82,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 { @@ -82,13 +106,15 @@ public: 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; }; @@ -106,6 +132,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 { @@ -116,12 +145,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 @@ -162,4 +194,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_