{"version":3,"file":"vendor.openbim-components-c4b5f13d.f50b04675b5ae4a7.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/fragments/FragmentIfcStreamer/src/fragment-props-stream-converter.js","webpack://client-app/./node_modules/openbim-components/src/fragments/FragmentIfcStreamer/src/fragment-stream-loader.js"],"sourcesContent":["import * as WEBIFC from \"web-ifc\";\r\nimport { Component, Event } from \"../../../base-types\";\r\nimport { PropertiesStreamingSettings } from \"./streaming-settings\";\r\nimport { GeometryTypes } from \"../../../ifc/IfcJsonExporter/src/ifc-geometry-types\";\r\n// TODO: Deduplicate with IFC stream converter\r\nexport class FragmentPropsStreamConverter extends Component {\r\n constructor() {\r\n super(...arguments);\r\n this.onPropertiesStreamed = new Event();\r\n this.onProgress = new Event();\r\n this.onIndicesStreamed = new Event();\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n this.enabled = true;\r\n this.settings = new PropertiesStreamingSettings();\r\n this._webIfc = new WEBIFC.IfcAPI();\r\n }\r\n get() {\r\n return this._webIfc;\r\n }\r\n async dispose() {\r\n this.onIndicesStreamed.reset();\r\n this.onPropertiesStreamed.reset();\r\n this._webIfc = null;\r\n this.onDisposed.reset();\r\n }\r\n async streamFromBuffer(data) {\r\n const before = performance.now();\r\n await this.readIfcFile(data);\r\n await this.streamAllProperties();\r\n this.cleanUp();\r\n console.log(`Streaming the IFC took ${performance.now() - before} ms!`);\r\n }\r\n async streamFromCallBack(loadCallback) {\r\n const before = performance.now();\r\n await this.streamIfcFile(loadCallback);\r\n await this.streamAllProperties();\r\n this.cleanUp();\r\n console.log(`Streaming the IFC took ${performance.now() - before} ms!`);\r\n }\r\n async readIfcFile(data) {\r\n const { path, absolute, logLevel } = this.settings.wasm;\r\n this._webIfc.SetWasmPath(path, absolute);\r\n await this._webIfc.Init();\r\n if (logLevel) {\r\n this._webIfc.SetLogLevel(logLevel);\r\n }\r\n this._webIfc.OpenModel(data, this.settings.webIfc);\r\n }\r\n async streamIfcFile(loadCallback) {\r\n const { path, absolute, logLevel } = this.settings.wasm;\r\n this._webIfc.SetWasmPath(path, absolute);\r\n await this._webIfc.Init();\r\n if (logLevel) {\r\n this._webIfc.SetLogLevel(logLevel);\r\n }\r\n this._webIfc.OpenModelFromCallback(loadCallback, this.settings.webIfc);\r\n }\r\n async streamAllProperties() {\r\n const { propertiesSize } = this.settings;\r\n const allIfcEntities = new Set(this._webIfc.GetIfcEntityList(0));\r\n // Types used to construct the property index\r\n const relationTypes = [\r\n WEBIFC.IFCRELDEFINESBYPROPERTIES,\r\n WEBIFC.IFCRELDEFINESBYTYPE,\r\n WEBIFC.IFCRELASSOCIATESMATERIAL,\r\n WEBIFC.IFCRELCONTAINEDINSPATIALSTRUCTURE,\r\n WEBIFC.IFCRELASSOCIATESCLASSIFICATION,\r\n WEBIFC.IFCRELASSIGNSTOGROUP,\r\n ];\r\n const propertyIndices = new Map();\r\n // let finalCount = 0;\r\n // Spatial items get their properties recursively to make\r\n // the location data available (e.g. absolute position of building)\r\n const spatialStructure = new Set([\r\n WEBIFC.IFCPROJECT,\r\n WEBIFC.IFCSITE,\r\n WEBIFC.IFCBUILDING,\r\n WEBIFC.IFCBUILDINGSTOREY,\r\n WEBIFC.IFCSPACE,\r\n ]);\r\n for (const type of spatialStructure) {\r\n allIfcEntities.add(type);\r\n }\r\n let nextProgress = 0.01;\r\n let typeCounter = 0;\r\n for (const type of allIfcEntities) {\r\n typeCounter++;\r\n if (GeometryTypes.has(type)) {\r\n continue;\r\n }\r\n const isSpatial = spatialStructure.has(type);\r\n const ids = this._webIfc.GetLineIDsWithType(0, type);\r\n // const allIDs = this._webIfc.GetAllLines(0);\r\n const idCount = ids.size();\r\n let count = 0;\r\n // Stream all properties in chunks of the specified size\r\n for (let i = 0; i < idCount - propertiesSize; i += propertiesSize) {\r\n const data = {};\r\n for (let j = 0; j < propertiesSize; j++) {\r\n count++;\r\n // finalCount++;\r\n const nextProperty = ids.get(i + j);\r\n try {\r\n const property = this._webIfc.GetLine(0, nextProperty, isSpatial);\r\n if (relationTypes.includes(type)) {\r\n this.getIndices(property, nextProperty, propertyIndices);\r\n }\r\n data[property.expressID] = property;\r\n }\r\n catch (e) {\r\n console.log(`Could not get property: ${nextProperty}`);\r\n }\r\n }\r\n await this.onPropertiesStreamed.trigger({ type, data });\r\n }\r\n // Stream the last chunk\r\n if (count !== idCount) {\r\n const data = {};\r\n for (let i = count; i < idCount; i++) {\r\n // finalCount++;\r\n const nextProperty = ids.get(i);\r\n try {\r\n const property = this._webIfc.GetLine(0, nextProperty, isSpatial);\r\n if (relationTypes.includes(type)) {\r\n this.getIndices(property, nextProperty, propertyIndices);\r\n }\r\n data[property.expressID] = property;\r\n }\r\n catch (e) {\r\n console.log(`Could not get property: ${nextProperty}`);\r\n }\r\n }\r\n await this.onPropertiesStreamed.trigger({ type, data });\r\n }\r\n const currentProgress = typeCounter / allIfcEntities.size;\r\n if (currentProgress > nextProgress) {\r\n nextProgress += 0.01;\r\n nextProgress = Math.max(nextProgress, currentProgress);\r\n await this.onProgress.trigger(Math.round(nextProgress * 100) / 100);\r\n }\r\n }\r\n // Stream indices\r\n const compressedIndices = [];\r\n for (const [id, indices] of propertyIndices) {\r\n compressedIndices.push([id, ...indices]);\r\n }\r\n await this.onIndicesStreamed.trigger(compressedIndices);\r\n // console.log(finalCount);\r\n }\r\n getIndices(property, nextProperty, propertyIndex) {\r\n const related = property.RelatedObjects || property.RelatedElements;\r\n if (!related) {\r\n console.log(`Related objects not found: ${nextProperty}`);\r\n return;\r\n }\r\n const relating = property.RelatingType ||\r\n property.RelatingMaterial ||\r\n property.RelatingStructure ||\r\n property.RelatingPropertyDefinition ||\r\n property.RelatingGroup ||\r\n property.RelatingClassification;\r\n if (!relating) {\r\n console.log(`Relating object not found: ${nextProperty}`);\r\n return;\r\n }\r\n if (!Array.isArray(related) || relating.value === undefined) {\r\n return;\r\n }\r\n const relatingID = relating.value;\r\n for (const item of related) {\r\n if (item.value === undefined || item.value === null) {\r\n continue;\r\n }\r\n const id = item.value;\r\n if (!propertyIndex.has(id)) {\r\n propertyIndex.set(id, new Set());\r\n }\r\n const indices = propertyIndex.get(id);\r\n indices.add(relatingID);\r\n }\r\n }\r\n cleanUp() {\r\n this._webIfc = null;\r\n this._webIfc = new WEBIFC.IfcAPI();\r\n }\r\n}\r\nFragmentPropsStreamConverter.uuid = \"88d2c89c-ce32-47d7-8cb6-d51e4b311a0b\";\r\n//# sourceMappingURL=fragment-props-stream-converter.js.map","import * as THREE from \"three\";\r\nimport * as FRAG from \"bim-fragment\";\r\nimport { unzip } from \"unzipit\";\r\nimport { Component, Event } from \"../../../base-types\";\r\nimport { ToolComponent } from \"../../../core\";\r\nimport { GeometryCullerRenderer } from \"./geometry-culler-renderer\";\r\nimport { FragmentManager } from \"../../FragmentManager\";\r\nimport { IfcPropertiesProcessor } from \"../../../ifc\";\r\nimport { StreamFileDatabase } from \"./streamer-db\";\r\nexport class FragmentStreamLoader extends Component {\r\n get url() {\r\n if (!this._url) {\r\n throw new Error(\"url must be set before using the streaming service!\");\r\n }\r\n return this._url;\r\n }\r\n set url(value) {\r\n this._url = value;\r\n }\r\n constructor(components) {\r\n super(components);\r\n this.enabled = true;\r\n this.onFragmentsDeleted = new Event();\r\n this.onFragmentsLoaded = new Event();\r\n this.onDisposed = new Event();\r\n this.models = {};\r\n this.serializer = new FRAG.StreamSerializer();\r\n this.maxRamTime = 5000;\r\n this.useCache = true;\r\n this._ramCache = new Map();\r\n this._fileCache = new StreamFileDatabase();\r\n this._url = null;\r\n this._isDisposing = false;\r\n // private _hardlySeenGeometries: THREE.InstancedMesh;\r\n this._geometryInstances = {};\r\n this._loadedFragments = {};\r\n // FragID, [model, geometryID, hiddenItems]\r\n this.fragIDData = new Map();\r\n this._baseMaterial = new THREE.MeshLambertMaterial();\r\n this._baseMaterialT = new THREE.MeshLambertMaterial({\r\n transparent: true,\r\n opacity: 0.5,\r\n });\r\n this.components.tools.add(FragmentStreamLoader.uuid, this);\r\n // const hardlyGeometry = new THREE.BoxGeometry();\r\n // this._hardlySeenGeometries = new THREE.InstancedMesh();\r\n this.culler = new GeometryCullerRenderer(components);\r\n this.setupCullerEvents();\r\n }\r\n async dispose() {\r\n this._isDisposing = true;\r\n this.onFragmentsLoaded.reset();\r\n this.onFragmentsDeleted.reset();\r\n this._ramCache.clear();\r\n this.models = {};\r\n this._geometryInstances = {};\r\n // Disposed by fragment manager\r\n this._loadedFragments = {};\r\n this.fragIDData.clear();\r\n this._baseMaterial.dispose();\r\n this._baseMaterialT.dispose();\r\n await this.culler.dispose();\r\n this.culler = new GeometryCullerRenderer(this.components);\r\n this.setupCullerEvents();\r\n await this.onDisposed.trigger(FragmentStreamLoader.uuid);\r\n this.onDisposed.reset();\r\n this._isDisposing = false;\r\n }\r\n async load(settings, coordinate = true, properties) {\r\n const { assets, geometries, globalDataFileId } = settings;\r\n const groupUrl = this.url + globalDataFileId;\r\n const groupData = await fetch(groupUrl);\r\n const groupArrayBuffer = await groupData.arrayBuffer();\r\n const groupBuffer = new Uint8Array(groupArrayBuffer);\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const group = await fragments.load(groupBuffer, coordinate);\r\n const { opaque, transparent } = group.geometryIDs;\r\n for (const [geometryID, key] of opaque) {\r\n const fragID = group.keyFragments.get(key);\r\n if (fragID === undefined) {\r\n throw new Error(\"Malformed fragments group!\");\r\n }\r\n this.fragIDData.set(fragID, [group, geometryID, new Set()]);\r\n }\r\n for (const [geometryID, key] of transparent) {\r\n const fragID = group.keyFragments.get(key);\r\n if (fragID === undefined) {\r\n throw new Error(\"Malformed fragments group!\");\r\n }\r\n this.fragIDData.set(fragID, [group, Math.abs(geometryID), new Set()]);\r\n }\r\n this.culler.add(group.uuid, assets, geometries);\r\n this.models[group.uuid] = { assets, geometries };\r\n const instances = new Map();\r\n for (const asset of assets) {\r\n const id = asset.id;\r\n for (const { transformation, geometryID, color } of asset.geometries) {\r\n if (!instances.has(geometryID)) {\r\n instances.set(geometryID, []);\r\n }\r\n const current = instances.get(geometryID);\r\n if (!current) {\r\n throw new Error(\"Malformed instances\");\r\n }\r\n current.push({ id, transformation, color });\r\n }\r\n }\r\n this._geometryInstances[group.uuid] = instances;\r\n if (properties) {\r\n const ids = new Map();\r\n const types = new Map();\r\n for (const id in properties.ids) {\r\n const value = properties.ids[id];\r\n const idNum = parseInt(id, 10);\r\n ids.set(idNum, value);\r\n }\r\n for (const type in properties.types) {\r\n const value = properties.types[type];\r\n const idNum = parseInt(type, 10);\r\n types.set(idNum, value);\r\n }\r\n // TODO: Make this better when backend is ready\r\n const propertiesFileID = globalDataFileId.replace(\"-global\", \"-properties\");\r\n group.streamSettings = {\r\n baseUrl: this.url,\r\n baseFileName: propertiesFileID,\r\n ids,\r\n types,\r\n };\r\n const { indexesFile } = properties;\r\n const fetched = await fetch(this.url + indexesFile);\r\n const data = await fetched.arrayBuffer();\r\n const file = new File([new Blob([data])], indexesFile);\r\n const fileURL = URL.createObjectURL(file);\r\n const result = await unzip(fileURL);\r\n const first = Object.keys(result.entries)[0];\r\n const indices = await result.entries[first].json();\r\n const processor = this.components.tools.get(IfcPropertiesProcessor);\r\n const indexMap = processor.get();\r\n indexMap[group.uuid] = {};\r\n for (const index of indices) {\r\n const id = index.shift();\r\n indexMap[group.uuid][id] = new Set(index);\r\n }\r\n }\r\n this.culler.needsUpdate = true;\r\n }\r\n remove(modelID) {\r\n this._isDisposing = true;\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const group = fragments.groups.find((group) => group.uuid === modelID);\r\n if (group === undefined) {\r\n console.log(\"Group to delete not found.\");\r\n return;\r\n }\r\n delete this.models[modelID];\r\n delete this._geometryInstances[modelID];\r\n delete this._loadedFragments[modelID];\r\n const ids = group.keyFragments.values();\r\n for (const id of ids) {\r\n this.fragIDData.delete(id);\r\n }\r\n this.culler.remove(modelID);\r\n this._isDisposing = false;\r\n }\r\n setVisibility(visible, filter) {\r\n const modelGeomsAssets = new Map();\r\n for (const fragID in filter) {\r\n const found = this.fragIDData.get(fragID);\r\n if (found === undefined) {\r\n throw new Error(\"Geometry not found!\");\r\n }\r\n const [group, geometryID, hiddenItems] = found;\r\n const modelID = group.uuid;\r\n if (!modelGeomsAssets.has(modelID)) {\r\n modelGeomsAssets.set(modelID, new Map());\r\n }\r\n const geometriesAsset = modelGeomsAssets.get(modelID);\r\n const assets = filter[fragID];\r\n // Store the visible filter so that it's applied if this fragment\r\n // is loaded later\r\n for (const itemID of assets) {\r\n if (visible) {\r\n hiddenItems.delete(itemID);\r\n }\r\n else {\r\n hiddenItems.add(itemID);\r\n }\r\n }\r\n if (!geometriesAsset.get(geometryID)) {\r\n geometriesAsset.set(geometryID, new Set());\r\n }\r\n const assetGroup = geometriesAsset.get(geometryID);\r\n for (const asset of assets) {\r\n assetGroup.add(asset);\r\n }\r\n }\r\n for (const [modelID, geometriesAssets] of modelGeomsAssets) {\r\n // Set visibility of stream culler\r\n this.culler.setVisibility(visible, modelID, geometriesAssets);\r\n // set visibility of loaded fragments\r\n for (const [geometryID] of geometriesAssets) {\r\n const allFrags = this._loadedFragments[modelID];\r\n if (!allFrags)\r\n continue;\r\n const frags = allFrags[geometryID];\r\n if (!frags)\r\n continue;\r\n for (const frag of frags) {\r\n const ids = filter[frag.id];\r\n if (!ids)\r\n continue;\r\n frag.setVisibility(visible, ids);\r\n }\r\n }\r\n }\r\n this.culler.needsUpdate = true;\r\n }\r\n async clearCache() {\r\n await this._fileCache.delete();\r\n }\r\n get() { }\r\n update() { }\r\n // getMesh(): THREE.Mesh {\r\n // const box = this.culler.boxes.getMesh();\r\n // if (box) {\r\n // this.components.scene.get().add(box);\r\n // const boundingBox = new THREE.Box3().setFromObject(box);\r\n // // @ts-ignore\r\n // const bHelper = new THREE.Box3Helper(boundingBox, 0xff0000);\r\n // this.components.scene.get().add(bHelper);\r\n // }\r\n // return box;\r\n // }\r\n // getSphere() {\r\n // return this.culler.boxes.getSphere();\r\n // }\r\n async loadFoundGeometries(seen) {\r\n for (const modelID in seen) {\r\n if (this._isDisposing)\r\n return;\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const group = fragments.groups.find((group) => group.uuid === modelID);\r\n if (!group) {\r\n // throw new Error(\"Fragment group not found!\");\r\n // Might happen when disposing\r\n return;\r\n }\r\n const { geometries } = this.models[modelID];\r\n const files = new Map();\r\n const allIDs = new Set();\r\n for (const [priority, ids] of seen[modelID]) {\r\n for (const id of ids) {\r\n allIDs.add(id);\r\n const geometry = geometries[id];\r\n if (!geometry) {\r\n throw new Error(\"Geometry not found\");\r\n }\r\n if (geometry.geometryFile) {\r\n const file = geometry.geometryFile;\r\n const value = files.get(file) || 0;\r\n files.set(file, value + priority);\r\n }\r\n }\r\n }\r\n const sortedFiles = Array.from(files).sort((a, b) => b[1] - a[1]);\r\n for (const [file] of sortedFiles) {\r\n const url = this.url + file;\r\n // If this file is still in the ram, get it\r\n if (!this._ramCache.has(url)) {\r\n let bytes = new Uint8Array();\r\n // If this file is in the local cache, get it\r\n if (this.useCache) {\r\n const found = await this._fileCache.files.get(url);\r\n if (found) {\r\n bytes = found.file;\r\n }\r\n else {\r\n const fetched = await fetch(url);\r\n const buffer = await fetched.arrayBuffer();\r\n bytes = new Uint8Array(buffer);\r\n await this._fileCache.files.add({ file: bytes, id: url });\r\n }\r\n }\r\n else {\r\n const fetched = await fetch(url);\r\n const buffer = await fetched.arrayBuffer();\r\n bytes = new Uint8Array(buffer);\r\n }\r\n const data = this.serializer.import(bytes);\r\n this._ramCache.set(url, { data, time: performance.now() });\r\n }\r\n const result = this._ramCache.get(url);\r\n if (!result) {\r\n continue;\r\n }\r\n result.time = performance.now();\r\n const loaded = [];\r\n if (result) {\r\n for (const [geometryID, { position, index, normal }] of result.data) {\r\n if (this._isDisposing)\r\n return;\r\n if (!allIDs.has(geometryID))\r\n continue;\r\n if (!this._geometryInstances[modelID] ||\r\n !this._geometryInstances[modelID].has(geometryID)) {\r\n continue;\r\n }\r\n const geoms = this._geometryInstances[modelID];\r\n const instances = geoms.get(geometryID);\r\n if (!instances) {\r\n throw new Error(\"Instances not found!\");\r\n }\r\n const geom = new THREE.BufferGeometry();\r\n const posAttr = new THREE.BufferAttribute(position, 3);\r\n const norAttr = new THREE.BufferAttribute(normal, 3);\r\n geom.setAttribute(\"position\", posAttr);\r\n geom.setAttribute(\"normal\", norAttr);\r\n geom.setIndex(Array.from(index));\r\n // Separating opaque and transparent items is neccesary for Three.js\r\n const transp = [];\r\n const opaque = [];\r\n for (const instance of instances) {\r\n if (instance.color[3] === 1) {\r\n opaque.push(instance);\r\n }\r\n else {\r\n transp.push(instance);\r\n }\r\n }\r\n this.newFragment(group, geometryID, geom, transp, true, loaded);\r\n this.newFragment(group, geometryID, geom, opaque, false, loaded);\r\n }\r\n }\r\n if (loaded.length && !this._isDisposing) {\r\n await this.onFragmentsLoaded.trigger(loaded);\r\n }\r\n }\r\n const expiredIDs = new Set();\r\n const now = performance.now();\r\n for (const [id, { time }] of this._ramCache) {\r\n if (now - time > this.maxRamTime) {\r\n expiredIDs.add(id);\r\n }\r\n }\r\n for (const id of expiredIDs) {\r\n this._ramCache.delete(id);\r\n }\r\n // this._storageCache.close();\r\n }\r\n }\r\n async unloadLostGeometries(unseen) {\r\n if (this._isDisposing)\r\n return;\r\n const deletedFragments = [];\r\n const fragments = this.components.tools.get(FragmentManager);\r\n for (const modelID in unseen) {\r\n const group = fragments.groups.find((group) => group.uuid === modelID);\r\n if (!group) {\r\n throw new Error(\"Fragment group not found!\");\r\n }\r\n if (!this._loadedFragments[modelID])\r\n continue;\r\n const loadedFrags = this._loadedFragments[modelID];\r\n const geometries = unseen[modelID];\r\n for (const geometryID of geometries) {\r\n this.culler.removeFragment(group.uuid, geometryID);\r\n if (!loadedFrags[geometryID])\r\n continue;\r\n const frags = loadedFrags[geometryID];\r\n for (const frag of frags) {\r\n group.items.splice(group.items.indexOf(frag), 1);\r\n deletedFragments.push(frag);\r\n }\r\n delete loadedFrags[geometryID];\r\n }\r\n }\r\n if (deletedFragments.length) {\r\n await this.onFragmentsDeleted.trigger(deletedFragments);\r\n }\r\n for (const frag of deletedFragments) {\r\n delete fragments.list[frag.id];\r\n this.components.meshes.delete(frag.mesh);\r\n frag.mesh.material = [];\r\n frag.dispose(true);\r\n }\r\n }\r\n setMeshVisibility(filter, visible) {\r\n for (const modelID in filter) {\r\n for (const geometryID of filter[modelID]) {\r\n const geometries = this._loadedFragments[modelID];\r\n if (!geometries)\r\n continue;\r\n const frags = geometries[geometryID];\r\n if (!frags)\r\n continue;\r\n for (const frag of frags) {\r\n frag.mesh.visible = visible;\r\n }\r\n }\r\n }\r\n }\r\n newFragment(group, geometryID, geometry, instances, transparent, result) {\r\n if (instances.length === 0)\r\n return;\r\n if (this._isDisposing)\r\n return;\r\n const uuids = group.geometryIDs;\r\n const uuidMap = transparent ? uuids.transparent : uuids.opaque;\r\n const factor = transparent ? -1 : 1;\r\n const tranpsGeomID = geometryID * factor;\r\n const key = uuidMap.get(tranpsGeomID);\r\n if (key === undefined) {\r\n // throw new Error(\"Malformed fragment!\");\r\n return;\r\n }\r\n const fragID = group.keyFragments.get(key);\r\n if (fragID === undefined) {\r\n // throw new Error(\"Malformed fragment!\");\r\n return;\r\n }\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const fragmentAlreadyExists = fragments.list[fragID] !== undefined;\r\n if (fragmentAlreadyExists) {\r\n return;\r\n }\r\n const material = transparent ? this._baseMaterialT : this._baseMaterial;\r\n const fragment = new FRAG.Fragment(geometry, material, instances.length);\r\n fragment.id = fragID;\r\n fragment.mesh.uuid = fragID;\r\n fragment.group = group;\r\n group.add(fragment.mesh);\r\n group.items.push(fragment);\r\n fragments.list[fragment.id] = fragment;\r\n this.components.meshes.add(fragment.mesh);\r\n if (!this._loadedFragments[group.uuid]) {\r\n this._loadedFragments[group.uuid] = {};\r\n }\r\n const geoms = this._loadedFragments[group.uuid];\r\n if (!geoms[geometryID]) {\r\n geoms[geometryID] = [];\r\n }\r\n geoms[geometryID].push(fragment);\r\n const itemsMap = new Map();\r\n for (let i = 0; i < instances.length; i++) {\r\n const transform = new THREE.Matrix4();\r\n const col = new THREE.Color();\r\n const { id, transformation, color } = instances[i];\r\n transform.fromArray(transformation);\r\n const [r, g, b] = color;\r\n col.setRGB(r, g, b, \"srgb\");\r\n if (itemsMap.has(id)) {\r\n const item = itemsMap.get(id);\r\n if (!item)\r\n continue;\r\n item.transforms.push(transform);\r\n if (item.colors) {\r\n item.colors.push(col);\r\n }\r\n }\r\n else {\r\n itemsMap.set(id, { id, colors: [col], transforms: [transform] });\r\n }\r\n }\r\n const items = Array.from(itemsMap.values());\r\n fragment.add(items);\r\n const data = this.fragIDData.get(fragment.id);\r\n if (!data) {\r\n throw new Error(\"Fragment data not found!\");\r\n }\r\n const hiddenItems = data[2];\r\n if (hiddenItems.size) {\r\n fragment.setVisibility(false, hiddenItems);\r\n }\r\n this.culler.addFragment(group.uuid, geometryID, fragment);\r\n result.push(fragment);\r\n }\r\n setupCullerEvents() {\r\n this.culler.onViewUpdated.add(async ({ toLoad, toRemove, toShow, toHide }) => {\r\n await this.loadFoundGeometries(toLoad);\r\n await this.unloadLostGeometries(toRemove);\r\n this.setMeshVisibility(toShow, true);\r\n this.setMeshVisibility(toHide, false);\r\n });\r\n }\r\n}\r\nFragmentStreamLoader.uuid = \"22437e8d-9dbc-4b99-a04f-d2da280d50c8\";\r\nToolComponent.libraryUUIDs.add(FragmentStreamLoader.uuid);\r\n//# sourceMappingURL=fragment-stream-loader.js.map"],"names":["FragmentPropsStreamConverter","constructor","super","arguments","this","onPropertiesStreamed","onProgress","onIndicesStreamed","onDisposed","enabled","settings","_webIfc","get","dispose","reset","streamFromBuffer","data","before","performance","now","readIfcFile","streamAllProperties","cleanUp","console","log","streamFromCallBack","loadCallback","streamIfcFile","path","absolute","logLevel","wasm","SetWasmPath","Init","SetLogLevel","OpenModel","webIfc","OpenModelFromCallback","propertiesSize","allIfcEntities","Set","GetIfcEntityList","relationTypes","propertyIndices","Map","spatialStructure","type","add","nextProgress","typeCounter","has","isSpatial","ids","GetLineIDsWithType","idCount","size","count","i","j","nextProperty","property","GetLine","includes","getIndices","expressID","e","trigger","currentProgress","Math","max","round","compressedIndices","id","indices","push","propertyIndex","related","RelatedObjects","RelatedElements","relating","RelatingType","RelatingMaterial","RelatingStructure","RelatingPropertyDefinition","RelatingGroup","RelatingClassification","Array","isArray","undefined","value","relatingID","item","set","uuid","FragmentStreamLoader","url","_url","Error","components","onFragmentsDeleted","onFragmentsLoaded","models","serializer","maxRamTime","useCache","_ramCache","_fileCache","_isDisposing","_geometryInstances","_loadedFragments","fragIDData","_baseMaterial","_baseMaterialT","transparent","opacity","tools","culler","setupCullerEvents","clear","load","coordinate","properties","assets","geometries","globalDataFileId","groupUrl","groupData","fetch","groupArrayBuffer","arrayBuffer","groupBuffer","Uint8Array","fragments","group","opaque","geometryIDs","geometryID","key","fragID","keyFragments","abs","instances","asset","transformation","color","current","types","idNum","parseInt","propertiesFileID","replace","streamSettings","baseUrl","baseFileName","indexesFile","fetched","file","File","Blob","fileURL","URL","createObjectURL","result","first","Object","keys","entries","json","indexMap","index","shift","needsUpdate","remove","modelID","groups","find","values","delete","setVisibility","visible","filter","modelGeomsAssets","found","hiddenItems","geometriesAsset","itemID","assetGroup","geometriesAssets","allFrags","frags","frag","clearCache","update","loadFoundGeometries","seen","files","allIDs","priority","geometry","geometryFile","sortedFiles","from","sort","a","b","bytes","buffer","import","time","loaded","position","normal","geom","posAttr","norAttr","setAttribute","setIndex","transp","instance","newFragment","length","expiredIDs","unloadLostGeometries","unseen","deletedFragments","loadedFrags","removeFragment","items","splice","indexOf","list","meshes","mesh","material","setMeshVisibility","uuids","tranpsGeomID","fragment","geoms","itemsMap","transform","col","fromArray","r","g","setRGB","transforms","colors","addFragment","onViewUpdated","async","toLoad","toRemove","toShow","toHide","libraryUUIDs"],"sourceRoot":""}