Source: objects/SpotLight.js

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 }