use fj_math::Point;
use crate::{
objects::{Face, Objects, Shell},
operations::Insert,
services::Service,
storage::Handle,
};
use super::{BuildFace, Triangle};
pub trait BuildShell {
fn tetrahedron(
points: [impl Into<Point<3>>; 4],
objects: &mut Service<Objects>,
) -> Tetrahedron {
let [a, b, c, d] = points.map(Into::into);
let Triangle {
face: face_abc,
edges: [ab, bc, ca],
} = Face::triangle([a, b, c], [None, None, None], objects);
let Triangle {
face: face_abd,
edges: [_, bd, da],
} = Face::triangle([a, b, d], [Some(ab), None, None], objects);
let Triangle {
face: face_cad,
edges: [_, _, dc],
} = Face::triangle([c, a, d], [Some(ca), Some(da), None], objects);
let Triangle { face: face_bcd, .. } =
Face::triangle([b, c, d], [Some(bc), Some(dc), Some(bd)], objects);
let faces = [face_abc, face_abd, face_cad, face_bcd]
.map(|face| face.insert(objects));
let shell = Shell::new(faces.clone());
let [face_abc, face_abd, face_cad, face_bcd] = faces;
Tetrahedron {
shell,
face_abc,
face_abd,
face_cad,
face_bcd,
}
}
}
impl BuildShell for Shell {}
pub struct Tetrahedron {
pub shell: Shell,
pub face_abc: Handle<Face>,
pub face_abd: Handle<Face>,
pub face_cad: Handle<Face>,
pub face_bcd: Handle<Face>,
}