From 583b67f4f4674115b564338ae9c8cd81c12dd9bc Mon Sep 17 00:00:00 2001 From: djairoh Date: Wed, 15 Apr 2026 13:57:43 +0200 Subject: [PATCH] ft: 6.5: hitlist --- output.png | Bin 33546 -> 26109 bytes src/main.rs | 27 ++++++++------------------- src/objects/hit.rs | 15 ++++++++++++++- src/objects/sphere.rs | 4 +--- src/objects/traits.rs | 3 --- 5 files changed, 23 insertions(+), 26 deletions(-) diff --git a/output.png b/output.png index 8cca54b0379d7591d6637108edb0c1506f41b4aa..67486f60a2e0054385d81f2aed5b89576f862b1a 100644 GIT binary patch delta 9796 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: &Vec, r: &Ray) -> Colour -where - T: Hittable + Normal, -{ - let mut closest: Option = None; - for hittable in hittables { - if let Some(hit) = hittable.hit(r) { - // hit happens in front of camera and is closer than closest - if *hit.t() > 0. && (closest.is_none() || closest.as_ref().unwrap().t() > hit.t()) { - closest = Some(hit); - } - } - } - +fn ray_colour(hittables: &Vec, r: &Ray) -> Colour { + let closest = Hit::hit_list(hittables, r); if let Some(hit) = closest { let n = hit.n(); return 0.5 * Colour::new(n.x() + 1., n.y() + 1., n.z() + 1.); @@ -42,12 +30,13 @@ where } fn main() { - // use structs so rust-analyzer can provide lsp - let s = Sphere::new(Vec3::new(0., 0., -1.), 0.5); - let objects = vec![s]; - pretty_env_logger::init(); + // setup objects + let mut objects = vec![Sphere::new(Vec3::new(0., 0., -1.), 0.5)]; + objects.push(Sphere::new(Vec3::new(0., 0., -0.1), 0.01)); + objects.push(Sphere::new(Vec3::new(0., -100.5, -1.), 100.)); + let aspect_ratio = 16. / 9.; let image_width = 400; let image_height = max(1, (image_width as f32 / aspect_ratio) as u32); diff --git a/src/objects/hit.rs b/src/objects/hit.rs index e801ec7..e1514d2 100644 --- a/src/objects/hit.rs +++ b/src/objects/hit.rs @@ -1,4 +1,4 @@ -use crate::vec3::Vec3; +use crate::{objects::traits::Hittable, ray::Ray, vec3::Vec3}; pub struct Hit { t: f32, @@ -22,4 +22,17 @@ impl Hit { pub fn n(&self) -> &Vec3 { &self.n } + + pub fn hit_list(hittables: &Vec, r: &Ray) -> Option { + let mut closest: Option = None; + for hittable in hittables { + if let Some(hit) = hittable.hit(r) { + // hit happens in front of camera and is closer than closest + if *hit.t() > 0. && (closest.is_none() || closest.as_ref().unwrap().t() > hit.t()) { + closest = Some(hit); + } + } + } + return closest; + } } diff --git a/src/objects/sphere.rs b/src/objects/sphere.rs index 4f36ee1..ab52fb9 100644 --- a/src/objects/sphere.rs +++ b/src/objects/sphere.rs @@ -1,7 +1,7 @@ use core::f32::math::sqrt; use crate::objects::hit::Hit; -use crate::objects::traits::{Hittable, Normal}; +use crate::objects::traits::Hittable; use crate::Vec3; pub struct Sphere { @@ -34,9 +34,7 @@ impl Hittable for Sphere { Some(Hit::new(t, p, self.normal_at(&p))) } } -} -impl Normal for Sphere { fn normal_at(&self, p: &Vec3) -> Vec3 { (*p - self.center).get_unit() } diff --git a/src/objects/traits.rs b/src/objects/traits.rs index 48d571e..8e82d6a 100644 --- a/src/objects/traits.rs +++ b/src/objects/traits.rs @@ -4,8 +4,5 @@ use crate::Vec3; pub trait Hittable { fn hit(&self, r: &Ray) -> Option; -} - -pub trait Normal { fn normal_at(&self, p: &Vec3) -> Vec3; }