diff --git a/src/autorouter/autorouter.rs b/src/autorouter/autorouter.rs index dd3ecfd..3288c69 100644 --- a/src/autorouter/autorouter.rs +++ b/src/autorouter/autorouter.rs @@ -23,27 +23,31 @@ use crate::{ }; pub struct Autoroute { - edge_indices: Peekable>, + edge_indices: EdgeIndices, + cur_edge: EdgeIndex, navmesh: Navmesh, // Useful for debugging. } impl Autoroute { pub fn new( - edge_indices: EdgeIndices, + mut edge_indices: EdgeIndices, autorouter: &mut Autorouter, ) -> Option { - let mut peekable_edge_indices = edge_indices.peekable(); - let Some(ratline) = peekable_edge_indices.peek() else { + let Some(cur_edge) = edge_indices.next() else { return None; }; - let mut layout = autorouter.layout.lock().unwrap(); - let (from_dot, to_dot) = Self::terminating_dots(autorouter, &mut layout, ratline); - let navmesh = Self::next_navmesh(&layout, from_dot, to_dot); - Some(Self { - edge_indices: peekable_edge_indices, + let (from, to) = Self::edge_from_to(autorouter, cur_edge); + let layout = autorouter.layout.lock().unwrap(); + let navmesh = Navmesh::new(&layout, from, to).ok()?; + + let this = Self { + edge_indices, + cur_edge, navmesh, - }) + }; + + Some(this) } pub fn next( @@ -51,37 +55,43 @@ impl Autoroute { autorouter: &mut Autorouter, observer: &mut impl RouterObserverTrait, ) -> Option<()> { - let Some(ratline) = self.edge_indices.next() else { - return None; - }; - - let (navmesh, from_dot, to_dot) = { - let mut layout = autorouter.layout.lock().unwrap(); - let (from_dot, to_dot) = Self::terminating_dots(autorouter, &mut layout, &ratline); - let navmesh = Self::next_navmesh(&layout, from_dot, to_dot); - (navmesh, from_dot, to_dot) + let (navmesh, from, to) = { + let (from, to) = self.from_to(autorouter); + let layout = autorouter.layout.lock().unwrap(); + let navmesh = Navmesh::new(&layout, from, to).ok()?; + (navmesh, from, to) }; let router = Router::new_with_navmesh( &mut autorouter.layout, - from_dot, - to_dot, + from, + to, std::mem::replace(&mut self.navmesh, navmesh), ); - router.unwrap().route_band(to_dot, 100.0, observer); + router.unwrap().route_band(to, 100.0, observer); + + if let Some(cur_edge) = self.edge_indices.next() { + self.cur_edge = cur_edge; + } else { + return None; + } + Some(()) } - fn terminating_dots( + pub fn from_to( + &self, autorouter: &Autorouter, - layout: &mut Layout, - ratline: &EdgeIndex, ) -> (FixedDotIndex, FixedDotIndex) { - let (from, to) = autorouter - .ratsnest - .graph() - .edge_endpoints(*ratline) - .unwrap(); + Self::edge_from_to(autorouter, self.cur_edge) + } + + fn edge_from_to( + autorouter: &Autorouter, + edge: EdgeIndex, + ) -> (FixedDotIndex, FixedDotIndex) { + let mut layout = autorouter.layout.lock().unwrap(); + let (from, to) = autorouter.ratsnest.graph().edge_endpoints(edge).unwrap(); let from_dot = match autorouter .ratsnest