use super::*;
#[cfg(test)]
mod rectangle_tests;
pub struct Rectangle {
mesh: Mesh,
}
impl Rectangle {
pub fn new(abc: Mat3, material: Material) -> Box<Self> {
let vertices = vec![
abc.col(0), abc.col(1), abc.col(2), Self::_triangle_to_rect(abc)
];
let faces = vec![Face::new(vec![0,1,2,3], vec![], vec![])];
Box::new(Self {
mesh: TriangleMesh::new(vertices, faces, vec![], vec![], material)
})
}
fn _triangle_to_rect(abc: Mat3) -> Point {
let a = abc.col(0);
let b = abc.col(1);
let c = abc.col(2);
b + (a - b) + (c - b)
}
}
impl Object for Rectangle {
fn hit(&self, r: &Ray, t_min: Float, t_max: Float) -> Option<Hit> {
self.mesh.hit(r, t_min, t_max)
}
}
impl Sampleable for Rectangle {
fn area(&self) -> Float {
self.mesh.area()
}
fn sample_on(&self, rand_sq: Vec2) -> Hit {
self.mesh.sample_on(rand_sq)
}
}