egui,autorouter,router: restore highlighting active navmesh edges

This commit is contained in:
Mikolaj Wielgus 2024-07-01 18:56:41 +02:00
parent 03f996721d
commit 47c888d21b
6 changed files with 82 additions and 42 deletions

View File

@ -1,9 +1,12 @@
use petgraph::graph::EdgeIndex; use petgraph::graph::EdgeIndex;
use crate::{ use crate::{
autorouter::{invoker::GetMaybeNavmesh, Autorouter, AutorouterError, AutorouterStatus}, autorouter::{
invoker::{GetMaybeNavmesh, GetMaybeTrace},
Autorouter, AutorouterError, AutorouterStatus,
},
board::mesadata::MesadataTrait, board::mesadata::MesadataTrait,
router::{navmesh::Navmesh, route::Route, Router, RouterStatus}, router::{navmesh::Navmesh, route::Route, trace::Trace, Router, RouterStatus},
}; };
pub struct Autoroute { pub struct Autoroute {
@ -84,6 +87,10 @@ impl Autoroute {
pub fn navmesh(&self) -> Option<&Navmesh> { pub fn navmesh(&self) -> Option<&Navmesh> {
self.route.as_ref().map(|route| route.navmesh()) self.route.as_ref().map(|route| route.navmesh())
} }
pub fn trace(&self) -> Option<&Trace> {
self.route.as_ref().map(|route| route.trace())
}
} }
impl GetMaybeNavmesh for Autoroute { impl GetMaybeNavmesh for Autoroute {
@ -91,3 +98,9 @@ impl GetMaybeNavmesh for Autoroute {
self.route.as_ref().map(|route| route.navmesh()) self.route.as_ref().map(|route| route.navmesh())
} }
} }
impl GetMaybeTrace for Autoroute {
fn maybe_trace(&self) -> Option<&Trace> {
self.route.as_ref().map(|route| route.trace())
}
}

View File

@ -13,7 +13,7 @@ use crate::{
}, },
board::mesadata::MesadataTrait, board::mesadata::MesadataTrait,
layout::via::ViaWeight, layout::via::ViaWeight,
router::navmesh::Navmesh, router::{navmesh::Navmesh, trace::Trace},
}; };
#[enum_dispatch] #[enum_dispatch]
@ -21,6 +21,11 @@ pub trait GetMaybeNavmesh {
fn maybe_navmesh(&self) -> Option<&Navmesh>; fn maybe_navmesh(&self) -> Option<&Navmesh>;
} }
#[enum_dispatch]
pub trait GetMaybeTrace {
fn maybe_trace(&self) -> Option<&Trace>;
}
#[derive(Error, Debug, Clone)] #[derive(Error, Debug, Clone)]
pub enum InvokerError { pub enum InvokerError {
#[error(transparent)] #[error(transparent)]
@ -41,7 +46,7 @@ pub enum Command {
PlaceVia(ViaWeight), PlaceVia(ViaWeight),
} }
#[enum_dispatch(GetMaybeNavmesh)] #[enum_dispatch(GetMaybeNavmesh, GetMaybeTrace)]
pub enum Execute { pub enum Execute {
Autoroute(Autoroute), Autoroute(Autoroute),
PlaceVia(PlaceVia), PlaceVia(PlaceVia),
@ -118,6 +123,12 @@ impl GetMaybeNavmesh for ExecuteWithStatus {
} }
} }
impl GetMaybeTrace for ExecuteWithStatus {
fn maybe_trace(&self) -> Option<&Trace> {
self.execute.maybe_trace()
}
}
pub struct Invoker<M: MesadataTrait> { pub struct Invoker<M: MesadataTrait> {
autorouter: Autorouter<M>, autorouter: Autorouter<M>,
history: History, history: History,

View File

@ -1,8 +1,11 @@
use crate::{ use crate::{
autorouter::{invoker::GetMaybeNavmesh, Autorouter, AutorouterError}, autorouter::{
invoker::{GetMaybeNavmesh, GetMaybeTrace},
Autorouter, AutorouterError,
},
board::mesadata::MesadataTrait, board::mesadata::MesadataTrait,
layout::via::ViaWeight, layout::via::ViaWeight,
router::navmesh::Navmesh, router::{navmesh::Navmesh, trace::Trace},
}; };
#[derive(Debug)] #[derive(Debug)]
@ -28,3 +31,9 @@ impl GetMaybeNavmesh for PlaceVia {
None None
} }
} }
impl GetMaybeTrace for PlaceVia {
fn maybe_trace(&self) -> Option<&Trace> {
None
}
}

View File

@ -1,7 +1,10 @@
use geo::point; use geo::point;
use petgraph::visit::{EdgeRef, IntoEdgeReferences}; use petgraph::{
data::DataMap,
visit::{EdgeRef, IntoEdgeReferences},
};
use topola::{ use topola::{
autorouter::invoker::{Command, ExecuteWithStatus, GetMaybeNavmesh, Invoker}, autorouter::invoker::{Command, ExecuteWithStatus, GetMaybeNavmesh, GetMaybeTrace, Invoker},
board::mesadata::MesadataTrait, board::mesadata::MesadataTrait,
drawing::{ drawing::{
graph::{MakePrimitive, PrimitiveIndex}, graph::{MakePrimitive, PrimitiveIndex},
@ -154,26 +157,26 @@ impl Viewport {
if top.show_navmesh { if top.show_navmesh {
if let Some(execute) = maybe_execute { if let Some(execute) = maybe_execute {
if let Some(navmesh) = execute.maybe_navmesh() { if let Some(navmesh) = execute.maybe_navmesh() {
for edge in navmesh.graph().edge_references() { for edge in navmesh.edge_references() {
let from = PrimitiveIndex::from(navmesh.graph().node_weight(edge.source()).unwrap().node) let from = PrimitiveIndex::from(navmesh.node_weight(edge.source()).unwrap().node)
.primitive(board.layout().drawing()) .primitive(board.layout().drawing())
.shape() .shape()
.center(); .center();
let to = PrimitiveIndex::from(navmesh.graph().node_weight(edge.target()).unwrap().node) let to = PrimitiveIndex::from(navmesh.node_weight(edge.target()).unwrap().node)
.primitive(board.layout().drawing()) .primitive(board.layout().drawing())
.shape() .shape()
.center(); .center();
let stroke = 'blk: { let stroke = 'blk: {
/*if let (Some(source_pos), Some(target_pos)) = ( if let (Some(source_pos), Some(target_pos)) = (
shared_data execute.maybe_trace().map(|trace|
.path trace.path
.iter() .iter()
.position(|node| *node == navmesh.graph().node_weight(edge.source()).unwrap().node), .position(|node| *node == edge.source())).flatten(),
shared_data execute.maybe_trace().map(|trace|
.path trace.path
.iter() .iter()
.position(|node| *node == navmesh.graph().node_weight(edge.target()).unwrap().node), .position(|node| *node == edge.target())).flatten(),
) { ) {
if target_pos == source_pos + 1 if target_pos == source_pos + 1
|| source_pos == target_pos + 1 || source_pos == target_pos + 1
@ -183,7 +186,7 @@ impl Viewport {
egui::Color32::from_rgb(250, 250, 0), egui::Color32::from_rgb(250, 250, 0),
); );
} }
}*/ }
egui::Stroke::new(1.0, egui::Color32::from_rgb(125, 125, 125)) egui::Stroke::new(1.0, egui::Color32::from_rgb(125, 125, 125))
}; };
@ -200,17 +203,17 @@ impl Viewport {
if let Some(execute) = maybe_execute { if let Some(execute) = maybe_execute {
if let Some(navmesh) = execute.maybe_navmesh() { if let Some(navmesh) = execute.maybe_navmesh() {
if let (from, to) = (navmesh.source(), navmesh.target()) { if let (origin, destination) = (navmesh.origin(), navmesh.destination()) {
painter.paint_dot( painter.paint_dot(
Circle { Circle {
pos: board.layout().drawing().primitive(from).shape().center(), pos: board.layout().drawing().primitive(origin).shape().center(),
r: 60.0, r: 60.0,
}, },
egui::Color32::from_rgb(255, 255, 100), egui::Color32::from_rgb(255, 255, 100),
); );
painter.paint_dot( painter.paint_dot(
Circle { Circle {
pos: board.layout().drawing().primitive(to).shape().center(), pos: board.layout().drawing().primitive(destination).shape().center(),
r: 60.0, r: 60.0,
}, },
egui::Color32::from_rgb(255, 255, 100), egui::Color32::from_rgb(255, 255, 100),

View File

@ -106,10 +106,10 @@ pub enum NavmeshError {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Navmesh { pub struct Navmesh {
graph: UnGraph<NavvertexWeight, (), usize>, graph: UnGraph<NavvertexWeight, (), usize>,
source: FixedDotIndex, origin: FixedDotIndex,
source_navvertex: NavvertexIndex, origin_navvertex: NavvertexIndex,
target: FixedDotIndex, destination: FixedDotIndex,
target_navvertex: NavvertexIndex, destination_navvertex: NavvertexIndex,
} }
impl Navmesh { impl Navmesh {
@ -204,10 +204,10 @@ impl Navmesh {
Ok(Self { Ok(Self {
graph, graph,
source, origin: source,
source_navvertex: NavvertexIndex(source_navvertex.unwrap()), origin_navvertex: NavvertexIndex(source_navvertex.unwrap()),
target, destination: target,
target_navvertex: NavvertexIndex(target_navvertex.unwrap()), destination_navvertex: NavvertexIndex(target_navvertex.unwrap()),
}) })
} }
@ -215,20 +215,20 @@ impl Navmesh {
&self.graph &self.graph
} }
pub fn source(&self) -> FixedDotIndex { pub fn origin(&self) -> FixedDotIndex {
self.source self.origin
} }
pub fn source_navvertex(&self) -> NavvertexIndex { pub fn origin_navvertex(&self) -> NavvertexIndex {
self.source_navvertex self.origin_navvertex
} }
pub fn target(&self) -> FixedDotIndex { pub fn destination(&self) -> FixedDotIndex {
self.target self.destination
} }
pub fn target_navvertex(&self) -> NavvertexIndex { pub fn destination_navvertex(&self) -> NavvertexIndex {
self.target_navvertex self.destination_navvertex
} }
} }

View File

@ -53,9 +53,9 @@ impl Route {
navmesh: Navmesh, navmesh: Navmesh,
width: f64, width: f64,
) -> Self { ) -> Self {
let source = navmesh.source(); let source = navmesh.origin();
let source_navvertex = navmesh.source_navvertex(); let source_navvertex = navmesh.origin_navvertex();
let target = navmesh.target(); let target = navmesh.destination();
let mut tracer = Tracer::new(router.layout_mut()); let mut tracer = Tracer::new(router.layout_mut());
let mut trace = tracer.start(source, source_navvertex, width); let mut trace = tracer.start(source, source_navvertex, width);
@ -71,7 +71,7 @@ impl Route {
router: &mut Router<impl RulesTrait>, router: &mut Router<impl RulesTrait>,
) -> Result<RouterStatus, RouterError> { ) -> Result<RouterStatus, RouterError> {
let tracer = Tracer::new(router.layout_mut()); let tracer = Tracer::new(router.layout_mut());
let target = self.astar.graph.target(); let target = self.astar.graph.destination();
let mut strategy = RouterAstarStrategy::new(tracer, &mut self.trace, target); let mut strategy = RouterAstarStrategy::new(tracer, &mut self.trace, target);
match self.astar.step(&mut strategy)? { match self.astar.step(&mut strategy)? {
@ -83,4 +83,8 @@ impl Route {
pub fn navmesh(&self) -> &Navmesh { pub fn navmesh(&self) -> &Navmesh {
&self.astar.graph &self.astar.graph
} }
pub fn trace(&self) -> &Trace {
&self.trace
}
} }