Carry a box in a move slot, not a translation
A slot now holds the box its contents are placed within, in the coordinates of the slot it names, and `prelude.wgsl` composes the chain with `within` instead of adding a delta. A translation is the special case where the box has its parent's relative extent, so every caller passes `UiRegion::FULL.offset(delta)` and nothing changes on screen yet: 42 tests pass and `tabs` at 1920x1200 is byte-identical. `Moves::resolve` takes the region to compose rather than returning a sum, so the CPU walk is the same operation the shader performs. Measured against the translate slot on the same binary with `tests/chain_cost.rs`, 200k instances: +0.6% at depth 1, +0.5% at 2, +0.8% at 4, then +9.6% at 8 and +32.2% at 64. Free at the depth opt-in slots produce, which is the next commit; the per-level cost was always the dependent load rather than the arithmetic. The identity is `UiRegion::FULL` rather than zero, which `MoveOffset`'s comment says beside the `Zeroable` that `Pod` requires: a zeroed entry is a box of no extent and collapses its subtree to a point. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
db1751fdfd
commit
1f9dc48b80
4 files changed
+69
-48
No files matched your search
@@ -65,13 +65,16 @@ impl MoveIdx {
|
||||
}
|
||||
}
|
||||
|
||||
/// One link of the chain a primitive's position is resolved through: a
|
||||
/// translation in physical pixels, and the slot it is relative to. Moving a
|
||||
/// subtree writes its own slot and nothing else.
|
||||
/// One link of the chain a primitive's position is resolved through: the box
|
||||
/// its contents are placed within, given in the coordinates of the slot it
|
||||
/// names. Moving or resizing a subtree writes its own slot and nothing else.
|
||||
///
|
||||
/// The identity is `UiRegion::FULL`, not zero: a zeroed entry is a box of no
|
||||
/// extent, which collapses everything under it to a point.
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub struct MoveOffset {
|
||||
pub delta: Vec2,
|
||||
pub region: UiRegion,
|
||||
pub parent: MoveIdx,
|
||||
}
|
||||
|
||||
@@ -81,7 +84,7 @@ unsafe impl bytemuck::Zeroable for MoveOffset {}
|
||||
impl MoveOffset {
|
||||
pub fn root(parent: MoveIdx) -> Self {
|
||||
Self {
|
||||
delta: Vec2::ZERO,
|
||||
region: UiRegion::FULL,
|
||||
parent,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user