type XRSessionMode = | "inline" | "immersive-vr" | "immersive-ar"; type XRReferenceSpaceType = | "viewer" | "local" | "local-floor" | "bounded-floor" | "unbounded"; type XREnvironmentBlendMode = | "opaque" | "additive" | "alpha-blend"; type XRVisibilityState = | "visible" | "visible-blurred" | "hidden"; type XRHandedness = | "none" | "left" | "right"; type XRTargetRayMode = | "gaze" | "tracked-pointer" | "screen"; type XREye = | "none" | "left" | "right"; interface XRSpace extends EventTarget { } interface XRRenderState { depthNear?: number; depthFar?: number; inlineVerticalFieldOfView?: number; baseLayer?: XRWebGLLayer; } interface XRInputSource { handedness: XRHandedness; targetRayMode: XRTargetRayMode; targetRaySpace: XRSpace; gripSpace: XRSpace | undefined; gamepad: Gamepad | undefined; profiles: Array; } interface XRSession extends XRAnchorCreator { addEventListener: Function; removeEventListener: Function; requestReferenceSpace(type: XRReferenceSpaceType): Promise; updateRenderState(XRRenderStateInit: XRRenderState): Promise; requestAnimationFrame: Function; end(): Promise; renderState: XRRenderState; inputSources: Array; // AR hit test requestHitTest(ray: XRRay, referenceSpace: XRReferenceSpace): Promise; updateWorldTrackingState(options: { planeDetectionState?: { enabled: boolean; } }): void; } interface XRReferenceSpace extends XRSpace { getOffsetReferenceSpace(originOffset: XRRigidTransform): XRReferenceSpace; onreset: any; } type XRPlaneSet = Set; type XRAnchorSet = Set; interface XRFrame { session: XRSession; getViewerPose(referenceSpace: XRReferenceSpace): XRViewerPose | undefined; getPose(space: XRSpace, baseSpace: XRSpace): XRPose | undefined; // Anchors trackedAnchors?: XRAnchorSet; // Planes worldInformation: { detectedPlanes?: XRPlaneSet; }; } interface XRViewerPose extends XRPose { views: Array; } interface XRPose { transform: XRRigidTransform; emulatedPosition: boolean; } interface XRWebGLLayerOptions { antialias?: boolean; depth?: boolean; stencil?: boolean; alpha?: boolean; multiview?: boolean; framebufferScaleFactor?: number; } declare var XRWebGLLayer: { prototype: XRWebGLLayer; new(session: XRSession, context: WebGLRenderingContext | undefined, options?: XRWebGLLayerOptions): XRWebGLLayer; }; interface XRWebGLLayer { framebuffer: WebGLFramebuffer; framebufferWidth: number; framebufferHeight: number; getViewport: Function; } declare class XRRigidTransform { constructor(matrix: Float32Array); position: DOMPointReadOnly; orientation: DOMPointReadOnly; matrix: Float32Array; inverse: XRRigidTransform; } interface XRView { eye: XREye; projectionMatrix: Float32Array; transform: XRRigidTransform; } interface XRInputSourceChangeEvent { session: XRSession; removed: Array; added: Array; } interface XRInputSourceEvent extends Event { readonly frame: XRFrame; readonly inputSource: XRInputSource; } // Experimental(er) features declare class XRRay { constructor(transformOrOrigin: XRRigidTransform | DOMPointReadOnly, direction?: DOMPointReadOnly); origin: DOMPointReadOnly; direction: DOMPointReadOnly; matrix: Float32Array; } interface XRHitResult { hitMatrix: Float32Array; } interface XRAnchor { // remove? id?: string; anchorSpace: XRSpace; lastChangedTime: number; detach(): void; } interface XRPlane extends XRAnchorCreator { orientation: "Horizontal" | "Vertical"; planeSpace: XRSpace; polygon: Array; lastChangedTime: number; } interface XRAnchorCreator { // AR Anchors createAnchor(pose: XRPose | XRRigidTransform, referenceSpace: XRReferenceSpace): Promise; }