diff --git a/src/bin/topola-egui/painter.rs b/src/bin/topola-egui/painter.rs index 2a13563..30ec427 100644 --- a/src/bin/topola-egui/painter.rs +++ b/src/bin/topola-egui/painter.rs @@ -1,4 +1,5 @@ use geo::{CoordsIter, Point, Polygon}; +use rstar::AABB; use topola::{ geometry::primitive::{AccessPrimitiveShape, PrimitiveShape}, math::{self, Circle}, @@ -59,19 +60,22 @@ impl<'a> Painter<'a> { self.ui.painter().add(epaint_shape); if self.paint_bboxes { - let bbox = AccessPrimitiveShape::bbox(shape, 0.0); - let rect = egui::epaint::Rect { - min: [bbox.lower()[0] as f32, -bbox.upper()[1] as f32].into(), - max: [bbox.upper()[0] as f32, -bbox.lower()[1] as f32].into(), - }; - self.ui.painter().add(egui::Shape::rect_stroke( - self.transform.mul_rect(rect), - egui::Rounding::ZERO, - egui::Stroke::new(1.0, egui::Color32::GRAY), - )); + self.paint_bbox(AccessPrimitiveShape::bbox(shape, 0.0)); } } + pub fn paint_bbox(&mut self, bbox: AABB<[f64; 2]>) { + let rect = egui::epaint::Rect { + min: [bbox.lower()[0] as f32, -bbox.upper()[1] as f32].into(), + max: [bbox.upper()[0] as f32, -bbox.lower()[1] as f32].into(), + }; + self.ui.painter().add(egui::Shape::rect_stroke( + self.transform * rect, + egui::Rounding::ZERO, + egui::Stroke::new(1.0, egui::Color32::GRAY), + )); + } + pub fn paint_dot(&mut self, circle: Circle, color: egui::epaint::Color32) { let shape = self.dot_shape(circle, color); self.ui.painter().add(shape); diff --git a/src/bin/topola-egui/viewport.rs b/src/bin/topola-egui/viewport.rs index e1b9b5c..fa0b704 100644 --- a/src/bin/topola-egui/viewport.rs +++ b/src/bin/topola-egui/viewport.rs @@ -3,6 +3,7 @@ use petgraph::{ data::DataMap, visit::{EdgeRef, IntoEdgeReferences}, }; +use rstar::AABB; use topola::{ autorouter::invoker::{ Command, ExecuteWithStatus, GetGhosts, GetMaybeNavmesh, GetMaybeTrace, GetObstacles, @@ -209,6 +210,13 @@ impl Viewport { } } + if top.show_bboxes { + let root_bbox3d = board.layout().drawing().rtree().root().envelope(); + + let root_bbox = AABB::<[f64; 2]>::from_corners([root_bbox3d.lower()[0], root_bbox3d.lower()[1]].into(), [root_bbox3d.upper()[0], root_bbox3d.upper()[1]].into()); + painter.paint_bbox(root_bbox); + } + if let Some(execute) = maybe_execute { for ghost in execute.ghosts().iter() { painter.paint_primitive(&ghost, egui::Color32::from_rgb(75, 75, 150));