Source: components/BaseLineSegmentsHelperComponent.js

import { Utils } from '../common/Utils';
import { HelperComponent } from './HelperComponent';
import { NodeUserDataType, InheritType } from '../const';

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

/**
 * @class BaseLineSegmentsHelperComponent
 * The base line seguments helper component.
 * @memberof THING
 * @extends THING.HelperComponent
 */
class BaseLineSegmentsHelperComponent extends HelperComponent {

	/**
	 * The base line segments helper to show points, you can inherit from it when you need to show drawing points.
	 */
	constructor() {
		super();

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

		_private.points = [];
		_private.colors = [];

		_private.lineSegments = null;
	}

	// #region BaseComponent Interface

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

		let _private = this[__.private];

		// Initialize points and colors

		// Create helper lines for camera
		_private.lineSegments = Utils.createObject('LineSegments');
		_private.lineSegments.setAttribute('Pickable', false);
		_private.lineSegments.getUserData()[NodeUserDataType.BoundingBoxInheritType] = InheritType.Stop;

		// Hide it as default
		_private.lineSegments.setVisible(false);

		// Add as renderable node
		this.object.body.createRootNode();
		this.object.node.add(_private.lineSegments);
	}

	onRemove() {
		super.onRemove();

		let _private = this[__.private];

		_private.lineSegments.dispose();
	}

	// #endregion

	addPoint(point, color) {
		let _private = this[__.private];

		_private.points.push(point);
		_private.colors.push(color);
	}

	addLine(a, b, color) {
		this.addPoint(a, color);
		this.addPoint(b, color);
	}

	begin() {

	}

	end() {
		let object = this.object;

		object.body.createRootNode();
		object.node.add(this.lineSegments);
		this.lineSegments.setSize(this.points.length * 3);
		this.lineSegments.setPoints(this.points);
		this.lineSegments.setColors(this.colors);
	}

	/**
	 * Show/Hide lines.
	 * @type {Boolean}
	 */
	get visible() {
		let _private = this[__.private];

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

		_private.lineSegments.setVisible(value);
	}

	/**
	 * Get points of line(s).
	 * @type {Array<Array<Number>>}
	 */
	get points() {
		let _private = this[__.private];

		return _private.points;
	}

	/**
	 * Get colors of line(s).
	 * @type {Array<Array<Number>>}
	 */
	get colors() {
		let _private = this[__.private];

		return _private.colors;
	}

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

		return _private.lineSegments;
	}

}

export { BaseLineSegmentsHelperComponent }