///|
/// Plane geometry: infinite plane defined by center point and normal.
pub(all) struct Plane {
center : Vec3
normal : Vec3
material : Material
} derive(Debug)
pub fn Plane::new(center~ : Vec3, normal~ : Vec3, material~ : Material) -> Plane {
{ center, normal: normal.normalize(), material }
}
pub fn Plane::hit_plane(self : Plane, 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)
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))
}