UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 2.94 kB
import{path as e}from"../core/path.js";import{ABSOLUTE_URL as t}from"./asset/constants.js";import{SceneRegistryItem as s}from"./scene-registry-item.js";class i{constructor(e){this._app=void 0,this._list=[],this._index={},this._urlIndex={},this._app=e}destroy(){this._app=null}list(){return this._list}add(e,t){if(this._index.hasOwnProperty(e))return!1;const i=new s(e,t),a=this._list.push(i);return this._index[i.name]=a-1,this._urlIndex[i.url]=a-1,!0}find(e){return this._index.hasOwnProperty(e)?this._list[this._index[e]]:null}findByUrl(e){return this._urlIndex.hasOwnProperty(e)?this._list[this._urlIndex[e]]:null}remove(e){if(this._index.hasOwnProperty(e)){const t=this._index[e];let s=this._list[t];delete this._urlIndex[s.url],delete this._index[e],this._list.splice(t,1);for(let e=0;e<this._list.length;e++)s=this._list[e],this._index[s.name]=e,this._urlIndex[s.url]=e}}_loadSceneData(i,a,n){const l=this._app;let r=i;if("string"==typeof i&&(i=this.findByUrl(r)||this.find(r)||new s("Untitled",r)),r=i.url,r)if(i.loaded)n(null,i);else{if(l.assets&&l.assets.prefix&&!t.test(r)&&(r=e.join(l.assets.prefix,r)),i._onLoadedCallbacks.push(n),!i._loading){l.loader.getHandler("hierarchy").load(r,((e,t)=>{i.data=t,i._loading=!1;for(let t=0;t<i._onLoadedCallbacks.length;t++)i._onLoadedCallbacks[t](e,i);a||(i.data=null),i._onLoadedCallbacks.length=0}))}i._loading=!0}else n("Cannot find scene to load")}loadSceneData(e,t){this._loadSceneData(e,!0,t)}unloadSceneData(e){"string"==typeof e&&(e=this.findByUrl(e)),e&&(e.data=null)}_loadSceneHierarchy(e,t,s){this._loadSceneData(e,!1,((e,i)=>{if(e)return void(s&&s(e));t&&t(i);const a=this._app;a._preloadScripts(i.data,(()=>{const e=a.loader.getHandler("hierarchy");a.systems.script.preloading=!0;const t=e.open(i.url,i.data);a.systems.script.preloading=!1,a.loader.clearCache(i.url,"hierarchy"),a.root.addChild(t),a.systems.fire("initialize",t),a.systems.fire("postInitialize",t),a.systems.fire("postPostInitialize",t),s&&s(null,t)}))}))}loadSceneHierarchy(e,t){this._loadSceneHierarchy(e,null,t)}loadSceneSettings(e,t){this._loadSceneData(e,!1,((e,s)=>{e?t&&t(e):(this._app.applySceneSettings(s.data.settings),t&&t(null))}))}changeScene(e,t){const s=this._app;this._loadSceneHierarchy(e,(e=>{const{children:t}=s.root;for(;t.length;)t[0].destroy();s.applySceneSettings(e.data.settings)}),t)}loadScene(s,i){const a=this._app,n=a.loader.getHandler("scene");a.assets&&a.assets.prefix&&!t.test(s)&&(s=e.join(a.assets.prefix,s)),n.load(s,((e,t)=>{if(e)i&&i(e);else{const e=()=>{a.systems.script.preloading=!0;const e=n.open(s,t),l=this.findByUrl(s);l&&!l.loaded&&(l.data=t),a.systems.script.preloading=!1,a.loader.clearCache(s,"scene"),a.loader.patch({resource:e,type:"scene"},a.assets),a.root.addChild(e.root),a.systems.rigidbody&&"undefined"!=typeof Ammo&&a.systems.rigidbody.gravity.set(e._gravity.x,e._gravity.y,e._gravity.z),i&&i(null,e)};a._preloadScripts(t,e)}}))}}export{i as SceneRegistry};