import { Utils } from '../common/Utils';
import { BaseBoxHelper } from './BaseBoxHelper';
import { BoxHelperModeType, InheritType } from '../const';
const __ = {
private: Symbol('private'),
}
/**
* @class ObjectBoxHelper
* The object box helper object.
* @memberof THING
* @extends THING.BaseBoxHelper
*/
class ObjectBoxHelper extends BaseBoxHelper {
/**
* The bounding box helper of object, it can show bounding box in scene.
*/
constructor(param = {}) {
super(param);
this[__.private] = {};
let _private = this[__.private];
_private.object = param['object'];
_private.mode = Utils.parseValue(param['mode'], BoxHelperModeType.All);
}
// #region Private
// Traverse in bodies mode.
_traverseInBodiesMode(root) {
let rootInheritType = root.bounding.inheritType;
let box;
switch (rootInheritType) {
// normal means build self and children,so break after build self
case InheritType.Normal:
box = this.onGetObjectBox(root, false);
this.buildBox(box.getPoints());
break;
// break means only build self,so return after build self
case InheritType.Break:
box = this.onGetObjectBox(root, false);
this.buildBox(box.getPoints());
return;
// stop means do not build self and children,so return straightly
case InheritType.Stop:
return;
default:
break;
}
let children = root.children;
for (let i = 0; i < children.length; i++) {
let child = children[i];
this._traverseInBodiesMode(child);
}
}
// #endregion
// #region Override
onLateUpdate(deltaTime) {
let _private = this[__.private];
let root = _private.object;
let box;
// Build points and colors
switch (_private.mode) {
case BoxHelperModeType.All:
box = this.onGetObjectBox(root, true);
this.begin();
this.buildBox(box.getPoints());
this.end();
break;
case BoxHelperModeType.Root:
box = this.onGetObjectBox(root, false);
this.begin();
this.buildBox(box.getPoints());
this.end();
break;
case BoxHelperModeType.Bodies:
this.begin();
this._traverseInBodiesMode(root);
this.end();
break;
default:
break;
}
super.onLateUpdate(deltaTime);
}
onGetObjectBox(object, recursive) {
return object.getAABB(recursive);
}
// #endregion
// #region Accessor
/**
* Get object.
* @type {THING.BaseObject}
*/
get object() {
let _private = this[__.private];
return _private.object;
}
/**
* Get/Set mode type.
* @type {BoxHelperModeType}
*/
get mode() {
let _private = this[__.private];
return _private.mode;
}
set mode(value) {
let _private = this[__.private];
_private.mode = value;
}
// #endregion
}
export { ObjectBoxHelper }