aboutsummaryrefslogtreecommitdiff
path: root/src/world/container.rs
diff options
context:
space:
mode:
authorJulian T <julian@jtle.dk>2021-02-21 18:01:56 +0100
committerJulian T <julian@jtle.dk>2021-02-21 18:01:56 +0100
commitda1c3949a449f3fafe579c62ff6b14ffd993a197 (patch)
tree754df5c9b5e9f0fa0a8bb7a8cd3dd4b12fe5ad89 /src/world/container.rs
parentc695da871a75bb6786c08c3546ef71ed032bd61d (diff)
Add 3d bounding box and merged SceneIntersection and Intersection
Diffstat (limited to 'src/world/container.rs')
-rw-r--r--src/world/container.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/world/container.rs b/src/world/container.rs
new file mode 100644
index 0000000..6f8c182
--- /dev/null
+++ b/src/world/container.rs
@@ -0,0 +1,43 @@
+use super::{Hittable, Intersection};
+use crate::core::Ray;
+
+pub struct HittableList {
+ elems: Vec<Box<dyn Hittable>>,
+}
+
+impl HittableList {
+ pub fn new() -> Self {
+ Self::default()
+ }
+
+ pub fn add(&mut self, h: Box<dyn Hittable>) {
+ self.elems.push(h);
+ }
+}
+
+impl Hittable for HittableList {
+ fn intersect(&self, ray: &Ray) -> Option<Intersection> {
+ let mut min: Option<Intersection> = None;
+
+ for e in self.elems.iter() {
+ if let Some(i) = e.intersect(&ray) {
+ match min {
+ // Do nothing if distance is bigger than min
+ Some(ref min_i) if min_i.t < i.t => {},
+ // If no existing min or closer than
+ _ => min = Some(i),
+ }
+ }
+ }
+
+ min
+ }
+}
+
+impl Default for HittableList {
+ fn default() -> Self {
+ Self {
+ elems: Vec::new(),
+ }
+ }
+}