mod basics;
mod builder;
mod check;
mod halfedge;
mod pseudo_winged;
use super::HalfEdgeImplMeshType;
use crate::{
math::{HasNormal, Scalar, Transformable, Vector},
mesh::{
EuclideanMeshType, MeshTopology, MeshTrait, TransformableMesh, Triangulateable, WithNormals,
},
util::DeletableVector,
};
#[derive(Clone)]
pub struct HalfEdgeMeshImpl<T: HalfEdgeImplMeshType> {
vertices: DeletableVector<T::Vertex, T::V>,
halfedges: DeletableVector<T::Edge, T::E>,
faces: DeletableVector<T::Face, T::F>,
payload: T::MP,
}
impl<T: HalfEdgeImplMeshType> HalfEdgeMeshImpl<T> {
pub fn new() -> Self {
Self {
vertices: DeletableVector::new(),
halfedges: DeletableVector::new(),
faces: DeletableVector::new(),
payload: T::MP::default(),
}
}
}
impl<T: HalfEdgeImplMeshType> Default for HalfEdgeMeshImpl<T> {
fn default() -> Self {
Self::new()
}
}
impl<const D: usize, T: HalfEdgeImplMeshType + EuclideanMeshType<D>> TransformableMesh<D, T>
for HalfEdgeMeshImpl<T>
where
T::VP: Transformable<D, Rot = T::Rot, Vec = T::Vec, Trans = T::Trans, S = T::S>,
T::EP: Transformable<D, Rot = T::Rot, Vec = T::Vec, Trans = T::Trans, S = T::S>,
T::FP: Transformable<D, Rot = T::Rot, Vec = T::Vec, Trans = T::Trans, S = T::S>,
T::MP: Transformable<D, Rot = T::Rot, Vec = T::Vec, Trans = T::Trans, S = T::S>,
{
}
impl<
const D: usize,
VecN: Vector<SN, D>,
SN: Scalar,
T: HalfEdgeImplMeshType + EuclideanMeshType<D, VP: HasNormal<D, VecN, S = SN>>,
> WithNormals<D, VecN, SN, T> for HalfEdgeMeshImpl<T>
{
}
impl<T: HalfEdgeImplMeshType> MeshTopology<T> for HalfEdgeMeshImpl<T> {}
impl<T: HalfEdgeImplMeshType> Triangulateable<T> for HalfEdgeMeshImpl<T> {}
impl<T: HalfEdgeImplMeshType> MeshTrait for HalfEdgeMeshImpl<T> {
type T = T;
}
#[cfg(feature = "netsci")]
impl<T: HalfEdgeImplMeshType> crate::mesh::NetworkScience<T> for HalfEdgeMeshImpl<T> {}