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 }