diff --git a/scenes/scene.json b/scenes/scene.json index 351e763..144d78e 100644 --- a/scenes/scene.json +++ b/scenes/scene.json @@ -4,7 +4,7 @@ "image_height": 1080, "anti_alias_rate": 1, "max_depth": 50, - "fov": 10.0, + "fov": 90.0, "look_from": [0, 4, 15], "look_at": [0.0, 0.0, 0.0], "vup": [0.0, 1.0, 0.0], diff --git a/src/camera.rs b/src/camera.rs index a016ca2..239f70f 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -235,7 +235,10 @@ impl Camera { let closest = Hit::hit_list(hittables, r); if let Some(hit) = closest { if let Some((scattered, att)) = hit.mat().scatter(&hit, r) { - return att * self.ray_colour(hittables, &scattered, depth - 1); + if let Some(ray) = scattered { + return att * self.ray_colour(hittables, &ray, depth - 1); + } + return att; } return Colour::default(); } diff --git a/src/objects/materials/dielectric.rs b/src/objects/materials/dielectric.rs index 46051f5..4aac6f3 100644 --- a/src/objects/materials/dielectric.rs +++ b/src/objects/materials/dielectric.rs @@ -30,7 +30,7 @@ impl Dielectric { } impl Material for Dielectric { - fn scatter(&self, hit: &Hit, ray: &Ray) -> Option<(Ray, Colour)> { + fn scatter(&self, hit: &Hit, ray: &Ray) -> Option<(Option, Colour)> { let ri = if hit.front_face() { 1. / self.refraction_index } else { @@ -51,6 +51,6 @@ impl Material for Dielectric { } else { unit.refract(hit.n(), ri) }; - Some((Ray::new(*hit.p(), dir), Colour::new(1., 1., 1.))) + Some((Some(Ray::new(*hit.p(), dir)), Colour::new(1., 1., 1.))) } } diff --git a/src/objects/materials/lambertian.rs b/src/objects/materials/lambertian.rs index 9146b43..8420bc1 100644 --- a/src/objects/materials/lambertian.rs +++ b/src/objects/materials/lambertian.rs @@ -30,7 +30,7 @@ impl Lambertian { } impl Material for Lambertian { - fn scatter(&self, hit: &Hit, _ray: &Ray) -> Option<(Ray, Colour)> { + fn scatter(&self, hit: &Hit, _ray: &Ray) -> Option<(Option, Colour)> { let mut rng = rand::rng(); if self.prob >= rng.random::() { let mut dir = *hit.n() + Vec3::random_unit(); @@ -38,7 +38,7 @@ impl Material for Lambertian { dir = *hit.n(); } let scattered = Ray::new(*hit.p(), dir); - return Some((scattered, self.albedo)); + return Some((Some(scattered), self.albedo)); } None } @@ -70,12 +70,12 @@ impl Metal { } impl Material for Metal { - fn scatter(&self, hit: &Hit, ray: &Ray) -> Option<(Ray, Colour)> { + fn scatter(&self, hit: &Hit, ray: &Ray) -> Option<(Option, Colour)> { let mut rng = rand::rng(); if self.prob >= rng.random::() { let mut refl = ray.dir().reflect(hit.n()); refl = refl.get_unit() + self.fuzz * Vec3::random_unit(); - return Some((Ray::new(*hit.p(), refl), self.albedo)); + return Some((Some(Ray::new(*hit.p(), refl)), self.albedo)); } None } diff --git a/src/objects/materials/normal.rs b/src/objects/materials/normal.rs index 7ecb87a..1e8bc63 100644 --- a/src/objects/materials/normal.rs +++ b/src/objects/materials/normal.rs @@ -10,8 +10,7 @@ use crate::{ pub struct Normal {} impl Material for Normal { - fn scatter(&self, hit: &Hit, ray: &Ray) -> Option<(Ray, Vec3)> { - let refl = ray.dir().reflect(hit.n()).get_unit(); - Some((Ray::new(*hit.p(), refl), (hit.n() + 1.) / 2.)) + fn scatter(&self, hit: &Hit, _ray: &Ray) -> Option<(Option, Vec3)> { + Some((None, (hit.n() + 1.) / 2.)) } } diff --git a/src/objects/materials/traits.rs b/src/objects/materials/traits.rs index b6593e0..72971a7 100644 --- a/src/objects/materials/traits.rs +++ b/src/objects/materials/traits.rs @@ -2,5 +2,5 @@ use crate::{objects::hit::Hit, ray::Ray, vec3::Colour}; use std::fmt::Debug; pub trait Material: Debug + Send + Sync{ - fn scatter(&self, hit: &Hit, ray: &Ray) -> Option<(Ray, Colour)>; + fn scatter(&self, hit: &Hit, ray: &Ray) -> Option<(Option, Colour)>; }