Skip to content

XR Touchpad Integration: Scroll Mode, Inertia, and Multi-layer Input Pipeline #404

@EndlessJour9527

Description

@EndlessJour9527

Background

JSAR Runtime (Spatial Web Browser Engine) requires comprehensive touchpad input handling to align with modern XR devices. The specific scenario involves a device with a single-finger 2D touchpad surface (no pressure sensing), multi-finger capability (reserved for mode switching), and a pipeline involving Unity C# → Unity C++ plugin → shared memory (TrXRInputSource) → C++ client (XRInputSource) → V8 JS API. The design should:

  • Default to Scroll mode: touchpad slide emits WheelEvent for DOM scrolling, with kinetic inertia enabled by default (decay constant ~300ms, config option)
  • Only Scroll mode is enabled by default; cursor/hover modes reserved for future, togglable via two-finger gesture/long-press (feature flag)
  • Multi-finger input reserved for fast mode switching, not multi-touch gestures by default
  • Double-click/Long-press: pipeline and design placeholder provided, disabled by default (merge later)
  • No pressure mapping; touchpad click = pressed/touched boolean
  • Event synthesis respects 16ms throttle, clamp, zero-offset early exit for perf (see docs/internals/DOM_SCROLLING_PERFORMANCE.md)
  • Should expose axes/buttons via WebXR Gamepads Module (XRInputSource.gamepad) for standards compliance
  • Align input event timing with XR pose (targetRay) pipeline and shared memory updates

Solution Proposal

  1. Input Flow

    • Unity C# (collect touchpad states: x, y, touching, pressed, finger-count)
    • Unity plugin API (C++): Write input state to shared memory (TrXRInputSource)
    • C++ client (XRInputSource): Read shared memory each frame; merge into XRInputSource.gamepad + event synthesis
    • V8 bindings: Expose gamepad on JS XRInputSource and synthesize WheelEvent to DOM
  2. WebXR Compliance

    • Implement WebXR Gamepad mapping:
      • axes[0]/axes[1]: touchpad normalized coords [-1,1] with deadzone
      • buttons[0].touched = finger contact; pressed = physical click
      • No pressure value (value 0/1); multi-finger only for mode toggle
    • Double-click/long-press event recognition pipeline to be reserved, design spec aligned with standard DOM events
  3. DOM Event Synthesis

    • Scrollable DOM target: touchpad slide emits WheelEvent (deltaX, deltaY) at 16ms intervals, with inertia (exponential decay τ=300ms)
    • Non-scroll target (future): pointermove/cursor event (behind flag)
    • Early exit for zero offset, clamp values, reuse perf infra
  4. Config and Feature Flags

    • Defaults: Scroll mode only, inertia enabled, τ=300ms, scale=40px/unit
    • Cursor mode, double-click, long-press: placeholder in code, off by default
    • Runtime config: allow developer/UA to change mode/inertia
  5. Testing and Fixtures

    • HTML test pages: vertical/horizontal scroll, live gamepad readout
    • Document perf with scroll event throttle, inertia curve, mode switch triggers

Related Docs/Code

  • docs/internals/DOM_SCROLLING_PERFORMANCE.md: Scroll event throttle/clamp/early exit
  • docs/contributing/programming_languages.md: Native C++ API pipeline, V8 bindings
  • README: WebXR Inputs, Gamepad support status

Web Standards Reference & Implementation

Acceptance Criteria

  • Device touchpad input integrated via Unity → C++ → shared memory → client → JS pipeline
  • Scroll mode with inertia enabled and functional as default, throttle and performance profile matches spec
  • WebXR Gamepad exposed correctly, DOM WheelEvent synthesized from input with correct timing
  • Double-click/long-press/hover mode designed and pipelined for future merge but off by default
  • Code, config, and docs updated; test pages for manual QA

Metadata

Metadata

Assignees

Labels

Copilot PRThe PR created by Copilot(AI)

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions