mirror of https://codeberg.org/topola/topola.git
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.
This commit is contained in:
parent
b24578ff35
commit
95faf96030
20
src/main.rs
20
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,
|
||||
|
|
|
|||
|
|
@ -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<u64> {
|
||||
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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue