perf: AABB snap pre-rejection via acadrust bounding_box() (Option K upgrade)

Add `aabb: [f32; 4]` field to WireModel (world-space 2-D bounding box).
In tessellate_entity() set each wire's AABB from e.as_entity().bounding_box()
via new entity_aabb() helper; Insert sub-entities each get their own AABB.
Preview/interim wires and any entity returning a zero-extent default box get
UNBOUNDED_AABB so they are never pre-rejected.

Replace the chord-sphere heuristic in Snapper::wire_in_range() with a proper
AABB vs snap-circle overlap test.  The new check is four scalar comparisons and
correctly handles closed curves (circles, arcs) which the chord-sphere approach
had to special-case.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-04-26 12:21:51 +03:00
commit bfd8d0411a
35 changed files with 107 additions and 25 deletions

View file

@ -101,6 +101,7 @@ impl CadCommand for AlignedDimensionCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}
@ -134,5 +135,6 @@ fn preview_aligned(p1: Vec3, p2: Vec3, dim_pt: Vec3) -> WireModel {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
}
}

View file

@ -124,6 +124,7 @@ fn preview_wire(points: Vec<Vec3>) -> WireModel {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
}
}

View file

@ -100,5 +100,6 @@ fn preview_line(a: Vec3, b: Vec3) -> WireModel {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
}
}

View file

@ -142,6 +142,7 @@ impl CadCommand for DimBaselineCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -139,6 +139,7 @@ impl CadCommand for DimContinueCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -93,6 +93,7 @@ impl CadCommand for DimJogLineCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -101,6 +101,7 @@ impl CadCommand for DimTeditCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}

View file

@ -201,6 +201,7 @@ fn preview_wire(pts: &[Vec3]) -> WireModel {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
}
}

View file

@ -112,6 +112,7 @@ fn preview_wire(points: Vec<Vec3>) -> WireModel {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
}
}

View file

@ -154,6 +154,7 @@ fn preview_wire(pts: &[Vec3]) -> WireModel {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
}
}

View file

@ -365,6 +365,7 @@ fn preview_wire(pts: &[Vec3]) -> WireModel {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
}
}

View file

@ -98,6 +98,7 @@ impl CadCommand for QdimCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -111,5 +111,6 @@ fn preview_wire(points: Vec<Vec3>) -> WireModel {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
}
}

View file

@ -144,6 +144,7 @@ impl CadCommand for TableCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
} else {
None

View file

@ -97,6 +97,7 @@ impl CadCommand for ToleranceCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -133,6 +133,7 @@ impl CadCommand for AttdefCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -526,5 +526,6 @@ fn line_wire(from: Vec3, to: Vec3) -> WireModel {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
}
}

View file

@ -87,6 +87,7 @@ impl CadCommand for LineCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -112,6 +112,7 @@ impl CadCommand for MlineCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -111,6 +111,7 @@ impl CadCommand for ImageCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -85,6 +85,7 @@ impl CadCommand for RayCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}
@ -162,6 +163,7 @@ impl CadCommand for XLineCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -82,6 +82,7 @@ impl CadCommand for RevCloudCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -118,6 +118,7 @@ impl CadCommand for WipeoutCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
WipeoutMode::Polygonal => {
@ -138,6 +139,7 @@ impl CadCommand for WipeoutCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -75,6 +75,7 @@ impl CadCommand for AreaCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -70,6 +70,7 @@ impl CadCommand for DistCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -133,6 +133,7 @@ impl CadCommand for StretchCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
_ => None,

View file

@ -97,6 +97,7 @@ impl CadCommand for MviewCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -62,6 +62,7 @@ impl CadCommand for PlotWindowCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}

View file

@ -68,6 +68,7 @@ impl CadCommand for ZoomWindowCommand {
tangent_geoms: vec![],
aci: 0,
key_vertices: vec![],
aabb: WireModel::UNBOUNDED_AABB,
})
}
}