latest
This commit is contained in:
@@ -16,16 +16,16 @@ impl HitRecord<'_> {
|
||||
HitRecord { p: Point3::new(0.0, 0.0, 0.0), normal: Vec3::new(0.0, 0.0, 0.0), t: 0.0, front_face: false, mat_ptr: material }
|
||||
}
|
||||
|
||||
pub fn set_face_normal(&mut self, r: &Ray, outward_normal: &Vec3) {
|
||||
self.front_face = r.direction().dot(outward_normal) < 0.0;
|
||||
pub fn set_face_normal(&mut self, r: &Ray, outward_normal: Vec3) {
|
||||
self.front_face = r.direction().dot(&outward_normal) < 0.0;
|
||||
self.normal = if self.front_face {
|
||||
*outward_normal
|
||||
outward_normal
|
||||
} else {
|
||||
*outward_normal * -1.0
|
||||
outward_normal * -1.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Hittable {
|
||||
fn hit(&mut self, r: &Ray, t_min: f64, t_max: f64, rec: &mut HitRecord) -> bool;
|
||||
fn hit(&mut self, r: &Ray, t_min: f64, t_max: f64) -> Option<HitRecord>;
|
||||
}
|
||||
@@ -19,19 +19,17 @@ impl HittableList {
|
||||
}
|
||||
|
||||
impl Hittable for HittableList {
|
||||
fn hit(&mut self, r: &crate::ray::Ray, t_min: f64, t_max: f64, rec: &mut HitRecord) -> bool {
|
||||
let mut temp_rec = HitRecord::new_empty(rec.mat_ptr.clone());
|
||||
let mut hit_anything = false;
|
||||
fn hit(&mut self, r: &crate::ray::Ray, t_min: f64, t_max: f64) -> Option<HitRecord> {
|
||||
let mut temp_rec = None;
|
||||
let mut closest_so_far = t_max;
|
||||
|
||||
for object in &mut self.objects {
|
||||
if object.hit(r, t_min, closest_so_far, &mut temp_rec) {
|
||||
hit_anything = true;
|
||||
closest_so_far = temp_rec.t;
|
||||
*rec = temp_rec.clone();
|
||||
if let Some(rec) = object.hit(r, t_min, closest_so_far) {
|
||||
closest_so_far = rec.t;
|
||||
temp_rec = Some(rec);
|
||||
}
|
||||
}
|
||||
|
||||
hit_anything
|
||||
temp_rec
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,7 @@ use crate::{
|
||||
camera::*,
|
||||
};
|
||||
|
||||
fn ray_color(r: &Ray, world: &mut dyn Hittable, depth: i32) -> Color {
|
||||
fn ray_color(r: &Ray, world: &dyn Hittable, depth: i32) -> Color {
|
||||
let mut rec = HitRecord::new_empty(&Metal{ albedo: Color::new_empty() });
|
||||
|
||||
// Limit the bounces
|
||||
@@ -31,7 +31,7 @@ fn ray_color(r: &Ray, world: &mut dyn Hittable, depth: i32) -> Color {
|
||||
return Color::new(0.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
if world.hit(r, 0.001, INFINITY, &mut rec) {
|
||||
if let Some(rec) = world.hit(r, 0.001, INFINITY) {
|
||||
let mut scattered = Ray::new_empty();
|
||||
let mut attenuation = Color::new_empty();
|
||||
|
||||
@@ -54,8 +54,8 @@ fn main() {
|
||||
|
||||
// World
|
||||
let mut world = HittableList::new_empty();
|
||||
//world.add(Box::new(Sphere::new(Point3::new(0.0, 0.0, -1.0), 0.5)));
|
||||
//world.add(Box::new(Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0)));
|
||||
world.add(Box::new(Sphere::new(Point3::new(0.0, 0.0, -1.0), 0.5)));
|
||||
world.add(Box::new(Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0)));
|
||||
|
||||
// Camera
|
||||
let cam = Camera::new();
|
||||
|
||||
Reference in New Issue
Block a user