Skip to content

Commit 02c2c00

Browse files
committed
solve #2 by throwing in random lifetimes 💀
1 parent adfdaef commit 02c2c00

File tree

5 files changed

+38
-46
lines changed

5 files changed

+38
-46
lines changed

Diff for: src/hittable.rs

+12-7
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
1-
use crate::{interval::Interval, material::EMaterial, ray::Ray, vec3::{dot, Point3, Vec3}};
1+
use crate::{interval::Interval, material::{DefaultMaterial, Material}, ray::Ray, vec3::{dot, Point3, Vec3}};
22

3-
#[derive(Clone, Default)]
4-
pub struct HitRecord {
3+
#[derive(Clone)]
4+
pub struct HitRecord<'a> {
55
pub p: Point3,
66
pub normal: Vec3,
7-
pub mat: Box<EMaterial>,
7+
pub mat: &'a (dyn Material),
88
pub t: f64,
99
pub front_face: bool,
1010
}
11-
impl HitRecord {
11+
impl<'a> Default for HitRecord<'a> {
12+
fn default() -> Self {
13+
Self { p: Default::default(), normal: Default::default(), mat: &DefaultMaterial, t: Default::default(), front_face: Default::default() }
14+
}
15+
}
16+
impl<'a> HitRecord<'a> {
1217
pub fn set_face_normal(&mut self, r: &Ray, outward_normal: &Vec3) {
1318
self.front_face = dot(*r.dir(), *outward_normal) < 0.0;
1419
self.normal = if self.front_face {*outward_normal} else {-*outward_normal}
1520
}
1621
}
1722

18-
pub trait Hittable {
19-
fn hit(&self, r: &Ray, ray_t: Interval, rec: &mut HitRecord) -> bool;
23+
pub trait Hittable<'a> {
24+
fn hit(&self, r: &Ray, ray_t: Interval, rec: &mut HitRecord<'a>) -> bool;
2025
}

Diff for: src/hittable_list.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
use crate::{hittable::{HitRecord, Hittable}, interval::Interval};
22

33
pub struct HittableList<'a> {
4-
objects: Vec<&'a dyn Hittable>,
4+
objects: Vec<&'a dyn Hittable<'a>>,
55
}
66
impl<'a> HittableList<'a> {
77
pub fn new() -> Self {
88
HittableList{objects: Vec::new()}
99
}
10-
pub fn add(&mut self, object: &'a dyn Hittable) {
10+
pub fn add(&mut self, object: &'a dyn Hittable<'a>) {
1111
self.objects.push(object);
1212
}
1313
}
14-
impl<'a> Hittable for HittableList<'a> {
15-
fn hit(&self, r: &crate::ray::Ray, ray_t: Interval, rec: &mut HitRecord) -> bool {
14+
impl<'a> Hittable<'a> for HittableList<'a> {
15+
fn hit(&self, r: &crate::ray::Ray, ray_t: Interval, rec: &mut HitRecord<'a>) -> bool {
1616
let mut temp_rec = HitRecord::default();
1717
let mut hit_anything = false;
1818
let mut closest_so_far = ray_t.max;

Diff for: src/main.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@ mod camera;
1515
mod material;
1616

1717
fn main() {
18-
let ground = material::EMaterial::Lambertian(Lambertian {albedo: Color::new(0.8,0.8,0.0)});
19-
let center = material::EMaterial::Lambertian(Lambertian {albedo: Color::new(0.1, 0.2, 0.5)});
20-
let left = material::EMaterial::Metal(Metal {albedo: Color::new(0.8, 0.8, 0.8)});
21-
let right = material::EMaterial::Metal(Metal {albedo: Color::new(0.8, 0.6, 0.2)});
18+
let ground = Lambertian {albedo: Color::new(0.8,0.8,0.0)};
19+
let center = Lambertian {albedo: Color::new(0.1, 0.2, 0.5)};
20+
let left = Metal {albedo: Color::new(0.8, 0.8, 0.8)};
21+
let right = Metal {albedo: Color::new(0.8, 0.6, 0.2)};
2222

2323
let mut world = HittableList::new();
2424

25-
let ground = Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0, Box::new(ground));
26-
let center = Sphere::new(Point3::new(0.0, 0.0, -1.2), 0.5, Box::new(center));
27-
let left = Sphere::new(Point3::new(-1.0, 0.0, -1.0), 0.5, Box::new(left));
28-
let right = Sphere::new(Point3::new(1.0, 0.0, -1.0), 0.5, Box::new(right));
25+
let ground = Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0, &ground);
26+
let center = Sphere::new(Point3::new(0.0, 0.0, -1.2), 0.5, &center);
27+
let left = Sphere::new(Point3::new(-1.0, 0.0, -1.0), 0.5, &left);
28+
let right = Sphere::new(Point3::new(1.0, 0.0, -1.0), 0.5, &right);
2929

3030
world.add(&ground);
3131
world.add(&center);

Diff for: src/material.rs

+7-20
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,15 @@
11
use crate::{color::Color, hittable::HitRecord, ray::Ray, vec3::{random_unit_vector, reflect}};
22

3-
#[derive(Clone, Copy, Default)]
4-
pub enum EMaterial {
5-
Lambertian(Lambertian),
6-
Metal(Metal),
7-
#[default]
8-
DefaultMaterial
9-
}
10-
11-
impl Material for EMaterial {
12-
fn scatter(&self, r_in: &Ray, rec: &HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool {
13-
match self {
14-
EMaterial::Lambertian(mat) => mat.scatter(r_in, rec, attenuation, scattered),
15-
EMaterial::Metal(mat) => mat.scatter(r_in, rec, attenuation, scattered),
16-
EMaterial::DefaultMaterial => false,
17-
// Implement scatter method for other variants
18-
}
19-
}
20-
}
213
pub trait Material {
224
fn scatter(&self, r_in: &Ray, rec: &HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool;
235
}
24-
#[derive(Default, Clone, Copy)]
6+
pub struct DefaultMaterial;
7+
impl Material for DefaultMaterial {
8+
fn scatter(&self, r_in: &Ray, rec: &HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool {
9+
false
10+
}
11+
}
12+
2513
pub struct Lambertian { pub albedo: Color }
2614
impl Material for Lambertian {
2715
fn scatter(&self, _r_in: &Ray, rec: &HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool {
@@ -38,7 +26,6 @@ impl Material for Lambertian {
3826
}
3927
}
4028

41-
#[derive(Default, Clone, Copy)]
4229
pub struct Metal { pub albedo: Color }
4330
impl Material for Metal {
4431
fn scatter(&self, r_in: &Ray, rec: &HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool {

Diff for: src/sphere.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
use crate::{hittable::{HitRecord, Hittable}, interval::Interval, material::EMaterial, vec3::{dot, Point3}};
1+
use crate::{hittable::{HitRecord, Hittable}, interval::Interval, material::Material, vec3::{dot, Point3}};
22

3-
pub struct Sphere {
3+
pub struct Sphere<'a> {
44
center: Point3,
55
radius: f64,
6-
mat: Box<EMaterial>
6+
mat: &'a dyn Material,
77
}
8-
impl Sphere {
9-
pub fn new(center: Point3, radius: f64, mat: Box<EMaterial>) -> Self {
8+
impl<'a> Sphere<'a> {
9+
pub fn new(center: Point3, radius: f64, mat: &'a dyn Material) -> Self {
1010
Sphere {center, radius, mat}
1111
}
1212
}
13-
impl Hittable for Sphere {
14-
fn hit(&self, r: &crate::ray::Ray, ray_t: Interval, rec: &mut HitRecord) -> bool {
13+
impl<'a> Hittable<'a> for Sphere<'a> {
14+
fn hit(&self, r: &crate::ray::Ray, ray_t: Interval, rec: &mut HitRecord<'a>) -> bool {
1515
let oc = self.center - *r.origin();
1616
let a = r.dir().length_squared();
1717
let h = dot(*r.dir(), oc);

0 commit comments

Comments
 (0)