diff --git a/crates/topola-egui/src/actions.rs b/crates/topola-egui/src/actions.rs index 02326ac..2b46686 100644 --- a/crates/topola-egui/src/actions.rs +++ b/crates/topola-egui/src/actions.rs @@ -167,6 +167,7 @@ pub struct ViewActions { pub show_ratsnest: Switch, pub show_navmesh: Switch, pub show_guide_circles: Switch, + pub show_guide_bitangents: Switch, pub show_triangulation: Switch, pub show_triangulation_constraints: Switch, pub show_pathfinding_scores: Switch, @@ -184,6 +185,10 @@ impl ViewActions { show_navmesh: Action::new_keyless(tr.text("tr-menu-view-show-navmesh")).into_switch(), show_guide_circles: Action::new_keyless(tr.text("tr-menu-view-show-guide-circles")) .into_switch(), + show_guide_bitangents: Action::new_keyless( + tr.text("tr-menu-view-show-guide-bitangents"), + ) + .into_switch(), show_triangulation: Action::new_keyless(tr.text("tr-menu-view-show-triangulation")) .into_switch(), show_triangulation_constraints: Action::new_keyless( @@ -224,6 +229,8 @@ impl ViewActions { self.show_navmesh.checkbox(ui, &mut menu_bar.show_navmesh); self.show_guide_circles .checkbox(ui, &mut menu_bar.show_guide_circles); + self.show_guide_bitangents + .checkbox(ui, &mut menu_bar.show_guide_bitangents); self.show_triangulation .checkbox(ui, &mut menu_bar.show_triangulation); self.show_triangulation_constraints diff --git a/crates/topola-egui/src/displayer.rs b/crates/topola-egui/src/displayer.rs index cafc206..26452c7 100644 --- a/crates/topola-egui/src/displayer.rs +++ b/crates/topola-egui/src/displayer.rs @@ -4,12 +4,13 @@ use petgraph::{ data::DataMap, + graph::NodeIndex, visit::{EdgeRef, IntoEdgeReferences}, }; use rstar::AABB; use topola::{ autorouter::invoker::GetDebugOverlayData, - board::AccessMesadata, + board::{AccessMesadata, Board}, drawing::{ bend::BendIndex, dot::DotIndex, @@ -21,9 +22,10 @@ use topola::{ graph::MakeRef, interactor::{activity::ActivityStepper, interaction::InteractionStepper}, layout::poly::MakePolygon, - math::{Circle, RotationSense}, + math::{self, Circle, RotationSense}, router::{ - navmesh::{BinavnodeNodeIndex, NavnodeIndex}, + navcord::Navcord, + navmesh::{BinavnodeNodeIndex, Navmesh, NavnodeIndex}, ng::pie, prenavmesh::PrenavmeshConstraint, }, @@ -53,7 +55,7 @@ impl<'a> Displayer<'a> { self.display_ratsnest(); } - if menu_bar.show_navmesh || menu_bar.show_guide_circles { + if menu_bar.show_navmesh || menu_bar.show_guide_circles || menu_bar.show_guide_bitangents { self.display_navmesh_or_guides(menu_bar); } @@ -227,6 +229,27 @@ impl<'a> Displayer<'a> { self.painter.paint_line_segment(from, to, stroke); } + if menu_bar.show_guide_bitangents { + if let Some(navcord) = activity.maybe_navcord() { + if let (Some(from_circle), Some(to_circle)) = ( + Self::node_guide_circle(board, navmesh, navcord, edge.source().0), + Self::node_guide_circle(board, navmesh, navcord, edge.target().0), + ) { + if let Ok(tangents) = + math::tangent_segments(from_circle, None, to_circle, None) + { + for tangent in tangents { + self.painter.paint_line_segment( + tangent.start_point(), + tangent.end_point(), + egui::Stroke::new(1.0, egui::Color32::WHITE), + ) + } + } + } + } + } + if let Some(text) = activity.navedge_debug_text((edge.source(), edge.target())) { self.painter.paint_text( @@ -239,6 +262,20 @@ impl<'a> Displayer<'a> { } for index in navmesh.graph().node_indices() { + if menu_bar.show_guide_circles { + if let Some(navcord) = activity.maybe_navcord() { + if let Some(circle) = + Self::node_guide_circle(board, navmesh, navcord, index) + { + self.painter.paint_hollow_circle( + circle, + 1.0, + egui::epaint::Color32::WHITE, + ); + } + } + } + let navnode = NavnodeIndex(index); let primitive = PrimitiveIndex::from(navmesh.node_weight(navnode).unwrap().node); @@ -247,36 +284,6 @@ impl<'a> Displayer<'a> { .shape() .center(); - if menu_bar.show_guide_circles { - if let Some(navcord) = activity.maybe_navcord() { - if let Ok(dot) = DotIndex::try_from(primitive) { - let drawing = board.layout().drawing(); - - self.painter.paint_hollow_circle( - drawing.dot_circle( - dot, - navcord.width, - drawing.conditions(navcord.head.face().into()).as_ref(), - ), - 1.0, - egui::epaint::Color32::WHITE, - ); - } else if let Ok(bend) = BendIndex::try_from(primitive) { - let drawing = board.layout().drawing(); - - self.painter.paint_hollow_circle( - drawing.bend_circle( - bend, - navcord.width, - drawing.conditions(navcord.head.face().into()).as_ref(), - ), - 1.0, - egui::epaint::Color32::WHITE, - ); - } - } - } - pos += match navmesh.node_weight(navnode).unwrap().maybe_sense { Some(RotationSense::Counterclockwise) => [0.0, 150.0].into(), Some(RotationSense::Clockwise) => [-0.0, -150.0].into(), @@ -306,6 +313,33 @@ impl<'a> Displayer<'a> { } } + fn node_guide_circle( + board: &Board, + navmesh: &Navmesh, + navcord: &Navcord, + index: NodeIndex, + ) -> Option { + let drawing = board.layout().drawing(); + let navnode = NavnodeIndex(index); + let primitive = PrimitiveIndex::from(navmesh.node_weight(navnode).unwrap().node); + + if let Ok(dot) = DotIndex::try_from(primitive) { + Some(drawing.dot_circle( + dot, + navcord.width, + drawing.conditions(navcord.head.face().into()).as_ref(), + )) + } else if let Ok(bend) = BendIndex::try_from(primitive) { + Some(drawing.bend_circle( + bend, + navcord.width, + drawing.conditions(navcord.head.face().into()).as_ref(), + )) + } else { + None + } + } + fn display_triangulation(&mut self) { let board = self.workspace.interactor.invoker().autorouter().board(); diff --git a/crates/topola-egui/src/menu_bar.rs b/crates/topola-egui/src/menu_bar.rs index 11038db..b0727b0 100644 --- a/crates/topola-egui/src/menu_bar.rs +++ b/crates/topola-egui/src/menu_bar.rs @@ -30,6 +30,7 @@ pub struct MenuBar { pub show_ratsnest: bool, pub show_navmesh: bool, pub show_guide_circles: bool, + pub show_guide_bitangents: bool, pub show_triangulation: bool, pub show_triangulation_constraints: bool, pub show_pathfinding_scores: bool, @@ -56,6 +57,7 @@ impl MenuBar { show_ratsnest: true, show_navmesh: false, show_guide_circles: false, + show_guide_bitangents: false, show_triangulation: false, show_triangulation_constraints: false, show_pathfinding_scores: false, diff --git a/locales/en-US/main.ftl b/locales/en-US/main.ftl index e85e88d..321de37 100644 --- a/locales/en-US/main.ftl +++ b/locales/en-US/main.ftl @@ -23,6 +23,7 @@ tr-menu-view-zoom-to-fit = Zoom to Fit tr-menu-view-show-ratsnest = Show Ratsnest tr-menu-view-show-navmesh = Show Navmesh tr-menu-view-show-guide-circles = Show Guide-Circles +tr-menu-view-show-guide-bitangents = Show Guide-Bitangents tr-menu-view-show-triangulation = Show Triangulation tr-menu-view-show-triangulation-constraints = Show Triangulation Constraints tr-menu-view-show-pathfinding-scores = Show Pathfinding Scores