the layout graph is maintained, and the shine draws for real

- the interface's layout graph is maintained as anchors change instead of rediscovered from scratch: 1.48 ms per mutated frame becomes 34 µs, and end to end a running cast now costs +0.14 ms where it cost +4.33
- the autocast shine draws its authored population — 1200 particles through the star's own projection, spinning as the model says
- the shine is clipped to its own widget: the model frame installs its rect as the viewport, so nothing it draws leaves the button

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Sam
2026-08-17 17:01:46 +07:00
co-authored by Claude Fable 5
parent e4b6776b81
commit 2381df5a58
13 changed files with 1307 additions and 461 deletions
@@ -414,6 +414,13 @@ fn free_block(model: &mut Model, rh: RegionHandle) {
model.id_to_region.remove(&id);
}
model.arena.destroy_region(rh);
// A death is the archetypal STRUCTURAL change — it takes a node out of the layout roster and
// its reverse edges with it, which is exactly what a per-node ledger cannot describe
// (decision 1388). `set_text`, this function's only caller, already ends in the same
// conservative touch, so this is redundant today; it is here because the redundancy is the
// point. A destruction site that does not invalidate the graph it destroys part of is a
// stale rect waiting for a second caller.
model.touch_layout();
}
// ─────────────────────────────────────────────────────────────────────────────────────────────