import { Utils } from '../common/Utils'
import { BaseModelObject3D } from './BaseModelObject3D';
function _getParam(radius, param) {
if (Utils.isObject(radius)) {
return radius;
}
return param;
}
function _buildParam(radius, param) {
param = _getParam(radius, param);
param['body'] = param['body'] || {};
if (!param['body']['localScale']) {
let fixedRadius = Math.max(Number.EPSILON, Utils.parseFloat(radius, Utils.parseFloat(param['radius'], 0.5)));
let scale = fixedRadius * 2;
param['body']['localScale'] = [scale, scale, scale];
}
param['instanceGroupName'] = param['instanceGroupName'] || 'Sphere';
return param;
}
/**
* Sphere - 球体几何体
*
* 用于创建球体模型,支持自定义半径和细分。
*
* @class Sphere
* @memberof THING
* @extends THING.BaseModelObject3D
* @public
*
* @example
* const s = new THING.Sphere(1.1, {
* position: [5, 1.1, -5],
* widthSegments: 32,
* heightSegments: 32,
* });
* s.style.wireframe = true;
*/
class Sphere extends BaseModelObject3D {
static defaultTagArray = ['Geometry'];
/**
* 球体
* @param {number} [radius=0.5] 球体半径,单位为米
* @param {object} [param] 初始参数
* @param {number} [param.widthSegments=16] 水平(经线)方向细分数
* @param {number} [param.heightSegments=12] 竖直(纬线)方向细分数
* @constructor
* @public
*/
constructor(radius, param = {}) {
super(_buildParam(radius, param));
}
// #region Accessor
/**
* 获取/设置 球体半径
* @type {number}
* @default 0.5
* @public
*/
get radius() {
let size = this.body.scale.reduce((total, num) => {
return total + num;
}, 0);
return (size / 3) * 0.5;
}
set radius(value) {
value *= 2;
this._processBodyWithoutPivot((body) => {
body.scale = [value, value, value];
});
}
// #endregion
/**
* Check whether it's sphere object.
* @type {boolean}
*/
get isSphere() {
return true;
}
}
export { Sphere }