UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 5.34 kB
import{path as e}from"../../core/path.js";import{EventHandler as t}from"../../core/event-handler.js";import{TagsCache as s}from"../../core/tags-cache.js";import{standardMaterialTextureParameters as r}from"../../scene/materials/standard-material-parameters.js";import{script as o}from"../script.js";import{Asset as a}from"./asset.js";class i extends t{constructor(e){super(),this._assets=new Set,this._idToAsset=new Map,this._urlToAsset=new Map,this._nameToAsset=new Map,this._tags=new s("_id"),this.prefix=null,this.bundles=null,this._loader=e}list(e={}){const t=Array.from(this._assets);return void 0!==e.preload?t.filter((t=>t.preload===e.preload)):t}add(e){var t,s;this._assets.has(e)||(this._assets.add(e),this._idToAsset.set(e.id,e),null!=(t=e.file)&&t.url&&this._urlToAsset.set(e.file.url,e),this._nameToAsset.has(e.name)||this._nameToAsset.set(e.name,new Set),this._nameToAsset.get(e.name).add(e),e.on("name",this._onNameChange,this),e.registry=this,this._tags.addItem(e),e.tags.on("add",this._onTagAdd,this),e.tags.on("remove",this._onTagRemove,this),this.fire("add",e),this.fire(`add:${e.id}`,e),null!=(s=e.file)&&s.url&&this.fire(`add:url:${e.file.url}`,e),e.preload&&this.load(e))}remove(e){var t,s;if(!this._assets.has(e))return!1;if(this._assets.delete(e),this._idToAsset.delete(e.id),null!=(t=e.file)&&t.url&&this._urlToAsset.delete(e.file.url),e.off("name",this._onNameChange,this),this._nameToAsset.has(e.name)){const t=this._nameToAsset.get(e.name);t.delete(e),0===t.size&&this._nameToAsset.delete(e.name)}return this._tags.removeItem(e),e.tags.off("add",this._onTagAdd,this),e.tags.off("remove",this._onTagRemove,this),e.fire("remove",e),this.fire("remove",e),this.fire(`remove:${e.id}`,e),null!=(s=e.file)&&s.url&&this.fire(`remove:url:${e.file.url}`,e),!0}get(e){return this._idToAsset.get(Number(e))}getByUrl(e){return this._urlToAsset.get(e)}load(e,t){if((e.loading||e.loaded)&&(null==t||!t.force))return;const s=e.file,r=()=>{this.fire("load",e),this.fire(`load:${e.id}`,e),s&&s.url&&this.fire(`load:url:${s.url}`,e),e.fire("load",e)},a=t=>{if(t instanceof Array?e.resources=t:e.resource=t,this._loader.patch(e,this),"bundle"===e.type){const t=e.data.assets;for(let e=0;e<t.length;e++){const s=this._idToAsset.get(t[e]);s&&!s.loaded&&this.load(s,{force:!0})}e.resource.loaded?r():(this.fire("load:start",e),this.fire(`load:start:${e.id}`,e),s&&s.url&&this.fire(`load:start:url:${s.url}`,e),e.fire("load:start",e),e.resource.on("load",r))}else r()},i=(t,s,r)=>{if(e.loaded=!0,e.loading=!1,t)this.fire("error",t,e),this.fire(`error:${e.id}`,t,e),e.fire("error",t,e);else{if(!o.legacy&&"script"===e.type){const t=this._loader.getHandler("script");t._cache[e.id]&&t._cache[e.id].parentNode===document.head&&document.head.removeChild(t._cache[e.id]),t._cache[e.id]=r}a(s)}};if(s||"cubemap"===e.type){this.fire("load:start",e),this.fire(`load:${e.id}:start`,e),e.loading=!0;const s=e.getFileUrl();if("bundle"===e.type){const t=e.data.assets;for(let e=0;e<t.length;e++){const s=this._idToAsset.get(t[e]);s&&(s.loaded||s.resource||s.loading||(s.loading=!0))}}this._loader.load(s,e.type,i,e,t)}else{const t=this._loader.open(e.type,e.data);e.loaded=!0,a(t)}}loadFromUrl(e,t,s){this.loadFromUrlAndFilename(e,null,t,s)}loadFromUrlAndFilename(t,s,r,o){const i=e.getBasename(s||t),l={filename:s||i,url:t};let n=this.getByUrl(t);if(n){if(n.loaded)return void o(n.loadFromUrlError||null,n)}else n=new a(i,r,l),this.add(n);const d=e=>{e.once("load",(e=>{"material"===r?this._loadTextures(e,((t,s)=>{o(t,e)})):o(null,e)})),e.once("error",(t=>{t&&(this.loadFromUrlError=t),o(t,e)})),this.load(e)};n.resource?o(null,n):"model"===r?this._loadModel(n,d):d(n)}_loadModel(t,s){const r=t.getFileUrl(),o=e.getExtension(r);if(".json"===o||".glb"===o){const a=e.getDirectory(r),i=e.getBasename(r),l=e.join(a,i.replace(o,".mapping.json"));this._loader.load(l,"json",((e,r)=>{e?(t.data={mapping:[]},s(t)):this._loadMaterials(t,r,((e,o)=>{t.data=r,s(t)}))}))}else s(t)}_loadMaterials(e,t,s){const r=[];let o=0;const a=(e,t)=>{this._loadTextures(t,((e,a)=>{r.push(t),r.length===o&&s(null,r)}))};for(let s=0;s<t.mapping.length;s++){const r=t.mapping[s].path;if(r){o++;const t=e.getAbsoluteUrl(r);this.loadFromUrl(t,"material",a)}}0===o&&s(null,r)}_loadTextures(e,t){const s=[];let o=0;const a=e.data;if("path"!==a.mappingFormat)return void t(null,s);const i=(e,r)=>{e&&console.error(e),s.push(r),s.length===o&&t(null,s)},l=r;for(let t=0;t<l.length;t++){const s=a[l[t]];if(s&&"string"==typeof s){o++;const t=e.getAbsoluteUrl(s);this.loadFromUrl(t,"texture",i)}}0===o&&t(null,s)}_onTagAdd(e,t){this._tags.add(e,t)}_onTagRemove(e,t){this._tags.remove(e,t)}_onNameChange(e,t,s){if(this._nameToAsset.has(s)){const t=this._nameToAsset.get(s);t.delete(e),0===t.size&&this._nameToAsset.delete(s)}this._nameToAsset.has(e.name)||this._nameToAsset.set(e.name,new Set),this._nameToAsset.get(e.name).add(e)}findByTag(){return this._tags.find(arguments)}filter(e){return Array.from(this._assets).filter((t=>e(t)))}find(e,t){const s=this._nameToAsset.get(e);if(!s)return null;for(const e of s)if(!t||e.type===t)return e;return null}findAll(e,t){const s=this._nameToAsset.get(e);if(!s)return[];const r=Array.from(s);return t?r.filter((e=>e.type===t)):r}}i.EVENT_LOAD="load",i.EVENT_ADD="add",i.EVENT_REMOVE="remove",i.EVENT_ERROR="error";export{i as AssetRegistry};