@galacean/engine-xr 1.6.8 → 1.6.9

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 (47) hide show
  1. package/dist/browser.js +1630 -0
  2. package/dist/browser.js.map +1 -0
  3. package/dist/browser.min.js +2 -0
  4. package/dist/browser.min.js.map +1 -0
  5. package/dist/main.js +1626 -0
  6. package/dist/main.js.map +1 -0
  7. package/dist/module.js +1598 -0
  8. package/dist/module.js.map +1 -0
  9. package/package.json +4 -4
  10. package/types/XRManagerExtended.d.ts +62 -0
  11. package/types/XRPose.d.ts +15 -0
  12. package/types/feature/XRFeature.d.ts +16 -0
  13. package/types/feature/XRFeatureType.d.ts +6 -0
  14. package/types/feature/camera/XRCameraManager.d.ts +26 -0
  15. package/types/feature/hitTest/TrackableType.d.ts +10 -0
  16. package/types/feature/hitTest/XRHitResult.d.ts +19 -0
  17. package/types/feature/hitTest/XRHitTest.d.ts +40 -0
  18. package/types/feature/trackable/XRRequestTracking.d.ts +1 -0
  19. package/types/feature/trackable/XRRequestTrackingState.d.ts +8 -0
  20. package/types/feature/trackable/XRTrackableFeature.d.ts +35 -0
  21. package/types/feature/trackable/XRTracked.d.ts +14 -0
  22. package/types/feature/trackable/anchor/XRAnchor.d.ts +6 -0
  23. package/types/feature/trackable/anchor/XRAnchorTracking.d.ts +38 -0
  24. package/types/feature/trackable/anchor/XRRequestAnchor.d.ts +16 -0
  25. package/types/feature/trackable/image/XRImageTracking.d.ts +25 -0
  26. package/types/feature/trackable/image/XRReferenceImage.d.ts +16 -0
  27. package/types/feature/trackable/image/XRRequestImage.d.ts +14 -0
  28. package/types/feature/trackable/image/XRTrackedImage.d.ts +12 -0
  29. package/types/feature/trackable/plane/XRPlaneMode.d.ts +13 -0
  30. package/types/feature/trackable/plane/XRPlaneTracking.d.ts +24 -0
  31. package/types/feature/trackable/plane/XRRequestPlane.d.ts +13 -0
  32. package/types/feature/trackable/plane/XRTrackedPlane.d.ts +21 -0
  33. package/types/index.d.ts +32 -0
  34. package/types/input/XRCamera.d.ts +15 -0
  35. package/types/input/XRController.d.ts +38 -0
  36. package/types/input/XRInput.d.ts +8 -0
  37. package/types/input/XRInputButton.d.ts +19 -0
  38. package/types/input/XRInputEventType.d.ts +8 -0
  39. package/types/input/XRInputManager.d.ts +32 -0
  40. package/types/input/XRTargetRayMode.d.ts +5 -0
  41. package/types/input/XRTrackedInputDevice.d.ts +21 -0
  42. package/types/input/XRTrackingState.d.ts +11 -0
  43. package/types/loader/XRReferenceImageDecoder.d.ts +5 -0
  44. package/types/loader/XRReferenceImageLoader.d.ts +5 -0
  45. package/types/session/XRSessionManager.d.ts +56 -0
  46. package/types/session/XRSessionMode.d.ts +8 -0
  47. package/types/session/XRSessionState.d.ts +15 -0
@@ -0,0 +1,1630 @@
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@galacean/engine')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', '@galacean/engine'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.Galacean = global.Galacean || {}, global.Galacean.XR = {}), global.Galacean));
5
+ })(this, (function (exports, engine) { 'use strict';
6
+
7
+ function _is_native_reflect_construct() {
8
+ // Since Reflect.construct can't be properly polyfilled, some
9
+ // implementations (e.g. core-js@2) don't set the correct internal slots.
10
+ // Those polyfills don't allow us to subclass built-ins, so we need to
11
+ // use our fallback implementation.
12
+ try {
13
+ // If the internal slots aren't set, this throws an error similar to
14
+ // TypeError: this is not a Boolean object.
15
+ var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
16
+ } catch (_) {}
17
+ return (_is_native_reflect_construct = function() {
18
+ return !!result;
19
+ })();
20
+ }
21
+
22
+ function _set_prototype_of(o, p) {
23
+ _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {
24
+ o.__proto__ = p;
25
+
26
+ return o;
27
+ };
28
+
29
+ return _set_prototype_of(o, p);
30
+ }
31
+
32
+ function _construct(Parent, args, Class) {
33
+ if (_is_native_reflect_construct()) _construct = Reflect.construct;
34
+ else {
35
+ _construct = function construct(Parent, args, Class) {
36
+ var a = [null];
37
+ a.push.apply(a, args);
38
+ var Constructor = Function.bind.apply(Parent, a);
39
+ var instance = new Constructor();
40
+
41
+ if (Class) _set_prototype_of(instance, Class.prototype);
42
+
43
+ return instance;
44
+ };
45
+ }
46
+
47
+ return _construct.apply(null, arguments);
48
+ }
49
+
50
+ function _defineProperties(target, props) {
51
+ for (var i = 0; i < props.length; i++) {
52
+ var descriptor = props[i];
53
+ descriptor.enumerable = descriptor.enumerable || false;
54
+ descriptor.configurable = true;
55
+
56
+ if ("value" in descriptor) descriptor.writable = true;
57
+
58
+ Object.defineProperty(target, descriptor.key, descriptor);
59
+ }
60
+ }
61
+ function _create_class(Constructor, protoProps, staticProps) {
62
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
63
+ if (staticProps) _defineProperties(Constructor, staticProps);
64
+
65
+ return Constructor;
66
+ }
67
+
68
+ function _inherits(subClass, superClass) {
69
+ if (typeof superClass !== "function" && superClass !== null) {
70
+ throw new TypeError("Super expression must either be null or a function");
71
+ }
72
+
73
+ subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });
74
+
75
+ if (superClass) _set_prototype_of(subClass, superClass);
76
+ }
77
+
78
+ function _instanceof(left, right) {
79
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
80
+ return !!right[Symbol.hasInstance](left);
81
+ } else return left instanceof right;
82
+ }
83
+
84
+ /**
85
+ * Enumerates some input devices that can be tracked.(including status, posture and other information)
86
+ */ var XRTrackedInputDevice = /*#__PURE__*/ function(XRTrackedInputDevice) {
87
+ /** Controller */ XRTrackedInputDevice[XRTrackedInputDevice["Controller"] = 0] = "Controller";
88
+ /** Left controller */ XRTrackedInputDevice[XRTrackedInputDevice["LeftController"] = 1] = "LeftController";
89
+ /** Right controller */ XRTrackedInputDevice[XRTrackedInputDevice["RightController"] = 2] = "RightController";
90
+ /** Camera */ XRTrackedInputDevice[XRTrackedInputDevice["Camera"] = 3] = "Camera";
91
+ /** Left camera */ XRTrackedInputDevice[XRTrackedInputDevice["LeftCamera"] = 4] = "LeftCamera";
92
+ /** Right camera */ XRTrackedInputDevice[XRTrackedInputDevice["RightCamera"] = 5] = "RightCamera";
93
+ /** Head */ XRTrackedInputDevice[XRTrackedInputDevice["LeftHand"] = 6] = "LeftHand";
94
+ /** Right hand */ XRTrackedInputDevice[XRTrackedInputDevice["RightHand"] = 7] = "RightHand";
95
+ return XRTrackedInputDevice;
96
+ }({});
97
+
98
+ /**
99
+ * The state of an XRSession.
100
+ */ var XRSessionState = /*#__PURE__*/ function(XRSessionState) {
101
+ /** Not initialized. */ XRSessionState[XRSessionState["None"] = 0] = "None";
102
+ /** Initializing session. */ XRSessionState[XRSessionState["Initializing"] = 1] = "Initializing";
103
+ /** Initialized but not started. */ XRSessionState[XRSessionState["Initialized"] = 2] = "Initialized";
104
+ /** Running. */ XRSessionState[XRSessionState["Running"] = 3] = "Running";
105
+ /** Paused. */ XRSessionState[XRSessionState["Paused"] = 4] = "Paused";
106
+ return XRSessionState;
107
+ }({});
108
+
109
+ /**
110
+ * The manager of XR camera.
111
+ */ var XRCameraManager = /*#__PURE__*/ function() {
112
+ function XRCameraManager(_xrManager) {
113
+ this._xrManager = _xrManager;
114
+ }
115
+ var _proto = XRCameraManager.prototype;
116
+ /**
117
+ * Attach the camera to the specified input type(Camera, LeftCamera or RightCamera).
118
+ * The camera entity need to be moved to the XROrigin entity.
119
+ * @param type - The input type
120
+ * @param camera - The camera to be attached
121
+ */ _proto.attachCamera = function attachCamera(type, camera) {
122
+ var xrCamera = this._xrManager.inputManager.getTrackedDevice(type);
123
+ var preCamera = xrCamera._camera;
124
+ if (preCamera !== camera) {
125
+ // @ts-ignore
126
+ preCamera && (preCamera._cameraType = engine.CameraType.Normal);
127
+ switch(type){
128
+ case XRTrackedInputDevice.Camera:
129
+ // @ts-ignore
130
+ camera._cameraType = engine.CameraType.XRCenterCamera;
131
+ break;
132
+ case XRTrackedInputDevice.LeftCamera:
133
+ // @ts-ignore
134
+ camera._cameraType = engine.CameraType.XRLeftCamera;
135
+ break;
136
+ case XRTrackedInputDevice.RightCamera:
137
+ // @ts-ignore
138
+ camera._cameraType = engine.CameraType.XRRightCamera;
139
+ break;
140
+ }
141
+ xrCamera._camera = camera;
142
+ }
143
+ };
144
+ /**
145
+ * Detach the camera from the specified input type.
146
+ * @param type - The input type
147
+ * @returns The camera that was detached
148
+ */ _proto.detachCamera = function detachCamera(type) {
149
+ var xrCamera = this._xrManager.inputManager.getTrackedDevice(type);
150
+ var preCamera = xrCamera._camera;
151
+ // @ts-ignore
152
+ preCamera && (preCamera._cameraType = engine.CameraType.Normal);
153
+ xrCamera._camera = null;
154
+ return preCamera;
155
+ };
156
+ /**
157
+ * @internal
158
+ */ _proto._onSessionStart = function _onSessionStart() {};
159
+ /**
160
+ * @internal
161
+ */ _proto._onUpdate = function _onUpdate() {
162
+ var cameras = this._xrManager.inputManager._cameras;
163
+ var platformSession = this._xrManager.sessionManager._platformSession;
164
+ for(var i = 0, n = cameras.length; i < n; i++){
165
+ var cameraDevice = cameras[i];
166
+ var camera = cameraDevice._camera;
167
+ if (!camera) continue;
168
+ // sync position and rotation
169
+ var transform = camera.entity.transform;
170
+ var pose = cameraDevice.pose;
171
+ transform.position = pose.position;
172
+ transform.rotationQuaternion = pose.rotation;
173
+ // sync viewport
174
+ var viewport = camera.viewport;
175
+ var _cameraDevice_viewport = cameraDevice.viewport, x = _cameraDevice_viewport.x, y = _cameraDevice_viewport.y, width = _cameraDevice_viewport.width, height = _cameraDevice_viewport.height;
176
+ if (!(x === viewport.x && y === viewport.y && width === viewport.z && height === viewport.w)) {
177
+ camera.viewport = viewport.set(x, y, width, height);
178
+ }
179
+ // sync project matrix
180
+ if (!engine.Matrix.equals(camera.projectionMatrix, cameraDevice.projectionMatrix)) {
181
+ camera.projectionMatrix = cameraDevice.projectionMatrix;
182
+ }
183
+ // sync pixel viewport (only when rendering to XR main framebuffer)
184
+ if (!camera.renderTarget) {
185
+ // @ts-ignore
186
+ camera._adjustPixelViewport(platformSession.framebufferWidth, platformSession.framebufferHeight);
187
+ }
188
+ }
189
+ };
190
+ /**
191
+ * @internal
192
+ */ _proto._onSessionExit = function _onSessionExit() {
193
+ var cameras = this._xrManager.inputManager._cameras;
194
+ for(var i = 0, n = cameras.length; i < n; i++){
195
+ var // @ts-ignore
196
+ _cameras_i__camera;
197
+ (_cameras_i__camera = cameras[i]._camera) == null ? void 0 : _cameras_i__camera._updatePixelViewport();
198
+ }
199
+ };
200
+ /**
201
+ * @internal
202
+ */ _proto._getIgnoreClearFlags = function _getIgnoreClearFlags(cameraType) {
203
+ if (cameraType === engine.CameraType.XRCenterCamera) {
204
+ if (this._xrManager.sessionManager.state === XRSessionState.Running) {
205
+ return engine.CameraClearFlags.Color;
206
+ } else {
207
+ return engine.CameraClearFlags.None;
208
+ }
209
+ } else {
210
+ return engine.CameraClearFlags.None;
211
+ }
212
+ };
213
+ /**
214
+ * @internal
215
+ */ _proto._onDestroy = function _onDestroy() {};
216
+ _create_class(XRCameraManager, [
217
+ {
218
+ key: "fixedFoveation",
219
+ get: /**
220
+ * The fixed foveation of the camera.
221
+ */ function get() {
222
+ var _this__xrManager_sessionManager = this._xrManager.sessionManager, platformSession = _this__xrManager_sessionManager._platformSession;
223
+ if (platformSession) {
224
+ return platformSession.getFixedFoveation();
225
+ } else {
226
+ throw new Error("XR session is not available.");
227
+ }
228
+ },
229
+ set: function set(value) {
230
+ var _this__xrManager_sessionManager = this._xrManager.sessionManager, platformSession = _this__xrManager_sessionManager._platformSession;
231
+ if (platformSession) {
232
+ platformSession.setFixedFoveation(value);
233
+ } else {
234
+ throw new Error("XR session is not available.");
235
+ }
236
+ }
237
+ }
238
+ ]);
239
+ return XRCameraManager;
240
+ }();
241
+
242
+ /**
243
+ * Data for describing pose in the XR space.
244
+ */ var XRPose = function XRPose() {
245
+ /** The position of the pose in XR space. */ this.position = new engine.Vector3();
246
+ /** The rotation of the pose in XR space. */ this.rotation = new engine.Quaternion();
247
+ /** The matrix of the pose in XR space. */ this.matrix = new engine.Matrix();
248
+ /** The inverse matrix of the pose in XR space. */ this.inverseMatrix = new engine.Matrix();
249
+ };
250
+
251
+ /**
252
+ * Enum for XR tracking state.
253
+ */ var XRTrackingState = /*#__PURE__*/ function(XRTrackingState) {
254
+ /** Not tracking */ XRTrackingState[XRTrackingState["NotTracking"] = 0] = "NotTracking";
255
+ /** Tracking */ XRTrackingState[XRTrackingState["Tracking"] = 1] = "Tracking";
256
+ /** Lost track */ XRTrackingState[XRTrackingState["TrackingLost"] = 2] = "TrackingLost";
257
+ return XRTrackingState;
258
+ }({});
259
+
260
+ var XRInput = function XRInput(type) {
261
+ this.type = type;
262
+ this./** The tracking state of xr input. */ trackingState = XRTrackingState.NotTracking;
263
+ };
264
+
265
+ /**
266
+ * The XR camera.
267
+ */ var XRCamera = /*#__PURE__*/ function(XRInput) {
268
+ _inherits(XRCamera, XRInput);
269
+ function XRCamera() {
270
+ var _this;
271
+ _this = XRInput.apply(this, arguments) || this, /** The pose of the camera in XR space. */ _this.pose = new XRPose(), /** The viewport of the camera. */ _this.viewport = new engine.Rect(), /** The projection matrix of the camera. */ _this.projectionMatrix = new engine.Matrix();
272
+ return _this;
273
+ }
274
+ return XRCamera;
275
+ }(XRInput);
276
+
277
+ /**
278
+ * Enum for XR input button.
279
+ */ var XRInputButton = /*#__PURE__*/ function(XRInputButton) {
280
+ /** None */ XRInputButton[XRInputButton["None"] = 0] = "None";
281
+ /** Select */ XRInputButton[XRInputButton["Select"] = 1] = "Select";
282
+ /** Select */ XRInputButton[XRInputButton["Trigger"] = 1] = "Trigger";
283
+ /** Squeeze */ XRInputButton[XRInputButton["Squeeze"] = 2] = "Squeeze";
284
+ /** TouchPad */ XRInputButton[XRInputButton["TouchPad"] = 4] = "TouchPad";
285
+ /** A */ XRInputButton[XRInputButton["AButton"] = 8] = "AButton";
286
+ /** B */ XRInputButton[XRInputButton["BButton"] = 16] = "BButton";
287
+ return XRInputButton;
288
+ }({});
289
+
290
+ /**
291
+ * The XR controller.
292
+ */ var XRController = /*#__PURE__*/ function(XRInput) {
293
+ _inherits(XRController, XRInput);
294
+ function XRController() {
295
+ var _this;
296
+ _this = XRInput.apply(this, arguments) || this, /** The grip space pose of the controller in XR space. */ _this.gripPose = new XRPose(), /** The target ray space pose of the controller in XR space. */ _this.targetRayPose = new XRPose(), /** The currently pressed buttons of this controller. */ _this.pressedButtons = XRInputButton.None, /** Record button lifted. */ _this.down = XRInputButton.None, /** Record button pressed. */ _this.up = XRInputButton.None;
297
+ return _this;
298
+ }
299
+ var _proto = XRController.prototype;
300
+ /**
301
+ *
302
+ * Returns whether the button is pressed.
303
+ * @param button - The button to check
304
+ * @returns Whether the button is pressed
305
+ */ _proto.isButtonDown = function isButtonDown(button) {
306
+ return (this.down & button) !== 0;
307
+ };
308
+ /**
309
+ * Returns whether the button is lifted.
310
+ * @param button - The button to check
311
+ * @returns Whether the button is lifted
312
+ */ _proto.isButtonUp = function isButtonUp(button) {
313
+ return (this.up & button) !== 0;
314
+ };
315
+ /**
316
+ * Returns whether the button is held down.
317
+ * @param button - The button to check
318
+ * @returns Whether the button is held down
319
+ */ _proto.isButtonHeldDown = function isButtonHeldDown(button) {
320
+ return (this.pressedButtons & button) !== 0;
321
+ };
322
+ return XRController;
323
+ }(XRInput);
324
+
325
+ var XRInputEventType = /*#__PURE__*/ function(XRInputEventType) {
326
+ XRInputEventType[XRInputEventType["SelectStart"] = 0] = "SelectStart";
327
+ XRInputEventType[XRInputEventType["Select"] = 1] = "Select";
328
+ XRInputEventType[XRInputEventType["SelectEnd"] = 2] = "SelectEnd";
329
+ XRInputEventType[XRInputEventType["SqueezeStart"] = 3] = "SqueezeStart";
330
+ XRInputEventType[XRInputEventType["Squeeze"] = 4] = "Squeeze";
331
+ XRInputEventType[XRInputEventType["SqueezeEnd"] = 5] = "SqueezeEnd";
332
+ return XRInputEventType;
333
+ }({});
334
+
335
+ var XRTargetRayMode = /*#__PURE__*/ function(XRTargetRayMode) {
336
+ XRTargetRayMode[XRTargetRayMode["Gaze"] = 0] = "Gaze";
337
+ XRTargetRayMode[XRTargetRayMode["TrackedPointer"] = 1] = "TrackedPointer";
338
+ XRTargetRayMode[XRTargetRayMode["Screen"] = 2] = "Screen";
339
+ return XRTargetRayMode;
340
+ }({});
341
+
342
+ /**
343
+ * The manager of XR input.
344
+ */ var XRInputManager = /*#__PURE__*/ function() {
345
+ function XRInputManager(_xrManager, _engine) {
346
+ this._xrManager = _xrManager;
347
+ this._engine = _engine;
348
+ this./** @internal */ _cameras = [];
349
+ this./** @internal */ _controllers = [];
350
+ this._added = [];
351
+ this._removed = [];
352
+ this._trackedDevices = [];
353
+ this._statusSnapshot = [];
354
+ this._listeners = new engine.SafeLoopArray();
355
+ var _this = this, trackedDevices = _this._trackedDevices, controllers = _this._controllers, cameras = _this._cameras;
356
+ for(var i = 0; i < 6; i++){
357
+ switch(i){
358
+ case XRTrackedInputDevice.Camera:
359
+ case XRTrackedInputDevice.LeftCamera:
360
+ case XRTrackedInputDevice.RightCamera:
361
+ cameras.push(trackedDevices[i] = new XRCamera(i));
362
+ break;
363
+ case XRTrackedInputDevice.Controller:
364
+ case XRTrackedInputDevice.LeftController:
365
+ case XRTrackedInputDevice.RightController:
366
+ controllers.push(trackedDevices[i] = new XRController(i));
367
+ break;
368
+ }
369
+ }
370
+ this._statusSnapshot.fill(XRTrackingState.NotTracking, 0, trackedDevices.length);
371
+ }
372
+ var _proto = XRInputManager.prototype;
373
+ /**
374
+ * Returns the tracked device instance.
375
+ * @param type - The tracked input device type
376
+ * @returns The input instance
377
+ */ _proto.getTrackedDevice = function getTrackedDevice(type) {
378
+ return this._trackedDevices[type];
379
+ };
380
+ /**
381
+ * Add a listener for tracked device changes.
382
+ * @param listener - The listener to add
383
+ */ _proto.addTrackedDeviceChangedListener = function addTrackedDeviceChangedListener(listener) {
384
+ this._listeners.push({
385
+ fn: listener
386
+ });
387
+ };
388
+ /**
389
+ * Remove a listener of tracked device changes.
390
+ * @param listener - The listener to remove
391
+ */ _proto.removeTrackedDeviceChangedListener = function removeTrackedDeviceChangedListener(listener) {
392
+ this._listeners.findAndRemove(function(value) {
393
+ return value.fn === listener ? value.destroyed = true : false;
394
+ });
395
+ };
396
+ /**
397
+ * @internal
398
+ */ _proto._onUpdate = function _onUpdate() {
399
+ var _this = this, added = _this._added, removed = _this._removed, statusSnapshot = _this._statusSnapshot;
400
+ var _this1 = this, trackedDevices = _this1._trackedDevices, controllers = _this1._controllers;
401
+ // Reset data
402
+ added.length = removed.length = 0;
403
+ for(var i = 0, n = controllers.length; i < n; i++){
404
+ var controller = controllers[i];
405
+ controller.down = controller.up = 0;
406
+ }
407
+ // Handle events and update tracked devices
408
+ var _this__xrManager_sessionManager = this._xrManager.sessionManager, platformSession = _this__xrManager_sessionManager._platformSession;
409
+ var platformEvents = platformSession.events;
410
+ for(var i1 = 0, n1 = platformEvents.length; i1 < n1; i1++){
411
+ this._handleEvent(platformEvents[i1]);
412
+ }
413
+ platformSession.resetEvents();
414
+ platformSession.frame.updateInputs(trackedDevices);
415
+ for(var i2 = 0, n2 = trackedDevices.length; i2 < n2; i2++){
416
+ var input = trackedDevices[i2];
417
+ if (!input) continue;
418
+ var nowState = input.trackingState;
419
+ if (statusSnapshot[i2] === XRTrackingState.Tracking) {
420
+ if (nowState !== XRTrackingState.Tracking) {
421
+ removed.push(input);
422
+ }
423
+ } else {
424
+ if (nowState === XRTrackingState.Tracking) {
425
+ added.push(input);
426
+ }
427
+ }
428
+ statusSnapshot[i2] = nowState;
429
+ }
430
+ // Dispatch change event
431
+ if (added.length > 0 || removed.length > 0) {
432
+ var listeners = this._listeners.getLoopArray();
433
+ for(var i3 = 0, n3 = listeners.length; i3 < n3; i3++){
434
+ var listener = listeners[i3];
435
+ !listener.destroyed && listener.fn(added, removed);
436
+ }
437
+ }
438
+ };
439
+ /**
440
+ * @internal
441
+ */ _proto._onDestroy = function _onDestroy() {
442
+ this._listeners.findAndRemove(function(value) {
443
+ return value.destroyed = true;
444
+ });
445
+ };
446
+ _proto._handleEvent = function _handleEvent(event) {
447
+ var input = this._trackedDevices[event.input];
448
+ switch(event.targetRayMode){
449
+ case XRTargetRayMode.TrackedPointer:
450
+ switch(event.type){
451
+ case XRInputEventType.SelectStart:
452
+ input.down |= XRInputButton.Select;
453
+ input.pressedButtons |= XRInputButton.Select;
454
+ break;
455
+ case XRInputEventType.SelectEnd:
456
+ input.up |= XRInputButton.Select;
457
+ input.pressedButtons &= ~XRInputButton.Select;
458
+ break;
459
+ case XRInputEventType.SqueezeStart:
460
+ input.down |= XRInputButton.Squeeze;
461
+ input.pressedButtons |= XRInputButton.Squeeze;
462
+ break;
463
+ case XRInputEventType.SqueezeEnd:
464
+ input.up |= XRInputButton.Squeeze;
465
+ input.pressedButtons &= ~XRInputButton.Squeeze;
466
+ break;
467
+ }
468
+ break;
469
+ case XRTargetRayMode.Screen:
470
+ var _this = this, engine = _this._engine;
471
+ // @ts-ignore
472
+ var target = engine.inputManager._pointerManager._target;
473
+ // @ts-ignore
474
+ var canvas = engine.canvas._webCanvas;
475
+ var clientWidth = canvas.clientWidth, clientHeight = canvas.clientHeight;
476
+ var clientX = clientWidth * (event.x + 1) * 0.5;
477
+ var clientY = clientHeight * (event.y + 1) * 0.5;
478
+ // @ts-ignore
479
+ switch(event.type){
480
+ case XRInputEventType.SelectStart:
481
+ target.dispatchEvent(this._makeUpPointerEvent("pointerdown", event.id, clientX, clientY));
482
+ break;
483
+ case XRInputEventType.Select:
484
+ target.dispatchEvent(this._makeUpPointerEvent("pointermove", event.id, clientX, clientY));
485
+ break;
486
+ case XRInputEventType.SelectEnd:
487
+ target.dispatchEvent(this._makeUpPointerEvent("pointerup", event.id, clientX, clientY));
488
+ target.dispatchEvent(this._makeUpPointerEvent("pointerleave", event.id, clientX, clientY));
489
+ break;
490
+ }
491
+ break;
492
+ }
493
+ };
494
+ _proto._makeUpPointerEvent = function _makeUpPointerEvent(type, pointerId, clientX, clientY) {
495
+ var eventInitDict = {
496
+ pointerId: pointerId,
497
+ clientX: clientX,
498
+ clientY: clientY
499
+ };
500
+ switch(type){
501
+ case "pointerdown":
502
+ eventInitDict.button = 0;
503
+ eventInitDict.buttons = 1;
504
+ break;
505
+ case "pointermove":
506
+ eventInitDict.button = -1;
507
+ eventInitDict.buttons = 1;
508
+ break;
509
+ case "pointerup":
510
+ eventInitDict.button = 0;
511
+ eventInitDict.buttons = 0;
512
+ break;
513
+ case "pointerleave":
514
+ eventInitDict.button = 0;
515
+ eventInitDict.buttons = 0;
516
+ break;
517
+ }
518
+ return new PointerEvent(type, eventInitDict);
519
+ };
520
+ return XRInputManager;
521
+ }();
522
+
523
+ /**
524
+ * The type of XR session.
525
+ */ var XRSessionMode = /*#__PURE__*/ function(XRSessionMode) {
526
+ XRSessionMode[XRSessionMode["None"] = 0] = "None";
527
+ XRSessionMode[XRSessionMode["AR"] = 1] = "AR";
528
+ XRSessionMode[XRSessionMode["VR"] = 2] = "VR";
529
+ return XRSessionMode;
530
+ }({});
531
+
532
+ /**
533
+ * XRSessionManager manages the life cycle of XR sessions.
534
+ */ var XRSessionManager = /*#__PURE__*/ function() {
535
+ function XRSessionManager(_xrManager, _engine) {
536
+ this._xrManager = _xrManager;
537
+ this._engine = _engine;
538
+ this._mode = XRSessionMode.None;
539
+ this._state = XRSessionState.None;
540
+ this._listeners = new engine.SafeLoopArray();
541
+ // @ts-ignore
542
+ this._rhi = _engine._hardwareRenderer;
543
+ this._raf = requestAnimationFrame.bind(window);
544
+ this._caf = cancelAnimationFrame.bind(window);
545
+ this._onSessionExit = this._onSessionExit.bind(this);
546
+ }
547
+ var _proto = XRSessionManager.prototype;
548
+ /**
549
+ * Check if the specified mode is supported.
550
+ * @param mode - The mode to check
551
+ * @returns A promise that resolves if the mode is supported, otherwise rejects
552
+ */ _proto.isSupportedMode = function isSupportedMode(mode) {
553
+ return this._xrManager._platformDevice.isSupportedSessionMode(mode);
554
+ };
555
+ /**
556
+ * Run the session.
557
+ */ _proto.run = function run() {
558
+ var _this = this, platformSession = _this._platformSession, engine = _this._engine;
559
+ if (!platformSession) {
560
+ throw new Error("Without session to run.");
561
+ }
562
+ platformSession.start();
563
+ this._setState(XRSessionState.Running);
564
+ this._xrManager._onSessionStart();
565
+ if (!engine.isPaused) {
566
+ engine.pause();
567
+ engine.resume();
568
+ }
569
+ };
570
+ /**
571
+ * Stop the session.
572
+ */ _proto.stop = function stop() {
573
+ var _this = this, platformSession = _this._platformSession, engine = _this._engine, rhi = _this._rhi;
574
+ if (!platformSession) {
575
+ throw new Error("Without session to stop.");
576
+ }
577
+ if (this._state !== XRSessionState.Running) {
578
+ throw new Error("Session is not running.");
579
+ }
580
+ rhi._mainFrameBuffer = null;
581
+ rhi._mainFrameWidth = rhi._mainFrameHeight = 0;
582
+ platformSession.stop();
583
+ this._setState(XRSessionState.Paused);
584
+ this._xrManager._onSessionStop();
585
+ if (!engine.isPaused) {
586
+ engine.pause();
587
+ engine.resume();
588
+ }
589
+ };
590
+ /**
591
+ * Add a listening function for session state changes.
592
+ * @param listener - The listening function
593
+ */ _proto.addStateChangedListener = function addStateChangedListener(listener) {
594
+ this._listeners.push({
595
+ fn: listener
596
+ });
597
+ };
598
+ /**
599
+ * Remove a listening function of session state changes.
600
+ * @param listener - The listening function
601
+ */ _proto.removeStateChangedListener = function removeStateChangedListener(listener) {
602
+ this._listeners.findAndRemove(function(value) {
603
+ return value.fn === listener ? value.destroyed = true : false;
604
+ });
605
+ };
606
+ /**
607
+ * @internal
608
+ */ _proto._setState = function _setState(value) {
609
+ this._state = value;
610
+ var listeners = this._listeners.getLoopArray();
611
+ for(var i = 0, n = listeners.length; i < n; i++){
612
+ var listener = listeners[i];
613
+ !listener.destroyed && listener.fn(value);
614
+ }
615
+ };
616
+ /**
617
+ * @internal
618
+ */ _proto._initialize = function _initialize(mode, features) {
619
+ var _this = this;
620
+ return new Promise(function(resolve, reject) {
621
+ var xrManager = _this._xrManager;
622
+ // Initialize all features
623
+ var platformFeatures = [];
624
+ for(var i = 0, n = features.length; i < n; i++){
625
+ var _features_i = features[i], platformFeature = _features_i._platformFeature;
626
+ platformFeature && platformFeatures.push(platformFeature);
627
+ }
628
+ xrManager._platformDevice.requestSession(_this._rhi, mode, platformFeatures).then(function(platformSession) {
629
+ _this._mode = mode;
630
+ _this._platformSession = platformSession;
631
+ _this._setState(XRSessionState.Initialized);
632
+ platformSession.setSessionExitCallBack(_this._onSessionExit);
633
+ platformSession.addEventListener();
634
+ xrManager._onSessionInit();
635
+ resolve();
636
+ }, reject);
637
+ });
638
+ };
639
+ /**
640
+ * @internal
641
+ */ _proto._onUpdate = function _onUpdate() {
642
+ var _this = this, rhi = _this._rhi, platformSession = _this._platformSession;
643
+ rhi._mainFrameBuffer = platformSession.framebuffer;
644
+ rhi._mainFrameWidth = platformSession.framebufferWidth;
645
+ rhi._mainFrameHeight = platformSession.framebufferHeight;
646
+ };
647
+ /**
648
+ * @internal
649
+ */ _proto._getRequestAnimationFrame = function _getRequestAnimationFrame() {
650
+ if (this._state === XRSessionState.Running) {
651
+ return this._platformSession.requestAnimationFrame;
652
+ } else {
653
+ return this._raf;
654
+ }
655
+ };
656
+ /**
657
+ * @internal
658
+ */ _proto._getCancelAnimationFrame = function _getCancelAnimationFrame() {
659
+ if (this._state === XRSessionState.Running) {
660
+ return this._platformSession.cancelAnimationFrame;
661
+ } else {
662
+ return this._caf;
663
+ }
664
+ };
665
+ /**
666
+ * @internal
667
+ */ _proto._exit = function _exit() {
668
+ var _this = this, platformSession = _this._platformSession;
669
+ if (!platformSession) {
670
+ return Promise.reject("Without session to stop.");
671
+ }
672
+ return platformSession.end();
673
+ };
674
+ _proto._onSessionExit = function _onSessionExit() {
675
+ var _this = this, rhi = _this._rhi, platformSession = _this._platformSession, engine = _this._engine;
676
+ rhi._mainFrameBuffer = null;
677
+ rhi._mainFrameWidth = rhi._mainFrameHeight = 0;
678
+ platformSession.removeEventListener();
679
+ this._platformSession = null;
680
+ this._setState(XRSessionState.None);
681
+ this._xrManager._onSessionExit();
682
+ if (!engine.isPaused) {
683
+ engine.pause();
684
+ engine.resume();
685
+ }
686
+ };
687
+ /**
688
+ * @internal
689
+ */ _proto._onDestroy = function _onDestroy() {
690
+ this._listeners.findAndRemove(function(value) {
691
+ return value.destroyed = true;
692
+ });
693
+ this._raf = this._caf = null;
694
+ };
695
+ _create_class(XRSessionManager, [
696
+ {
697
+ key: "mode",
698
+ get: /**
699
+ * The current session mode( AR or VR ).
700
+ */ function get() {
701
+ return this._mode;
702
+ }
703
+ },
704
+ {
705
+ key: "state",
706
+ get: /**
707
+ * Return the current session state.
708
+ */ function get() {
709
+ return this._state;
710
+ }
711
+ },
712
+ {
713
+ key: "supportedFrameRate",
714
+ get: /**
715
+ * Return a list of supported frame rates.(only available in-session)
716
+ */ function get() {
717
+ return this._platformSession.supportedFrameRates;
718
+ }
719
+ },
720
+ {
721
+ key: "frameRate",
722
+ get: /**
723
+ * Return the current frame rate as reported by the device.
724
+ */ function get() {
725
+ return this._platformSession.frameRate;
726
+ }
727
+ }
728
+ ]);
729
+ return XRSessionManager;
730
+ }();
731
+
732
+ /**
733
+ * @internal
734
+ */ var XRManagerExtended = /*#__PURE__*/ function(XRManager) {
735
+ _inherits(XRManagerExtended, XRManager);
736
+ function XRManagerExtended() {
737
+ return XRManager.apply(this, arguments) || this;
738
+ }
739
+ var _proto = XRManagerExtended.prototype;
740
+ _proto.isSupportedFeature = function isSupportedFeature(feature) {
741
+ return this._platformDevice.isSupportedFeature(XRManagerExtended._featureMap.get(feature));
742
+ };
743
+ _proto.addFeature = function addFeature(type) {
744
+ for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){
745
+ args[_key - 1] = arguments[_key];
746
+ }
747
+ if (this.sessionManager._platformSession) {
748
+ throw new Error("Cannot add feature when the session is initialized.");
749
+ }
750
+ if (!this._platformDevice.isSupportedFeature(XRManagerExtended._featureMap.get(type))) {
751
+ throw new Error("The feature is not supported");
752
+ }
753
+ var features = this.features;
754
+ for(var i = 0, n = features.length; i < n; i++){
755
+ if (_instanceof(features[i], type)) throw new Error("The feature has been added");
756
+ }
757
+ var feature = _construct(type, [].concat([
758
+ this
759
+ ], args));
760
+ features.push(feature);
761
+ return feature;
762
+ };
763
+ _proto.getFeature = function getFeature(type) {
764
+ var features = this.features;
765
+ for(var i = 0, n = features.length; i < n; i++){
766
+ var feature = features[i];
767
+ if (_instanceof(feature, type)) {
768
+ return feature;
769
+ }
770
+ }
771
+ };
772
+ _proto.enterXR = function enterXR(sessionMode, autoRun) {
773
+ var _this = this;
774
+ if (autoRun === void 0) autoRun = true;
775
+ var sessionManager = this.sessionManager;
776
+ if (sessionManager._platformSession) {
777
+ throw new Error("Please exit XR immersive mode first.");
778
+ }
779
+ if (!this._origin) {
780
+ throw new Error("Please set origin before enter XR.");
781
+ }
782
+ return new Promise(function(resolve, reject) {
783
+ // 1. Check if this xr mode is supported
784
+ sessionManager.isSupportedMode(sessionMode).then(function() {
785
+ sessionManager._setState(XRSessionState.Initializing);
786
+ // 2. Initialize session
787
+ sessionManager._initialize(sessionMode, _this.features).then(function() {
788
+ autoRun && sessionManager.run();
789
+ resolve();
790
+ }, reject);
791
+ }, reject);
792
+ });
793
+ };
794
+ _proto.exitXR = function exitXR() {
795
+ var _this = this;
796
+ return new Promise(function(resolve, reject) {
797
+ _this.sessionManager._exit().then(function() {
798
+ resolve();
799
+ }, reject);
800
+ });
801
+ };
802
+ _proto._initialize = function _initialize(engine, xrDevice) {
803
+ this._features = [];
804
+ this._platformDevice = xrDevice;
805
+ this.sessionManager = new XRSessionManager(this, engine);
806
+ this.inputManager = new XRInputManager(this, engine);
807
+ this.cameraManager = new XRCameraManager(this);
808
+ };
809
+ _proto._update = function _update() {
810
+ var sessionManager = this.sessionManager;
811
+ if (sessionManager.state !== XRSessionState.Running) return;
812
+ sessionManager._onUpdate();
813
+ this.inputManager._onUpdate();
814
+ this.cameraManager._onUpdate();
815
+ var features = this.features;
816
+ for(var i = 0, n = features.length; i < n; i++){
817
+ var feature = features[i];
818
+ feature.enabled && feature._onUpdate();
819
+ }
820
+ };
821
+ _proto._destroy = function _destroy() {
822
+ var _this = this;
823
+ if (this.sessionManager._platformSession) {
824
+ this.exitXR().then(function() {
825
+ _this.sessionManager._onDestroy();
826
+ _this.inputManager._onDestroy();
827
+ _this.cameraManager._onDestroy();
828
+ });
829
+ } else {
830
+ this.sessionManager._onDestroy();
831
+ this.inputManager._onDestroy();
832
+ this.cameraManager._onDestroy();
833
+ }
834
+ };
835
+ _proto._getRequestAnimationFrame = function _getRequestAnimationFrame() {
836
+ return this.sessionManager._getRequestAnimationFrame();
837
+ };
838
+ _proto._getCancelAnimationFrame = function _getCancelAnimationFrame() {
839
+ return this.sessionManager._getCancelAnimationFrame();
840
+ };
841
+ _proto._getCameraIgnoreClearFlags = function _getCameraIgnoreClearFlags(type) {
842
+ return this.cameraManager._getIgnoreClearFlags(type);
843
+ };
844
+ /**
845
+ * @internal
846
+ */ _proto._onSessionStop = function _onSessionStop() {
847
+ var features = this.features;
848
+ for(var i = 0, n = features.length; i < n; i++){
849
+ var feature = features[i];
850
+ feature.enabled && feature._onSessionStop();
851
+ }
852
+ };
853
+ /**
854
+ * @internal
855
+ */ _proto._onSessionInit = function _onSessionInit() {
856
+ var features = this.features;
857
+ for(var i = 0, n = features.length; i < n; i++){
858
+ var feature = features[i];
859
+ feature.enabled && feature._onSessionInit();
860
+ }
861
+ };
862
+ /**
863
+ * @internal
864
+ */ _proto._onSessionStart = function _onSessionStart() {
865
+ this.cameraManager._onSessionStart();
866
+ var features = this.features;
867
+ for(var i = 0, n = features.length; i < n; i++){
868
+ var feature = features[i];
869
+ feature.enabled && feature._onSessionStart();
870
+ }
871
+ };
872
+ /**
873
+ * @internal
874
+ */ _proto._onSessionExit = function _onSessionExit() {
875
+ this.cameraManager._onSessionExit();
876
+ var features = this.features;
877
+ for(var i = 0, n = features.length; i < n; i++){
878
+ var feature = features[i];
879
+ feature.enabled && feature._onSessionExit();
880
+ feature._onDestroy();
881
+ }
882
+ features.length = 0;
883
+ };
884
+ _create_class(XRManagerExtended, [
885
+ {
886
+ key: "features",
887
+ get: function get() {
888
+ return this._features;
889
+ }
890
+ },
891
+ {
892
+ key: "origin",
893
+ get: function get() {
894
+ return this._origin;
895
+ },
896
+ set: function set(value) {
897
+ if (this.sessionManager._platformSession) {
898
+ throw new Error("Cannot set origin when the session is initialized.");
899
+ }
900
+ this._origin = value;
901
+ }
902
+ }
903
+ ]);
904
+ return XRManagerExtended;
905
+ }(engine.XRManager);
906
+ /** @internal */ XRManagerExtended._featureMap = new Map();
907
+ /**
908
+ * @internal
909
+ */ function registerXRFeature(type) {
910
+ return function(feature) {
911
+ XRManagerExtended._featureMap.set(feature, type);
912
+ };
913
+ }
914
+ // 实现混入的函数
915
+ function ApplyMixins(derivedCtor, baseCtors) {
916
+ baseCtors.forEach(function(baseCtor) {
917
+ Object.getOwnPropertyNames(baseCtor.prototype).forEach(function(name) {
918
+ Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null));
919
+ });
920
+ });
921
+ }
922
+ ApplyMixins(engine.XRManager, [
923
+ XRManagerExtended
924
+ ]);
925
+
926
+ /**
927
+ * The base class of XR feature manager.
928
+ */ var XRFeature = /*#__PURE__*/ function() {
929
+ function XRFeature(_xrManager, _type) {
930
+ for(var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++){
931
+ args[_key - 2] = arguments[_key];
932
+ }
933
+ var _xrManager__platformDevice;
934
+ this._xrManager = _xrManager;
935
+ this._type = _type;
936
+ this._enabled = true;
937
+ this._platformFeature = (_xrManager__platformDevice = _xrManager._platformDevice).createPlatformFeature.apply(_xrManager__platformDevice, [].concat([
938
+ _type
939
+ ], args));
940
+ this._onEnable();
941
+ }
942
+ var _proto = XRFeature.prototype;
943
+ /**
944
+ * @internal
945
+ */ _proto._onEnable = function _onEnable() {};
946
+ /**
947
+ * @internal
948
+ */ _proto._onDisable = function _onDisable() {};
949
+ /**
950
+ * @internal
951
+ */ _proto._onUpdate = function _onUpdate() {};
952
+ /**
953
+ * @internal
954
+ */ _proto._onSessionInit = function _onSessionInit() {};
955
+ /**
956
+ * @internal
957
+ */ _proto._onSessionStart = function _onSessionStart() {};
958
+ /**
959
+ * @internal
960
+ */ _proto._onSessionStop = function _onSessionStop() {};
961
+ /**
962
+ * @internal
963
+ */ _proto._onSessionExit = function _onSessionExit() {};
964
+ /**
965
+ * @internal
966
+ */ _proto._onDestroy = function _onDestroy() {};
967
+ _create_class(XRFeature, [
968
+ {
969
+ key: "enabled",
970
+ get: /**
971
+ * Returns whether the feature is enabled.
972
+ */ function get() {
973
+ return this._enabled;
974
+ },
975
+ set: function set(value) {
976
+ if (this.enabled !== value) {
977
+ this._enabled = value;
978
+ value ? this._onEnable() : this._onDisable();
979
+ }
980
+ }
981
+ }
982
+ ]);
983
+ return XRFeature;
984
+ }();
985
+
986
+ var XRFeatureType = /*#__PURE__*/ function(XRFeatureType) {
987
+ XRFeatureType[XRFeatureType["AnchorTracking"] = 0] = "AnchorTracking";
988
+ XRFeatureType[XRFeatureType["ImageTracking"] = 1] = "ImageTracking";
989
+ XRFeatureType[XRFeatureType["PlaneTracking"] = 2] = "PlaneTracking";
990
+ XRFeatureType[XRFeatureType["HitTest"] = 3] = "HitTest";
991
+ return XRFeatureType;
992
+ }({});
993
+
994
+ var XRRequestTrackingState = /*#__PURE__*/ function(XRRequestTrackingState) {
995
+ XRRequestTrackingState[XRRequestTrackingState["None"] = 0] = "None";
996
+ XRRequestTrackingState[XRRequestTrackingState["Submitted"] = 1] = "Submitted";
997
+ XRRequestTrackingState[XRRequestTrackingState["Resolved"] = 2] = "Resolved";
998
+ XRRequestTrackingState[XRRequestTrackingState["Rejected"] = 3] = "Rejected";
999
+ XRRequestTrackingState[XRRequestTrackingState["Destroyed"] = 4] = "Destroyed";
1000
+ XRRequestTrackingState[XRRequestTrackingState["WaitingDestroy"] = 5] = "WaitingDestroy";
1001
+ return XRRequestTrackingState;
1002
+ }({});
1003
+
1004
+ /**
1005
+ * The base class of XR trackable manager.
1006
+ */ var XRTrackableFeature = /*#__PURE__*/ function(XRFeature) {
1007
+ _inherits(XRTrackableFeature, XRFeature);
1008
+ function XRTrackableFeature() {
1009
+ var _this;
1010
+ _this = XRFeature.apply(this, arguments) || this, _this._requestTrackings = [], _this._tracked = [], _this._added = [], _this._updated = [], _this._removed = [], _this._statusSnapshot = {}, _this._listeners = new engine.SafeLoopArray();
1011
+ return _this;
1012
+ }
1013
+ var _proto = XRTrackableFeature.prototype;
1014
+ /**
1015
+ * Add a listening function for tracked object changes.
1016
+ * @param listener - The listening function
1017
+ */ _proto.addChangedListener = function addChangedListener(listener) {
1018
+ this._listeners.push({
1019
+ fn: listener
1020
+ });
1021
+ };
1022
+ /**
1023
+ * Remove a listening function of tracked object changes.
1024
+ * @param listener - The listening function
1025
+ */ _proto.removeChangedListener = function removeChangedListener(listener) {
1026
+ this._listeners.findAndRemove(function(value) {
1027
+ return value.fn === listener ? value.destroyed = true : false;
1028
+ });
1029
+ };
1030
+ _proto._onUpdate = function _onUpdate() {
1031
+ var _this__xrManager_sessionManager = this._xrManager.sessionManager, platformSession = _this__xrManager_sessionManager._platformSession;
1032
+ var platformFrame = platformSession.frame;
1033
+ var _this = this, platformFeature = _this._platformFeature, requestTrackings = _this._requestTrackings, statusSnapshot = _this._statusSnapshot, allTracked = _this._tracked, added = _this._added, updated = _this._updated, removed = _this._removed;
1034
+ if (!platformFrame || !requestTrackings.length) {
1035
+ return;
1036
+ }
1037
+ if (!platformFeature.checkAvailable(platformSession, platformFrame, requestTrackings)) {
1038
+ return;
1039
+ }
1040
+ added.length = updated.length = removed.length = 0;
1041
+ platformFeature.getTrackedResult(platformSession, platformFrame, requestTrackings, this._generateTracked);
1042
+ for(var i = 0, n = requestTrackings.length; i < n; i++){
1043
+ var requestTracking = requestTrackings[i];
1044
+ switch(requestTracking.state){
1045
+ case XRRequestTrackingState.Destroyed:
1046
+ var destroyedTracked = requestTracking.tracked;
1047
+ for(var j = 0, n1 = destroyedTracked.length; j < n1; j++){
1048
+ var tracked = destroyedTracked[j];
1049
+ var trackId = tracked.id;
1050
+ if (statusSnapshot[trackId] === XRTrackingState.Tracking) {
1051
+ removed.push(tracked);
1052
+ allTracked.splice(allTracked.indexOf(tracked), 1);
1053
+ }
1054
+ statusSnapshot[trackId] = XRTrackingState.NotTracking;
1055
+ }
1056
+ break;
1057
+ case XRRequestTrackingState.Resolved:
1058
+ var tracked1 = requestTracking.tracked;
1059
+ for(var j1 = 0, n2 = tracked1.length; j1 < n2; j1++){
1060
+ var trackedObject = tracked1[j1];
1061
+ var trackId1 = trackedObject.id;
1062
+ if (trackedObject.state === XRTrackingState.Tracking) {
1063
+ if (statusSnapshot[trackId1] === XRTrackingState.Tracking) {
1064
+ updated.push(trackedObject);
1065
+ } else {
1066
+ added.push(trackedObject);
1067
+ statusSnapshot[trackId1] = XRTrackingState.Tracking;
1068
+ allTracked.push(trackedObject);
1069
+ }
1070
+ } else {
1071
+ if (statusSnapshot[trackId1] === XRTrackingState.Tracking) {
1072
+ removed.push(trackedObject);
1073
+ allTracked.splice(allTracked.indexOf(trackedObject), 1);
1074
+ }
1075
+ statusSnapshot[trackId1] = trackedObject.state;
1076
+ }
1077
+ }
1078
+ break;
1079
+ }
1080
+ }
1081
+ for(var i1 = requestTrackings.length - 1; i1 >= 0; i1--){
1082
+ requestTrackings[i1].state === XRRequestTrackingState.Destroyed && requestTrackings.splice(i1, 1);
1083
+ }
1084
+ if (added.length > 0 || updated.length > 0 || removed.length > 0) {
1085
+ var listeners = this._listeners.getLoopArray();
1086
+ for(var i2 = 0, n3 = listeners.length; i2 < n3; i2++){
1087
+ var listener = listeners[i2];
1088
+ !listener.destroyed && listener.fn(added, updated, removed);
1089
+ }
1090
+ }
1091
+ };
1092
+ _proto._onSessionStop = function _onSessionStop() {
1093
+ this._added.length = this._updated.length = this._removed.length = 0;
1094
+ };
1095
+ _proto._onSessionExit = function _onSessionExit() {
1096
+ // prettier-ignore
1097
+ this._requestTrackings.length = this._tracked.length = this._added.length = this._updated.length = this._removed.length = 0;
1098
+ this._listeners.findAndRemove(function(value) {
1099
+ return value.destroyed = true;
1100
+ });
1101
+ };
1102
+ _proto._addRequestTracking = function _addRequestTracking(requestTracking) {
1103
+ var _this = this, platformFeature = _this._platformFeature;
1104
+ if (this._xrManager.sessionManager._platformSession && !platformFeature.canModifyRequestTrackingAfterInit) {
1105
+ throw new Error(XRFeatureType[this._type] + " request tracking cannot be modified after initialization.");
1106
+ }
1107
+ this._requestTrackings.push(requestTracking);
1108
+ platformFeature.onAddRequestTracking(requestTracking);
1109
+ };
1110
+ _proto._removeRequestTracking = function _removeRequestTracking(requestTracking) {
1111
+ var _this = this, platformFeature = _this._platformFeature;
1112
+ if (this._xrManager.sessionManager._platformSession && !platformFeature.canModifyRequestTrackingAfterInit) {
1113
+ throw new Error(XRFeatureType[this._type] + " request tracking cannot be modified after initialization.");
1114
+ }
1115
+ platformFeature.onDelRequestTracking(requestTracking);
1116
+ };
1117
+ _proto._removeAllRequestTrackings = function _removeAllRequestTrackings() {
1118
+ var _this = this, platformFeature = _this._platformFeature;
1119
+ if (this._xrManager.sessionManager._platformSession && !platformFeature.canModifyRequestTrackingAfterInit) {
1120
+ throw new Error(XRFeatureType[this._type] + " request tracking cannot be modified after initialization.");
1121
+ }
1122
+ var _this1 = this, requestTrackings = _this1._requestTrackings;
1123
+ for(var i = 0, n = requestTrackings.length; i < n; i++){
1124
+ platformFeature.onDelRequestTracking(requestTrackings[i]);
1125
+ }
1126
+ };
1127
+ return XRTrackableFeature;
1128
+ }(XRFeature);
1129
+ XRTrackableFeature._uuid = 0;
1130
+
1131
+ /**
1132
+ * The base class of XR tracked object.
1133
+ */ var XRTracked = function XRTracked() {
1134
+ /** The pose of the trackable in XR space. */ this.pose = new XRPose();
1135
+ /** The tracking state of the trackable. */ this.state = XRTrackingState.NotTracking;
1136
+ };
1137
+
1138
+ /**
1139
+ * Enum for the types of hit test that can be performed.
1140
+ * Note: currently only supports plane.
1141
+ */ var TrackableType = /*#__PURE__*/ function(TrackableType) {
1142
+ /** Tracked plane. */ TrackableType[TrackableType["Plane"] = 1] = "Plane";
1143
+ /** All tracked objects. */ TrackableType[TrackableType["All"] = 1] = "All";
1144
+ return TrackableType;
1145
+ }({});
1146
+
1147
+ /**
1148
+ * XR hit result.
1149
+ * It is the detection result returned by using XR HitTest feature.
1150
+ */ var XRHitResult = function XRHitResult() {
1151
+ /** The position of the hit point. */ this.point = new engine.Vector3();
1152
+ /** The normal of the hit point. */ this.normal = new engine.Vector3();
1153
+ };
1154
+
1155
+ /******************************************************************************
1156
+ Copyright (c) Microsoft Corporation.
1157
+
1158
+ Permission to use, copy, modify, and/or distribute this software for any
1159
+ purpose with or without fee is hereby granted.
1160
+
1161
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
1162
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1163
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
1164
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1165
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1166
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1167
+ PERFORMANCE OF THIS SOFTWARE.
1168
+ ***************************************************************************** */
1169
+
1170
+ function __decorate(decorators, target, key, desc) {
1171
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1172
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1173
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1174
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1175
+ }
1176
+
1177
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
1178
+ var e = new Error(message);
1179
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
1180
+ };
1181
+
1182
+ /**
1183
+ * Enumerates modes of plane in XR.
1184
+ */ var XRPlaneMode = /*#__PURE__*/ function(XRPlaneMode) {
1185
+ /** None. */ XRPlaneMode[XRPlaneMode["None"] = 0] = "None";
1186
+ /** Horizontal */ XRPlaneMode[XRPlaneMode["Horizontal"] = 1] = "Horizontal";
1187
+ /** Vertical */ XRPlaneMode[XRPlaneMode["Vertical"] = 2] = "Vertical";
1188
+ /** Includes horizontal and vertical. */ XRPlaneMode[XRPlaneMode["EveryThing"] = 3] = "EveryThing";
1189
+ return XRPlaneMode;
1190
+ }({});
1191
+
1192
+ /**
1193
+ * @internal
1194
+ */ var XRRequestTracking = function XRRequestTracking() {
1195
+ /** The status of the current request tracking. */ this.state = XRRequestTrackingState.None;
1196
+ /** Tracked instances, make up from the tracking data returned by Session. */ this.tracked = [];
1197
+ };
1198
+
1199
+ /**
1200
+ * The request plane in XR space.
1201
+ */ var XRRequestPlane = /*#__PURE__*/ function(XRRequestTracking) {
1202
+ _inherits(XRRequestPlane, XRRequestTracking);
1203
+ function XRRequestPlane(detectionMode) {
1204
+ var _this;
1205
+ _this = XRRequestTracking.call(this) || this, _this.detectionMode = detectionMode;
1206
+ return _this;
1207
+ }
1208
+ return XRRequestPlane;
1209
+ }(XRRequestTracking);
1210
+
1211
+ /**
1212
+ * The tracked plane in XR space.
1213
+ */ var XRTrackedPlane = /*#__PURE__*/ function(XRTracked) {
1214
+ _inherits(XRTrackedPlane, XRTracked);
1215
+ function XRTrackedPlane() {
1216
+ var _this;
1217
+ _this = XRTracked.apply(this, arguments) || this, /** The points that make up this plane.
1218
+ * Note: These points are in the plane coordinate system,
1219
+ * and their Y coordinates are all zero.
1220
+ */ _this.polygon = [], /**
1221
+ * Whether this frame changes the attributes of the plane.
1222
+ * Note: Includes `polygon` but no `pose`.
1223
+ */ _this.attributesDirty = false;
1224
+ return _this;
1225
+ }
1226
+ return XRTrackedPlane;
1227
+ }(XRTracked);
1228
+
1229
+ exports.XRPlaneTracking = /*#__PURE__*/ function(XRTrackableFeature1) {
1230
+ _inherits(XRPlaneTracking, XRTrackableFeature1);
1231
+ function XRPlaneTracking(xrManager, detectionMode) {
1232
+ if (detectionMode === void 0) detectionMode = XRPlaneMode.EveryThing;
1233
+ var _this;
1234
+ _this = XRTrackableFeature1.call(this, xrManager, XRFeatureType.PlaneTracking, detectionMode) || this;
1235
+ _this._addRequestTracking(new XRRequestPlane(detectionMode));
1236
+ return _this;
1237
+ }
1238
+ var _proto = XRPlaneTracking.prototype;
1239
+ _proto._generateTracked = function _generateTracked() {
1240
+ var plane = new XRTrackedPlane();
1241
+ plane.id = XRTrackableFeature._uuid++;
1242
+ return plane;
1243
+ };
1244
+ _create_class(XRPlaneTracking, [
1245
+ {
1246
+ key: "detectionMode",
1247
+ get: /**
1248
+ * The plane detection mode.
1249
+ */ function get() {
1250
+ return this._requestTrackings[0].detectionMode;
1251
+ }
1252
+ },
1253
+ {
1254
+ key: "trackedPlanes",
1255
+ get: /**
1256
+ * The tracked planes.
1257
+ */ function get() {
1258
+ return this._tracked;
1259
+ }
1260
+ }
1261
+ ]);
1262
+ return XRPlaneTracking;
1263
+ }(XRTrackableFeature);
1264
+ exports.XRPlaneTracking = __decorate([
1265
+ registerXRFeature(XRFeatureType.PlaneTracking)
1266
+ ], exports.XRPlaneTracking);
1267
+
1268
+ exports.XRHitTest = /*#__PURE__*/ function(XRFeature) {
1269
+ _inherits(XRHitTest, XRFeature);
1270
+ function XRHitTest(xrManager) {
1271
+ var _this;
1272
+ _this = XRFeature.call(this, xrManager, XRFeatureType.HitTest) || this, _this._tempRay = new engine.Ray(), _this._tempPlane = new engine.Plane(), _this._tempVec2 = new engine.Vector2(), _this._tempVec30 = new engine.Vector3(), _this._tempVec31 = new engine.Vector3(), _this._tempVec32 = new engine.Vector3(), _this._tempVec33 = new engine.Vector3(), _this._tempVec34 = new engine.Vector3(), _this._tempVec35 = new engine.Vector3();
1273
+ return _this;
1274
+ }
1275
+ var _proto = XRHitTest.prototype;
1276
+ /**
1277
+ * Hit test.
1278
+ * @param ray - The ray to test
1279
+ * @param type - The type of hit test
1280
+ * @returns The hit result
1281
+ */ _proto.hitTest = function hitTest(ray, type) {
1282
+ var result = [];
1283
+ if (type & TrackableType.Plane) {
1284
+ this._hitTestPlane(ray, result);
1285
+ }
1286
+ return result;
1287
+ };
1288
+ /**
1289
+ * Screen hit test.
1290
+ * @param x - The x coordinate of the screen point
1291
+ * @param y - The y coordinate of the screen point
1292
+ * @param type - The type of hit test
1293
+ * @returns The hit result
1294
+ */ _proto.screenHitTest = function screenHitTest(x, y, type) {
1295
+ var _this = this, xrManager = _this._xrManager;
1296
+ if (xrManager.sessionManager.mode !== XRSessionMode.AR) {
1297
+ throw new Error("Only AR mode supports using screen ray hit test.");
1298
+ }
1299
+ var _xrManager_inputManager_getTrackedDevice = xrManager.inputManager.getTrackedDevice(XRTrackedInputDevice.Camera), camera = _xrManager_inputManager_getTrackedDevice._camera;
1300
+ if (!camera) {
1301
+ throw new Error("No camera available.");
1302
+ }
1303
+ var ray = camera.screenPointToRay(this._tempVec2.set(x, y), this._tempRay);
1304
+ return this.hitTest(ray, type);
1305
+ };
1306
+ _proto._hitTestPlane = function _hitTestPlane(ray, result) {
1307
+ var planeManager = this._xrManager.getFeature(exports.XRPlaneTracking);
1308
+ if (!planeManager || !planeManager.enabled) {
1309
+ throw new Error("The plane estimation function needs to be turned on for plane hit test.");
1310
+ }
1311
+ var _this = this, plane = _this._tempPlane, normal = _this._tempVec30, hitPoint = _this._tempVec31, hitPointInPlane = _this._tempVec32;
1312
+ var trackedPlanes = planeManager.trackedPlanes;
1313
+ for(var i = 0, n = trackedPlanes.length; i < n; i++){
1314
+ var trackedPlane = trackedPlanes[i];
1315
+ normal.set(0, 1, 0).transformNormal(trackedPlane.pose.matrix);
1316
+ plane.normal.copyFrom(normal);
1317
+ plane.distance = -engine.Vector3.dot(normal, trackedPlane.pose.position);
1318
+ var distance = ray.intersectPlane(plane);
1319
+ if (distance >= 0) {
1320
+ ray.getPoint(distance, hitPoint);
1321
+ engine.Vector3.transformToVec3(hitPoint, trackedPlane.pose.inverseMatrix, hitPointInPlane);
1322
+ // Check if the hit position is within the plane boundary.
1323
+ if (this._checkPointerWithinPlane(hitPointInPlane, trackedPlane)) {
1324
+ var hitResult = new XRHitResult();
1325
+ hitResult.point.copyFrom(hitPoint);
1326
+ hitResult.normal.copyFrom(normal);
1327
+ hitResult.distance = distance;
1328
+ hitResult.trackedObject = trackedPlane;
1329
+ hitResult.trackableType = TrackableType.Plane;
1330
+ result.push(hitResult);
1331
+ }
1332
+ }
1333
+ }
1334
+ };
1335
+ _proto._checkPointerWithinPlane = function _checkPointerWithinPlane(pointer, plane) {
1336
+ var _this = this, preToCur = _this._tempVec33, preToPointer = _this._tempVec34, cross = _this._tempVec35;
1337
+ var polygon = plane.polygon;
1338
+ var length = polygon.length;
1339
+ var prePoint = polygon[length - 1];
1340
+ var side = 0;
1341
+ for(var i = 0; i < length; i++){
1342
+ var curPoint = polygon[i];
1343
+ engine.Vector3.subtract(curPoint, prePoint, preToCur);
1344
+ engine.Vector3.subtract(pointer, prePoint, preToPointer);
1345
+ engine.Vector3.cross(preToCur, preToPointer, cross);
1346
+ var y = cross.y;
1347
+ if (side === 0) {
1348
+ if (y > 0) {
1349
+ side = 1;
1350
+ } else if (y < 0) {
1351
+ side = -1;
1352
+ }
1353
+ } else {
1354
+ if (y > 0 && side < 0 || y < 0 && side > 0) {
1355
+ return false;
1356
+ }
1357
+ }
1358
+ prePoint = curPoint;
1359
+ }
1360
+ return true;
1361
+ };
1362
+ return XRHitTest;
1363
+ }(XRFeature);
1364
+ exports.XRHitTest = __decorate([
1365
+ registerXRFeature(XRFeatureType.HitTest)
1366
+ ], exports.XRHitTest);
1367
+
1368
+ /**
1369
+ * The anchor in XR space.
1370
+ */ var XRAnchor = /*#__PURE__*/ function(XRTracked) {
1371
+ _inherits(XRAnchor, XRTracked);
1372
+ function XRAnchor() {
1373
+ return XRTracked.apply(this, arguments) || this;
1374
+ }
1375
+ return XRAnchor;
1376
+ }(XRTracked);
1377
+
1378
+ /**
1379
+ * The request anchor in XR space.
1380
+ */ var XRRequestAnchor = /*#__PURE__*/ function(XRRequestTracking) {
1381
+ _inherits(XRRequestAnchor, XRRequestTracking);
1382
+ function XRRequestAnchor(position, rotation) {
1383
+ var _this;
1384
+ _this = XRRequestTracking.call(this) || this, _this.position = position, _this.rotation = rotation;
1385
+ return _this;
1386
+ }
1387
+ return XRRequestAnchor;
1388
+ }(XRRequestTracking);
1389
+
1390
+ exports.XRAnchorTracking = /*#__PURE__*/ function(XRTrackableFeature1) {
1391
+ _inherits(XRAnchorTracking, XRTrackableFeature1);
1392
+ function XRAnchorTracking(xrManager) {
1393
+ var _this;
1394
+ _this = XRTrackableFeature1.call(this, xrManager, XRFeatureType.AnchorTracking) || this, _this._anchors = [];
1395
+ return _this;
1396
+ }
1397
+ var _proto = XRAnchorTracking.prototype;
1398
+ /**
1399
+ * Add a anchor in XR space.
1400
+ * @param anchor - The anchor to be added
1401
+ */ _proto.addAnchor = function addAnchor(position, rotation) {
1402
+ if (!this._enabled) {
1403
+ throw new Error("Cannot add an anchor from a disabled anchor manager.");
1404
+ }
1405
+ var _this = this, anchors = _this._anchors;
1406
+ var requestAnchor = new XRRequestAnchor(position, rotation);
1407
+ var xrAnchor = this._generateTracked();
1408
+ requestAnchor.tracked[0] = xrAnchor;
1409
+ this._addRequestTracking(requestAnchor);
1410
+ anchors.push(xrAnchor);
1411
+ return xrAnchor;
1412
+ };
1413
+ /**
1414
+ * Remove a anchor in XR space.
1415
+ * @param anchor - The anchor to be removed
1416
+ */ _proto.removeAnchor = function removeAnchor(anchor) {
1417
+ if (!this._enabled) {
1418
+ throw new Error("Cannot remove an anchor from a disabled anchor manager.");
1419
+ }
1420
+ var _this = this, requestTrackings = _this._requestTrackings, anchors = _this._anchors;
1421
+ for(var i = 0, n = requestTrackings.length; i < n; i++){
1422
+ var requestAnchor = requestTrackings[i];
1423
+ if (requestAnchor.tracked[0] === anchor) {
1424
+ this._removeRequestTracking(requestAnchor);
1425
+ break;
1426
+ }
1427
+ }
1428
+ anchors.splice(anchors.indexOf(anchor), 1);
1429
+ };
1430
+ /**
1431
+ * Remove all tracking anchors.
1432
+ */ _proto.clearAnchors = function clearAnchors() {
1433
+ if (!this._enabled) {
1434
+ throw new Error("Cannot remove anchors from a disabled anchor manager.");
1435
+ }
1436
+ this._removeAllRequestTrackings();
1437
+ };
1438
+ _proto._generateTracked = function _generateTracked() {
1439
+ var anchor = new XRAnchor();
1440
+ anchor.id = XRTrackableFeature._uuid++;
1441
+ return anchor;
1442
+ };
1443
+ _create_class(XRAnchorTracking, [
1444
+ {
1445
+ key: "trackingAnchors",
1446
+ get: /**
1447
+ * The anchors to tracking.
1448
+ */ function get() {
1449
+ return this._anchors;
1450
+ }
1451
+ },
1452
+ {
1453
+ key: "trackedAnchors",
1454
+ get: /**
1455
+ * The tracked anchors.
1456
+ */ function get() {
1457
+ return this._tracked;
1458
+ }
1459
+ }
1460
+ ]);
1461
+ return XRAnchorTracking;
1462
+ }(XRTrackableFeature);
1463
+ exports.XRAnchorTracking = __decorate([
1464
+ registerXRFeature(XRFeatureType.AnchorTracking)
1465
+ ], exports.XRAnchorTracking);
1466
+
1467
+ /**
1468
+ * The request image in XR space.
1469
+ */ var XRRequestImage = /*#__PURE__*/ function(XRRequestTracking) {
1470
+ _inherits(XRRequestImage, XRRequestTracking);
1471
+ function XRRequestImage(image) {
1472
+ var _this;
1473
+ _this = XRRequestTracking.call(this) || this, _this.image = image;
1474
+ return _this;
1475
+ }
1476
+ return XRRequestImage;
1477
+ }(XRRequestTracking);
1478
+
1479
+ /**
1480
+ * A tracked image in XR space.
1481
+ */ var XRTrackedImage = /*#__PURE__*/ function(XRTracked) {
1482
+ _inherits(XRTrackedImage, XRTracked);
1483
+ function XRTrackedImage() {
1484
+ return XRTracked.apply(this, arguments) || this;
1485
+ }
1486
+ return XRTrackedImage;
1487
+ }(XRTracked);
1488
+
1489
+ exports.XRImageTracking = /*#__PURE__*/ function(XRTrackableFeature1) {
1490
+ _inherits(XRImageTracking, XRTrackableFeature1);
1491
+ function XRImageTracking(xrManager, trackingImages) {
1492
+ var _this;
1493
+ _this = XRTrackableFeature1.call(this, xrManager, XRFeatureType.ImageTracking, trackingImages) || this;
1494
+ _this._trackingImages = trackingImages;
1495
+ var imageLength = trackingImages ? trackingImages.length : 0;
1496
+ if (imageLength > 0) {
1497
+ for(var i = 0, n = trackingImages.length; i < n; i++){
1498
+ _this._addRequestTracking(new XRRequestImage(trackingImages[i]));
1499
+ }
1500
+ } else {
1501
+ console.warn("No image to be tracked.");
1502
+ }
1503
+ return _this;
1504
+ }
1505
+ var _proto = XRImageTracking.prototype;
1506
+ _proto._generateTracked = function _generateTracked() {
1507
+ var image = new XRTrackedImage();
1508
+ image.id = XRTrackableFeature._uuid++;
1509
+ return image;
1510
+ };
1511
+ _create_class(XRImageTracking, [
1512
+ {
1513
+ key: "trackingImages",
1514
+ get: /**
1515
+ * The image to tracking.
1516
+ */ function get() {
1517
+ return this._trackingImages;
1518
+ }
1519
+ },
1520
+ {
1521
+ key: "trackedImages",
1522
+ get: /**
1523
+ * The tracked images.
1524
+ */ function get() {
1525
+ return this._tracked;
1526
+ }
1527
+ }
1528
+ ]);
1529
+ return XRImageTracking;
1530
+ }(XRTrackableFeature);
1531
+ exports.XRImageTracking = __decorate([
1532
+ registerXRFeature(XRFeatureType.ImageTracking)
1533
+ ], exports.XRImageTracking);
1534
+
1535
+ /**
1536
+ * A reference image is an image to look for in the physical environment.
1537
+ */ var XRReferenceImage = function XRReferenceImage(name, imageSource, physicalWidth) {
1538
+ this.name = name;
1539
+ this.imageSource = imageSource;
1540
+ this.physicalWidth = physicalWidth;
1541
+ };
1542
+
1543
+ exports.XRReferenceImageDecoder = /*#__PURE__*/ function() {
1544
+ function XRReferenceImageDecoder() {}
1545
+ XRReferenceImageDecoder.decode = function decode(engine$1, bufferReader) {
1546
+ return new engine.AssetPromise(function(resolve, reject) {
1547
+ var physicalWidth = bufferReader.nextFloat32();
1548
+ bufferReader.nextUint8();
1549
+ var img = new Image();
1550
+ img.onload = function() {
1551
+ resolve(new XRReferenceImage("", img, physicalWidth));
1552
+ };
1553
+ img.src = URL.createObjectURL(new window.Blob([
1554
+ bufferReader.nextImagesData(1)[0]
1555
+ ]));
1556
+ });
1557
+ };
1558
+ return XRReferenceImageDecoder;
1559
+ }();
1560
+ exports.XRReferenceImageDecoder = __decorate([
1561
+ engine.decoder("XRReferenceImage")
1562
+ ], exports.XRReferenceImageDecoder);
1563
+
1564
+ function _extends() {
1565
+ _extends = Object.assign || function assign(target) {
1566
+ for (var i = 1; i < arguments.length; i++) {
1567
+ var source = arguments[i];
1568
+ for (var key in source) if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
1569
+ }
1570
+
1571
+ return target;
1572
+ };
1573
+
1574
+ return _extends.apply(this, arguments);
1575
+ }
1576
+
1577
+ exports.XRReferenceImageLoader = /*#__PURE__*/ function(Loader) {
1578
+ _inherits(XRReferenceImageLoader, Loader);
1579
+ function XRReferenceImageLoader() {
1580
+ return Loader.apply(this, arguments) || this;
1581
+ }
1582
+ var _proto = XRReferenceImageLoader.prototype;
1583
+ _proto.load = function load(item, resourceManager) {
1584
+ return new engine.AssetPromise(function(resolve, reject) {
1585
+ resourceManager// @ts-ignore
1586
+ ._request(item.url, _extends({}, item, {
1587
+ type: "arraybuffer"
1588
+ })).then(function(data) {
1589
+ engine.decode(data, resourceManager.engine).then(function(referenceImage) {
1590
+ resolve(referenceImage);
1591
+ });
1592
+ }).catch(reject);
1593
+ });
1594
+ };
1595
+ return XRReferenceImageLoader;
1596
+ }(engine.Loader);
1597
+ exports.XRReferenceImageLoader = __decorate([
1598
+ engine.resourceLoader("XRReferenceImage", [])
1599
+ ], exports.XRReferenceImageLoader);
1600
+
1601
+ exports.TrackableType = TrackableType;
1602
+ exports.XRAnchor = XRAnchor;
1603
+ exports.XRCamera = XRCamera;
1604
+ exports.XRCameraManager = XRCameraManager;
1605
+ exports.XRController = XRController;
1606
+ exports.XRFeature = XRFeature;
1607
+ exports.XRFeatureType = XRFeatureType;
1608
+ exports.XRHitResult = XRHitResult;
1609
+ exports.XRInputButton = XRInputButton;
1610
+ exports.XRInputEventType = XRInputEventType;
1611
+ exports.XRInputManager = XRInputManager;
1612
+ exports.XRPlaneMode = XRPlaneMode;
1613
+ exports.XRPose = XRPose;
1614
+ exports.XRReferenceImage = XRReferenceImage;
1615
+ exports.XRRequestTrackingState = XRRequestTrackingState;
1616
+ exports.XRSessionManager = XRSessionManager;
1617
+ exports.XRSessionMode = XRSessionMode;
1618
+ exports.XRSessionState = XRSessionState;
1619
+ exports.XRTargetRayMode = XRTargetRayMode;
1620
+ exports.XRTrackableFeature = XRTrackableFeature;
1621
+ exports.XRTracked = XRTracked;
1622
+ exports.XRTrackedImage = XRTrackedImage;
1623
+ exports.XRTrackedInputDevice = XRTrackedInputDevice;
1624
+ exports.XRTrackedPlane = XRTrackedPlane;
1625
+ exports.XRTrackingState = XRTrackingState;
1626
+
1627
+ Object.defineProperty(exports, '__esModule', { value: true });
1628
+
1629
+ }));
1630
+ //# sourceMappingURL=browser.js.map