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
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 {
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 {
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 {
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;
};
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 {
//! 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
//! 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_