Skip to content

52-browser: V4 Asset Browser in VR + light hand tracking - #423

Merged
AlexZ005 merged 4 commits into
feat/52from
feat/52-browser
Oct 23, 2026
Merged

AlexZ005 merged 4 commits into
feat/52from
feat/52-browser

Conversation

@AlexZ005

Copy link
Copy Markdown
Collaborator

Roadmap 52 · V4 — the Asset Browser in VR + light hand tracking (lane 52-browser).

What

  • P1 d10042d — the drag-to-place ghost on the VR laser (absorbs f-vr-place). placeDrag gains a RAY mode laid out in the objectsGroup's frame, so a moved / shrunk world rig (miniature, dollhouse) places at the scene-unit spot under the laser; desktop path unchanged (frame = identity). vr/placeRay.js: trigger places (stays armed, keeps the turn), trigger-drag drops on release, stick flick turns 15°, grip cancels, no ghost while the laser is on a panel. The VR prefabs window uses the same ghost. Prefabs get measured dims (they landed half sunk).
  • P2 282b467 — the wrist Asset Browser. Add ▸ Assets: one canvas panel (one draw call) on the off-hand wrist; Packs / Free CC0 (Poly Haven: downloads into the Library, then rides the laser) / My library (models + prefabs); VR keyboard search filtering as you type; grip it off to pin it 1.6x, near the wrist to return it.
  • P3 8c75f6a — hands. A pinch is the trigger (press / pinch-drag drop / pinch-click arm); controllerRequired(tool, slot) shows "Pick up a controller to …" by the hand for precise tools (wired: VR sculpt, face edit, vertex edit; on the vrControls façade for 52-measure / 52-paint).
  • P4 f3ce2f1 — cost. Repaint only on change. IWER Quest 3, CPU ×4: panel 0.59 ms/frame, repaint 1.5 ms, ghost 1.17 ms/frame; +1 / +2 draw calls.

Shared-file touch points (small, additive)

vr/hooks.js registerGripHooks + select swallow receives the slot index · vr/grip.js two grip-hook lines + controllerRequired gates · Scene.svelte VRAssetBrowser mount + swallow(index) · vrControls.js façade exports · debugHooks.js rows vrPlace / vrAssetBrowser / vrHands · vr/panels.js prefab ghost → shared · vr/sculpt.js gate · placeDrag.js, placeGhost.js, explorerDrop.js (ray mode, frame).

Proof

  • New IWER suite vr-asset-browser-iwer rows G B H P: 75/0. vr-prefabs 17/0 (taught the shared ghost), place-drag 38/0, place-drag-extras 15/0, vr-iwer 36/0, vr-grab / vr-sleeve / vr-nav-suppression / vr-panels-on-top green.
  • Pre-existing, identical on base 904599c: vr-face-edit (face cap 1000 vs 2500), vr-laser-panels (stars-room / jam-room board).
  • svelte-check 299/39 = baseline; vitest 2490 green; check:tokens / zindex / storage clean.
  • IWER fires select before selectstart on press (a headset: selectstart on press, select + selectend on release) — the panel and the ghost claim per controller so both orders give one action.

Owed on a real Quest

Wrist panel position/tilt and readability; pin/return grip feel; ghost + stick turn feel; pinch press/drag with real hand tracking; frame time on the device.

🤖 Generated with Claude Code

AlexZ005 and others added 4 commits October 23, 2026 00:06
…s f-vr-place)

- placeDrag RAY mode: beginRayPlace / updateRayPlace / commitRayPlace lay the ghost out in the
  objectsGroup's frame, so a moved or shrunk world rig (miniature, dollhouse) places at the
  scene-unit spot under the laser; desktop pointer path unchanged (frame = identity)
- placeGhost.setGhostFrame + a frame for the pending drop boxes; explorerDrop.rayHit +
  placeFromGhost(items, placements, {frame})
- prefabs get measured dims (their ghost was the 1 m unknown box and they landed half sunk)
- vr/placeRay.js: the VR glue — pointer laser per frame, stick flick turns 15 deg, the trigger
  places (stays armed, keeps the turn), a trigger-drag drops on release, a grip cancels, no ghost
  while the laser is on a panel
- the VR prefabs window's private ghost moved onto the shared one
- hooks: registerGripHooks (a feature may take a squeeze before anything grabs); the select
  swallow learns which controller (IWER fires select BEFORE selectstart on press)
- suites: vr-asset-browser-iwer row G (new, IWER), vr-prefabs taught the shared ghost

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…CC0, your library)

- vr/assetBrowser.js + assetBrowserDraw.js: one canvas on one plane (one draw call) on the
  OFF hand's wrist, facing the head; Add > Assets toggles it; steps aside while the radial
  is open on that hand; one-handed it opens pinned in front
- tabs Packs (drill into a pack) / Free CC0 (Poly Haven models: a card downloads into the
  Library through the Explorer import, the card shows the progress, then it rides the laser)
  / My library (models + prefabs); search via the VR keyboard, filtering as you type;
  pages by the buttons or the stick while the laser is on the panel
- a trigger-DRAG from a card drops the item where you let go (once); a CLICK arms it (the
  next trigger places, stays armed); the status line says what the trigger / grip do now
- a GRIP lifts the panel off the wrist: let go in the air = pinned 1.6x, near the wrist =
  back on it; the Pin / To wrist button does both
- a trigger on the panel is the panel's: never a select of what is behind it, never a
  placement (also under IWER's select-before-selectstart order)
- suite vr-asset-browser-iwer row B (55 checks with G), evidence panel shots

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… precise tools ask for a controller

- a pinch IS the trigger: the panel and the laser ghost read the session's select events,
  so a pinch presses a card, a pinch held while the hand moves drops the item where it lets
  go, a pinch-click arms it and the next pinch places; the panel speaks hands ("pinch to
  place", "let go over the world")
- vr/handInput.js: isTrackedHand + controllerRequired(tool, slot) - a tracked hand gets
  "Pick up a controller to <tool>" on a small chip at that hand (one draw call) and the
  tool stands down; wired into the VR sculpt brush, face edit and vertex edit; exported
  from the vrControls facade for 52-measure / 52-paint
- the placing hint outranks a passing info line on the panel
- suite vr-asset-browser-iwer row H (IWER tracked hands; 70 checks with G + B)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…cost on the Quest 3 profile

- the panel compares a few inputs per frame and builds its card list only when one moved
  (the Free tab is 400 rows; it used to be walked every frame); one laser raycast per slot
- frame-hook and repaint counters on the panel and the laser ghost
- suite row P (IWER metaQuest3, CPU x4): panel 0.59 ms/frame, a repaint 1.5 ms (only when
  the view changes), the ghost 1.17 ms/frame, +1 draw call for the panel, +2 for a box ghost

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@AlexZ005
AlexZ005 merged commit 7514dfd into feat/52 Oct 23, 2026
8 of 9 checks passed
@AlexZ005
AlexZ005 deleted the feat/52-browser branch October 23, 2026 21:26
@AlexZ005

Copy link
Copy Markdown
Collaborator Author

In main via 52-int: feat/52 was merged into feat/52-int and released in 1.45.0 (#482, tag v1.45.0 e59e96a, live on production).

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