import { Utils } from '../common/Utils'
import { BaseTickableObject3D } from './BaseTickableObject3D';
import { NodeUserDataType, InheritType } from '../const';
/**
* @class BaseLight
* 基础光源物体
* @memberof THING
* @extends THING.BaseTickableObject3D
* @public
*/
class BaseLight extends BaseTickableObject3D {
/**
* 基础光源类,负责管理光源的基本属性和行为
* @param {object} param 初始化参数列表
* @param {number|string|Array<number>} param.color 光的颜色
* @param {number} param.intensity 光的强度
*/
constructor(param = {}) {
super(param);
}
onCopy(object) {
super.onCopy(object);
this.color = object.color;
this.intensity = object.intensity;
}
onLoadResource(options, resolve, reject) {
this.loaded = true;
resolve()
}
onSetupComplete(param) {
super.onSetupComplete(param);
// Sync options
Utils.syncOptions(this, [
'color',
'intensity'
], param, param['extras'] || param['external']);
}
onImportExternalData(external, options) {
super.onImportExternalData(external, options);
this.color = Utils.parseValue(external['color'], this.color);
this.intensity = Utils.parseValue(external['intensity'], this.intensity);
}
onExportExternalData() {
let external = Object.assign({}, super.onExportExternalData());
Utils.setAttributeIfExist(external, 'color', this);
Utils.setAttributeIfExist(external, 'intensity', this);
return external;
}
onAfterSetup(param) {
let bodyNode = this.bodyNode;
bodyNode.setName(bodyNode.getType());
// Never affect bounding box
bodyNode.getUserData()[NodeUserDataType.BoundingBoxInheritType] = InheritType.Stop;
}
// #region Accessor
// #region Render
get layerMask() {
Utils.warn('Light object can not use layer mask now');
return super.layerMask;
}
set layerMask(value) {
Utils.warn('Light object can not use layer mask now');
super.layerMask = value;
}
// #endregion
/**
* 获取/设置光颜色
* @type {number|string|Array<number>}
* @public
*/
get color() {
let color = [0, 0, 0];
this.bodyNode.getColor(color);
return Utils.colorToHexString(color);
}
set color(value) {
let color = Utils.parseColor(value);
this.bodyNode.setColor(color);
}
/**
* 获取/设置光强度
* @type {number}
* @public
*/
get intensity() {
return this.bodyNode.getIntensity();
}
set intensity(value) {
this.bodyNode.setIntensity(value);
}
/**
* 获取/设置光照组
* @type {number|Array<number>}
* @public
*/
get groups() {
return this.bodyNode.getGroups();
}
set groups(value) {
// value must be Number or Array<number>
// and if the value is Number, make it as Array<number>
if (typeof value === 'number') {
value = [value];
}
// value must be Array<number>
if (!Array.isArray(value)) {
throw new Error('groups must be Array<number>');
}
// value must be Array<number>
if (value.some(item => typeof item !== 'number')) {
throw new Error('groups must be Array<number>');
}
this.bodyNode.setGroups(value);
}
// #endregion
get isLight() {
return true;
}
}
export { BaseLight }