use std::{fmt::Debug, sync::Arc}; use crate::{aabb::AABB, material::Material, ray::Ray, vec3::Vec3}; #[derive(Debug)] pub struct HitRecord<'m> { pub t: f32, pub uv: (f32, f32), pub p: Vec3, pub normal: Vec3, pub material: &'m dyn Material, } pub trait Hit: Send + Sync + Debug { fn hit(&self, r: Ray, t_min: f32, t_max: f32) -> Option; fn bounding_box(&self, t_min: f32, t_max: f32) -> Option; } impl Hit for Arc { fn hit(&self, r: Ray, t_min: f32, t_max: f32) -> Option { (**self).hit(r, t_min, t_max) } fn bounding_box(&self, t_min: f32, t_max: f32) -> Option { (**self).bounding_box(t_min, t_max) } } impl Hit for Box { fn hit(&self, r: Ray, t_min: f32, t_max: f32) -> Option { (**self).hit(r, t_min, t_max) } fn bounding_box(&self, t_min: f32, t_max: f32) -> Option { (**self).bounding_box(t_min, t_max) } }