import { Utils } from '../common/Utils'
import { DirectionalLightHelperComponent } from '../components/DirectionalLightHelperComponent';
import { BaseShadowLight } from './BaseShadowLight';
import { ShadowDirectionalLightAdapterComponent } from '../components/ShadowDirectionalLightAdapterComponent';
const registerComponentParam = { isResident: true };
/**
* DirectionalLight - 平行光
*
* 模拟太阳光,以固定方向照射场景中所有物体,支持阴影。
*
* @class DirectionalLight
* @memberof THING
* @extends THING.BaseShadowLight
* @public
*
* @example
const light = new THING.DirectionalLight({
color: '#ffffff',
intensity: 1,
position: [50, 50, 50],
target: [0, 0, 0],
castShadow: true,
});
*/
class DirectionalLight extends BaseShadowLight {
/**
* 构造函数
* @param {object} param 初始化参数
* @param {number|string|Array<number>} param.color 光的颜色
* @param {number} param.intensity 光的强度
* @param {boolean} param.castShadow 开启/关闭阴影效果
* @param {number} param.shadowQuality 阴影效果品质(2的n次幂的一个数值,数值越大质量越高)
* @param {number} param.shadowBias 阴影偏移量
* @param {ShadowRangeInfo} param.shadowRange 阴影范围
* @param {number[]} param.position 灯光位置
* @param {number[]} param.target 灯光的目标位置 根据position和target可确定平行光方向
* @constructor
* @public
*/
constructor(param = {}) {
super(param);
}
onBeforeSetup(param) {
param['renderableNode'] = param['renderableNode'] || Utils.createObject('DirectionalLight', { app: this.app });
super.onBeforeSetup(param);
}
onSetupComponent(param) {
super.onSetupComponent(param);
this.addComponent(ShadowDirectionalLightAdapterComponent, 'adapter', registerComponentParam);
this.addComponent(DirectionalLightHelperComponent, 'helper', registerComponentParam);
}
onBeforeDestroy() {
if (this.app.objectManager.keepAliveObjects.includes(this)) {
return false;
}
if (!super.onBeforeDestroy()) {
return false;
}
return true;
}
// #region Accessor
/**
* 是否开启阴影
* @type {boolean}
* @public
*/
get castShadow() {
return this.bodyNode.getCastShadow();
}
set castShadow(value) {
if (this.castShadow == value) {
return;
}
this.bodyNode.setCastShadow(value);
this.adapter.needRefresh = true;
}
// #endregion
/**
* 检查是否为DirectionalLight类型或继承自它。
* @type {boolean}
* @public
*/
get isDirectionalLight() {
return true;
}
}
export { DirectionalLight }