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"; type XREventType = | "devicechange" | "visibilitychange" | "end" | "inputsourceschange" | "select" | "selectstart" | "selectend" | "squeeze" | "squeezestart" | "squeezeend" | "reset"; 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 XRSessionInit { optionalFeatures?: string[]; requiredFeatures?: string[]; } interface XRSession extends XRAnchorCreator { addEventListener: Function; removeEventListener: Function; requestReferenceSpace(type: XRReferenceSpaceType): Promise; updateRenderState(XRRenderStateInit: XRRenderState): Promise; requestAnimationFrame: Function; end(): Promise; renderState: XRRenderState; inputSources: Array; // hit test requestHitTestSource(options: XRHitTestOptionsInit): Promise; requestHitTestSourceForTransientInput(options: XRTransientInputHitTestOptionsInit): Promise; // legacy AR hit test requestHitTest(ray: XRRay, referenceSpace: XRReferenceSpace): Promise; // legacy plane detection 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; // AR getHitTestResults(hitTestSource: XRHitTestSource): Array ; getHitTestResultsForTransientInput(hitTestSource: XRTransientInputHitTestSource): Array; // 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 | DOMPointInit, direction?: DOMPointInit); 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 | DOMPointInit, direction?: DOMPointInit); origin: DOMPointReadOnly; direction: DOMPointReadOnly; matrix: Float32Array; } declare enum XRHitTestTrackableType { "point", "plane" } interface XRHitResult { hitMatrix: Float32Array; } interface XRTransientInputHitTestResult { readonly inputSource: XRInputSource; readonly results: Array; } interface XRHitTestResult { getPose(baseSpace: XRSpace): XRPose | undefined; } interface XRHitTestSource { cancel(): void; } interface XRTransientInputHitTestSource { cancel(): void; } interface XRHitTestOptionsInit { space: XRSpace; entityTypes?: Array; offsetRay?: XRRay; } interface XRTransientInputHitTestOptionsInit { profile: string; entityTypes?: Array; offsetRay?: XRRay; } 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; }