mirror of https://codeberg.org/topola/topola.git
egui,autorouter,router: restore highlighting active navmesh edges
This commit is contained in:
parent
03f996721d
commit
47c888d21b
|
|
@ -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())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue