playcanvas
Version:
PlayCanvas WebGL game engine
93 lines (90 loc) • 2.8 kB
JavaScript
import { Entity } from '../entity.js';
import { CompressUtils } from '../../scene/compress/compress-utils.js';
import { Decompress } from '../../scene/compress/decompress.js';
class SceneParser {
constructor(app, isTemplate){
this._app = app;
this._isTemplate = isTemplate;
}
parse(data) {
const entities = {};
let parent = null;
const compressed = data.compressedFormat;
if (compressed && !data.entDecompressed) {
data.entDecompressed = true;
data.entities = new Decompress(data.entities, compressed).run();
}
for(const id in data.entities){
const curData = data.entities[id];
const curEnt = this._createEntity(curData, compressed);
entities[id] = curEnt;
if (curData.parent === null) {
parent = curEnt;
}
}
for(const id in data.entities){
const curEnt = entities[id];
const children = data.entities[id].children;
const len = children.length;
for(let i = 0; i < len; i++){
const childEnt = entities[children[i]];
if (childEnt) {
curEnt.addChild(childEnt);
}
}
}
this._openComponentData(parent, data.entities);
return parent;
}
_createEntity(data, compressed) {
const entity = new Entity(data.name, this._app);
entity.setGuid(data.resource_id);
this._setPosRotScale(entity, data, compressed);
entity._enabled = data.enabled ?? true;
if (this._isTemplate) {
entity._template = true;
} else {
entity._enabledInHierarchy = entity._enabled;
}
entity.template = data.template;
if (data.tags) {
for(let i = 0; i < data.tags.length; i++){
entity.tags.add(data.tags[i]);
}
}
return entity;
}
_setPosRotScale(entity, data, compressed) {
if (compressed) {
CompressUtils.setCompressedPRS(entity, data, compressed);
} else {
const p = data.position;
const r = data.rotation;
const s = data.scale;
entity.setLocalPosition(p[0], p[1], p[2]);
entity.setLocalEulerAngles(r[0], r[1], r[2]);
entity.setLocalScale(s[0], s[1], s[2]);
}
}
_openComponentData(entity, entities) {
const systemsList = this._app.systems.list;
let len = systemsList.length;
const entityData = entities[entity.getGuid()];
for(let i = 0; i < len; i++){
const system = systemsList[i];
const componentData = entityData.components[system.id];
if (componentData) {
system.addComponent(entity, componentData);
}
}
len = entityData.children.length;
const children = entity._children;
for(let i = 0; i < len; i++){
if (children[i]) {
children[i] = this._openComponentData(children[i], entities);
}
}
return entity;
}
}
export { SceneParser };