mirror of https://codeberg.org/topola/topola.git
egui: draw bounding boxes
This commit is contained in:
parent
2be8baab55
commit
682f179cad
|
|
@ -1,33 +1,32 @@
|
||||||
use egui::{emath::RectTransform, epaint, Color32, Pos2, Stroke, Ui};
|
|
||||||
use geo::{CoordsIter, Point, Polygon};
|
use geo::{CoordsIter, Point, Polygon};
|
||||||
use topola::geometry::primitive::PrimitiveShape;
|
use topola::geometry::primitive::{PrimitiveShape, PrimitiveShapeTrait};
|
||||||
|
|
||||||
pub struct Painter<'a> {
|
pub struct Painter<'a> {
|
||||||
ui: &'a mut Ui,
|
ui: &'a mut egui::Ui,
|
||||||
transform: RectTransform,
|
transform: egui::emath::RectTransform,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Painter<'a> {
|
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 }
|
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 {
|
let epaint_shape = match shape {
|
||||||
PrimitiveShape::Dot(dot) => epaint::Shape::circle_filled(
|
PrimitiveShape::Dot(dot) => egui::Shape::circle_filled(
|
||||||
self.transform
|
self.transform
|
||||||
.transform_pos([dot.c.pos.x() as f32, -dot.c.pos.y() as f32].into()),
|
.transform_pos([dot.c.pos.x() as f32, -dot.c.pos.y() as f32].into()),
|
||||||
dot.c.r as f32 * self.transform.scale().x,
|
dot.c.r as f32 * self.transform.scale().x,
|
||||||
color,
|
color,
|
||||||
),
|
),
|
||||||
PrimitiveShape::Seg(seg) => epaint::Shape::line_segment(
|
PrimitiveShape::Seg(seg) => egui::Shape::line_segment(
|
||||||
[
|
[
|
||||||
self.transform
|
self.transform
|
||||||
.transform_pos([seg.from.x() as f32, -seg.from.y() as f32].into()),
|
.transform_pos([seg.from.x() as f32, -seg.from.y() as f32].into()),
|
||||||
self.transform
|
self.transform
|
||||||
.transform_pos([seg.to.x() as f32, -seg.to.y() as f32].into()),
|
.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) => {
|
PrimitiveShape::Bend(bend) => {
|
||||||
let delta_from = bend.from - bend.c.pos;
|
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_from = delta_from.y().atan2(delta_from.x());
|
||||||
let angle_to = delta_to.y().atan2(delta_to.x());
|
let angle_to = delta_to.y().atan2(delta_to.x());
|
||||||
let mut points: Vec<Pos2> = vec![];
|
let mut points: Vec<egui::Pos2> = vec![];
|
||||||
|
|
||||||
let angle_step = (angle_to - angle_from) / 100.0;
|
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()));
|
points.push(self.transform.transform_pos([x as f32, -y as f32].into()));
|
||||||
}
|
}
|
||||||
|
|
||||||
epaint::Shape::line(
|
egui::Shape::line(
|
||||||
points,
|
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);
|
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) {
|
pub fn paint_polygon(&mut self, polygon: &Polygon, color: egui::epaint::Color32) {
|
||||||
self.ui.painter().add(epaint::Shape::convex_polygon(
|
self.ui.painter().add(egui::Shape::convex_polygon(
|
||||||
polygon
|
polygon
|
||||||
.exterior_coords_iter()
|
.exterior_coords_iter()
|
||||||
.map(|coords| {
|
.map(|coords| {
|
||||||
|
|
@ -65,19 +75,19 @@ impl<'a> Painter<'a> {
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
color,
|
color,
|
||||||
Stroke::default(),
|
egui::Stroke::default(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn paint_edge(&mut self, from: Point, to: Point, color: Color32) {
|
pub fn paint_edge(&mut self, from: Point, to: Point, color: egui::epaint::Color32) {
|
||||||
self.ui.painter().add(epaint::Shape::line_segment(
|
self.ui.painter().add(egui::Shape::line_segment(
|
||||||
[
|
[
|
||||||
self.transform
|
self.transform
|
||||||
.transform_pos([from.x() as f32, -from.y() as f32].into()),
|
.transform_pos([from.x() as f32, -from.y() as f32].into()),
|
||||||
self.transform
|
self.transform
|
||||||
.transform_pos([to.x() as f32, -to.y() as f32].into()),
|
.transform_pos([to.x() as f32, -to.y() as f32].into()),
|
||||||
],
|
],
|
||||||
Stroke::new(1.0, color),
|
egui::Stroke::new(1.0, color),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,8 +58,8 @@ impl<'a> Painter<'a> {
|
||||||
|
|
||||||
let envelope = PrimitiveShapeTrait::envelope(shape, 0.0);
|
let envelope = PrimitiveShapeTrait::envelope(shape, 0.0);
|
||||||
// XXX: points represented as arrays can't be conveniently converted to vector types
|
// 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 topleft = vec2f(envelope.lower()[0] as f32, -envelope.upper()[1] as f32);
|
||||||
let bottomright = vec2f(envelope.upper()[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_line_width(2.0 / zoom);
|
||||||
self.canvas
|
self.canvas
|
||||||
.set_stroke_style(ColorU::new(100, 100, 100, 255));
|
.set_stroke_style(ColorU::new(100, 100, 100, 255));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue