playcanvas
Version:
PlayCanvas WebGL game engine
80 lines (77 loc) • 2.63 kB
JavaScript
import { Vec3 } from '../../../core/math/vec3.js';
import { BoundingBox } from '../../../core/shape/bounding-box.js';
import { Component } from '../component.js';
import { ComponentSystem } from '../system.js';
import { GSplatComponent } from './component.js';
import { GSplatComponentData } from './data.js';
/**
* @import { AppBase } from '../../app-base.js'
*/ var _schema = [
'enabled'
];
// order matters here
var _properties = [
'instance',
'asset',
'layers'
];
/**
* Allows an Entity to render a gsplat.
*
* @category Graphics
*/ class GSplatComponentSystem extends ComponentSystem {
initializeComponentData(component, _data, properties) {
// duplicate layer list
if (_data.layers && _data.layers.length) {
_data.layers = _data.layers.slice(0);
}
for(var i = 0; i < _properties.length; i++){
if (_data.hasOwnProperty(_properties[i])) {
component[_properties[i]] = _data[_properties[i]];
}
}
if (_data.aabbCenter && _data.aabbHalfExtents) {
component.customAabb = new BoundingBox(new Vec3(_data.aabbCenter), new Vec3(_data.aabbHalfExtents));
}
super.initializeComponentData(component, _data, _schema);
}
cloneComponent(entity, clone) {
var gSplatComponent = entity.gsplat;
// copy properties
var data = {};
for(var i = 0; i < _properties.length; i++){
data[_properties[i]] = gSplatComponent[_properties[i]];
}
data.enabled = gSplatComponent.enabled;
// gsplat instance cannot be used this way, remove it and manually clone it later
delete data.instance;
// clone component
var component = this.addComponent(clone, data);
// clone gsplat instance
if (gSplatComponent.instance) {
component.instance = gSplatComponent.instance.clone();
}
if (gSplatComponent.customAabb) {
component.customAabb = gSplatComponent.customAabb.clone();
}
return component;
}
onRemove(entity, component) {
component.onRemove();
}
/**
* Create a new GSplatComponentSystem.
*
* @param {AppBase} app - The Application.
* @ignore
*/ constructor(app){
super(app);
this.id = 'gsplat';
this.ComponentType = GSplatComponent;
this.DataType = GSplatComponentData;
this.schema = _schema;
this.on('beforeremove', this.onRemove, this);
}
}
Component._buildAccessors(GSplatComponent.prototype, _schema);
export { GSplatComponentSystem };