webxr.d.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. /**
  2. * Available session modes
  3. */
  4. type XRSessionMode = "inline" | "immersive-vr" | "immersive-ar";
  5. /**
  6. * Reference space types
  7. */
  8. type XRReferenceSpaceType = "viewer" | "local" | "local-floor" | "bounded-floor" | "unbounded";
  9. type XREnvironmentBlendMode = "opaque" | "additive" | "alpha-blend";
  10. type XRVisibilityState = "visible" | "visible-blurred" | "hidden";
  11. /**
  12. * Handedness types
  13. */
  14. type XRHandedness = "none" | "left" | "right";
  15. /**
  16. * InputSource target ray modes
  17. */
  18. type XRTargetRayMode = "gaze" | "tracked-pointer" | "screen";
  19. /**
  20. * Eye types
  21. */
  22. type XREye = "none" | "left" | "right";
  23. /**
  24. * Type of XR events available
  25. */
  26. type XREventType = "devicechange" | "visibilitychange" | "end" | "inputsourceschange" | "select" | "selectstart" | "selectend" | "squeeze" | "squeezestart" | "squeezeend" | "reset";
  27. type XRFrameRequestCallback = (time: DOMHighResTimeStamp, frame: XRFrame) => void;
  28. type XRPlaneSet = Set<XRPlane>;
  29. type XRAnchorSet = Set<XRAnchor>;
  30. type XREventHandler<T extends Event> = (callback: T) => void;
  31. interface XRLayer extends EventTarget {}
  32. interface XRSessionInit {
  33. optionalFeatures?: string[];
  34. requiredFeatures?: string[];
  35. }
  36. interface XRSessionEvent extends Event {
  37. readonly session: XRSession;
  38. }
  39. interface XRSystem {
  40. isSessionSupported: (sessionMode: XRSessionMode) => Promise<boolean>;
  41. requestSession: (sessionMode: XRSessionMode, sessionInit?: any) => Promise<XRSession>;
  42. }
  43. interface XRViewport {
  44. readonly x: number;
  45. readonly y: number;
  46. readonly width: number;
  47. readonly height: number;
  48. }
  49. interface XRWebGLLayerInit {
  50. antialias?: boolean;
  51. depth?: boolean;
  52. stencil?: boolean;
  53. alpha?: boolean;
  54. multiview?: boolean;
  55. framebufferScaleFactor?: number;
  56. }
  57. declare class XRWebGLLayer {
  58. static getNativeFramebufferScaleFactor(session: XRSession): number;
  59. constructor(session: XRSession, context: WebGLRenderingContext | WebGL2RenderingContext, layerInit?: XRWebGLLayerInit);
  60. readonly antialias: boolean;
  61. readonly framebuffer: WebGLFramebuffer;
  62. readonly framebufferWidth: number;
  63. readonly framebufferHeight: number;
  64. readonly ignoreDepthValues: boolean;
  65. getViewport: (view: XRView) => XRViewport;
  66. }
  67. // tslint:disable-next-line no-empty-interface
  68. interface XRSpace extends EventTarget {}
  69. interface XRRenderState {
  70. readonly baseLayer?: XRWebGLLayer;
  71. readonly depthFar: number;
  72. readonly depthNear: number;
  73. readonly inlineVerticalFieldOfView?: number;
  74. }
  75. interface XRRenderStateInit extends XRRenderState {
  76. baseLayer: XRWebGLLayer;
  77. depthFar: number;
  78. depthNear: number;
  79. inlineVerticalFieldOfView?: number;
  80. layers?: XRLayer[];
  81. }
  82. interface XRReferenceSpace extends XRSpace {
  83. getOffsetReferenceSpace(originOffset: XRRigidTransform): XRReferenceSpace;
  84. onreset: XREventHandler<Event>;
  85. }
  86. interface XRBoundedReferenceSpace extends XRSpace {
  87. readonly boundsGeometry: DOMPointReadOnly[];
  88. }
  89. interface XRInputSource {
  90. readonly handedness: XRHandedness;
  91. readonly targetRayMode: XRTargetRayMode;
  92. readonly targetRaySpace: XRSpace;
  93. readonly gripSpace?: XRSpace;
  94. readonly gamepad?: Gamepad;
  95. readonly profiles: Array<string>;
  96. readonly hand?: XRHand;
  97. }
  98. interface XRPose {
  99. readonly transform: XRRigidTransform;
  100. readonly emulatedPosition: boolean;
  101. }
  102. interface XRFrame {
  103. readonly session: XRSession;
  104. getPose(space: XRSpace, baseSpace: XRSpace): XRPose | undefined;
  105. getViewerPose(referenceSpace: XRReferenceSpace): XRViewerPose | undefined;
  106. // AR
  107. getHitTestResults(hitTestSource: XRHitTestSource): Array<XRHitTestResult>;
  108. getHitTestResultsForTransientInput(hitTestSource: XRTransientInputHitTestSource): Array<XRTransientInputHitTestResult>;
  109. // Anchors
  110. trackedAnchors?: XRAnchorSet;
  111. createAnchor?(pose: XRRigidTransform, space: XRSpace): Promise<XRAnchor>;
  112. // Planes
  113. worldInformation?: {
  114. detectedPlanes?: XRPlaneSet;
  115. };
  116. // Hand tracking
  117. getJointPose?(joint: XRJointSpace, baseSpace: XRSpace): XRJointPose;
  118. }
  119. interface XRInputSourceEvent extends Event {
  120. readonly frame: XRFrame;
  121. readonly inputSource: XRInputSource;
  122. }
  123. type XRInputSourceArray = XRInputSource[];
  124. interface XRSession {
  125. addEventListener<T extends Event>(type: XREventType, listener: XREventHandler<T>, options?: boolean | AddEventListenerOptions): void;
  126. removeEventListener<T extends Event>(type: XREventType, listener: XREventHandler<T>, options?: boolean | EventListenerOptions): void;
  127. /**
  128. * Returns a list of this session's XRInputSources, each representing an input device
  129. * used to control the camera and/or scene.
  130. */
  131. readonly inputSources: Array<XRInputSource>;
  132. /**
  133. * object which contains options affecting how the imagery is rendered.
  134. * This includes things such as the near and far clipping planes
  135. */
  136. readonly renderState: XRRenderState;
  137. readonly visibilityState: XRVisibilityState;
  138. /**
  139. * Removes a callback from the animation frame painting callback from
  140. * XRSession's set of animation frame rendering callbacks, given the
  141. * identifying handle returned by a previous call to requestAnimationFrame().
  142. */
  143. cancelAnimationFrame: (handle: number) => void;
  144. /**
  145. * Ends the WebXR session. Returns a promise which resolves when the
  146. * session has been shut down.
  147. */
  148. end(): Promise<void>;
  149. /**
  150. * Schedules the specified method to be called the next time the user agent
  151. * is working on rendering an animation frame for the WebXR device. Returns an
  152. * integer value which can be used to identify the request for the purposes of
  153. * canceling the callback using cancelAnimationFrame(). This method is comparable
  154. * to the Window.requestAnimationFrame() method.
  155. */
  156. requestAnimationFrame: XRFrameRequestCallback;
  157. /**
  158. * Requests that a new XRReferenceSpace of the specified type be created.
  159. * Returns a promise which resolves with the XRReferenceSpace or
  160. * XRBoundedReferenceSpace which was requested, or throws a NotSupportedError if
  161. * the requested space type isn't supported by the device.
  162. */
  163. requestReferenceSpace(type: XRReferenceSpaceType): Promise<XRReferenceSpace | XRBoundedReferenceSpace>;
  164. updateRenderState(XRRenderStateInit: XRRenderState): Promise<void>;
  165. onend: XREventHandler<XRSessionEvent>;
  166. oninputsourceschange: XREventHandler<XRInputSourceChangeEvent>;
  167. onselect: XREventHandler<XRInputSourceEvent>;
  168. onselectstart: XREventHandler<XRInputSourceEvent>;
  169. onselectend: XREventHandler<XRInputSourceEvent>;
  170. onsqueeze: XREventHandler<XRInputSourceEvent>;
  171. onsqueezestart: XREventHandler<XRInputSourceEvent>;
  172. onsqueezeend: XREventHandler<XRInputSourceEvent>;
  173. onvisibilitychange: XREventHandler<Event>;
  174. // hit test
  175. requestHitTestSource?(options: XRHitTestOptionsInit): Promise<XRHitTestSource>;
  176. requestHitTestSourceForTransientInput?(options: XRTransientInputHitTestOptionsInit): Promise<XRTransientInputHitTestSource>;
  177. // legacy AR hit test
  178. requestHitTest?(ray: XRRay, referenceSpace: XRReferenceSpace): Promise<XRHitResult[]>;
  179. // legacy plane detection
  180. updateWorldTrackingState?(options: { planeDetectionState?: { enabled: boolean } }): void;
  181. }
  182. interface XRViewerPose extends XRPose {
  183. readonly views: Array<XRView>;
  184. }
  185. declare class XRRigidTransform {
  186. constructor(position?: DOMPointInit, direction?: DOMPointInit);
  187. position: DOMPointReadOnly;
  188. orientation: DOMPointReadOnly;
  189. matrix: Float32Array;
  190. inverse: XRRigidTransform;
  191. }
  192. interface XRView {
  193. readonly eye: XREye;
  194. readonly projectionMatrix: Float32Array;
  195. readonly transform: XRRigidTransform;
  196. readonly recommendedViewportScale?: number;
  197. requestViewportScale(scale: number): void;
  198. }
  199. interface XRInputSourceChangeEvent extends Event {
  200. session: XRSession;
  201. removed: Array<XRInputSource>;
  202. added: Array<XRInputSource>;
  203. }
  204. // Experimental/Draft features
  205. declare class XRRay {
  206. constructor(transformOrOrigin: XRRigidTransform | DOMPointInit, direction?: DOMPointInit);
  207. origin: DOMPointReadOnly;
  208. direction: DOMPointReadOnly;
  209. matrix: Float32Array;
  210. }
  211. declare enum XRHitTestTrackableType {
  212. "point",
  213. "plane",
  214. "mesh",
  215. }
  216. interface XRHitResult {
  217. hitMatrix: Float32Array;
  218. }
  219. interface XRTransientInputHitTestResult {
  220. readonly inputSource: XRInputSource;
  221. readonly results: Array<XRHitTestResult>;
  222. }
  223. interface XRHitTestResult {
  224. getPose(baseSpace: XRSpace): XRPose | undefined;
  225. // When anchor system is enabled
  226. createAnchor?(pose: XRRigidTransform): Promise<XRAnchor>;
  227. }
  228. interface XRHitTestSource {
  229. cancel(): void;
  230. }
  231. interface XRTransientInputHitTestSource {
  232. cancel(): void;
  233. }
  234. interface XRHitTestOptionsInit {
  235. space: XRSpace;
  236. entityTypes?: Array<XRHitTestTrackableType>;
  237. offsetRay?: XRRay;
  238. }
  239. interface XRTransientInputHitTestOptionsInit {
  240. profile: string;
  241. entityTypes?: Array<XRHitTestTrackableType>;
  242. offsetRay?: XRRay;
  243. }
  244. interface XRAnchor {
  245. anchorSpace: XRSpace;
  246. delete(): void;
  247. }
  248. interface XRPlane {
  249. orientation: "Horizontal" | "Vertical";
  250. planeSpace: XRSpace;
  251. polygon: Array<DOMPointReadOnly>;
  252. lastChangedTime: number;
  253. }
  254. interface XRJointSpace extends XRSpace {}
  255. interface XRJointPose extends XRPose {
  256. radius: number | undefined;
  257. }
  258. interface XRHand extends Iterable<XRJointSpace> {
  259. readonly length: number;
  260. [index: number]: XRJointSpace;
  261. readonly WRIST: number;
  262. readonly THUMB_METACARPAL: number;
  263. readonly THUMB_PHALANX_PROXIMAL: number;
  264. readonly THUMB_PHALANX_DISTAL: number;
  265. readonly THUMB_PHALANX_TIP: number;
  266. readonly INDEX_METACARPAL: number;
  267. readonly INDEX_PHALANX_PROXIMAL: number;
  268. readonly INDEX_PHALANX_INTERMEDIATE: number;
  269. readonly INDEX_PHALANX_DISTAL: number;
  270. readonly INDEX_PHALANX_TIP: number;
  271. readonly MIDDLE_METACARPAL: number;
  272. readonly MIDDLE_PHALANX_PROXIMAL: number;
  273. readonly MIDDLE_PHALANX_INTERMEDIATE: number;
  274. readonly MIDDLE_PHALANX_DISTAL: number;
  275. readonly MIDDLE_PHALANX_TIP: number;
  276. readonly RING_METACARPAL: number;
  277. readonly RING_PHALANX_PROXIMAL: number;
  278. readonly RING_PHALANX_INTERMEDIATE: number;
  279. readonly RING_PHALANX_DISTAL: number;
  280. readonly RING_PHALANX_TIP: number;
  281. readonly LITTLE_METACARPAL: number;
  282. readonly LITTLE_PHALANX_PROXIMAL: number;
  283. readonly LITTLE_PHALANX_INTERMEDIATE: number;
  284. readonly LITTLE_PHALANX_DISTAL: number;
  285. readonly LITTLE_PHALANX_TIP: number;
  286. }