aboutsummaryrefslogtreecommitdiff
path: root/src/world/shapes/box.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/world/shapes/box.rs')
-rw-r--r--src/world/shapes/box.rs40
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 {}