diff options
Diffstat (limited to 'src/world/shapes/box.rs')
-rw-r--r-- | src/world/shapes/box.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/world/shapes/box.rs b/src/world/shapes/box.rs new file mode 100644 index 0000000..e07d5fe --- /dev/null +++ b/src/world/shapes/box.rs @@ -0,0 +1,40 @@ +use crate::core::{Ray, Bound3f, Vector3f}; +use crate::world::shapes::{Plane, Rect}; +use crate::world::{Instancable, Intersection, Hittable, DynHittable}; +use crate::world::container::HittableList; + +pub struct BoxShp { + sides: HittableList, +} + +impl BoxShp { + pub fn new(size: Vector3f) -> Self { + let mut cont = HittableList::new(); + cont.add(Rect::new_with_offset(size.x, size.y, size.z / 2.0, Plane::XY)); + cont.add(Rect::new_with_offset(size.x, size.y, -size.z / 2.0, Plane::XY)); + cont.add(Rect::new_with_offset(size.x, size.z, size.y / 2.0, Plane::XZ)); + cont.add(Rect::new_with_offset(size.x, size.z, -size.y / 2.0, Plane::XZ)); + cont.add(Rect::new_with_offset(size.y, size.z, size.x / 2.0, Plane::YZ)); + cont.add(Rect::new_with_offset(size.y, size.z, -size.x / 2.0, Plane::YZ)); + + Self {sides: cont} + } +} + +impl Into<DynHittable> for BoxShp { + fn into(self) -> DynHittable { + DynHittable::new(Box::new(self)) + } +} + +impl Hittable for BoxShp { + fn intersect(&self, ray: &Ray) -> Option<Intersection> { + self.sides.intersect(ray) + } + + fn bounding_box(&self) -> Bound3f { + self.sides.bounding_box() + } +} + +impl Instancable for BoxShp {} |