{"version":3,"file":"vendor.openbim-components-499d762e.ffbb64b9e2c2452c.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/navigation/ShadowDropper/index.js","webpack://client-app/./node_modules/openbim-components/src/navigation/ViewpointsManager/index.js","webpack://client-app/./node_modules/openbim-components/src/services/CloudStorage/index.js"],"sourcesContent":["import * as THREE from \"three\";\r\nimport { HorizontalBlurShader } from \"three/examples/jsm/shaders/HorizontalBlurShader\";\r\nimport { VerticalBlurShader } from \"three/examples/jsm/shaders/VerticalBlurShader\";\r\nimport { Component, Event } from \"../../base-types\";\r\nimport { Disposer, ToolComponent } from \"../../core\";\r\nexport class ShadowDropper 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 // Controls how far away the shadow is computed\r\n this.cameraHeight = 10;\r\n this.darkness = 1.2;\r\n this.opacity = 1;\r\n this.resolution = 512;\r\n this.amount = 3.5;\r\n this.planeColor = 0xffffff;\r\n this.shadowOffset = 0;\r\n this.shadowExtraScaleFactor = 1.5;\r\n this.shadows = {};\r\n this.tempMaterial = new THREE.MeshBasicMaterial({ visible: false });\r\n this.depthMaterial = new THREE.MeshDepthMaterial();\r\n this.components.tools.add(ShadowDropper.uuid, this);\r\n this.initializeDepthMaterial();\r\n }\r\n /** {@link Component.get} */\r\n get() {\r\n return this.shadows;\r\n }\r\n /** {@link Disposable.dispose} */\r\n async dispose() {\r\n for (const id in this.shadows) {\r\n this.deleteShadow(id);\r\n }\r\n this.tempMaterial.dispose();\r\n this.depthMaterial.dispose();\r\n this.components = null;\r\n await this.onDisposed.trigger(ShadowDropper.uuid);\r\n this.onDisposed.reset();\r\n }\r\n /**\r\n * Creates a blurred dropped shadow of the given mesh.\r\n *\r\n * @param model - the mesh whose shadow to generate.\r\n * @param id - the name of this shadow.\r\n */\r\n renderShadow(model, id) {\r\n if (this.shadows[id]) {\r\n throw new Error(`There is already a shadow with ID ${id}`);\r\n }\r\n const { size, center, min } = this.getSizeCenterMin(model);\r\n const shadow = this.createShadow(id, size);\r\n this.initializeShadow(shadow, center, min);\r\n this.createPlanes(shadow, size);\r\n this.bakeShadow(model, shadow);\r\n return shadow.root;\r\n }\r\n /**\r\n * Deletes the specified shadow (if it exists).\r\n *\r\n * @param id - the name of this shadow.\r\n */\r\n deleteShadow(id) {\r\n const disposer = this.components.tools.get(Disposer);\r\n const shadow = this.shadows[id];\r\n delete this.shadows[id];\r\n if (!shadow)\r\n throw new Error(`No shadow with ID ${id} was found.`);\r\n disposer.destroy(shadow.root);\r\n disposer.destroy(shadow.blurPlane);\r\n shadow.rt.dispose();\r\n shadow.rtBlur.dispose();\r\n }\r\n createPlanes(currentShadow, size) {\r\n const planeGeometry = new THREE.PlaneGeometry(size.x, size.z).rotateX(Math.PI / 2);\r\n this.createBasePlane(currentShadow, planeGeometry);\r\n ShadowDropper.createBlurPlane(currentShadow, planeGeometry);\r\n // this.createGroundColorPlane(currentShadow, planeGeometry);\r\n }\r\n initializeShadow(shadow, center, min) {\r\n this.initializeRoot(shadow, center, min);\r\n ShadowDropper.initializeRenderTargets(shadow);\r\n ShadowDropper.initializeCamera(shadow);\r\n }\r\n bakeShadow(meshes, shadow) {\r\n const scene = this.components.scene.get();\r\n const areModelsInScene = meshes.map((mesh) => !!mesh.parent);\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (!areModelsInScene[i]) {\r\n scene.add(meshes[i]);\r\n }\r\n }\r\n const children = scene.children.filter((obj) => !meshes.includes(obj) && obj !== shadow.root);\r\n for (let i = children.length - 1; i >= 0; i--) {\r\n scene.remove(children[i]);\r\n }\r\n // remove the background\r\n const initialBackground = scene.background;\r\n scene.background = null;\r\n // force the depthMaterial to everything\r\n scene.overrideMaterial = this.depthMaterial;\r\n // Make meshes visible if they were invisible\r\n const previousVisibleAttributes = [];\r\n for (const mesh of meshes) {\r\n previousVisibleAttributes.push(mesh.visible);\r\n mesh.visible = true;\r\n }\r\n // render to the render target to get the depths\r\n const renderer = this.components.renderer.get();\r\n renderer.setRenderTarget(shadow.rt);\r\n renderer.render(scene, shadow.camera);\r\n // and reset the override material\r\n scene.overrideMaterial = null;\r\n this.blurShadow(shadow, this.amount);\r\n // a second pass to reduce the artifacts\r\n // (0.4 is the minimum blur amount so that the artifacts are gone)\r\n this.blurShadow(shadow, this.amount * 0.4);\r\n // reset and render the normal scene\r\n renderer.setRenderTarget(null);\r\n scene.background = initialBackground;\r\n // reset visibility\r\n for (let i = 0; i < meshes.length; i++) {\r\n meshes[i].visible = previousVisibleAttributes[i];\r\n }\r\n for (let i = children.length - 1; i >= 0; i--) {\r\n scene.add(children[i]);\r\n }\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (!areModelsInScene[i]) {\r\n scene.remove(meshes[i]);\r\n }\r\n }\r\n }\r\n static initializeCamera(shadow) {\r\n shadow.camera.rotation.x = Math.PI / 2; // get the camera to look up\r\n shadow.root.add(shadow.camera);\r\n }\r\n static initializeRenderTargets(shadow) {\r\n shadow.rt.texture.generateMipmaps = false;\r\n shadow.rtBlur.texture.generateMipmaps = false;\r\n }\r\n initializeRoot(shadow, center, min) {\r\n const scene = this.components.scene.get();\r\n shadow.root.position.set(center.x, min.y - this.shadowOffset, center.z);\r\n scene.add(shadow.root);\r\n }\r\n // Plane simulating the \"ground\". This is not needed for BIM models generally\r\n // private createGroundColorPlane(_shadow: Shadow, planeGeometry: BufferGeometry) {\r\n // const fillPlaneMaterial = new MeshBasicMaterial({\r\n // color: this.planeColor,\r\n // opacity: this.opacity,\r\n // transparent: true,\r\n // depthWrite: false,\r\n // clippingPlanes: this.context.getClippingPlanes()\r\n // });\r\n // const fillPlane = new Mesh(planeGeometry, fillPlaneMaterial);\r\n // fillPlane.rotateX(Math.PI);\r\n // fillPlane.renderOrder = -1;\r\n // shadow.root.add(fillPlane);\r\n // }\r\n createBasePlane(shadow, planeGeometry) {\r\n const planeMaterial = this.createPlaneMaterial(shadow);\r\n const plane = new THREE.Mesh(planeGeometry, planeMaterial);\r\n // make sure it's rendered after the fillPlane\r\n plane.renderOrder = 2;\r\n shadow.root.add(plane);\r\n // the y from the texture is flipped!\r\n plane.scale.y = -1;\r\n }\r\n static createBlurPlane(shadow, planeGeometry) {\r\n shadow.blurPlane.geometry = planeGeometry;\r\n shadow.blurPlane.visible = false;\r\n shadow.root.add(shadow.blurPlane);\r\n }\r\n createPlaneMaterial(shadow) {\r\n const renderer = this.components.renderer;\r\n return new THREE.MeshBasicMaterial({\r\n map: shadow.rt.texture,\r\n opacity: this.opacity,\r\n transparent: true,\r\n depthWrite: false,\r\n clippingPlanes: renderer.clippingPlanes,\r\n });\r\n }\r\n // like MeshDepthMaterial, but goes from black to transparent\r\n initializeDepthMaterial() {\r\n this.depthMaterial.depthTest = false;\r\n this.depthMaterial.depthWrite = false;\r\n const oldShader = \"gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\";\r\n const newShader = \"gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * darkness );\";\r\n this.depthMaterial.userData.darkness = { value: this.darkness };\r\n this.depthMaterial.onBeforeCompile = (shader) => {\r\n shader.uniforms.darkness = this.depthMaterial.userData.darkness;\r\n shader.fragmentShader = /* glsl */ `\r\n\t\t\t\t\t\tuniform float darkness;\r\n\t\t\t\t\t\t${shader.fragmentShader.replace(oldShader, newShader)}\r\n\t\t\t\t\t`;\r\n };\r\n }\r\n createShadow(id, size) {\r\n this.shadows[id] = {\r\n root: new THREE.Group(),\r\n rt: new THREE.WebGLRenderTarget(this.resolution, this.resolution),\r\n rtBlur: new THREE.WebGLRenderTarget(this.resolution, this.resolution),\r\n blurPlane: new THREE.Mesh(),\r\n camera: this.createCamera(size),\r\n };\r\n return this.shadows[id];\r\n }\r\n createCamera(size) {\r\n return new THREE.OrthographicCamera(-size.x / 2, size.x / 2, size.z / 2, -size.z / 2, 0, this.cameraHeight);\r\n }\r\n getSizeCenterMin(meshes) {\r\n const parent = meshes[0].parent;\r\n const group = new THREE.Group();\r\n group.children = meshes;\r\n const boundingBox = new THREE.Box3().setFromObject(group);\r\n parent?.add(...meshes);\r\n const size = new THREE.Vector3();\r\n boundingBox.getSize(size);\r\n size.x *= this.shadowExtraScaleFactor;\r\n size.z *= this.shadowExtraScaleFactor;\r\n const center = new THREE.Vector3();\r\n boundingBox.getCenter(center);\r\n const min = boundingBox.min;\r\n return { size, center, min };\r\n }\r\n blurShadow(shadow, amount) {\r\n const horizontalBlurMaterial = new THREE.ShaderMaterial(HorizontalBlurShader);\r\n horizontalBlurMaterial.depthTest = false;\r\n const verticalBlurMaterial = new THREE.ShaderMaterial(VerticalBlurShader);\r\n verticalBlurMaterial.depthTest = false;\r\n shadow.blurPlane.visible = true;\r\n // blur horizontally and draw in the renderTargetBlur\r\n shadow.blurPlane.material = horizontalBlurMaterial;\r\n // @ts-ignore\r\n shadow.blurPlane.material.uniforms.tDiffuse.value = shadow.rt.texture;\r\n horizontalBlurMaterial.uniforms.h.value = (amount * 1) / 256;\r\n const renderer = this.components.renderer.get();\r\n renderer.setRenderTarget(shadow.rtBlur);\r\n renderer.render(shadow.blurPlane, shadow.camera);\r\n // blur vertically and draw in the main renderTarget\r\n shadow.blurPlane.material = verticalBlurMaterial;\r\n // @ts-ignore\r\n shadow.blurPlane.material.uniforms.tDiffuse.value = shadow.rtBlur.texture;\r\n verticalBlurMaterial.uniforms.v.value = (amount * 1) / 256;\r\n renderer.setRenderTarget(shadow.rt);\r\n renderer.render(shadow.blurPlane, shadow.camera);\r\n shadow.blurPlane.visible = false;\r\n }\r\n}\r\nShadowDropper.uuid = \"f833a09a-a3ab-4c58-b03e-da5298c7a1b6\";\r\nToolComponent.libraryUUIDs.add(ShadowDropper.uuid);\r\n//# sourceMappingURL=index.js.map","import { Vector3 } from \"three\";\r\nimport { generateUUID } from \"three/src/math/MathUtils\";\r\nimport { LengthMeasurement, SimpleDimensionLine } from \"../../measurement\";\r\nimport { Component, Event, UIElement, } from \"../../base-types\";\r\nimport { Button, SimpleUICard, FloatingWindow } from \"../../ui\";\r\nimport { FragmentHighlighter } from \"../../fragments\";\r\nexport class ViewpointsManager extends Component {\r\n constructor(components) {\r\n super(components);\r\n this.name = \"ViewpointsManager\";\r\n this.uiElement = new UIElement();\r\n this.enabled = true;\r\n this.list = [];\r\n this.selectionHighlighter = \"\";\r\n this.onViewpointViewed = new Event();\r\n this.onViewpointAdded = new Event();\r\n this.components = components;\r\n }\r\n initialize(config) {\r\n this.selectionHighlighter = config.selectionHighlighter;\r\n // this._fragmentGrouper = config.fragmentGrouper;\r\n // this._fragmentManager = config.fragmentManager;\r\n this._drawManager = config.drawManager;\r\n if (this.components.uiEnabled) {\r\n this.setUI();\r\n }\r\n }\r\n setUI() {\r\n const viewerContainer = this.components.renderer.get().domElement\r\n .parentElement;\r\n const window = new FloatingWindow(this.components);\r\n window.title = \"Viewpoints\";\r\n viewerContainer.append(window.get());\r\n window.visible = false;\r\n const main = new Button(this.components, {\r\n materialIconName: \"photo_camera\",\r\n });\r\n const newButton = new Button(this.components, {\r\n materialIconName: \"add\",\r\n name: \"New viewpoint\",\r\n });\r\n const listButton = new Button(this.components, {\r\n materialIconName: \"format_list_bulleted\",\r\n name: \"Viewpoints list\",\r\n });\r\n listButton.onClick.add(() => {\r\n window.visible = !window.visible;\r\n });\r\n main.addChild(listButton, newButton);\r\n this.uiElement.set({ main, newButton, window });\r\n }\r\n get() {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n add(data) {\r\n const { title, description } = data;\r\n if (!title) {\r\n return undefined;\r\n }\r\n const guid = generateUUID().toLowerCase();\r\n // #region Store dimensions\r\n const dimensions = [];\r\n const dimensionsComp = this.components.tools.get(LengthMeasurement);\r\n const allDimensions = dimensionsComp.get();\r\n for (const dimension of allDimensions) {\r\n dimensions.push({ start: dimension.startPoint, end: dimension.endPoint });\r\n }\r\n // #endregion\r\n // #redgion Store selection\r\n const highlighter = this.components.tools.get(FragmentHighlighter);\r\n const selection = highlighter.selection[this.selectionHighlighter];\r\n // #endregion\r\n // #region Store filter (WIP)\r\n // const filter = {entities: \"IFCBEAM\", storeys: \"N07\"}\r\n // #endregion\r\n // #region Store camera position and target\r\n const camera = this.components.camera;\r\n const controls = camera.controls;\r\n const target = new Vector3();\r\n const position = new Vector3();\r\n controls.getTarget(target);\r\n controls.getPosition(position);\r\n const projection = camera.getProjection();\r\n // #endregion\r\n // #region Store annotations\r\n const annotations = this._drawManager?.saveDrawing(guid);\r\n // #endregion\r\n const viewpoint = {\r\n guid,\r\n title,\r\n target,\r\n position,\r\n selection,\r\n // filter,\r\n description,\r\n dimensions,\r\n annotations,\r\n projection,\r\n };\r\n // #region UI representation\r\n const card = new SimpleUICard(this.components, viewpoint.guid);\r\n card.title = title;\r\n card.description = description;\r\n card.domElement.onclick = () => this.view(viewpoint.guid);\r\n this.uiElement.get(\"window\").addChild(card);\r\n // #endregion\r\n this.list.push(viewpoint);\r\n this.onViewpointAdded.trigger(guid);\r\n return viewpoint;\r\n }\r\n retrieve(guid) {\r\n return this.list.find((v) => v.guid === guid);\r\n }\r\n async view(guid) {\r\n const viewpoint = this.retrieve(guid);\r\n if (!viewpoint) {\r\n return;\r\n }\r\n // #region Recover annotations\r\n if (this._drawManager && viewpoint.annotations) {\r\n this._drawManager.viewport.clear();\r\n this._drawManager.enabled = true;\r\n this._drawManager.viewport.get().append(viewpoint.annotations);\r\n }\r\n // #endregion\r\n // #region Recover dimensions\r\n const dimensionsComponent = this.components.tools.get(LengthMeasurement);\r\n viewpoint.dimensions.forEach((data) => {\r\n const dimension = new SimpleDimensionLine(this.components, {\r\n start: data.start,\r\n end: data.end,\r\n // @ts-ignore\r\n lineMaterial: dimensionsComponent._lineMaterial,\r\n // @ts-ignore\r\n endpoint: dimensionsComponent._endpointMesh,\r\n });\r\n dimension.createBoundingBox();\r\n // @ts-ignore\r\n dimensionsComponent._dimensions.push(dimension);\r\n });\r\n // #endregion\r\n // #region Recover filtered elements\r\n // if (viewpoint.filter) {\r\n // const filterData = fragments.groups.get(viewpoint.filter)\r\n // for (const fragmentID in fragments.list) {\r\n // const fragment = fragments.list[fragmentID]\r\n // fragment.setVisibility(fragment.items, false)\r\n // }\r\n // for (const fragmentID in filterData) {\r\n // const ids = filterData[fragmentID]\r\n // fragments.list[fragmentID]?.setVisibility(ids, true)\r\n // }\r\n // }\r\n // #endregion\r\n // Select elements in the viewpoint\r\n const selection = {};\r\n for (const fragmentID in viewpoint.selection) {\r\n selection[fragmentID] = viewpoint.selection[fragmentID];\r\n }\r\n const highlighter = this.components.tools.get(FragmentHighlighter);\r\n await highlighter.highlightByID(this.selectionHighlighter, selection, true);\r\n // #region Recover camera position & target\r\n const camera = this.components.camera;\r\n const controls = camera.controls;\r\n controls.setLookAt(viewpoint.position.x, viewpoint.position.y, viewpoint.position.z, viewpoint.target.x, viewpoint.target.y, viewpoint.target.z, true);\r\n await this.onViewpointViewed.trigger(guid);\r\n // #endregion\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map","import { unzip } from \"unzipit\";\r\nimport { Component, Event } from \"../../base-types\";\r\nimport { FragmentManager } from \"../../fragments\";\r\n/**\r\n * An object to easily use the services of That Open Platform.\r\n */\r\nexport class CloudStorage extends Component {\r\n constructor(components) {\r\n super(components);\r\n this.tools = [];\r\n /** {@link Component.name} */\r\n this.name = \"CloudProcessor\";\r\n /** {@link Component.enabled} */\r\n this.enabled = true;\r\n this.modelProcessed = new Event();\r\n this.checkInterval = 5000;\r\n this._models = [];\r\n this._urls = {\r\n base: \"https://dev.api.dev.platform.thatopen.com/v1/models/\",\r\n tokenParam: \"?accessToken=\",\r\n };\r\n this.components.tools.add(CloudStorage.uuid, this);\r\n }\r\n /**\r\n * Retrieves a tool component by its name.\r\n */\r\n get() {\r\n return this._models;\r\n }\r\n /**\r\n * The authentication token generated in\r\n * [That Open Platform](https://platform.thatopen.com/app)\r\n */\r\n get token() {\r\n if (!this._token) {\r\n throw new Error(\"Auth token has not been initialized!\");\r\n }\r\n return this._token;\r\n }\r\n /**\r\n * The authentication token generated in\r\n * [That Open Platform](https://platform.thatopen.com/app)\r\n */\r\n set token(value) {\r\n this._token = value;\r\n }\r\n async update() {\r\n const { base, tokenParam } = this._urls;\r\n const url = `${base}${tokenParam}${this.token}`;\r\n const result = await fetch(url);\r\n const parsed = await result.json();\r\n this._models = parsed.models;\r\n }\r\n async upload(fileUrl) {\r\n const response = await this.createModel();\r\n const uploadUrl = response.uploadUrl;\r\n const read = await fetch(fileUrl);\r\n const body = await read.arrayBuffer();\r\n await fetch(uploadUrl, { method: \"PUT\", body });\r\n this.setupModelProcessEvent(response.model._id);\r\n }\r\n async delete(modelID) {\r\n const { base, tokenParam } = this._urls;\r\n const url = `${base}/${modelID}${tokenParam}${this.token}`;\r\n const result = await fetch(url, { method: \"DELETE\" });\r\n return result.json();\r\n }\r\n async getModel(modelID) {\r\n const { base, tokenParam } = this._urls;\r\n const modelUrl = `${base}/${modelID}${tokenParam}${this.token}`;\r\n const modelResponse = await fetch(modelUrl);\r\n return modelResponse.json();\r\n }\r\n // TODO: This just work for local properties. Implement it for streamed props\r\n setupModelProcessEvent(modelID) {\r\n const interval = setInterval(async () => {\r\n const response = await this.getModel(modelID);\r\n if (response.model.status === \"PROCESSED\") {\r\n const { entries } = await unzip(response.downloadUrl);\r\n const arrayBuffer = await entries[\"model.frag\"].arrayBuffer();\r\n const buffer = new Uint8Array(arrayBuffer);\r\n const fragments = this.components.tools.get(FragmentManager);\r\n const model = await fragments.load(buffer);\r\n const props = await entries[\"properties.json\"].json();\r\n model.setLocalProperties(props);\r\n await this.modelProcessed.trigger(model);\r\n clearInterval(interval);\r\n }\r\n }, this.checkInterval);\r\n }\r\n async createModel() {\r\n const { base, tokenParam } = this._urls;\r\n const url = `${base}${tokenParam}${this.token}`;\r\n const result = await fetch(url, { method: \"POST\" });\r\n return result.json();\r\n }\r\n}\r\nCloudStorage.uuid = \"6fe6c739-d518-47b8-8057-a22a6c96e722\";\r\n//# sourceMappingURL=index.js.map"],"names":["ShadowDropper","constructor","components","super","this","onDisposed","enabled","cameraHeight","darkness","opacity","resolution","amount","planeColor","shadowOffset","shadowExtraScaleFactor","shadows","tempMaterial","visible","depthMaterial","tools","add","uuid","initializeDepthMaterial","get","dispose","id","deleteShadow","trigger","reset","renderShadow","model","Error","size","center","min","getSizeCenterMin","shadow","createShadow","initializeShadow","createPlanes","bakeShadow","root","disposer","destroy","blurPlane","rt","rtBlur","currentShadow","planeGeometry","x","z","rotateX","Math","PI","createBasePlane","createBlurPlane","initializeRoot","initializeRenderTargets","initializeCamera","meshes","scene","areModelsInScene","map","mesh","parent","i","length","children","filter","obj","includes","remove","initialBackground","background","overrideMaterial","previousVisibleAttributes","push","renderer","setRenderTarget","render","camera","blurShadow","rotation","texture","generateMipmaps","position","set","y","planeMaterial","createPlaneMaterial","plane","renderOrder","scale","geometry","transparent","depthWrite","clippingPlanes","depthTest","userData","value","onBeforeCompile","shader","uniforms","fragmentShader","replace","createCamera","group","boundingBox","setFromObject","getSize","getCenter","horizontalBlurMaterial","HorizontalBlurShader","verticalBlurMaterial","VerticalBlurShader","material","tDiffuse","h","v","libraryUUIDs","CloudStorage","name","modelProcessed","checkInterval","_models","_urls","base","tokenParam","token","_token","update","url","result","fetch","parsed","json","models","upload","fileUrl","response","createModel","uploadUrl","read","body","arrayBuffer","method","setupModelProcessEvent","_id","modelID","getModel","modelUrl","interval","setInterval","async","status","entries","downloadUrl","buffer","Uint8Array","fragments","load","props","setLocalProperties","clearInterval"],"sourceRoot":""}