Source: components/CameraHelperComponent.js

import { Utils } from '../common/Utils';
import { MathUtils } from '../math/MathUtils';
import { FrustumHelperComponent } from './FrustumHelperComponent';

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

let _target = MathUtils.createVec3();

/**
 * @class CameraHelperComponent
 * The camera helper component.
 * @memberof THING
 * @extends THING.FrustumHelperComponent
 */
class CameraHelperComponent extends FrustumHelperComponent {

	/**
	 * The camera view helper, can show frustum of camera.
	 */
	constructor() {
		super();

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

		_private.targetNode = null;
	}

	// #region Private Functions

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

		this.app.global.waitForComplete().then(() => {
			_private.targetNode = this.app.global.cache.models['box'].clone();
			_private.targetNode.setScale([0.25, 0.25, 0.25]);
			_private.targetNode.setVisible(true);
			Utils.markAsDebugNode(_private.targetNode);
			this.object.body.createRootNode();
			this.object.node.add(_private.targetNode);

			let style = _private.targetNode.getStyle();
			style.setColorOp(() => { return [1, 0, 0]; });
			style.setOutlineColor([0, 1, 1]);
		});
	}

	_updateProjectionMatrix() {
		let cameraNode = this.object.node;
		cameraNode.getProjectionMatrix(this.projectionMatrix);
	}

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

		let targetNode = _private.targetNode;
		if (targetNode) {
			let target = this.object.control.getTarget(_target);

			targetNode.setWorldPosition(target);
		}
	}

	// #endregion

	// #region BaseComponent Interface

	onUpdate(deltaTime) {
		super.onUpdate(deltaTime);
		this._updateTargetNode();
	}

	onRemove() {
		this.showTarget(false);

		super.onRemove();
	}

	// #endregion

	/**
	 * Show/Hide picker to check object picking.
	 * @param {Boolean} value True indicates show it, otherwise hide it.
	 */
	showPicker(value = true) {
		let cameraNode = this.object.node;

		if (value) {
			cameraNode.setDebuggerType('GPUPick');
		}
		else {
			cameraNode.setDebuggerType(null);
		}
	}

	/**
	 * Show/Hide target node.
	 * @param {Boolean} value True indicates show it, otherwise hide it.
	 */
	showTarget(value = true) {
		let _private = this[__.private];

		if (value) {
			this._createTargetNode();
		}
		else if (_private.targetNode) {
			_private.targetNode.dispose();
			_private.targetNode = null;
		}
	}

}

export { CameraHelperComponent }