diff --git a/src/band.rs b/src/band.rs index 9ec4279..39282dd 100644 --- a/src/band.rs +++ b/src/band.rs @@ -4,7 +4,7 @@ use crate::{ graph::GetNodeIndex, layout::Layout, loose::{GetNextLoose, LooseIndex}, - primitive::GetEnds, + primitive::{GetEnds, GetOtherEnd}, }; pub struct Band<'a> { @@ -46,14 +46,18 @@ impl<'a> Band<'a> { maybe_loose = self.layout.loose(loose).next_loose(prev_prev); } - if let Some(LooseIndex::SeqSeg(seg)) = maybe_loose { - if let DotIndex::Fixed(dot) = self.layout.primitive(seg).ends().0 { - Some(dot) - } else { - unreachable!() + match prev { + Some(LooseIndex::LoneSeg(seg)) => { + Some(self.layout.primitive(seg).other_end(self.from())) } - } else { - None + Some(LooseIndex::SeqSeg(seg)) => { + if let DotIndex::Fixed(dot) = self.layout.primitive(seg).ends().0 { + Some(dot) + } else { + None + } + } + _ => unreachable!(), } } } diff --git a/src/layout.rs b/src/layout.rs index b61071c..7e2d136 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -92,8 +92,9 @@ impl Layout { LooseIndex::Dot(dot) => { dots.push(dot); } - LooseIndex::LoneSeg(..) => { - unreachable!(); + LooseIndex::LoneSeg(seg) => { + self.remove(seg.into()); + break; } LooseIndex::SeqSeg(seg) => { segs.push(seg); diff --git a/src/main.rs b/src/main.rs index af3d746..9bcc410 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,6 +28,7 @@ mod tracer; mod triangulation; mod wraparoundable; +use connectivity::BandIndex; use draw::DrawException; use geo::point; use geometry::{FixedDotIndex, FixedSegWeight, GeometryIndex, LooseDotIndex, MakePrimitive}; @@ -116,7 +117,6 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> { self.font_context, RouterOrLayout::Layout(tracer.layout), None, - None, Some(tracer.mesh.clone()), &trace.path, &[], @@ -135,7 +135,6 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> { self.font_context, RouterOrLayout::Layout(tracer.layout), None, - None, Some(tracer.mesh.clone()), &path, &[], @@ -167,7 +166,6 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> { self.font_context, RouterOrLayout::Layout(tracer.layout), None, - None, Some(tracer.mesh.clone()), &trace.path, &ghosts, @@ -510,7 +508,6 @@ fn main() -> Result<(), anyhow::Error> { RouterOrLayout::Layout(&router.layout), None, None, - None, &[], &[], &[], @@ -543,7 +540,6 @@ fn main() -> Result<(), anyhow::Error> { RouterOrLayout::Layout(&router.layout), None, None, - None, &[], &[], &[], @@ -565,7 +561,6 @@ fn main() -> Result<(), anyhow::Error> { RouterOrLayout::Layout(&router.layout), None, None, - None, &[], &[], &[], @@ -582,6 +577,33 @@ fn main() -> Result<(), anyhow::Error> { RouterOrLayout::Layout(&router.layout), None, None, + &[], + &[], + &[], + -1, + ); + + render_times( + &mut event_pump, + &window, + &mut renderer, + &font_context, + RouterOrLayout::Router(&mut router), + Some(band2), + None, + &[], + &[], + &[], + -1, + ); + + render_times( + &mut event_pump, + &window, + &mut renderer, + &font_context, + RouterOrLayout::Layout(&router.layout), + None, None, &[], &[], @@ -598,9 +620,8 @@ fn render_times( renderer: &mut Renderer, font_context: &CanvasFontContext, mut router_or_layout: RouterOrLayout, - from: Option, - follower: Option, - mut mesh: Option, + maybe_band: Option, + mut maybe_mesh: Option, path: &[VertexIndex], ghosts: &[Shape], highlighteds: &[GeometryIndex], @@ -628,27 +649,22 @@ fn render_times( let layout = match router_or_layout { RouterOrLayout::Router(ref mut router) => { - if let Some(follower) = follower { - let state = event_pump.mouse_state(); + let state = event_pump.mouse_state(); - if let Some(from) = from { - mesh = router - .reroute( - from, - point! {x: state.x() as f64, y: state.y() as f64}, - &mut DebugRouterObserver::new( - event_pump, - window, - renderer, - font_context, - ), - ) - .ok(); - } else { - let _ = router - .layout - .move_dot(follower.into(), (state.x() as f64, state.y() as f64).into()); - } + if let Some(band) = maybe_band { + router + .reroute_band( + band, + point! {x: state.x() as f64, y: state.y() as f64}, + &mut DebugRouterObserver::new( + event_pump, + window, + renderer, + font_context, + ), + ) + .ok(); + maybe_mesh = None; } &router.layout @@ -672,7 +688,7 @@ fn render_times( render_shape(&mut canvas, &ghost, ColorU::new(75, 75, 150, 255)); } - if let Some(ref mesh) = mesh { + if let Some(ref mesh) = maybe_mesh { for edge in mesh.edge_references() { let start_point = edge.source().primitive(layout).shape().center(); let end_point = edge.target().primitive(layout).shape().center(); diff --git a/src/router.rs b/src/router.rs index 7cec5d2..c527e98 100644 --- a/src/router.rs +++ b/src/router.rs @@ -4,12 +4,13 @@ use spade::InsertionError; use thiserror::Error; use crate::astar::{astar, AstarStrategy, PathTracker}; -use crate::connectivity::BandIndex; +use crate::connectivity::{BandIndex, GetNet}; use crate::draw::DrawException; -use crate::geometry::FixedDotIndex; +use crate::geometry::{FixedDotIndex, FixedDotWeight}; use crate::guide::HeadTrait; use crate::layout::Layout; +use crate::math::Circle; use crate::mesh::{Mesh, MeshEdgeReference, VertexIndex}; use crate::rules::Rules; @@ -147,13 +148,17 @@ impl Router { Ok(band) } - pub fn reroute( + pub fn reroute_band( &mut self, - _from: FixedDotIndex, - _to: Point, - _observer: &mut impl RouterObserver, - ) -> Result { - Ok(Mesh::new(&self.layout)) + band: BandIndex, + to: Point, + observer: &mut impl RouterObserver, + ) -> Result { + let from_dot = self.layout.band(band).from(); + let to_dot = self.layout.band(band).to().unwrap(); + self.layout.remove_band(band); + self.layout.move_dot(to_dot.into(), to).unwrap(); // TODO: Remove `.unwrap()`. + self.route_band(from_dot, to_dot, observer) } pub fn tracer<'a>(&'a mut self, mesh: &'a Mesh) -> Tracer {