/** * WebXRSystem.ts * * EngineSystem adapter that wires WebXRManager into the SpatialEngine game loop. * Handles stereo rendering, hand tracking → physics integration, and * controller input mapping. * * @module vr */ import type { EngineSystem } from '../SpatialEngine'; export type Vec3 = [number, number, number]; export interface XRInputState { position: Vec3; rotation: Vec3; trigger: number; grip: number; thumbstick: [number, number]; buttons: boolean[]; } export interface XRViewState { eye: 'left' | 'right'; projectionMatrix: Float32Array; viewMatrix: Float32Array; viewport: { x: number; y: number; width: number; height: number; }; } export interface XRHitTestResult { id?: string; anchorId?: string; position: Vec3; rotation?: Vec3; confidence?: number; source: 'webxr-hit-test' | 'geospatial-anchor' | 'mock'; } export interface XRGeospatialAnchorState { anchorId: string; position: Vec3; rotation?: Vec3; confidence: number; resolvedAt: number; lat?: number; lng?: number; alt?: number; } export type XRMode = 'inactive' | 'immersive-vr' | 'immersive-ar' | 'inline'; export interface XRFrameData { time: number; headPosition: Vec3; headRotation: Vec3; views: XRViewState[]; controllers: Map; hitTests?: XRHitTestResult[]; geospatialAnchors?: XRGeospatialAnchorState[]; hands: Map>; } export type XREventType = 'sessionstart' | 'sessionend' | 'selectstart' | 'selectend' | 'squeezestart' | 'squeezeend'; export type XREventCallback = (data: { type: XREventType; inputSource?: string; time: number; }) => void; export declare class WebXRSystem implements EngineSystem { readonly name = "WebXR"; readonly priority = 50; private mode; private frameData; private eventListeners; private supported; private leftEye; private rightEye; private controllers; private handJoints; private hitTestResults; private geospatialAnchors; private grabCallbacks; private releaseCallbacks; private locomotionSpeed; private teleportTarget; private playerPosition; private playerRotation; init(): Promise; update(dt: number): void; destroy(): void; isSupported(): boolean; getMode(): XRMode; /** Simulate entering VR mode (for testing without real WebXR). */ enterVR(): void; /** Simulate entering AR mode. */ enterAR(): void; /** Exit immersive mode. */ exit(): void; /** * Submit frame data from the XR runtime. * In production, this is called from the XR animation frame callback. * In tests, this can be called manually with mock data. */ submitFrame(data: XRFrameData): void; getController(id: string): XRInputState | undefined; getAllControllers(): Map; getHandJoints(side: string): Map | undefined; getHeadPosition(): Vec3; getHeadRotation(): Vec3; getHitTestResults(): XRHitTestResult[]; getPrimaryHitTest(): XRHitTestResult | null; getGeospatialAnchor(anchorId: string): XRGeospatialAnchorState | undefined; getAllGeospatialAnchors(): Map; getLeftEye(): XRViewState | null; getRightEye(): XRViewState | null; getStereoViews(): XRViewState[]; getPlayerPosition(): Vec3; getPlayerRotation(): number; setLocomotionSpeed(speed: number): void; /** Queue a teleport to a world position. Executes next frame. */ teleportTo(target: Vec3): void; onGrab(cb: (controllerId: string, position: Vec3) => void): void; onRelease(cb: (controllerId: string) => void): void; on(type: XREventType, callback: XREventCallback): void; off(type: XREventType, callback: XREventCallback): void; private emit; } //# sourceMappingURL=WebXRSystem.d.ts.map