{"version":3,"file":"vendor.openbim-components-29b6b19b.36dc37b5dfb3b8dd.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/fragments/FragmentBoundingBox/index.js"],"sourcesContent":["import * as THREE from \"three\";\r\nimport { Component, Event } from \"../../base-types\";\r\nimport { Disposer } from \"../../core/Disposer\";\r\nimport { ToolComponent } from \"../../core/ToolsComponent\";\r\n/**\r\n * A simple implementation of bounding box that works for fragments. The resulting bbox is not 100% precise, but\r\n * it's fast, and should suffice for general use cases such as camera zooming or general boundary determination.\r\n */\r\nexport class FragmentBoundingBox extends Component {\r\n constructor(components) {\r\n super(components);\r\n /** {@link Component.enabled} */\r\n this.enabled = true;\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n this._meshes = [];\r\n this.components.tools.add(FragmentBoundingBox.uuid, this);\r\n this._absoluteMin = FragmentBoundingBox.newBound(true);\r\n this._absoluteMax = FragmentBoundingBox.newBound(false);\r\n }\r\n static getDimensions(bbox) {\r\n const { min, max } = bbox;\r\n const width = Math.abs(max.x - min.x);\r\n const height = Math.abs(max.y - min.y);\r\n const depth = Math.abs(max.z - min.z);\r\n const center = new THREE.Vector3();\r\n center.subVectors(max, min).divideScalar(2).add(min);\r\n return { width, height, depth, center };\r\n }\r\n static newBound(positive) {\r\n const factor = positive ? 1 : -1;\r\n return new THREE.Vector3(factor * Number.MAX_VALUE, factor * Number.MAX_VALUE, factor * Number.MAX_VALUE);\r\n }\r\n static getBounds(points, min, max) {\r\n const maxPoint = max || this.newBound(false);\r\n const minPoint = min || this.newBound(true);\r\n for (const point of points) {\r\n if (point.x < minPoint.x)\r\n minPoint.x = point.x;\r\n if (point.y < minPoint.y)\r\n minPoint.y = point.y;\r\n if (point.z < minPoint.z)\r\n minPoint.z = point.z;\r\n if (point.x > maxPoint.x)\r\n maxPoint.x = point.x;\r\n if (point.y > maxPoint.y)\r\n maxPoint.y = point.y;\r\n if (point.z > maxPoint.z)\r\n maxPoint.z = point.z;\r\n }\r\n return new THREE.Box3(min, max);\r\n }\r\n /** {@link Disposable.dispose} */\r\n async dispose() {\r\n const disposer = this.components.tools.get(Disposer);\r\n for (const mesh of this._meshes) {\r\n disposer.destroy(mesh);\r\n }\r\n this._meshes = [];\r\n await this.onDisposed.trigger(FragmentBoundingBox.uuid);\r\n this.onDisposed.reset();\r\n }\r\n get() {\r\n const min = this._absoluteMin.clone();\r\n const max = this._absoluteMax.clone();\r\n return new THREE.Box3(min, max);\r\n }\r\n getSphere() {\r\n const min = this._absoluteMin.clone();\r\n const max = this._absoluteMax.clone();\r\n const dx = Math.abs((max.x - min.x) / 2);\r\n const dy = Math.abs((max.y - min.y) / 2);\r\n const dz = Math.abs((max.z - min.z) / 2);\r\n const center = new THREE.Vector3(min.x + dx, min.y + dy, min.z + dz);\r\n const radius = center.distanceTo(min);\r\n return new THREE.Sphere(center, radius);\r\n }\r\n getMesh() {\r\n const bbox = new THREE.Box3(this._absoluteMin, this._absoluteMax);\r\n const dimensions = FragmentBoundingBox.getDimensions(bbox);\r\n const { width, height, depth, center } = dimensions;\r\n const box = new THREE.BoxGeometry(width, height, depth);\r\n const mesh = new THREE.Mesh(box);\r\n this._meshes.push(mesh);\r\n mesh.position.copy(center);\r\n return mesh;\r\n }\r\n reset() {\r\n this._absoluteMin = FragmentBoundingBox.newBound(true);\r\n this._absoluteMax = FragmentBoundingBox.newBound(false);\r\n }\r\n add(group) {\r\n for (const frag of group.items) {\r\n this.addMesh(frag.mesh);\r\n }\r\n }\r\n addMesh(mesh) {\r\n if (!mesh.geometry.index) {\r\n return;\r\n }\r\n const bbox = FragmentBoundingBox.getFragmentBounds(mesh);\r\n mesh.updateMatrix();\r\n const meshTransform = mesh.matrix;\r\n const instanceTransform = new THREE.Matrix4();\r\n const isInstanced = mesh instanceof THREE.InstancedMesh;\r\n const count = isInstanced ? mesh.count : 1;\r\n for (let i = 0; i < count; i++) {\r\n const min = bbox.min.clone();\r\n const max = bbox.max.clone();\r\n if (isInstanced) {\r\n mesh.getMatrixAt(i, instanceTransform);\r\n min.applyMatrix4(instanceTransform);\r\n max.applyMatrix4(instanceTransform);\r\n }\r\n min.applyMatrix4(meshTransform);\r\n max.applyMatrix4(meshTransform);\r\n if (min.x < this._absoluteMin.x)\r\n this._absoluteMin.x = min.x;\r\n if (min.y < this._absoluteMin.y)\r\n this._absoluteMin.y = min.y;\r\n if (min.z < this._absoluteMin.z)\r\n this._absoluteMin.z = min.z;\r\n if (min.x > this._absoluteMax.x)\r\n this._absoluteMax.x = min.x;\r\n if (min.y > this._absoluteMax.y)\r\n this._absoluteMax.y = min.y;\r\n if (min.z > this._absoluteMax.z)\r\n this._absoluteMax.z = min.z;\r\n if (max.x > this._absoluteMax.x)\r\n this._absoluteMax.x = max.x;\r\n if (max.y > this._absoluteMax.y)\r\n this._absoluteMax.y = max.y;\r\n if (max.z > this._absoluteMax.z)\r\n this._absoluteMax.z = max.z;\r\n if (max.x < this._absoluteMin.x)\r\n this._absoluteMin.x = max.x;\r\n if (max.y < this._absoluteMin.y)\r\n this._absoluteMin.y = max.y;\r\n if (max.z < this._absoluteMin.z)\r\n this._absoluteMin.z = max.z;\r\n }\r\n }\r\n static getFragmentBounds(mesh) {\r\n const position = mesh.geometry.attributes.position;\r\n const maxNum = Number.MAX_VALUE;\r\n const minNum = -maxNum;\r\n const min = new THREE.Vector3(maxNum, maxNum, maxNum);\r\n const max = new THREE.Vector3(minNum, minNum, minNum);\r\n if (!mesh.geometry.index) {\r\n throw new Error(\"Geometry must be indexed!\");\r\n }\r\n const indices = Array.from(mesh.geometry.index.array);\r\n for (const index of indices) {\r\n const x = position.getX(index);\r\n const y = position.getY(index);\r\n const z = position.getZ(index);\r\n if (x < min.x)\r\n min.x = x;\r\n if (y < min.y)\r\n min.y = y;\r\n if (z < min.z)\r\n min.z = z;\r\n if (x > max.x)\r\n max.x = x;\r\n if (y > max.y)\r\n max.y = y;\r\n if (z > max.z)\r\n max.z = z;\r\n }\r\n return new THREE.Box3(min, max);\r\n }\r\n}\r\nFragmentBoundingBox.uuid = \"d1444724-dba6-4cdd-a0c7-68ee1450d166\";\r\nToolComponent.libraryUUIDs.add(FragmentBoundingBox.uuid);\r\n//# sourceMappingURL=index.js.map"],"names":["FragmentBoundingBox","constructor","components","super","this","enabled","onDisposed","_meshes","tools","add","uuid","_absoluteMin","newBound","_absoluteMax","static","bbox","min","max","width","Math","abs","x","height","y","depth","z","center","subVectors","divideScalar","positive","factor","Number","MAX_VALUE","points","maxPoint","minPoint","point","async","disposer","get","mesh","destroy","trigger","reset","clone","getSphere","dx","dy","dz","radius","distanceTo","getMesh","dimensions","getDimensions","box","push","position","copy","group","frag","items","addMesh","geometry","index","getFragmentBounds","updateMatrix","meshTransform","matrix","instanceTransform","isInstanced","count","i","getMatrixAt","applyMatrix4","attributes","maxNum","minNum","Error","indices","Array","from","array","getX","getY","getZ"],"sourceRoot":""}