@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 4.37 kB
JavaScript
import{EventHandler as e}from"../../core/event-handler.js";import{platform as t}from"../../core/platform.js";import{XrAnchor as s}from"./xr-anchor.js";class i extends e{constructor(e){var s;super(),this.manager=void 0,this._supported=t.browser&&!!window.XRAnchor,this._available=!1,this._checkingAvailability=!1,this._persistence=t.browser&&!(null==(s=window)||null==(s=s.XRSession)||!s.prototype.restorePersistentAnchor),this._creationQueue=[],this._index=new Map,this._indexByUuid=new Map,this._list=[],this._callbacksAnchors=new Map,this.manager=e,this._supported&&(this.manager.on("start",this._onSessionStart,this),this.manager.on("end",this._onSessionEnd,this))}_onSessionStart(){const e=-1!==this.manager.session.enabledFeatures.indexOf("anchors");e&&(this._available=e,this.fire("available"))}_onSessionEnd(){if(!this._available)return;this._available=!1;for(let e=0;e<this._creationQueue.length;e++)this._creationQueue[e].callback&&this._creationQueue[e].callback(new Error("session ended"),null);this._creationQueue.length=0,this._index.clear(),this._indexByUuid.clear();let e=this._list.length;for(;e--;)this._list[e].destroy();this._list.length=0,this.fire("unavailable")}_createAnchor(e,t=null){const i=new s(this,e,t);return this._index.set(e,i),t&&this._indexByUuid.set(t,i),this._list.push(i),i.once("destroy",this._onAnchorDestroy,this),i}_onAnchorDestroy(e,t){this._index.delete(e),t.uuid&&this._indexByUuid.delete(t.uuid);const s=this._list.indexOf(t);-1!==s&&this._list.splice(s,1),this.fire("destroy",t)}create(e,t,s){if(this._available)if(window.XRHitTestResult&&e instanceof XRHitTestResult){const i=e;if(s=t,!this._supported)return void(null==s||s(new Error("Anchors API is not supported"),null));if(!i.createAnchor)return void(null==s||s(new Error("Creating Anchor from Hit Test is not supported"),null));i.createAnchor().then((e=>{const t=this._createAnchor(e);null==s||s(null,t),this.fire("add",t)})).catch((e=>{null==s||s(e,null),this.fire("error",e)}))}else this._creationQueue.push({transform:new XRRigidTransform(e,t),callback:s});else null==s||s(new Error("Anchors API is not available"),null)}restore(e,t){this._available?this._persistence?this.manager.active?this.manager.session.restorePersistentAnchor(e).then((s=>{const i=this._createAnchor(s,e);null==t||t(null,i),this.fire("add",i)})).catch((e=>{null==t||t(e,null),this.fire("error",e)})):null==t||t(new Error("WebXR session is not active"),null):null==t||t(new Error("Anchor Persistence is not supported"),null):null==t||t(new Error("Anchors API is not available"),null)}forget(e,t){this._available?this._persistence?this.manager.active?this.manager.session.deletePersistentAnchor(e).then((()=>{null==t||t(null)})).catch((e=>{null==t||t(e),this.fire("error",e)})):null==t||t(new Error("WebXR session is not active")):null==t||t(new Error("Anchor Persistence is not supported")):null==t||t(new Error("Anchors API is not available"))}update(e){if(this._available){if(this._creationQueue.length){for(let t=0;t<this._creationQueue.length;t++){const s=this._creationQueue[t];e.createAnchor(s.transform,this.manager._referenceSpace).then((e=>{s.callback&&this._callbacksAnchors.set(e,s.callback)})).catch((e=>{s.callback&&s.callback(e,null),this.fire("error",e)}))}this._creationQueue.length=0}for(const[t,s]of this._index)e.trackedAnchors.has(t)||(this._index.delete(t),s.destroy());for(let t=0;t<this._list.length;t++)this._list[t].update(e);for(const t of e.trackedAnchors){if(this._index.has(t))continue;try{t.anchorSpace}catch(e){continue}const s=this._createAnchor(t);s.update(e);const i=this._callbacksAnchors.get(t);i&&(this._callbacksAnchors.delete(t),i(null,s)),this.fire("add",s)}}else this.manager.session.enabledFeatures||this._checkingAvailability||(this._checkingAvailability=!0,e.createAnchor(new XRRigidTransform,this.manager._referenceSpace).then((e=>{e.delete(),this.manager.active&&(this._available=!0,this.fire("available"))})).catch((()=>{})))}get supported(){return this._supported}get available(){return this._available}get persistence(){return this._persistence}get uuids(){return this._available&&this._persistence&&this.manager.active?this.manager.session.persistentAnchors:null}get list(){return this._list}}i.EVENT_AVAILABLE="available",i.EVENT_UNAVAILABLE="unavailable",i.EVENT_ERROR="error",i.EVENT_ADD="add",i.EVENT_DESTROY="destroy";export{i as XrAnchors};