forked from 1b-agent/opencadstudio-upstream
perf(scene): per-entity tessellation memo for the render path
Phase 2.2. wires_for_block_culled re-tessellated every visible entity on any geometry bump, so a single-entity edit cost a full model re-tess (~30ms baseline after the block_epoch fix). Add a per-entity memo (tess_memo: Handle -> Arc<Vec<WireModel>>) on the culled Model render path. It's guarded by a hash of the tessellation parameters (tol / view / anno / world_offset / bg / entered viewport); a mismatch (zoom, layout switch) clears it. The render path now classifies the visible set against the memo, materializes hits and tessellates only the misses in parallel, then stores the misses back. - bump_geometry clears the memo (structural change — safe default); - incremental edits drop just the changed handle via mark_entity_dirty and bump with bump_geometry_no_blocks: line commit (new handle is a natural miss) and grip commit / Esc-cancel (mark the dragged handle). The hit-test (view_aabb == None), paper and per-viewport paths bypass the memo so their differing cull parameters don't thrash it. A single-entity edit now skips the per-entity geometry math for the entire unchanged set; the Vec assembly + batched-buffer upload stay O(N). Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
7f94a9d66a
commit
eb89717b47
3 files changed
+125
-18
No files matched your search
@@ -1325,6 +1325,8 @@ impl OpenCADStudio {
|
||||
}
|
||||
self.tabs[i].scene.hidden.remove(&h);
|
||||
self.tabs[i].scene.clear_preview_wire();
|
||||
// Geometry restored to the backup — re-tessellate just it.
|
||||
self.tabs[i].scene.mark_entity_dirty(h);
|
||||
self.tabs[i].scene.bump_geometry_no_blocks();
|
||||
self.refresh_selected_grips();
|
||||
}
|
||||
@@ -2652,6 +2654,8 @@ impl OpenCADStudio {
|
||||
self.grip_original = None;
|
||||
self.tabs[i].scene.hidden.remove(&h);
|
||||
self.tabs[i].scene.clear_preview_wire();
|
||||
// Only the dragged entity changed — re-tessellate just it.
|
||||
self.tabs[i].scene.mark_entity_dirty(h);
|
||||
self.tabs[i].scene.bump_geometry_no_blocks();
|
||||
}
|
||||
// Placement confirmed — keep the just-added leader.
|
||||
|
||||
Reference in new issue
Block a user