diff options
| author | nsfisis <nsfisis@gmail.com> | 2023-06-25 23:49:58 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2023-06-25 23:49:58 +0900 |
| commit | aca6892c9e84144190941f0bb3b3f6b8f0fdc566 (patch) | |
| tree | 57db4d1f1d27bddc494a991626b25ac2332e9748 /src/rtw | |
| parent | fb72e21e3d3896ac611145719e641ff774accb51 (diff) | |
| download | RayTracingInOneWeekend.zig-aca6892c9e84144190941f0bb3b3f6b8f0fdc566.tar.gz RayTracingInOneWeekend.zig-aca6892c9e84144190941f0bb3b3f6b8f0fdc566.tar.zst RayTracingInOneWeekend.zig-aca6892c9e84144190941f0bb3b3f6b8f0fdc566.zip | |
7.2
Diffstat (limited to 'src/rtw')
| -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))); } |
