aboutsummaryrefslogtreecommitdiff
path: root/src/world/shapes
diff options
context:
space:
mode:
Diffstat (limited to 'src/world/shapes')
-rw-r--r--src/world/shapes/box.rs40
-rw-r--r--src/world/shapes/mod.rs26
2 files changed, 42 insertions, 24 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 {}
diff --git a/src/world/shapes/mod.rs b/src/world/shapes/mod.rs
index 6e4b2ce..d15840c 100644
--- a/src/world/shapes/mod.rs
+++ b/src/world/shapes/mod.rs
@@ -1,32 +1,10 @@
mod sphere;
mod rectangle;
+mod r#box;
pub use sphere::Sphere;
pub use rectangle::{Rect, Plane};
+pub use r#box::BoxShp;
use crate::world::{Hittable, Intersection};
use crate::core::{Bound3f, Ray};
-
-pub enum Shape {
- Sphere(Sphere),
-}
-
-impl Hittable for Shape {
- fn intersect(&self, ray: &Ray) -> Option<Intersection> {
- match self {
- Self::Sphere(sph) => sph.intersect(ray)
- }
- }
-
- fn bounding_box(&self) -> Bound3f {
- match self {
- Self::Sphere(sph) => sph.bounding_box()
- }
- }
-}
-
-impl From<Sphere> for Shape {
- fn from(s: Sphere) -> Self {
- Self::Sphere(s)
- }
-}