Polish pass on the placement/interaction overhaul. Five fixes:
- Item-on-item rotation box: the cursor box held the host-local yaw instead of
world yaw, so it diverged from the item by the host's rotation when stacked on
another item (fine on the floor). The box now derives world yaw from the
mesh/host quaternion in both the R/T handler and the move-start sync.
- 2D floorplan move now respects the snapping mode (parity with 3D): grid
quantization only in grid mode, alignment guides only in lines/magnetic mode;
Shift/Alt no longer hard-bypass. Item move also plays the move "tick" SFX on
any resolved-position change, like the 3D move.
- Wall-side item footprint side: the 2D footprint depth offset extended toward the
wall (centerLocalZ -depth/2) instead of into the room, mirroring the item across
the wall; flipped to +depth/2. Aligned the undefined-side anchor to the 3D
convention (front +1 / else -1).
- 3D placement preview side: the wall-side preview bounds + base plane used a -Z
(into-wall) convention; flipped to +Z (into-room) to match the body and the
fixed 2D footprint. The 2D live preview during a 3D wall placement now publishes
the plan rotation (wall angle + item yaw) instead of the world cursor yaw, which
was pi off on a wall face and flipped the footprint to the far side.
- Cmd/Ctrl+R no longer rotates/flips the selected node (it reaches the browser
reload); guard added to the global selected-node handler and the 2D move overlay.
Verified: core/editor/nodes tsc, biome, editor 162/0 + nodes 292/0 tests.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>