Source: helpers/ObjectColliderSphereHelper.js

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 }