33 (G2/G3): the stick reels the world; api.claimInput('sticks'); every level + level tabs in the VR pause menu - #255
Merged
Conversation
…); every level + level tabs in the VR pause menu
Untangle's Quest report (roadmap 33): "I can make bigger/smaller the globe but cannot use up/down
on stick to move it further/closer ... just as in edit mode for objects", and "main menu do not
show in VR levels to choose and tab to switch between flat/globe".
G2 — the stick reels what you hold, the world included:
- vrControls: the one-hand world PAN (a right grip on scenery/air in Edit, or in Interact when
play.locomotion.worldGrab) now reels the world on that hand's stick Y with Edit's own object
reel (grabStickAdjust): forward pushes it away along the hand's ray, back pulls it in, from
the distance to the gripped spot (panReach). worldReelStep is pure + exported.
- api.claimInput('sticks'): BOTH VR sticks' navigation stands down (left-stick move, right-stick
snap/smooth turn + teleport) for a module that reads the sticks itself (Untangle's held globe:
Y reels, X scales). claimInput now answers true for a scope this core knows (feature detect).
G3 — the pause menu's Levels page in a headset:
- shellPanelDraw drew list.slice(0, 20): Untangle's levels 21-30 were unreachable in VR. Now a
6-column grid as tall as fits (pages with arrows beside Back beyond that); <= 20 levels and no
tabs keep the old 5 x 4.
- addSetting({..., type: 'choice', onLevels: true}): the choice is also drawn as TABS above the
Levels grid, desktop (GameShellMenu, role=tablist) and VR (shell:tab hits). Untangle registers
its Board (Globe / 2D board) that way.
Tests:
- vitest shellPanelDraw (new, 6) + gameShell (+3): CF — the old slice(0, 20) restored: 2 red.
- e2e vr-world-reel (new, 21/0 on 5278): pure step, Edit pan reel push/pull exactly by the reach
growth, no drift at rest, Interact+worldGrab reel, the 'sticks' claim silencing snap turn and
the left stick then releasing. fakeXR controllers do not follow the reference space, so the
suite poses a spec-accurate right hand (re-derived on every setReferenceSpace).
CF: on the feat/1.19 base the suite is red (no worldReelStep, claimInput answers undefined).
- held: game-shell 66/0, vr-game-panel 36/0, vr-nav-suppression 5/0, vr-grips-by-mode 19/0,
vr-laser-panels ALL PASS (SCENES_DIR = the preview-1-18 scenes).
- svelte-check 333/47 (= baseline), vitest 387/387, check:storage clean.
- modules flights on this branch: untangle-vr2 94/0 (incl. S: left X -> Levels -> Board tabs ->
a level, through the panel's press path), untangle-vr 98/0, untangle 71/0, untangle-drag 54/0.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Roadmap 33, lane 33-modules — the core hooks Untangle needed (items G2, G3 of
lanes/33/user-feedback-2026-10-01b.md). Pairs with the modules PR (untangle 2.4.0). Do not merge from the lane — the integrator merges.G2 — "stick up/down moves it farther/closer, just as in edit mode for objects"
play.locomotion.worldGrab) now reels the world on that hand's stick Y with Edit's own object reel (grabStickAdjust): forward pushes it away along the hand's ray, back pulls it in, from the distance to the gripped spot.worldReelStepis pure + exported.api.claimInput('sticks'): both VR sticks' navigation stands down (left move, right snap/smooth turn + teleport) while a module reads the sticks (Untangle's held globe: Y reels, X scales — Edit's mapping).claimInputnow answerstruefor a scope the core knows, so modules feature-detect it.G3 — the pause menu's Levels page in a headset
list.slice(0, 20); Untangle has 30. Now a 6-column grid as tall as fits, pages with arrows beside Back beyond that (≤ 20 levels and no tabs keep the old 5 × 4).addSetting({type: 'choice', onLevels: true, ...})also draws the choice as tabs above the Levels grid, desktop (role=tablist) and VR (shell:tabhits). Untangle's Board (Globe / 2D board) uses it.api.vrPanelobject to PANEL_ORDER; three then sorts by bounding-sphere centre). That's fixed in the module, so it works on 1.18 too. A core way to layer a module panel over core's is a DEVX candidate, not in this PR.Proof (local 5278, this branch)
slice(0, 20)restored → 2 redfakeXR controllers don't follow the reference space (a headset's do), so
vr-world-reelposes a spec-accurate right hand re-derived on everysetReferenceSpace. OWED on a Quest: the reel's feel (3 %/frame at full stick, Edit's rate), the tabs' legibility at 1.2 m.CHANGELOG lines (for the integrator)
api.claimInput('sticks')(both VR sticks; returns true when supported);addSetting({..., onLevels: true}).🤖 Generated with Claude Code