use super::*;
#[cfg(test)]
mod cube_tests;
pub struct Cube {
mesh: Mesh
}
impl Cube {
pub fn new(material: Material) -> Box<Self> {
let vertices = vec![
Point::X, Point::ZERO, Point::Y, Point::X + Point::Y,
Point::Z, Point::Z + Point::X, Point::ONE, Point::Z + Point::Y,
];
let faces = vec![
Face::new(vec![0, 1, 2, 3], vec![], vec![]),
Face::new(vec![4, 5, 6, 7], vec![], vec![]),
Face::new(vec![1, 4, 7, 2], vec![], vec![]),
Face::new(vec![5, 0, 3, 6], vec![], vec![]),
Face::new(vec![0, 5, 4, 1], vec![], vec![]),
Face::new(vec![6, 3, 2, 7], vec![], vec![]),
];
Box::new(Self {
mesh: TriangleMesh::new(vertices, faces, vec![], vec![], material)
})
}
}
impl Bounded for Cube {
fn bounding_box(&self) -> AaBoundingBox {
AaBoundingBox::new(Point::ZERO, Point::ONE)
}
}
impl Object for Cube {
fn hit(&self, r: &Ray, t_min: Float, t_max: Float) -> Option<Hit> {
self.mesh.hit(r, t_min, t_max)
}
}
impl Sampleable for Cube {
fn area(&self) -> Float {
self.mesh.area()
}
fn sample_on(&self, rand_sq: Vec2) -> Hit {
self.mesh.sample_on(rand_sq)
}
}