#ifndef HITTABLE_H #define HITTABLE_H #include #include "ray.h" #include "material.h" #include "aabb.h" class Material; struct hit_record { Point3 p; Vec3 normal; std::shared_ptr mat_ptr; double t; double u; double v; bool front_face; inline void set_face_normal(const Ray& r, const Vec3& outward_normal) { front_face = dot(r.direction(), outward_normal) < 0; normal = front_face ? outward_normal : -outward_normal; } }; class Hittable { public: virtual bool hit(const Ray &r, double tmin, double tmax, hit_record &rec) const = 0; virtual bool bounding_box(double t0, double t1, Aabb& output_box) const = 0; }; class Flip_face : public Hittable { public: Flip_face(std::shared_ptr p) : ptr(p) {} virtual bool hit(const Ray &r, double tmin, double tmax, hit_record &rec) const { if (!ptr->hit(r, tmin, tmax, rec)) return false; rec.front_face = !rec.front_face; return true; } virtual bool bounding_box(double t0, double t1, Aabb& output_box) const { return ptr->bounding_box(t0, t1, output_box); } private: std::shared_ptr ptr; }; #endif // HITTABLE_H