mirror of https://codeberg.org/topola/topola.git
autorouter: fix off-by-one error when walking over ratlines
This commit is contained in:
parent
2cd33dac60
commit
36bc606401
|
|
@ -24,8 +24,7 @@ use crate::{
|
||||||
|
|
||||||
pub struct Autoroute {
|
pub struct Autoroute {
|
||||||
edge_indices: EdgeIndices<usize>,
|
edge_indices: EdgeIndices<usize>,
|
||||||
cur_edge: EdgeIndex<usize>,
|
navmesh: Option<Navmesh>, // Useful for debugging.
|
||||||
navmesh: Navmesh, // Useful for debugging.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Autoroute {
|
impl Autoroute {
|
||||||
|
|
@ -39,11 +38,10 @@ impl Autoroute {
|
||||||
|
|
||||||
let (from, to) = Self::edge_from_to(autorouter, cur_edge);
|
let (from, to) = Self::edge_from_to(autorouter, cur_edge);
|
||||||
let layout = autorouter.layout.lock().unwrap();
|
let layout = autorouter.layout.lock().unwrap();
|
||||||
let navmesh = Navmesh::new(&layout, from, to).ok()?;
|
let navmesh = Some(Navmesh::new(&layout, from, to).ok()?);
|
||||||
|
|
||||||
let this = Self {
|
let this = Self {
|
||||||
edge_indices,
|
edge_indices,
|
||||||
cur_edge,
|
|
||||||
navmesh,
|
navmesh,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -54,33 +52,23 @@ impl Autoroute {
|
||||||
&mut self,
|
&mut self,
|
||||||
autorouter: &mut Autorouter<R>,
|
autorouter: &mut Autorouter<R>,
|
||||||
observer: &mut impl RouterObserverTrait<R>,
|
observer: &mut impl RouterObserverTrait<R>,
|
||||||
) -> Option<()> {
|
) -> bool {
|
||||||
let navmesh = {
|
let new_navmesh = if let Some(cur_edge) = self.edge_indices.next() {
|
||||||
let (from, to) = self.from_to(autorouter);
|
let (from, to) = Self::edge_from_to(autorouter, cur_edge);
|
||||||
|
|
||||||
let layout = autorouter.layout.lock().unwrap();
|
let layout = autorouter.layout.lock().unwrap();
|
||||||
Navmesh::new(&layout, from, to).ok()?
|
Some(Navmesh::new(&layout, from, to).ok()?)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let router = Router::new_from_navmesh(
|
let router = Router::new_from_navmesh(
|
||||||
&mut autorouter.layout,
|
&mut autorouter.layout,
|
||||||
std::mem::replace(&mut self.navmesh, navmesh),
|
std::mem::replace(&mut self.navmesh, new_navmesh).unwrap(),
|
||||||
);
|
);
|
||||||
router.unwrap().route_band(100.0, observer);
|
router.unwrap().route_band(100.0, observer);
|
||||||
|
|
||||||
if let Some(cur_edge) = self.edge_indices.next() {
|
self.navmesh.is_some()
|
||||||
self.cur_edge = cur_edge;
|
|
||||||
} else {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
Some(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_to<R: RulesTrait>(
|
|
||||||
&self,
|
|
||||||
autorouter: &Autorouter<R>,
|
|
||||||
) -> (FixedDotIndex, FixedDotIndex) {
|
|
||||||
Self::edge_from_to(autorouter, self.cur_edge)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn edge_from_to<R: RulesTrait>(
|
fn edge_from_to<R: RulesTrait>(
|
||||||
|
|
@ -115,7 +103,7 @@ impl Autoroute {
|
||||||
(from_dot, to_dot)
|
(from_dot, to_dot)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn navmesh(&self) -> &Navmesh {
|
pub fn navmesh(&self) -> &Option<Navmesh> {
|
||||||
&self.navmesh
|
&self.navmesh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -132,14 +120,14 @@ impl<R: RulesTrait> Autorouter<R> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn autoroute(&mut self, layer: u64, observer: &mut impl RouterObserverTrait<R>) {
|
pub fn autoroute(&mut self, layer: u64, observer: &mut impl RouterObserverTrait<R>) {
|
||||||
if let Some(mut it) = self.autoroute_iter() {
|
if let Some(mut autoroute) = self.autoroute_walk() {
|
||||||
while let Some(()) = it.next(self, observer) {
|
while autoroute.next(self, observer) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn autoroute_iter(&mut self) -> Option<Autoroute> {
|
pub fn autoroute_walk(&mut self) -> Option<Autoroute> {
|
||||||
Autoroute::new(self.ratsnest.graph().edge_indices(), self)
|
Autoroute::new(self.ratsnest.graph().edge_indices(), self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,7 @@ impl eframe::App for App {
|
||||||
|
|
||||||
execute(async move {
|
execute(async move {
|
||||||
let mut autorouter = Autorouter::new(layout).unwrap();
|
let mut autorouter = Autorouter::new(layout).unwrap();
|
||||||
if let Some(mut autoroute) = autorouter.autoroute_iter() {
|
if let Some(mut autoroute) = autorouter.autoroute_walk() {
|
||||||
let from_to = autoroute.from_to(&autorouter);
|
let from_to = autoroute.from_to(&autorouter);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -289,8 +289,8 @@ fn main() -> Result<(), anyhow::Error> {
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut autorouter = Autorouter::new(layout.clone()).unwrap();
|
let mut autorouter = Autorouter::new(layout.clone()).unwrap();
|
||||||
if let Some(mut autoroute) = autorouter.autoroute_iter() {
|
if let Some(mut autoroute) = autorouter.autoroute_walk() {
|
||||||
while let Some(()) = autoroute.next(
|
while autoroute.next(
|
||||||
&mut autorouter,
|
&mut autorouter,
|
||||||
&mut DebugRouterObserver::new(
|
&mut DebugRouterObserver::new(
|
||||||
&mut event_pump,
|
&mut event_pump,
|
||||||
|
|
@ -298,7 +298,7 @@ fn main() -> Result<(), anyhow::Error> {
|
||||||
&mut renderer,
|
&mut renderer,
|
||||||
&font_context,
|
&font_context,
|
||||||
&mut view,
|
&mut view,
|
||||||
Some(autoroute.navmesh().clone()),
|
autoroute.navmesh().clone(),
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
//
|
//
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue