Add preview2d state machine over schema-3 export_set + compositor:
sex/equipment/clip selection via CompatKey, looping FPS/speed playback,
yaw wrap and pitch clamp preserving time, continuous held light controls
with dt, missing-frame diagnostics, and an editor 2D-preview tab with
aspect-preserving nearest-neighbor letterboxing. Mark Preview2d present.
Consume schema-3 export_set maps for body + compatible equipment. Nearest
valid depth wins with DEPTH_EPSILON_U16=1 and lower-index tie-break; diffuse,
normal and specular stay bound to that same layer. Documented single-depth
alpha-edge policy. Linear ambient/diffuse/Blinn-Phong relighting uses a
view-space light matching exported normals. Pixel fixtures cover occlusion,
ties, transparency and lighting. Preview2d GUI remains not built.
Bump production render.json/complete.json to schema 3 with project
identity, body/equipment SHA-256 fingerprints, resolved camera/pivot
contract, clip inventory and per-PNG checksums. Add export_set reader
that opens only completed runs with matching identity, rejects
traversal/symlinks/stale schemas/corrupt maps, and decodes real RGBA8
and gray-alpha16 depth under production caps. Keep atomic no-clobber
hardlink publication; incomplete runs never get complete.json.
Separate CameraFraming.pivot_y_milli (schema v3) from center_y_milli.
Auto-detect unique neck joints, allow manual override/clear, share
camera::resolve/matrices across live fixed frame, equipment and
production; record pivot_source in render.json v2.