import { Utils } from '../common/Utils'
// import { SpotLightHelperComponent } from '../components/SpotLightHelperComponent';
import { BaseShadowLight } from './BaseShadowLight';
// const registerComponentParam = { isResident: true };
/**
* PointLight - 点光源
*
* 从一个点向四周均匀发光的灯光,类似灯泡效果,支持阴影、距离衰减。
*
* @class PointLight
* @memberof THING
* @extends THING.BaseShadowLight
* @public
*
* @example
const light = new THING.PointLight({
position: [0, 5, 0],
color: '#ffff00',
intensity: 1,
distance: 20,
decay: 1,
});
*/
class PointLight extends BaseShadowLight {
/**
* 构造函数
* @param {object} param 初始参数列表
* @param {number[]} param.position 灯光位置
* @param {number|string|number[]} param.color 光的颜色
* @param {number} param.intensity 光的强度
* @param {number} param.distance 照射距离
* @param {number} param.decay 衰减系数
* @constructor
* @public
*/
constructor(param = {}) {
super(param);
}
// #region Overrides
onCopy(object) {
super.onCopy(object);
this.distance = object.distance;
this.decay = object.decay;
}
onBeforeSetup(param) {
param['renderableNode'] = param['renderableNode'] || Utils.createObject('PointLight', { app: this.app });
param['castShadow'] = param['castShadow'] === undefined ? false : param['castShadow'];
super.onBeforeSetup(param);
}
// onSetupComponent(param) {
// super.onSetupComponent(param);
// this.addComponent(SpotLightHelperComponent, 'helper', registerComponentParam);
// }
onSetupComplete(param) {
super.onSetupComplete(param);
// Sync options
Utils.syncOptions(this, [
'distance',
'decay',
], param, param['extras'] || param['external']);
}
onExportExternalData() {
let external = Object.assign({}, super.onExportExternalData());
Utils.setAttributeIfExist(external, 'distance', this);
Utils.setAttributeIfExist(external, 'decay', this);
return external;
}
// #endregion
// #region Accessor
/**
* 照射距离
* @type {number}
* @public
*/
get distance() {
return this.bodyNode.getDistance();
}
set distance(value) {
this.bodyNode.setDistance(value);
}
/**
* 衰减系数
* @type {number}
* @public
*/
get decay() {
return this.bodyNode.getDecay();
}
set decay(value) {
this.bodyNode.setDecay(value);
}
// #endregion
get isPointLight() {
return true;
}
}
export { PointLight }