@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 1.88 kB
JavaScript
import{path as e}from"../../core/path.js";import{Http as r,http as s}from"../../platform/net/http.js";import{getDefaultMaterial as t}from"../../scene/materials/default-material.js";import{GlbModelParser as a}from"../parsers/glb-model.js";import{JsonModelParser as i}from"../parsers/json-model.js";import{ResourceHandler as o}from"./handler.js";class n extends o{constructor(r){super(r,"model"),this._parsers=[],this.device=r.graphicsDevice,this.assets=r.assets,this.defaultMaterial=t(this.device),this.addParser(new i(this),((r,s)=>".json"===e.getExtension(r))),this.addParser(new a(this),((r,s)=>".glb"===e.getExtension(r)))}load(t,a,i){"string"==typeof t&&(t={load:t,original:t});const o={retry:this.maxRetries>0,maxRetries:this.maxRetries};(t.load.startsWith("blob:")||t.load.startsWith("data:"))&&(".glb"===e.getExtension(t.original).toLowerCase()?o.responseType=r.ResponseType.ARRAY_BUFFER:o.responseType=r.ResponseType.JSON),s.get(t.load,o,((e,r)=>{if(a)if(e)a(`Error loading model: ${t.original} [${e}]`);else{for(let e=0;e<this._parsers.length;e++){const s=this._parsers[e];if(s.decider(t.original,r))return void s.parser.parse(r,((e,r)=>{e?a(e):a(null,r)}),i)}a("No parsers found")}}))}open(e,r){return r}patch(e,r){if(!e.resource)return;const s=e.data,t=this;e.resource.meshInstances.forEach(((a,i)=>{if(s.mapping){const o=function e(s){s.resource?a.material=s.resource:(s.once("load",e),r.load(s)),s.once("remove",(e=>{a.material===e.resource&&(a.material=t.defaultMaterial)}))};if(!s.mapping[i])return void(a.material=t.defaultMaterial);const n=s.mapping[i].material,l=s.mapping[i].path;let p;if(void 0!==n)n?(p=r.get(n),p?o(p):r.once(`add:${n}`,o)):a.material=t.defaultMaterial;else if(l){const t=e.getAbsoluteUrl(s.mapping[i].path);p=r.getByUrl(t),p?o(p):r.once(`add:url:${t}`,o)}}}))}addParser(e,r){this._parsers.push({parser:e,decider:r})}}export{n as ModelHandler};