import { MathUtils } from '../math/MathUtils';
import { BaseSphereHelper } from './BaseSphereHelper';
const __ = {
private: Symbol('private'),
}
/**
* @class ObjectColliderSphereHelper
* The object collider sphere helper object.
* @memberof THING
*/
class ObjectColliderSphereHelper extends BaseSphereHelper {
/**
* The collider sphere helper of object, it can show collider sphere in scene.
*/
constructor(param = {}) {
super(param);
this[__.private] = {};
let _private = this[__.private];
_private.object = param['object'];
_private.segements = param['segements'] || 32;
}
// #region Override
onLateUpdate(deltaTime) {
let _private = this[__.private];
let object = _private.object;
let collider = object.collider;
let transform = collider.areaInfo.transform;
let min = transform.min;
let max = transform.max;
let radius = MathUtils.getDistance(min, max) / 2;
let spherePoints = this.sphereData(radius);
this.begin();
this.buildSphere(spherePoints);
this.end([min, max]);
super.onLateUpdate(deltaTime);
}
sphereData(radius) {
let _private = this[__.private];
let xData = [], yData = [], zData = [];
for (let i = 0; i <= _private.segements; i++) {
const angle = i / _private.segements * 360;
// x
const xQuat = MathUtils.getQuatFromAxisAngle([0, 0, 1], angle);
xData.push(MathUtils.vec3ApplyQuat([radius, 0, 0], xQuat));
// y
const yQuat = MathUtils.getQuatFromAxisAngle([1, 0, 0], angle);
yData.push(MathUtils.vec3ApplyQuat([0, radius, 0], yQuat));
// z
const zQuat = MathUtils.getQuatFromAxisAngle([0, 1, 0], angle);
zData.push(MathUtils.vec3ApplyQuat([0, 0, radius], zQuat));
}
return { xData, yData, zData };
}
// #endregion
// #region Accessor
/**
* Get object.
* @type {THING.BaseObject}
* @private
*/
get object() {
let _private = this[__.private];
return _private.object;
}
/**
* Get/Set segements.
* @type {Number}
*/
get segements() {
let _private = this[__.private];
return _private.segements;
}
set segements(value) {
let _private = this[__.private];
_private.segements = value;
}
// #endregion
}
export { ObjectColliderSphereHelper }