diff options
Diffstat (limited to 'src/hittable/hittable_box.rs')
-rw-r--r-- | src/hittable/hittable_box.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/hittable/hittable_box.rs b/src/hittable/hittable_box.rs new file mode 100644 index 0000000..7b95cc7 --- /dev/null +++ b/src/hittable/hittable_box.rs @@ -0,0 +1,40 @@ +use std::sync::Arc; + +use crate::{hittable::{HitRecord, Hittable, AABB, hittable_list::HittableList, xy_rect::XYRect, xz_rect::XZRect, yz_rect::YZRect}, material::Material, ray::Ray, vec3::Point3}; + +pub struct HittableBox { + min: Point3, + max: Point3, + sides: HittableList, +} + +impl HittableBox { + pub fn new(min: Point3, max: Point3, material: Arc<dyn Material>) -> Self { + let mut sides = HittableList::new(); + + sides.add(Arc::new(XYRect { material: material.clone(), x0: min.x, x1: max.x, y0: min.y, y1: max.y, k: max.z })); + sides.add(Arc::new(XYRect { material: material.clone(), x0: min.x, x1: max.x, y0: min.y, y1: max.y, k: min.z })); + + sides.add(Arc::new(XZRect { material: material.clone(), x0: min.x, x1: max.x, z0: min.z, z1: max.z, k: max.y })); + sides.add(Arc::new(XZRect { material: material.clone(), x0: min.x, x1: max.x, z0: min.z, z1: max.z, k: min.y })); + + sides.add(Arc::new(YZRect { material: material.clone(), y0: min.y, y1: max.y, z0: min.z, z1: max.z, k: max.x })); + sides.add(Arc::new(YZRect { material: material.clone(), y0: min.y, y1: max.y, z0: min.z, z1: max.z, k: min.x })); + + Self { + min, + max, + sides, + } + } +} + +impl Hittable for HittableBox { + fn hit(&self, ray: &Ray, t_min: f64, t_max: f64) -> Option<HitRecord> { + self.sides.hit(ray, t_min, t_max) + } + + fn bounding_box(&self, _: f64, _: f64) -> Option<AABB> { + Some(AABB { minimum: self.min.clone(), maximum: self.max.clone() }) + } +} |