aboutsummaryrefslogtreecommitdiff
path: root/src/world
diff options
context:
space:
mode:
Diffstat (limited to 'src/world')
-rw-r--r--src/world/container/list.rs6
-rw-r--r--src/world/mod.rs11
-rw-r--r--src/world/scene.rs2
-rw-r--r--src/world/shapes/mod.rs26
4 files changed, 36 insertions, 9 deletions
diff --git a/src/world/container/list.rs b/src/world/container/list.rs
index c8e3fdd..22b6d88 100644
--- a/src/world/container/list.rs
+++ b/src/world/container/list.rs
@@ -1,9 +1,9 @@
-use crate::world::{Hittable, Intersection};
+use crate::world::{Object, Hittable, Intersection};
use crate::core::{Bound3f, Ray};
pub struct HittableList {
- elems: Vec<Box<dyn Hittable>>,
+ elems: Vec<Object>,
}
impl HittableList {
@@ -11,7 +11,7 @@ impl HittableList {
Self::default()
}
- pub fn add(&mut self, h: Box<dyn Hittable>) {
+ pub fn add(&mut self, h: Object) {
self.elems.push(h);
}
}
diff --git a/src/world/mod.rs b/src/world/mod.rs
index 3a09522..cba6ddc 100644
--- a/src/world/mod.rs
+++ b/src/world/mod.rs
@@ -6,21 +6,22 @@ pub mod container;
mod hittable;
pub use scene::*;
pub use hittable::{Intersection, Hittable};
+pub use shapes::Shape;
use std::sync::Arc;
use crate::material::Material;
use crate::core::{Bound3f, Ray};
pub struct Object {
- pub shape: Box<dyn Hittable + Sync>,
- pub mat: Arc<dyn Material + Sync + Send>,
+ pub shape: Shape,
+ pub mat: Arc<dyn Material>,
}
impl Object {
- pub fn new(mat: Arc<dyn Material + Sync + Send>, shape: Box<dyn Hittable + Sync>) -> Self {
+ pub fn new<T: Into<Shape>>(mat: Arc<dyn Material>, shape: T) -> Self {
Object {
mat,
- shape,
+ shape: shape.into(),
}
}
}
@@ -29,7 +30,7 @@ impl Hittable for Object {
fn intersect(&self, ray: &Ray) -> Option<Intersection> {
if let Some(mut inter) = self.shape.intersect(ray) {
inter.add_material_if_none(self.mat.as_ref());
- Some(inter)
+ Some(inter)
} else {
None
}
diff --git a/src/world/scene.rs b/src/world/scene.rs
index 6d15fc1..87bec1f 100644
--- a/src/world/scene.rs
+++ b/src/world/scene.rs
@@ -14,7 +14,7 @@ impl Scene {
}
pub fn add_object(&mut self, obj: Object) {
- self.content.add(Box::new(obj));
+ self.content.add(obj);
}
pub fn add_objects(&mut self, objs: Vec<Object>) {
diff --git a/src/world/shapes/mod.rs b/src/world/shapes/mod.rs
index d7583ad..a11df5d 100644
--- a/src/world/shapes/mod.rs
+++ b/src/world/shapes/mod.rs
@@ -2,3 +2,29 @@ mod sphere;
pub use sphere::Sphere;
+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)
+ }
+}