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 }