aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/rtw
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtw')
-rw-r--r--src/rtw/material.zig30
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)));
}