From 682f179cade99432acb909f5c04ccb385fbea168 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Fri, 3 May 2024 02:42:36 +0200 Subject: [PATCH] egui: draw bounding boxes --- src/bin/topola-egui/painter.rs | 46 ++++++++++++++++++----------- src/bin/topola-sdl2-demo/painter.rs | 4 +-- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/bin/topola-egui/painter.rs b/src/bin/topola-egui/painter.rs index 5b7c6d1..0240bf1 100644 --- a/src/bin/topola-egui/painter.rs +++ b/src/bin/topola-egui/painter.rs @@ -1,33 +1,32 @@ -use egui::{emath::RectTransform, epaint, Color32, Pos2, Stroke, Ui}; use geo::{CoordsIter, Point, Polygon}; -use topola::geometry::primitive::PrimitiveShape; +use topola::geometry::primitive::{PrimitiveShape, PrimitiveShapeTrait}; pub struct Painter<'a> { - ui: &'a mut Ui, - transform: RectTransform, + ui: &'a mut egui::Ui, + transform: egui::emath::RectTransform, } impl<'a> Painter<'a> { - pub fn new(ui: &'a mut Ui, transform: RectTransform) -> Self { + pub fn new(ui: &'a mut egui::Ui, transform: egui::emath::RectTransform) -> Self { Self { ui, transform } } - pub fn paint_shape(&mut self, shape: &PrimitiveShape, color: Color32) { + pub fn paint_shape(&mut self, shape: &PrimitiveShape, color: egui::epaint::Color32) { let epaint_shape = match shape { - PrimitiveShape::Dot(dot) => epaint::Shape::circle_filled( + 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::Seg(seg) => epaint::Shape::line_segment( + PrimitiveShape::Seg(seg) => egui::Shape::line_segment( [ self.transform .transform_pos([seg.from.x() as f32, -seg.from.y() as f32].into()), self.transform .transform_pos([seg.to.x() as f32, -seg.to.y() as f32].into()), ], - Stroke::new(seg.width as f32 * self.transform.scale().x, color), + egui::Stroke::new(seg.width as f32 * self.transform.scale().x, color), ), PrimitiveShape::Bend(bend) => { let delta_from = bend.from - bend.c.pos; @@ -35,7 +34,7 @@ impl<'a> Painter<'a> { let angle_from = delta_from.y().atan2(delta_from.x()); let angle_to = delta_to.y().atan2(delta_to.x()); - let mut points: Vec = vec![]; + let mut points: Vec = vec![]; let angle_step = (angle_to - angle_from) / 100.0; @@ -45,18 +44,29 @@ impl<'a> Painter<'a> { points.push(self.transform.transform_pos([x as f32, -y as f32].into())); } - epaint::Shape::line( + egui::Shape::line( points, - Stroke::new(bend.width as f32 * self.transform.scale().x, color), + egui::Stroke::new(bend.width as f32 * self.transform.scale().x, color), ) } }; self.ui.painter().add(epaint_shape); + + let envelope = PrimitiveShapeTrait::envelope(shape, 0.0); + let rect = egui::epaint::Rect { + min: [envelope.lower()[0] as f32, -envelope.upper()[1] as f32].into(), + max: [envelope.upper()[0] as f32, -envelope.lower()[1] as f32].into(), + }; + self.ui.painter().add(egui::Shape::rect_stroke( + self.transform.transform_rect(rect), + egui::Rounding::ZERO, + egui::Stroke::new(1.0, egui::Color32::GRAY), + )); } - pub fn paint_polygon(&mut self, polygon: &Polygon, color: Color32) { - self.ui.painter().add(epaint::Shape::convex_polygon( + pub fn paint_polygon(&mut self, polygon: &Polygon, color: egui::epaint::Color32) { + self.ui.painter().add(egui::Shape::convex_polygon( polygon .exterior_coords_iter() .map(|coords| { @@ -65,19 +75,19 @@ impl<'a> Painter<'a> { }) .collect(), color, - Stroke::default(), + egui::Stroke::default(), )); } - pub fn paint_edge(&mut self, from: Point, to: Point, color: Color32) { - self.ui.painter().add(epaint::Shape::line_segment( + pub fn paint_edge(&mut self, from: Point, to: Point, color: egui::epaint::Color32) { + self.ui.painter().add(egui::Shape::line_segment( [ self.transform .transform_pos([from.x() as f32, -from.y() as f32].into()), self.transform .transform_pos([to.x() as f32, -to.y() as f32].into()), ], - Stroke::new(1.0, color), + egui::Stroke::new(1.0, color), )); } } diff --git a/src/bin/topola-sdl2-demo/painter.rs b/src/bin/topola-sdl2-demo/painter.rs index 57372b7..e34a341 100644 --- a/src/bin/topola-sdl2-demo/painter.rs +++ b/src/bin/topola-sdl2-demo/painter.rs @@ -58,8 +58,8 @@ impl<'a> Painter<'a> { let envelope = PrimitiveShapeTrait::envelope(shape, 0.0); // XXX: points represented as arrays can't be conveniently converted to vector types - let topleft = vec2f(envelope.lower()[0] as f32, -envelope.lower()[1] as f32); - let bottomright = vec2f(envelope.upper()[0] as f32, -envelope.upper()[1] as f32); + let topleft = vec2f(envelope.lower()[0] as f32, -envelope.upper()[1] as f32); + let bottomright = vec2f(envelope.upper()[0] as f32, -envelope.lower()[1] as f32); self.canvas.set_line_width(2.0 / zoom); self.canvas .set_stroke_style(ColorU::new(100, 100, 100, 255));