diff options
Diffstat (limited to 'src/rtw/material.zig')
| -rw-r--r-- | src/rtw/material.zig | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/rtw/material.zig b/src/rtw/material.zig index 87244ab..311e5af 100644 --- a/src/rtw/material.zig +++ b/src/rtw/material.zig @@ -19,18 +19,30 @@ const MaterialTag = enum { diffuse, metal, dielectric, + diffuse_light, }; pub const Material = union(MaterialTag) { diffuse: DiffuseMaterial, metal: MetalMaterial, dielectric: DielectricMaterial, + diffuse_light: DiffuseLightMaterial, pub fn scatter(mat: Material, r_in: Ray, record: HitRecord, attenuation: *Color, scattered: *Ray, rng: Random) bool { return switch (mat) { MaterialTag.diffuse => |diffuse_mat| diffuse_mat.scatter(r_in, record, attenuation, scattered, rng), MaterialTag.metal => |metal_mat| metal_mat.scatter(r_in, record, attenuation, scattered, rng), MaterialTag.dielectric => |dielectric_mat| dielectric_mat.scatter(r_in, record, attenuation, scattered, rng), + MaterialTag.diffuse_light => |diffuse_light_mat| diffuse_light_mat.scatter(r_in, record, attenuation, scattered, rng), + }; + } + + pub fn emitted(mat: Material, u: f64, v: f64, p: Vec3) Color { + return switch (mat) { + MaterialTag.diffuse => rgb(0, 0, 0), + MaterialTag.metal => rgb(0, 0, 0), + MaterialTag.dielectric => rgb(0, 0, 0), + MaterialTag.diffuse_light => |diffuse_light_mat| diffuse_light_mat.emitted(u, v, p), }; } }; @@ -88,6 +100,24 @@ pub const DielectricMaterial = struct { } }; +pub const DiffuseLightMaterial = struct { + emit: Texture, + + fn scatter(mat: DiffuseLightMaterial, r_in: Ray, record: HitRecord, attenuation: *Color, scattered: *Ray, rng: Random) bool { + _ = mat; + _ = r_in; + _ = record; + _ = attenuation; + _ = scattered; + _ = rng; + return false; + } + + fn emitted(mat: DiffuseLightMaterial, u: f64, v: f64, p: Vec3) Color { + return mat.emit.value(u, v, p); + } +}; + fn reflect(v: Vec3, n: Vec3) Vec3 { return v.sub(n.mul(2 * v.dot(n))); } |
