@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 1.52 kB
JavaScript
import{Entity as e}from"../entity.js";import{CompressUtils as t}from"../../scene/compress/compress-utils.js";import{Decompress as s}from"../../scene/compress/decompress.js";class n{constructor(e,t){this._app=e,this._isTemplate=t}parse(e){const t={};let n=null;const o=e.compressedFormat;o&&!e.entDecompressed&&(e.entDecompressed=!0,e.entities=new s(e.entities,o).run());for(const s in e.entities){const i=e.entities[s],a=this._createEntity(i,o);t[s]=a,null===i.parent&&(n=a)}for(const s in e.entities){const n=t[s],o=e.entities[s].children,i=o.length;for(let e=0;e<i;e++){const s=t[o[e]];s&&n.addChild(s)}}return this._openComponentData(n,e.entities),n}_createEntity(t,s){var n;const o=new e(t.name,this._app);if(o.setGuid(t.resource_id),this._setPosRotScale(o,t,s),o._enabled=null==(n=t.enabled)||n,this._isTemplate?o._template=!0:o._enabledInHierarchy=o._enabled,o.template=t.template,t.tags)for(let e=0;e<t.tags.length;e++)o.tags.add(t.tags[e]);return t.labels&&t.labels.forEach((e=>{o.addLabel(e)})),o}_setPosRotScale(e,s,n){if(n)t.setCompressedPRS(e,s,n);else{const t=s.position,n=s.rotation,o=s.scale;e.setLocalPosition(t[0],t[1],t[2]),e.setLocalEulerAngles(n[0],n[1],n[2]),e.setLocalScale(o[0],o[1],o[2])}}_openComponentData(e,t){const s=this._app.systems.list;let n=s.length;const o=t[e.getGuid()];for(let t=0;t<n;t++){const n=s[t],i=o.components[n.id];i&&n.addComponent(e,i)}n=o.children.length;const i=e._children;for(let e=0;e<n;e++)i[e]&&(i[e]=this._openComponentData(i[e],t));return e}}export{n as SceneParser};