import { Utils } from '../common/Utils'
import { MathUtils } from '../math/MathUtils'
import { SpotLightHelperComponent } from '../components/SpotLightHelperComponent';
import { BaseShadowLight } from './BaseShadowLight';
const registerComponentParam = { isResident: true };
/**
* @class SpotLight
* The spot light object.
* @memberof THING
* @extends THING.BaseShadowLight
* @public
*/
class SpotLight extends BaseShadowLight {
/**
* The spot light object in scene.
* @param {Object} param The initial parameters.
*/
constructor(param = {}) {
super(param);
}
// #region Overrides
onCopy(object) {
super.onCopy(object);
this.distance = object.distance;
this.angle = object.angle;
this.penumbra = object.penumbra;
this.decay = object.decay;
}
onBeforeSetup(param) {
param['renderableNode'] = param['renderableNode'] || Utils.createObject('SpotLight');
super.onBeforeSetup(param);
}
onSetupComponent(param) {
super.onSetupComponent(param);
this.addComponent(SpotLightHelperComponent, 'helper', registerComponentParam);
}
onSetupComplete(param) {
super.onSetupComplete(param);
// Sync options
Utils.syncOptions(this, [
'distance',
'angle',
'penumbra',
'decay',
], param, param['extras'] || param['external']);
}
onExportExternalData() {
let external = Object.assign({}, super.onExportExternalData());
Utils.setAttributeIfExist(external, 'distance', this);
Utils.setAttributeIfExist(external, 'angle', this);
Utils.setAttributeIfExist(external, 'penumbra', this);
Utils.setAttributeIfExist(external, 'decay', this);
return external;
}
// #endregion
// #region Accessor
/**
* Get/Set distance.
* @type {Number}
* @public
*/
get distance() {
return this.bodyNode.getDistance();
}
set distance(value) {
this.bodyNode.setDistance(value);
}
/**
* Get/Set angle.
* @type {Number}
* @public
*/
get angle() {
return MathUtils.radToDeg(this.bodyNode.getAngle());
}
set angle(value) {
this.bodyNode.setAngle(MathUtils.degToRad(value));
}
/**
* Get/Set penumbra.
* @type {Number}
* @public
*/
get penumbra() {
return this.bodyNode.getPenumbra();
}
set penumbra(value) {
this.bodyNode.setPenumbra(value);
}
/**
* Get/Set decay.
* @type {Number}
* @public
*/
get decay() {
return this.bodyNode.getDecay();
}
set decay(value) {
this.bodyNode.setDecay(value);
}
// #endregion
get isSpotLight() {
return true;
}
}
export { SpotLight }