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