diff options
author | Rosyid Haryadi <rosyid_haryadi@protonmail.com> | 2025-03-02 16:56:59 +0700 |
---|---|---|
committer | Rosyid Haryadi <rosyid_haryadi@protonmail.com> | 2025-03-02 16:56:59 +0700 |
commit | 93b24b9d01f806cf69ecee86fada9e5b9bf06182 (patch) | |
tree | c4c941acdeced6cb5b9cc51eedabc994ceda0b38 /src/camera.rs | |
parent | d618968b9577cbaf6306f42157be19bd2a6a6aa0 (diff) |
material
Diffstat (limited to 'src/camera.rs')
-rw-r--r-- | src/camera.rs | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/camera.rs b/src/camera.rs index 63e0097..a133035 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -1,6 +1,7 @@ use crate::calculus::calculus::{sample_square, Point3, Ray, Vec3}; use crate::common::{get_image_height, Color, DisplayBuffer, Pixel, ASPECT_RATIO, CAMERA_CENTER, FOCAL_LENGTH, IMG_WIDTH, MAX_DEPTH, SAMPLES_PER_PIXEL, VIEWPORT_HEIGHT}; use crate::interval::Interval; +use crate::material::{Material, MaterialType}; use crate::object::{HitRecord, Hittable, HittableList}; pub struct Camera { @@ -86,10 +87,23 @@ impl Camera { let ray_t = Interval::new(0.001, f32::INFINITY); if world.hit(ray, ray_t, &mut rec) { // let direction = Vec3::random_on_hemisphere(&rec.normal); - let direction = rec.normal.add(&Vec3::random_unit()); - let origin = rec.position.clone(); - let r = Ray { origin, direction }; - return self.ray_color(&r, world, depth - 1).mul_scalar(0.9); + let material = Material::new( + rec.color.clone(), + rec.material.clone() + ); + let mut scattered: Ray = Ray { + origin: Vec3::random_unit(), + direction: Vec3::random_unit(), + }/* value */; + let mut attenuation: Color = Color::new(0.0, 0.0, 0.0); + if material.scatter(ray, &rec, &mut attenuation, &mut scattered) { + let attenuated = self.ray_color(&mut scattered, &world, depth - 1); + attenuation.r *= attenuated.r; + attenuation.r *= attenuated.g; + attenuation.r *= attenuated.b; + return attenuation; + } + return Color::new(0.0, 0.0, 0.0); } let unit_direction = ray.direction.unit(); |