@babylonjs/core 5.27.1 → 5.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/Behaviors/Meshes/handConstraintBehavior.js +4 -4
  2. package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
  3. package/Engines/engine.d.ts +898 -273
  4. package/Engines/nullEngine.d.ts +7 -0
  5. package/Engines/nullEngine.js +42 -0
  6. package/Engines/nullEngine.js.map +1 -1
  7. package/Engines/thinEngine.js +2 -2
  8. package/Engines/thinEngine.js.map +1 -1
  9. package/Loading/sceneLoader.d.ts +1 -1
  10. package/Loading/sceneLoader.js +2 -2
  11. package/Loading/sceneLoader.js.map +1 -1
  12. package/Materials/Textures/baseTexture.d.ts +5 -4
  13. package/Materials/Textures/baseTexture.js +1 -0
  14. package/Materials/Textures/baseTexture.js.map +1 -1
  15. package/Materials/Textures/thinTexture.d.ts +3 -3
  16. package/Materials/Textures/thinTexture.js.map +1 -1
  17. package/Meshes/mesh.d.ts +1 -1
  18. package/Meshes/mesh.js +2 -1
  19. package/Meshes/mesh.js.map +1 -1
  20. package/Meshes/transformNode.d.ts +7 -1
  21. package/Meshes/transformNode.js +15 -4
  22. package/Meshes/transformNode.js.map +1 -1
  23. package/Misc/assetsManager.d.ts +22 -4
  24. package/Misc/assetsManager.js +20 -8
  25. package/Misc/assetsManager.js.map +1 -1
  26. package/Misc/dds.js +1 -1
  27. package/Misc/dds.js.map +1 -1
  28. package/Misc/environmentTextureTools.js +1 -1
  29. package/Misc/environmentTextureTools.js.map +1 -1
  30. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +4 -2
  31. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  32. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +3 -3
  33. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  34. package/XR/features/WebXRHandTracking.d.ts +3 -3
  35. package/XR/features/WebXRHandTracking.js +100 -100
  36. package/XR/features/WebXRHandTracking.js.map +1 -1
  37. package/XR/features/WebXRHitTest.js.map +1 -1
  38. package/XR/features/WebXRLightEstimation.js +1 -1
  39. package/XR/features/WebXRLightEstimation.js.map +1 -1
  40. package/XR/webXRInput.js.map +1 -1
  41. package/XR/webXRManagedOutputCanvas.js +0 -1
  42. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  43. package/XR/webXRWebGLLayer.js +3 -0
  44. package/XR/webXRWebGLLayer.js.map +1 -1
  45. package/package.json +1 -1
@@ -2299,20 +2299,64 @@ interface Gamepad {
2299
2299
 
2300
2300
  var VRFrameData: any;
2301
2301
 
2302
- /* eslint-disable @typescript-eslint/naming-convention */
2302
+ // Type definitions for non-npm package webxr 0.5
2303
+ // Project: https://www.w3.org/TR/webxr/
2304
+ // Definitions by: Rob Rohan <https://github.com/robrohan>
2305
+ // Raanan Weber <https://github.com/RaananW>
2306
+ // Sean T. McBeth <https://github.com/capnmidnight>
2307
+ // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
2308
+ // Minimum TypeScript Version: 3.7
2309
+
2310
+ // Most of this was hand written and... more or less copied from the following
2311
+ // sites:
2312
+ // https://www.w3.org/TR/webxr/
2313
+ // https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API
2314
+ // https://www.w3.org/immersive-web/
2315
+ // https://github.com/immersive-web
2316
+ //
2317
+
2318
+ /**
2319
+ * ref: https://immersive-web.github.io/webxr/#navigator-xr-attribute
2320
+ */
2321
+ interface Navigator {
2322
+ /**
2323
+ * An XRSystem object is the entry point to the API, used to query for XR features
2324
+ * available to the user agent and initiate communication with XR hardware via the
2325
+ * creation of XRSessions.
2326
+ */
2327
+ xr?: XRSystem | undefined;
2328
+ }
2329
+
2330
+ /**
2331
+ * WebGL Context Compatability
2332
+ *
2333
+ * ref: https://immersive-web.github.io/webxr/#contextcompatibility
2334
+ */
2335
+ interface WebGLContextAttributes {
2336
+ xrCompatible?: boolean | undefined;
2337
+ }
2338
+
2339
+ interface WebGLRenderingContextBase {
2340
+ makeXRCompatible(): Promise<void>;
2341
+ }
2342
+
2303
2343
  /**
2304
2344
  * Available session modes
2345
+ *
2346
+ * ref: https://immersive-web.github.io/webxr/#xrsessionmode-enum
2305
2347
  */
2306
2348
  type XRSessionMode = "inline" | "immersive-vr" | "immersive-ar";
2307
2349
 
2308
2350
  /**
2309
2351
  * Reference space types
2310
2352
  */
2311
- type XRReferenceSpaceType = "viewer" | "local" | "local-floor" | "unbounded";
2312
- type XRBoundedReferenceSpaceType = "bounded-floor";
2353
+ type XRReferenceSpaceType = "viewer" | "local" | "local-floor" | "bounded-floor" | "unbounded";
2313
2354
 
2314
2355
  type XREnvironmentBlendMode = "opaque" | "additive" | "alpha-blend";
2315
2356
 
2357
+ /**
2358
+ * ref: https://immersive-web.github.io/webxr/#xrsession-interface
2359
+ */
2316
2360
  type XRVisibilityState = "visible" | "visible-blurred" | "hidden";
2317
2361
 
2318
2362
  /**
@@ -2330,67 +2374,57 @@ type XRTargetRayMode = "gaze" | "tracked-pointer" | "screen";
2330
2374
  */
2331
2375
  type XREye = "none" | "left" | "right";
2332
2376
 
2333
- /**
2334
- * Type of XR events available
2335
- */
2336
- type XREventType =
2337
- | "devicechange"
2338
- | "visibilitychange"
2339
- | "end"
2340
- | "inputsourceschange"
2341
- | "select"
2342
- | "selectstart"
2343
- | "selectend"
2344
- | "squeeze"
2345
- | "squeezestart"
2346
- | "squeezeend"
2347
- | "reset"
2348
- | "eyetrackingstart"
2349
- | "eyetrackingend";
2350
-
2351
- type XRDOMOverlayType = "screen" | "floating" | "head-locked";
2352
-
2353
- type XRReflectionFormat = "srgba8" | "rgba16f";
2354
-
2355
2377
  type XRFrameRequestCallback = (time: DOMHighResTimeStamp, frame: XRFrame) => void;
2356
2378
 
2357
- type XRPlaneSet = Set<XRPlane>;
2358
- type XRAnchorSet = Set<XRAnchor>;
2379
+ interface XRSystemDeviceChangeEvent extends Event {
2380
+ type: "devicechange";
2381
+ }
2359
2382
 
2360
- type XREventHandler = (callback: any) => void;
2383
+ interface XRSystemDeviceChangeEventHandler {
2384
+ (event: XRSystemDeviceChangeEvent): any;
2385
+ }
2361
2386
 
2362
- interface XRLayer extends EventTarget {}
2387
+ interface XRSystemEventMap {
2388
+ devicechange: XRSystemDeviceChangeEvent;
2389
+ }
2363
2390
 
2364
- type XRDOMOverlayInit = {
2391
+ /**
2392
+ * An XRSystem object is the entry point to the API, used to query for XR features available
2393
+ * to the user agent and initiate communication with XR hardware via the creation of
2394
+ * XRSessions.
2395
+ *
2396
+ * ref: https://immersive-web.github.io/webxr/#xrsystem-interface
2397
+ */
2398
+ interface XRSystem extends EventTarget {
2365
2399
  /**
2366
- * The root attribute specifies the overlay element that will be displayed to the user as the content of the DOM overlay. This is a required attribute, there is no default.
2400
+ * Attempts to initialize an XRSession for the given mode if possible, entering immersive
2401
+ * mode if necessary.
2402
+ * @param mode
2403
+ * @param options
2367
2404
  */
2368
- root: Element;
2369
- };
2370
-
2371
- type XRLightProbeInit = {
2372
- reflectionFormat: XRReflectionFormat;
2373
- };
2405
+ requestSession(mode: XRSessionMode, options?: XRSessionInit): Promise<XRSession>;
2374
2406
 
2375
- interface XRSessionInit {
2376
- optionalFeatures?: string[];
2377
- requiredFeatures?: string[];
2378
- trackedImages?: XRTrackedImageInit[];
2379
2407
  /**
2380
- * When 'dom-overly' is (optionally) requested the application MUST provide configuration for the DOM overlay
2408
+ * Queries if a given mode may be supported by the user agent and device capabilities.
2409
+ * @param mode
2381
2410
  */
2382
- domOverlay?: XRDOMOverlayInit;
2383
- }
2411
+ isSessionSupported(mode: XRSessionMode): Promise<boolean>;
2384
2412
 
2385
- interface XRSessionEvent extends Event {
2386
- readonly session: XRSession;
2387
- }
2413
+ ondevicechange: XRSystemDeviceChangeEventHandler | null;
2388
2414
 
2389
- interface XRSystem {
2390
- isSessionSupported: (sessionMode: XRSessionMode) => Promise<boolean>;
2391
- requestSession: (sessionMode: XRSessionMode, sessionInit?: any) => Promise<XRSession>;
2415
+ addEventListener<K extends keyof XRSystemEventMap>(type: K, listener: (this: XRSystem, ev: XRSystemEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2416
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2417
+ removeEventListener<K extends keyof XRSystemEventMap>(type: K, listener: (this: XRSystem, ev: XRSystemEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2418
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2392
2419
  }
2393
2420
 
2421
+ abstract class XRSystem implements XRSystem {}
2422
+
2423
+ /**
2424
+ * Describes a viewport, or rectangular region, of a graphics surface.
2425
+ *
2426
+ * ref: https://immersive-web.github.io/webxr/#xrviewport-interface
2427
+ */
2394
2428
  interface XRViewport {
2395
2429
  readonly x: number;
2396
2430
  readonly y: number;
@@ -2398,215 +2432,296 @@ interface XRViewport {
2398
2432
  readonly height: number;
2399
2433
  }
2400
2434
 
2401
- interface XRWebGLLayerInit {
2402
- antialias?: boolean;
2403
- depth?: boolean;
2404
- stencil?: boolean;
2405
- alpha?: boolean;
2406
- multiview?: boolean;
2407
- framebufferScaleFactor?: number;
2408
- }
2409
-
2410
- // https://www.w3.org/TR/webxrlayers-1/#XRWebGLBindingtype
2411
- class XRWebGLBinding {
2412
- constructor(xrSession: XRSession, context: WebGLRenderingContext | WebGL2RenderingContext);
2413
- getReflectionCubeMap: (lightProbe: XRLightProbe) => WebGLTexture;
2414
-
2415
- // https://immersive-web.github.io/layers/#XRWebGLBindingtype
2416
- createProjectionLayer(init: XRProjectionLayerInit): XRProjectionLayer;
2417
- getSubImage(layer: XRCompositionLayer, frame: XRFrame, eye?: XREye): XRWebGLSubImage;
2418
- getViewSubImage(layer: XRProjectionLayer, view: XRView): XRWebGLSubImage;
2419
- }
2420
-
2421
- class XRWebGLLayer implements XRLayer {
2422
- static getNativeFramebufferScaleFactor(session: XRSession): number;
2423
- constructor(session: XRSession, context: WebGLRenderingContext | WebGL2RenderingContext, layerInit?: XRWebGLLayerInit);
2424
- readonly antialias: boolean;
2425
- readonly framebuffer: WebGLFramebuffer;
2426
- readonly framebufferWidth: number;
2427
- readonly framebufferHeight: number;
2428
- readonly ignoreDepthValues: boolean;
2429
- fixedFoveation?: number | null;
2430
- getViewport: (view: XRView) => XRViewport;
2431
-
2432
- // Methods for EventTarget required through XRLayer
2433
- addEventListener(): void;
2434
- dispatchEvent(): boolean;
2435
- removeEventListener(): void;
2436
- }
2437
-
2438
- type XRLayerLayout = "default" | "mono" | "stereo" | "stereo-left-right" | "stereo-top-bottom";
2439
-
2440
- // https://immersive-web.github.io/layers/#xrcompositionlayertype
2441
- interface XRCompositionLayer extends XRLayer {
2442
- layout: XRLayerLayout;
2435
+ abstract class XRViewport implements XRViewport {}
2443
2436
 
2444
- blendTextureSourceAlpha: boolean;
2445
- chromaticAberrationCorrection: boolean;
2446
- mipLevels: number;
2437
+ /**
2438
+ * Represents a virtual coordinate system with an origin that corresponds to a physical location.
2439
+ * Spatial data that is requested from the API or given to the API is always expressed in relation
2440
+ * to a specific XRSpace at the time of a specific XRFrame. Numeric values such as pose positions
2441
+ * are coordinates in that space relative to its origin. The interface is intentionally opaque.
2442
+ *
2443
+ * ref: https://immersive-web.github.io/webxr/#xrspace-interface
2444
+ */
2445
+ // tslint:disable-next-line no-empty-interface
2446
+ interface XRSpace extends EventTarget {}
2447
2447
 
2448
- needsRedraw: boolean;
2448
+ abstract class XRSpace implements XRSpace {}
2449
2449
 
2450
- destroy(): void;
2450
+ interface XRRenderStateInit {
2451
+ baseLayer?: XRWebGLLayer | undefined;
2452
+ depthFar?: number | undefined;
2453
+ depthNear?: number | undefined;
2454
+ inlineVerticalFieldOfView?: number | undefined;
2451
2455
  }
2452
2456
 
2453
- type XRTextureType = "texture" | "texture-array";
2454
-
2455
- interface XRProjectionLayerInit {
2456
- textureType: XRTextureType; // Default "texture";
2457
- colorFormat: GLenum; // Default 0x1908, RGBA
2458
- depthFormat: GLenum; // Default 0x1902, DEPTH_COMPONENT
2459
- scaleFactor: number; // Default 1.0;
2457
+ interface XRRenderState {
2458
+ readonly baseLayer?: XRWebGLLayer | undefined;
2459
+ readonly depthFar: number;
2460
+ readonly depthNear: number;
2461
+ readonly inlineVerticalFieldOfView?: number | undefined;
2460
2462
  }
2461
2463
 
2462
- interface XRProjectionLayer extends XRCompositionLayer {
2463
- textureWidth: number;
2464
- textureHeight: number;
2465
- textureArrayLength: number;
2464
+ abstract class XRRenderState implements XRRenderState {}
2466
2465
 
2467
- ignoreDepthValues: boolean;
2468
- fixedFoveation?: number;
2466
+ interface XRReferenceSpaceEventInit extends EventInit {
2467
+ referenceSpace?: XRReferenceSpace | undefined;
2468
+ transform?: XRRigidTransform | undefined;
2469
2469
  }
2470
2470
 
2471
- interface XRSubImage {
2472
- viewport: XRViewport;
2471
+ /**
2472
+ * XRReferenceSpaceEvents are fired to indicate changes to the state of an XRReferenceSpace.
2473
+ *
2474
+ * ref: https://immersive-web.github.io/webxr/#xrreferencespaceevent-interface
2475
+ */
2476
+ interface XRReferenceSpaceEvent extends Event {
2477
+ readonly type: "reset";
2478
+ readonly referenceSpace: XRReferenceSpace;
2479
+ readonly transform?: XRRigidTransform | undefined;
2473
2480
  }
2474
2481
 
2475
- interface XRWebGLSubImage extends XRSubImage {
2476
- colorTexture: WebGLTexture;
2477
- depthStencilTexture?: WebGLTexture;
2478
- imageIndex?: number;
2479
- textureWidth: number;
2480
- textureHeight: number;
2482
+ // tslint:disable-next-line no-unnecessary-class
2483
+ class XRReferenceSpaceEvent implements XRReferenceSpaceEvent {
2484
+ constructor(type: "reset", eventInitDict?: XRReferenceSpaceEventInit);
2481
2485
  }
2482
2486
 
2483
- // tslint:disable-next-line no-empty-interface
2484
- interface XRSpace extends EventTarget {}
2485
-
2486
- interface XRRenderState {
2487
- readonly baseLayer?: XRWebGLLayer;
2488
- readonly depthFar: number;
2489
- readonly depthNear: number;
2490
- readonly inlineVerticalFieldOfView?: number;
2491
- readonly layers?: XRLayer[];
2487
+ interface XRReferenceSpaceEventHandler {
2488
+ (event: XRReferenceSpaceEvent): any;
2492
2489
  }
2493
2490
 
2494
- // https://immersive-web.github.io/webxr/#dictdef-xrrenderstateinit
2495
- interface XRRenderStateInit {
2496
- baseLayer?: XRWebGLLayer;
2497
- depthFar: number;
2498
- depthNear: number;
2499
- inlineVerticalFieldOfView?: number;
2500
- layers?: XRLayer[];
2491
+ interface XRReferenceSpaceEventMap {
2492
+ reset: XRReferenceSpaceEvent;
2501
2493
  }
2502
2494
 
2495
+ /**
2496
+ * One of several common XRSpaces that applications can use to establish a spatial relationship
2497
+ * with the user's physical environment.
2498
+ *
2499
+ * ref: https://immersive-web.github.io/webxr/#xrreferencespace-interface
2500
+ */
2503
2501
  interface XRReferenceSpace extends XRSpace {
2504
2502
  getOffsetReferenceSpace(originOffset: XRRigidTransform): XRReferenceSpace;
2505
- onreset: XREventHandler;
2503
+ onreset: XRReferenceSpaceEventHandler;
2504
+
2505
+ addEventListener<K extends keyof XRReferenceSpaceEventMap>(
2506
+ type: K,
2507
+ listener: (this: XRReferenceSpace, ev: XRReferenceSpaceEventMap[K]) => any,
2508
+ options?: boolean | AddEventListenerOptions
2509
+ ): void;
2510
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2511
+ removeEventListener<K extends keyof XRReferenceSpaceEventMap>(
2512
+ type: K,
2513
+ listener: (this: XRReferenceSpace, ev: XRReferenceSpaceEventMap[K]) => any,
2514
+ options?: boolean | EventListenerOptions
2515
+ ): void;
2516
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2506
2517
  }
2507
2518
 
2508
- interface XRBoundedReferenceSpace extends XRSpace {
2519
+ abstract class XRReferenceSpace implements XRReferenceSpace {}
2520
+
2521
+ /**
2522
+ * Extends XRReferenceSpace to include boundsGeometry, indicating the pre-configured boundaries
2523
+ * of the user's space.
2524
+ *
2525
+ * ref: https://immersive-web.github.io/webxr/#xrboundedreferencespace-interface
2526
+ */
2527
+ interface XRBoundedReferenceSpace extends XRReferenceSpace {
2509
2528
  readonly boundsGeometry: DOMPointReadOnly[];
2510
2529
  }
2511
2530
 
2531
+ abstract class XRBoundedReferenceSpace implements XRBoundedReferenceSpace {}
2532
+
2533
+ /**
2534
+ * Represents an XR input source, which is any input mechanism which allows the user to perform
2535
+ * targeted actions in the same virtual space as the viewer. Example XR input sources include,
2536
+ * but are not limited to, handheld controllers, optically tracked hands, and gaze-based input
2537
+ * methods that operate on the viewer's pose. Input mechanisms which are not explicitly associated
2538
+ * with the XR device, such as traditional gamepads, mice, or keyboards SHOULD NOT be considered
2539
+ * XR input sources.
2540
+ * ref: https://immersive-web.github.io/webxr/#xrinputsource-interface
2541
+ */
2512
2542
  interface XRInputSource {
2513
2543
  readonly handedness: XRHandedness;
2514
2544
  readonly targetRayMode: XRTargetRayMode;
2515
2545
  readonly targetRaySpace: XRSpace;
2516
- readonly gripSpace?: XRSpace;
2517
- readonly gamepad?: Gamepad;
2518
- readonly profiles: Array<string>;
2519
- readonly hand?: XRHand;
2546
+ readonly gripSpace?: XRSpace | undefined;
2547
+ readonly gamepad?: Gamepad | undefined;
2548
+ readonly profiles: string[];
2549
+ readonly hand?: XRHand | undefined;
2520
2550
  }
2521
2551
 
2522
- interface XRLightEstimate {
2523
- readonly sphericalHarmonicsCoefficients: Float32Array;
2524
- readonly primaryLightDirection: DOMPointReadOnly;
2525
- readonly primaryLightIntensity: DOMPointReadOnly;
2552
+ abstract class XRInputSource implements XRInputSource {}
2553
+
2554
+ /**
2555
+ * Represents a list of XRInputSources. It is used in favor of a frozen array type when the contents
2556
+ * of the list are expected to change over time, such as with the XRSession inputSources attribute.
2557
+ * ref: https://immersive-web.github.io/webxr/#xrinputsourcearray-interface
2558
+ */
2559
+ interface XRInputSourceArray {
2560
+ [Symbol.iterator](): IterableIterator<XRInputSource>;
2561
+ [n: number]: XRInputSource;
2562
+
2563
+ length: number;
2564
+
2565
+ entries(): IterableIterator<[number, XRInputSource]>;
2566
+ keys(): IterableIterator<number>;
2567
+ values(): IterableIterator<XRInputSource>;
2568
+
2569
+ forEach(callbackfn: (value: XRInputSource, index: number, array: XRInputSource[]) => void, thisArg?: any): void;
2526
2570
  }
2527
2571
 
2572
+ abstract class XRInputSourceArray implements XRInputSourceArray {}
2573
+
2574
+ /**
2575
+ * Describes a position and orientation in space relative to an XRSpace.
2576
+ *
2577
+ * ref: https://immersive-web.github.io/webxr/#xrpose-interface
2578
+ */
2528
2579
  interface XRPose {
2529
2580
  readonly transform: XRRigidTransform;
2530
2581
  readonly emulatedPosition: boolean;
2531
- readonly linearVelocity?: DOMPointReadOnly;
2532
- readonly angularVelocity?: DOMPointReadOnly;
2533
2582
  }
2534
2583
 
2535
- interface XRWorldInformation {
2536
- detectedPlanes?: XRPlaneSet;
2537
- }
2584
+ abstract class XRPose implements XRPose {}
2538
2585
 
2586
+ /**
2587
+ * Represents a snapshot of the state of all of the tracked objects for an XRSession. Applications
2588
+ * can acquire an XRFrame by calling requestAnimationFrame() on an XRSession with an
2589
+ * XRFrameRequestCallback. When the callback is called it will be passed an XRFrame.
2590
+ * Events which need to communicate tracking state, such as the select event, will also provide an
2591
+ * XRFrame.
2592
+ *
2593
+ * ref: https://immersive-web.github.io/webxr/#xrframe-interface
2594
+ */
2539
2595
  interface XRFrame {
2540
2596
  readonly session: XRSession;
2597
+ // BABYLON CHANGE - switched to optional
2598
+ readonly predictedDisplayTime?: DOMHighResTimeStamp;
2599
+
2600
+ /**
2601
+ * Provides the pose of space relative to baseSpace as an XRPose, at the time represented by
2602
+ * the XRFrame.
2603
+ *
2604
+ * @param space
2605
+ * @param baseSpace
2606
+ */
2541
2607
  getPose(space: XRSpace, baseSpace: XRSpace): XRPose | undefined;
2542
- fillPoses?(spaces: XRSpace[], baseSpace: XRSpace, transforms: Float32Array): boolean;
2608
+
2609
+ /**
2610
+ * Provides the pose of the viewer relative to referenceSpace as an XRViewerPose, at the
2611
+ * XRFrame's time.
2612
+ *
2613
+ * @param referenceSpace
2614
+ */
2543
2615
  getViewerPose(referenceSpace: XRReferenceSpace): XRViewerPose | undefined;
2616
+ }
2544
2617
 
2545
- // AR
2546
- getHitTestResults(hitTestSource: XRHitTestSource): Array<XRHitTestResult>;
2547
- getHitTestResultsForTransientInput(hitTestSource: XRTransientInputHitTestSource): Array<XRTransientInputHitTestResult>;
2548
- // Anchors
2549
- trackedAnchors?: XRAnchorSet;
2550
- createAnchor?(pose: XRRigidTransform, space: XRSpace): Promise<XRAnchor>;
2551
- // World geometries. DEPRECATED
2552
- worldInformation?: XRWorldInformation;
2553
- detectedPlanes?: XRPlaneSet;
2554
- // Hand tracking
2555
- getJointPose?(joint: XRJointSpace, baseSpace: XRSpace): XRJointPose;
2556
- fillJointRadii?(jointSpaces: XRJointSpace[], radii: Float32Array): boolean;
2557
- // Image tracking
2558
- getImageTrackingResults?(): Array<XRImageTrackingResult>;
2559
- getLightEstimate(xrLightProbe: XRLightProbe): XRLightEstimate;
2618
+ abstract class XRFrame implements XRFrame {}
2619
+
2620
+ /**
2621
+ * Type of XR events available
2622
+ */
2623
+ type XRInputSourceEventType = "select" | "selectend" | "selectstart" | "squeeze" | "squeezeend" | "squeezestart";
2624
+
2625
+ interface XRInputSourceEventInit extends EventInit {
2626
+ frame?: XRFrame | undefined;
2627
+ inputSource?: XRInputSource | undefined;
2560
2628
  }
2561
2629
 
2562
- interface XRInputSourceEvent extends Event {
2630
+ /**
2631
+ * XRInputSourceEvents are fired to indicate changes to the state of an XRInputSource.
2632
+ * ref: https://immersive-web.github.io/webxr/#xrinputsourceevent-interface
2633
+ */
2634
+ class XRInputSourceEvent extends Event {
2635
+ readonly type: XRInputSourceEventType;
2563
2636
  readonly frame: XRFrame;
2564
2637
  readonly inputSource: XRInputSource;
2638
+
2639
+ constructor(type: XRInputSourceEventType, eventInitDict?: XRInputSourceEventInit);
2565
2640
  }
2566
2641
 
2567
- interface XREyeTrackingSourceEvent extends Event {
2568
- readonly gazeSpace: XRSpace;
2642
+ interface XRInputSourceEventHandler {
2643
+ (evt: XRInputSourceEvent): any;
2569
2644
  }
2570
2645
 
2571
- type XRInputSourceArray = XRInputSource[];
2646
+ type XRSessionEventType = "end" | "visibilitychange" | "frameratechange";
2572
2647
 
2573
- type XRDOMOverlayState = {
2574
- /**
2575
- * set if supported, or is null if the feature is not supported
2576
- */
2577
- type: XRDOMOverlayType | null;
2578
- };
2648
+ interface XRSessionEventInit extends EventInit {
2649
+ session: XRSession;
2650
+ }
2579
2651
 
2580
- interface XRLightProbe extends EventTarget {
2581
- readonly probeSpace: XRSpace;
2582
- onreflectionchange: XREventHandler;
2652
+ /**
2653
+ * XRSessionEvents are fired to indicate changes to the state of an XRSession.
2654
+ * ref: https://immersive-web.github.io/webxr/#xrsessionevent-interface
2655
+ */
2656
+ class XRSessionEvent extends Event {
2657
+ readonly session: XRSession;
2658
+ constructor(type: XRSessionEventType, eventInitDict?: XRSessionEventInit);
2583
2659
  }
2584
2660
 
2585
- interface XRSession {
2586
- addEventListener(type: XREventType, listener: XREventHandler, options?: boolean | AddEventListenerOptions): void;
2587
- removeEventListener(type: XREventType, listener: XREventHandler, options?: boolean | EventListenerOptions): void;
2661
+ interface XRSessionEventHandler {
2662
+ (evt: XRSessionEvent): any;
2663
+ }
2664
+
2665
+ /**
2666
+ * ref: https://immersive-web.github.io/webxr/#feature-dependencies
2667
+ */
2668
+ interface XRSessionInit {
2669
+ optionalFeatures?: string[] | undefined;
2670
+ requiredFeatures?: string[] | undefined;
2671
+ }
2672
+
2673
+ interface XRSessionEventMap {
2674
+ inputsourceschange: XRInputSourceChangeEvent;
2675
+ end: XRSessionEvent;
2676
+ visibilitychange: XRSessionEvent;
2677
+ frameratechange: XRSessionEvent;
2678
+ select: XRInputSourceEvent;
2679
+ selectstart: XRInputSourceEvent;
2680
+ selectend: XRInputSourceEvent;
2681
+ squeeze: XRInputSourceEvent;
2682
+ squeezestart: XRInputSourceEvent;
2683
+ squeezeend: XRInputSourceEvent;
2684
+ eyetrackingstart: XREyeTrackingEvent;
2685
+ eyetrackingend: XREyeTrackingEvent;
2686
+ }
2687
+
2688
+ /**
2689
+ * Any interaction with XR hardware is done via an XRSession object, which can only be
2690
+ * retrieved by calling requestSession() on the XRSystem object. Once a session has been
2691
+ * successfully acquired, it can be used to poll the viewer pose, query information about
2692
+ * the user's environment, and present imagery to the user.
2693
+ *
2694
+ * ref: https://immersive-web.github.io/webxr/#xrsession-interface
2695
+ */
2696
+ interface XRSession extends EventTarget {
2588
2697
  /**
2589
2698
  * Returns a list of this session's XRInputSources, each representing an input device
2590
2699
  * used to control the camera and/or scene.
2591
2700
  */
2592
- readonly inputSources: Array<XRInputSource>;
2701
+ readonly inputSources: XRInputSourceArray;
2593
2702
  /**
2594
2703
  * object which contains options affecting how the imagery is rendered.
2595
2704
  * This includes things such as the near and far clipping planes
2596
2705
  */
2597
2706
  readonly renderState: XRRenderState;
2707
+ readonly environmentBlendMode: XREnvironmentBlendMode;
2598
2708
  readonly visibilityState: XRVisibilityState;
2709
+ readonly frameRate?: number | undefined;
2710
+ readonly supportedFrameRates?: Float32Array | undefined;
2711
+
2599
2712
  /**
2600
2713
  * Removes a callback from the animation frame painting callback from
2601
2714
  * XRSession's set of animation frame rendering callbacks, given the
2602
2715
  * identifying handle returned by a previous call to requestAnimationFrame().
2603
2716
  */
2604
- cancelAnimationFrame: (handle: number) => void;
2717
+ cancelAnimationFrame(id: number): void;
2718
+
2605
2719
  /**
2606
2720
  * Ends the WebXR session. Returns a promise which resolves when the
2607
2721
  * session has been shut down.
2608
2722
  */
2609
2723
  end(): Promise<void>;
2724
+
2610
2725
  /**
2611
2726
  * Schedules the specified method to be called the next time the user agent
2612
2727
  * is working on rendering an animation frame for the WebXR device. Returns an
@@ -2614,168 +2729,255 @@ interface XRSession {
2614
2729
  * canceling the callback using cancelAnimationFrame(). This method is comparable
2615
2730
  * to the Window.requestAnimationFrame() method.
2616
2731
  */
2617
- requestAnimationFrame: (callback: XRFrameRequestCallback) => number;
2732
+ requestAnimationFrame(callback: XRFrameRequestCallback): number;
2733
+
2618
2734
  /**
2619
2735
  * Requests that a new XRReferenceSpace of the specified type be created.
2620
2736
  * Returns a promise which resolves with the XRReferenceSpace or
2621
2737
  * XRBoundedReferenceSpace which was requested, or throws a NotSupportedError if
2622
2738
  * the requested space type isn't supported by the device.
2623
2739
  */
2624
- requestReferenceSpace(type: XRReferenceSpaceType): Promise<XRReferenceSpace>;
2625
- requestReferenceSpace(type: XRBoundedReferenceSpaceType): Promise<XRBoundedReferenceSpace>;
2626
-
2627
- /**
2628
- * The XRSession interface is extended with the ability to create new XRLightProbe instances.
2629
- * XRLightProbe instances have a session object, which is the XRSession that created this XRLightProbe.
2630
- *
2631
- * Can reject with with a "NotSupportedError" DOMException
2632
- */
2633
- requestLightProbe(options?: XRLightProbeInit): Promise<XRLightProbe>;
2634
-
2635
- updateRenderState(state: XRRenderStateInit): void;
2636
-
2637
- onend: XREventHandler;
2638
- oneyetrackingstart: XREventHandler;
2639
- oneyetrackingend: XREventHandler;
2640
- oninputsourceschange: XREventHandler;
2641
- onselect: XREventHandler;
2642
- onselectstart: XREventHandler;
2643
- onselectend: XREventHandler;
2644
- onsqueeze: XREventHandler;
2645
- onsqueezestart: XREventHandler;
2646
- onsqueezeend: XREventHandler;
2647
- onvisibilitychange: XREventHandler;
2648
-
2649
- // hit test
2650
- requestHitTestSource?(options: XRHitTestOptionsInit): Promise<XRHitTestSource>;
2651
- requestHitTestSourceForTransientInput?(options: XRTransientInputHitTestOptionsInit): Promise<XRTransientInputHitTestSource>;
2652
-
2653
- // legacy AR hit test
2654
- requestHitTest?(ray: XRRay, referenceSpace: XRReferenceSpace): Promise<XRHitResult[]>;
2740
+ requestReferenceSpace(type: XRReferenceSpaceType): Promise<XRReferenceSpace | XRBoundedReferenceSpace>;
2655
2741
 
2656
- // legacy plane detection
2657
- updateWorldTrackingState?(options: { planeDetectionState?: { enabled: boolean } }): void;
2742
+ updateRenderState(renderStateInit?: XRRenderStateInit): Promise<void>;
2658
2743
 
2659
- // image tracking
2660
- getTrackedImageScores?(): Promise<XRImageTrackingScore[]>;
2744
+ updateTargetFrameRate(rate: number): Promise<void>;
2661
2745
 
2662
- /**
2663
- * Provided when the optional 'dom-overlay' feature is requested.
2664
- */
2665
- readonly domOverlayState?: XRDOMOverlayState;
2666
- /**
2667
- * Indicates the XRReflectionFormat most closely supported by the underlying XR device
2668
- */
2669
- readonly preferredReflectionFormat?: XRReflectionFormat;
2746
+ onend: XRSessionEventHandler;
2747
+ oninputsourceschange: XRInputSourceChangeEventHandler;
2748
+ onselect: XRInputSourceEventHandler;
2749
+ onselectstart: XRInputSourceEventHandler;
2750
+ onselectend: XRInputSourceEventHandler;
2751
+ onsqueeze: XRInputSourceEventHandler;
2752
+ onsqueezestart: XRInputSourceEventHandler;
2753
+ onsqueezeend: XRInputSourceEventHandler;
2754
+ onvisibilitychange: XRSessionEventHandler;
2755
+ onframeratechange: XRSessionEventHandler;
2670
2756
 
2671
- readonly frameRate?: number;
2672
- readonly supportedFrameRates?: Float32Array;
2673
- updateTargetFrameRate(rate: number): Promise<void>;
2757
+ addEventListener<K extends keyof XRSessionEventMap>(type: K, listener: (this: XRSession, ev: XRSessionEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2758
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2759
+ removeEventListener<K extends keyof XRSessionEventMap>(type: K, listener: (this: XRSession, ev: XRSessionEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2760
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2674
2761
  }
2675
2762
 
2763
+ abstract class XRSession implements XRSession {}
2764
+
2765
+ /**
2766
+ * An XRPose describing the state of a viewer of the XR scene as tracked by the XR
2767
+ * device. A viewer may represent a tracked piece of hardware, the observed position
2768
+ * of a user's head relative to the hardware, or some other means of computing a series
2769
+ * of viewpoints into the XR scene. XRViewerPoses can only be queried relative to an
2770
+ * XRReferenceSpace. It provides, in addition to the XRPose values, an array of views
2771
+ * which include rigid transforms to indicate the viewpoint and projection matrices.
2772
+ * These values should be used by the application when rendering a frame of an XR scene.
2773
+ *
2774
+ * ref: https://immersive-web.github.io/webxr/#xrviewerpose-interface
2775
+ */
2676
2776
  interface XRViewerPose extends XRPose {
2677
- readonly views: Array<XRView>;
2777
+ readonly views: ReadonlyArray<XRView>;
2678
2778
  }
2679
2779
 
2780
+ abstract class XRViewerPose implements XRViewerPose {}
2781
+
2782
+ /**
2783
+ * A transform described by a position and orientation. When interpreting an
2784
+ * XRRigidTransform the orientation is always applied prior to the position.
2785
+ *
2786
+ * ref: https://immersive-web.github.io/webxr/#xrrigidtransform-interface
2787
+ */
2680
2788
  class XRRigidTransform {
2789
+ readonly position: DOMPointReadOnly;
2790
+ readonly orientation: DOMPointReadOnly;
2791
+ readonly matrix: Float32Array;
2792
+ readonly inverse: XRRigidTransform;
2793
+
2681
2794
  constructor(position?: DOMPointInit, direction?: DOMPointInit);
2682
- position: DOMPointReadOnly;
2683
- orientation: DOMPointReadOnly;
2684
- matrix: Float32Array;
2685
- inverse: XRRigidTransform;
2686
2795
  }
2687
2796
 
2797
+ /**
2798
+ * Describes a single view into an XR scene for a given frame.
2799
+ *
2800
+ * ref: https://immersive-web.github.io/webxr/#xrview-interface
2801
+ */
2688
2802
  interface XRView {
2689
2803
  readonly eye: XREye;
2690
2804
  readonly projectionMatrix: Float32Array;
2691
2805
  readonly transform: XRRigidTransform;
2692
- readonly recommendedViewportScale?: number;
2806
+ readonly recommendedViewportScale?: number | undefined;
2693
2807
  requestViewportScale(scale: number): void;
2694
2808
  }
2695
2809
 
2696
- interface XRInputSourceChangeEvent extends Event {
2697
- session: XRSession;
2698
- removed: Array<XRInputSource>;
2699
- added: Array<XRInputSource>;
2810
+ abstract class XRView implements XRView {}
2811
+
2812
+ /**
2813
+ * XRInputSourcesChangeEvents are fired to indicate changes to the XRInputSources that are
2814
+ * available to an XRSession.
2815
+ * ref: https://immersive-web.github.io/webxr/#xrinputsourceschangeevent-interface
2816
+ */
2817
+ interface XRInputSourceChangeEvent extends XRSessionEvent {
2818
+ readonly removed: ReadonlyArray<XRInputSource>;
2819
+ readonly added: ReadonlyArray<XRInputSource>;
2820
+ }
2821
+
2822
+ interface XRInputSourceChangeEventHandler {
2823
+ (evt: XRInputSourceChangeEvent): any;
2700
2824
  }
2701
2825
 
2702
2826
  // Experimental/Draft features
2703
- class XRRay {
2704
- constructor(transformOrOrigin: XRRigidTransform | DOMPointInit, direction?: DOMPointInit);
2705
- origin: DOMPointReadOnly;
2706
- direction: DOMPointReadOnly;
2707
- matrix: Float32Array;
2827
+
2828
+ // Anchors
2829
+ type XRAnchorSet = Set<XRAnchor>;
2830
+
2831
+ interface XRAnchor {
2832
+ anchorSpace: XRSpace;
2833
+ delete(): void;
2708
2834
  }
2709
2835
 
2710
- enum XRHitTestTrackableType {
2711
- "point",
2712
- "plane",
2713
- "mesh",
2836
+ abstract class XRAnchor implements XRAnchor {}
2837
+
2838
+ interface XRFrame {
2839
+ trackedAnchors?: XRAnchorSet | undefined;
2840
+ createAnchor?: (pose: XRRigidTransform, space: XRSpace) => Promise<XRAnchor> | undefined;
2714
2841
  }
2715
2842
 
2716
- interface XRHitResult {
2717
- hitMatrix: Float32Array;
2843
+ // AR Hit testing
2844
+ class XRRay {
2845
+ readonly origin: DOMPointReadOnly;
2846
+ readonly direction: DOMPointReadOnly;
2847
+ readonly matrix: Float32Array;
2848
+
2849
+ constructor(transformOrOrigin?: XRRigidTransform | DOMPointInit, direction?: DOMPointInit);
2718
2850
  }
2719
2851
 
2852
+ type XRHitTestTrackableType = "point" | "plane" | "mesh";
2853
+
2720
2854
  interface XRTransientInputHitTestResult {
2721
2855
  readonly inputSource: XRInputSource;
2722
- readonly results: Array<XRHitTestResult>;
2856
+ readonly results: ReadonlyArray<XRHitTestResult>;
2857
+ }
2858
+
2859
+ class XRTransientInputHitTestResult {
2860
+ prototype: XRTransientInputHitTestResult;
2723
2861
  }
2724
2862
 
2725
2863
  interface XRHitTestResult {
2726
2864
  getPose(baseSpace: XRSpace): XRPose | undefined;
2727
2865
  // When anchor system is enabled
2728
- createAnchor?(pose: XRRigidTransform): Promise<XRAnchor>;
2866
+ createAnchor?: (pose: XRRigidTransform) => Promise<XRAnchor> | undefined;
2729
2867
  }
2730
2868
 
2869
+ abstract class XRHitTestResult implements XRHitTestResult {}
2870
+
2731
2871
  interface XRHitTestSource {
2732
2872
  cancel(): void;
2733
2873
  }
2734
2874
 
2875
+ abstract class XRHitTestSource implements XRHitTestSource {}
2876
+
2735
2877
  interface XRTransientInputHitTestSource {
2736
2878
  cancel(): void;
2737
2879
  }
2738
2880
 
2881
+ abstract class XRTransientInputHitTestSource implements XRTransientInputHitTestSource {}
2882
+
2739
2883
  interface XRHitTestOptionsInit {
2740
2884
  space: XRSpace;
2741
- entityTypes?: Array<XRHitTestTrackableType>;
2742
- offsetRay?: XRRay;
2885
+ entityTypes?: XRHitTestTrackableType[] | undefined;
2886
+ offsetRay?: XRRay | undefined;
2743
2887
  }
2744
2888
 
2745
2889
  interface XRTransientInputHitTestOptionsInit {
2746
2890
  profile: string;
2747
- entityTypes?: Array<XRHitTestTrackableType>;
2748
- offsetRay?: XRRay;
2891
+ entityTypes?: XRHitTestTrackableType[] | undefined;
2892
+ offsetRay?: XRRay | undefined;
2749
2893
  }
2750
2894
 
2751
- interface XRAnchor {
2752
- anchorSpace: XRSpace;
2753
- delete(): void;
2895
+ interface XRSession {
2896
+ requestHitTestSource?: (options: XRHitTestOptionsInit) => Promise<XRHitTestSource>;
2897
+ requestHitTestSourceForTransientInput?: (options: XRTransientInputHitTestOptionsInit) => Promise<XRTransientInputHitTestSource>;
2898
+
2899
+ // Legacy
2900
+ requestHitTest?: (ray: XRRay, referenceSpace: XRReferenceSpace) => Promise<XRHitResult[]>;
2901
+ }
2902
+
2903
+ interface XRFrame {
2904
+ getHitTestResults(hitTestSource: XRHitTestSource): XRHitTestResult[];
2905
+ getHitTestResultsForTransientInput(hitTestSource: XRTransientInputHitTestSource): XRTransientInputHitTestResult[];
2906
+ }
2907
+
2908
+ // Legacy
2909
+ interface XRHitResult {
2910
+ hitMatrix: Float32Array;
2754
2911
  }
2755
2912
 
2913
+ // Plane detection
2914
+ type XRPlaneSet = Set<XRPlane>;
2915
+
2916
+ type XRPlaneOrientation = "horizontal" | "vertical";
2917
+
2756
2918
  interface XRPlane {
2757
- orientation: "Horizontal" | "Vertical";
2919
+ orientation: XRPlaneOrientation;
2758
2920
  planeSpace: XRSpace;
2759
- polygon: Array<DOMPointReadOnly>;
2921
+ polygon: DOMPointReadOnly[];
2760
2922
  lastChangedTime: number;
2761
2923
  }
2762
2924
 
2763
- interface XRJointSpace extends XRSpace {}
2925
+ abstract class XRPlane implements XRPlane {}
2926
+
2927
+ interface XRSession {
2928
+ // Legacy
2929
+ updateWorldTrackingState?: (options: { planeDetectionState?: { enabled: boolean } | undefined }) => void | undefined;
2930
+ }
2931
+
2932
+ // interface XRFrame {
2933
+ // worldInformation?:
2934
+ // | {
2935
+ // detectedPlanes?: XRPlaneSet | undefined;
2936
+ // }
2937
+ // | undefined;
2938
+ // }
2939
+
2940
+ // Hand Tracking
2941
+ type XRHandJoint =
2942
+ | "wrist"
2943
+ | "thumb-metacarpal"
2944
+ | "thumb-phalanx-proximal"
2945
+ | "thumb-phalanx-distal"
2946
+ | "thumb-tip"
2947
+ | "index-finger-metacarpal"
2948
+ | "index-finger-phalanx-proximal"
2949
+ | "index-finger-phalanx-intermediate"
2950
+ | "index-finger-phalanx-distal"
2951
+ | "index-finger-tip"
2952
+ | "middle-finger-metacarpal"
2953
+ | "middle-finger-phalanx-proximal"
2954
+ | "middle-finger-phalanx-intermediate"
2955
+ | "middle-finger-phalanx-distal"
2956
+ | "middle-finger-tip"
2957
+ | "ring-finger-metacarpal"
2958
+ | "ring-finger-phalanx-proximal"
2959
+ | "ring-finger-phalanx-intermediate"
2960
+ | "ring-finger-phalanx-distal"
2961
+ | "ring-finger-tip"
2962
+ | "pinky-finger-metacarpal"
2963
+ | "pinky-finger-phalanx-proximal"
2964
+ | "pinky-finger-phalanx-intermediate"
2965
+ | "pinky-finger-phalanx-distal"
2966
+ | "pinky-finger-tip";
2967
+
2968
+ interface XRJointSpace extends XRSpace {
2969
+ readonly jointName: XRHandJoint;
2970
+ }
2971
+
2972
+ abstract class XRJointSpace implements XRJointSpace {}
2764
2973
 
2765
2974
  interface XRJointPose extends XRPose {
2766
- radius: number | undefined;
2975
+ readonly radius: number | undefined;
2767
2976
  }
2768
2977
 
2769
- // to be extended
2770
- type XRHandJoint = string;
2771
-
2772
- interface XRHand extends Iterable<XRJointSpace> {
2773
- readonly size: number;
2774
-
2775
- [index: number]: XRJointSpace;
2776
-
2777
- get(joint: XRHandJoint): XRJointSpace;
2978
+ abstract class XRJointPose implements XRJointPose {}
2778
2979
 
2980
+ interface XRHand extends Map<number, XRJointSpace> {
2779
2981
  readonly WRIST: number;
2780
2982
 
2781
2983
  readonly THUMB_METACARPAL: number;
@@ -2808,6 +3010,381 @@ interface XRHand extends Iterable<XRJointSpace> {
2808
3010
  readonly LITTLE_PHALANX_TIP: number;
2809
3011
  }
2810
3012
 
3013
+ abstract class XRHand extends Map implements XRHand {}
3014
+
3015
+ interface XRFrame {
3016
+ getJointPose?: (joint: XRJointSpace, baseSpace: XRSpace) => XRJointPose | undefined;
3017
+ }
3018
+
3019
+ // WebXR Layers
3020
+
3021
+ /**
3022
+ * The base class for XRWebGLLayer and other layer types introduced by future extensions.
3023
+ * ref: https://immersive-web.github.io/webxr/#xrlayer-interface
3024
+ */
3025
+ // tslint:disable-next-line no-empty-interface
3026
+ interface XRLayer extends EventTarget {}
3027
+
3028
+ abstract class XRLayer implements XRLayer {}
3029
+
3030
+ interface XRWebGLLayerInit {
3031
+ antialias?: boolean | undefined;
3032
+ depth?: boolean | undefined;
3033
+ stencil?: boolean | undefined;
3034
+ alpha?: boolean | undefined;
3035
+ ignoreDepthValues?: boolean | undefined;
3036
+ framebufferScaleFactor?: number | undefined;
3037
+ }
3038
+
3039
+ /**
3040
+ * A layer which provides a WebGL framebuffer to render into, enabling hardware accelerated
3041
+ * rendering of 3D graphics to be presented on the XR device. *
3042
+ * ref: https://immersive-web.github.io/webxr/#xrwebgllayer-interface
3043
+ */
3044
+ class XRWebGLLayer extends XRLayer {
3045
+ static getNativeFramebufferScaleFactor(session: XRSession): number;
3046
+
3047
+ constructor(session: XRSession, context: WebGLRenderingContext | WebGL2RenderingContext, layerInit?: XRWebGLLayerInit);
3048
+
3049
+ readonly antialias: boolean;
3050
+ readonly ignoreDepthValues: boolean;
3051
+ fixedFoveation?: number | undefined;
3052
+
3053
+ readonly framebuffer: WebGLFramebuffer;
3054
+ readonly framebufferWidth: number;
3055
+ readonly framebufferHeight: number;
3056
+
3057
+ getViewport(view: XRView): XRViewport | undefined;
3058
+ }
3059
+
3060
+ interface XRRenderStateInit {
3061
+ layers?: XRLayer[] | undefined;
3062
+ }
3063
+
3064
+ interface XRRenderState {
3065
+ readonly layers?: XRLayer[] | undefined;
3066
+ }
3067
+
3068
+ type XRLayerEventType = "redraw";
3069
+
3070
+ interface XRLayerEvent extends Event {
3071
+ readonly type: XRLayerEventType;
3072
+ readonly layer: XRLayer;
3073
+ }
3074
+
3075
+ interface XRCompositionLayerEventMap {
3076
+ redraw: XRLayerEvent;
3077
+ }
3078
+
3079
+ interface XRCompositionLayer extends XRLayer {
3080
+ readonly layout: XRLayerLayout;
3081
+ blendTextureSourceAlpha: boolean;
3082
+ chromaticAberrationCorrection?: boolean | undefined;
3083
+ readonly mipLevels: number;
3084
+ readonly needsRedraw: boolean;
3085
+ destroy(): void;
3086
+
3087
+ space: XRSpace;
3088
+
3089
+ // Events
3090
+ onredraw: (evt: XRCompositionLayerEventMap["redraw"]) => any;
3091
+
3092
+ addEventListener<K extends keyof XRCompositionLayerEventMap>(
3093
+ this: XRCompositionLayer,
3094
+ type: K,
3095
+ callback: (evt: XRCompositionLayerEventMap[K]) => any,
3096
+ options?: boolean | AddEventListenerOptions
3097
+ ): void;
3098
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
3099
+
3100
+ removeEventListener<K extends keyof XRCompositionLayerEventMap>(this: XRCompositionLayer, type: K, callback: (evt: XRCompositionLayerEventMap[K]) => any): void;
3101
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
3102
+ }
3103
+
3104
+ abstract class XRCompositionLayer implements XRCompositionLayer {}
3105
+
3106
+ type XRTextureType = "texture" | "texture-array";
3107
+
3108
+ type XRLayerLayout = "default" | "mono" | "stereo" | "stereo-left-right" | "stereo-top-bottom";
3109
+
3110
+ interface XRProjectionLayerInit {
3111
+ scaleFactor?: number | undefined;
3112
+ textureType?: XRTextureType | undefined;
3113
+ colorFormat?: GLenum | undefined;
3114
+ depthFormat?: GLenum | undefined;
3115
+ }
3116
+
3117
+ interface XRProjectionLayer extends XRCompositionLayer {
3118
+ readonly textureWidth: number;
3119
+ readonly textureHeight: number;
3120
+ readonly textureArrayLength: number;
3121
+ readonly ignoreDepthValues: number;
3122
+ fixedFoveation: number;
3123
+ }
3124
+
3125
+ abstract class XRProjectionLayer implements XRProjectionLayer {}
3126
+
3127
+ interface XRLayerInit {
3128
+ mipLevels?: number | undefined;
3129
+ viewPixelWidth: number;
3130
+ viewPixelHeight: number;
3131
+ isStatic?: boolean | undefined;
3132
+ colorFormat?: GLenum | undefined;
3133
+ depthFormat?: GLenum | undefined;
3134
+ space: XRSpace;
3135
+ layout?: XRLayerLayout | undefined;
3136
+ }
3137
+
3138
+ interface XRMediaLayerInit {
3139
+ invertStereo?: boolean | undefined;
3140
+ space: XRSpace;
3141
+ layout?: XRLayerLayout | undefined;
3142
+ }
3143
+
3144
+ interface XRCylinderLayerInit extends XRLayerInit {
3145
+ textureType?: XRTextureType | undefined;
3146
+ transform: XRRigidTransform;
3147
+ radius?: number | undefined;
3148
+ centralAngle?: number | undefined;
3149
+ aspectRatio?: number | undefined;
3150
+ }
3151
+
3152
+ interface XRMediaCylinderLayerInit extends XRMediaLayerInit {
3153
+ transform?: XRRigidTransform | undefined;
3154
+ radius?: number | undefined;
3155
+ centralAngle?: number | undefined;
3156
+ aspectRatio?: number | undefined;
3157
+ }
3158
+
3159
+ interface XRCylinderLayer extends XRCompositionLayer {
3160
+ transform: XRRigidTransform;
3161
+ radius: number;
3162
+ centralAngle: number;
3163
+ aspectRatio: number;
3164
+ }
3165
+
3166
+ abstract class XRCylinderLayer implements XRCylinderLayer {}
3167
+
3168
+ interface XRQuadLayerInit extends XRLayerInit {
3169
+ textureType?: XRTextureType | undefined;
3170
+ transform?: XRRigidTransform | undefined;
3171
+ width?: number | undefined;
3172
+ height?: number | undefined;
3173
+ }
3174
+
3175
+ interface XRMediaQuadLayerInit extends XRMediaLayerInit {
3176
+ transform?: XRRigidTransform | undefined;
3177
+ width?: number | undefined;
3178
+ height?: number | undefined;
3179
+ }
3180
+
3181
+ interface XRQuadLayer extends XRCompositionLayer {
3182
+ transform: XRRigidTransform;
3183
+ width: number;
3184
+ height: number;
3185
+ }
3186
+
3187
+ abstract class XRQuadLayer implements XRQuadLayer {}
3188
+
3189
+ interface XREquirectLayerInit extends XRLayerInit {
3190
+ textureType?: XRTextureType | undefined;
3191
+ transform?: XRRigidTransform | undefined;
3192
+ radius?: number | undefined;
3193
+ centralHorizontalAngle?: number | undefined;
3194
+ upperVerticalAngle?: number | undefined;
3195
+ lowerVerticalAngle?: number | undefined;
3196
+ }
3197
+
3198
+ interface XRMediaEquirectLayerInit extends XRMediaLayerInit {
3199
+ transform?: XRRigidTransform | undefined;
3200
+ radius?: number | undefined;
3201
+ centralHorizontalAngle?: number | undefined;
3202
+ upperVerticalAngle?: number | undefined;
3203
+ lowerVerticalAngle?: number | undefined;
3204
+ }
3205
+
3206
+ interface XREquirectLayer extends XRCompositionLayer {
3207
+ transform: XRRigidTransform;
3208
+ radius: number;
3209
+ centralHorizontalAngle: number;
3210
+ upperVerticalAngle: number;
3211
+ lowerVerticalAngle: number;
3212
+ }
3213
+
3214
+ abstract class XREquirectLayer implements XREquirectLayer {}
3215
+
3216
+ interface XRCubeLayerInit extends XRLayerInit {
3217
+ orientation?: DOMPointReadOnly | undefined;
3218
+ }
3219
+
3220
+ interface XRCubeLayer extends XRCompositionLayer {
3221
+ orientation: DOMPointReadOnly;
3222
+ }
3223
+
3224
+ abstract class XRCubeLayer implements XRCubeLayer {}
3225
+
3226
+ interface XRSubImage {
3227
+ readonly viewport: XRViewport;
3228
+ }
3229
+
3230
+ abstract class XRSubImage implements XRSubImage {}
3231
+
3232
+ interface XRWebGLSubImage extends XRSubImage {
3233
+ readonly colorTexture: WebGLTexture;
3234
+ readonly depthStencilTexture: WebGLTexture;
3235
+ readonly imageIndex: number;
3236
+ readonly textureWidth: number;
3237
+ readonly textureHeight: number;
3238
+ }
3239
+
3240
+ abstract class XRWebGLSubImage implements XRWebGLSubImage {}
3241
+
3242
+ class XRWebGLBinding {
3243
+ readonly nativeProjectionScaleFactor: number;
3244
+
3245
+ constructor(session: XRSession, context: WebGLRenderingContext);
3246
+
3247
+ createProjectionLayer(init?: XRProjectionLayerInit): XRProjectionLayer;
3248
+ createQuadLayer(init?: XRQuadLayerInit): XRQuadLayer;
3249
+ createCylinderLayer(init?: XRCylinderLayerInit): XRCylinderLayer;
3250
+ createEquirectLayer(init?: XREquirectLayerInit): XREquirectLayer;
3251
+ createCubeLayer(init?: XRCubeLayerInit): XRCubeLayer;
3252
+
3253
+ getSubImage(layer: XRCompositionLayer, frame: XRFrame, eye?: XREye): XRWebGLSubImage;
3254
+ getViewSubImage(layer: XRProjectionLayer, view: XRView): XRWebGLSubImage;
3255
+
3256
+ // BABYLON addition
3257
+ getReflectionCubeMap: (lightProbe: XRLightProbe) => WebGLTexture;
3258
+ }
3259
+
3260
+ class XRMediaBinding {
3261
+ constructor(sesion: XRSession);
3262
+
3263
+ createQuadLayer(video: HTMLVideoElement, init?: XRMediaQuadLayerInit): XRQuadLayer;
3264
+ createCylinderLayer(video: HTMLVideoElement, init?: XRMediaCylinderLayerInit): XRCylinderLayer;
3265
+ createEquirectLayer(video: HTMLVideoElement, init?: XRMediaEquirectLayerInit): XREquirectLayer;
3266
+ }
3267
+
3268
+ // WebGL extensions
3269
+ interface WebGLRenderingContextBase {
3270
+ getExtension(extensionName: "OCULUS_multiview"): OCULUS_multiview | null;
3271
+ }
3272
+
3273
+ enum XOVR_multiview2 {
3274
+ FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR = 0x9630,
3275
+ FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR = 0x9632,
3276
+ MAX_VIEWS_OVR = 0x9631,
3277
+ FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR = 0x9633,
3278
+ }
3279
+
3280
+ interface OVR_multiview2 {
3281
+ readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR: number;
3282
+ readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR: number;
3283
+ readonly MAX_VIEWS_OVR: number;
3284
+ readonly FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: number;
3285
+
3286
+ framebufferTextureMultiviewOVR(target: GLenum, attachment: GLenum, texture: WebGLTexture, level: number, baseViewIndex: number, numViews: number): WebGLRenderbuffer;
3287
+ }
3288
+
3289
+ abstract class OVR_multiview2 implements OVR_multiview2 {}
3290
+
3291
+ // Oculus extensions
3292
+ interface XRSessionGrant {
3293
+ mode: XRSessionMode;
3294
+ }
3295
+
3296
+ interface XRSystemSessionGrantedEvent extends Event {
3297
+ type: "sessiongranted";
3298
+ session: XRSessionGrant;
3299
+ }
3300
+
3301
+ interface XRSystemSessionGrantedEventHandler {
3302
+ (event: XRSystemSessionGrantedEvent): any;
3303
+ }
3304
+
3305
+ interface XRSystemEventMap {
3306
+ // Session Grant events are an Meta Oculus Browser extension
3307
+ sessiongranted: XRSystemSessionGrantedEvent;
3308
+ }
3309
+
3310
+ interface XRSystem {
3311
+ onsessiongranted: XRSystemSessionGrantedEventHandler | null;
3312
+ }
3313
+
3314
+ interface OCULUS_multiview extends OVR_multiview2 {
3315
+ framebufferTextureMultisampleMultiviewOVR(
3316
+ target: GLenum,
3317
+ attachment: GLenum,
3318
+ texture: WebGLTexture | null,
3319
+ level: GLint,
3320
+ samples: GLsizei,
3321
+ baseViewIndex: GLint,
3322
+ numViews: GLsizei
3323
+ ): void;
3324
+ }
3325
+
3326
+ abstract class OCULUS_multiview implements OCULUS_multiview {}
3327
+
3328
+ /**
3329
+ * BEGIN: WebXR DOM Overlays Module
3330
+ * https://immersive-web.github.io/dom-overlays/
3331
+ */
3332
+
3333
+ interface GlobalEventHandlersEventMap {
3334
+ beforexrselect: XRSessionEvent;
3335
+ }
3336
+
3337
+ interface GlobalEventHandlers {
3338
+ /**
3339
+ * An XRSessionEvent of type beforexrselect is dispatched on the DOM overlay
3340
+ * element before generating a WebXR selectstart input event if the -Z axis
3341
+ * of the input source's targetRaySpace intersects the DOM overlay element
3342
+ * at the time the input device's primary action is triggered.
3343
+ */
3344
+ onbeforexrselect: ((this: GlobalEventHandlers, ev: XRSessionEvent) => any) | null;
3345
+ }
3346
+
3347
+ interface XRDOMOverlayInit {
3348
+ root: Element;
3349
+ }
3350
+
3351
+ interface XRSessionInit {
3352
+ domOverlay?: XRDOMOverlayInit | undefined;
3353
+ }
3354
+
3355
+ type XRDOMOverlayType = "screen" | "floating" | "head-locked";
3356
+
3357
+ interface XRDOMOverlayState {
3358
+ type: XRDOMOverlayType;
3359
+ }
3360
+
3361
+ interface XRSession {
3362
+ readonly domOverlayState?: XRDOMOverlayState | undefined;
3363
+ }
3364
+
3365
+ /// BABYLON EDITS
3366
+ interface XREyeTrackingSourceEvent extends Event {
3367
+ readonly gazeSpace: XRSpace;
3368
+ }
3369
+
3370
+ interface XRFrame {
3371
+ fillPoses?(spaces: XRSpace[], baseSpace: XRSpace, transforms: Float32Array): boolean;
3372
+ // Anchors
3373
+ trackedAnchors?: XRAnchorSet;
3374
+ createAnchor?(pose: XRRigidTransform, space: XRSpace): Promise<XRAnchor>;
3375
+ // World geometries. DEPRECATED
3376
+ worldInformation?: XRWorldInformation;
3377
+ detectedPlanes?: XRPlaneSet;
3378
+ // Hand tracking
3379
+ getJointPose?(joint: XRJointSpace, baseSpace: XRSpace): XRJointPose;
3380
+ fillJointRadii?(jointSpaces: XRJointSpace[], radii: Float32Array): boolean;
3381
+ // Image tracking
3382
+ getImageTrackingResults?(): Array<XRImageTrackingResult>;
3383
+ getLightEstimate(xrLightProbe: XRLightProbe): XRLightEstimate;
3384
+ }
3385
+
3386
+ type XREventType = keyof XRSessionEventMap;
3387
+
2811
3388
  type XRImageTrackingState = "tracked" | "emulated";
2812
3389
  type XRImageTrackingScore = "untrackable" | "trackable";
2813
3390
 
@@ -2822,6 +3399,54 @@ interface XRImageTrackingResult {
2822
3399
  readonly trackingState: XRImageTrackingState;
2823
3400
  readonly measuredWidthInMeters: number;
2824
3401
  }
3402
+
3403
+ interface XRPose {
3404
+ readonly linearVelocity?: DOMPointReadOnly;
3405
+ readonly angularVelocity?: DOMPointReadOnly;
3406
+ }
3407
+
3408
+ type XRLightProbeInit = {
3409
+ reflectionFormat: XRReflectionFormat;
3410
+ };
3411
+
3412
+ type XRReflectionFormat = "srgba8" | "rgba16f";
3413
+
3414
+ interface XRSession {
3415
+ readonly preferredReflectionFormat?: XRReflectionFormat;
3416
+ /**
3417
+ * The XRSession interface is extended with the ability to create new XRLightProbe instances.
3418
+ * XRLightProbe instances have a session object, which is the XRSession that created this XRLightProbe.
3419
+ *
3420
+ * Can reject with with a "NotSupportedError" DOMException
3421
+ */
3422
+ requestLightProbe(options?: XRLightProbeInit): Promise<XRLightProbe>;
3423
+
3424
+ getTrackedImageScores?(): Promise<XRImageTrackingScore[]>;
3425
+ }
3426
+
3427
+ interface XRWorldInformation {
3428
+ detectedPlanes?: XRPlaneSet;
3429
+ }
3430
+
3431
+ interface XRSessionInit {
3432
+ trackedImages?: XRTrackedImageInit[];
3433
+ }
3434
+
3435
+ interface XRLightEstimate {
3436
+ readonly sphericalHarmonicsCoefficients: Float32Array;
3437
+ readonly primaryLightDirection: DOMPointReadOnly;
3438
+ readonly primaryLightIntensity: DOMPointReadOnly;
3439
+ }
3440
+
3441
+ interface XRLightProbe extends EventTarget {
3442
+ readonly probeSpace: XRSpace;
3443
+ onreflectionchange: XREventHandler;
3444
+ }
3445
+
3446
+ /**
3447
+ * END: WebXR DOM Overlays Module
3448
+ * https://immersive-web.github.io/dom-overlays/
3449
+ */
2825
3450
 
2826
3451
  // This file contains native only extensions for WebXR. These APIs are not supported in the browser yet.
2827
3452
  // They are intended for use with either Babylon Native https://github.com/BabylonJS/BabylonNative or