Skip to content

33 G2/G3: untangle 2.4.0 — the VR level picker is seen; the stick pushes/pulls the board - #29

Merged
AlexZ005 merged 4 commits into
mainfrom
feat/33-modules
Oct 2, 2026
Merged

AlexZ005 merged 4 commits into
mainfrom
feat/33-modules

Conversation

@AlexZ005

@AlexZ005 AlexZ005 commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

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.vrPanel object to PANEL_ORDER each XR frame, the same order core's vr-game-panel has. 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.js SORT_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)

  • The held globe (trigger on it) maps like an Edit grab: up pushes it away, down pulls it closer, left/right scales (2.3 had up/down = scale). reel.js uses Edit's rate.
  • Pointing the right laser at the board or the globe: stick up/down pushes/pulls it along the laser; left/right still turns the globe. This is local (like the hold), and a mode switch drops it.
  • On #255, 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.
  • With #255, a right grip that pans the world plus stick up/down reels the world too.

Proof (on core feat/33-untangle-core, local 5278; logs in lanes-30/after-33/33-modules/logs)

flight result
untangle-vr2 94/0 — new L.5b/c (picker pixel from a level head: (183,99,4) amber; CF with the shipped order: (3,2,3) = panel backdrop, red), R (push/pull on board + globe, claim lifecycle, B unaffected), S (left X → pause menu → Levels → Board tabs → globe → a level, through core's panel press path)
untangle-vr 98/0 (G.5 reel 1.65 → 3.67 → 2.06 m, G.5c scale ×2.10)
untangle / untangle-drag 71/0 · 54/0
pure npm run test:untangle ALL PASS (243; reel CF: 2.3's mapping → 4 red; vrmenu sort CF)

Not yet run: the flights against a plain 1.18 core (the feature-detect fallbacks: sticks false, 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

  • Re-author games/untangle on the union: the def asks untangle 2.4.0.
  • CHANGELOG (modules): untangle 2.4.0. The VR level picker (with Globe / 2D) shows over the menu board in the headset again. The stick pushes the board or the held globe away and pulls it closer, and left/right scales the held globe, as with an object in Edit. The Board choice shows as tabs on the pause menu's Levels page (core 1.19).

🤖 Generated with Claude Code

AlexZ005 and others added 3 commits October 1, 2026 20:45
…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>
Base automatically changed from dev to main October 1, 2026 22:01
… 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>
@AlexZ005

AlexZ005 commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor Author

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 sticks scope, no level tabs.

  • untangle-vr2 91/0: R.*.3 SKIP (the hold claims the left stick only); S.5b–S.9 go through the Settings page's Board row instead of the tabs; the L.5b pixel is amber.
  • untangle-vr 96/0 (G.5c/G.6 SKIP). On 1.18 the right hand's X stays the snap turn, so the stick only reels; scaling there is the world grips.
  • core vr-world-reel as its counterfactual: red (worldReelStep is not a function).

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 dev) doesn't do it, and the Quest had kept its installed 2.1.0 (core's fix in 31-integrate: a scene that needs a newer module offers Update). Their regression flight waves-hit-reset (65da7a1) wasn't on dev, so it's cherry-picked here (75b7b3e). On this branch with waves 2.2.0: 16/0.

New commit: [test] untangle-vr: the two-hand checks hold on a 1.18 core. G.7 chose a dot that was behind the globe's silhouette on an unscaled globe; G.12 assumed a stick-scaled globe.

@AlexZ005
AlexZ005 merged commit db8ac04 into main Oct 2, 2026
@AlexZ005
AlexZ005 deleted the feat/33-modules branch October 2, 2026 11:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant