diff --git a/src/autorouter/autorouter.rs b/src/autorouter/autorouter.rs index 9719d06..8993279 100644 --- a/src/autorouter/autorouter.rs +++ b/src/autorouter/autorouter.rs @@ -115,14 +115,6 @@ impl Autoroute { (from_dot, to_dot) } - fn next_navmesh( - layout: &Layout, - from: FixedDotIndex, - to: FixedDotIndex, - ) -> Navmesh { - Navmesh::new(layout, from, to).unwrap() - } - pub fn navmesh(&self) -> &Navmesh { &self.navmesh } diff --git a/src/bin/topola-egui/app.rs b/src/bin/topola-egui/app.rs index fb75efa..966f8c5 100644 --- a/src/bin/topola-egui/app.rs +++ b/src/bin/topola-egui/app.rs @@ -12,6 +12,7 @@ use std::{ use topola::{ autorouter::Autorouter, drawing::{ + dot::FixedDotIndex, graph::{MakePrimitive, PrimitiveIndex}, primitive::MakePrimitiveShape, rules::RulesTrait, @@ -38,6 +39,8 @@ use crate::{overlay::Overlay, painter::Painter}; #[derive(Debug, Default)] struct SharedData { + pub from: Option, + pub to: Option, pub navmesh: Option, pub path: Vec, pub ghosts: Vec, @@ -195,21 +198,28 @@ impl eframe::App for App { if ui.button("Autoroute").clicked() { if let Some(layout_arc_mutex) = &self.layout { let layout = layout_arc_mutex.clone(); - let shared_data = self.shared_data.clone(); + let shared_data_arc_mutex = self.shared_data.clone(); execute(async move { let mut autorouter = Autorouter::new(layout).unwrap(); - if let Some(mut it) = autorouter.autoroute_iter() { - shared_data.lock().unwrap().navmesh = Some(it.navmesh().clone()); + if let Some(mut autoroute) = autorouter.autoroute_iter() { + let from_to = autoroute.from_to(&autorouter); - while let Some(()) = it.next( + { + let mut shared_data = shared_data_arc_mutex.lock().unwrap(); + shared_data.from = Some(from_to.0); + shared_data.to = Some(from_to.1); + shared_data.navmesh = Some(autoroute.navmesh().clone()); + } + + while let Some(()) = autoroute.next( &mut autorouter, &mut DebugRouterObserver { - shared_data: shared_data.clone(), + shared_data: shared_data_arc_mutex.clone(), }, ) { - shared_data.lock().unwrap().navmesh = - Some(it.navmesh().clone()); + shared_data_arc_mutex.lock().unwrap().navmesh = + Some(autoroute.navmesh().clone()); } } }); @@ -374,6 +384,24 @@ impl eframe::App for App { for ghost in shared_data.ghosts.iter() { painter.paint_primitive(&ghost, egui::Color32::from_rgb(75, 75, 150)); } + + if let (Some(from), Some(to)) = (shared_data.from, shared_data.to) { + painter.paint_dot( + Circle { + pos: layout.drawing().primitive(from).shape().center(), + r: 20.0, + }, + egui::Color32::from_rgb(255, 255, 100), + ); + painter.paint_dot( + Circle { + pos: layout.drawing().primitive(to).shape().center(), + r: 20.0, + }, + egui::Color32::from_rgb(255, 255, 100), + ); + } + //unreachable!(); } } diff --git a/src/bin/topola-egui/painter.rs b/src/bin/topola-egui/painter.rs index 92fa44c..5bec59a 100644 --- a/src/bin/topola-egui/painter.rs +++ b/src/bin/topola-egui/painter.rs @@ -1,5 +1,8 @@ use geo::{CoordsIter, Point, Polygon}; -use topola::geometry::primitive::{PrimitiveShape, PrimitiveShapeTrait}; +use topola::{ + geometry::primitive::{PrimitiveShape, PrimitiveShapeTrait}, + math::Circle, +}; pub struct Painter<'a> { ui: &'a mut egui::Ui, @@ -13,12 +16,7 @@ impl<'a> Painter<'a> { pub fn paint_primitive(&mut self, shape: &PrimitiveShape, color: egui::epaint::Color32) { let epaint_shape = match shape { - PrimitiveShape::Dot(dot) => egui::Shape::circle_filled( - self.transform - .transform_pos([dot.c.pos.x() as f32, -dot.c.pos.y() as f32].into()), - dot.c.r as f32 * self.transform.scale().x, - color, - ), + PrimitiveShape::Dot(dot) => self.dot_shape(dot.c, color), PrimitiveShape::Seg(seg) => egui::Shape::line_segment( [ self.transform @@ -65,6 +63,20 @@ impl<'a> Painter<'a> { )); } + pub fn paint_dot(&mut self, circle: Circle, color: egui::epaint::Color32) { + let shape = self.dot_shape(circle, color); + self.ui.painter().add(shape); + } + + fn dot_shape(&mut self, circle: Circle, color: egui::epaint::Color32) -> egui::Shape { + egui::Shape::circle_filled( + self.transform + .transform_pos([circle.pos.x() as f32, -circle.pos.y() as f32].into()), + circle.r as f32 * self.transform.scale().x, + color, + ) + } + pub fn paint_polygon(&mut self, polygon: &Polygon, color: egui::epaint::Color32) { self.ui.painter().add(egui::Shape::convex_polygon( polygon