Renderer/src/hittable_list.rs

40 lines
926 B
Rust
Raw Normal View History

2022-05-04 18:21:48 +02:00
use super::Hittable;
use super::Ray;
use super::HitRecord;
pub struct HittableList {
objects: Vec<Box<dyn Hittable>>,
}
impl HittableList {
pub fn new()-> Self {
HittableList {
objects: Vec::<Box<dyn Hittable>>::new()
}
}
pub fn clear(&mut self) {
self.objects.clear();
}
pub fn add(&mut self, obj: Box<dyn Hittable>) {
self.objects.push(obj);
}
pub fn hit(&self, r: &Ray, t_min: f64, t_max: f64, rec: &mut HitRecord) -> bool {
let mut hit_anything = false;
let mut closest_so_far = t_max;
for obj in &self.objects {
let mut temp_rec = HitRecord::empty();
if obj.hit(&r, t_min, closest_so_far, &mut temp_rec) {
hit_anything = true;
closest_so_far = temp_rec.t;
*rec = temp_rec;
}
}
return hit_anything;
}
}