use crate::material::Material; use crate::ray::*; use crate::vec3::*; #[derive(Clone)] pub struct HitRecord<'a> { pub p: Point3, pub normal: Vec3, pub mat_ptr: &'a dyn Material, pub t: f64, pub front_face: bool, } impl HitRecord<'_> { pub fn new_empty(material: &'static T) -> Self { HitRecord { p: Point3::new(0.0, 0.0, 0.0), normal: Vec3::new(0.0, 0.0, 0.0), t: 0.0, front_face: false, mat_ptr: material } } pub fn set_face_normal(&mut self, r: &Ray, outward_normal: Vec3) { self.front_face = r.direction().dot(&outward_normal) < 0.0; self.normal = if self.front_face { outward_normal } else { outward_normal * -1.0 } } } pub trait Hittable { fn hit(&mut self, r: &Ray, t_min: f64, t_max: f64) -> Option; }