From 95faf9603059ba74dc03591ad296ebe0edf34422 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Fri, 22 Dec 2023 22:46:07 +0000 Subject: [PATCH] router: handle tracer results Pass the result of tracer probing step to the `.on_probe()` observer method. Unwrap the result of `.rework_path()`, as it should never fail as the previous probe step should have ensured that this step is admissible. --- src/main.rs | 20 +++++++++++++++++--- src/router.rs | 29 ++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1693ccb..a077bab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,8 +24,9 @@ mod shape; mod tracer; mod triangulation; +use draw::DrawException; use geo::point; -use graph::{FixedDotIndex, FixedSegWeight, LooseDotIndex, MakePrimitive}; +use graph::{FixedDotIndex, FixedSegWeight, Index, LooseDotIndex, MakePrimitive}; use layout::Layout; use mesh::{Mesh, MeshEdgeReference, VertexIndex}; use petgraph::visit::{EdgeRef, IntoEdgeReferences}; @@ -68,7 +69,14 @@ struct EmptyRouterObserver; impl RouterObserver for EmptyRouterObserver { fn on_rework(&mut self, tracer: &Tracer, trace: &Trace) {} fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference) {} - fn on_probe(&mut self, tracer: &Tracer, trace: &Trace, _edge: MeshEdgeReference) {} + fn on_probe( + &mut self, + tracer: &Tracer, + trace: &Trace, + _edge: MeshEdgeReference, + result: Result<(), DrawException>, + ) { + } fn on_estimate(&mut self, _tracer: &Tracer, _vertex: VertexIndex) {} } @@ -128,7 +136,13 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> { ); } - fn on_probe(&mut self, tracer: &Tracer, trace: &Trace, _edge: MeshEdgeReference) { + fn on_probe( + &mut self, + tracer: &Tracer, + trace: &Trace, + _edge: MeshEdgeReference, + result: Result<(), DrawException>, + ) { render_times( self.event_pump, self.window, diff --git a/src/router.rs b/src/router.rs index 5927990..f8c6e3b 100644 --- a/src/router.rs +++ b/src/router.rs @@ -3,6 +3,7 @@ use petgraph::visit::EdgeRef; use spade::InsertionError; use crate::astar::{astar, AstarStrategy, PathTracker}; +use crate::draw::DrawException; use crate::graph::FixedDotIndex; use crate::layout::Layout; @@ -14,7 +15,13 @@ use crate::tracer::{Trace, Tracer}; pub trait RouterObserver { fn on_rework(&mut self, tracer: &Tracer, trace: &Trace); fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference); - fn on_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference); + fn on_probe( + &mut self, + tracer: &Tracer, + trace: &Trace, + edge: MeshEdgeReference, + result: Result<(), DrawException>, + ); fn on_estimate(&mut self, tracer: &Tracer, vertex: VertexIndex); } @@ -45,7 +52,9 @@ impl<'a, RO: RouterObserver> AstarStrategy<&Mesh, u64> for RouterAstarStrategy<' fn is_goal(&mut self, vertex: VertexIndex, tracker: &PathTracker<&Mesh>) -> bool { let new_path = tracker.reconstruct_path_to(vertex); - self.tracer.rework_path(&mut self.trace, &new_path, 5.0); + self.tracer + .rework_path(&mut self.trace, &new_path, 5.0) + .unwrap(); self.observer.on_rework(&self.tracer, &self.trace); self.tracer.finish(&mut self.trace, self.to, 5.0).is_ok() @@ -53,13 +62,15 @@ impl<'a, RO: RouterObserver> AstarStrategy<&Mesh, u64> for RouterAstarStrategy<' fn edge_cost(&mut self, edge: MeshEdgeReference) -> Option { self.observer.before_probe(&self.tracer, &self.trace, edge); - if edge.target() != self.to.into() - && self - .tracer - .step(&mut self.trace, edge.target(), 5.0) - .is_ok() - { - self.observer.on_probe(&self.tracer, &self.trace, edge); + if edge.target() == self.to.into() { + return None; + } + + let result = self.tracer.step(&mut self.trace, edge.target(), 5.0); + self.observer + .on_probe(&self.tracer, &self.trace, edge, result); + + if result.is_ok() { self.tracer.undo_step(&mut self.trace); Some(1) } else {