mirror of https://codeberg.org/topola/topola.git
fix(router/navmesh): Make sure all clearance-intersecting navnodes have the same edges
This does not yet fully fix the problem with routing around SMD pads failing, but is a step forward.
This commit is contained in:
parent
41438eeccc
commit
0f4bf1b0be
|
|
@ -161,7 +161,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
.filter(move |infringement| !self.are_connectable(infringer, infringement.1))
|
.filter(move |infringement| !self.are_connectable(infringer, infringement.1))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn clearance_intersectors<'a>(
|
pub fn clearance_intersectors<'a>(
|
||||||
&'a self,
|
&'a self,
|
||||||
intersector: PrimitiveIndex,
|
intersector: PrimitiveIndex,
|
||||||
) -> impl Iterator<Item = Infringement> + 'a {
|
) -> impl Iterator<Item = Infringement> + 'a {
|
||||||
|
|
|
||||||
|
|
@ -66,8 +66,8 @@ pub enum BinavnodeNodeIndex {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<PrenavmeshNodeIndex> for BinavnodeNodeIndex {
|
impl From<PrenavmeshNodeIndex> for BinavnodeNodeIndex {
|
||||||
fn from(trianvertex: PrenavmeshNodeIndex) -> Self {
|
fn from(node: PrenavmeshNodeIndex) -> Self {
|
||||||
match trianvertex {
|
match node {
|
||||||
PrenavmeshNodeIndex::FixedDot(dot) => BinavnodeNodeIndex::FixedDot(dot),
|
PrenavmeshNodeIndex::FixedDot(dot) => BinavnodeNodeIndex::FixedDot(dot),
|
||||||
PrenavmeshNodeIndex::FixedBend(bend) => BinavnodeNodeIndex::FixedBend(bend),
|
PrenavmeshNodeIndex::FixedBend(bend) => BinavnodeNodeIndex::FixedBend(bend),
|
||||||
}
|
}
|
||||||
|
|
@ -75,8 +75,8 @@ impl From<PrenavmeshNodeIndex> for BinavnodeNodeIndex {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<BinavnodeNodeIndex> for PrimitiveIndex {
|
impl From<BinavnodeNodeIndex> for PrimitiveIndex {
|
||||||
fn from(vertex: BinavnodeNodeIndex) -> Self {
|
fn from(node: BinavnodeNodeIndex) -> Self {
|
||||||
match vertex {
|
match node {
|
||||||
BinavnodeNodeIndex::FixedDot(dot) => PrimitiveIndex::FixedDot(dot),
|
BinavnodeNodeIndex::FixedDot(dot) => PrimitiveIndex::FixedDot(dot),
|
||||||
BinavnodeNodeIndex::FixedBend(bend) => PrimitiveIndex::FixedBend(bend),
|
BinavnodeNodeIndex::FixedBend(bend) => PrimitiveIndex::FixedBend(bend),
|
||||||
BinavnodeNodeIndex::LooseBend(bend) => PrimitiveIndex::LooseBend(bend),
|
BinavnodeNodeIndex::LooseBend(bend) => PrimitiveIndex::LooseBend(bend),
|
||||||
|
|
@ -85,8 +85,8 @@ impl From<BinavnodeNodeIndex> for PrimitiveIndex {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<BinavnodeNodeIndex> for GearIndex {
|
impl From<BinavnodeNodeIndex> for GearIndex {
|
||||||
fn from(vertex: BinavnodeNodeIndex) -> Self {
|
fn from(node: BinavnodeNodeIndex) -> Self {
|
||||||
match vertex {
|
match node {
|
||||||
BinavnodeNodeIndex::FixedDot(dot) => GearIndex::FixedDot(dot),
|
BinavnodeNodeIndex::FixedDot(dot) => GearIndex::FixedDot(dot),
|
||||||
BinavnodeNodeIndex::FixedBend(bend) => GearIndex::FixedBend(bend),
|
BinavnodeNodeIndex::FixedBend(bend) => GearIndex::FixedBend(bend),
|
||||||
BinavnodeNodeIndex::LooseBend(bend) => GearIndex::LooseBend(bend),
|
BinavnodeNodeIndex::LooseBend(bend) => GearIndex::LooseBend(bend),
|
||||||
|
|
@ -241,6 +241,39 @@ impl Navmesh {
|
||||||
edge.source(),
|
edge.source(),
|
||||||
edge.target(),
|
edge.target(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// TODO: This shouldn't depend on clearance.
|
||||||
|
for source_intersector in layout
|
||||||
|
.drawing()
|
||||||
|
.clearance_intersectors(edge.source().into())
|
||||||
|
{
|
||||||
|
let source = match source_intersector.1 {
|
||||||
|
PrimitiveIndex::FixedDot(dot) => PrenavmeshNodeIndex::FixedDot(dot),
|
||||||
|
PrimitiveIndex::FixedBend(bend) => PrenavmeshNodeIndex::FixedBend(bend),
|
||||||
|
_ => continue,
|
||||||
|
};
|
||||||
|
|
||||||
|
if !map.contains_key(&source) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for target_intersector in layout
|
||||||
|
.drawing()
|
||||||
|
.clearance_intersectors(edge.target().into())
|
||||||
|
{
|
||||||
|
let target = match target_intersector.1 {
|
||||||
|
PrimitiveIndex::FixedDot(dot) => PrenavmeshNodeIndex::FixedDot(dot),
|
||||||
|
PrimitiveIndex::FixedBend(bend) => PrenavmeshNodeIndex::FixedBend(bend),
|
||||||
|
_ => continue,
|
||||||
|
};
|
||||||
|
|
||||||
|
if !map.contains_key(&target) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Self::add_trianedge_to_graph_as_quadrinavedge(&mut graph, &map, source, target);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The existence of a constraint edge does not (!) guarantee that this
|
// The existence of a constraint edge does not (!) guarantee that this
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,15 @@ pub enum PrenavmeshNodeIndex {
|
||||||
FixedBend(FixedBendIndex),
|
FixedBend(FixedBendIndex),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<PrenavmeshNodeIndex> for PrimitiveIndex {
|
||||||
|
fn from(node: PrenavmeshNodeIndex) -> Self {
|
||||||
|
match node {
|
||||||
|
PrenavmeshNodeIndex::FixedDot(dot) => PrimitiveIndex::FixedDot(dot),
|
||||||
|
PrenavmeshNodeIndex::FixedBend(bend) => PrimitiveIndex::FixedBend(bend),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
pub struct PrenavmeshWeight {
|
pub struct PrenavmeshWeight {
|
||||||
pub node: PrenavmeshNodeIndex,
|
pub node: PrenavmeshNodeIndex,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue