webxr.d.ts 11 KB

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