8bc7acbd14
Extract apply_skeleton_joints() as a pure module-level function that copies prev_arr (or zeros) and writes a new array, never mutating the old one. The TAG_SKELETON handler now stores the new array under the state lock, so readers that captured a reference to the previous array (multi.py shallow-copy + ArkitFuse.apply outside the lock) always see a complete, consistent snapshot — eliminating the B4 tearing race. 6 new tests cover: shape, identity (is not), value preservation for invalid joints, value application for valid joints, wrong-shape reset, and no-mutation of prev_arr.
data_only_viz
Python + Metal visualiser for the AV-Live data-only patch.
Hand features OSC
/pose/hands [pid=0, lx, ly, lopen, lspeed, rx, ry, ropen, rspeed, dist]
- Emitted once per pipeline tick by
pose_bridge.send_handsto sclang:57121. - L = leftmost hand on screen, R = rightmost; absent hand -> its 4 floats are 0.
- Ranges: positions/openness/dist in [0,1]; speed >= 0 (normalized units/frame).
- Consumed by SuperCollider
~handFeat(data_only) and the Metal renderer uniforms. - Multi-person is not yet carried (pid is always 0).