perf(scene): incremental tessellation for MOVE / COPY / ERASE

Extends the Phase 2.2 per-entity memo to the common modify commands, which
still did a full bump_geometry (whole-model re-tess + block rebuild):

- transform_entities (MOVE / ROTATE / SCALE / MIRROR) marks each
  transformed handle dirty, then bump_geometry_no_blocks;
- erase_entities drops the deleted handles from the memo and
  bump_geometry_no_blocks;
- copy_entities' new handles are natural memo misses, so just
  bump_geometry_no_blocks.

All three are top-level operations (including on inserts) that can't change
a block definition, so keeping the block cache is sound. Each now
re-tessellates only the touched entities and reuses the memoized wires for
the rest, matching the grip / line-commit path.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-06-05 16:16:44 +03:00
commit 99b7ab1176
2 changed files with 21 additions and 6 deletions

View file

@ -127,9 +127,13 @@ keyed by a guard hash of the tessellation parameters (tol / view / anno /
offset / bg / entered viewport); a mismatch (zoom, layout) clears it.
`bump_geometry` clears it (structural change); incremental edits drop just the
changed handle via `mark_entity_dirty` and bump with `bump_geometry_no_blocks`.
So a single-entity edit (line commit, grip commit/cancel) re-tessellates only
that entity and reuses every other — the per-entity geometry math is skipped
for the unchanged set. The hit-test (`view_aabb == None`), paper and
So a single-entity edit (line commit, grip commit/cancel, MOVE / ROTATE /
SCALE / MIRROR, COPY, ERASE) re-tessellates only the touched entities and
reuses every other — the per-entity geometry math is skipped for the
unchanged set. `transform_entities` marks the moved handles dirty,
`erase_entities` drops the deleted ones, and `copy_entities`' new handles are
natural memo misses; all use `bump_geometry_no_blocks` so the block cache is
kept too. The hit-test (`view_aabb == None`), paper and
per-viewport paths bypass the memo so their cull params don't thrash it.
Remaining: the assembly still concatenates into one `Vec` and rebuilds the