Source: components/DirectionalLightHelperComponent.js

import { MathUtils } from '@uino/base-thing';
import { Utils } from '../common/Utils';
import { BaseLineSegmentsHelperComponent } from './BaseLineSegmentsHelperComponent';

const __ = {
	private: Symbol('private'),
}

/**
 * @class DirectionalLightHelperComponent
 * The directional light helper component.
 * @memberof THING
 * @extends THING.BaseLineSegmentsHelperComponent
 */
class DirectionalLightHelperComponent extends BaseLineSegmentsHelperComponent {

	/**
	 * Show/Hide the directional light position and direction.
	 */
	constructor() {
		super();

		this[__.private] = {};
		let _private = this[__.private];

		_private.length = 1000;
	}

	// #region Private Functions

	_getTargetPosition() {
		let _private = this[__.private];

		let object = this.object;

		return MathUtils.getPositionOnDirection(object.position, object.forward, -_private.length);
	}

	// #endregion


	// #region BaseComponent Interface

	onUpdate(deltaTime) {
		// Get target position
		let target = this._getTargetPosition();

		// Look at target
		this.lineSegments.lookAt(target);

		// Sync target line
		let targetInSelfSpace = [0, 0, 0];
		this.lineSegments.worldToSelf(targetInSelfSpace, target);
		this.points[this.points.length - 1] = targetInSelfSpace;

		// Update points
		this.lineSegments.setPoints(this.points);
		this.lineSegments.getStyle().setColorOp(() => {
			return Utils.parseColor(this.object.color);
		});
	}

	onAdd(object) {
		super.onAdd(object);

		// Begin to build lines
		this.begin();

		// Make light plane
		const size = 1;
		this.addLine([-size, size, 0], [size, size, 0], [1, 1, 1]);
		this.addLine([size, size, 0], [size, -size, 0], [1, 1, 1]);
		this.addLine([size, -size, 0], [-size, -size, 0], [1, 1, 1]);
		this.addLine([-size, -size, 0], [-size, size, 0], [1, 1, 1]);

		// Make light target line
		this.addPoint([0, 0, 0], [1, 1, 1]);
		this.addPoint(object.worldToSelf(this._getTargetPosition()), [1, 1, 1]);

		// End to build lines
		this.end();
	}

	// #endregion

	/**
	 * Get/Set the length.
	 * @type {Number}
	 * @private
	 */
	get length() {
		let _private = this[__.private];

		return _private.length;
	}
	set length(value) {
		let _private = this[__.private];

		_private.length = value;
	}

	/**
	 * Get/Set the scale factor.
	 * @type {Array<Number>}
	 * @private
	 */
	get size() {
		let scale = [1, 1, 1];
		this.lineSegments.getScale(scale);

		return scale[0];
	}
	set size(value) {
		this.lineSegments.setScale([value, value, 1]);
	}

}

export { DirectionalLightHelperComponent }