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 tracer;
|
||||||
mod triangulation;
|
mod triangulation;
|
||||||
|
|
||||||
|
use draw::DrawException;
|
||||||
use geo::point;
|
use geo::point;
|
||||||
use graph::{FixedDotIndex, FixedSegWeight, LooseDotIndex, MakePrimitive};
|
use graph::{FixedDotIndex, FixedSegWeight, Index, LooseDotIndex, MakePrimitive};
|
||||||
use layout::Layout;
|
use layout::Layout;
|
||||||
use mesh::{Mesh, MeshEdgeReference, VertexIndex};
|
use mesh::{Mesh, MeshEdgeReference, VertexIndex};
|
||||||
use petgraph::visit::{EdgeRef, IntoEdgeReferences};
|
use petgraph::visit::{EdgeRef, IntoEdgeReferences};
|
||||||
|
|
@ -68,7 +69,14 @@ struct EmptyRouterObserver;
|
||||||
impl RouterObserver for EmptyRouterObserver {
|
impl RouterObserver for EmptyRouterObserver {
|
||||||
fn on_rework(&mut self, tracer: &Tracer, trace: &Trace) {}
|
fn on_rework(&mut self, tracer: &Tracer, trace: &Trace) {}
|
||||||
fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference) {}
|
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) {}
|
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(
|
render_times(
|
||||||
self.event_pump,
|
self.event_pump,
|
||||||
self.window,
|
self.window,
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ use petgraph::visit::EdgeRef;
|
||||||
use spade::InsertionError;
|
use spade::InsertionError;
|
||||||
|
|
||||||
use crate::astar::{astar, AstarStrategy, PathTracker};
|
use crate::astar::{astar, AstarStrategy, PathTracker};
|
||||||
|
use crate::draw::DrawException;
|
||||||
use crate::graph::FixedDotIndex;
|
use crate::graph::FixedDotIndex;
|
||||||
use crate::layout::Layout;
|
use crate::layout::Layout;
|
||||||
|
|
||||||
|
|
@ -14,7 +15,13 @@ use crate::tracer::{Trace, Tracer};
|
||||||
pub trait RouterObserver {
|
pub trait RouterObserver {
|
||||||
fn on_rework(&mut self, tracer: &Tracer, trace: &Trace);
|
fn on_rework(&mut self, tracer: &Tracer, trace: &Trace);
|
||||||
fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference);
|
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);
|
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 {
|
fn is_goal(&mut self, vertex: VertexIndex, tracker: &PathTracker<&Mesh>) -> bool {
|
||||||
let new_path = tracker.reconstruct_path_to(vertex);
|
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.observer.on_rework(&self.tracer, &self.trace);
|
||||||
|
|
||||||
self.tracer.finish(&mut self.trace, self.to, 5.0).is_ok()
|
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> {
|
fn edge_cost(&mut self, edge: MeshEdgeReference) -> Option<u64> {
|
||||||
self.observer.before_probe(&self.tracer, &self.trace, edge);
|
self.observer.before_probe(&self.tracer, &self.trace, edge);
|
||||||
if edge.target() != self.to.into()
|
if edge.target() == self.to.into() {
|
||||||
&& self
|
return None;
|
||||||
.tracer
|
}
|
||||||
.step(&mut self.trace, edge.target(), 5.0)
|
|
||||||
.is_ok()
|
let result = self.tracer.step(&mut self.trace, edge.target(), 5.0);
|
||||||
{
|
self.observer
|
||||||
self.observer.on_probe(&self.tracer, &self.trace, edge);
|
.on_probe(&self.tracer, &self.trace, edge, result);
|
||||||
|
|
||||||
|
if result.is_ok() {
|
||||||
self.tracer.undo_step(&mut self.trace);
|
self.tracer.undo_step(&mut self.trace);
|
||||||
Some(1)
|
Some(1)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue