{"version":3,"file":"vendor.openbim-components-cc83c03e.67687b6c680dfb2c.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/fragments/FragmentExploder/index.js","webpack://client-app/./node_modules/openbim-components/src/fragments/FragmentHider/index.js","webpack://client-app/./node_modules/openbim-components/src/fragments/FragmentHighlighter/index.js"],"sourcesContent":["import * as THREE from \"three\";\r\nimport { Component, UIElement, Event } from \"../../base-types\";\r\nimport { toCompositeID } from \"../../utils\";\r\nimport { Button } from \"../../ui\";\r\nimport { ToolComponent } from \"../../core\";\r\nimport { FragmentClassifier } from \"../FragmentClassifier\";\r\nimport { FragmentManager } from \"../FragmentManager\";\r\n// TODO: Clean up and document\r\nexport class FragmentExploder extends Component {\r\n get() {\r\n return this._explodedFragments;\r\n }\r\n constructor(components) {\r\n super(components);\r\n this.enabled = false;\r\n this.height = 10;\r\n this.groupName = \"storeys\";\r\n this.uiElement = new UIElement();\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n this._explodedFragments = new Set();\r\n components.tools.add(FragmentExploder.uuid, this);\r\n if (components.uiEnabled) {\r\n this.setupUI(components);\r\n }\r\n }\r\n async dispose() {\r\n this._explodedFragments.clear();\r\n this.uiElement.dispose();\r\n await this.onDisposed.trigger(FragmentExploder.uuid);\r\n this.onDisposed.reset();\r\n }\r\n explode() {\r\n this.enabled = true;\r\n this.update();\r\n }\r\n reset() {\r\n this.enabled = false;\r\n this.update();\r\n }\r\n update() {\r\n const classifier = this.components.tools.get(FragmentClassifier);\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const factor = this.enabled ? 1 : -1;\r\n let i = 0;\r\n const systems = classifier.get();\r\n const groups = systems[this.groupName];\r\n const mergedIDHeightMap = {};\r\n const yTransform = new THREE.Matrix4();\r\n for (const groupName in groups) {\r\n yTransform.elements[13] = i * factor * this.height;\r\n for (const fragID in groups[groupName]) {\r\n const fragment = fragments.list[fragID];\r\n const customID = groupName + fragID;\r\n if (!fragment) {\r\n continue;\r\n }\r\n if (this.enabled && this._explodedFragments.has(customID)) {\r\n continue;\r\n }\r\n if (!this.enabled && !this._explodedFragments.has(customID)) {\r\n continue;\r\n }\r\n if (this.enabled) {\r\n this._explodedFragments.add(customID);\r\n }\r\n else {\r\n this._explodedFragments.delete(customID);\r\n }\r\n if (fragment.blocks.count === 1) {\r\n // For instanced fragments\r\n const ids = groups[groupName][fragID];\r\n for (const id of ids) {\r\n const tempMatrix = new THREE.Matrix4();\r\n const { instanceID } = fragment.getInstanceAndBlockID(id);\r\n fragment.getInstance(instanceID, tempMatrix);\r\n tempMatrix.premultiply(yTransform);\r\n fragment.mesh.setMatrixAt(instanceID, tempMatrix);\r\n const composites = fragment.composites[id];\r\n if (composites) {\r\n for (let i = 1; i < composites; i++) {\r\n const idNum = parseInt(id, 10);\r\n const compID = toCompositeID(idNum, i);\r\n const { instanceID } = fragment.getInstanceAndBlockID(compID);\r\n fragment.getInstance(instanceID, tempMatrix);\r\n tempMatrix.premultiply(yTransform);\r\n fragment.mesh.setMatrixAt(instanceID, tempMatrix);\r\n }\r\n }\r\n }\r\n fragment.mesh.instanceMatrix.needsUpdate = true;\r\n }\r\n else {\r\n if (!mergedIDHeightMap[fragID]) {\r\n mergedIDHeightMap[fragID] = {};\r\n }\r\n const ids = groups[groupName][fragID];\r\n for (const id of ids) {\r\n mergedIDHeightMap[fragID][id] = i * factor * this.height;\r\n }\r\n }\r\n }\r\n i++;\r\n }\r\n const v = new THREE.Vector3();\r\n // Update merged fragments\r\n for (const fragID in mergedIDHeightMap) {\r\n const heights = mergedIDHeightMap[fragID];\r\n const fragment = fragments.list[fragID];\r\n const geometry = fragment.mesh.geometry;\r\n const position = geometry.attributes.position;\r\n for (let i = 0; i < geometry.index.count; i++) {\r\n const index = geometry.index.array[i];\r\n const blockID = geometry.attributes.blockID.array[index];\r\n const id = fragment.getItemID(0, blockID);\r\n const height = heights[id];\r\n if (height === undefined)\r\n continue;\r\n yTransform.elements[13] = height;\r\n const x = position.array[index * 3];\r\n const y = position.array[index * 3 + 1];\r\n const z = position.array[index * 3 + 2];\r\n v.set(x, y, z);\r\n v.applyMatrix4(yTransform);\r\n position.setXYZ(index, v.x, v.y, v.z);\r\n }\r\n position.needsUpdate = true;\r\n }\r\n }\r\n setupUI(components) {\r\n const main = new Button(components);\r\n this.uiElement.set({ main });\r\n main.tooltip = \"Explode\";\r\n main.materialIcon = \"splitscreen\";\r\n main.onClick.add(async () => {\r\n if (this.enabled) {\r\n this.reset();\r\n }\r\n else {\r\n this.explode();\r\n }\r\n });\r\n }\r\n}\r\nFragmentExploder.uuid = \"d260618b-ce88-4c7d-826c-6debb91de3e2\";\r\nToolComponent.libraryUUIDs.add(FragmentExploder.uuid);\r\n//# sourceMappingURL=index.js.map","import { FragmentManager } from \"../FragmentManager\";\r\nimport { ScreenCuller, ToolComponent } from \"../../core\";\r\nimport { Component, UIElement, Event, } from \"../../base-types\";\r\nimport { Button, CheckboxInput, FloatingWindow, SimpleUIComponent, TextInput, } from \"../../ui\";\r\nimport { IfcPropertiesFinder } from \"../../ifc\";\r\nexport class FragmentHider extends Component {\r\n constructor(components) {\r\n super(components);\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n this.enabled = true;\r\n this.uiElement = new UIElement();\r\n this._localStorageID = \"FragmentHiderCache\";\r\n this._updateVisibilityOnFound = true;\r\n this._filterCards = {};\r\n this.components.tools.add(FragmentHider.uuid, this);\r\n if (components.uiEnabled) {\r\n this.setupUI(components);\r\n }\r\n }\r\n setupUI(components) {\r\n const mainWindow = new FloatingWindow(components);\r\n mainWindow.title = \"Filters\";\r\n mainWindow.visible = false;\r\n components.ui.add(mainWindow);\r\n mainWindow.domElement.style.width = \"530px\";\r\n mainWindow.domElement.style.height = \"400px\";\r\n const mainButton = new Button(components, {\r\n materialIconName: \"filter_alt\",\r\n tooltip: \"Visibility filters\",\r\n });\r\n mainButton.onClick.add(() => {\r\n this.hideAllFinders();\r\n mainWindow.visible = !mainWindow.visible;\r\n });\r\n const topButtonContainerHtml = `
`;\r\n const topButtonContainer = new SimpleUIComponent(components, topButtonContainerHtml);\r\n const createButton = new Button(components, {\r\n materialIconName: \"add\",\r\n });\r\n createButton.onClick.add(() => this.createStyleCard());\r\n topButtonContainer.addChild(createButton);\r\n mainWindow.addChild(topButtonContainer);\r\n this.uiElement.set({ window: mainWindow, main: mainButton });\r\n }\r\n async dispose() {\r\n this.uiElement.dispose();\r\n await this.onDisposed.trigger(FragmentHider.uuid);\r\n this.onDisposed.reset();\r\n }\r\n set(visible, items) {\r\n const fragments = this.components.tools.get(FragmentManager);\r\n if (!items) {\r\n for (const id in fragments.list) {\r\n const fragment = fragments.list[id];\r\n if (fragment) {\r\n fragment.setVisibility(visible);\r\n this.updateCulledVisibility(fragment);\r\n }\r\n }\r\n return;\r\n }\r\n for (const fragID in items) {\r\n const ids = items[fragID];\r\n const fragment = fragments.list[fragID];\r\n fragment.setVisibility(visible, ids);\r\n this.updateCulledVisibility(fragment);\r\n }\r\n }\r\n isolate(items) {\r\n this.set(false);\r\n this.set(true, items);\r\n }\r\n get() { }\r\n async update() {\r\n this._updateVisibilityOnFound = false;\r\n for (const id in this._filterCards) {\r\n const { finder } = this._filterCards[id];\r\n await finder.find();\r\n }\r\n this._updateVisibilityOnFound = true;\r\n this.updateQueries();\r\n }\r\n async loadCached() {\r\n const serialized = localStorage.getItem(this._localStorageID);\r\n if (!serialized)\r\n return;\r\n const filters = JSON.parse(serialized);\r\n for (const filter of filters) {\r\n this.createStyleCard(filter);\r\n }\r\n await this.update();\r\n }\r\n updateCulledVisibility(fragment) {\r\n const culler = this.components.tools.get(ScreenCuller);\r\n const colorMeshes = culler.get();\r\n const culled = colorMeshes.get(fragment.id);\r\n if (culled) {\r\n culled.count = fragment.mesh.count;\r\n }\r\n }\r\n createStyleCard(config) {\r\n const filterCard = new SimpleUIComponent(this.components);\r\n if (config && config.id.length) {\r\n filterCard.id = config.id;\r\n }\r\n const { id } = filterCard;\r\n filterCard.domElement.className = `m-4 p-4 border-1 border-solid border-[#3A444E] rounded-md flex flex-col`;\r\n filterCard.domElement.innerHTML = `\r\n
\r\n
\r\n
\r\n
\r\n `;\r\n const deleteButton = new Button(this.components, {\r\n materialIconName: \"close\",\r\n });\r\n deleteButton.domElement.classList.add(\"self-end\");\r\n deleteButton.onClick.add(() => this.deleteStyleCard(id));\r\n const topContainer = filterCard.getInnerElement(\"top-container\");\r\n if (topContainer) {\r\n topContainer.appendChild(deleteButton.domElement);\r\n }\r\n const bottomContainer = filterCard.getInnerElement(\"bottom-container\");\r\n if (!bottomContainer) {\r\n throw new Error(\"Error creating UI elements!\");\r\n }\r\n const name = new TextInput(this.components);\r\n name.label = \"Name\";\r\n name.domElement.addEventListener(\"focusout\", () => {\r\n this.cache();\r\n });\r\n if (config) {\r\n name.value = config.name;\r\n }\r\n bottomContainer.append(name.domElement);\r\n const visible = new CheckboxInput(this.components);\r\n visible.value = config ? config.visible : true;\r\n visible.label = \"Visible\";\r\n visible.onChange.add(() => this.updateQueries());\r\n const enabled = new CheckboxInput(this.components);\r\n enabled.value = config ? config.enabled : true;\r\n enabled.label = \"Enabled\";\r\n enabled.onChange.add(() => this.updateQueries());\r\n const checkBoxContainer = new SimpleUIComponent(this.components);\r\n checkBoxContainer.domElement.classList.remove(\"w-full\");\r\n checkBoxContainer.addChild(visible);\r\n checkBoxContainer.addChild(enabled);\r\n bottomContainer.append(checkBoxContainer.domElement);\r\n const finder = new IfcPropertiesFinder(this.components);\r\n finder.init();\r\n finder.loadCached(id);\r\n const queryBuilder = finder.uiElement.get(\"query\");\r\n const mainButton = finder.uiElement.get(\"main\");\r\n const finderWindow = finder.uiElement.get(\"queryWindow\");\r\n queryBuilder.findButton.label = \"Apply\";\r\n bottomContainer.append(mainButton.domElement);\r\n finderWindow.onVisible.add(() => {\r\n this.hideAllFinders(finderWindow.id);\r\n const rect = mainButton.domElement.getBoundingClientRect();\r\n finderWindow.domElement.style.left = `${rect.x + 90}px`;\r\n finderWindow.domElement.style.top = `${rect.y - 120}px`;\r\n });\r\n finder.onFound.add((data) => {\r\n finderWindow.visible = false;\r\n mainButton.active = false;\r\n this._filterCards[id].fragments = data;\r\n this.cache();\r\n if (this._updateVisibilityOnFound) {\r\n this.updateQueries();\r\n }\r\n });\r\n const fragments = {};\r\n this._filterCards[id] = {\r\n styleCard: filterCard,\r\n fragments,\r\n name,\r\n finder,\r\n deleteButton,\r\n visible,\r\n enabled,\r\n };\r\n const mainWindow = this.uiElement.get(\"window\");\r\n mainWindow.addChild(filterCard);\r\n }\r\n updateQueries() {\r\n this.set(true);\r\n for (const id in this._filterCards) {\r\n const { enabled, visible, fragments } = this._filterCards[id];\r\n if (enabled.value) {\r\n this.set(visible.value, fragments);\r\n }\r\n }\r\n this.cache();\r\n }\r\n async deleteStyleCard(id) {\r\n const found = this._filterCards[id];\r\n if (found) {\r\n await found.styleCard.dispose();\r\n await found.deleteButton.dispose();\r\n await found.name.dispose();\r\n found.finder.deleteCache();\r\n await found.finder.dispose();\r\n await found.visible.dispose();\r\n await found.enabled.dispose();\r\n }\r\n delete this._filterCards[id];\r\n this.updateQueries();\r\n }\r\n hideAllFinders(excludeID) {\r\n for (const id in this._filterCards) {\r\n const { finder } = this._filterCards[id];\r\n const queryWindow = finder.uiElement.get(\"queryWindow\");\r\n const mainButton = finder.uiElement.get(\"main\");\r\n if (queryWindow.id === excludeID) {\r\n continue;\r\n }\r\n if (queryWindow.visible) {\r\n mainButton.domElement.click();\r\n }\r\n }\r\n }\r\n cache() {\r\n const filters = [];\r\n for (const id in this._filterCards) {\r\n const styleCard = this._filterCards[id];\r\n const { visible, enabled, name } = styleCard;\r\n filters.push({\r\n visible: visible.value,\r\n enabled: enabled.value,\r\n name: name.value,\r\n id,\r\n });\r\n }\r\n const serialized = JSON.stringify(filters);\r\n localStorage.setItem(this._localStorageID, serialized);\r\n }\r\n}\r\nFragmentHider.uuid = \"dd9ccf2d-8a21-4821-b7f6-2949add16a29\";\r\nToolComponent.libraryUUIDs.add(FragmentHider.uuid);\r\n//# sourceMappingURL=index.js.map","import * as THREE from \"three\";\r\nimport { Event, } from \"../../base-types\";\r\nimport { Component } from \"../../base-types/component\";\r\nimport { FragmentManager } from \"../FragmentManager\";\r\nimport { FragmentBoundingBox } from \"../FragmentBoundingBox\";\r\nimport { ToolComponent } from \"../../core/ToolsComponent\";\r\nimport { toCompositeID } from \"../../utils\";\r\nimport { PostproductionRenderer } from \"../../navigation/PostproductionRenderer\";\r\nexport class FragmentHighlighter extends Component {\r\n get outlineEnabled() {\r\n return this._outlineEnabled;\r\n }\r\n set outlineEnabled(value) {\r\n this._outlineEnabled = value;\r\n if (!value) {\r\n delete this._postproduction.customEffects.outlinedMeshes.fragments;\r\n }\r\n }\r\n get _postproduction() {\r\n if (!(this.components.renderer instanceof PostproductionRenderer)) {\r\n throw new Error(\"Postproduction renderer is needed for outlines!\");\r\n }\r\n const renderer = this.components.renderer;\r\n return renderer.postproduction;\r\n }\r\n constructor(components) {\r\n super(components);\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n /** {@link Updateable.onBeforeUpdate} */\r\n this.onBeforeUpdate = new Event();\r\n /** {@link Updateable.onAfterUpdate} */\r\n this.onAfterUpdate = new Event();\r\n this.enabled = true;\r\n this.highlightMats = {};\r\n this.events = {};\r\n this.multiple = \"ctrlKey\";\r\n this.zoomFactor = 1.5;\r\n this.zoomToSelection = false;\r\n this.selection = {};\r\n this.excludeOutline = new Set();\r\n this.fillEnabled = true;\r\n this.outlineMaterial = new THREE.MeshBasicMaterial({\r\n color: \"white\",\r\n transparent: true,\r\n depthTest: false,\r\n depthWrite: false,\r\n opacity: 0.4,\r\n });\r\n this._eventsActive = false;\r\n this._outlineEnabled = true;\r\n this._outlinedMeshes = {};\r\n this._invisibleMaterial = new THREE.MeshBasicMaterial({ visible: false });\r\n this._tempMatrix = new THREE.Matrix4();\r\n this.config = {\r\n selectName: \"select\",\r\n hoverName: \"hover\",\r\n selectionMaterial: new THREE.MeshBasicMaterial({\r\n color: \"#BCF124\",\r\n transparent: true,\r\n opacity: 0.85,\r\n depthTest: true,\r\n }),\r\n hoverMaterial: new THREE.MeshBasicMaterial({\r\n color: \"#6528D7\",\r\n transparent: true,\r\n opacity: 0.2,\r\n depthTest: true,\r\n }),\r\n autoHighlightOnClick: true,\r\n cullHighlightMeshes: true,\r\n };\r\n this._mouseState = {\r\n down: false,\r\n moved: false,\r\n };\r\n this.onFragmentsDisposed = (data) => {\r\n this.disposeOutlinedMeshes(data.fragmentIDs);\r\n };\r\n this.onSetup = new Event();\r\n this.onMouseDown = () => {\r\n if (!this.enabled)\r\n return;\r\n this._mouseState.down = true;\r\n };\r\n this.onMouseUp = async (event) => {\r\n if (!this.enabled)\r\n return;\r\n if (event.target !== this.components.renderer.get().domElement)\r\n return;\r\n this._mouseState.down = false;\r\n if (this._mouseState.moved || event.button !== 0) {\r\n this._mouseState.moved = false;\r\n return;\r\n }\r\n this._mouseState.moved = false;\r\n if (this.config.autoHighlightOnClick) {\r\n const mult = this.multiple === \"none\" ? true : !event[this.multiple];\r\n await this.highlight(this.config.selectName, mult, this.zoomToSelection);\r\n }\r\n };\r\n this.onMouseMove = async () => {\r\n if (!this.enabled)\r\n return;\r\n if (this._mouseState.moved) {\r\n await this.clearFills(this.config.hoverName);\r\n return;\r\n }\r\n this._mouseState.moved = this._mouseState.down;\r\n await this.highlight(this.config.hoverName, true, false);\r\n };\r\n this.components.tools.add(FragmentHighlighter.uuid, this);\r\n const fragmentManager = components.tools.get(FragmentManager);\r\n fragmentManager.onFragmentsDisposed.add(this.onFragmentsDisposed);\r\n }\r\n get() {\r\n return this.highlightMats;\r\n }\r\n getHoveredSelection() {\r\n return this.selection[this.config.hoverName];\r\n }\r\n disposeOutlinedMeshes(fragmentIDs) {\r\n for (const id of fragmentIDs) {\r\n const mesh = this._outlinedMeshes[id];\r\n if (!mesh)\r\n continue;\r\n mesh.geometry.dispose();\r\n delete this._outlinedMeshes[id];\r\n }\r\n }\r\n async dispose() {\r\n this.setupEvents(false);\r\n this.config.hoverMaterial.dispose();\r\n this.config.selectionMaterial.dispose();\r\n this.onBeforeUpdate.reset();\r\n this.onAfterUpdate.reset();\r\n for (const matID in this.highlightMats) {\r\n const mats = this.highlightMats[matID] || [];\r\n for (const mat of mats) {\r\n mat.dispose();\r\n }\r\n }\r\n this.disposeOutlinedMeshes(Object.keys(this._outlinedMeshes));\r\n this.outlineMaterial.dispose();\r\n this._invisibleMaterial.dispose();\r\n this.highlightMats = {};\r\n this.selection = {};\r\n for (const name in this.events) {\r\n this.events[name].onClear.reset();\r\n this.events[name].onHighlight.reset();\r\n }\r\n this.onSetup.reset();\r\n const fragmentManager = this.components.tools.get(FragmentManager);\r\n fragmentManager.onFragmentsDisposed.remove(this.onFragmentsDisposed);\r\n this.events = {};\r\n await this.onDisposed.trigger(FragmentHighlighter.uuid);\r\n this.onDisposed.reset();\r\n }\r\n async add(name, material) {\r\n if (this.highlightMats[name]) {\r\n throw new Error(\"A highlight with this name already exists.\");\r\n }\r\n this.highlightMats[name] = material;\r\n this.selection[name] = {};\r\n this.events[name] = {\r\n onHighlight: new Event(),\r\n onClear: new Event(),\r\n };\r\n await this.update();\r\n }\r\n /** {@link Updateable.update} */\r\n async update() {\r\n if (!this.fillEnabled) {\r\n return;\r\n }\r\n this.onBeforeUpdate.trigger(this);\r\n const fragments = this.components.tools.get(FragmentManager);\r\n for (const fragmentID in fragments.list) {\r\n const fragment = fragments.list[fragmentID];\r\n this.addHighlightToFragment(fragment);\r\n const outlinedMesh = this._outlinedMeshes[fragmentID];\r\n if (outlinedMesh) {\r\n fragment.mesh.updateMatrixWorld(true);\r\n outlinedMesh.applyMatrix4(fragment.mesh.matrixWorld);\r\n }\r\n }\r\n this.onAfterUpdate.trigger(this);\r\n }\r\n async highlight(name, removePrevious = true, zoomToSelection = this.zoomToSelection) {\r\n var _a;\r\n if (!this.enabled)\r\n return null;\r\n this.checkSelection(name);\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const fragList = [];\r\n const meshes = fragments.meshes;\r\n const result = this.components.raycaster.castRay(meshes);\r\n if (!result) {\r\n await this.clear(name);\r\n return null;\r\n }\r\n const mesh = result.object;\r\n const geometry = mesh.geometry;\r\n const index = (_a = result.face) === null || _a === void 0 ? void 0 : _a.a;\r\n const instanceID = result.instanceId;\r\n if (!geometry || index === undefined || instanceID === undefined) {\r\n return null;\r\n }\r\n if (removePrevious) {\r\n await this.clear(name);\r\n }\r\n if (!this.selection[name][mesh.uuid]) {\r\n this.selection[name][mesh.uuid] = new Set();\r\n }\r\n fragList.push(mesh.fragment);\r\n const blockID = mesh.fragment.getVertexBlockID(geometry, index);\r\n const itemID = mesh.fragment\r\n .getItemID(instanceID, blockID)\r\n .replace(/\\..*/, \"\");\r\n const idNum = parseInt(itemID, 10);\r\n this.selection[name][mesh.uuid].add(itemID);\r\n this.addComposites(mesh, idNum, name);\r\n await this.regenerate(name, mesh.uuid);\r\n const group = mesh.fragment.group;\r\n if (group) {\r\n const keys = group.data[idNum][0];\r\n for (let i = 0; i < keys.length; i++) {\r\n const fragKey = keys[i];\r\n const fragID = group.keyFragments[fragKey];\r\n const fragment = fragments.list[fragID];\r\n fragList.push(fragment);\r\n if (!this.selection[name][fragID]) {\r\n this.selection[name][fragID] = new Set();\r\n }\r\n this.selection[name][fragID].add(itemID);\r\n this.addComposites(fragment.mesh, idNum, name);\r\n await this.regenerate(name, fragID);\r\n }\r\n }\r\n await this.events[name].onHighlight.trigger(this.selection[name]);\r\n if (zoomToSelection) {\r\n await this.zoomSelection(name);\r\n }\r\n return { id: itemID, fragments: fragList };\r\n }\r\n async highlightByID(name, ids, removePrevious = true, zoomToSelection = this.zoomToSelection) {\r\n if (!this.enabled)\r\n return;\r\n if (removePrevious) {\r\n await this.clear(name);\r\n }\r\n const styles = this.selection[name];\r\n for (const fragID in ids) {\r\n if (!styles[fragID]) {\r\n styles[fragID] = new Set();\r\n }\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const fragment = fragments.list[fragID];\r\n const idsNum = new Set();\r\n for (const id of ids[fragID]) {\r\n styles[fragID].add(id);\r\n idsNum.add(parseInt(id, 10));\r\n }\r\n for (const id of idsNum) {\r\n this.addComposites(fragment.mesh, id, name);\r\n }\r\n await this.regenerate(name, fragID);\r\n }\r\n await this.events[name].onHighlight.trigger(this.selection[name]);\r\n if (zoomToSelection) {\r\n await this.zoomSelection(name);\r\n }\r\n }\r\n /**\r\n * Clears any selection previously made by calling {@link highlight}.\r\n */\r\n async clear(name) {\r\n await this.clearFills(name);\r\n if (!name || !this.excludeOutline.has(name)) {\r\n await this.clearOutlines();\r\n }\r\n }\r\n async setup(config) {\r\n if (config === null || config === void 0 ? void 0 : config.selectionMaterial) {\r\n this.config.selectionMaterial.dispose();\r\n }\r\n if (config === null || config === void 0 ? void 0 : config.hoverMaterial) {\r\n this.config.hoverMaterial.dispose();\r\n }\r\n this.config = { ...this.config, ...config };\r\n this.outlineMaterial.color.set(0xf0ff7a);\r\n this.excludeOutline.add(this.config.hoverName);\r\n await this.add(this.config.selectName, [this.config.selectionMaterial]);\r\n await this.add(this.config.hoverName, [this.config.hoverMaterial]);\r\n this.setupEvents(true);\r\n this.enabled = true;\r\n this.onSetup.trigger(this);\r\n }\r\n async regenerate(name, fragID) {\r\n if (this.fillEnabled) {\r\n await this.updateFragmentFill(name, fragID);\r\n }\r\n if (this._outlineEnabled) {\r\n await this.updateFragmentOutline(name, fragID);\r\n }\r\n }\r\n async zoomSelection(name) {\r\n if (!this.fillEnabled && !this._outlineEnabled) {\r\n return;\r\n }\r\n const bbox = this.components.tools.get(FragmentBoundingBox);\r\n const fragments = this.components.tools.get(FragmentManager);\r\n bbox.reset();\r\n const selected = this.selection[name];\r\n if (!Object.keys(selected).length) {\r\n return;\r\n }\r\n for (const fragID in selected) {\r\n const fragment = fragments.list[fragID];\r\n if (this.fillEnabled) {\r\n const highlight = fragment.fragments[name];\r\n if (highlight) {\r\n bbox.addMesh(highlight.mesh);\r\n }\r\n }\r\n if (this._outlineEnabled && this._outlinedMeshes[fragID]) {\r\n bbox.addMesh(this._outlinedMeshes[fragID]);\r\n }\r\n }\r\n const sphere = bbox.getSphere();\r\n const i = Infinity;\r\n const mi = -Infinity;\r\n const { x, y, z } = sphere.center;\r\n const isInf = sphere.radius === i || x === i || y === i || z === i;\r\n const isMInf = sphere.radius === mi || x === mi || y === mi || z === mi;\r\n const isZero = sphere.radius === 0;\r\n if (isInf || isMInf || isZero) {\r\n return;\r\n }\r\n sphere.radius *= this.zoomFactor;\r\n const camera = this.components.camera;\r\n await camera.controls.fitToSphere(sphere, true);\r\n }\r\n addComposites(mesh, itemID, name) {\r\n const composites = mesh.fragment.composites[itemID];\r\n if (composites) {\r\n for (let i = 1; i < composites; i++) {\r\n const compositeID = toCompositeID(itemID, i);\r\n this.selection[name][mesh.uuid].add(compositeID);\r\n }\r\n }\r\n }\r\n async clearStyle(name) {\r\n const fragments = this.components.tools.get(FragmentManager);\r\n for (const fragID in this.selection[name]) {\r\n const fragment = fragments.list[fragID];\r\n if (!fragment)\r\n continue;\r\n const selection = fragment.fragments[name];\r\n if (selection) {\r\n selection.mesh.removeFromParent();\r\n }\r\n }\r\n await this.events[name].onClear.trigger(null);\r\n this.selection[name] = {};\r\n }\r\n async updateFragmentFill(name, fragmentID) {\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const ids = this.selection[name][fragmentID];\r\n const fragment = fragments.list[fragmentID];\r\n if (!fragment)\r\n return;\r\n const selection = fragment.fragments[name];\r\n if (!selection)\r\n return;\r\n const fragmentParent = fragment.mesh.parent;\r\n if (!fragmentParent)\r\n return;\r\n fragmentParent.add(selection.mesh);\r\n const isBlockFragment = selection.blocks.count > 1;\r\n if (isBlockFragment) {\r\n fragment.getInstance(0, this._tempMatrix);\r\n selection.setInstance(0, {\r\n ids: Array.from(fragment.ids),\r\n transform: this._tempMatrix,\r\n });\r\n // Only highlight visible blocks\r\n const visibleIDs = new Set();\r\n let counter = 0;\r\n for (const id of ids) {\r\n if (fragment.blocks.visibleIds.has(counter)) {\r\n visibleIDs.add(id);\r\n }\r\n counter++;\r\n }\r\n selection.blocks.setVisibility(true, visibleIDs, true);\r\n }\r\n else {\r\n let i = 0;\r\n for (const id of ids) {\r\n selection.mesh.count = i + 1;\r\n const { instanceID } = fragment.getInstanceAndBlockID(id);\r\n fragment.getInstance(instanceID, this._tempMatrix);\r\n selection.setInstance(i, { ids: [id], transform: this._tempMatrix });\r\n i++;\r\n }\r\n }\r\n }\r\n checkSelection(name) {\r\n if (!this.selection[name]) {\r\n throw new Error(`Selection ${name} does not exist.`);\r\n }\r\n }\r\n addHighlightToFragment(fragment) {\r\n for (const name in this.highlightMats) {\r\n if (!fragment.fragments[name]) {\r\n const material = this.highlightMats[name];\r\n const subFragment = fragment.addFragment(name, material);\r\n subFragment.group = fragment.group;\r\n if (fragment.blocks.count > 1) {\r\n subFragment.setInstance(0, {\r\n ids: Array.from(fragment.ids),\r\n transform: this._tempMatrix,\r\n });\r\n subFragment.blocks.setVisibility(false);\r\n }\r\n subFragment.mesh.renderOrder = 2;\r\n subFragment.mesh.frustumCulled = false;\r\n }\r\n }\r\n }\r\n async clearFills(name) {\r\n const names = name ? [name] : Object.keys(this.selection);\r\n for (const name of names) {\r\n await this.clearStyle(name);\r\n }\r\n }\r\n async clearOutlines() {\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const effects = this._postproduction.customEffects;\r\n const fragmentsOutline = effects.outlinedMeshes.fragments;\r\n if (fragmentsOutline) {\r\n fragmentsOutline.meshes.clear();\r\n }\r\n for (const fragID in this._outlinedMeshes) {\r\n const fragment = fragments.list[fragID];\r\n const isBlockFragment = fragment.blocks.count > 1;\r\n const mesh = this._outlinedMeshes[fragID];\r\n if (isBlockFragment) {\r\n mesh.geometry.setIndex([]);\r\n }\r\n else {\r\n mesh.count = 0;\r\n }\r\n }\r\n }\r\n async updateFragmentOutline(name, fragmentID) {\r\n const fragments = this.components.tools.get(FragmentManager);\r\n if (!this.selection[name][fragmentID]) {\r\n return;\r\n }\r\n if (this.excludeOutline.has(name)) {\r\n return;\r\n }\r\n const ids = this.selection[name][fragmentID];\r\n const fragment = fragments.list[fragmentID];\r\n if (!fragment)\r\n return;\r\n const geometry = fragment.mesh.geometry;\r\n const customEffects = this._postproduction.customEffects;\r\n if (!customEffects.outlinedMeshes.fragments) {\r\n customEffects.outlinedMeshes.fragments = {\r\n meshes: new Set(),\r\n material: this.outlineMaterial,\r\n };\r\n }\r\n const outlineEffect = customEffects.outlinedMeshes.fragments;\r\n // Create a copy of the original fragment mesh for outline\r\n if (!this._outlinedMeshes[fragmentID]) {\r\n const newGeometry = new THREE.BufferGeometry();\r\n newGeometry.attributes = geometry.attributes;\r\n newGeometry.index = geometry.index;\r\n const newMesh = new THREE.InstancedMesh(newGeometry, this._invisibleMaterial, fragment.capacity);\r\n newMesh.frustumCulled = false;\r\n newMesh.renderOrder = 999;\r\n fragment.mesh.updateMatrixWorld(true);\r\n newMesh.applyMatrix4(fragment.mesh.matrixWorld);\r\n this._outlinedMeshes[fragmentID] = newMesh;\r\n const scene = this.components.scene.get();\r\n scene.add(newMesh);\r\n }\r\n const outlineMesh = this._outlinedMeshes[fragmentID];\r\n outlineEffect.meshes.add(outlineMesh);\r\n const isBlockFragment = fragment.blocks.count > 1;\r\n if (isBlockFragment) {\r\n const indices = fragment.mesh.geometry.index.array;\r\n const newIndex = [];\r\n const idsSet = new Set(ids);\r\n for (let i = 0; i < indices.length - 2; i += 3) {\r\n const index = indices[i];\r\n const blockID = fragment.mesh.geometry.attributes.blockID.array;\r\n const block = blockID[index];\r\n const itemID = fragment.mesh.fragment.getItemID(0, block);\r\n if (idsSet.has(itemID)) {\r\n newIndex.push(indices[i], indices[i + 1], indices[i + 2]);\r\n }\r\n }\r\n outlineMesh.geometry.setIndex(newIndex);\r\n }\r\n else {\r\n let counter = 0;\r\n for (const id of ids) {\r\n const { instanceID } = fragment.getInstanceAndBlockID(id);\r\n fragment.mesh.getMatrixAt(instanceID, this._tempMatrix);\r\n outlineMesh.setMatrixAt(counter++, this._tempMatrix);\r\n }\r\n outlineMesh.count = counter;\r\n outlineMesh.instanceMatrix.needsUpdate = true;\r\n }\r\n }\r\n setupEvents(active) {\r\n const container = this.components.renderer.get().domElement;\r\n if (active === this._eventsActive) {\r\n return;\r\n }\r\n this._eventsActive = active;\r\n if (active) {\r\n container.addEventListener(\"mousedown\", this.onMouseDown);\r\n container.addEventListener(\"mouseup\", this.onMouseUp);\r\n container.addEventListener(\"mousemove\", this.onMouseMove);\r\n }\r\n else {\r\n container.removeEventListener(\"mousedown\", this.onMouseDown);\r\n container.removeEventListener(\"mouseup\", this.onMouseUp);\r\n container.removeEventListener(\"mousemove\", this.onMouseMove);\r\n }\r\n }\r\n}\r\nFragmentHighlighter.uuid = \"cb8a76f2-654a-4b50-80c6-66fd83cafd77\";\r\nToolComponent.libraryUUIDs.add(FragmentHighlighter.uuid);\r\n//# sourceMappingURL=index.js.map"],"names":["FragmentExploder","get","this","_explodedFragments","constructor","components","super","enabled","height","groupName","uiElement","onDisposed","Set","tools","add","uuid","uiEnabled","setupUI","async","clear","dispose","trigger","reset","explode","update","classifier","fragments","factor","i","groups","mergedIDHeightMap","yTransform","elements","fragID","fragment","list","customID","has","delete","blocks","count","ids","id","tempMatrix","instanceID","getInstanceAndBlockID","getInstance","premultiply","mesh","setMatrixAt","composites","idNum","parseInt","compID","instanceMatrix","needsUpdate","v","heights","geometry","position","attributes","index","array","blockID","getItemID","undefined","x","y","z","set","applyMatrix4","setXYZ","main","tooltip","materialIcon","onClick","FragmentHider","_localStorageID","_updateVisibilityOnFound","_filterCards","mainWindow","title","visible","ui","domElement","style","width","mainButton","materialIconName","hideAllFinders","topButtonContainer","createButton","createStyleCard","addChild","window","items","setVisibility","updateCulledVisibility","isolate","finder","find","updateQueries","serialized","localStorage","getItem","filters","JSON","parse","filter","culled","config","filterCard","length","className","innerHTML","deleteButton","classList","deleteStyleCard","topContainer","getInnerElement","appendChild","bottomContainer","Error","name","label","addEventListener","cache","value","append","onChange","checkBoxContainer","remove","init","loadCached","queryBuilder","finderWindow","findButton","onVisible","rect","getBoundingClientRect","left","top","onFound","data","active","styleCard","found","deleteCache","excludeID","queryWindow","click","push","stringify","setItem","FragmentHighlighter","outlineEnabled","_outlineEnabled","_postproduction","customEffects","outlinedMeshes","renderer","postproduction","onBeforeUpdate","onAfterUpdate","highlightMats","events","multiple","zoomFactor","zoomToSelection","selection","excludeOutline","fillEnabled","outlineMaterial","color","transparent","depthTest","depthWrite","opacity","_eventsActive","_outlinedMeshes","_invisibleMaterial","_tempMatrix","selectName","hoverName","selectionMaterial","hoverMaterial","autoHighlightOnClick","cullHighlightMeshes","_mouseState","down","moved","onFragmentsDisposed","disposeOutlinedMeshes","fragmentIDs","onSetup","onMouseDown","onMouseUp","event","target","button","mult","highlight","onMouseMove","clearFills","getHoveredSelection","setupEvents","matID","mats","mat","Object","keys","onClear","onHighlight","material","fragmentID","addHighlightToFragment","outlinedMesh","updateMatrixWorld","matrixWorld","removePrevious","_a","checkSelection","fragList","meshes","result","raycaster","castRay","object","face","a","instanceId","getVertexBlockID","itemID","replace","addComposites","regenerate","group","fragKey","keyFragments","zoomSelection","styles","idsNum","clearOutlines","updateFragmentFill","updateFragmentOutline","bbox","selected","addMesh","sphere","getSphere","Infinity","mi","center","isInf","radius","isMInf","isZero","camera","controls","fitToSphere","compositeID","removeFromParent","fragmentParent","parent","setInstance","Array","from","transform","visibleIDs","counter","visibleIds","subFragment","addFragment","renderOrder","frustumCulled","names","clearStyle","fragmentsOutline","isBlockFragment","setIndex","outlineEffect","newGeometry","newMesh","capacity","scene","outlineMesh","indices","newIndex","idsSet","block","getMatrixAt","container","removeEventListener"],"sourceRoot":""}