Source: helpers/ObjectBoxHelper.js

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 }