import * as THREE from 'three'; import { Vector } from 'cal'; // import createDebug from 'debug'; // const debug = createDebug('d3d:preview:selectionBox'); export default class SelectionBox extends THREE.Object3D { matrixAutoUpdate = false; constructor() { super(); this._box = new THREE.BoxHelper(); this._box.material.color.setHex(0x72bcd4); this._box.name = 'bounding-box'; const material = new THREE.MeshBasicMaterial(); const geometry = new THREE.BoxGeometry(1, 1, 1); const matrix = new THREE.Matrix4(); matrix.setPosition(new THREE.Vector3(0.5, 0.5, 0.5)); geometry.applyMatrix(matrix); const mesh = new THREE.Mesh(geometry, material); this._box.update(mesh); this.add(this._box); } updateBoundingBox(boundingBox) { if (this._boundingBox === boundingBox) { return; } this._boundingBox = boundingBox; this.update(); } updateTransform(transform) { if (this._transform === transform) { return; } this._transform = transform; this.update(); } update() { if (!this.visible || this._transform === undefined || this._boundingBox === undefined) { return; } let min = new Vector(this._boundingBox.min.x, this._boundingBox.min.z); min = min.applyMatrix(this._transform); this._box.rotation.y = -this._transform.rotation; this._box.position.x = min.x; this._box.position.z = min.y; this._box.scale.x = (this._boundingBox.max.x - this._boundingBox.min.x) * this._transform.sx; this._box.scale.z = (this._boundingBox.max.z - this._boundingBox.min.z) * this._transform.sy; this._box.scale.y = this._boundingBox.max.y - this._boundingBox.min.y; this._box.position.y = this._boundingBox.min.y; } }