diff --git a/zigrtiow/src/main.zig b/zigrtiow/src/main.zig index e3582a5..275393a 100644 --- a/zigrtiow/src/main.zig +++ b/zigrtiow/src/main.zig @@ -51,8 +51,8 @@ pub fn main() anyerror!void { const material_ground = Material{ .labertian = Labertian{ .albedo = Color.init(0.8, 0.8, 0.0) } }; const material_center = Material{ .labertian = Labertian{ .albedo = Color.init(0.7, 0.3, 0.3) } }; - const material_left = Material{ .metal = Metal{ .albedo = Color.init(0.8, 0.8, 0.8) } }; - const material_right = Material{ .metal = Metal{ .albedo = Color.init(0.8, 0.6, 0.2) } }; + const material_left = Material{ .metal = Metal{ .albedo = Color.init(0.8, 0.8, 0.8), .fuzz = 0.3 } }; + const material_right = Material{ .metal = Metal{ .albedo = Color.init(0.8, 0.6, 0.2), .fuzz = 1.0 } }; try tmp_world.add(Hittable{ .sphere = Sphere.init(Point3.init(0, -100.5, -1), 100, material_ground) }); try tmp_world.add(Hittable{ .sphere = Sphere.init(Point3.init(0, 0, -1), 0.5, material_center) }); diff --git a/zigrtiow/src/material.zig b/zigrtiow/src/material.zig index 223b311..252f68c 100644 --- a/zigrtiow/src/material.zig +++ b/zigrtiow/src/material.zig @@ -5,6 +5,7 @@ const HitRecord = @import("./hittable.zig").HitRecord; const Vec3 = vec.Vec3; const Color = vec.Color; const random_unit_vector = vec.random_unit_vector; +const random_in_unit_sphere = vec.random_in_unit_sphere; pub const Material = union(enum) { labertian: Labertian, @@ -37,9 +38,11 @@ pub const Labertian = struct { pub const Metal = struct { albedo: Vec3, + fuzz: f32, + pub fn scatter(metal: Metal, r_in: Ray, rec: HitRecord) ?ScatterRec { const reflected = reflect(r_in.direction().unit(), rec.normal); - const scattered = Ray.init(rec.p, reflected); + const scattered = Ray.init(rec.p, reflected.add(random_in_unit_sphere().scale(metal.fuzz))); const attenuation = metal.albedo; if (scattered.direction().dot(rec.normal) > 0) { return ScatterRec{