src/octree/world/WorldOctantWrapper.js
import { Vector3 } from "three";
import { WorldOctantId } from "./WorldOctantId";
/**
 * A world octant wrapper that stores positional information.
 */
export class WorldOctantWrapper {
	/**
	 * Constructs a new octant wrapper.
	 *
	 * @param {WorldOctant} [octant=null] - An octant.
	 * @param {WorldOctantId} [id] - The identifier of the octant.
	 */
	constructor(octant = null, id = new WorldOctantId()) {
		/**
		 * A world octant.
		 *
		 * @type {WorldOctant}
		 */
		this.octant = octant;
		/**
		 * A world octant identifier.
		 *
		 * @type {WorldOctantId}
		 */
		this.id = id;
		/**
		 * The lower bounds.
		 *
		 * @type {Vector3}
		 */
		this.min = new Vector3();
		/**
		 * The upper bounds.
		 *
		 * @type {Vector3}
		 */
		this.max = new Vector3();
	}
	/**
	 * Copies the given octant wrapper.
	 *
	 * @param {WorldOctantWrapper} octantWrapper - An octant wrapper.
	 * @return {WorldOctantWrapper} This octant wrapper.
	 */
	copy(octantWrapper) {
		this.octant = octantWrapper.octant;
		this.id.copy(octantWrapper.id);
		this.min.copy(octantWrapper.min);
		this.max.copy(octantWrapper.max);
		return this;
	}
	/**
	 * Clones this octant wrapper.
	 *
	 * @return {WorldOctantWrapper} The cloned octant wrapper.
	 */
	clone() {
		return new this.constructor().copy(this);
	}
	/**
	 * Computes the center of the wrapped octant.
	 *
	 * @param {Vector3} [target] - A target vector. If none is provided, a new one will be created.
	 * @return {Vector3} A vector that describes the center of the octant.
	 */
	getCenter(target = new Vector3()) {
		return target.addVectors(this.min, this.max).multiplyScalar(0.5);
	}
	/**
	 * Computes the size of the wrapped octant.
	 *
	 * @param {Vector3} [target] - A target vector. If none is provided, a new one will be created.
	 * @return {Vector3} A vector that describes the size of the octant.
	 */
	getDimensions(target = new Vector3()) {
		return target.subVectors(this.max, this.min);
	}
	/**
	 * Checks if the given point lies inside the boundaries of this wrapper.
	 *
	 * @param {Vector3} point - A point.
	 * @return {Boolean} Whether the given point lies inside the boundaries.
	 */
	containsPoint(point) {
		const min = this.min;
		const max = this.max;
		return (
			point.x >= min.x &&
			point.y >= min.y &&
			point.z >= min.z &&
			point.x <= max.x &&
			point.y <= max.y &&
			point.z <= max.z
		);
	}
}