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