nuclear@13: #ifndef GEOMOBJ_H_ nuclear@13: #define GEOMOBJ_H_ nuclear@13: nuclear@13: #include "vmath/vmath.h" nuclear@13: nuclear@13: class GeomObject; nuclear@13: nuclear@13: struct HitPoint { nuclear@13: float dist; //< parametric distance along the ray nuclear@13: Vector3 pos; //< position of intersection (orig + dir * dist) nuclear@13: Vector3 normal; //< normal at the point of intersection nuclear@13: const void *obj; //< pointer to the intersected object nuclear@13: }; nuclear@13: nuclear@13: class GeomObject { nuclear@13: public: nuclear@13: virtual ~GeomObject(); nuclear@13: nuclear@13: virtual void set_union(const GeomObject *obj1, const GeomObject *obj2) = 0; nuclear@13: virtual void set_intersection(const GeomObject *obj1, const GeomObject *obj2) = 0; nuclear@13: nuclear@13: virtual bool contains(const Vector3 &pt) const = 0; nuclear@13: virtual bool intersect(const Ray &ray, HitPoint *hit = 0) const = 0; nuclear@13: }; nuclear@13: nuclear@13: class Sphere : public GeomObject { nuclear@13: public: nuclear@13: Vector3 center; nuclear@13: float radius; nuclear@13: nuclear@13: Sphere(); nuclear@13: Sphere(const Vector3 ¢er, float radius); nuclear@13: nuclear@13: void set_union(const GeomObject *obj1, const GeomObject *obj2); nuclear@13: void set_intersection(const GeomObject *obj1, const GeomObject *obj2); nuclear@13: nuclear@13: bool contains(const Vector3 &pt) const; nuclear@13: bool intersect(const Ray &ray, HitPoint *hit = 0) const; nuclear@13: }; nuclear@13: nuclear@13: class AABox : public GeomObject { nuclear@13: public: nuclear@13: Vector3 min, max; nuclear@13: nuclear@13: AABox(); nuclear@13: AABox(const Vector3 &min, const Vector3 &max); nuclear@13: nuclear@13: void set_union(const GeomObject *obj1, const GeomObject *obj2); nuclear@13: void set_intersection(const GeomObject *obj1, const GeomObject *obj2); nuclear@13: nuclear@13: bool contains(const Vector3 &pt) const; nuclear@13: bool intersect(const Ray &ray, HitPoint *hit = 0) const; nuclear@13: }; nuclear@13: nuclear@13: class Plane : public GeomObject { nuclear@13: public: nuclear@13: Vector3 pt, normal; nuclear@13: nuclear@13: Plane(); nuclear@13: Plane(const Vector3 &pt, const Vector3 &normal); nuclear@13: Plane(const Vector3 &p1, const Vector3 &p2, const Vector3 &p3); nuclear@13: Plane(const Vector3 &normal, float dist); nuclear@13: nuclear@13: void set_union(const GeomObject *obj1, const GeomObject *obj2); nuclear@13: void set_intersection(const GeomObject *obj1, const GeomObject *obj2); nuclear@13: nuclear@13: bool contains(const Vector3 &pt) const; nuclear@13: bool intersect(const Ray &ray, HitPoint *hit = 0) const; nuclear@13: }; nuclear@13: nuclear@13: #endif // GEOMOBJ_H_