use super::{Hittable, Intersection}; use crate::core::Ray; pub struct HittableList { elems: Vec>, } impl HittableList { pub fn new() -> Self { Self::default() } pub fn add(&mut self, h: Box) { self.elems.push(h); } } impl Hittable for HittableList { fn intersect(&self, ray: &Ray) -> Option { let mut min: Option = None; for e in self.elems.iter() { if let Some(i) = e.intersect(&ray) { match min { // Do nothing if distance is bigger than min Some(ref min_i) if min_i.t < i.t => {}, // If no existing min or closer than _ => min = Some(i), } } } min } } impl Default for HittableList { fn default() -> Self { Self { elems: Vec::new(), } } }