raytracers/zigrtiow/src/material.zig

35 lines
1.0 KiB
Zig

const vec = @import("./vec.zig");
const Ray = @import("./ray.zig").Ray;
const HitRecord = @import("./hittable.zig").HitRecord;
const Vec3 = vec.Vec3;
const Color = vec.Color;
const random_unit_vector = vec.random_unit_vector;
pub const Material = union(enum) {
labertian: Labertian,
pub fn scatter(material: Material, r_in: Ray, rec: HitRecord) ?ScatterRec {
return switch (material) {
.labertian => |labertian| labertian.scatter(r_in, rec),
};
}
};
pub const ScatterRec = struct { attenuation: Color, scattered: Ray };
pub const Labertian = struct {
albedo: Vec3,
pub fn scatter(labertian: Labertian, r_in: Ray, rec: HitRecord) ?ScatterRec {
_ = r_in;
var scatter_direction = rec.normal.add(random_unit_vector());
if (scatter_direction.near_zero()) {
scatter_direction = rec.normal;
}
return ScatterRec{
.scattered = Ray.init(rec.p, scatter_direction),
.attenuation = labertian.albedo,
};
}
};