use mint::Point3;
use crate::v7400::data::mesh::{
ControlPointIndex, PolygonIndex, PolygonVertex, PolygonVertexIndex, PolygonVertices,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct TriangleVertexIndex(usize);
impl TriangleVertexIndex {
pub(crate) fn new(i: usize) -> Self {
Self(i)
}
pub fn to_usize(self) -> usize {
self.0
}
#[deprecated(since = "0.0.3", note = "Renamed to `to_usize`")]
pub fn get(self) -> usize {
self.to_usize()
}
pub fn triangle_index(self) -> TriangleIndex {
TriangleIndex::new(self.0 / 3)
}
}
#[derive(Debug, Clone)]
pub struct TriangleVertices<'a> {
polygon_vertices: PolygonVertices<'a>,
tri_pv_indices: Vec<PolygonVertexIndex>,
tri_poly_indices: Vec<PolygonIndex>,
}
impl<'a> TriangleVertices<'a> {
pub(crate) fn new(
polygon_vertices: PolygonVertices<'a>,
tri_pv_indices: Vec<PolygonVertexIndex>,
tri_poly_indices: Vec<PolygonIndex>,
) -> Self {
Self {
polygon_vertices,
tri_pv_indices,
tri_poly_indices,
}
}
pub fn polygon_vertices(&self) -> PolygonVertices<'a> {
self.polygon_vertices
}
pub fn polygon_vertex_index(&self, tri_vi: TriangleVertexIndex) -> Option<PolygonVertexIndex> {
self.tri_pv_indices.get(tri_vi.to_usize()).cloned()
}
pub fn polygon_vertex(&self, i: impl Into<IntoPvWithTriVerts>) -> Option<PolygonVertex> {
i.into().polygon_vertex(self)
}
pub fn control_point_index(
&self,
i: impl Into<IntoCpiWithTriVerts>,
) -> Option<ControlPointIndex> {
i.into().control_point_index(self)
}
pub fn control_point(&self, i: impl Into<IntoCpiWithTriVerts>) -> Option<Point3<f64>> {
self.control_point_index(i.into())
.and_then(|cpi| self.polygon_vertices.control_point(cpi))
}
pub fn len(&self) -> usize {
self.tri_pv_indices.len()
}
pub fn is_empty(&self) -> bool {
self.tri_pv_indices.is_empty()
}
pub fn iter_control_point_indices(
&self,
) -> impl Iterator<Item = Option<ControlPointIndex>> + '_ {
(0..self.len())
.map(TriangleVertexIndex::new)
.map(move |tri_vi| self.control_point_index(tri_vi))
}
pub fn polygon_index(&self, tri_i: TriangleIndex) -> Option<PolygonIndex> {
self.tri_poly_indices.get(tri_i.to_usize()).cloned()
}
pub fn triangle_vertex_indices(&self) -> impl Iterator<Item = TriangleVertexIndex> {
(0..self.len()).map(TriangleVertexIndex::new)
}
}
#[derive(Debug, Clone, Copy)]
pub struct TriangleIndex(usize);
impl TriangleIndex {
fn new(v: usize) -> Self {
Self(v)
}
pub fn to_usize(self) -> usize {
self.0
}
#[deprecated(since = "0.0.3", note = "Renamed to `to_usize`")]
pub fn get(self) -> usize {
self.to_usize()
}
}
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub enum IntoPvWithTriVerts {
PolygonVertex(PolygonVertex),
PolygonVertexIndex(PolygonVertexIndex),
TriangleVertexIndex(TriangleVertexIndex),
}
impl IntoPvWithTriVerts {
fn polygon_vertex(&self, triangle_vertices: &TriangleVertices<'_>) -> Option<PolygonVertex> {
match *self {
IntoPvWithTriVerts::PolygonVertex(pv) => Some(pv),
IntoPvWithTriVerts::PolygonVertexIndex(pvi) => {
triangle_vertices.polygon_vertices.polygon_vertex(pvi)
}
IntoPvWithTriVerts::TriangleVertexIndex(tri_vi) => triangle_vertices
.polygon_vertex_index(tri_vi)
.and_then(|pvi| triangle_vertices.polygon_vertices.polygon_vertex(pvi)),
}
}
}
impl From<PolygonVertex> for IntoPvWithTriVerts {
fn from(i: PolygonVertex) -> Self {
IntoPvWithTriVerts::PolygonVertex(i)
}
}
impl From<&PolygonVertex> for IntoPvWithTriVerts {
fn from(i: &PolygonVertex) -> Self {
IntoPvWithTriVerts::PolygonVertex(*i)
}
}
impl From<PolygonVertexIndex> for IntoPvWithTriVerts {
fn from(i: PolygonVertexIndex) -> Self {
IntoPvWithTriVerts::PolygonVertexIndex(i)
}
}
impl From<&PolygonVertexIndex> for IntoPvWithTriVerts {
fn from(i: &PolygonVertexIndex) -> Self {
IntoPvWithTriVerts::PolygonVertexIndex(*i)
}
}
impl From<TriangleVertexIndex> for IntoPvWithTriVerts {
fn from(i: TriangleVertexIndex) -> Self {
IntoPvWithTriVerts::TriangleVertexIndex(i)
}
}
impl From<&TriangleVertexIndex> for IntoPvWithTriVerts {
fn from(i: &TriangleVertexIndex) -> Self {
IntoPvWithTriVerts::TriangleVertexIndex(*i)
}
}
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub enum IntoCpiWithTriVerts {
ControlPointIndex(ControlPointIndex),
IntoPolygonVertex(IntoPvWithTriVerts),
}
impl IntoCpiWithTriVerts {
fn control_point_index(
&self,
triangle_vertices: &TriangleVertices<'_>,
) -> Option<ControlPointIndex> {
match *self {
IntoCpiWithTriVerts::ControlPointIndex(cpi) => Some(cpi),
IntoCpiWithTriVerts::IntoPolygonVertex(into_pv) => {
into_pv.polygon_vertex(triangle_vertices).map(Into::into)
}
}
}
}
impl<T: Into<IntoPvWithTriVerts>> From<T> for IntoCpiWithTriVerts {
fn from(i: T) -> Self {
IntoCpiWithTriVerts::IntoPolygonVertex(i.into())
}
}
impl From<ControlPointIndex> for IntoCpiWithTriVerts {
fn from(i: ControlPointIndex) -> Self {
IntoCpiWithTriVerts::ControlPointIndex(i)
}
}
impl From<&ControlPointIndex> for IntoCpiWithTriVerts {
fn from(i: &ControlPointIndex) -> Self {
IntoCpiWithTriVerts::ControlPointIndex(*i)
}
}