5 * - implement distance functions
8 #include <gmath/gmath.h>
22 float dist; // parametric distance along the ray
23 Vec3 pos; // position of intersection (orig + dir * dist)
24 Vec3 normal; // normal at the point of intersection
26 const GeomObject *obj; // pointer to the intersected geom-object
27 void *data; // place to hang extra data
35 virtual ~GeomObject();
37 virtual bool valid() const;
38 virtual void invalidate();
40 virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const = 0;
41 virtual bool contains(const Vec3 &pt) const = 0;
43 virtual float distance(const Vec3 &v) const;
44 virtual float signed_distance(const Vec3 &v) const;
46 virtual float distance_sq(const Vec3 &v) const = 0;
47 virtual float signed_distance_sq(const Vec3 &v) const = 0;
50 class Sphere : public GeomObject {
56 Sphere(const Vec3 ¢er, float radius);
58 virtual bool valid() const;
59 virtual void invalidate();
61 virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const;
62 virtual bool contains(const Vec3 &pt) const;
64 virtual float distance_sq(const Vec3 &v) const;
65 virtual float signed_distance_sq(const Vec3 &v) const;
68 class AABox : public GeomObject {
73 AABox(const Vec3 &min, const Vec3 &max);
75 virtual bool valid() const;
76 virtual void invalidate();
78 virtual Vec3 get_corner(int idx) const;
80 virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const;
81 virtual bool contains(const Vec3 &pt) const;
83 virtual float distance_sq(const Vec3 &v) const;
84 virtual float signed_distance_sq(const Vec3 &v) const;
87 class Box : public AABox {
92 Box(const AABox &aabox, const Mat4 &xform);
93 Box(const Vec3 &min, const Vec3 &max);
94 Box(const Vec3 &min, const Vec3 &max, const Mat4 &xform);
95 Box(const Vec3 &pos, const Vec3 &vi, const Vec3 &vj, const Vec3 &vk);
96 Box(const Vec3 *varr, int vcount);
98 virtual void invalidate();
100 virtual Vec3 get_corner(int idx) const;
102 virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const;
103 virtual bool contains(const Vec3 &pt) const;
105 virtual float distance_sq(const Vec3 &v) const;
106 virtual float signed_distance_sq(const Vec3 &v) const;
110 class Plane : public GeomObject {
115 Plane(const Vec3 &pt, const Vec3 &normal);
116 Plane(const Vec3 &p1, const Vec3 &p2, const Vec3 &p3);
117 Plane(const Vec3 &normal, float dist);
119 virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const;
120 virtual bool contains(const Vec3 &pt) const;
122 virtual float distance(const Vec3 &v) const;
123 virtual float signed_distance(const Vec3 &v) const;
125 virtual float distance_sq(const Vec3 &v) const;
126 virtual float signed_distance_sq(const Vec3 &v) const;
129 class Disc : public Plane {
134 Disc(const Vec3 &pt, const Vec3 &normal, float rad);
135 Disc(const Vec3 &normal, float dist, float rad);
137 virtual bool valid() const;
138 virtual void invalidate();
140 virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const;
141 //! true if the projection of pt to the plane is contained within the disc radius
142 virtual bool contains(const Vec3 &pt) const;
144 virtual float distance_sq(const Vec3 &v) const;
145 virtual float signed_distance_sq(const Vec3 &v) const;
148 //! project point to plane
149 Vec3 proj_point_plane(const Vec3 &pt, const Plane &plane);
151 //! calculate the bounding sphere of any object
152 bool calc_bounding_sphere(Sphere *sph, const GeomObject *obj);
153 //! calculate the bounding sphere of two objects
154 bool calc_bounding_sphere(Sphere *sph, const GeomObject *a, const GeomObject *b);
155 //! calculate the bounding sphere of multiple objects
156 bool calc_bounding_sphere(Sphere *sph, const GeomObject **objv, int num);
157 //! calculate the bounding sphere of multiple points, optionally transformed by `xform`
158 bool calc_bounding_sphere(Sphere *sph, const Vec3 *v, int num, const Mat4 &xform = Mat4::identity);
160 //! calculate the bounding axis-aligned box of any object
161 bool calc_bounding_aabox(AABox *box, const GeomObject *obj);
162 //! calculate the bounding axis-aligned box of two objects
163 bool calc_bounding_aabox(AABox *box, const GeomObject *a, const GeomObject *b);
164 //! calculate the bounding axis-aligned box of multiple objects
165 bool calc_bounding_aabox(AABox *box, const GeomObject **objv, int num);
166 //! calculate the bounding axis-aligned box of multiple points, optionally transformed by `xform`
167 bool calc_bounding_aabox(AABox *box, const Vec3 *v, int num, const Mat4 &xform = Mat4::identity);
169 //! calculate the bounding box of any object
170 bool calc_bounding_box(Box *box, const GeomObject *obj);
172 //! calculate the intersection plane of two spheres. false if there is no plane or infinite planes.
173 bool intersect_sphere_sphere(Plane *result, const Sphere &a, const Sphere &b);
174 //! calculate the intersection line of two planes. returns false if planes are exactly parallel.
175 bool intersect_plane_plane(Ray *result, const Plane &a, const Plane &b);
176 /*! calculate the intesection circle of a plane and a sphere. returns false if they don't intersect.
179 bool intersect_sphere_plane(Sphere *result, const Sphere &s, const Plane &p);
180 bool intersect_plane_sphere(Sphere *result, const Plane &p, const Sphere &s);
183 //! calculate the intersection of two axis-aligned bounding boxes
184 bool intersect_aabox_aabox(AABox *res, const AABox &a, const AABox &b);
186 //! determine if a sphere and an axis-aligned box collide
187 bool collision_sphere_aabox(const Sphere &s, const AABox &b);