33 G2/G3: untangle 2.4.0 — the VR level picker is seen; the stick pushes/pulls the board - #29
Conversation
…h the head level The Quest report (roadmap 33): "Untangle main menu do not show in VR levels to choose and tab to switch between flat/globe". 31 proved the picker in emulation — the hole fit, the hits, the presses — but never its PIXELS from a level head. Root cause: core 1.18's K2 overlay pass re-stamps every api.vrPanel object to PANEL_ORDER each XR frame — the order core's own vr-game-panel has — so the picker's renderOrder 1001 is gone and three breaks the tie by the depth of each mesh's GEOMETRY BOUNDING-SPHERE CENTRE. The hole sits ~6 cm above the panel's centre on a panel pitched back: with the head LEVEL the picker's centre is a few mm farther than the panel's, the panel draws last and its menu backdrop covers the picker. Looking down past ~3 degrees it showed — the 31 eye shots looked down at the panel. Fix (module-only, works on the released 1.18 core): the picker's geometry carries a bounding sphere centred SORT_LEAD = 0.15 m toward the eyes (radius 2: still encloses the plane for the raycast early-out). A first attempt led the mesh ORIGIN instead and was measured to change nothing (three r185 sorts by the sphere centre, not the origin). Tests: - vrmenu.test (pure): the sort-depth sign at head pitches -40..+15 deg; CF without the lead a level head puts the picker 3.3 mm behind (red as a check of the fix), 20 deg down in front. - untangle-vr2 L.5b/L.5c: render from the spawn's eye, the lit "2D board" cell's pixel. CF (SORT_LEAD = 0, the shipped draw order): level (3,2,3) = the panel backdrop -> L.5b RED (logs/vr2-CF-sortlead0.log); fixed: level (183,99,4) amber, 10/25 deg down amber. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… the held globe, as Edit does
The Quest report (roadmap 33): "I can make bigger/smaller the globe but cannot use up/down on
stick to move it further/closer and I want to be able to do this, just as in edit mode for
objects."
- The held globe (trigger on it) maps its hand's stick exactly like an Edit grab (core
grabStickAdjust): UP pushes it away, DOWN pulls it closer, LEFT/RIGHT scales it (2.3 had
up/down = scale, because a module could not pause the right stick's snap turn). reel.js is
the pure math (Edit's 3 % of the distance per frame, clamped 0.15-12 m).
- Pointing the right laser at the board (2D plate) or the globe: the right stick's up/down
pushes it away / pulls it closer along the laser; left/right still turns the globe. The push
is the LOCAL hold offset, now applied to the flat board too; a mode switch drops it.
- Core 1.19's api.claimInput('sticks') (feature-detected: it answers true) pauses BOTH sticks
while they act on the board — the held globe, and the stick deflected at the board — so
nothing also snap-turns or walks; released at rest. On 1.18 the hold claims 'locomotion' (the
left stick) and the right hand's X stays the player's snap turn.
- The shell's "Board" setting is registered onLevels: a 1.19 core draws it as tabs above the
pause menu's Levels grid (G3's "tab to switch between flat/globe"); older cores ignore it.
- 2.4.0 (module, manifest, index, the template def asks 2.4.0), README, help lines.
Tests:
- reel.test (pure, 9). CF: heldStick with 2.3's mapping (y -> scale, no reel) -> 4 red.
- untangle-vr2 R (2D + globe): stick forward/back moves the board along the laser > 0.3 m each
way, 'sticks' claimed while deflected and released at rest, X turns the globe, B's board never
moves; S: left X -> the pause menu -> Levels -> the Board tabs -> the globe -> a level, through
core's panel press path (SKIP to the Settings row on a core without tabs).
- untangle-vr G.2/G.5-G.6 follow the new mapping (Y reels 1.65 -> 3.67 -> 2.06 m, X scales x2.10).
- On core feat/33-untangle-core (PR #255, 5278): untangle-vr2 94/0, untangle-vr 98/0, untangle
71/0, untangle-drag 54/0; pure untangle ALL PASS.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e owner's 1.18 preview report) - "Waves: as soon as I hit an enemy, ALL enemies return to their start position" (Quest, preview-1-18). Played the headset way (Interact, the simulation started as a real session starts it, the module's vrHand seam), ONE real trigger shot in wave 1 and again in wave 2: every other walker keeps its ground and the running wave's start holds - A/B on the same core (feat/1.18): waves 2.2.0 ALL PASS (16); waves 2.1.0 (WAVES_ZIP=waves-before, packed from 09c9ffe) RED 2.3 + 2.4 — the other walker back at its portal (min 0 m) and the wave's start jumping 5 s: the report verbatim. 2.2.0 fixed it (W1); the headset kept running its installed 2.1.0 (a user module never updated itself) — core feat/1.18 now offers the update when a scene asks a newer version - QLEVEL=<n> sets the governor level (4 and 8 measured green), PLAY=1 also presses Play Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… scale before them) On a core without the 'sticks' scope the held globe is not scaled before G.7 (the right stick's X stays the player's snap turn), and two assumptions of the 2.3 flight broke: - G.7 chose the "front" dot by its normal toward a FIXED left-hand spot from the globe's centre; on the unscaled globe that cap holds no dot (G.0 picks a dot-free spot facing the hands), so the dot it chose was behind the silhouette and the laser rightly hit the globe first. The left hand now stands 0.9 m out along the chosen dot's own normal. - G.12 asserted the release keeps a scale > 1.3; it now asserts the scale the hold had. untangle-vr: 1.18 core (origin/feat/1.18) 96/0 (G.5c/G.6 SKIP); core feat/33-untangle-core 98/0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Follow-up from the lane: the 1.18 run + X2. On a plain 1.18 core (origin/feat/1.18 = c7018be). These are the feature-detect paths: no
On core #255 again after the test fix (feat/33-untangle-core 0b957c6): untangle-vr 98/0. X2 — Waves "hit one enemy → all reset". Per 31-integrate, this is the 1.17 W1 bug in waves 2.1.0; 2.2.0 (on New commit: |
Roadmap 33, lane 33-modules, items G2 and G3 of
lanes/33/user-feedback-2026-10-01b.md. Pairs with core PR theprototype-app/core#255 (→ feat/1.19), which is feature-detected, so this works on 1.18 too. Do not merge from the lane — the integrator merges.G3 — "main menu in VR shows no levels to choose and no flat/globe tab" (b582ba8)
Root cause (the device path): core 1.18's K2 overlay pass re-stamps every
api.vrPanelobject to PANEL_ORDER each XR frame, the same order core'svr-game-panelhas. The picker's own renderOrder 1001 is lost and three breaks the tie by the depth of each geometry's bounding-sphere centre. The level grid's hole sits ~6 cm above the panel centre on a panel pitched back, so with the head level the picker sorts behind the panel and the menu backdrop covers it. Looking down past ~3° it shows, which is why round 31's eye shots (aimed down at the panel) had it. Raycasts ignore draw order, so every emulated hit test passed.Fix: the picker geometry's bounding sphere is centred 15 cm toward the eyes (
vrmenu.jsSORT_LEAD). It now draws last at any head pitch, on any core. An origin lead was tried first and measured to change nothing.With #255 the pause menu's Levels page also shows all 30 levels in VR (it stopped at 20), with Board: Globe / 2D board tabs above the grid. Untangle registers its Board setting
onLevels.G2 — "stick up/down to move it farther/closer, just as in edit mode for objects" (07a8cb7, 2.4.0)
reel.jsuses Edit's rate.api.claimInput('sticks')pauses both sticks while they act on the board (no snap turn or walking on top). On 1.18 the hold claims the left stick only and the right X stays the snap turn.Proof (on core feat/33-untangle-core, local 5278; logs in
lanes-30/after-33/33-modules/logs)npm run test:untangleNot yet run: the flights against a plain 1.18 core (the feature-detect fallbacks:
sticksfalse, no tabs → S.5b Settings row, G.5c SKIP). This is next in the lane handover.OWED on a Quest: the picker over the panel in both eyes, the reel feel, pointing push/pull vs walking.
For the integrator
games/untangleon the union: the def asks untangle 2.4.0.🤖 Generated with Claude Code