import { Object3D } from "./Object3D";

import { Utils } from '../common/Utils'



/**
 * Lensflare - 镜头光晕
 * 
 * 用于在场景中创建镜头光晕效果。
 * 
 * @class Lensflare
 * @memberof THING
 * @extends THING.Object3D
 * @public
 * @example
 * // Create lensflare
  const textureFlare0 = new THING.ImageTexture("./images/lensflare/lensflare0.png");
  const textureFlare1 = new THING.ImageTexture("./images/lensflare/lensflare3.png");

  const lensflare = new THING.Lensflare({
    parent: directionalLight // set light as parent
  });

  lensflare.occlusionScale = 0.1;
  lensflare.addElement({ imageTexture: textureFlare0, color: [0.2, 0.2, 0.2], scale: 0.6, offset: 0 });
  lensflare.addElement({ imageTexture: textureFlare1, color: [0, 1, 1], scale: 0.5, offset: 0.5 });
  lensflare.addElement({ imageTexture: textureFlare1, color: [1, 1, 1], scale: 0.06, offset: 0.7 });
  lensflare.addElement({ imageTexture: textureFlare1, color: [1, 1, 1], scale: 0.1, offset: 0.9 });
  lensflare.addElement({ imageTexture: textureFlare1, color: [1, 1, 1], scale: 0.06, offset: 1 });
 */
class Lensflare extends Object3D {



	/**

	 * 镜头光晕对象的构造函数。

	 * 参数与 {@link THING.Object3D} 的构造函数相同。

	 * 请在 {@link THING.Object3D} 的文档中查看构造函数部分以获取详细参数列表。

	 * @param param
	 * @constructor
	 * @public
	 */

	constructor(param = {}) {

		super(param);

	}



	onBeforeSetup(param) {

		param['renderableNode'] = param['renderableNode'] || Utils.createObject('Lensflare', { app: this.app });



		super.onBeforeSetup(param);

	}



	/**

	 * 获取/设置镜头光晕的遮挡比例。

	 * @type {number}

	 * @public

	 */

	get occlusionScale() {

		return this.bodyNode.getOcclusionScale();

	}

	set occlusionScale(value) {

		this.bodyNode.setOcclusionScale(value);

	}



	/**

	 * 镜头光晕元素。

	 * @typedef {object} LensflareElement

	 * @property {ImageTexture} imageTexture 元素的图像纹理资源。

	 * @property {Array<number>} color 元素的颜色。

	 * @property {number} scale 元素的缩放比例。

	 * @property {number} offset 元素的偏移量。

	 * @public

	 */



	/**

	 * 添加元素。

	 * @param {LensflareElement} element 镜头光晕元素。

	 * @public

	 */

	addElement(element) {

		element.imageTexture = element.imageTexture.getTextureResource();

		this.bodyNode.addElement(element)

	}



	/**

	 * 根据索引移除元素。

	 * @param {number} index 将要移除的镜头光晕元素的索引。

	 * @public

	 */

	removeElement(index) {

		this.bodyNode.removeElement(index)

	}



	/**

	 * 清除镜头光晕的元素。

	 * @public

	 */

	clearElements() {

		this.bodyNode.clearElements()

	}



	/**

	 * 获取所有镜头光晕的元素。

	 * @returns {Array<LensflareElement>}

	 * @public

	 */

	getAllElements() {

		return this.bodyNode.getAllElements()

	}



	get isLensflare() {

		return true;

	}



}



export { Lensflare }