From b84dab9d09a54d840f190aead116d6e1c9d101f3 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Mon, 30 Oct 2023 16:05:36 +0000 Subject: [PATCH] layout: Return an iterator over nodes instead of dots It's more general. Needed because mesh will be also generated from fixed and loose bends. --- src/layout.rs | 15 ++++++++++----- src/mesh.rs | 22 ++++++++++++---------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/layout.rs b/src/layout.rs index f251eb3..4d6b031 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -356,20 +356,25 @@ impl Layout { Ok(()) } - pub fn dots(&self) -> impl Iterator + '_ { - self.nodes() - .filter_map(|ni| ni.as_fixed_dot().map(|di| *di)) + pub fn nodes(&self) -> impl Iterator + '_ { + self.node_indexes().map(|ni| { + self.graph + .node_weight(ni.node_index()) + .unwrap() + .retag(ni.node_index()) + }) } pub fn shapes(&self) -> impl Iterator + '_ { - self.nodes().map(|ni| ni.primitive(&self.graph).shape()) + self.node_indexes() + .map(|ni| ni.primitive(&self.graph).shape()) } pub fn node_count(&self) -> usize { self.graph.node_count() } - fn nodes(&self) -> impl Iterator + '_ { + fn node_indexes(&self) -> impl Iterator + '_ { self.rtree.iter().map(|wrapper| wrapper.data) } } diff --git a/src/mesh.rs b/src/mesh.rs index 579070c..36fe65e 100644 --- a/src/mesh.rs +++ b/src/mesh.rs @@ -8,7 +8,7 @@ use spade::{ }; use crate::{ - graph::{DotIndex, FixedDotIndex, GetNodeIndex}, + graph::{DotIndex, FixedDotIndex, GetNodeIndex, Index}, layout::Layout, }; use crate::{primitive::MakeShape, shape::ShapeTrait}; @@ -51,16 +51,18 @@ impl Mesh { self.dot_to_vertex = Vec::new(); self.dot_to_vertex.resize(layout.graph.node_bound(), None); - for dot in layout.dots() { - let center = layout.primitive(dot).shape().center(); + for node in layout.nodes() { + if let Index::FixedDot(dot) = node { + let center = layout.primitive(dot).shape().center(); - self.dot_to_vertex[dot.node_index().index()] = Some(VertexIndex { - handle: self.triangulation.insert(Vertex { - dot, - x: center.x(), - y: center.y(), - })?, - }); + self.dot_to_vertex[dot.node_index().index()] = Some(VertexIndex { + handle: self.triangulation.insert(Vertex { + dot, + x: center.x(), + y: center.y(), + })?, + }); + } } Ok(())