UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

69 lines (68 loc) 1.9 kB
import { getDefaultMaterial } from "../../scene/materials/default-material.js"; import { GlbModelParser } from "../parsers/glb-model.js"; import { JsonModelParser } from "../parsers/json-model.js"; import { ResourceHandler } from "./handler.js"; class ModelHandler extends ResourceHandler { constructor(app) { super(app, "model"); this.device = app.graphicsDevice; this.assets = app.assets; this.defaultMaterial = getDefaultMaterial(this.device); this.addParser(new JsonModelParser(this)); this.addParser(new GlbModelParser(this)); } patch(asset, assets) { if (!asset.resource) { return; } const data = asset.data; const self = this; asset.resource.meshInstances.forEach((meshInstance, i) => { if (data.mapping) { const handleMaterial = function(asset2) { if (asset2.resource) { meshInstance.material = asset2.resource; } else { asset2.once("load", handleMaterial); assets.load(asset2); } asset2.once("remove", (asset3) => { if (meshInstance.material === asset3.resource) { meshInstance.material = self.defaultMaterial; } }); }; if (!data.mapping[i]) { meshInstance.material = self.defaultMaterial; return; } const id = data.mapping[i].material; const url = data.mapping[i].path; let material; if (id !== void 0) { if (!id) { meshInstance.material = self.defaultMaterial; } else { material = assets.get(id); if (material) { handleMaterial(material); } else { assets.once(`add:${id}`, handleMaterial); } } } else if (url) { const path = asset.getAbsoluteUrl(data.mapping[i].path); material = assets.getByUrl(path); if (material) { handleMaterial(material); } else { assets.once(`add:url:${path}`, handleMaterial); } } } }); } } export { ModelHandler };