@realsee/dnalogel 4.0.0-webgpu.11 → 4.0.0-webgpu.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +10 -0
- package/dist/floorplan.js +1 -1
- package/dist/index.js +18 -18
- package/dist/internal/{BasePlugin-YE4dMDWJ.js → BasePlugin-CPJ1ahrJ.js} +2 -2
- package/dist/internal/{BasePlugin-YE4dMDWJ.js.map → BasePlugin-CPJ1ahrJ.js.map} +1 -1
- package/dist/internal/BasePluginWithData-Uq1cY5sC.js +7 -0
- package/dist/internal/{BasePluginWithData-BYGIbLnT.js.map → BasePluginWithData-Uq1cY5sC.js.map} +1 -1
- package/dist/internal/{Controller-DiO9Qxpi.js → Controller-B9xMQukV.js} +2 -2
- package/dist/internal/{Controller-DiO9Qxpi.js.map → Controller-B9xMQukV.js.map} +1 -1
- package/dist/internal/{FiveDomEvents-BUBLFzti.js → FiveDomEvents-DFG9hd51.js} +2 -2
- package/dist/internal/{FiveDomEvents-BUBLFzti.js.map → FiveDomEvents-DFG9hd51.js.map} +1 -1
- package/dist/internal/{PointHelper-qhcK4big.js → PointHelper-Bgbt0S7b.js} +2 -2
- package/dist/internal/{PointHelper-qhcK4big.js.map → PointHelper-Bgbt0S7b.js.map} +1 -1
- package/dist/internal/{Polygon-BXajWnCj.js → Polygon-BJfVfdCw.js} +2 -2
- package/dist/internal/{Polygon-BXajWnCj.js.map → Polygon-BJfVfdCw.js.map} +1 -1
- package/dist/internal/{Prism-BwjQPOyR.js → Prism-DxArNvOM.js} +3 -3
- package/dist/internal/{Prism-BwjQPOyR.js.map → Prism-DxArNvOM.js.map} +1 -1
- package/dist/internal/{Rectangle-Cc8wyIMJ.js → Rectangle-Dyjp88lU.js} +7 -7
- package/dist/internal/{Rectangle-Cc8wyIMJ.js.map → Rectangle-Dyjp88lU.js.map} +1 -1
- package/dist/internal/{Work-CxG2jTr2.js → Work-nlQCCreU.js} +4 -4
- package/dist/internal/{Work-CxG2jTr2.js.map → Work-nlQCCreU.js.map} +1 -1
- package/dist/internal/{area-maker-BegnIza6.js → area-maker-DwPBgIH_.js} +2 -2
- package/dist/internal/{area-maker-BegnIza6.js.map → area-maker-DwPBgIH_.js.map} +1 -1
- package/dist/internal/{controller-D8MTSGfb.js → controller-B3u-PyQb.js} +6 -6
- package/dist/internal/{controller-D8MTSGfb.js.map → controller-B3u-PyQb.js.map} +1 -1
- package/dist/internal/{cruise-Ej9TGc5U.js → cruise-XCsWQQtZ.js} +2 -2
- package/dist/internal/{cruise-Ej9TGc5U.js.map → cruise-XCsWQQtZ.js.map} +1 -1
- package/dist/internal/{current-pano-image-CQVXZtOG.js → current-pano-image-Yt0ptdOO.js} +2 -2
- package/dist/internal/{current-pano-image-CQVXZtOG.js.map → current-pano-image-Yt0ptdOO.js.map} +1 -1
- package/dist/internal/{floorplan-BMkAM7lm.js → floorplan-Bnk3Jg8m.js} +2 -2
- package/dist/internal/{floorplan-BMkAM7lm.js.map → floorplan-Bnk3Jg8m.js.map} +1 -1
- package/dist/internal/{generatePolygonGeometry-BOnzdCaG.js → generatePolygonGeometry-DEr9kX3D.js} +3 -3
- package/dist/internal/generatePolygonGeometry-DEr9kX3D.js.map +1 -0
- package/dist/internal/{measure-Comf7Ysy.js → measure-CTsB8Z-c.js} +50 -45
- package/dist/internal/measure-CTsB8Z-c.js.map +1 -0
- package/dist/internal/{model-maker-CZUFGUpx.js → model-maker-tbF87kJz.js} +5 -5
- package/dist/internal/{model-maker-CZUFGUpx.js.map → model-maker-tbF87kJz.js.map} +1 -1
- package/dist/internal/object3d-helper-BgYvVhp2.js +7 -0
- package/dist/internal/{object3d-helper-CcOhIpo0.js.map → object3d-helper-BgYvVhp2.js.map} +1 -1
- package/dist/internal/{pano-compass-BaYsdtsu.js → pano-compass-BwxmzCPI.js} +2 -2
- package/dist/internal/{pano-compass-BaYsdtsu.js.map → pano-compass-BwxmzCPI.js.map} +1 -1
- package/dist/internal/{pano-door-label-BkWTtRu_.js → pano-door-label-Bwvaf5xx.js} +2 -2
- package/dist/internal/{pano-door-label-BkWTtRu_.js.map → pano-door-label-Bwvaf5xx.js.map} +1 -1
- package/dist/internal/{pano-measure-Dj-NC0va.js → pano-measure-BEUknZ_O.js} +4 -4
- package/dist/internal/{pano-measure-Dj-NC0va.js.map → pano-measure-BEUknZ_O.js.map} +1 -1
- package/dist/internal/{pano-tag-oy6Uwfvh.js → pano-tag-CaRrmqmS.js} +2 -2
- package/dist/internal/{pano-tag-oy6Uwfvh.js.map → pano-tag-CaRrmqmS.js.map} +1 -1
- package/dist/internal/{pano-video-D79p2k_c.js → pano-video-DLjuDeQV.js} +2 -2
- package/dist/internal/{pano-video-D79p2k_c.js.map → pano-video-DLjuDeQV.js.map} +1 -1
- package/dist/internal/{pipeline-koQyF_J8.js → pipeline-Dg9R3h54.js} +2 -2
- package/dist/internal/{pipeline-koQyF_J8.js.map → pipeline-Dg9R3h54.js.map} +1 -1
- package/dist/internal/{sculpt-Ceg49sX_.js → sculpt-CMFBenui.js} +6 -6
- package/dist/internal/{sculpt-Ceg49sX_.js.map → sculpt-CMFBenui.js.map} +1 -1
- package/dist/plugins/area-maker.js +1 -1
- package/dist/plugins/cruise.js +2 -2
- package/dist/plugins/current-pano-image.js +1 -1
- package/dist/plugins/guide-line.js +1 -1
- package/dist/plugins/measure.d.ts +1 -1
- package/dist/plugins/measure.js +1 -1
- package/dist/plugins/model-maker.js +1 -1
- package/dist/plugins/object3d-helper.js +2 -2
- package/dist/plugins/pano-compass.js +1 -1
- package/dist/plugins/pano-door-label.js +1 -1
- package/dist/plugins/pano-measure.js +1 -1
- package/dist/plugins/pano-tag.js +2 -2
- package/dist/plugins/pano-video.js +1 -1
- package/dist/plugins/pipeline.js +1 -1
- package/dist/plugins/sculpt.js +5 -5
- package/dist/types/MeasurePlugin/Controller.d.ts +12 -0
- package/dist/types/MeasurePlugin/index.d.ts +1 -1
- package/dist/types/public/plugins/measure.d.ts +1 -1
- package/dist/utils.js +3 -3
- package/package.json +1 -1
- package/dist/internal/BasePluginWithData-BYGIbLnT.js +0 -7
- package/dist/internal/generatePolygonGeometry-BOnzdCaG.js.map +0 -1
- package/dist/internal/measure-Comf7Ysy.js.map +0 -1
- package/dist/internal/object3d-helper-CcOhIpo0.js +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pano-compass-BaYsdtsu.js","names":["BasePlugin.Controller","loadTexture","ENTRY_DOOR_DEFAULT_IMAGE","PANO_COMPASS_DEFAULT_IMAGE","tweenProgress","CSS3DRenderPlugin","Controller","THREE","roomInfoIcon","getRoomInfoInstance","infoDom","iconDom","textDom","room","defaultBaseOptions","PanoCompassController","five","config","options","prevState","state","nextData","data","serverData","northRad","entrance","compassImageUrl","compassTexture","compassGeometry","compassMaterial","compassMesh","url","texture","geometry","material","mesh","entryDoorImageUrl","entryDoorTexture","entryDoorGeometry","entryDoorMaterial","entryDoorMesh","points","panoIndex","standingPosition","progress","panoToEntryDoorVector","compassEntryDoorPosition","longitude","latitude","mode","prevMode","Five","PanoCompassPlugin"],"sources":["../../src/PanoCompassPlugin/Assets/roomInfoIcon.ts","../../src/PanoCompassPlugin/getRoomInfoInstance.ts","../../src/PanoCompassPlugin/Controller.ts","../../src/PanoCompassPlugin/index.ts"],"sourcesContent":["export const roomInfoIcon =\n 'data:image/png;base64,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'\n","import type { FloorplanServerRoomItem } from '../floorplan/typings/floorplanServerData'\nimport { roomInfoIcon } from './Assets/roomInfoIcon'\n\nexport function getRoomInfoInstance() {\n const infoDom = document.createElement('div')\n const iconDom = document.createElement('i')\n const textDom = document.createElement('span')\n infoDom.appendChild(iconDom)\n infoDom.appendChild(textDom)\n // infoDom style\n infoDom.style.position = 'relative'\n infoDom.style.width = '100%'\n infoDom.style.display = 'flex'\n infoDom.style.flexDirection = 'column'\n infoDom.style.alignItems = 'center'\n infoDom.style.marginTop = `${150 / 16}rem`\n infoDom.style.opacity = '0'\n infoDom.style.transition = 'opacity 1000ms linear'\n // iconDom style\n iconDom.style.display = 'block'\n iconDom.style.width = `${134 / 16}rem`\n iconDom.style.height = `${22 / 16}rem`\n iconDom.style.backgroundSize = '100%'\n iconDom.style.backgroundRepeat = 'no-repeat'\n iconDom.style.backgroundImage = `url(${roomInfoIcon})`\n textDom.style.marginTop = `${10 / 16}rem`\n // textDom style\n textDom.style.fontSize = `${16 / 16}rem`\n textDom.style.color = '#fff'\n textDom.style.opacity = '0.7'\n textDom.style.textShadow = '0 2px 16px rgb(22 34 83 / 24%)'\n textDom.style.fontWeight = 'bold'\n\n return {\n appendTo(element: Element) {\n element.appendChild(infoDom)\n },\n dispose() {\n infoDom.remove()\n },\n setRoom(room: FloorplanServerRoomItem) {\n textDom.innerHTML = room.name + ' ' + Math.floor(room.size / 1000000) + '㎡'\n },\n show() {\n infoDom.style.opacity = '1'\n },\n hide() {\n infoDom.style.opacity = '0'\n }\n }\n}\n","import * as THREE from 'three/webgpu'\nimport type { Mode, Pose } from '@realsee/five-webgpu'\nimport type { BaseOptions } from '../base/BasePlugin'\nimport type { CSS3DRenderPluginExportType } from '../CSS3DRenderPlugin'\nimport { Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { getRoomInfoInstance } from './getRoomInfoInstance'\nimport { loadTexture } from '../shared-utils/three/loadTexture'\nimport CSS3DRenderPlugin from '../CSS3DRenderPlugin'\nimport type { BetterTween } from '../shared-utils/animationFrame/BetterTween'\nimport { tweenProgress } from '../shared-utils/animationFrame/BetterTween'\n\nimport type { EventMap, PanoCompassPluginData, PanoCompassPluginParameterType, PluginData, PluginServerData, State } from './typings'\nimport { ENTRY_DOOR_DEFAULT_IMAGE, PANO_COMPASS_DEFAULT_IMAGE } from '../shared-utils/url/defaultUrls'\n\nconst defaultBaseOptions: Required<BaseOptions> = { userAction: true }\n\nexport class PanoCompassController extends BasePlugin.Controller<State, EventMap, PluginServerData, PluginData> {\n /**\n * 默认状态\n */\n public state: State = {\n visible: true,\n enabled: true,\n config: {\n /**\n * @todo 图片转base64\n */\n compassImageUrl: PANO_COMPASS_DEFAULT_IMAGE,\n entryDoorImageUrl: ENTRY_DOOR_DEFAULT_IMAGE,\n },\n }\n public data?: PanoCompassPluginData\n private group = new THREE.Group()\n private roomInfoInstance?: ReturnType<typeof getRoomInfoInstance>\n private roomInfoWrapperInstance?: ReturnType<CSS3DRenderPluginExportType['create3DDomContainer']>\n private compassMeshTween?: BetterTween<{ progress: number }>\n private compassMesh?: THREE.Mesh<THREE.CircleGeometry, THREE.MeshBasicMaterial>\n private logoMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n private logoMeshTween?: BetterTween<{ progress: number }>\n private entryDoorMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n\n public constructor(five: Five, config?: PanoCompassPluginParameterType) {\n super(five, config)\n this.five.scene.add(this.group)\n this.five.once('dispose', this.dispose)\n this.setState({\n visible: true,\n enabled: true,\n config: {\n ...this.state.config,\n ...(config || {}),\n },\n })\n }\n\n /**\n * 启用插件,响应用户操作并展示UI\n * @param options\n */\n public enable(options: Required<BaseOptions> = defaultBaseOptions): void {\n this.setState(\n {\n enabled: true,\n },\n options,\n )\n }\n\n /**\n * 禁用插件,禁止响应用户操作并隐藏UI\n * @param options\n */\n public disable(options: Required<BaseOptions> = defaultBaseOptions): void {\n this.setState(\n {\n enabled: false,\n },\n options,\n )\n }\n\n /**\n * 展示UI\n * @param options\n * @returns\n * @todo 需要考虑动画\n */\n public show(options: Required<BaseOptions> = defaultBaseOptions): Promise<void> {\n if (!this.state.enabled) return\n this.setState(\n {\n visible: true,\n },\n options,\n )\n return Promise.resolve()\n }\n\n /**\n * 隐藏UI\n * @param options\n * @returns\n * @todo 需要考虑动画\n */\n public hide(options: Required<BaseOptions> = defaultBaseOptions): Promise<void> {\n if (!this.state.enabled) return\n this.setState(\n {\n visible: false,\n },\n options,\n )\n return Promise.resolve()\n }\n\n public setState(state: Partial<State>, options: Required<BaseOptions> = { userAction: true }): void {\n const prevState = JSON.parse(JSON.stringify(this.state))\n this.state = {\n visible: state.visible ?? prevState.visible,\n enabled: state.enabled ?? prevState.enabled,\n config: { ...prevState.config, ...(state.config || {}) },\n }\n this.hooks.emit('stateChange', {\n state: this.state,\n prevState,\n userAction: options.userAction,\n })\n\n if (state.enabled === true) {\n this._enable()\n this.hooks.emit('enable', options)\n }\n if (state.enabled === false) {\n this._disable()\n this.hooks.emit('disable', options)\n }\n\n if (state.visible === false) {\n this._toggleVisible()\n this.hooks.emit('hide', options)\n }\n\n if (state.visible === true) {\n this._toggleVisible()\n this.hooks.emit('show', options)\n }\n\n /**\n * @todo config变化不应该重新初始化,需要做精准的替换\n */\n if (state.config) {\n this.init()\n }\n }\n\n public async load(data: PluginServerData | PluginData, state?: State, userAction = true) {\n const nextData = await this.formatData(data)\n if (JSON.stringify(this.data) !== JSON.stringify(nextData)) {\n this.hooks.emit('dataChange', nextData, this.data)\n this.data = { ...nextData }\n this.init()\n if (state) {\n this.setState(state, { userAction })\n }\n this.hooks.emit('dataLoaded', this.data)\n }\n }\n\n /**\n * 销毁插件\n * @todo 销毁贴图时,最好还是直接销毁贴图吧,this.compassMesh?.material.map 这种都是很深层的引用了。THREE 的建议我看也是自己去管理和销毁公共贴图。\n */\n public dispose = () => {\n this.five.scene.remove(this.group)\n this.group.remove(...this.group.children)\n this.compassMesh?.material.map?.dispose()\n this.entryDoorMesh?.material.map?.dispose()\n this.five.off('dispose', this.dispose)\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n protected formatData(serverData: PluginServerData | PluginData): Promise<PluginData> {\n if ((serverData as PluginServerData).version && (serverData as PluginServerData).data) {\n return Promise.resolve((serverData as PluginServerData).data)\n } else {\n return Promise.resolve(serverData as unknown as PluginData)\n }\n }\n\n /**\n * 添加事件监听\n */\n private _addEventListener = () => {\n this.five.on('panoArrived', this.onFivePanoArrived)\n this.five.on('panoWillArrive', this.onFivePanoWillArrive)\n this.five.on('modeChange', this.onFiveModeChange)\n this.five.on('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n /**\n * 移除事件监听\n */\n private _removeEventListener = () => {\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('modeChange', this.onFiveModeChange)\n this.five.off('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n /**\n * 启用,响应事件,展示UI\n */\n private _enable = () => {\n this.five.scene.add(this.group)\n this.init()\n this.onFivePanoArrived(this.five.panoIndex || 0)\n this._addEventListener()\n }\n\n /**\n * 禁用,不响应事件,不展示UI\n */\n private _disable = () => {\n this._clearCompassIfNeed()\n this._clearEntryDoorIfNeed()\n this.five.scene.remove(this.group)\n this._removeEventListener()\n }\n\n /**\n * 展示UI\n */\n private _toggleVisible = () => {\n this.group.visible = this.state.visible\n this.five.needsRender = true\n }\n\n private _clearCompassIfNeed = () => {\n if (this.compassMesh) {\n this.group.remove(this.compassMesh)\n this.compassMesh.material.map?.dispose()\n this.compassMesh = null\n }\n }\n\n private _clearLogoIfNeed = () => {\n if (this.logoMesh) {\n this.group.remove(this.logoMesh)\n this.logoMesh.material.map?.dispose()\n this.logoMesh = null\n }\n }\n\n private _clearEntryDoorIfNeed = () => {\n if (this.entryDoorMesh) {\n this.group.remove(this.entryDoorMesh)\n this.entryDoorMesh.material.map?.dispose()\n this.entryDoorMesh = null\n }\n\n if (this.roomInfoInstance) {\n this.roomInfoInstance.dispose()\n this.roomInfoInstance = null\n }\n\n if (this.roomInfoWrapperInstance) {\n this.roomInfoWrapperInstance.dispose()\n this.roomInfoWrapperInstance = null\n }\n }\n\n /**\n * 初始化\n * @todo 逻辑需要细分\n */\n private async init() {\n // 初始化指南针\n const northRad = this.data?.north_rad ?? null\n this._clearCompassIfNeed()\n if (northRad !== null) {\n this.compassMesh = await this.loadCompassMesh()\n if (this.compassMesh) {\n this.compassMesh.rotateX(-Math.PI / 2)\n this.compassMesh.rotateZ(northRad - Math.PI / 2)\n this.group.add(this.compassMesh)\n }\n }\n // 初始化 logo\n this._clearLogoIfNeed()\n this.logoMesh = await this.loadLogoMesh()\n if (this.logoMesh) {\n this.logoMesh.rotateX(-Math.PI / 2)\n this.group.add(this.logoMesh)\n }\n // 初始化入户门指引\n const entrance = this.data?.entrance ?? null\n this._clearEntryDoorIfNeed()\n if (entrance !== null) {\n this.entryDoorMesh = await this.loadEntryDoorMesh()\n this.roomInfoWrapperInstance = this.loadRoomInfo()\n this.roomInfoInstance = getRoomInfoInstance()\n this.entryDoorMesh.rotateX(-Math.PI / 2)\n if (this.roomInfoWrapperInstance) {\n this.roomInfoInstance.appendTo(this.roomInfoWrapperInstance.container)\n }\n this.group.add(this.entryDoorMesh)\n }\n this.onFivePanoArrived(this.five.panoIndex || 0)\n this.five.needsRender = true\n }\n\n private async loadCompassMesh() {\n const compassImageUrl = this.state.config.compassImageUrl\n const compassTexture = await loadTexture(compassImageUrl)\n const compassGeometry = new THREE.CircleGeometry(0.7, 32)\n const compassMaterial = new THREE.MeshBasicMaterial({\n map: compassTexture,\n transparent: true,\n opacity: 0,\n depthTest: false,\n })\n const compassMesh = new THREE.Mesh(compassGeometry, compassMaterial)\n compassMesh.name = 'pano-compass-mesh'\n return compassMesh\n }\n\n private async loadLogoMesh() {\n if (!this.state.config.logoURL) return\n const url = this.state.config.logoURL\n const texture = await loadTexture(url)\n texture.minFilter = THREE.NearestFilter\n texture.magFilter = THREE.NearestFilter\n const geometry = new THREE.PlaneGeometry(0.4, 0.4)\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n opacity: 0,\n transparent: true,\n depthTest: false,\n })\n const mesh = new THREE.Mesh(geometry, material)\n mesh.name = 'pano-compass-logo-mesh'\n return mesh\n }\n\n private async loadEntryDoorMesh() {\n const entryDoorImageUrl = this.state.config.entryDoorImageUrl\n const entryDoorTexture = await loadTexture(entryDoorImageUrl)\n const entryDoorGeometry = new THREE.PlaneGeometry(0.2, 0.16)\n const entryDoorMaterial = new THREE.MeshBasicMaterial({\n map: entryDoorTexture,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n })\n const entryDoorMesh = new THREE.Mesh(entryDoorGeometry, entryDoorMaterial)\n entryDoorMesh.name = 'pano-compass-entry-door'\n return entryDoorMesh\n }\n\n private loadRoomInfo() {\n const points = [\n new THREE.Vector3(-0.7, 0, -0.7),\n new THREE.Vector3(0.7, 0, -0.7),\n new THREE.Vector3(0.7, 0, 0.7),\n new THREE.Vector3(-0.7, 0, 0.7),\n ]\n const roomInfo = CSS3DRenderPlugin(this.five).create3DDomContainer(points)\n\n return roomInfo\n }\n\n private onFivePanoWillArrive = (panoIndex: number) => {\n if (panoIndex === this.five.panoIndex) return\n this.compassMeshTween?.dispose()\n this.compassMesh?.material.setValues({ opacity: 0 })\n this.logoMeshTween?.dispose()\n this.logoMesh?.material.setValues({ opacity: 0 })\n }\n\n private onFivePanoArrived = (panoIndex: number) => {\n // ======== fix compass position ========\n const standingPosition = this.five.work?.observers?.[panoIndex]?.standingPosition\n if (this.compassMesh && standingPosition) {\n // 指南针上移 0.01m,防止与地板重合\n this.compassMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01))\n if (this.compassMesh.material.opacity === 0) {\n this.compassMeshTween?.dispose()\n this.compassMeshTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.compassMesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n }\n // ======== fix logo position ========\n if (this.logoMesh && standingPosition) {\n // logo 上移 0.011m,防止与地板重合,防止与指南针重合\n this.logoMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.011))\n if (this.logoMesh.material.opacity === 0) {\n this.logoMeshTween?.dispose()\n this.logoMeshTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.logoMesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n }\n // ======== fix entry door label position and rotation ========\n if (this.entryDoorMesh) {\n const entryDoorPosition = new THREE.Vector3(\n this.data.entrance.position.x,\n this.data.entrance.position.y,\n this.data.entrance.position.z,\n )\n const panoToEntryDoorVector = entryDoorPosition.clone().setY(standingPosition.y).sub(standingPosition).normalize()\n const compassEntryDoorPosition = standingPosition\n .clone()\n .add(panoToEntryDoorVector.clone().multiplyScalar(0.7))\n .setY(standingPosition.y + 0.01)\n this.entryDoorMesh.rotation.z = new THREE.Vector3(0, 0, -1).angleTo(panoToEntryDoorVector)\n this.entryDoorMesh.position.copy(compassEntryDoorPosition)\n // 不是客厅时,隐藏入户门指引\n this.data?.room_observers[panoIndex].room.type === 1\n ? this.entryDoorMesh?.material.setValues({ opacity: 1 })\n : this.entryDoorMesh?.material.setValues({ opacity: 0 })\n }\n // ======== fix room info ========\n if (this.roomInfoInstance && this.roomInfoWrapperInstance && standingPosition) {\n this.roomInfoWrapperInstance.css3DObject.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01))\n this.roomInfoInstance.setRoom(this.data.room_observers[panoIndex].room)\n }\n this.five.needsRender = true\n }\n\n private onFiveCameraDirectionUpdate = ({ longitude, latitude }: { longitude: number; latitude: number }) => {\n if (!this.roomInfoWrapperInstance) return\n this.roomInfoWrapperInstance.css3DObject.rotation.z = longitude\n latitude > 0.66 && this.five.getCurrentState().mode === 'Panorama' ? this.roomInfoInstance?.show() : this.roomInfoInstance?.hide()\n }\n\n\n private onFiveModeChange = (mode: Mode, prevMode: Mode, panoIndex: number, toPose: Pose, userAction: boolean) => {\n if (mode === prevMode) return\n this.setState(\n {\n visible: mode === Five.Mode.Panorama,\n },\n { userAction },\n )\n }\n}\n","import type { FivePlugin } from '@realsee/five-webgpu'\nimport { PanoCompassController } from './Controller'\nimport type { PanoCompassPluginParameterType } from './typings'\n\nexport type PanoCompassPluginExportType = PanoCompassController\n\nexport const PanoCompassPlugin: FivePlugin<\n PanoCompassPluginParameterType,\n PanoCompassPluginExportType\n> = (five, config) => new PanoCompassController(five, config)\n\nexport default PanoCompassPlugin\n\nexport type { PanoCompassPluginParameterType, PanoCompassPluginData } from './typings'\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pano-compass-BwxmzCPI.js","names":["BasePlugin.Controller","loadTexture","ENTRY_DOOR_DEFAULT_IMAGE","PANO_COMPASS_DEFAULT_IMAGE","tweenProgress","CSS3DRenderPlugin","Controller","THREE","roomInfoIcon","getRoomInfoInstance","infoDom","iconDom","textDom","room","defaultBaseOptions","PanoCompassController","five","config","options","prevState","state","nextData","data","serverData","northRad","entrance","compassImageUrl","compassTexture","compassGeometry","compassMaterial","compassMesh","url","texture","geometry","material","mesh","entryDoorImageUrl","entryDoorTexture","entryDoorGeometry","entryDoorMaterial","entryDoorMesh","points","panoIndex","standingPosition","progress","panoToEntryDoorVector","compassEntryDoorPosition","longitude","latitude","mode","prevMode","Five","PanoCompassPlugin"],"sources":["../../src/PanoCompassPlugin/Assets/roomInfoIcon.ts","../../src/PanoCompassPlugin/getRoomInfoInstance.ts","../../src/PanoCompassPlugin/Controller.ts","../../src/PanoCompassPlugin/index.ts"],"sourcesContent":["export const roomInfoIcon =\n 'data:image/png;base64,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'\n","import type { FloorplanServerRoomItem } from '../floorplan/typings/floorplanServerData'\nimport { roomInfoIcon } from './Assets/roomInfoIcon'\n\nexport function getRoomInfoInstance() {\n const infoDom = document.createElement('div')\n const iconDom = document.createElement('i')\n const textDom = document.createElement('span')\n infoDom.appendChild(iconDom)\n infoDom.appendChild(textDom)\n // infoDom style\n infoDom.style.position = 'relative'\n infoDom.style.width = '100%'\n infoDom.style.display = 'flex'\n infoDom.style.flexDirection = 'column'\n infoDom.style.alignItems = 'center'\n infoDom.style.marginTop = `${150 / 16}rem`\n infoDom.style.opacity = '0'\n infoDom.style.transition = 'opacity 1000ms linear'\n // iconDom style\n iconDom.style.display = 'block'\n iconDom.style.width = `${134 / 16}rem`\n iconDom.style.height = `${22 / 16}rem`\n iconDom.style.backgroundSize = '100%'\n iconDom.style.backgroundRepeat = 'no-repeat'\n iconDom.style.backgroundImage = `url(${roomInfoIcon})`\n textDom.style.marginTop = `${10 / 16}rem`\n // textDom style\n textDom.style.fontSize = `${16 / 16}rem`\n textDom.style.color = '#fff'\n textDom.style.opacity = '0.7'\n textDom.style.textShadow = '0 2px 16px rgb(22 34 83 / 24%)'\n textDom.style.fontWeight = 'bold'\n\n return {\n appendTo(element: Element) {\n element.appendChild(infoDom)\n },\n dispose() {\n infoDom.remove()\n },\n setRoom(room: FloorplanServerRoomItem) {\n textDom.innerHTML = room.name + ' ' + Math.floor(room.size / 1000000) + '㎡'\n },\n show() {\n infoDom.style.opacity = '1'\n },\n hide() {\n infoDom.style.opacity = '0'\n }\n }\n}\n","import * as THREE from 'three/webgpu'\nimport type { Mode, Pose } from '@realsee/five-webgpu'\nimport type { BaseOptions } from '../base/BasePlugin'\nimport type { CSS3DRenderPluginExportType } from '../CSS3DRenderPlugin'\nimport { Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { getRoomInfoInstance } from './getRoomInfoInstance'\nimport { loadTexture } from '../shared-utils/three/loadTexture'\nimport CSS3DRenderPlugin from '../CSS3DRenderPlugin'\nimport type { BetterTween } from '../shared-utils/animationFrame/BetterTween'\nimport { tweenProgress } from '../shared-utils/animationFrame/BetterTween'\n\nimport type { EventMap, PanoCompassPluginData, PanoCompassPluginParameterType, PluginData, PluginServerData, State } from './typings'\nimport { ENTRY_DOOR_DEFAULT_IMAGE, PANO_COMPASS_DEFAULT_IMAGE } from '../shared-utils/url/defaultUrls'\n\nconst defaultBaseOptions: Required<BaseOptions> = { userAction: true }\n\nexport class PanoCompassController extends BasePlugin.Controller<State, EventMap, PluginServerData, PluginData> {\n /**\n * 默认状态\n */\n public state: State = {\n visible: true,\n enabled: true,\n config: {\n /**\n * @todo 图片转base64\n */\n compassImageUrl: PANO_COMPASS_DEFAULT_IMAGE,\n entryDoorImageUrl: ENTRY_DOOR_DEFAULT_IMAGE,\n },\n }\n public data?: PanoCompassPluginData\n private group = new THREE.Group()\n private roomInfoInstance?: ReturnType<typeof getRoomInfoInstance>\n private roomInfoWrapperInstance?: ReturnType<CSS3DRenderPluginExportType['create3DDomContainer']>\n private compassMeshTween?: BetterTween<{ progress: number }>\n private compassMesh?: THREE.Mesh<THREE.CircleGeometry, THREE.MeshBasicMaterial>\n private logoMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n private logoMeshTween?: BetterTween<{ progress: number }>\n private entryDoorMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n\n public constructor(five: Five, config?: PanoCompassPluginParameterType) {\n super(five, config)\n this.five.scene.add(this.group)\n this.five.once('dispose', this.dispose)\n this.setState({\n visible: true,\n enabled: true,\n config: {\n ...this.state.config,\n ...(config || {}),\n },\n })\n }\n\n /**\n * 启用插件,响应用户操作并展示UI\n * @param options\n */\n public enable(options: Required<BaseOptions> = defaultBaseOptions): void {\n this.setState(\n {\n enabled: true,\n },\n options,\n )\n }\n\n /**\n * 禁用插件,禁止响应用户操作并隐藏UI\n * @param options\n */\n public disable(options: Required<BaseOptions> = defaultBaseOptions): void {\n this.setState(\n {\n enabled: false,\n },\n options,\n )\n }\n\n /**\n * 展示UI\n * @param options\n * @returns\n * @todo 需要考虑动画\n */\n public show(options: Required<BaseOptions> = defaultBaseOptions): Promise<void> {\n if (!this.state.enabled) return\n this.setState(\n {\n visible: true,\n },\n options,\n )\n return Promise.resolve()\n }\n\n /**\n * 隐藏UI\n * @param options\n * @returns\n * @todo 需要考虑动画\n */\n public hide(options: Required<BaseOptions> = defaultBaseOptions): Promise<void> {\n if (!this.state.enabled) return\n this.setState(\n {\n visible: false,\n },\n options,\n )\n return Promise.resolve()\n }\n\n public setState(state: Partial<State>, options: Required<BaseOptions> = { userAction: true }): void {\n const prevState = JSON.parse(JSON.stringify(this.state))\n this.state = {\n visible: state.visible ?? prevState.visible,\n enabled: state.enabled ?? prevState.enabled,\n config: { ...prevState.config, ...(state.config || {}) },\n }\n this.hooks.emit('stateChange', {\n state: this.state,\n prevState,\n userAction: options.userAction,\n })\n\n if (state.enabled === true) {\n this._enable()\n this.hooks.emit('enable', options)\n }\n if (state.enabled === false) {\n this._disable()\n this.hooks.emit('disable', options)\n }\n\n if (state.visible === false) {\n this._toggleVisible()\n this.hooks.emit('hide', options)\n }\n\n if (state.visible === true) {\n this._toggleVisible()\n this.hooks.emit('show', options)\n }\n\n /**\n * @todo config变化不应该重新初始化,需要做精准的替换\n */\n if (state.config) {\n this.init()\n }\n }\n\n public async load(data: PluginServerData | PluginData, state?: State, userAction = true) {\n const nextData = await this.formatData(data)\n if (JSON.stringify(this.data) !== JSON.stringify(nextData)) {\n this.hooks.emit('dataChange', nextData, this.data)\n this.data = { ...nextData }\n this.init()\n if (state) {\n this.setState(state, { userAction })\n }\n this.hooks.emit('dataLoaded', this.data)\n }\n }\n\n /**\n * 销毁插件\n * @todo 销毁贴图时,最好还是直接销毁贴图吧,this.compassMesh?.material.map 这种都是很深层的引用了。THREE 的建议我看也是自己去管理和销毁公共贴图。\n */\n public dispose = () => {\n this.five.scene.remove(this.group)\n this.group.remove(...this.group.children)\n this.compassMesh?.material.map?.dispose()\n this.entryDoorMesh?.material.map?.dispose()\n this.five.off('dispose', this.dispose)\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n protected formatData(serverData: PluginServerData | PluginData): Promise<PluginData> {\n if ((serverData as PluginServerData).version && (serverData as PluginServerData).data) {\n return Promise.resolve((serverData as PluginServerData).data)\n } else {\n return Promise.resolve(serverData as unknown as PluginData)\n }\n }\n\n /**\n * 添加事件监听\n */\n private _addEventListener = () => {\n this.five.on('panoArrived', this.onFivePanoArrived)\n this.five.on('panoWillArrive', this.onFivePanoWillArrive)\n this.five.on('modeChange', this.onFiveModeChange)\n this.five.on('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n /**\n * 移除事件监听\n */\n private _removeEventListener = () => {\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('modeChange', this.onFiveModeChange)\n this.five.off('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n /**\n * 启用,响应事件,展示UI\n */\n private _enable = () => {\n this.five.scene.add(this.group)\n this.init()\n this.onFivePanoArrived(this.five.panoIndex || 0)\n this._addEventListener()\n }\n\n /**\n * 禁用,不响应事件,不展示UI\n */\n private _disable = () => {\n this._clearCompassIfNeed()\n this._clearEntryDoorIfNeed()\n this.five.scene.remove(this.group)\n this._removeEventListener()\n }\n\n /**\n * 展示UI\n */\n private _toggleVisible = () => {\n this.group.visible = this.state.visible\n this.five.needsRender = true\n }\n\n private _clearCompassIfNeed = () => {\n if (this.compassMesh) {\n this.group.remove(this.compassMesh)\n this.compassMesh.material.map?.dispose()\n this.compassMesh = null\n }\n }\n\n private _clearLogoIfNeed = () => {\n if (this.logoMesh) {\n this.group.remove(this.logoMesh)\n this.logoMesh.material.map?.dispose()\n this.logoMesh = null\n }\n }\n\n private _clearEntryDoorIfNeed = () => {\n if (this.entryDoorMesh) {\n this.group.remove(this.entryDoorMesh)\n this.entryDoorMesh.material.map?.dispose()\n this.entryDoorMesh = null\n }\n\n if (this.roomInfoInstance) {\n this.roomInfoInstance.dispose()\n this.roomInfoInstance = null\n }\n\n if (this.roomInfoWrapperInstance) {\n this.roomInfoWrapperInstance.dispose()\n this.roomInfoWrapperInstance = null\n }\n }\n\n /**\n * 初始化\n * @todo 逻辑需要细分\n */\n private async init() {\n // 初始化指南针\n const northRad = this.data?.north_rad ?? null\n this._clearCompassIfNeed()\n if (northRad !== null) {\n this.compassMesh = await this.loadCompassMesh()\n if (this.compassMesh) {\n this.compassMesh.rotateX(-Math.PI / 2)\n this.compassMesh.rotateZ(northRad - Math.PI / 2)\n this.group.add(this.compassMesh)\n }\n }\n // 初始化 logo\n this._clearLogoIfNeed()\n this.logoMesh = await this.loadLogoMesh()\n if (this.logoMesh) {\n this.logoMesh.rotateX(-Math.PI / 2)\n this.group.add(this.logoMesh)\n }\n // 初始化入户门指引\n const entrance = this.data?.entrance ?? null\n this._clearEntryDoorIfNeed()\n if (entrance !== null) {\n this.entryDoorMesh = await this.loadEntryDoorMesh()\n this.roomInfoWrapperInstance = this.loadRoomInfo()\n this.roomInfoInstance = getRoomInfoInstance()\n this.entryDoorMesh.rotateX(-Math.PI / 2)\n if (this.roomInfoWrapperInstance) {\n this.roomInfoInstance.appendTo(this.roomInfoWrapperInstance.container)\n }\n this.group.add(this.entryDoorMesh)\n }\n this.onFivePanoArrived(this.five.panoIndex || 0)\n this.five.needsRender = true\n }\n\n private async loadCompassMesh() {\n const compassImageUrl = this.state.config.compassImageUrl\n const compassTexture = await loadTexture(compassImageUrl)\n const compassGeometry = new THREE.CircleGeometry(0.7, 32)\n const compassMaterial = new THREE.MeshBasicMaterial({\n map: compassTexture,\n transparent: true,\n opacity: 0,\n depthTest: false,\n })\n const compassMesh = new THREE.Mesh(compassGeometry, compassMaterial)\n compassMesh.name = 'pano-compass-mesh'\n return compassMesh\n }\n\n private async loadLogoMesh() {\n if (!this.state.config.logoURL) return\n const url = this.state.config.logoURL\n const texture = await loadTexture(url)\n texture.minFilter = THREE.NearestFilter\n texture.magFilter = THREE.NearestFilter\n const geometry = new THREE.PlaneGeometry(0.4, 0.4)\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n opacity: 0,\n transparent: true,\n depthTest: false,\n })\n const mesh = new THREE.Mesh(geometry, material)\n mesh.name = 'pano-compass-logo-mesh'\n return mesh\n }\n\n private async loadEntryDoorMesh() {\n const entryDoorImageUrl = this.state.config.entryDoorImageUrl\n const entryDoorTexture = await loadTexture(entryDoorImageUrl)\n const entryDoorGeometry = new THREE.PlaneGeometry(0.2, 0.16)\n const entryDoorMaterial = new THREE.MeshBasicMaterial({\n map: entryDoorTexture,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n })\n const entryDoorMesh = new THREE.Mesh(entryDoorGeometry, entryDoorMaterial)\n entryDoorMesh.name = 'pano-compass-entry-door'\n return entryDoorMesh\n }\n\n private loadRoomInfo() {\n const points = [\n new THREE.Vector3(-0.7, 0, -0.7),\n new THREE.Vector3(0.7, 0, -0.7),\n new THREE.Vector3(0.7, 0, 0.7),\n new THREE.Vector3(-0.7, 0, 0.7),\n ]\n const roomInfo = CSS3DRenderPlugin(this.five).create3DDomContainer(points)\n\n return roomInfo\n }\n\n private onFivePanoWillArrive = (panoIndex: number) => {\n if (panoIndex === this.five.panoIndex) return\n this.compassMeshTween?.dispose()\n this.compassMesh?.material.setValues({ opacity: 0 })\n this.logoMeshTween?.dispose()\n this.logoMesh?.material.setValues({ opacity: 0 })\n }\n\n private onFivePanoArrived = (panoIndex: number) => {\n // ======== fix compass position ========\n const standingPosition = this.five.work?.observers?.[panoIndex]?.standingPosition\n if (this.compassMesh && standingPosition) {\n // 指南针上移 0.01m,防止与地板重合\n this.compassMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01))\n if (this.compassMesh.material.opacity === 0) {\n this.compassMeshTween?.dispose()\n this.compassMeshTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.compassMesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n }\n // ======== fix logo position ========\n if (this.logoMesh && standingPosition) {\n // logo 上移 0.011m,防止与地板重合,防止与指南针重合\n this.logoMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.011))\n if (this.logoMesh.material.opacity === 0) {\n this.logoMeshTween?.dispose()\n this.logoMeshTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.logoMesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n }\n // ======== fix entry door label position and rotation ========\n if (this.entryDoorMesh) {\n const entryDoorPosition = new THREE.Vector3(\n this.data.entrance.position.x,\n this.data.entrance.position.y,\n this.data.entrance.position.z,\n )\n const panoToEntryDoorVector = entryDoorPosition.clone().setY(standingPosition.y).sub(standingPosition).normalize()\n const compassEntryDoorPosition = standingPosition\n .clone()\n .add(panoToEntryDoorVector.clone().multiplyScalar(0.7))\n .setY(standingPosition.y + 0.01)\n this.entryDoorMesh.rotation.z = new THREE.Vector3(0, 0, -1).angleTo(panoToEntryDoorVector)\n this.entryDoorMesh.position.copy(compassEntryDoorPosition)\n // 不是客厅时,隐藏入户门指引\n this.data?.room_observers[panoIndex].room.type === 1\n ? this.entryDoorMesh?.material.setValues({ opacity: 1 })\n : this.entryDoorMesh?.material.setValues({ opacity: 0 })\n }\n // ======== fix room info ========\n if (this.roomInfoInstance && this.roomInfoWrapperInstance && standingPosition) {\n this.roomInfoWrapperInstance.css3DObject.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01))\n this.roomInfoInstance.setRoom(this.data.room_observers[panoIndex].room)\n }\n this.five.needsRender = true\n }\n\n private onFiveCameraDirectionUpdate = ({ longitude, latitude }: { longitude: number; latitude: number }) => {\n if (!this.roomInfoWrapperInstance) return\n this.roomInfoWrapperInstance.css3DObject.rotation.z = longitude\n latitude > 0.66 && this.five.getCurrentState().mode === 'Panorama' ? this.roomInfoInstance?.show() : this.roomInfoInstance?.hide()\n }\n\n\n private onFiveModeChange = (mode: Mode, prevMode: Mode, panoIndex: number, toPose: Pose, userAction: boolean) => {\n if (mode === prevMode) return\n this.setState(\n {\n visible: mode === Five.Mode.Panorama,\n },\n { userAction },\n )\n }\n}\n","import type { FivePlugin } from '@realsee/five-webgpu'\nimport { PanoCompassController } from './Controller'\nimport type { PanoCompassPluginParameterType } from './typings'\n\nexport type PanoCompassPluginExportType = PanoCompassController\n\nexport const PanoCompassPlugin: FivePlugin<\n PanoCompassPluginParameterType,\n PanoCompassPluginExportType\n> = (five, config) => new PanoCompassController(five, config)\n\nexport default PanoCompassPlugin\n\nexport type { PanoCompassPluginParameterType, PanoCompassPluginData } from './typings'\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as e } from "./rolldown-runtime-B0aSnxlc.js";
|
|
2
2
|
import { n as t } from "./fiveModelLoad-BUIBYxzp.js";
|
|
3
|
-
import { t as n } from "./BasePlugin-
|
|
3
|
+
import { t as n } from "./BasePlugin-CPJ1ahrJ.js";
|
|
4
4
|
import { G as r, J as i, K as a, L as o, M as s, P as c, Q as l, R as u, U as d, V as f, W as p, X as m, f as h, h as g, it as _, j as v, l as y, m as b, n as x, o as S, ot as C, p as w, rt as T, st as E, t as D, z as O } from "./component.svelte-D5LYqt50.js";
|
|
5
5
|
import { t as k } from "./classnames-DUxZNrrI.js";
|
|
6
6
|
import { Euler as A, Quaternion as j, Raycaster as M, Vector3 as N } from "three/webgpu";
|
|
@@ -255,4 +255,4 @@ var V = { userAction: !0 }, H = class extends n {
|
|
|
255
255
|
//#endregion
|
|
256
256
|
export { U as t };
|
|
257
257
|
|
|
258
|
-
//# sourceMappingURL=pano-door-label-
|
|
258
|
+
//# sourceMappingURL=pano-door-label-Bwvaf5xx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pano-door-label-BkWTtRu_.js","names":["$.from_html","$.prop","$.mutable_source","$.get","prevPanoIndex","$.child","$.only_child","$.set","$.deep_read_state","$.untrack","$.clsx","classnames","BasePlugin.Controller","Controller.PanoDoorLabelPluginController","__toESM","waitFiveModelLoaded","Controller","template_effect","only_child","child","event","append","from_html","set","deep_read_state","legacy_pre_effect","untrack","legacy_pre_effect_reset","mutable_source","set_attribute","clsx","push","set_text","bind_this","set_class","prop","init","next","set_style","pop","reset","mountComponent","get","require_classnames","import_classnames","root","DoorLabelItem","$$props","props","onClick","divElement","prevPanoIndexRef","initPanoIndex","left","top","inSight","_width","_height","panoIndex","div","div_1","span","text","$$value","$0","$$anchor","isTwoRectOverlaped","verticalDistance","rect1","rect2","horizontalDistance","verticalThreshold","horizontalThroshold","getCameraToward","five","cameraDirection","camera","Vector3","angel","toward","getDistance","p1","p2","getToward","pi_4","rad","defaultBaseOptions","PanoDoorLabelPluginController","request","doorLabelConfig","item","floorplanServerData","container","prevState","state","optionParams","options","_state","floorDatas","roomObservers","ob","floorIndex","floor","d","room","r","roomObserver","targetPoint","visibleLabelIds","visibleDoorIds","doorLabelItem","doorPosition","distance","raycaster","Raycaster","direction","intersection","index","fiveElement","canvasWidth","canvasHeight","neverOverlapLabels","doorLabel","disFromCameraToLabel","labelPosition","angle","mouse","visible","heightLevel","b","a","i","idx1","l1","t1","idx2","l2","t2","rectDom1","rectDom2","nearestIndex","nearestVector","minDistance","observer","work","ro","roomName","observerPoint","position","fromVector","toVector","quaternion","Quaternion","euler","Euler","currentPanoIndex","currentFloorIndex","currentFloor","observersInRoom","doorPoint","door","nearestPoint","data","PanoDoorLabelPlugin"],"sources":["../../src/PanoDoorLabelPlugin/DoorLabelItem.svelte","../../src/PanoDoorLabelPlugin/DoorLabelItem.svelte","../../src/PanoDoorLabelPlugin/utils.ts","../../src/PanoDoorLabelPlugin/Controller.ts","../../src/PanoDoorLabelPlugin/index.ts"],"sourcesContent":["<script lang=\"ts\">\n import classnames from 'classnames'\n import type { LabelItemProp } from './typings'\n\n export let props: LabelItemProp\n export let onClick: () => void\n\n let divElement\n let prevPanoIndexRef = 0\n const initPanoIndex = () => {\n const { left, top, inSight, panoIndex } = props\n if (!left || !top || !inSight) {\n return\n }\n if (!divElement) return\n const _width = (divElement.current.clientWidth / window.innerWidth) * 100\n const _height = (divElement.current.clientHeight / window.innerHeight) * 100\n if (left! <= _width / 2 || left! >= 100 - _width / 2) {\n return\n }\n if (top! <= _height / 2 || top! >= 100 - _height / 2) {\n return\n }\n const prevPanoIndex = prevPanoIndexRef\n if (panoIndex !== prevPanoIndex) {\n // 这里触发曝光埋点\n prevPanoIndexRef = panoIndex\n }\n }\n\n $: {\n initPanoIndex()\n }\n\n</script>\n\n<div\n bind:this={divElement}\n style={`left: ${props.left || 0}%;top: ${props.top || 0}%;opacity: ${props.inSight ? 1 : 0}`}\n class=\"plugin-DoorLabelPlugin-item\"\n>\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n class={classnames('plugin-DoorLabelPlugin-cnt', props.toward)}\n style={`transform: ${props.transform || 'initial'};pointer-events: ${props.inSight ? 'auto' : 'none'};opacity: ${\n props.inSight ? 1 : 0\n }`}\n data-camera-toward={props.cameraToward}\n on:click={(e) => {\n if (onClick) onClick()\n }}\n >\n <span class=\"plugin-DoorLabelPlugin-txt\">{props.name}</span>\n <i class=\"plugin-DoorLabelPlugin-icon\" />\n </div>\n</div>\n\n<style lang=\"scss\">.plugin-DoorLabelPlugin-item {\n position: absolute;\n left: 0;\n top: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n}\n\n.plugin-DoorLabelPlugin-cnt {\n position: absolute;\n top: 50%;\n left: 50%;\n border-radius: 0.125rem;\n background: rgba(0, 0, 0, 0.35);\n line-height: 0.75rem;\n padding: 0.375rem;\n white-space: nowrap;\n font-size: 0.75rem;\n font-style: normal;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: transform ease 1s, background ease 0.3s, color ease 0.3s;\n}\n.plugin-DoorLabelPlugin-cnt::after {\n content: \"\";\n display: block;\n position: absolute;\n top: -0.0625rem;\n left: -0.0625rem;\n bottom: -0.0625rem;\n right: -0.0625rem;\n border-radius: 0.125rem;\n border: 0.0625rem solid rgba(0, 0, 0, 0);\n border-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAD///+l2Z/dAAAAAnRSTlMAIE397fAAAAAVSURBVAjXY2BjgCMQ+PABhIAASRwARxwD8fgzCQAAAAAASUVORK5CYII=\") 4;\n transition: opacity ease 0.3s;\n}\n.plugin-DoorLabelPlugin-cnt:active, .plugin-DoorLabelPlugin-cnt:focus {\n background: rgba(0, 0, 0, 0.5);\n color: rgba(255, 255, 255, 0.5);\n}\n\n.plugin-DoorLabelPlugin-icon {\n background: url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTBweCIgaGVpZ2h0PSIxMHB4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+aW1hZ2Ut566t5aS0PC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxyZWN0IGlkPSJwYXRoLTEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCI+PC9yZWN0PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNjYuMDYyMTk3NSUiIHkxPSI1MCUiIHgyPSItMS4xMzY4NjgzOGUtMTElIiB5Mj0iNTAlIiBpZD0ibGluZWFyR3JhZGllbnQtMyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjg1IiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iODQuMzM5NzMxJSIgeTE9IjUwJSIgeDI9IjIzLjQyODMzNzclIiB5Mj0iNTAlIiBpZD0ibGluZWFyR3JhZGllbnQtNCI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSLpobXpnaItMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IlZSLeWIhumXtOW8leWvvOagh+etvuWkh+S7vS0zIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzM5LjAwMDAwMCwgLTU0My4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9Iue8lue7hC0y5aSH5Lu9LTEyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDUuMDAwMDAwLCA1MzYuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iaW1hZ2Ut566t5aS0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNC4wMDAwMDAsIDcuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPG1hc2sgaWQ9Im1hc2stMiIgZmlsbD0id2hpdGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgIDwvbWFzaz4KICAgICAgICAgICAgICAgICAgICA8dXNlIGlkPSJCRyIgZmlsbC1vcGFjaXR5PSIwIiBmaWxsPSIjRDhEOEQ4IiBvcGFjaXR5PSIwLjUxMTQ2Mjk4NCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuOTM4ODY5OCwxLjE0Mzc2MTI5IEM4LjI1NDY1NDA0LDEuMjU3NTgwMzUgOC4zMTc4Mjg0LDEuMzAyMTY5OTggOC4zMTc3ODUyMSwxLjM1ODE1MjIzIEM4LjMxNzc1MDcyLDEuNDAyODQzMzUgOC4zMDU3NDkwNywxLjQ0NzUyNTI0IDguMjgxNzg0MTEsMS40ODcyMDUyMSBMOC4yODE3ODQxMSwxLjQ4NzIwNTIxIEw2LjIwOTg5MDQxLDQuOTE3NzQyNDUgQzYuMTM3ODg4MDgsNS4wMzY5NjAyOSA2LjEwMTg4NjkxLDUuMTcxMjIwMiA2LjEwMTg4NjkxLDUuMzA1NDgwMTEgQzYuMTAxODg2OTEsNS40Mzk3NDAwMiA2LjEzNzg4ODA4LDUuNTczOTk5OTQgNi4yMDk4OTA0MSw1LjY5MzIxNzc4IEw2LjIwOTg5MDQxLDUuNjkzMjE3NzggTDguMjgxNzg0MTEsOS4xMjM3NTUwMSBDOC4zMTc0NzQzOCw5LjE4Mjg0OTE2IDguMzI1ODMzMjIsOS4yNTA4MTUyIDguMzEwNDk1OTUsOS4zMTI5MzAyOCBDOC4yOTUxNTg2OCw5LjM3NTA0NTM2IDguMjU2MTI1MzEsOS40MzEzMDk0NyA4LjE5NzAzMTE3LDkuNDY2OTk5NzMgQzguMTU3MzUxMTksOS40OTA5NjQ2OSA4LjExMjY2OTMxLDkuNTAyOTY2MzQgOC4wNjc5NzgxOCw5LjUwMzAwMDgzIEM4LjAyMzI4NzA2LDkuNTAzMDM1MzEgNy45Nzg1ODY3MSw5LjQ5MTEwMjYzIDcuOTM4ODY5OCw5LjQ2NzE5ODkzIEw3LjkzODg2OTgsOS40NjcxOTg5MyBMMS4zNzk5MTIxOCw1LjUxOTY3ODE1IEMxLjMyMDc2MzAyLDUuNDg0MDc5MTIgMS4yODE2NDI4Nyw1LjQyNzg3NTMyIDEuMjY2MjA5NzcsNS4zNjU3ODM5OCBDMS4yNTQ2OTI1Niw1LjMxOTQ0NzMyIDEuMjU2MzY2OTgsNS4yNjk4MzE4MiAxLjI3Mjc1MzMzLDUuMjIzMDU0MDUgTDEuMjcyNzUzMzMsNS4yMjMwNTQwNSBaIiBpZD0i566t5aS0IiBzdHJva2U9InVybCgjbGluZWFyR3JhZGllbnQtNCkiIHN0cm9rZS13aWR0aD0iMC41IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTMpIiBtYXNrPSJ1cmwoI21hc2stMikiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuMDM5MjAwLCA1LjMwNTQ4MCkgc2NhbGUoMSwgLTEpIHJvdGF0ZSgtOTAuMDAwMDAwKSB0cmFuc2xhdGUoLTUuMDM5MjAwLCAtNS4zMDU0ODApICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\") no-repeat;\n background-size: 100%;\n display: inline-block;\n width: 0.625rem;\n height: 0.625rem;\n margin-left: 0.25rem;\n transform-origin: center;\n}\n\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=forward].left .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=forward].right .plugin-DoorLabelPlugin-txt {\n order: 1;\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=forward].right .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 0.25rem;\n order: 0;\n}\n\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=right].forward .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=right].back .plugin-DoorLabelPlugin-txt {\n order: 1;\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=right].back .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 0.25rem;\n order: 0;\n}\n\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=left].back .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=left].forward .plugin-DoorLabelPlugin-txt {\n order: 1;\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=left].forward .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 0.25rem;\n order: 0;\n}\n\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=back].right .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=back].left .plugin-DoorLabelPlugin-txt {\n order: 1;\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=back].left .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 0.25rem;\n order: 0;\n}\n\n.plugin-DoorLabelPlugin-cnt--customBrand {\n color: #f9eac1;\n}\n.plugin-DoorLabelPlugin-cnt--customBrand .plugin-DoorLabelPlugin-icon {\n background: url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTBweCIgaGVpZ2h0PSI4cHgiIHZpZXdCb3g9IjAgMCAxMCA4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPueureWktDwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjEwLjYzODU4ODQlIiB5MT0iMCUiIHgyPSI5Ni41MTYxNDc0JSIgeTI9IjEyOS43MzEzNTQlIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkYyQ0MiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0VBRDA5QSIgb2Zmc2V0PSI0OC43MTQ0NDc4JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRDFCMTdFIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPC9kZWZzPgogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i5pyq5p2l5a625aSH5Lu9LTI1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzA1LjAwMDAwMCwgLTU0NS4wMDAwMDApIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0i57yW57uELTLlpIfku70tMTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0NS4wMDAwMDAsIDUzNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSJpbWFnZS3nrq3lpLQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjAwMDAwMCwgNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOC40OTU3ODI5NCwxLjYxNjQ1MTEgTDYuNDIzODg5MjUsNS4wNDY5ODgzMyBDNi4zMjc4ODYxMyw1LjIwNTk0NTQ1IDYuMzI3ODg2MTMsNS40MDUwMTQ3NyA2LjQyMzg4OTI1LDUuNTYzOTcxODkgTDguNDk1NzgyOTQsOC45OTQ1MDkxMiBDOC42Mzg1NDQwMSw5LjIzMDg4NTcxIDguNTYyNjUzNjQsOS41MzgyMzc1IDguMzI2Mjc3MDYsOS42ODA5OTg1NiBDOC4xNjc1NTcxNiw5Ljc3Njg1ODQgNy45Njg4MjE5NSw5Ljc3NzAxMTc1IDcuODA5OTU0MzEsOS42ODEzOTY5NyBMMS4yNTA5OTY2OSw1LjczMzg3NjE4IEMxLjAxNDQwMDA4LDUuNTkxNDgwMDcgMC45MzgwMzU0ODEsNS4yODQyNDU3NiAxLjA4MDQzMTU5LDUuMDQ3NjQ5MTQgQzEuMTIyNTE0OCw0Ljk3NzcyNjI4IDEuMTgxMDczODMsNC45MTkxNjcyNSAxLjI1MDk5NjY5LDQuODc3MDg0MDQgTDcuODA5OTU0MzEsMC45Mjk1NjMyNTMgQzguMDQ2NTUwOTMsMC43ODcxNjcxNDIgOC4zNTM3ODUyNCwwLjg2MzUzMTczOSA4LjQ5NjE4MTM1LDEuMTAwMTI4MzUgQzguNTkxNzk2MTMsMS4yNTg5OTYgOC41OTE2NDI3OCwxLjQ1NzczMTIgOC40OTU3ODI5NCwxLjYxNjQ1MTEgWiIgaWQ9IueureWktCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS4wMzkyMDAsIDUuMzA1NDgwKSBzY2FsZSgxLCAtMSkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtNS4wMzkyMDAsIC01LjMwNTQ4MCkgIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\") no-repeat;\n}\n.plugin-DoorLabelPlugin-cnt--customBrand:active, .plugin-DoorLabelPlugin-cnt--customBrand:focus {\n background: rgba(0, 0, 0, 0.5);\n color: rgba(249, 234, 193, 0.5);\n}</style>\n","<script lang=\"ts\">\n import classnames from 'classnames'\n import type { LabelItemProp } from './typings'\n\n export let props: LabelItemProp\n export let onClick: () => void\n\n let divElement\n let prevPanoIndexRef = 0\n const initPanoIndex = () => {\n const { left, top, inSight, panoIndex } = props\n if (!left || !top || !inSight) {\n return\n }\n if (!divElement) return\n const _width = (divElement.current.clientWidth / window.innerWidth) * 100\n const _height = (divElement.current.clientHeight / window.innerHeight) * 100\n if (left! <= _width / 2 || left! >= 100 - _width / 2) {\n return\n }\n if (top! <= _height / 2 || top! >= 100 - _height / 2) {\n return\n }\n const prevPanoIndex = prevPanoIndexRef\n if (panoIndex !== prevPanoIndex) {\n // 这里触发曝光埋点\n prevPanoIndexRef = panoIndex\n }\n }\n\n $: {\n initPanoIndex()\n }\n\n</script>\n\n<div\n bind:this={divElement}\n style={`left: ${props.left || 0}%;top: ${props.top || 0}%;opacity: ${props.inSight ? 1 : 0}`}\n class=\"plugin-DoorLabelPlugin-item\"\n>\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n class={classnames('plugin-DoorLabelPlugin-cnt', props.toward)}\n style={`transform: ${props.transform || 'initial'};pointer-events: ${props.inSight ? 'auto' : 'none'};opacity: ${\n props.inSight ? 1 : 0\n }`}\n data-camera-toward={props.cameraToward}\n on:click={(e) => {\n if (onClick) onClick()\n }}\n >\n <span class=\"plugin-DoorLabelPlugin-txt\">{props.name}</span>\n <i class=\"plugin-DoorLabelPlugin-icon\" />\n </div>\n</div>\n\n<style lang=\"scss\">\n .plugin-DoorLabelPlugin-item {\n position: absolute;\n left: 0;\n top: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n }\n\n .plugin-DoorLabelPlugin-cnt {\n position: absolute;\n top: 50%;\n left: 50%;\n border-radius: 2px;\n background: rgba(0, 0, 0, 0.35);\n line-height: 12px;\n padding: 6px;\n white-space: nowrap;\n font-size: 12px;\n font-style: normal;\n // pointer-events: auto;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: transform ease 1s, background ease 0.3s, color ease 0.3s;\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: -1px;\n left: -1px;\n bottom: -1px;\n right: -1px;\n border-radius: 2px;\n border: 1px solid rgba(0, 0, 0, 0);\n border-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAD///+l2Z/dAAAAAnRSTlMAIE397fAAAAAVSURBVAjXY2BjgCMQ+PABhIAASRwARxwD8fgzCQAAAAAASUVORK5CYII=')\n 4;\n transition: opacity ease 0.3s;\n }\n &:active,\n &:focus {\n background: rgba(0, 0, 0, 0.5);\n color: rgba(255, 255, 255, 0.5);\n }\n }\n\n .plugin-DoorLabelPlugin-icon {\n background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTBweCIgaGVpZ2h0PSIxMHB4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+aW1hZ2Ut566t5aS0PC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxyZWN0IGlkPSJwYXRoLTEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCI+PC9yZWN0PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNjYuMDYyMTk3NSUiIHkxPSI1MCUiIHgyPSItMS4xMzY4NjgzOGUtMTElIiB5Mj0iNTAlIiBpZD0ibGluZWFyR3JhZGllbnQtMyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjg1IiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iODQuMzM5NzMxJSIgeTE9IjUwJSIgeDI9IjIzLjQyODMzNzclIiB5Mj0iNTAlIiBpZD0ibGluZWFyR3JhZGllbnQtNCI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSLpobXpnaItMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IlZSLeWIhumXtOW8leWvvOagh+etvuWkh+S7vS0zIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzM5LjAwMDAwMCwgLTU0My4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9Iue8lue7hC0y5aSH5Lu9LTEyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDUuMDAwMDAwLCA1MzYuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iaW1hZ2Ut566t5aS0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNC4wMDAwMDAsIDcuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPG1hc2sgaWQ9Im1hc2stMiIgZmlsbD0id2hpdGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgIDwvbWFzaz4KICAgICAgICAgICAgICAgICAgICA8dXNlIGlkPSJCRyIgZmlsbC1vcGFjaXR5PSIwIiBmaWxsPSIjRDhEOEQ4IiBvcGFjaXR5PSIwLjUxMTQ2Mjk4NCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuOTM4ODY5OCwxLjE0Mzc2MTI5IEM4LjI1NDY1NDA0LDEuMjU3NTgwMzUgOC4zMTc4Mjg0LDEuMzAyMTY5OTggOC4zMTc3ODUyMSwxLjM1ODE1MjIzIEM4LjMxNzc1MDcyLDEuNDAyODQzMzUgOC4zMDU3NDkwNywxLjQ0NzUyNTI0IDguMjgxNzg0MTEsMS40ODcyMDUyMSBMOC4yODE3ODQxMSwxLjQ4NzIwNTIxIEw2LjIwOTg5MDQxLDQuOTE3NzQyNDUgQzYuMTM3ODg4MDgsNS4wMzY5NjAyOSA2LjEwMTg4NjkxLDUuMTcxMjIwMiA2LjEwMTg4NjkxLDUuMzA1NDgwMTEgQzYuMTAxODg2OTEsNS40Mzk3NDAwMiA2LjEzNzg4ODA4LDUuNTczOTk5OTQgNi4yMDk4OTA0MSw1LjY5MzIxNzc4IEw2LjIwOTg5MDQxLDUuNjkzMjE3NzggTDguMjgxNzg0MTEsOS4xMjM3NTUwMSBDOC4zMTc0NzQzOCw5LjE4Mjg0OTE2IDguMzI1ODMzMjIsOS4yNTA4MTUyIDguMzEwNDk1OTUsOS4zMTI5MzAyOCBDOC4yOTUxNTg2OCw5LjM3NTA0NTM2IDguMjU2MTI1MzEsOS40MzEzMDk0NyA4LjE5NzAzMTE3LDkuNDY2OTk5NzMgQzguMTU3MzUxMTksOS40OTA5NjQ2OSA4LjExMjY2OTMxLDkuNTAyOTY2MzQgOC4wNjc5NzgxOCw5LjUwMzAwMDgzIEM4LjAyMzI4NzA2LDkuNTAzMDM1MzEgNy45Nzg1ODY3MSw5LjQ5MTEwMjYzIDcuOTM4ODY5OCw5LjQ2NzE5ODkzIEw3LjkzODg2OTgsOS40NjcxOTg5MyBMMS4zNzk5MTIxOCw1LjUxOTY3ODE1IEMxLjMyMDc2MzAyLDUuNDg0MDc5MTIgMS4yODE2NDI4Nyw1LjQyNzg3NTMyIDEuMjY2MjA5NzcsNS4zNjU3ODM5OCBDMS4yNTQ2OTI1Niw1LjMxOTQ0NzMyIDEuMjU2MzY2OTgsNS4yNjk4MzE4MiAxLjI3Mjc1MzMzLDUuMjIzMDU0MDUgTDEuMjcyNzUzMzMsNS4yMjMwNTQwNSBaIiBpZD0i566t5aS0IiBzdHJva2U9InVybCgjbGluZWFyR3JhZGllbnQtNCkiIHN0cm9rZS13aWR0aD0iMC41IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTMpIiBtYXNrPSJ1cmwoI21hc2stMikiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuMDM5MjAwLCA1LjMwNTQ4MCkgc2NhbGUoMSwgLTEpIHJvdGF0ZSgtOTAuMDAwMDAwKSB0cmFuc2xhdGUoLTUuMDM5MjAwLCAtNS4zMDU0ODApICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=')\n no-repeat;\n background-size: 100%;\n display: inline-block;\n width: 10px;\n height: 10px;\n margin-left: 4px;\n transform-origin: center;\n }\n\n .plugin-DoorLabelPlugin-cnt[data-camera-toward='forward'] {\n &.left {\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n }\n }\n &.right {\n .plugin-DoorLabelPlugin-txt {\n order: 1;\n }\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 4px;\n order: 0;\n }\n }\n }\n .plugin-DoorLabelPlugin-cnt[data-camera-toward='right'] {\n &.forward {\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n }\n }\n &.back {\n .plugin-DoorLabelPlugin-txt {\n order: 1;\n }\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 4px;\n order: 0;\n }\n }\n }\n .plugin-DoorLabelPlugin-cnt[data-camera-toward='left'] {\n &.back {\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n }\n }\n &.forward {\n .plugin-DoorLabelPlugin-txt {\n order: 1;\n }\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 4px;\n order: 0;\n }\n }\n }\n .plugin-DoorLabelPlugin-cnt[data-camera-toward='back'] {\n &.right {\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n }\n }\n &.left {\n .plugin-DoorLabelPlugin-txt {\n order: 1;\n }\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 4px;\n order: 0;\n }\n }\n }\n\n .plugin-DoorLabelPlugin-cnt--customBrand {\n color: #f9eac1;\n .plugin-DoorLabelPlugin-icon {\n background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTBweCIgaGVpZ2h0PSI4cHgiIHZpZXdCb3g9IjAgMCAxMCA4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPueureWktDwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjEwLjYzODU4ODQlIiB5MT0iMCUiIHgyPSI5Ni41MTYxNDc0JSIgeTI9IjEyOS43MzEzNTQlIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkYyQ0MiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0VBRDA5QSIgb2Zmc2V0PSI0OC43MTQ0NDc4JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRDFCMTdFIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPC9kZWZzPgogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i5pyq5p2l5a625aSH5Lu9LTI1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzA1LjAwMDAwMCwgLTU0NS4wMDAwMDApIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0i57yW57uELTLlpIfku70tMTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0NS4wMDAwMDAsIDUzNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSJpbWFnZS3nrq3lpLQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjAwMDAwMCwgNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOC40OTU3ODI5NCwxLjYxNjQ1MTEgTDYuNDIzODg5MjUsNS4wNDY5ODgzMyBDNi4zMjc4ODYxMyw1LjIwNTk0NTQ1IDYuMzI3ODg2MTMsNS40MDUwMTQ3NyA2LjQyMzg4OTI1LDUuNTYzOTcxODkgTDguNDk1NzgyOTQsOC45OTQ1MDkxMiBDOC42Mzg1NDQwMSw5LjIzMDg4NTcxIDguNTYyNjUzNjQsOS41MzgyMzc1IDguMzI2Mjc3MDYsOS42ODA5OTg1NiBDOC4xNjc1NTcxNiw5Ljc3Njg1ODQgNy45Njg4MjE5NSw5Ljc3NzAxMTc1IDcuODA5OTU0MzEsOS42ODEzOTY5NyBMMS4yNTA5OTY2OSw1LjczMzg3NjE4IEMxLjAxNDQwMDA4LDUuNTkxNDgwMDcgMC45MzgwMzU0ODEsNS4yODQyNDU3NiAxLjA4MDQzMTU5LDUuMDQ3NjQ5MTQgQzEuMTIyNTE0OCw0Ljk3NzcyNjI4IDEuMTgxMDczODMsNC45MTkxNjcyNSAxLjI1MDk5NjY5LDQuODc3MDg0MDQgTDcuODA5OTU0MzEsMC45Mjk1NjMyNTMgQzguMDQ2NTUwOTMsMC43ODcxNjcxNDIgOC4zNTM3ODUyNCwwLjg2MzUzMTczOSA4LjQ5NjE4MTM1LDEuMTAwMTI4MzUgQzguNTkxNzk2MTMsMS4yNTg5OTYgOC41OTE2NDI3OCwxLjQ1NzczMTIgOC40OTU3ODI5NCwxLjYxNjQ1MTEgWiIgaWQ9IueureWktCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS4wMzkyMDAsIDUuMzA1NDgwKSBzY2FsZSgxLCAtMSkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtNS4wMzkyMDAsIC01LjMwNTQ4MCkgIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==')\n no-repeat;\n }\n &:active,\n &:focus {\n background: rgba(0, 0, 0, 0.5);\n color: rgba(249, 234, 193, 0.5);\n }\n }\n\n</style>\n","import type { Five } from '@realsee/five-webgpu'\nimport { Vector3 } from 'three/webgpu'\n\nexport function isTwoRectOverlaped(rect1, rect2) {\n // 两矩形的中心点水平及垂直距离\n const verticalDistance = Math.abs(rect1.top + rect1.height / 2 - rect2.top - rect2.height / 2)\n const horizontalDistance = Math.abs(rect1.left + rect1.width / 2 - rect2.left - rect2.width / 2)\n const verticalThreshold = (rect1.height + rect2.height) / 2\n const horizontalThroshold = (rect1.width + rect2.width) / 2\n if (verticalDistance > verticalThreshold && horizontalDistance > horizontalThroshold) {\n return false\n }\n return true\n}\n\nexport function getCameraToward(five: Five) {\n const { camera } = five\n const cameraDirection = camera.getWorldDirection(new Vector3())\n let angel = (Math.atan(cameraDirection.z / cameraDirection.x) * 180) / Math.PI\n let toward: 'right' | 'back' | 'left' | 'forward' | '' = ''\n if (cameraDirection.x < 0) angel += 180\n if (angel < 0) angel += 360\n\n if (angel > 315 || angel <= 45) {\n toward = 'right'\n } else if (angel > 45 && angel <= 135) {\n toward = 'back'\n } else if (angel > 135 && angel <= 225) {\n toward = 'left'\n } else if (angel > 225 && angel <= 315) {\n toward = 'forward'\n }\n\n return toward\n}\n\nexport function getDistance(p1, p2) {\n return Math.sqrt(Math.pow(p1.z - p2.z, 2) + Math.pow(p1.x - p2.x, 2))\n}\n\n// left、right、forward、back 是 roomLabel 的朝向\nexport function getToward(rad: number) {\n const pi_4 = Math.PI / 4\n if (rad > -pi_4 && rad <= pi_4) {\n return 'left'\n } else if (rad > pi_4 * 3 || rad <= -pi_4 * 3) {\n return 'right'\n } else if (rad > -pi_4 * 3 && rad <= -pi_4) {\n return 'forward'\n } else if (rad > pi_4 && rad <= pi_4 * 3) {\n return 'back'\n }\n return ''\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport type { BaseOptions, EventMap, State } from '../base/BasePlugin'\nimport type { FloorplanServerData, FloorplanServerRoomItem } from '../floorplan/typings/floorplanServerData'\nimport { Euler, Quaternion, Raycaster, Vector3 } from 'three/webgpu'\nimport * as BasePlugin from '../base/BasePlugin'\nimport DoorLabelItem from './DoorLabelItem.svelte'\nimport type { MountedComponent } from '../shared-utils/svelte/component.svelte'\nimport type { DoorLabel, DoorLabelConfig, LabelItemProp, NeverOverlapLabel } from './typings'\nimport { getCameraToward, getDistance, getToward, isTwoRectOverlaped } from './utils'\nimport { waitFiveModelLoaded } from '../shared-utils'\n\nimport { mountComponent } from '../shared-utils/svelte/component.svelte'\nconst defaultBaseOptions: BaseOptions = { userAction: true }\n\n/**\n * 分间标签插件\n * @author kyleju†\n */\nexport class PanoDoorLabelPluginController extends BasePlugin.Controller<State, EventMap<State>> {\n public state: State = { enabled: true, visible: true }\n private container!: HTMLElement\n private MinVisibledistance = 1.8\n private MaxVisibledistance = 5\n private OffsetHeight = -1.3 // 标签页面高度偏移值\n private disposed = false\n private loadGeneration = 0\n private listening = false\n private floorplanServerData: FloorplanServerData\n /** 每个点位 visible 标签的缓存 */\n private visibleLabelMap = new Map<number, number[]>()\n /** 标签项Prop值 */\n private labelItems: (LabelItemProp & { svelteApp?: MountedComponent<any> })[] = []\n /** 数据 */\n private doorLabels!: DoorLabel[]\n private roomObservers: {\n panoIndex: number\n floorIndex: number\n name: string\n }[]\n\n public constructor(five: Five) {\n super(five)\n five.once('dispose', this.dispose)\n }\n\n public loadData = async (floorplanServerData: FloorplanServerData, doorLabelConfig?: DoorLabelConfig) => {\n if (this.disposed) return\n const request = ++this.loadGeneration\n if (doorLabelConfig) {\n this.MaxVisibledistance = doorLabelConfig.MaxVisibledistance\n this.MinVisibledistance = doorLabelConfig.MinVisibledistance\n this.OffsetHeight = doorLabelConfig.OffsetHeight\n }\n this.labelItems.forEach((item) => item.svelteApp?.destroy())\n this.labelItems = []\n this.doorLabels = []\n\n this.floorplanServerData = structuredClone(floorplanServerData)\n await waitFiveModelLoaded(this.five)\n if (this.disposed || request !== this.loadGeneration) return\n this.initData()\n this.fixDoorVisibleAndPosition()\n this.applyState()\n }\n\n public appendTo(container: HTMLElement) {\n if (!this.state.enabled) return\n this.container = container\n }\n\n public setState(state: Partial<State>, options?: BaseOptions): void {\n if (this.disposed) return\n const prevState = this.state\n this.state = { ...prevState, ...state }\n\n const prevEnabled = prevState.enabled && prevState.visible\n const enabled = this.state.enabled && this.state.visible\n\n if (prevEnabled === enabled) return\n\n this.applyState()\n }\n\n public show() {\n this.setState({ visible: true })\n }\n\n public hide() {\n this.setState({ visible: false })\n }\n\n public enable() {\n this.setState({ enabled: true })\n }\n\n public disable() {\n this.setState({ enabled: false })\n }\n\n public stateChangedCallback(prevState: State, options?: BaseOptions) {\n if (this.hooks.hasListener('stateChange')) {\n const optionParams = {\n state: this.state,\n prevState,\n userAction: options ? options.userAction : defaultBaseOptions.userAction,\n }\n this.hooks.emit('stateChange', optionParams)\n }\n }\n\n public applyState(state?: State) {\n const _state = state ?? this.state\n const enabled = _state.enabled !== false && _state.visible !== false\n if (enabled) {\n this.labelItems.forEach((item) => {\n item.svelteApp = mountComponent(DoorLabelItem, this.container, {\n props: item,\n onClick: () => {\n this.onClick(item.name, item.position)\n },\n })\n })\n this.fixDoorPosition()\n } else {\n this.labelItems.forEach((item) => {\n item.svelteApp?.destroy()\n item.svelteApp = undefined\n })\n }\n }\n\n public initState(): State {\n return { enabled: true, visible: true }\n }\n\n public dispose = () => {\n if (this.disposed) return\n this.disposed = true\n this.loadGeneration += 1\n this.five.off('dispose', this.dispose)\n this.five?.off('wantsToMoveToPano', this.hideAllLabels)\n this.five?.off('modelLoaded', this.fixDoorVisibleAndPosition)\n this.five?.off('panoArrived', this.fixDoorVisibleAndPosition)\n this.five?.off('initAnimationEnded', this.fixDoorPosition)\n this.five?.off('cameraUpdate', this.fixDoorPosition)\n this.five?.off('mouseWheel', this.fixDoorPosition)\n this.five?.off('pinchGesture', this.fixDoorPosition)\n this.state.enabled = false\n this.applyState({ enabled: false })\n this.labelItems = []\n this.doorLabels = []\n }\n\n private initRoomObservers = () => {\n const floorDatas = this.floorplanServerData.computed_data.floor_datas || []\n const observers = this.five?.work?.observers || []\n const roomObservers = observers\n\n .map((ob) => {\n const panoIndex = ob.panoIndex\n const floorIndex = ob.floorIndex\n const floor = floorDatas?.find((d) => d.floor_index === floorIndex)\n if (floor) {\n const room = floor.rooms.find((r) => r.observer_indexs.includes(panoIndex))\n if (room) {\n return { panoIndex, floorIndex, name: room.name }\n }\n }\n })\n .filter(Boolean)\n this.roomObservers = roomObservers\n }\n\n private hideAllLabels = () => {\n this.labelItems.forEach((item) => {\n item.visible = false\n item.inSight = false\n })\n }\n\n private fixDoorVisibleAndPosition = () => {\n this.initRoomObservers()\n const { panoIndex } = this.five\n if (!this.state.visible) return\n if (this.five.model.empty) return\n if (panoIndex === null) return\n if (!this.roomObservers.find((item) => item.panoIndex === panoIndex)) return\n\n const roomObserver = this.roomObservers.find((item) => {\n return item.panoIndex === panoIndex\n })\n const position = this.five.work.observers.find((item) => item.panoIndex === panoIndex).position\n const targetPoint = position.clone()\n const visibleLabelIds = (() => {\n if (this.visibleLabelMap.has(panoIndex)) {\n /** 使用缓存 */\n return this.visibleLabelMap.get(panoIndex)!\n } else {\n const visibleDoorIds: number[] = []\n this.doorLabels.forEach((doorLabelItem, index) => {\n // step1 校验分间\n if (doorLabelItem.roomName === roomObserver.name) return\n // step2 校验最大最小值\n const doorPosition = doorLabelItem.position.clone()\n const distance = doorPosition.distanceTo(targetPoint)\n if (distance < this.MinVisibledistance || distance > this.MaxVisibledistance) return\n // step3 碰撞检测是否有遮挡\n const raycaster = new Raycaster()\n const direction = doorPosition.clone().sub(targetPoint).normalize()\n raycaster.set(targetPoint, direction)\n const [intersection] = this.five.model.intersectRaycaster(raycaster)\n if (intersection && intersection.distance + 0.1 < distance) return\n // 🥳 最终剩下的就是当前点位可见的标签\n visibleDoorIds.push(index)\n })\n this.visibleLabelMap.set(panoIndex, visibleDoorIds)\n return visibleDoorIds\n }\n })()\n this.labelItems.forEach((data, index) => {\n data.visible = visibleLabelIds.includes(index)\n })\n this.fixDoorPosition()\n }\n\n private fixDoorPosition = () => {\n if (!this.state.enabled) return\n if (!this.state.visible) return\n const { panoIndex, camera } = this.five\n if (panoIndex === null) return\n if (this.five.currentMode !== 'Panorama') return this.hideAllLabels()\n\n const fiveElement = this.five.getElement()\n const canvasWidth = fiveElement!.clientWidth\n const canvasHeight = fiveElement!.clientHeight\n const cameraDirection = camera.getWorldDirection(new Vector3())\n const neverOverlapLabels: NeverOverlapLabel[] = []\n\n this.labelItems.forEach((doorLabel, index) => {\n if (doorLabel.visible) {\n const disFromCameraToLabel = camera.position.distanceTo(doorLabel.position)\n const labelPosition = doorLabel.position.clone().add(new Vector3(0, this.OffsetHeight, 0))\n const direction = labelPosition.clone().sub(camera.position).normalize()\n const angle = direction.angleTo(cameraDirection)\n const mouse = labelPosition.clone().project(camera)\n const left = ((mouse.x + 1) / 2.2) * 100\n const top = ((-mouse.y + 1) / 2.2) * 100\n const visible =\n left >= 0 &&\n left <= 100 &&\n top >= 0 &&\n top <= 100 &&\n disFromCameraToLabel > this.MinVisibledistance &&\n disFromCameraToLabel <= this.MaxVisibledistance\n doorLabel.left = left\n doorLabel.top = top\n doorLabel.inSight = visible && angle < Math.PI / 2\n doorLabel.cameraToward = getCameraToward(this.five)\n if (visible) neverOverlapLabels.push({ disFromCameraToLabel, left, top, index })\n else doorLabel.transform = 'translate(-50%, -50%)'\n } else {\n doorLabel.inSight = false\n }\n\n const { svelteApp, ...props } = doorLabel\n\n doorLabel.svelteApp?.update({ props })\n })\n\n // 视线内多标签防重叠单独处理\n if (neverOverlapLabels.length > 1) {\n let heightLevel = 0\n neverOverlapLabels.sort((a, b) => b.disFromCameraToLabel - a.disFromCameraToLabel)\n\n for (let i = 1; i < neverOverlapLabels.length; i++) {\n const { index: idx1, left: l1, top: t1 } = neverOverlapLabels[i - 1]\n const { index: idx2, left: l2, top: t2 } = neverOverlapLabels[i]\n const rectDom1 = this.container.children[idx1]\n const rectDom2 = this.container.children[idx2]\n if (!rectDom1 || !rectDom2) return\n\n const rect1 = {\n left: (canvasWidth * l1) / 100,\n top: (canvasHeight * t1) / 100,\n width: rectDom1.children?.[0]?.clientWidth ?? 0,\n height: rectDom1.children?.[0]?.clientHeight ?? 0,\n }\n const rect2 = {\n left: (canvasWidth * l2) / 100,\n top: (canvasHeight * t2) / 100,\n width: rectDom2.children?.[0]?.clientWidth ?? 0,\n height: rectDom2.children?.[0]?.clientHeight ?? 0,\n }\n if (isTwoRectOverlaped(rect1, rect2)) {\n heightLevel++\n this.labelItems[idx1].transform = `translate(-50%, ${(heightLevel - 1) * 100 - 50}%)`\n this.labelItems[idx2].transform = `translate(-50%, ${heightLevel * 100 - 50}%)`\n }\n }\n }\n }\n\n private onClick = (roomName: string, position: Vector3) => {\n if (!this.roomObservers) return\n const { work } = this.five\n\n let nearestIndex\n let nearestVector\n let minDistance = Infinity\n for (const observer of work.observers) {\n const roomObserver = this.roomObservers.find((ro) => ro.panoIndex === observer.panoIndex && ro.name === roomName)\n if (roomObserver) {\n const observerPoint = observer.standingPosition\n const distance = position.distanceTo(observerPoint)\n if (distance < minDistance) {\n nearestIndex = observer.panoIndex\n nearestVector = observerPoint.clone().sub(position).normalize()\n minDistance = distance\n }\n }\n }\n\n if (nearestVector !== void 0 && nearestIndex !== void 0) {\n const options: Record<string, any> = {}\n if (minDistance > 0) {\n const fromVector = new Vector3(0, 0, -1)\n const toVector = nearestVector.clone()\n const quaternion = new Quaternion()\n quaternion.setFromUnitVectors(fromVector, toVector)\n const euler = new Euler()\n euler.setFromQuaternion(quaternion, 'YXZ')\n options.longitude = euler.y\n }\n const canceled = this.five.emit('wantsToMoveToPano', nearestIndex, {}, true)\n if (!canceled) {\n this.five.moveToPano(nearestIndex, { longitude: options.longitude })\n }\n }\n }\n\n private initData = () => {\n this.doorLabels = []\n this.labelItems.forEach((item) => item.svelteApp?.destroy())\n this.labelItems = []\n\n const currentPanoIndex = this.five.panoIndex\n const currentFloorIndex = this.floorplanServerData.computed_data.observers[currentPanoIndex].floor_index\n const currentFloor = this.floorplanServerData.computed_data.floor_datas[currentFloorIndex]\n this.floorplanServerData.computed_data.doors?.forEach((door) => {\n const observersInRoom = this.five.work.observers.filter((observer, index) => {\n if (currentFloor?.rooms?.find((room) => room.observer_indexs.includes(index))) return true\n return false\n })\n\n const doorPoint = door.position\n let minDistance = Infinity\n let nearestPoint: { x: number; y: number; z: number } | undefined\n\n // 遍历门所在房间所有的点,找到离门最近的点\n observersInRoom.forEach((observer) => {\n const position = observer.standingPosition\n const observerPoint = {\n x: position.x,\n y: position.y,\n z: position.z,\n }\n const distance = getDistance(doorPoint, observerPoint)\n if (distance < minDistance) {\n minDistance = distance\n nearestPoint = observerPoint\n }\n })\n if (nearestPoint) doorPoint.y = nearestPoint.y + 0.01\n const position = new Vector3(doorPoint.x, doorPoint.y, doorPoint.z)\n position.add(new Vector3(-0.2, 1.8, 0).applyEuler(new Euler(0, door.rad, 0)))\n this.doorLabels.push({\n roomName: door.name,\n name: door.name,\n position,\n toward: getToward(door.rad),\n })\n })\n\n this.labelItems = this.doorLabels.map((data) => ({\n ...data,\n left: 0,\n top: 0,\n visible: false,\n inSight: false,\n transform: '',\n cameraToward: '',\n }))\n\n if (!this.listening) {\n this.listening = true\n this.five.on('wantsToMoveToPano', this.hideAllLabels)\n this.five.on('panoArrived', this.fixDoorVisibleAndPosition)\n this.five.on('initAnimationEnded', this.fixDoorPosition)\n this.five.on('cameraUpdate', this.fixDoorPosition)\n this.five.on('mouseWheel', this.fixDoorPosition)\n this.five.on('pinchGesture', this.fixDoorPosition)\n }\n\n this.fixDoorVisibleAndPosition()\n }\n}\n","import type { Five, FivePlugin } from '@realsee/five-webgpu'\nimport type { FloorplanServerData } from '../floorplan'\nimport type { PanoDoorLabelPluginController } from './Controller'\nimport * as Controller from './Controller'\n\nexport type {\n FloorplanServerData,\n FloorplanServerRoomItem,\n} from '../floorplan/typings/floorplanServerData'\n\nconst PanoDoorLabelPlugin: FivePlugin<FloorplanServerData, PanoDoorLabelPluginController> = (\n five: Five,\n) => {\n return new Controller.PanoDoorLabelPluginController(five)\n}\nexport { PanoDoorLabelPlugin }\n\nexport default PanoDoorLabelPlugin\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pano-door-label-Bwvaf5xx.js","names":["$.from_html","$.prop","$.mutable_source","$.get","prevPanoIndex","$.child","$.only_child","$.set","$.deep_read_state","$.untrack","$.clsx","classnames","BasePlugin.Controller","Controller.PanoDoorLabelPluginController","__toESM","waitFiveModelLoaded","Controller","template_effect","only_child","child","event","append","from_html","set","deep_read_state","legacy_pre_effect","untrack","legacy_pre_effect_reset","mutable_source","set_attribute","clsx","push","set_text","bind_this","set_class","prop","init","next","set_style","pop","reset","mountComponent","get","require_classnames","import_classnames","root","DoorLabelItem","$$props","props","onClick","divElement","prevPanoIndexRef","initPanoIndex","left","top","inSight","_width","_height","panoIndex","div","div_1","span","text","$$value","$0","$$anchor","isTwoRectOverlaped","verticalDistance","rect1","rect2","horizontalDistance","verticalThreshold","horizontalThroshold","getCameraToward","five","cameraDirection","camera","Vector3","angel","toward","getDistance","p1","p2","getToward","pi_4","rad","defaultBaseOptions","PanoDoorLabelPluginController","request","doorLabelConfig","item","floorplanServerData","container","prevState","state","optionParams","options","_state","floorDatas","roomObservers","ob","floorIndex","floor","d","room","r","roomObserver","targetPoint","visibleLabelIds","visibleDoorIds","doorLabelItem","doorPosition","distance","raycaster","Raycaster","direction","intersection","index","fiveElement","canvasWidth","canvasHeight","neverOverlapLabels","doorLabel","disFromCameraToLabel","labelPosition","angle","mouse","visible","heightLevel","b","a","i","idx1","l1","t1","idx2","l2","t2","rectDom1","rectDom2","nearestIndex","nearestVector","minDistance","observer","work","ro","roomName","observerPoint","position","fromVector","toVector","quaternion","Quaternion","euler","Euler","currentPanoIndex","currentFloorIndex","currentFloor","observersInRoom","doorPoint","door","nearestPoint","data","PanoDoorLabelPlugin"],"sources":["../../src/PanoDoorLabelPlugin/DoorLabelItem.svelte","../../src/PanoDoorLabelPlugin/DoorLabelItem.svelte","../../src/PanoDoorLabelPlugin/utils.ts","../../src/PanoDoorLabelPlugin/Controller.ts","../../src/PanoDoorLabelPlugin/index.ts"],"sourcesContent":["<script lang=\"ts\">\n import classnames from 'classnames'\n import type { LabelItemProp } from './typings'\n\n export let props: LabelItemProp\n export let onClick: () => void\n\n let divElement\n let prevPanoIndexRef = 0\n const initPanoIndex = () => {\n const { left, top, inSight, panoIndex } = props\n if (!left || !top || !inSight) {\n return\n }\n if (!divElement) return\n const _width = (divElement.current.clientWidth / window.innerWidth) * 100\n const _height = (divElement.current.clientHeight / window.innerHeight) * 100\n if (left! <= _width / 2 || left! >= 100 - _width / 2) {\n return\n }\n if (top! <= _height / 2 || top! >= 100 - _height / 2) {\n return\n }\n const prevPanoIndex = prevPanoIndexRef\n if (panoIndex !== prevPanoIndex) {\n // 这里触发曝光埋点\n prevPanoIndexRef = panoIndex\n }\n }\n\n $: {\n initPanoIndex()\n }\n\n</script>\n\n<div\n bind:this={divElement}\n style={`left: ${props.left || 0}%;top: ${props.top || 0}%;opacity: ${props.inSight ? 1 : 0}`}\n class=\"plugin-DoorLabelPlugin-item\"\n>\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n class={classnames('plugin-DoorLabelPlugin-cnt', props.toward)}\n style={`transform: ${props.transform || 'initial'};pointer-events: ${props.inSight ? 'auto' : 'none'};opacity: ${\n props.inSight ? 1 : 0\n }`}\n data-camera-toward={props.cameraToward}\n on:click={(e) => {\n if (onClick) onClick()\n }}\n >\n <span class=\"plugin-DoorLabelPlugin-txt\">{props.name}</span>\n <i class=\"plugin-DoorLabelPlugin-icon\" />\n </div>\n</div>\n\n<style lang=\"scss\">.plugin-DoorLabelPlugin-item {\n position: absolute;\n left: 0;\n top: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n}\n\n.plugin-DoorLabelPlugin-cnt {\n position: absolute;\n top: 50%;\n left: 50%;\n border-radius: 0.125rem;\n background: rgba(0, 0, 0, 0.35);\n line-height: 0.75rem;\n padding: 0.375rem;\n white-space: nowrap;\n font-size: 0.75rem;\n font-style: normal;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: transform ease 1s, background ease 0.3s, color ease 0.3s;\n}\n.plugin-DoorLabelPlugin-cnt::after {\n content: \"\";\n display: block;\n position: absolute;\n top: -0.0625rem;\n left: -0.0625rem;\n bottom: -0.0625rem;\n right: -0.0625rem;\n border-radius: 0.125rem;\n border: 0.0625rem solid rgba(0, 0, 0, 0);\n border-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAD///+l2Z/dAAAAAnRSTlMAIE397fAAAAAVSURBVAjXY2BjgCMQ+PABhIAASRwARxwD8fgzCQAAAAAASUVORK5CYII=\") 4;\n transition: opacity ease 0.3s;\n}\n.plugin-DoorLabelPlugin-cnt:active, .plugin-DoorLabelPlugin-cnt:focus {\n background: rgba(0, 0, 0, 0.5);\n color: rgba(255, 255, 255, 0.5);\n}\n\n.plugin-DoorLabelPlugin-icon {\n background: url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTBweCIgaGVpZ2h0PSIxMHB4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+aW1hZ2Ut566t5aS0PC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxyZWN0IGlkPSJwYXRoLTEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCI+PC9yZWN0PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNjYuMDYyMTk3NSUiIHkxPSI1MCUiIHgyPSItMS4xMzY4NjgzOGUtMTElIiB5Mj0iNTAlIiBpZD0ibGluZWFyR3JhZGllbnQtMyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjg1IiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iODQuMzM5NzMxJSIgeTE9IjUwJSIgeDI9IjIzLjQyODMzNzclIiB5Mj0iNTAlIiBpZD0ibGluZWFyR3JhZGllbnQtNCI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSLpobXpnaItMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IlZSLeWIhumXtOW8leWvvOagh+etvuWkh+S7vS0zIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzM5LjAwMDAwMCwgLTU0My4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9Iue8lue7hC0y5aSH5Lu9LTEyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDUuMDAwMDAwLCA1MzYuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iaW1hZ2Ut566t5aS0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNC4wMDAwMDAsIDcuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPG1hc2sgaWQ9Im1hc2stMiIgZmlsbD0id2hpdGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgIDwvbWFzaz4KICAgICAgICAgICAgICAgICAgICA8dXNlIGlkPSJCRyIgZmlsbC1vcGFjaXR5PSIwIiBmaWxsPSIjRDhEOEQ4IiBvcGFjaXR5PSIwLjUxMTQ2Mjk4NCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuOTM4ODY5OCwxLjE0Mzc2MTI5IEM4LjI1NDY1NDA0LDEuMjU3NTgwMzUgOC4zMTc4Mjg0LDEuMzAyMTY5OTggOC4zMTc3ODUyMSwxLjM1ODE1MjIzIEM4LjMxNzc1MDcyLDEuNDAyODQzMzUgOC4zMDU3NDkwNywxLjQ0NzUyNTI0IDguMjgxNzg0MTEsMS40ODcyMDUyMSBMOC4yODE3ODQxMSwxLjQ4NzIwNTIxIEw2LjIwOTg5MDQxLDQuOTE3NzQyNDUgQzYuMTM3ODg4MDgsNS4wMzY5NjAyOSA2LjEwMTg4NjkxLDUuMTcxMjIwMiA2LjEwMTg4NjkxLDUuMzA1NDgwMTEgQzYuMTAxODg2OTEsNS40Mzk3NDAwMiA2LjEzNzg4ODA4LDUuNTczOTk5OTQgNi4yMDk4OTA0MSw1LjY5MzIxNzc4IEw2LjIwOTg5MDQxLDUuNjkzMjE3NzggTDguMjgxNzg0MTEsOS4xMjM3NTUwMSBDOC4zMTc0NzQzOCw5LjE4Mjg0OTE2IDguMzI1ODMzMjIsOS4yNTA4MTUyIDguMzEwNDk1OTUsOS4zMTI5MzAyOCBDOC4yOTUxNTg2OCw5LjM3NTA0NTM2IDguMjU2MTI1MzEsOS40MzEzMDk0NyA4LjE5NzAzMTE3LDkuNDY2OTk5NzMgQzguMTU3MzUxMTksOS40OTA5NjQ2OSA4LjExMjY2OTMxLDkuNTAyOTY2MzQgOC4wNjc5NzgxOCw5LjUwMzAwMDgzIEM4LjAyMzI4NzA2LDkuNTAzMDM1MzEgNy45Nzg1ODY3MSw5LjQ5MTEwMjYzIDcuOTM4ODY5OCw5LjQ2NzE5ODkzIEw3LjkzODg2OTgsOS40NjcxOTg5MyBMMS4zNzk5MTIxOCw1LjUxOTY3ODE1IEMxLjMyMDc2MzAyLDUuNDg0MDc5MTIgMS4yODE2NDI4Nyw1LjQyNzg3NTMyIDEuMjY2MjA5NzcsNS4zNjU3ODM5OCBDMS4yNTQ2OTI1Niw1LjMxOTQ0NzMyIDEuMjU2MzY2OTgsNS4yNjk4MzE4MiAxLjI3Mjc1MzMzLDUuMjIzMDU0MDUgTDEuMjcyNzUzMzMsNS4yMjMwNTQwNSBaIiBpZD0i566t5aS0IiBzdHJva2U9InVybCgjbGluZWFyR3JhZGllbnQtNCkiIHN0cm9rZS13aWR0aD0iMC41IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTMpIiBtYXNrPSJ1cmwoI21hc2stMikiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuMDM5MjAwLCA1LjMwNTQ4MCkgc2NhbGUoMSwgLTEpIHJvdGF0ZSgtOTAuMDAwMDAwKSB0cmFuc2xhdGUoLTUuMDM5MjAwLCAtNS4zMDU0ODApICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\") no-repeat;\n background-size: 100%;\n display: inline-block;\n width: 0.625rem;\n height: 0.625rem;\n margin-left: 0.25rem;\n transform-origin: center;\n}\n\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=forward].left .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=forward].right .plugin-DoorLabelPlugin-txt {\n order: 1;\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=forward].right .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 0.25rem;\n order: 0;\n}\n\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=right].forward .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=right].back .plugin-DoorLabelPlugin-txt {\n order: 1;\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=right].back .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 0.25rem;\n order: 0;\n}\n\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=left].back .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=left].forward .plugin-DoorLabelPlugin-txt {\n order: 1;\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=left].forward .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 0.25rem;\n order: 0;\n}\n\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=back].right .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=back].left .plugin-DoorLabelPlugin-txt {\n order: 1;\n}\n.plugin-DoorLabelPlugin-cnt[data-camera-toward=back].left .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 0.25rem;\n order: 0;\n}\n\n.plugin-DoorLabelPlugin-cnt--customBrand {\n color: #f9eac1;\n}\n.plugin-DoorLabelPlugin-cnt--customBrand .plugin-DoorLabelPlugin-icon {\n background: url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTBweCIgaGVpZ2h0PSI4cHgiIHZpZXdCb3g9IjAgMCAxMCA4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPueureWktDwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjEwLjYzODU4ODQlIiB5MT0iMCUiIHgyPSI5Ni41MTYxNDc0JSIgeTI9IjEyOS43MzEzNTQlIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkYyQ0MiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0VBRDA5QSIgb2Zmc2V0PSI0OC43MTQ0NDc4JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRDFCMTdFIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPC9kZWZzPgogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i5pyq5p2l5a625aSH5Lu9LTI1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzA1LjAwMDAwMCwgLTU0NS4wMDAwMDApIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0i57yW57uELTLlpIfku70tMTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0NS4wMDAwMDAsIDUzNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSJpbWFnZS3nrq3lpLQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjAwMDAwMCwgNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOC40OTU3ODI5NCwxLjYxNjQ1MTEgTDYuNDIzODg5MjUsNS4wNDY5ODgzMyBDNi4zMjc4ODYxMyw1LjIwNTk0NTQ1IDYuMzI3ODg2MTMsNS40MDUwMTQ3NyA2LjQyMzg4OTI1LDUuNTYzOTcxODkgTDguNDk1NzgyOTQsOC45OTQ1MDkxMiBDOC42Mzg1NDQwMSw5LjIzMDg4NTcxIDguNTYyNjUzNjQsOS41MzgyMzc1IDguMzI2Mjc3MDYsOS42ODA5OTg1NiBDOC4xNjc1NTcxNiw5Ljc3Njg1ODQgNy45Njg4MjE5NSw5Ljc3NzAxMTc1IDcuODA5OTU0MzEsOS42ODEzOTY5NyBMMS4yNTA5OTY2OSw1LjczMzg3NjE4IEMxLjAxNDQwMDA4LDUuNTkxNDgwMDcgMC45MzgwMzU0ODEsNS4yODQyNDU3NiAxLjA4MDQzMTU5LDUuMDQ3NjQ5MTQgQzEuMTIyNTE0OCw0Ljk3NzcyNjI4IDEuMTgxMDczODMsNC45MTkxNjcyNSAxLjI1MDk5NjY5LDQuODc3MDg0MDQgTDcuODA5OTU0MzEsMC45Mjk1NjMyNTMgQzguMDQ2NTUwOTMsMC43ODcxNjcxNDIgOC4zNTM3ODUyNCwwLjg2MzUzMTczOSA4LjQ5NjE4MTM1LDEuMTAwMTI4MzUgQzguNTkxNzk2MTMsMS4yNTg5OTYgOC41OTE2NDI3OCwxLjQ1NzczMTIgOC40OTU3ODI5NCwxLjYxNjQ1MTEgWiIgaWQ9IueureWktCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS4wMzkyMDAsIDUuMzA1NDgwKSBzY2FsZSgxLCAtMSkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtNS4wMzkyMDAsIC01LjMwNTQ4MCkgIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\") no-repeat;\n}\n.plugin-DoorLabelPlugin-cnt--customBrand:active, .plugin-DoorLabelPlugin-cnt--customBrand:focus {\n background: rgba(0, 0, 0, 0.5);\n color: rgba(249, 234, 193, 0.5);\n}</style>\n","<script lang=\"ts\">\n import classnames from 'classnames'\n import type { LabelItemProp } from './typings'\n\n export let props: LabelItemProp\n export let onClick: () => void\n\n let divElement\n let prevPanoIndexRef = 0\n const initPanoIndex = () => {\n const { left, top, inSight, panoIndex } = props\n if (!left || !top || !inSight) {\n return\n }\n if (!divElement) return\n const _width = (divElement.current.clientWidth / window.innerWidth) * 100\n const _height = (divElement.current.clientHeight / window.innerHeight) * 100\n if (left! <= _width / 2 || left! >= 100 - _width / 2) {\n return\n }\n if (top! <= _height / 2 || top! >= 100 - _height / 2) {\n return\n }\n const prevPanoIndex = prevPanoIndexRef\n if (panoIndex !== prevPanoIndex) {\n // 这里触发曝光埋点\n prevPanoIndexRef = panoIndex\n }\n }\n\n $: {\n initPanoIndex()\n }\n\n</script>\n\n<div\n bind:this={divElement}\n style={`left: ${props.left || 0}%;top: ${props.top || 0}%;opacity: ${props.inSight ? 1 : 0}`}\n class=\"plugin-DoorLabelPlugin-item\"\n>\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n class={classnames('plugin-DoorLabelPlugin-cnt', props.toward)}\n style={`transform: ${props.transform || 'initial'};pointer-events: ${props.inSight ? 'auto' : 'none'};opacity: ${\n props.inSight ? 1 : 0\n }`}\n data-camera-toward={props.cameraToward}\n on:click={(e) => {\n if (onClick) onClick()\n }}\n >\n <span class=\"plugin-DoorLabelPlugin-txt\">{props.name}</span>\n <i class=\"plugin-DoorLabelPlugin-icon\" />\n </div>\n</div>\n\n<style lang=\"scss\">\n .plugin-DoorLabelPlugin-item {\n position: absolute;\n left: 0;\n top: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n }\n\n .plugin-DoorLabelPlugin-cnt {\n position: absolute;\n top: 50%;\n left: 50%;\n border-radius: 2px;\n background: rgba(0, 0, 0, 0.35);\n line-height: 12px;\n padding: 6px;\n white-space: nowrap;\n font-size: 12px;\n font-style: normal;\n // pointer-events: auto;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: transform ease 1s, background ease 0.3s, color ease 0.3s;\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: -1px;\n left: -1px;\n bottom: -1px;\n right: -1px;\n border-radius: 2px;\n border: 1px solid rgba(0, 0, 0, 0);\n border-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAD///+l2Z/dAAAAAnRSTlMAIE397fAAAAAVSURBVAjXY2BjgCMQ+PABhIAASRwARxwD8fgzCQAAAAAASUVORK5CYII=')\n 4;\n transition: opacity ease 0.3s;\n }\n &:active,\n &:focus {\n background: rgba(0, 0, 0, 0.5);\n color: rgba(255, 255, 255, 0.5);\n }\n }\n\n .plugin-DoorLabelPlugin-icon {\n background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTBweCIgaGVpZ2h0PSIxMHB4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+aW1hZ2Ut566t5aS0PC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxyZWN0IGlkPSJwYXRoLTEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCI+PC9yZWN0PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNjYuMDYyMTk3NSUiIHkxPSI1MCUiIHgyPSItMS4xMzY4NjgzOGUtMTElIiB5Mj0iNTAlIiBpZD0ibGluZWFyR3JhZGllbnQtMyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjg1IiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iODQuMzM5NzMxJSIgeTE9IjUwJSIgeDI9IjIzLjQyODMzNzclIiB5Mj0iNTAlIiBpZD0ibGluZWFyR3JhZGllbnQtNCI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSLpobXpnaItMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IlZSLeWIhumXtOW8leWvvOagh+etvuWkh+S7vS0zIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzM5LjAwMDAwMCwgLTU0My4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9Iue8lue7hC0y5aSH5Lu9LTEyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMDUuMDAwMDAwLCA1MzYuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iaW1hZ2Ut566t5aS0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNC4wMDAwMDAsIDcuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPG1hc2sgaWQ9Im1hc2stMiIgZmlsbD0id2hpdGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgIDwvbWFzaz4KICAgICAgICAgICAgICAgICAgICA8dXNlIGlkPSJCRyIgZmlsbC1vcGFjaXR5PSIwIiBmaWxsPSIjRDhEOEQ4IiBvcGFjaXR5PSIwLjUxMTQ2Mjk4NCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuOTM4ODY5OCwxLjE0Mzc2MTI5IEM4LjI1NDY1NDA0LDEuMjU3NTgwMzUgOC4zMTc4Mjg0LDEuMzAyMTY5OTggOC4zMTc3ODUyMSwxLjM1ODE1MjIzIEM4LjMxNzc1MDcyLDEuNDAyODQzMzUgOC4zMDU3NDkwNywxLjQ0NzUyNTI0IDguMjgxNzg0MTEsMS40ODcyMDUyMSBMOC4yODE3ODQxMSwxLjQ4NzIwNTIxIEw2LjIwOTg5MDQxLDQuOTE3NzQyNDUgQzYuMTM3ODg4MDgsNS4wMzY5NjAyOSA2LjEwMTg4NjkxLDUuMTcxMjIwMiA2LjEwMTg4NjkxLDUuMzA1NDgwMTEgQzYuMTAxODg2OTEsNS40Mzk3NDAwMiA2LjEzNzg4ODA4LDUuNTczOTk5OTQgNi4yMDk4OTA0MSw1LjY5MzIxNzc4IEw2LjIwOTg5MDQxLDUuNjkzMjE3NzggTDguMjgxNzg0MTEsOS4xMjM3NTUwMSBDOC4zMTc0NzQzOCw5LjE4Mjg0OTE2IDguMzI1ODMzMjIsOS4yNTA4MTUyIDguMzEwNDk1OTUsOS4zMTI5MzAyOCBDOC4yOTUxNTg2OCw5LjM3NTA0NTM2IDguMjU2MTI1MzEsOS40MzEzMDk0NyA4LjE5NzAzMTE3LDkuNDY2OTk5NzMgQzguMTU3MzUxMTksOS40OTA5NjQ2OSA4LjExMjY2OTMxLDkuNTAyOTY2MzQgOC4wNjc5NzgxOCw5LjUwMzAwMDgzIEM4LjAyMzI4NzA2LDkuNTAzMDM1MzEgNy45Nzg1ODY3MSw5LjQ5MTEwMjYzIDcuOTM4ODY5OCw5LjQ2NzE5ODkzIEw3LjkzODg2OTgsOS40NjcxOTg5MyBMMS4zNzk5MTIxOCw1LjUxOTY3ODE1IEMxLjMyMDc2MzAyLDUuNDg0MDc5MTIgMS4yODE2NDI4Nyw1LjQyNzg3NTMyIDEuMjY2MjA5NzcsNS4zNjU3ODM5OCBDMS4yNTQ2OTI1Niw1LjMxOTQ0NzMyIDEuMjU2MzY2OTgsNS4yNjk4MzE4MiAxLjI3Mjc1MzMzLDUuMjIzMDU0MDUgTDEuMjcyNzUzMzMsNS4yMjMwNTQwNSBaIiBpZD0i566t5aS0IiBzdHJva2U9InVybCgjbGluZWFyR3JhZGllbnQtNCkiIHN0cm9rZS13aWR0aD0iMC41IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTMpIiBtYXNrPSJ1cmwoI21hc2stMikiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuMDM5MjAwLCA1LjMwNTQ4MCkgc2NhbGUoMSwgLTEpIHJvdGF0ZSgtOTAuMDAwMDAwKSB0cmFuc2xhdGUoLTUuMDM5MjAwLCAtNS4zMDU0ODApICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=')\n no-repeat;\n background-size: 100%;\n display: inline-block;\n width: 10px;\n height: 10px;\n margin-left: 4px;\n transform-origin: center;\n }\n\n .plugin-DoorLabelPlugin-cnt[data-camera-toward='forward'] {\n &.left {\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n }\n }\n &.right {\n .plugin-DoorLabelPlugin-txt {\n order: 1;\n }\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 4px;\n order: 0;\n }\n }\n }\n .plugin-DoorLabelPlugin-cnt[data-camera-toward='right'] {\n &.forward {\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n }\n }\n &.back {\n .plugin-DoorLabelPlugin-txt {\n order: 1;\n }\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 4px;\n order: 0;\n }\n }\n }\n .plugin-DoorLabelPlugin-cnt[data-camera-toward='left'] {\n &.back {\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n }\n }\n &.forward {\n .plugin-DoorLabelPlugin-txt {\n order: 1;\n }\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 4px;\n order: 0;\n }\n }\n }\n .plugin-DoorLabelPlugin-cnt[data-camera-toward='back'] {\n &.right {\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(90deg);\n }\n }\n &.left {\n .plugin-DoorLabelPlugin-txt {\n order: 1;\n }\n .plugin-DoorLabelPlugin-icon {\n transform: rotate(-90deg);\n margin-left: 0;\n margin-right: 4px;\n order: 0;\n }\n }\n }\n\n .plugin-DoorLabelPlugin-cnt--customBrand {\n color: #f9eac1;\n .plugin-DoorLabelPlugin-icon {\n background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTBweCIgaGVpZ2h0PSI4cHgiIHZpZXdCb3g9IjAgMCAxMCA4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPueureWktDwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjEwLjYzODU4ODQlIiB5MT0iMCUiIHgyPSI5Ni41MTYxNDc0JSIgeTI9IjEyOS43MzEzNTQlIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkYyQ0MiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0VBRDA5QSIgb2Zmc2V0PSI0OC43MTQ0NDc4JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRDFCMTdFIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPC9kZWZzPgogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i5pyq5p2l5a625aSH5Lu9LTI1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzA1LjAwMDAwMCwgLTU0NS4wMDAwMDApIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0i57yW57uELTLlpIfku70tMTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0NS4wMDAwMDAsIDUzNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSJpbWFnZS3nrq3lpLQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjAwMDAwMCwgNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOC40OTU3ODI5NCwxLjYxNjQ1MTEgTDYuNDIzODg5MjUsNS4wNDY5ODgzMyBDNi4zMjc4ODYxMyw1LjIwNTk0NTQ1IDYuMzI3ODg2MTMsNS40MDUwMTQ3NyA2LjQyMzg4OTI1LDUuNTYzOTcxODkgTDguNDk1NzgyOTQsOC45OTQ1MDkxMiBDOC42Mzg1NDQwMSw5LjIzMDg4NTcxIDguNTYyNjUzNjQsOS41MzgyMzc1IDguMzI2Mjc3MDYsOS42ODA5OTg1NiBDOC4xNjc1NTcxNiw5Ljc3Njg1ODQgNy45Njg4MjE5NSw5Ljc3NzAxMTc1IDcuODA5OTU0MzEsOS42ODEzOTY5NyBMMS4yNTA5OTY2OSw1LjczMzg3NjE4IEMxLjAxNDQwMDA4LDUuNTkxNDgwMDcgMC45MzgwMzU0ODEsNS4yODQyNDU3NiAxLjA4MDQzMTU5LDUuMDQ3NjQ5MTQgQzEuMTIyNTE0OCw0Ljk3NzcyNjI4IDEuMTgxMDczODMsNC45MTkxNjcyNSAxLjI1MDk5NjY5LDQuODc3MDg0MDQgTDcuODA5OTU0MzEsMC45Mjk1NjMyNTMgQzguMDQ2NTUwOTMsMC43ODcxNjcxNDIgOC4zNTM3ODUyNCwwLjg2MzUzMTczOSA4LjQ5NjE4MTM1LDEuMTAwMTI4MzUgQzguNTkxNzk2MTMsMS4yNTg5OTYgOC41OTE2NDI3OCwxLjQ1NzczMTIgOC40OTU3ODI5NCwxLjYxNjQ1MTEgWiIgaWQ9IueureWktCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS4wMzkyMDAsIDUuMzA1NDgwKSBzY2FsZSgxLCAtMSkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtNS4wMzkyMDAsIC01LjMwNTQ4MCkgIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==')\n no-repeat;\n }\n &:active,\n &:focus {\n background: rgba(0, 0, 0, 0.5);\n color: rgba(249, 234, 193, 0.5);\n }\n }\n\n</style>\n","import type { Five } from '@realsee/five-webgpu'\nimport { Vector3 } from 'three/webgpu'\n\nexport function isTwoRectOverlaped(rect1, rect2) {\n // 两矩形的中心点水平及垂直距离\n const verticalDistance = Math.abs(rect1.top + rect1.height / 2 - rect2.top - rect2.height / 2)\n const horizontalDistance = Math.abs(rect1.left + rect1.width / 2 - rect2.left - rect2.width / 2)\n const verticalThreshold = (rect1.height + rect2.height) / 2\n const horizontalThroshold = (rect1.width + rect2.width) / 2\n if (verticalDistance > verticalThreshold && horizontalDistance > horizontalThroshold) {\n return false\n }\n return true\n}\n\nexport function getCameraToward(five: Five) {\n const { camera } = five\n const cameraDirection = camera.getWorldDirection(new Vector3())\n let angel = (Math.atan(cameraDirection.z / cameraDirection.x) * 180) / Math.PI\n let toward: 'right' | 'back' | 'left' | 'forward' | '' = ''\n if (cameraDirection.x < 0) angel += 180\n if (angel < 0) angel += 360\n\n if (angel > 315 || angel <= 45) {\n toward = 'right'\n } else if (angel > 45 && angel <= 135) {\n toward = 'back'\n } else if (angel > 135 && angel <= 225) {\n toward = 'left'\n } else if (angel > 225 && angel <= 315) {\n toward = 'forward'\n }\n\n return toward\n}\n\nexport function getDistance(p1, p2) {\n return Math.sqrt(Math.pow(p1.z - p2.z, 2) + Math.pow(p1.x - p2.x, 2))\n}\n\n// left、right、forward、back 是 roomLabel 的朝向\nexport function getToward(rad: number) {\n const pi_4 = Math.PI / 4\n if (rad > -pi_4 && rad <= pi_4) {\n return 'left'\n } else if (rad > pi_4 * 3 || rad <= -pi_4 * 3) {\n return 'right'\n } else if (rad > -pi_4 * 3 && rad <= -pi_4) {\n return 'forward'\n } else if (rad > pi_4 && rad <= pi_4 * 3) {\n return 'back'\n }\n return ''\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport type { BaseOptions, EventMap, State } from '../base/BasePlugin'\nimport type { FloorplanServerData, FloorplanServerRoomItem } from '../floorplan/typings/floorplanServerData'\nimport { Euler, Quaternion, Raycaster, Vector3 } from 'three/webgpu'\nimport * as BasePlugin from '../base/BasePlugin'\nimport DoorLabelItem from './DoorLabelItem.svelte'\nimport type { MountedComponent } from '../shared-utils/svelte/component.svelte'\nimport type { DoorLabel, DoorLabelConfig, LabelItemProp, NeverOverlapLabel } from './typings'\nimport { getCameraToward, getDistance, getToward, isTwoRectOverlaped } from './utils'\nimport { waitFiveModelLoaded } from '../shared-utils'\n\nimport { mountComponent } from '../shared-utils/svelte/component.svelte'\nconst defaultBaseOptions: BaseOptions = { userAction: true }\n\n/**\n * 分间标签插件\n * @author kyleju†\n */\nexport class PanoDoorLabelPluginController extends BasePlugin.Controller<State, EventMap<State>> {\n public state: State = { enabled: true, visible: true }\n private container!: HTMLElement\n private MinVisibledistance = 1.8\n private MaxVisibledistance = 5\n private OffsetHeight = -1.3 // 标签页面高度偏移值\n private disposed = false\n private loadGeneration = 0\n private listening = false\n private floorplanServerData: FloorplanServerData\n /** 每个点位 visible 标签的缓存 */\n private visibleLabelMap = new Map<number, number[]>()\n /** 标签项Prop值 */\n private labelItems: (LabelItemProp & { svelteApp?: MountedComponent<any> })[] = []\n /** 数据 */\n private doorLabels!: DoorLabel[]\n private roomObservers: {\n panoIndex: number\n floorIndex: number\n name: string\n }[]\n\n public constructor(five: Five) {\n super(five)\n five.once('dispose', this.dispose)\n }\n\n public loadData = async (floorplanServerData: FloorplanServerData, doorLabelConfig?: DoorLabelConfig) => {\n if (this.disposed) return\n const request = ++this.loadGeneration\n if (doorLabelConfig) {\n this.MaxVisibledistance = doorLabelConfig.MaxVisibledistance\n this.MinVisibledistance = doorLabelConfig.MinVisibledistance\n this.OffsetHeight = doorLabelConfig.OffsetHeight\n }\n this.labelItems.forEach((item) => item.svelteApp?.destroy())\n this.labelItems = []\n this.doorLabels = []\n\n this.floorplanServerData = structuredClone(floorplanServerData)\n await waitFiveModelLoaded(this.five)\n if (this.disposed || request !== this.loadGeneration) return\n this.initData()\n this.fixDoorVisibleAndPosition()\n this.applyState()\n }\n\n public appendTo(container: HTMLElement) {\n if (!this.state.enabled) return\n this.container = container\n }\n\n public setState(state: Partial<State>, options?: BaseOptions): void {\n if (this.disposed) return\n const prevState = this.state\n this.state = { ...prevState, ...state }\n\n const prevEnabled = prevState.enabled && prevState.visible\n const enabled = this.state.enabled && this.state.visible\n\n if (prevEnabled === enabled) return\n\n this.applyState()\n }\n\n public show() {\n this.setState({ visible: true })\n }\n\n public hide() {\n this.setState({ visible: false })\n }\n\n public enable() {\n this.setState({ enabled: true })\n }\n\n public disable() {\n this.setState({ enabled: false })\n }\n\n public stateChangedCallback(prevState: State, options?: BaseOptions) {\n if (this.hooks.hasListener('stateChange')) {\n const optionParams = {\n state: this.state,\n prevState,\n userAction: options ? options.userAction : defaultBaseOptions.userAction,\n }\n this.hooks.emit('stateChange', optionParams)\n }\n }\n\n public applyState(state?: State) {\n const _state = state ?? this.state\n const enabled = _state.enabled !== false && _state.visible !== false\n if (enabled) {\n this.labelItems.forEach((item) => {\n item.svelteApp = mountComponent(DoorLabelItem, this.container, {\n props: item,\n onClick: () => {\n this.onClick(item.name, item.position)\n },\n })\n })\n this.fixDoorPosition()\n } else {\n this.labelItems.forEach((item) => {\n item.svelteApp?.destroy()\n item.svelteApp = undefined\n })\n }\n }\n\n public initState(): State {\n return { enabled: true, visible: true }\n }\n\n public dispose = () => {\n if (this.disposed) return\n this.disposed = true\n this.loadGeneration += 1\n this.five.off('dispose', this.dispose)\n this.five?.off('wantsToMoveToPano', this.hideAllLabels)\n this.five?.off('modelLoaded', this.fixDoorVisibleAndPosition)\n this.five?.off('panoArrived', this.fixDoorVisibleAndPosition)\n this.five?.off('initAnimationEnded', this.fixDoorPosition)\n this.five?.off('cameraUpdate', this.fixDoorPosition)\n this.five?.off('mouseWheel', this.fixDoorPosition)\n this.five?.off('pinchGesture', this.fixDoorPosition)\n this.state.enabled = false\n this.applyState({ enabled: false })\n this.labelItems = []\n this.doorLabels = []\n }\n\n private initRoomObservers = () => {\n const floorDatas = this.floorplanServerData.computed_data.floor_datas || []\n const observers = this.five?.work?.observers || []\n const roomObservers = observers\n\n .map((ob) => {\n const panoIndex = ob.panoIndex\n const floorIndex = ob.floorIndex\n const floor = floorDatas?.find((d) => d.floor_index === floorIndex)\n if (floor) {\n const room = floor.rooms.find((r) => r.observer_indexs.includes(panoIndex))\n if (room) {\n return { panoIndex, floorIndex, name: room.name }\n }\n }\n })\n .filter(Boolean)\n this.roomObservers = roomObservers\n }\n\n private hideAllLabels = () => {\n this.labelItems.forEach((item) => {\n item.visible = false\n item.inSight = false\n })\n }\n\n private fixDoorVisibleAndPosition = () => {\n this.initRoomObservers()\n const { panoIndex } = this.five\n if (!this.state.visible) return\n if (this.five.model.empty) return\n if (panoIndex === null) return\n if (!this.roomObservers.find((item) => item.panoIndex === panoIndex)) return\n\n const roomObserver = this.roomObservers.find((item) => {\n return item.panoIndex === panoIndex\n })\n const position = this.five.work.observers.find((item) => item.panoIndex === panoIndex).position\n const targetPoint = position.clone()\n const visibleLabelIds = (() => {\n if (this.visibleLabelMap.has(panoIndex)) {\n /** 使用缓存 */\n return this.visibleLabelMap.get(panoIndex)!\n } else {\n const visibleDoorIds: number[] = []\n this.doorLabels.forEach((doorLabelItem, index) => {\n // step1 校验分间\n if (doorLabelItem.roomName === roomObserver.name) return\n // step2 校验最大最小值\n const doorPosition = doorLabelItem.position.clone()\n const distance = doorPosition.distanceTo(targetPoint)\n if (distance < this.MinVisibledistance || distance > this.MaxVisibledistance) return\n // step3 碰撞检测是否有遮挡\n const raycaster = new Raycaster()\n const direction = doorPosition.clone().sub(targetPoint).normalize()\n raycaster.set(targetPoint, direction)\n const [intersection] = this.five.model.intersectRaycaster(raycaster)\n if (intersection && intersection.distance + 0.1 < distance) return\n // 🥳 最终剩下的就是当前点位可见的标签\n visibleDoorIds.push(index)\n })\n this.visibleLabelMap.set(panoIndex, visibleDoorIds)\n return visibleDoorIds\n }\n })()\n this.labelItems.forEach((data, index) => {\n data.visible = visibleLabelIds.includes(index)\n })\n this.fixDoorPosition()\n }\n\n private fixDoorPosition = () => {\n if (!this.state.enabled) return\n if (!this.state.visible) return\n const { panoIndex, camera } = this.five\n if (panoIndex === null) return\n if (this.five.currentMode !== 'Panorama') return this.hideAllLabels()\n\n const fiveElement = this.five.getElement()\n const canvasWidth = fiveElement!.clientWidth\n const canvasHeight = fiveElement!.clientHeight\n const cameraDirection = camera.getWorldDirection(new Vector3())\n const neverOverlapLabels: NeverOverlapLabel[] = []\n\n this.labelItems.forEach((doorLabel, index) => {\n if (doorLabel.visible) {\n const disFromCameraToLabel = camera.position.distanceTo(doorLabel.position)\n const labelPosition = doorLabel.position.clone().add(new Vector3(0, this.OffsetHeight, 0))\n const direction = labelPosition.clone().sub(camera.position).normalize()\n const angle = direction.angleTo(cameraDirection)\n const mouse = labelPosition.clone().project(camera)\n const left = ((mouse.x + 1) / 2.2) * 100\n const top = ((-mouse.y + 1) / 2.2) * 100\n const visible =\n left >= 0 &&\n left <= 100 &&\n top >= 0 &&\n top <= 100 &&\n disFromCameraToLabel > this.MinVisibledistance &&\n disFromCameraToLabel <= this.MaxVisibledistance\n doorLabel.left = left\n doorLabel.top = top\n doorLabel.inSight = visible && angle < Math.PI / 2\n doorLabel.cameraToward = getCameraToward(this.five)\n if (visible) neverOverlapLabels.push({ disFromCameraToLabel, left, top, index })\n else doorLabel.transform = 'translate(-50%, -50%)'\n } else {\n doorLabel.inSight = false\n }\n\n const { svelteApp, ...props } = doorLabel\n\n doorLabel.svelteApp?.update({ props })\n })\n\n // 视线内多标签防重叠单独处理\n if (neverOverlapLabels.length > 1) {\n let heightLevel = 0\n neverOverlapLabels.sort((a, b) => b.disFromCameraToLabel - a.disFromCameraToLabel)\n\n for (let i = 1; i < neverOverlapLabels.length; i++) {\n const { index: idx1, left: l1, top: t1 } = neverOverlapLabels[i - 1]\n const { index: idx2, left: l2, top: t2 } = neverOverlapLabels[i]\n const rectDom1 = this.container.children[idx1]\n const rectDom2 = this.container.children[idx2]\n if (!rectDom1 || !rectDom2) return\n\n const rect1 = {\n left: (canvasWidth * l1) / 100,\n top: (canvasHeight * t1) / 100,\n width: rectDom1.children?.[0]?.clientWidth ?? 0,\n height: rectDom1.children?.[0]?.clientHeight ?? 0,\n }\n const rect2 = {\n left: (canvasWidth * l2) / 100,\n top: (canvasHeight * t2) / 100,\n width: rectDom2.children?.[0]?.clientWidth ?? 0,\n height: rectDom2.children?.[0]?.clientHeight ?? 0,\n }\n if (isTwoRectOverlaped(rect1, rect2)) {\n heightLevel++\n this.labelItems[idx1].transform = `translate(-50%, ${(heightLevel - 1) * 100 - 50}%)`\n this.labelItems[idx2].transform = `translate(-50%, ${heightLevel * 100 - 50}%)`\n }\n }\n }\n }\n\n private onClick = (roomName: string, position: Vector3) => {\n if (!this.roomObservers) return\n const { work } = this.five\n\n let nearestIndex\n let nearestVector\n let minDistance = Infinity\n for (const observer of work.observers) {\n const roomObserver = this.roomObservers.find((ro) => ro.panoIndex === observer.panoIndex && ro.name === roomName)\n if (roomObserver) {\n const observerPoint = observer.standingPosition\n const distance = position.distanceTo(observerPoint)\n if (distance < minDistance) {\n nearestIndex = observer.panoIndex\n nearestVector = observerPoint.clone().sub(position).normalize()\n minDistance = distance\n }\n }\n }\n\n if (nearestVector !== void 0 && nearestIndex !== void 0) {\n const options: Record<string, any> = {}\n if (minDistance > 0) {\n const fromVector = new Vector3(0, 0, -1)\n const toVector = nearestVector.clone()\n const quaternion = new Quaternion()\n quaternion.setFromUnitVectors(fromVector, toVector)\n const euler = new Euler()\n euler.setFromQuaternion(quaternion, 'YXZ')\n options.longitude = euler.y\n }\n const canceled = this.five.emit('wantsToMoveToPano', nearestIndex, {}, true)\n if (!canceled) {\n this.five.moveToPano(nearestIndex, { longitude: options.longitude })\n }\n }\n }\n\n private initData = () => {\n this.doorLabels = []\n this.labelItems.forEach((item) => item.svelteApp?.destroy())\n this.labelItems = []\n\n const currentPanoIndex = this.five.panoIndex\n const currentFloorIndex = this.floorplanServerData.computed_data.observers[currentPanoIndex].floor_index\n const currentFloor = this.floorplanServerData.computed_data.floor_datas[currentFloorIndex]\n this.floorplanServerData.computed_data.doors?.forEach((door) => {\n const observersInRoom = this.five.work.observers.filter((observer, index) => {\n if (currentFloor?.rooms?.find((room) => room.observer_indexs.includes(index))) return true\n return false\n })\n\n const doorPoint = door.position\n let minDistance = Infinity\n let nearestPoint: { x: number; y: number; z: number } | undefined\n\n // 遍历门所在房间所有的点,找到离门最近的点\n observersInRoom.forEach((observer) => {\n const position = observer.standingPosition\n const observerPoint = {\n x: position.x,\n y: position.y,\n z: position.z,\n }\n const distance = getDistance(doorPoint, observerPoint)\n if (distance < minDistance) {\n minDistance = distance\n nearestPoint = observerPoint\n }\n })\n if (nearestPoint) doorPoint.y = nearestPoint.y + 0.01\n const position = new Vector3(doorPoint.x, doorPoint.y, doorPoint.z)\n position.add(new Vector3(-0.2, 1.8, 0).applyEuler(new Euler(0, door.rad, 0)))\n this.doorLabels.push({\n roomName: door.name,\n name: door.name,\n position,\n toward: getToward(door.rad),\n })\n })\n\n this.labelItems = this.doorLabels.map((data) => ({\n ...data,\n left: 0,\n top: 0,\n visible: false,\n inSight: false,\n transform: '',\n cameraToward: '',\n }))\n\n if (!this.listening) {\n this.listening = true\n this.five.on('wantsToMoveToPano', this.hideAllLabels)\n this.five.on('panoArrived', this.fixDoorVisibleAndPosition)\n this.five.on('initAnimationEnded', this.fixDoorPosition)\n this.five.on('cameraUpdate', this.fixDoorPosition)\n this.five.on('mouseWheel', this.fixDoorPosition)\n this.five.on('pinchGesture', this.fixDoorPosition)\n }\n\n this.fixDoorVisibleAndPosition()\n }\n}\n","import type { Five, FivePlugin } from '@realsee/five-webgpu'\nimport type { FloorplanServerData } from '../floorplan'\nimport type { PanoDoorLabelPluginController } from './Controller'\nimport * as Controller from './Controller'\n\nexport type {\n FloorplanServerData,\n FloorplanServerRoomItem,\n} from '../floorplan/typings/floorplanServerData'\n\nconst PanoDoorLabelPlugin: FivePlugin<FloorplanServerData, PanoDoorLabelPluginController> = (\n five: Five,\n) => {\n return new Controller.PanoDoorLabelPluginController(five)\n}\nexport { PanoDoorLabelPlugin }\n\nexport default PanoDoorLabelPlugin\n"],"mappings":";;;;;;;;ACAA,SAAA8C,EAAA,GAAA,GAAA;;CAIS,IAAIE,IAAO/C,EAAA8C,GAAA,SAAA,CAAA,GACPE,IAAehD,EAAA8C,GAAA,WAAA,CAAA,GAEtBG,IAAAhD,EAAA,GACAiD,IAAmB,GACjBC,UAAsB;EAC1B,IAAM,EAAE,SAAM,QAAK,YAAS,iBAAcJ,EAAA;EAI1C,IAHI,CAACK,KAAQ,CAACC,KAAO,CAACC,KAGlB,CAACpD,EAAA+C,CAAU,GAAE;EACjB,IAAMM,IAASrD,EAAC+C,CAAU,CAAA,CAAC,QAAQ,cAAc,OAAO,aAAc,KAChEO,IAAUtD,EAAC+C,CAAU,CAAA,CAAC,QAAQ,eAAe,OAAO,cAAe;EACzE,AAAIG,KAASG,IAAS,KAAKH,KAAS,MAAMG,IAAS,KAG/CF,KAAQG,IAAU,KAAKH,KAAQ,MAAMG,IAAU,KAI/CC,MAActD,MAEhB,IAAmBsD;CAEvB;;EAGE,EAAa;;CAKhB,IAAAC,IAAAd,EAAA,GAMEe,IAAAvD,EANFsD,CAAA,GAgBIE,IAAIxD,EAVNuD,CAAA,GAUEE,IAAAxD,EAAAuD,GAAI,EAAA;OAVNrB,EAAAoB,CAAA,GANFpB,EAAAmB,CAAA,GAAA1B,EAAA0B,IAAA,MAAApD,EACY2C,GAAUa,CAAA,SAAA5D,EAAV+C,CAAU,CAAA;EAjCV,AAgCZZ,EAAAqB,IAhCYnD,EAAAwC,EAAO,CAAA,GAkCXvC,QAAA,SAASuC,EAAK,CAAA,CAAC,QAAQ,EAAC,SAAUA,EAAK,CAAA,CAAC,OAAO,EAAC,aAAc,KAAK,CAAA,CAAC,SAAiB,EAAA,GAI3Fd,EAAA0B,GAAA,GAAAI,GAAA,eAAA,GAAA1B,EAAAsB,IAtCUpD,EAAAwC,EAAO,CAAA,GAwCTvC,QAAA,cAAcuC,EAAK,CAAA,CAAC,aAAa,UAAS,mBAAoBA,EAAK,CAAA,CAAC,UAAU,SAAS,OAAM,YAClG,KAAK,CAAA,CAAC,SACN,EAAA,GAJHnB,EAAA+B,GAAA,uBAtCUpD,EAAAwC,EAAO,CAAA,GA2CIvC,QAAAuC,EAAK,CAAA,CAAC,YAAY,EAAA,GA3C7BhB,EAAA8B,IAAAtD,EAAAwC,EAAO,CAAA,GAAAvC,QAgD0BuC,EAAK,CAAA,CAAC,IAAI,EAAA;CAnD/CxC,GAAAA,OAAAA,GAAAA,EAAAG,EAAAA,OAAU,GAGNH,EAAAwC,EAAO,CAAA,GAuCTvC,SAAAA,GAAAE,EAAAA,QAAAA,CAAW,8BAA8BqC,EAAK,CAAA,CAAC,MAAM,CAAC,EAAA,CAAA,CAAA,GAD9D5B,EAAA,SAAAwC,IAMY,MAAM;EACf,AAAIX,EAAO,KAAEA,EAAO,CAAA,CAAA;CACtB,CAAC,GAdJ5B,EAAA4C,GAAAN,CAAA;AAFO;;;AC/BR,SAAgBO,EAAmB,GAAO,GAAO;CAE/C,IAAMC,IAAmB,KAAK,IAAIC,EAAM,MAAMA,EAAM,SAAS,IAAIC,EAAM,MAAMA,EAAM,SAAS,CAAC,GACvFC,IAAqB,KAAK,IAAIF,EAAM,OAAOA,EAAM,QAAQ,IAAIC,EAAM,OAAOA,EAAM,QAAQ,CAAC,GACzFE,KAAqBH,EAAM,SAASC,EAAM,UAAU,GACpDG,KAAuBJ,EAAM,QAAQC,EAAM,SAAS;CAI1D,OAHA,EAAIF,IAAmBI,KAAqBD,IAAqBE;AAInE;AAEA,SAAgBC,EAAgB,GAAY;CAC1C,IAAM,EAAE,cAAWC,GACbC,IAAkBC,EAAO,kBAAkB,IAAIC,EAAQ,CAAC,GAC1DC,IAAS,KAAK,KAAKH,EAAgB,IAAIA,EAAgB,CAAC,IAAI,MAAO,KAAK,IACxEI,IAAqD;CAczD,OAbIJ,EAAgB,IAAI,MAAG,KAAS,MAChCG,IAAQ,MAAG,KAAS,MAEpBA,IAAQ,OAAOA,KAAS,KAC1B,IAAS,UACAA,IAAQ,MAAMA,KAAS,MAChC,IAAS,SACAA,IAAQ,OAAOA,KAAS,MACjC,IAAS,SACAA,IAAQ,OAAOA,KAAS,QACjC,IAAS,YAGJC;AACT;AAEA,SAAgBC,EAAY,GAAI,GAAI;CAClC,OAAO,KAAK,MAAcC,EAAG,IAAIC,EAAG,MAAG,KAAcD,EAAG,IAAIC,EAAG,MAAG,CAAE;AACtE;AAGA,SAAgBC,EAAU,GAAa;CACrC,IAAMC,IAAO,KAAK,KAAK;CAUvB,OATIC,IAAM,CAACD,KAAQC,KAAOD,IACjB,SACEC,IAAMD,IAAO,KAAKC,KAAO,CAACD,IAAO,IACnC,UACEC,IAAM,CAACD,IAAO,KAAKC,KAAO,CAACD,IAC7B,YACEC,IAAMD,KAAQC,KAAOD,IAAO,IAC9B,SAEF;AACT;;;ACzCA,IAAME,IAAkC,EAAE,YAAY,GAAK,GAM9CC,IAAb,cAAmD3E,EAA8C;CAC/F,QAAsB;EAAE,SAAS;EAAM,SAAS;CAAK;CACrD;CACA,qBAA6B;CAC7B,qBAA6B;CAC7B,eAAuB;CACvB,WAAmB;CACnB,iBAAyB;CACzB,YAAoB;CACpB;CAEA,kCAA0B,IAAI,IAAsB;CAEpD,aAAgF,CAAC;CAEjF;CACA;CAMA,YAAmB,GAAY;EAE7B,AADA,MAAM8D,CAAI,GACVA,EAAK,KAAK,WAAW,KAAK,OAAO;CACnC;CAEA,WAAkB,OAAO,GAA0C,MAAsC;EACvG,IAAI,KAAK,UAAU;EACnB,IAAMc,IAAU,EAAE,KAAK;EAYvB,AAXIC,MACF,KAAK,qBAAqBA,EAAgB,oBAC1C,KAAK,qBAAqBA,EAAgB,oBAC1C,KAAK,eAAeA,EAAgB,eAEtC,KAAK,WAAW,SAAS,MAASC,EAAK,WAAW,QAAQ,CAAC,GAC3D,KAAK,aAAa,CAAC,GACnB,KAAK,aAAa,CAAC,GAEnB,KAAK,sBAAsB,gBAAgBC,CAAmB,GAC9D,MAAM5E,EAAoB,KAAK,IAAI,GAC/B,OAAK,YAAYyE,MAAY,KAAK,oBACtC,KAAK,SAAS,GACd,KAAK,0BAA0B,GAC/B,KAAK,WAAW;CAClB;CAEA,SAAgB,GAAwB;EACtC,AAAK,KAAK,MAAM,YAChB,KAAK,YAAYI;CACnB;CAEA,SAAgB,GAAuB,GAA6B;EAClE,IAAI,KAAK,UAAU;EACnB,IAAMC,IAAY,KAAK;EAMvB,AALA,KAAK,QAAQ;GAAE,GAAGA;GAAW,GAAGC;EAAM,IAElBD,EAAU,WAAWA,EAAU,cACnC,KAAK,MAAM,WAAW,KAAK,MAAM,YAIjD,KAAK,WAAW;CAClB;CAEA,OAAc;EACZ,KAAK,SAAS,EAAE,SAAS,GAAK,CAAC;CACjC;CAEA,OAAc;EACZ,KAAK,SAAS,EAAE,SAAS,GAAM,CAAC;CAClC;CAEA,SAAgB;EACd,KAAK,SAAS,EAAE,SAAS,GAAK,CAAC;CACjC;CAEA,UAAiB;EACf,KAAK,SAAS,EAAE,SAAS,GAAM,CAAC;CAClC;CAEA,qBAA4B,GAAkB,GAAuB;EACnE,IAAI,KAAK,MAAM,YAAY,aAAa,GAAG;GACzC,IAAME,IAAe;IACnB,OAAO,KAAK;IACZ;IACA,YAAYC,IAAUA,EAAQ,aAAaV,EAAmB;GAChE;GACA,KAAK,MAAM,KAAK,eAAeS,CAAY;EAC7C;CACF;CAEA,WAAkB,GAAe;EAC/B,IAAME,IAASH,KAAS,KAAK;EAE7B,AADgBG,EAAO,YAAY,MAASA,EAAO,YAAY,MAE7D,KAAK,WAAW,SAAS,MAAS;GAChC,EAAK,YAAYxD,EAAeK,GAAe,KAAK,WAAW;IAC3D,OAAO4C;IACP,eAAe;KACb,KAAK,QAAQA,EAAK,MAAMA,EAAK,QAAQ;IACvC;GACF,CAAC;EACL,CAAC,GACD,KAAK,gBAAgB,KAErB,KAAK,WAAW,SAAS,MAAS;GAEhC,AADAA,EAAK,WAAW,QAAQ,GACxB,EAAK,YAAY,KAAA;EACnB,CAAC;CAEL;CAEA,YAA0B;EACxB,OAAO;GAAE,SAAS;GAAM,SAAS;EAAK;CACxC;CAEA,gBAAuB;EACrB,AAAI,KAAK,aACT,KAAK,WAAW,IAChB,KAAK,kBAAkB,GACvB,KAAK,KAAK,IAAI,WAAW,KAAK,OAAO,GACrC,KAAK,MAAM,IAAI,qBAAqB,KAAK,aAAa,GACtD,KAAK,MAAM,IAAI,eAAe,KAAK,yBAAyB,GAC5D,KAAK,MAAM,IAAI,eAAe,KAAK,yBAAyB,GAC5D,KAAK,MAAM,IAAI,sBAAsB,KAAK,eAAe,GACzD,KAAK,MAAM,IAAI,gBAAgB,KAAK,eAAe,GACnD,KAAK,MAAM,IAAI,cAAc,KAAK,eAAe,GACjD,KAAK,MAAM,IAAI,gBAAgB,KAAK,eAAe,GACnD,KAAK,MAAM,UAAU,IACrB,KAAK,WAAW,EAAE,SAAS,GAAM,CAAC,GAClC,KAAK,aAAa,CAAC,GACnB,KAAK,aAAa,CAAC;CACrB;CAEA,0BAAkC;EAChC,IAAMQ,IAAa,KAAK,oBAAoB,cAAc,eAAe,CAAC,GAEpEC,KADY,KAAK,MAAM,MAAM,aAAa,CAAC,EAAA,CAG9C,KAAK,MAAO;GACX,IAAMzC,IAAY0C,EAAG,WACfC,IAAaD,EAAG,YAChBE,IAAQJ,GAAY,MAAM,MAAMK,EAAE,gBAAgBF,CAAU;GAClE,IAAIC,GAAO;IACT,IAAME,IAAOF,EAAM,MAAM,MAAM,MAAMG,EAAE,gBAAgB,SAAS/C,CAAS,CAAC;IAC1E,IAAI8C,GACF,OAAO;KAAE;KAAW;KAAY,MAAMA,EAAK;IAAK;GAEpD;EACF,CAAC,CAAC,CACD,OAAO,OAAO;EACjB,KAAK,gBAAgBL;CACvB;CAEA,sBAA8B;EAC5B,KAAK,WAAW,SAAS,MAAS;GAEhC,AADA,EAAK,UAAU,IACf,EAAK,UAAU;EACjB,CAAC;CACH;CAEA,kCAA0C;EACxC,KAAK,kBAAkB;EACvB,IAAM,EAAE,iBAAc,KAAK;EAI3B,IAHI,CAAC,KAAK,MAAM,WACZ,KAAK,KAAK,MAAM,SAChBzC,MAAc,QACd,CAAC,KAAK,cAAc,MAAM,MAASgC,EAAK,cAAchC,CAAS,GAAG;EAEtE,IAAMgD,IAAe,KAAK,cAAc,MAAM,MACrChB,EAAK,cAAchC,CAC3B,GAEKiD,IADW,KAAK,KAAK,KAAK,UAAU,MAAM,MAASjB,EAAK,cAAchC,CAAS,CAAC,CAAC,SAC1D,MAAM,GAC7BkD,WAAyB;GAC7B,IAAI,KAAK,gBAAgB,IAAIlD,CAAS,GAEpC,OAAO,KAAK,gBAAgB,IAAIA,CAAS;GACpC;IACL,IAAMmD,IAA2B,CAAC;IAkBlC,OAjBA,KAAK,WAAW,SAAS,GAAe,MAAU;KAEhD,IAAIC,EAAc,aAAaJ,EAAa,MAAM;KAElD,IAAMK,IAAeD,EAAc,SAAS,MAAM,GAC5CE,IAAWD,EAAa,WAAWJ,CAAW;KACpD,IAAIK,IAAW,KAAK,sBAAsBA,IAAW,KAAK,oBAAoB;KAE9E,IAAMC,IAAY,IAAIC,EAAU,GAC1BC,IAAYJ,EAAa,MAAM,CAAC,CAAC,IAAIJ,CAAW,CAAC,CAAC,UAAU;KAClE,EAAU,IAAIA,GAAaQ,CAAS;KACpC,IAAM,CAACC,KAAgB,KAAK,KAAK,MAAM,mBAAmBH,CAAS;KACnE,AAAIG,KAAgBA,EAAa,WAAW,KAAMJ,KAElDH,EAAe,KAAKQ,CAAK;IAC3B,CAAC,GACD,KAAK,gBAAgB,IAAI3D,GAAWmD,CAAc,GAC3CA;GACT;EACF,EAAA,CAAG;EAIH,AAHA,KAAK,WAAW,SAAS,GAAM,MAAU;GACvC,EAAK,UAAUD,EAAgB,SAASS,CAAK;EAC/C,CAAC,GACD,KAAK,gBAAgB;CACvB;CAEA,wBAAgC;EAE9B,IADI,CAAC,KAAK,MAAM,WACZ,CAAC,KAAK,MAAM,SAAS;EACzB,IAAM,EAAE,cAAW,cAAW,KAAK;EACnC,IAAI3D,MAAc,MAAM;EACxB,IAAI,KAAK,KAAK,gBAAgB,YAAY,OAAO,KAAK,cAAc;EAEpE,IAAM4D,IAAc,KAAK,KAAK,WAAW,GACnCC,IAAcD,EAAa,aAC3BE,IAAeF,EAAa,cAC5B3C,IAAkBC,EAAO,kBAAkB,IAAIC,EAAQ,CAAC,GACxD4C,IAA0C,CAAC;EAkCjD,IAhCA,KAAK,WAAW,SAAS,GAAW,MAAU;GAC5C,IAAIC,EAAU,SAAS;IACrB,IAAMC,IAAuB/C,EAAO,SAAS,WAAW8C,EAAU,QAAQ,GACpEE,IAAgBF,EAAU,SAAS,MAAM,CAAC,CAAC,IAAI,IAAI7C,EAAQ,GAAG,KAAK,cAAc,CAAC,CAAC,GAEnFgD,IADYD,EAAc,MAAM,CAAC,CAAC,IAAIhD,EAAO,QAAQ,CAAC,CAAC,UAC/C,CAAA,CAAU,QAAQD,CAAe,GACzCmD,IAAQF,EAAc,MAAM,CAAC,CAAC,QAAQhD,CAAM,GAC5CvB,KAASyE,EAAM,IAAI,KAAK,MAAO,KAC/BxE,KAAQ,CAACwE,EAAM,IAAI,KAAK,MAAO,KAC/BC,IACJ1E,KAAQ,KACRA,KAAQ,OACRC,KAAO,KACPA,KAAO,OACPqE,IAAuB,KAAK,sBAC5BA,KAAwB,KAAK;IAK/B,AAJA,EAAU,OAAOtE,GACjB,EAAU,MAAMC,GAChB,EAAU,UAAUyE,KAAWF,IAAQ,KAAK,KAAK,GACjD,EAAU,eAAepD,EAAgB,KAAK,IAAI,GAC9CsD,IAASN,EAAmB,KAAK;KAAE;KAAsB;KAAM;KAAK;IAAM,CAAC,IAC1E,EAAU,YAAY;GAC7B,OACE,EAAU,UAAU;GAGtB,IAAM,EAAE,cAAW,GAAGzE,MAAU0E;GAEhC,EAAU,WAAW,OAAO,EAAE,SAAM,CAAC;EACvC,CAAC,GAGGD,EAAmB,SAAS,GAAG;GACjC,IAAIO,IAAc;GAClB,EAAmB,MAAM,GAAG,MAAMC,EAAE,uBAAuBC,EAAE,oBAAoB;GAEjF,KAAK,IAAIC,IAAI,GAAGA,IAAIV,EAAmB,QAAQ,KAAK;IAClD,IAAM,EAAE,OAAOW,GAAM,MAAMC,GAAI,KAAKC,MAAOb,EAAmBU,IAAI,IAC5D,EAAE,OAAOI,GAAM,MAAMC,GAAI,KAAKC,MAAOhB,EAAmBU,IACxDO,IAAW,KAAK,UAAU,SAASN,IACnCO,IAAW,KAAK,UAAU,SAASJ;IACzC,IAAI,CAACG,KAAY,CAACC,GAAU;IAc5B,AAAIzE,EAAmB;KAXrB,MAAOqD,IAAcc,IAAM;KAC3B,KAAMb,IAAec,IAAM;KAC3B,OAAOI,EAAS,WAAW,EAAE,EAAE,eAAe;KAC9C,QAAQA,EAAS,WAAW,EAAE,EAAE,gBAAgB;IAQ3B,GAAO;KAL5B,MAAOnB,IAAciB,IAAM;KAC3B,KAAMhB,IAAeiB,IAAM;KAC3B,OAAOE,EAAS,WAAW,EAAE,EAAE,eAAe;KAC9C,QAAQA,EAAS,WAAW,EAAE,EAAE,gBAAgB;IAEpB,CAAK,MACjC,KACA,KAAK,WAAWP,EAAK,CAAC,YAAY,oBAAoBJ,IAAc,KAAK,MAAM,GAAG,KAClF,KAAK,WAAWO,EAAK,CAAC,YAAY,mBAAmBP,IAAc,MAAM,GAAG;GAEhF;EACF;CACF;CAEA,WAAmB,GAAkB,MAAsB;EACzD,IAAI,CAAC,KAAK,eAAe;EACzB,IAAM,EAAE,YAAS,KAAK,MAElBY,GACAC,GACAC,IAAc;EAClB,KAAK,IAAMC,KAAYC,EAAK,WAE1B,IADqB,KAAK,cAAc,MAAM,MAAOC,EAAG,cAAcF,EAAS,aAAaE,EAAG,SAASC,CACpG,GAAc;GAChB,IAAMC,IAAgBJ,EAAS,kBACzB/B,IAAWoC,EAAS,WAAWD,CAAa;GAClD,AAAInC,IAAW8B,MACb,IAAeC,EAAS,WACxB,IAAgBI,EAAc,MAAM,CAAC,CAAC,IAAIC,CAAQ,CAAC,CAAC,UAAU,GAC9D,IAAcpC;EAElB;EAGF,IAAI6B,MAAkB,KAAK,KAAKD,MAAiB,KAAK,GAAG;GACvD,IAAM5C,IAA+B,CAAC;GACtC,IAAI8C,IAAc,GAAG;IACnB,IAAMO,IAAa,IAAIxE,EAAQ,GAAG,GAAG,EAAE,GACjCyE,IAAWT,EAAc,MAAM,GAC/BU,IAAa,IAAIC,EAAW;IAClC,EAAW,mBAAmBH,GAAYC,CAAQ;IAClD,IAAMG,IAAQ,IAAIC,EAAM;IAExB,AADAD,EAAM,kBAAkBF,GAAY,KAAK,GACzC,EAAQ,YAAYE,EAAM;GAC5B;GAEA,AADiB,KAAK,KAAK,KAAK,qBAAqBb,GAAc,CAAC,GAAG,EAClE,KACH,KAAK,KAAK,WAAWA,GAAc,EAAE,WAAW5C,EAAQ,UAAU,CAAC;EAEvE;CACF;CAEA,iBAAyB;EAGvB,AAFA,KAAK,aAAa,CAAC,GACnB,KAAK,WAAW,SAAS,MAASN,EAAK,WAAW,QAAQ,CAAC,GAC3D,KAAK,aAAa,CAAC;EAEnB,IAAMiE,IAAmB,KAAK,KAAK,WAC7BC,IAAoB,KAAK,oBAAoB,cAAc,UAAUD,EAAiB,CAAC,aACvFE,IAAe,KAAK,oBAAoB,cAAc,YAAYD;EAwDxE,AAvDA,KAAK,oBAAoB,cAAc,OAAO,SAAS,MAAS;GAC9D,IAAME,IAAkB,KAAK,KAAK,KAAK,UAAU,QAAQ,GAAU,MACjE,EAAID,GAAc,OAAO,MAAM,MAASrD,EAAK,gBAAgB,SAASa,CAAK,CAAC,CAE7E,GAEK0C,IAAYC,EAAK,UACnBlB,IAAc,UACdmB;GAgBJ,AAbAH,EAAgB,SAAS,MAAa;IACpC,IAAMV,IAAWL,EAAS,kBACpBI,IAAgB;KACpB,GAAGC,EAAS;KACZ,GAAGA,EAAS;KACZ,GAAGA,EAAS;IACd,GACMpC,IAAWhC,EAAY+E,GAAWZ,CAAa;IACrD,AAAInC,IAAW8B,MACb,IAAc9B,GACd,IAAemC;GAEnB,CAAC,GACGc,MAAc,EAAU,IAAIA,EAAa,IAAI;GACjD,IAAMb,IAAW,IAAIvE,EAAQkF,EAAU,GAAGA,EAAU,GAAGA,EAAU,CAAC;GAElE,AADAX,EAAS,IAAI,IAAIvE,EAAQ,KAAM,KAAK,CAAC,CAAC,CAAC,WAAW,IAAI6E,EAAM,GAAGM,EAAK,KAAK,CAAC,CAAC,CAAC,GAC5E,KAAK,WAAW,KAAK;IACnB,UAAUA,EAAK;IACf,MAAMA,EAAK;IACX;IACA,QAAQ7E,EAAU6E,EAAK,GAAG;GAC5B,CAAC;EACH,CAAC,GAED,KAAK,aAAa,KAAK,WAAW,KAAK,OAAU;GAC/C,GAAGE;GACH,MAAM;GACN,KAAK;GACL,SAAS;GACT,SAAS;GACT,WAAW;GACX,cAAc;EAChB,EAAE,GAEG,KAAK,cACV,KAAK,YAAY,IACjB,KAAK,KAAK,GAAG,qBAAqB,KAAK,aAAa,GACpD,KAAK,KAAK,GAAG,eAAe,KAAK,yBAAyB,GAC1D,KAAK,KAAK,GAAG,sBAAsB,KAAK,eAAe,GACvD,KAAK,KAAK,GAAG,gBAAgB,KAAK,eAAe,GACjD,KAAK,KAAK,GAAG,cAAc,KAAK,eAAe,GAC/C,KAAK,KAAK,GAAG,gBAAgB,KAAK,eAAe,IAGjD,KAAK,0BAA0B;CACjC;AACF,GC3YMC,KACJ,MAEO,IAAItJ,EAAyC6D,CAAI"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as e } from "./rolldown-runtime-B0aSnxlc.js";
|
|
2
2
|
import { t } from "./Subscribe-DLlAl88n.js";
|
|
3
|
-
import { a as n, f as r, n as i, r as a } from "./PointHelper-
|
|
4
|
-
import { a as o, g as s, n as c, t as l } from "./generatePolygonGeometry-
|
|
3
|
+
import { a as n, f as r, n as i, r as a } from "./PointHelper-Bgbt0S7b.js";
|
|
4
|
+
import { a as o, g as s, n as c, t as l } from "./generatePolygonGeometry-DEr9kX3D.js";
|
|
5
5
|
import { t as u } from "./getFiveModel-CZVrrU1D.js";
|
|
6
6
|
import { n as d } from "./util-vGeVT4oo.js";
|
|
7
7
|
import { n as f } from "./getNormal-BatLuzsS.js";
|
|
@@ -10,7 +10,7 @@ import { n as m, t as h } from "./isNil-CQNA0Sbe.js";
|
|
|
10
10
|
import { t as g } from "./uuid-BfVaI9vM.js";
|
|
11
11
|
import { n as _, t as v } from "./tween.esm-CJDtohfp.js";
|
|
12
12
|
import { i as y } from "./animationFrame-CacKXN8l.js";
|
|
13
|
-
import { t as b } from "./BasePlugin-
|
|
13
|
+
import { t as b } from "./BasePlugin-CPJ1ahrJ.js";
|
|
14
14
|
import { C as x, G as S, J as C, K as w, L as T, M as E, N as ee, O as te, P as D, Q as O, R as k, S as ne, U as A, V as j, W as re, X as M, Y as N, Z as ie, _ as ae, b as oe, d as se, et as ce, it as P, j as F, k as le, l as I, m as L, n as R, o as z, p as B, q as ue, rt as V, st as H, t as de, x as fe, z as U } from "./component.svelte-D5LYqt50.js";
|
|
15
15
|
import { n as pe, t as me } from "./safeObj-ic96Cf8D.js";
|
|
16
16
|
import { t as he } from "./FiveLine-0OtX3RDV.js";
|
|
@@ -2490,4 +2490,4 @@ var _n = {
|
|
|
2490
2490
|
//#endregion
|
|
2491
2491
|
export { Sn as t };
|
|
2492
2492
|
|
|
2493
|
-
//# sourceMappingURL=pano-measure-
|
|
2493
|
+
//# sourceMappingURL=pano-measure-BEUknZ_O.js.map
|