///|
/// Disk geometry (flat circular disk).
pub(all) struct Disk {
center : Vec3
normal : Vec3
radius : Double
material : Material
} derive(Debug)
pub fn Disk::new(center~ : Vec3, normal~ : Vec3, radius~ : Double, material~ : Material) -> Disk {
{ center, normal: normal.normalize(), radius, material }
}
pub fn Disk::hit_disk(self : Disk, r : Ray, t_min~ : Double, t_max~ : Double) -> HitRecord? {
let denom = self.normal.dot(r.dir)
if denom.abs() < 1.0e-8 {
return None
}
let t = (self.center - r.orig).dot(self.normal) / denom
if t < t_min || t > t_max {
return None
}
let p = r.at(t)
if (p - self.center).length_squared() > self.radius * self.radius {
return None
}
let outward_normal = self.normal
let rec = { p, normal: outward_normal, t, front_face: false, material: self.material }
Some(rec.set_face_normal(r, outward_normal))
}