- Look-down flip: body facing from BodyMath.HeadFacing (visor + crown), robust past vertical;
stick direction uses it too; crouch lean pitch measured against the facing.
- Landing: falling legs touch down only within their reach, so leg strength stops the body
below its stance (dip scales with impact, big falls fold the legs). Rise eased so gravity
can stop it at the stance; legs untuck speed-limited. Fixed the vertical play-space
correction leaking into ground control's feed-forward (a bounce).
- Jump on right A: countermovement dip + leg push over the stroke (crouch = higher).
- Stick crouch on right stick Y (RagdollDriver.StickCrouch: virtual floor offset).
- Menu summon on left X only.
- XR origin drawn with the bodies' physics interpolation (camera/body desync).
- RagdollSpike: landing/fall/jump/look-down/stick-crouch phases, `-- only=` filter.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
North of the playground, facing spawn: bouldering blocks, a ladder to an 8 m rest ledge,
a jug wall, a 0.4 m traverse ledge, an overhang with monkey bars and a lip bar onto a
16 m rest ledge, a chimney to the 26 m summit with throwable props. A 'Crag' teleport
marker at the base is the way down; teleports now land the floor on the marker's height.
Floor widened to 80 m. Regression: scenes/crag_spike.tscn (reach, free space, overlaps,
height, line of sight).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
WorldPanel is now the project's one SubViewport screen: MainMenu (tabs Player /
World / System; Return to spawn, Recalibrate body, Reset props, Ping, click
volume slider, scrollable log, FPS, Close) rendered by MenuScreen into a
960x640 SubViewport on a thin 0.36x0.24 m panel.
Input = touch-first hybrid cursor injected as mouse events: both controller
rays are projected analytically onto the panel plane, converted to viewport
pixels and pushed via Viewport.PushInput (MouseMotion/MouseButton, wheel from
thumbstick). Stylus tip within 6 cm = touch cursor (press crossing 0.6 cm from
the front, release past 1.8 cm); farther = laser cursor with trigger edge. One
owning hand per viewport. Haptic tick + synthesized click on press.
Kept: ax_button summon/dismiss, XROrigin3D parenting, grip drag (direct/laser)
with head re-orient, IsBlocking/IsPanelCollider. Locomotion's beam now takes
its length from WorldPanel.TryGetLaserDistance (no beam while touching) and
starts at the stylus tip. Recalibrate calls Recalibrate() on the first node in
group "calibration" (disabled when absent).
New headless regression scenes/menu_spike.tscn ("MENU: overall PASS").
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>