summaryrefslogtreecommitdiff
path: root/src/camera.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/camera.rs')
-rw-r--r--src/camera.rs22
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();