perf: viewport wire cache, Arc hit_test_wires, snap world-space pre-rejection (I+J+K)

Option I: add per-viewport Arc wire cache so paper-space viewport rendering
no longer re-tessellates model content every frame.

Option J: hit_test_wires() returns Arc<Vec<WireModel>> — O(1) pointer copy
in model space instead of a full Vec clone on every mouse move during commands.
paper_canvas_hatches/wipeouts() now route through the epoch caches added in F.

Option K: add world_snap_r + wire_in_range() pre-check to Snapper::snap().
All Endpoint/Midpoint/Nearest/Perpendicular/Intersection loops skip wires
whose chord sphere is outside the snap circle using O(1) scalar comparisons,
eliminating O(entities × vertices) matrix multiply cost when zoomed in.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Sonnet 4.6 committed 2026-04-26 11:55:08 +03:00
1 parent 81db3c37d0
commit 2da9301a2b
6 files changed
+149 -32

No files matched your search

+3 -3
View File
@@ -291,11 +291,11 @@ impl Scene {
None => return self.build_primitive(hover_region, bounds, false),
};
let base_wires = self.model_wires_for_viewport(vp_handle);
let base_arc = self.model_wires_for_viewport_arc(vp_handle);
let all_wires = if self.interim_wire.is_none() && self.preview_wires.is_empty() {
Arc::new(base_wires)
base_arc
} else {
let mut v = base_wires;
let mut v = (*base_arc).clone();
if let Some(iw) = &self.interim_wire {
v.push(iw.clone());
}