@galacean/engine-xr 0.0.0-experimental-stateMachine.0 → 0.0.0-experimental-1.3-xr.1

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.
package/dist/module.js CHANGED
@@ -1,4 +1,4 @@
1
- import { CameraType, Matrix, CameraClearFlags, Vector3, Quaternion, Rect, XRManager, Ray, Plane, Vector2 } from '@galacean/engine';
1
+ import { CameraType, Matrix, CameraClearFlags, Vector3, Quaternion, Rect, XRManager, Ray, Plane, Vector2, decoder, resourceLoader, AssetPromise, decode, Loader, registerSceneExtendParser, Logger, Camera } from '@galacean/engine';
2
2
 
3
3
  function _is_native_reflect_construct() {
4
4
  if (typeof Reflect === "undefined" || !Reflect.construct) return false;
@@ -522,6 +522,7 @@ var XRTargetRayMode;
522
522
  this._engine = _engine;
523
523
  this._mode = XRSessionMode.None;
524
524
  this._state = XRSessionState.None;
525
+ this._listeners = [];
525
526
  // @ts-ignore
526
527
  this._rhi = _engine._hardwareRenderer;
527
528
  this._raf = requestAnimationFrame.bind(window);
@@ -544,7 +545,7 @@ var XRTargetRayMode;
544
545
  throw new Error("Without session to run.");
545
546
  }
546
547
  platformSession.start();
547
- this._state = XRSessionState.Running;
548
+ this.state = XRSessionState.Running;
548
549
  this._xrManager._onSessionStart();
549
550
  if (!engine.isPaused) {
550
551
  engine.pause();
@@ -564,7 +565,7 @@ var XRTargetRayMode;
564
565
  rhi._mainFrameBuffer = null;
565
566
  rhi._mainFrameWidth = rhi._mainFrameHeight = 0;
566
567
  platformSession.stop();
567
- this._state = XRSessionState.Paused;
568
+ this.state = XRSessionState.Paused;
568
569
  this._xrManager._onSessionStop();
569
570
  if (!engine.isPaused) {
570
571
  engine.pause();
@@ -572,6 +573,22 @@ var XRTargetRayMode;
572
573
  }
573
574
  };
574
575
  /**
576
+ * Add a listening function for session state changes.
577
+ * @param listener - The listening function
578
+ */ _proto.addChangedListener = function addChangedListener(listener) {
579
+ this._listeners.push(listener);
580
+ };
581
+ /**
582
+ * Remove a listening function of session state changes.
583
+ * @param listener - The listening function
584
+ */ _proto.removeChangedListener = function removeChangedListener(listener) {
585
+ var _this = this, listeners = _this._listeners;
586
+ var index = listeners.indexOf(listener);
587
+ if (index >= 0) {
588
+ listeners.splice(index, 1);
589
+ }
590
+ };
591
+ /**
575
592
  * @internal
576
593
  */ _proto._initialize = function _initialize(mode, features) {
577
594
  var _this = this;
@@ -586,7 +603,7 @@ var XRTargetRayMode;
586
603
  xrManager._platformDevice.requestSession(_this._rhi, mode, platformFeatures).then(function(platformSession) {
587
604
  _this._mode = mode;
588
605
  _this._platformSession = platformSession;
589
- _this._state = XRSessionState.Initialized;
606
+ _this.state = XRSessionState.Initialized;
590
607
  platformSession.setSessionExitCallBack(_this._onSessionExit);
591
608
  platformSession.addEventListener();
592
609
  xrManager._onSessionInit();
@@ -635,7 +652,7 @@ var XRTargetRayMode;
635
652
  rhi._mainFrameWidth = rhi._mainFrameHeight = 0;
636
653
  platformSession.removeEventListener();
637
654
  this._platformSession = null;
638
- this._state = XRSessionState.None;
655
+ this.state = XRSessionState.None;
639
656
  this._xrManager._onSessionExit();
640
657
  if (!engine.isPaused) {
641
658
  engine.pause();
@@ -660,6 +677,15 @@ var XRTargetRayMode;
660
677
  * Return the current session state.
661
678
  */ function get() {
662
679
  return this._state;
680
+ },
681
+ set: /**
682
+ * @internal
683
+ */ function set(value) {
684
+ this._state = value;
685
+ var listeners = this._listeners;
686
+ for(var i = 0, n = listeners.length; i < n; i++){
687
+ listeners[i](value);
688
+ }
663
689
  }
664
690
  },
665
691
  {
@@ -709,21 +735,23 @@ var XRTargetRayMode;
709
735
  if (this.sessionManager._platformSession) {
710
736
  throw new Error("Cannot add feature when the session is initialized.");
711
737
  }
712
- var _this = this, features = _this._features;
738
+ if (!this._platformDevice.isSupportedFeature(XRManagerExtended._featureMap.get(type))) {
739
+ throw new Error("The feature is not supported");
740
+ }
741
+ var features = this.features;
713
742
  for(var i = 0, n = features.length; i < n; i++){
714
- var feature = features[i];
715
- if (_instanceof(feature, type)) throw new Error("The feature has been added");
743
+ if (_instanceof(features[i], type)) throw new Error("The feature has been added");
716
744
  }
717
- var feature1 = _construct(type, [].concat(this, args));
718
- this._features.push(feature1);
719
- return feature1;
745
+ var feature = _construct(type, [].concat(this, args));
746
+ features.push(feature);
747
+ return feature;
720
748
  };
721
749
  /**
722
750
  * Get feature which match the type.
723
751
  * @param type - The type of the feature
724
752
  * @returns The feature which match type
725
753
  */ _proto.getFeature = function getFeature(type) {
726
- var _this = this, features = _this._features;
754
+ var features = this.features;
727
755
  for(var i = 0, n = features.length; i < n; i++){
728
756
  var feature = features[i];
729
757
  if (_instanceof(feature, type)) {
@@ -731,19 +759,6 @@ var XRTargetRayMode;
731
759
  }
732
760
  }
733
761
  };
734
- _proto.getFeatures = function getFeatures(type, out) {
735
- if (out) {
736
- out.length = 0;
737
- } else {
738
- out = [];
739
- }
740
- var _this = this, features = _this._features;
741
- for(var i = 0, n = features.length; i < n; i--){
742
- var feature = features[i];
743
- _instanceof(feature, type) && out.push(feature);
744
- }
745
- return out;
746
- };
747
762
  /**
748
763
  * Enter XR immersive mode, when you call this method, it will initialize and display the XR virtual world.
749
764
  * @param sessionMode - The mode of the session
@@ -763,7 +778,7 @@ var XRTargetRayMode;
763
778
  // 1. Check if this xr mode is supported
764
779
  sessionManager.isSupportedMode(sessionMode).then(function() {
765
780
  // 2. Initialize session
766
- sessionManager._initialize(sessionMode, _this._features).then(function() {
781
+ sessionManager._initialize(sessionMode, _this.features).then(function() {
767
782
  autoRun && sessionManager.run();
768
783
  resolve();
769
784
  }, reject);
@@ -784,7 +799,7 @@ var XRTargetRayMode;
784
799
  /**
785
800
  * @internal
786
801
  */ _proto._initialize = function _initialize(engine, xrDevice) {
787
- this._features = [];
802
+ this.features.length = 0;
788
803
  this._platformDevice = xrDevice;
789
804
  this.sessionManager = new XRSessionManager(this, engine);
790
805
  this.inputManager = new XRInputManager(this, engine);
@@ -798,7 +813,7 @@ var XRTargetRayMode;
798
813
  sessionManager._onUpdate();
799
814
  this.inputManager._onUpdate();
800
815
  this.cameraManager._onUpdate();
801
- var _this = this, features = _this._features;
816
+ var features = this.features;
802
817
  for(var i = 0, n = features.length; i < n; i++){
803
818
  var feature = features[i];
804
819
  feature.enabled && feature._onUpdate();
@@ -838,7 +853,7 @@ var XRTargetRayMode;
838
853
  /**
839
854
  * @internal
840
855
  */ _proto._onSessionStop = function _onSessionStop() {
841
- var _this = this, features = _this._features;
856
+ var features = this.features;
842
857
  for(var i = 0, n = features.length; i < n; i++){
843
858
  var feature = features[i];
844
859
  feature.enabled && feature._onSessionStop();
@@ -847,7 +862,7 @@ var XRTargetRayMode;
847
862
  /**
848
863
  * @internal
849
864
  */ _proto._onSessionInit = function _onSessionInit() {
850
- var _this = this, features = _this._features;
865
+ var features = this.features;
851
866
  for(var i = 0, n = features.length; i < n; i++){
852
867
  var feature = features[i];
853
868
  feature.enabled && feature._onSessionInit();
@@ -857,7 +872,7 @@ var XRTargetRayMode;
857
872
  * @internal
858
873
  */ _proto._onSessionStart = function _onSessionStart() {
859
874
  this.cameraManager._onSessionStart();
860
- var _this = this, features = _this._features;
875
+ var features = this.features;
861
876
  for(var i = 0, n = features.length; i < n; i++){
862
877
  var feature = features[i];
863
878
  feature.enabled && feature._onSessionStart();
@@ -867,7 +882,7 @@ var XRTargetRayMode;
867
882
  * @internal
868
883
  */ _proto._onSessionExit = function _onSessionExit() {
869
884
  this.cameraManager._onSessionExit();
870
- var _this = this, features = _this._features;
885
+ var features = this.features;
871
886
  for(var i = 0, n = features.length; i < n; i++){
872
887
  var feature = features[i];
873
888
  feature.enabled && feature._onSessionExit();
@@ -1013,6 +1028,34 @@ function __decorate(decorators, target, key, desc) {
1013
1028
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1014
1029
  }
1015
1030
 
1031
+ function __generator(thisArg, body) {
1032
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
1033
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
1034
+ function verb(n) { return function (v) { return step([n, v]); }; }
1035
+ function step(op) {
1036
+ if (f) throw new TypeError("Generator is already executing.");
1037
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
1038
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
1039
+ if (y = 0, t) op = [op[0] & 2, t.value];
1040
+ switch (op[0]) {
1041
+ case 0: case 1: t = op; break;
1042
+ case 4: _.label++; return { value: op[1], done: false };
1043
+ case 5: _.label++; y = op[1]; op = [0]; continue;
1044
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
1045
+ default:
1046
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
1047
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
1048
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
1049
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
1050
+ if (t[2]) _.ops.pop();
1051
+ _.trys.pop(); continue;
1052
+ }
1053
+ op = body.call(thisArg, _);
1054
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
1055
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
1056
+ }
1057
+ }
1058
+
1016
1059
  typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
1017
1060
  var e = new Error(message);
1018
1061
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
@@ -1555,5 +1598,259 @@ XRImageTracking = __decorate([
1555
1598
  this.physicalWidth = physicalWidth;
1556
1599
  };
1557
1600
 
1558
- export { TrackableType, XRAnchor, XRAnchorTracking, XRCamera, XRCameraManager, XRController, XRFeature, XRFeatureType, XRHitResult, XRHitTest, XRImageTracking, XRInputButton, XRInputEventType, XRInputManager, XRPlaneMode, XRPlaneTracking, XRPose, XRReferenceImage, XRRequestTrackingState, XRSessionManager, XRSessionMode, XRSessionState, XRTargetRayMode, XRTrackedImage, XRTrackedInputDevice, XRTrackedPlane, XRTrackingState };
1601
+ var XRReferenceImageDecoder = /*#__PURE__*/ function() {
1602
+ function XRReferenceImageDecoder() {}
1603
+ XRReferenceImageDecoder.decode = function decode(engine, bufferReader) {
1604
+ return new Promise(function(resolve, reject) {
1605
+ var physicalWidth = bufferReader.nextFloat32();
1606
+ bufferReader.nextUint8();
1607
+ var img = new Image();
1608
+ img.onload = function() {
1609
+ resolve(new XRReferenceImage("", img, physicalWidth));
1610
+ };
1611
+ img.src = URL.createObjectURL(new window.Blob([
1612
+ bufferReader.nextImagesData(1)[0]
1613
+ ]));
1614
+ });
1615
+ };
1616
+ return XRReferenceImageDecoder;
1617
+ }();
1618
+ XRReferenceImageDecoder = __decorate([
1619
+ decoder("XRReferenceImage")
1620
+ ], XRReferenceImageDecoder);
1621
+
1622
+ function _extends() {
1623
+ _extends = Object.assign || function assign(target) {
1624
+ for (var i = 1; i < arguments.length; i++) {
1625
+ var source = arguments[i];
1626
+ for (var key in source) if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
1627
+ }
1628
+
1629
+ return target;
1630
+ };
1631
+
1632
+ return _extends.apply(this, arguments);
1633
+ }
1634
+
1635
+ var XRReferenceImageLoader = /*#__PURE__*/ function(Loader1) {
1636
+ _inherits(XRReferenceImageLoader, Loader1);
1637
+ function XRReferenceImageLoader() {
1638
+ return Loader1.apply(this, arguments);
1639
+ }
1640
+ var _proto = XRReferenceImageLoader.prototype;
1641
+ _proto.load = function load(item, resourceManager) {
1642
+ var _this = this;
1643
+ return new AssetPromise(function(resolve, reject) {
1644
+ _this.request(item.url, _extends({}, item, {
1645
+ type: "arraybuffer"
1646
+ })).then(function(data) {
1647
+ decode(data, resourceManager.engine).then(function(referenceImage) {
1648
+ resolve(referenceImage);
1649
+ });
1650
+ }).catch(reject);
1651
+ });
1652
+ };
1653
+ return XRReferenceImageLoader;
1654
+ }(Loader);
1655
+ XRReferenceImageLoader = __decorate([
1656
+ resourceLoader("XRReferenceImage", [])
1657
+ ], XRReferenceImageLoader);
1658
+
1659
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
1660
+ try {
1661
+ var info = gen[key](arg);
1662
+ var value = info.value;
1663
+ } catch (error) {
1664
+ reject(error);
1665
+ return;
1666
+ }
1667
+ if (info.done) resolve(value);
1668
+ else Promise.resolve(value).then(_next, _throw);
1669
+ }
1670
+ function _async_to_generator(fn) {
1671
+ return function() {
1672
+ var self = this, args = arguments;
1673
+
1674
+ return new Promise(function(resolve, reject) {
1675
+ var gen = fn.apply(self, args);
1676
+
1677
+ function _next(value) {
1678
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
1679
+ }
1680
+
1681
+ function _throw(err) {
1682
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
1683
+ }
1684
+
1685
+ _next(undefined);
1686
+ });
1687
+ };
1688
+ }
1689
+
1690
+ var XRSceneExtendParser = /*#__PURE__*/ function() {
1691
+ function XRSceneExtendParser() {}
1692
+ XRSceneExtendParser.parse = function parse(engine, context, data) {
1693
+ return _async_to_generator(function() {
1694
+ var xrManager, xr, origin, camera, leftCamera, rightCamera, features, entityMap, cameraManager, i, n, feature, _;
1695
+ return __generator(this, function(_state) {
1696
+ switch(_state.label){
1697
+ case 0:
1698
+ xrManager = engine.xrManager;
1699
+ if (!xrManager) {
1700
+ Logger.error("XRManager is not found in the engine.");
1701
+ return [
1702
+ 2
1703
+ ];
1704
+ }
1705
+ xr = data.scene.xr;
1706
+ origin = xr.origin, camera = xr.camera, leftCamera = xr.leftCamera, rightCamera = xr.rightCamera, features = xr.features;
1707
+ entityMap = context.entityMap;
1708
+ origin && (xrManager.origin = entityMap.get(origin));
1709
+ cameraManager = xrManager.cameraManager;
1710
+ setCamera(cameraManager, XRTrackedInputDevice.Camera, entityMap.get(camera));
1711
+ setCamera(cameraManager, XRTrackedInputDevice.LeftCamera, entityMap.get(leftCamera));
1712
+ setCamera(cameraManager, XRTrackedInputDevice.RightCamera, entityMap.get(rightCamera));
1713
+ i = 0, n = features.length;
1714
+ _state.label = 1;
1715
+ case 1:
1716
+ if (!(i < n)) return [
1717
+ 3,
1718
+ 9
1719
+ ];
1720
+ feature = features[i];
1721
+ if (!feature.enable) return [
1722
+ 3,
1723
+ 8
1724
+ ];
1725
+ _ = feature.type;
1726
+ switch(_){
1727
+ case XRFeatureType.ImageTracking:
1728
+ return [
1729
+ 3,
1730
+ 2
1731
+ ];
1732
+ case XRFeatureType.PlaneTracking:
1733
+ return [
1734
+ 3,
1735
+ 4
1736
+ ];
1737
+ case XRFeatureType.AnchorTracking:
1738
+ return [
1739
+ 3,
1740
+ 5
1741
+ ];
1742
+ case XRFeatureType.HitTest:
1743
+ return [
1744
+ 3,
1745
+ 6
1746
+ ];
1747
+ }
1748
+ return [
1749
+ 3,
1750
+ 7
1751
+ ];
1752
+ case 2:
1753
+ return [
1754
+ 4,
1755
+ addImageTracking(engine, xrManager, feature)
1756
+ ];
1757
+ case 3:
1758
+ _state.sent();
1759
+ return [
1760
+ 3,
1761
+ 8
1762
+ ];
1763
+ case 4:
1764
+ addPlaneTracking(xrManager, feature);
1765
+ return [
1766
+ 3,
1767
+ 8
1768
+ ];
1769
+ case 5:
1770
+ addAnchorTracking(xrManager, feature);
1771
+ return [
1772
+ 3,
1773
+ 8
1774
+ ];
1775
+ case 6:
1776
+ addHitTest(xrManager);
1777
+ return [
1778
+ 3,
1779
+ 8
1780
+ ];
1781
+ case 7:
1782
+ return [
1783
+ 3,
1784
+ 8
1785
+ ];
1786
+ case 8:
1787
+ i++;
1788
+ return [
1789
+ 3,
1790
+ 1
1791
+ ];
1792
+ case 9:
1793
+ return [
1794
+ 2
1795
+ ];
1796
+ }
1797
+ });
1798
+ })();
1799
+ };
1800
+ return XRSceneExtendParser;
1801
+ }();
1802
+ XRSceneExtendParser = __decorate([
1803
+ registerSceneExtendParser("XR")
1804
+ ], XRSceneExtendParser);
1805
+ function addImageTracking(engine, xrManager, schema) {
1806
+ if (!xrManager.isSupportedFeature(XRImageTracking)) {
1807
+ Logger.error("Image Tracking is not supported.");
1808
+ return;
1809
+ }
1810
+ var promises = [];
1811
+ var images = schema.images;
1812
+ var resourceManager = engine.resourceManager;
1813
+ for(var i = 0, n = images.length; i < n; i++){
1814
+ // @ts-ignore
1815
+ promises.push(resourceManager.getResourceByRef(images[i]));
1816
+ }
1817
+ return Promise.all(promises).then(function(xrReferenceImages) {
1818
+ xrManager.addFeature(XRImageTracking, xrReferenceImages);
1819
+ });
1820
+ }
1821
+ function addPlaneTracking(xrManager, schema) {
1822
+ if (!xrManager.isSupportedFeature(XRPlaneTracking)) {
1823
+ Logger.error("Plane Tracking is not supported.");
1824
+ return;
1825
+ }
1826
+ xrManager.addFeature(XRPlaneTracking, schema.detectionMode);
1827
+ }
1828
+ function addAnchorTracking(xrManager, schema) {
1829
+ if (!xrManager.isSupportedFeature(XRAnchorTracking)) {
1830
+ Logger.error("Anchor Tracking is not supported.");
1831
+ return;
1832
+ }
1833
+ var anchorTracking = xrManager.addFeature(XRAnchorTracking);
1834
+ var anchors = schema.anchors;
1835
+ for(var i = 0, n = anchors.length; i < n; i++){
1836
+ var anchor = anchors[i];
1837
+ var position = new Vector3().copyFrom(anchor.position);
1838
+ var rotation = new Quaternion().copyFrom(anchor.rotation);
1839
+ anchorTracking.addAnchor(position, rotation);
1840
+ }
1841
+ }
1842
+ function addHitTest(xrManager, schema) {
1843
+ if (!xrManager.isSupportedFeature(XRHitTest)) {
1844
+ Logger.error("Hit Test is not supported.");
1845
+ return;
1846
+ }
1847
+ xrManager.addFeature(XRHitTest);
1848
+ }
1849
+ function setCamera(cameraManager, device, entity) {
1850
+ var _entity;
1851
+ var camera = (_entity = entity) == null ? void 0 : _entity.getComponent(Camera);
1852
+ camera && cameraManager.attachCamera(device, camera);
1853
+ }
1854
+
1855
+ export { TrackableType, XRAnchor, XRAnchorTracking, XRCamera, XRCameraManager, XRController, XRFeature, XRFeatureType, XRHitResult, XRHitTest, XRImageTracking, XRInputButton, XRInputEventType, XRInputManager, XRPlaneMode, XRPlaneTracking, XRPose, XRReferenceImage, XRReferenceImageDecoder, XRReferenceImageLoader, XRRequestTrackingState, XRSceneExtendParser, XRSessionManager, XRSessionMode, XRSessionState, XRTargetRayMode, XRTrackedImage, XRTrackedInputDevice, XRTrackedPlane, XRTrackingState };
1559
1856
  //# sourceMappingURL=module.js.map