@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 2.44 kB
JavaScript
import{EventHandler as s}from"../../core/event-handler.js";import{Asset as t}from"./asset.js";class i extends s{constructor(s,i){super(),this._assets=new Set,this._loadingAssets=new Set,this._waitingAssets=new Set,this._registry=i,this._loading=!1,this._loaded=!1,this._failed=[],s.forEach((s=>{if(s instanceof t)s.registry||(s.registry=i),this._assets.add(s);else{const t=i.get(s);t?this._assets.add(t):this._waitForAsset(s)}}))}destroy(){const s=this;this._registry.off("load",this._onLoad),this._registry.off("error",this._onError),this._waitingAssets.forEach((function(t){s._registry.off(`add:${t}`,this._onAddAsset)})),this.off("progress"),this.off("load")}_assetHasDependencies(s){var t;return"model"===s.type&&(null==(t=s.file)?void 0:t.url)&&s.file.url&&s.file.url.match(/.json$/g)}load(s,t){if(this._loading)return;this._loading=!0,this._callback=s,this._scope=t,this._registry.on("load",this._onLoad,this),this._registry.on("error",this._onError,this);let i=!1;this._assets.forEach((s=>{s.loaded||(i=!0,this._assetHasDependencies(s)&&this._registry.loadFromUrl(s.file.url,s.type,((t,i)=>{t?this._onError(t,s):this._onLoad(s)})),this._loadingAssets.add(s),this._registry.add(s))})),this._loadingAssets.forEach((s=>{this._assetHasDependencies(s)||this._registry.load(s)})),i||0!==this._waitingAssets.size||this._loadingComplete()}ready(s,t=this){this._loaded?s.call(t,Array.from(this._assets)):this.once("load",(i=>{s.call(t,i)}))}_loadingComplete(){this._loaded||(this._loaded=!0,this._registry.off("load",this._onLoad,this),this._registry.off("error",this._onError,this),this._failed.length?(this._callback&&this._callback.call(this._scope,"Failed to load some assets",this._failed),this.fire("error",this._failed)):(this._callback&&this._callback.call(this._scope),this.fire("load",Array.from(this._assets))))}_onLoad(s){this._loadingAssets.has(s)&&(this.fire("progress",s),this._loadingAssets.delete(s)),0===this._loadingAssets.size&&setTimeout((()=>{this._loadingComplete(this._failed)}),0)}_onError(s,t){this._loadingAssets.has(t)&&(this._failed.push(t),this._loadingAssets.delete(t)),0===this._loadingAssets.size&&setTimeout((()=>{this._loadingComplete(this._failed)}),0)}_onAddAsset(s){this._waitingAssets.delete(s),this._assets.add(s),s.loaded||(this._loadingAssets.add(s),this._registry.load(s))}_waitForAsset(s){this._waitingAssets.add(s),this._registry.once(`add:${s}`,this._onAddAsset,this)}}export{i as AssetListLoader};