@realsee/dnalogel 4.0.0-webgpu.3 → 4.0.0-webgpu.4
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 +6 -0
- package/dist/floorplan.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +270 -35
- package/dist/index.js.map +1 -0
- package/dist/internal/{BasePlugin-CT5K8m36.js → BasePlugin-DC5m72La.js} +3 -3
- package/dist/internal/{BasePlugin-CT5K8m36.js.map → BasePlugin-DC5m72La.js.map} +1 -1
- package/dist/internal/BasePluginWithData-D_0W46_q.js +7 -0
- package/dist/internal/{BasePluginWithData-9z4tpAT4.js.map → BasePluginWithData-D_0W46_q.js.map} +1 -1
- package/dist/internal/{BetterTween-BX0aTvP1.js → BetterTween-DmptqE8m.js} +2 -2
- package/dist/internal/{BetterTween-BX0aTvP1.js.map → BetterTween-DmptqE8m.js.map} +1 -1
- package/dist/internal/{CSS3DRenderPlugin-ccSpcvwd.js → CSS3DRenderPlugin-CEatgl0m.js} +3 -3
- package/dist/internal/CSS3DRenderPlugin-CEatgl0m.js.map +1 -0
- package/dist/internal/{Controller-Csut_kcH.js → Controller-D6o4OGWJ.js} +8 -8
- package/dist/internal/{Controller-Csut_kcH.js.map → Controller-D6o4OGWJ.js.map} +1 -1
- package/dist/internal/{FiveDomEvents-3H9NvDOz.js → FiveDomEvents-BUBLFzti.js} +2 -2
- package/dist/internal/{FiveDomEvents-3H9NvDOz.js.map → FiveDomEvents-BUBLFzti.js.map} +1 -1
- package/dist/internal/FivePuppet-C6QmVY70.js +67 -0
- package/dist/internal/FivePuppet-C6QmVY70.js.map +1 -0
- package/dist/internal/{PointHelper-D565h9b_.js → PointHelper-DIhgdjY2.js} +48 -48
- package/dist/internal/{PointHelper-D565h9b_.js.map → PointHelper-DIhgdjY2.js.map} +1 -1
- package/dist/internal/{Polygon-CBGvYUfJ.js → Polygon-D3xIL1Pl.js} +30 -30
- package/dist/internal/{Polygon-CBGvYUfJ.js.map → Polygon-D3xIL1Pl.js.map} +1 -1
- package/dist/internal/{Prism-Dm5ESkgg.js → Prism-CJlyAEAU.js} +13 -13
- package/dist/internal/{Prism-Dm5ESkgg.js.map → Prism-CJlyAEAU.js.map} +1 -1
- package/dist/internal/{Rectangle-D-zkDycu.js → Rectangle-BpL9lNKU.js} +118 -129
- package/dist/internal/Rectangle-BpL9lNKU.js.map +1 -0
- package/dist/internal/{Work-DF8j5GnL.js → Work-BE4AgdwH.js} +9 -9
- package/dist/internal/{Work-DF8j5GnL.js.map → Work-BE4AgdwH.js.map} +1 -1
- package/dist/internal/{animationFrame-XGKHIeQK.js → animationFrame-CacKXN8l.js} +14 -3
- package/dist/internal/animationFrame-CacKXN8l.js.map +1 -0
- package/dist/internal/{area-maker-Bd9l2pIp.js → area-maker-Bnhx4SkH.js} +4 -4
- package/dist/internal/{area-maker-Bd9l2pIp.js.map → area-maker-Bnhx4SkH.js.map} +1 -1
- package/dist/internal/{boundingBox-DvCor5Hd.js → boundingBox-CIqXgNXW.js} +2 -2
- package/dist/internal/{boundingBox-DvCor5Hd.js.map → boundingBox-CIqXgNXW.js.map} +1 -1
- package/dist/internal/{camera-movement-CwI7UqUk.js → camera-movement-C1pwfMk_.js} +2 -2
- package/dist/internal/camera-movement-C1pwfMk_.js.map +1 -0
- package/dist/internal/{changeMode-BVGYCoqu.js → changeMode-D_I2AOjH.js} +2 -2
- package/dist/internal/{changeMode-BVGYCoqu.js.map → changeMode-D_I2AOjH.js.map} +1 -1
- package/dist/internal/{controller-BWkZT0l1.js → controller-DIDtFrBE.js} +1991 -2050
- package/dist/internal/controller-DIDtFrBE.js.map +1 -0
- package/dist/internal/{cruise-C3F0eNQ-.js → cruise-B50Tcq66.js} +2 -2
- package/dist/internal/{cruise-C3F0eNQ-.js.map → cruise-B50Tcq66.js.map} +1 -1
- package/dist/internal/{current-pano-image-DKUWluR-.js → current-pano-image-BCFr6njt.js} +4 -4
- package/dist/internal/{current-pano-image-DKUWluR-.js.map → current-pano-image-BCFr6njt.js.map} +1 -1
- package/dist/internal/{defaultUrls-CjKkS9k9.js → defaultUrls-CfMtGzqM.js} +14 -3
- package/dist/internal/defaultUrls-CfMtGzqM.js.map +1 -0
- package/dist/internal/{fire-scene-CczaBz2_.js → fire-scene-BzZGvyh_.js} +9 -4
- package/dist/internal/fire-scene-BzZGvyh_.js.map +1 -0
- package/dist/internal/{fiveModelLoad-mg-TnpnM.js → fiveModelLoad-BUIBYxzp.js} +2 -2
- package/dist/internal/{fiveModelLoad-mg-TnpnM.js.map → fiveModelLoad-BUIBYxzp.js.map} +1 -1
- package/dist/internal/{floorplan-KWlIsTvO.js → floorplan-C8BGw87S.js} +5 -5
- package/dist/internal/{floorplan-KWlIsTvO.js.map → floorplan-C8BGw87S.js.map} +1 -1
- package/dist/internal/{generatePolygonGeometry-B_5JFq8y.js → generatePolygonGeometry-BOnzdCaG.js} +181 -178
- package/dist/internal/generatePolygonGeometry-BOnzdCaG.js.map +1 -0
- package/dist/internal/{lookObject-wesf8xt6.js → lookObject-DuRab5wf.js} +2 -2
- package/dist/internal/{lookObject-wesf8xt6.js.map → lookObject-DuRab5wf.js.map} +1 -1
- package/dist/internal/{measure-BX6boAC7.js → measure-B4jFwdQ6.js} +5 -5
- package/dist/internal/{measure-BX6boAC7.js.map → measure-B4jFwdQ6.js.map} +1 -1
- package/dist/internal/{model-chassis-compass-InVNmOAQ.js → model-chassis-compass-C6NTVMLo.js} +2 -2
- package/dist/internal/{model-chassis-compass-InVNmOAQ.js.map → model-chassis-compass-C6NTVMLo.js.map} +1 -1
- package/dist/internal/{model-entry-door-guide-wZbyY77a.js → model-entry-door-guide-DnGTLY2s.js} +2 -2
- package/dist/internal/{model-entry-door-guide-wZbyY77a.js.map → model-entry-door-guide-DnGTLY2s.js.map} +1 -1
- package/dist/internal/{model-maker-uO8xlTuO.js → model-maker-B1mnDdKY.js} +15 -15
- package/dist/internal/{model-maker-uO8xlTuO.js.map → model-maker-B1mnDdKY.js.map} +1 -1
- package/dist/internal/{model-tv-video-DzXb2JRf.js → model-tv-video-BP-7HoDC.js} +2 -2
- package/dist/internal/{model-tv-video-DzXb2JRf.js.map → model-tv-video-BP-7HoDC.js.map} +1 -1
- package/dist/internal/{model-view-CBeeMM98.js → model-view-BWUU0-uq.js} +2 -2
- package/dist/internal/{model-view-CBeeMM98.js.map → model-view-BWUU0-uq.js.map} +1 -1
- package/dist/internal/object3d-helper-CbRRhnLV.js +7 -0
- package/dist/internal/{object3d-helper-DDYsVPN6.js.map → object3d-helper-CbRRhnLV.js.map} +1 -1
- package/dist/internal/{pano-compass-jSr629BP.js → pano-compass-BRTM0dCc.js} +7 -7
- package/dist/internal/{pano-compass-jSr629BP.js.map → pano-compass-BRTM0dCc.js.map} +1 -1
- package/dist/internal/{pano-door-label-DKoYIKLa.js → pano-door-label-BLjYGZrr.js} +3 -3
- package/dist/internal/{pano-door-label-DKoYIKLa.js.map → pano-door-label-BLjYGZrr.js.map} +1 -1
- package/dist/internal/{pano-measure-DW9mdx1O.js → pano-measure-BIgCWkVJ.js} +14 -14
- package/dist/internal/{pano-measure-DW9mdx1O.js.map → pano-measure-BIgCWkVJ.js.map} +1 -1
- package/dist/internal/{pano-ruler-pro-D7q0Ob21.js → pano-ruler-pro-D9yTbHJz.js} +2 -2
- package/dist/internal/{pano-ruler-pro-D7q0Ob21.js.map → pano-ruler-pro-D9yTbHJz.js.map} +1 -1
- package/dist/internal/{pano-spatial-tag-D0qn-__S.js → pano-spatial-tag-B7Gxn3BS.js} +3 -3
- package/dist/internal/{pano-spatial-tag-D0qn-__S.js.map → pano-spatial-tag-B7Gxn3BS.js.map} +1 -1
- package/dist/internal/{pano-tag-BW5MXXws.js → pano-tag-Bchz-jED.js} +2 -2
- package/dist/internal/{pano-tag-BW5MXXws.js.map → pano-tag-Bchz-jED.js.map} +1 -1
- package/dist/internal/{pano-video-Bmud_CAn.js → pano-video-BufYQMqo.js} +3 -3
- package/dist/internal/{pano-video-Bmud_CAn.js.map → pano-video-BufYQMqo.js.map} +1 -1
- package/dist/internal/{pipeline-DDqgb1gw.js → pipeline-t_3IMXKB.js} +4 -4
- package/dist/internal/{pipeline-DDqgb1gw.js.map → pipeline-t_3IMXKB.js.map} +1 -1
- package/dist/internal/{sculpt-BNkLJR6p.js → sculpt-BCK4PMwL.js} +64 -63
- package/dist/internal/{sculpt-BNkLJR6p.js.map → sculpt-BCK4PMwL.js.map} +1 -1
- package/dist/internal/tagPosition-DA9YguT8.js +176 -0
- package/dist/internal/tagPosition-DA9YguT8.js.map +1 -0
- package/dist/internal/withResolvers-DVr4bnnk.js +15 -0
- package/dist/internal/withResolvers-DVr4bnnk.js.map +1 -0
- package/dist/plugins/area-maker.js +1 -1
- package/dist/plugins/camera-movement.js +1 -1
- package/dist/plugins/cruise.js +2 -2
- package/dist/plugins/css3d-render.js +1 -1
- package/dist/plugins/current-pano-image.js +1 -1
- package/dist/plugins/digital-performance.d.ts +1 -1
- package/dist/plugins/digital-performance.js +1 -1
- package/dist/plugins/fire-scene.d.ts +1 -1
- package/dist/plugins/fire-scene.js +1 -1
- package/dist/plugins/guide-line.js +1 -1
- package/dist/plugins/measure.js +1 -1
- package/dist/plugins/model-chassis-compass.js +1 -1
- package/dist/plugins/model-entry-door-guide.js +1 -1
- package/dist/plugins/model-maker.d.ts +1 -1
- package/dist/plugins/model-maker.js +1 -1
- package/dist/plugins/model-tv-video.js +1 -1
- package/dist/plugins/model-view.js +1 -1
- package/dist/plugins/object3d-helper.d.ts +1 -1
- package/dist/plugins/object3d-helper.js +3 -1
- 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-ruler-pro.js +1 -1
- package/dist/plugins/pano-spatial-tag.js +1 -1
- package/dist/plugins/pano-tag.d.ts +1 -1
- package/dist/plugins/pano-tag.js +4 -1
- package/dist/plugins/pano-video.js +1 -1
- package/dist/plugins/pipeline.js +1 -1
- package/dist/plugins/sculpt.d.ts +1 -1
- package/dist/plugins/sculpt.js +7 -1
- package/dist/types/public/index.d.ts +2 -0
- package/dist/types/public/plugins/digital-performance.d.ts +1 -0
- package/dist/types/public/plugins/fire-scene.d.ts +1 -0
- package/dist/types/public/plugins/model-maker.d.ts +1 -0
- package/dist/types/public/plugins/object3d-helper.d.ts +1 -0
- package/dist/types/public/plugins/pano-tag.d.ts +2 -0
- package/dist/types/public/plugins/sculpt.d.ts +8 -0
- package/dist/types/public/utils.d.ts +5 -0
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +16 -50
- package/package.json +1 -1
- package/dist/internal/BasePluginWithData-9z4tpAT4.js +0 -7
- package/dist/internal/CSS3DRenderPlugin-ccSpcvwd.js.map +0 -1
- package/dist/internal/Rectangle-D-zkDycu.js.map +0 -1
- package/dist/internal/animationFrame-XGKHIeQK.js.map +0 -1
- package/dist/internal/blink-DD_0mH-m.js +0 -113
- package/dist/internal/blink-DD_0mH-m.js.map +0 -1
- package/dist/internal/camera-movement-CwI7UqUk.js.map +0 -1
- package/dist/internal/controller-BWkZT0l1.js.map +0 -1
- package/dist/internal/defaultUrls-CjKkS9k9.js.map +0 -1
- package/dist/internal/fire-scene-CczaBz2_.js.map +0 -1
- package/dist/internal/generatePolygonGeometry-B_5JFq8y.js.map +0 -1
- package/dist/internal/object3d-helper-DDYsVPN6.js +0 -7
- package/dist/utils.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pano-door-label-DKoYIKLa.js","names":["$.from_html","$.prop","$.mutable_source","$.get","prevPanoIndex","$.child","$.only_child","$.set","$.deep_read_state","$.untrack","$.clsx","classnames","BasePlugin.Controller","Controller.PanoDoorLabelPluginController","__toESM","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","waitFiveModelLoaded","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-BLjYGZrr.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,7 +1,7 @@
|
|
|
1
1
|
import { r as e } from "./rolldown-runtime-B0aSnxlc.js";
|
|
2
2
|
import { t } from "./Subscribe-DLlAl88n.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { a as n, f as r, n as i, r as a } from "./PointHelper-DIhgdjY2.js";
|
|
4
|
+
import { a as o, g as s, n as c, t as l } from "./generatePolygonGeometry-BOnzdCaG.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";
|
|
@@ -9,8 +9,8 @@ import { t as p } from "./throttle-YRIkRKaX.js";
|
|
|
9
9
|
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
|
-
import {
|
|
13
|
-
import { t as b } from "./BasePlugin-
|
|
12
|
+
import { i as y } from "./animationFrame-CacKXN8l.js";
|
|
13
|
+
import { t as b } from "./BasePlugin-DC5m72La.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";
|
|
@@ -515,7 +515,7 @@ var Qe = class {
|
|
|
515
515
|
}, super(e), this.area = e.area, this.containerDom.appendChild(this.contentDom);
|
|
516
516
|
}
|
|
517
517
|
updateArea(e, t) {
|
|
518
|
-
let n = t ?? this.area.polygon.geometry, r =
|
|
518
|
+
let n = t ?? this.area.polygon.geometry, r = o(n);
|
|
519
519
|
if (!r) {
|
|
520
520
|
this.ndcPosition = null, this.updateDomPosition(e);
|
|
521
521
|
return;
|
|
@@ -697,7 +697,7 @@ var ft = () => !1, Q = class extends tt {
|
|
|
697
697
|
let t = e.type === "area", n = Array.isArray(e) && e[0]?.type === "line";
|
|
698
698
|
t && this.unHighlightArea(e), n && this.unHighlightLines(e);
|
|
699
699
|
}
|
|
700
|
-
}).appendTo(this.container), this.pointSelector = new
|
|
700
|
+
}).appendTo(this.container), this.pointSelector = new a(this.five, {
|
|
701
701
|
...this.pointSelectorConfig,
|
|
702
702
|
mode: this.editParams.pointSelectorMode,
|
|
703
703
|
helper: {
|
|
@@ -1325,8 +1325,8 @@ var wt = class {
|
|
|
1325
1325
|
let { left: t, top: n, width: r, height: i } = e.getBoundingClientRect(), a = {
|
|
1326
1326
|
x: Math.round(t + r / 2),
|
|
1327
1327
|
y: Math.round(n + i / 2)
|
|
1328
|
-
},
|
|
1329
|
-
this.centerMouseXY =
|
|
1328
|
+
}, o = s(a, this.five.getElement());
|
|
1329
|
+
this.centerMouseXY = o;
|
|
1330
1330
|
};
|
|
1331
1331
|
getIntersection = () => this.centerMouseXY ? (this.raycaster.setFromCamera(this.centerMouseXY, this.five.camera), u(this.five).intersectRaycaster(this.raycaster)[0] || null) : null;
|
|
1332
1332
|
pieceChange(e) {
|
|
@@ -2338,18 +2338,18 @@ var _n = {
|
|
|
2338
2338
|
container = document.createElement("div");
|
|
2339
2339
|
shortcutKeyController;
|
|
2340
2340
|
constructor(e, t) {
|
|
2341
|
-
super(e), this.five = e, this.params = t, this.config = ge(t, ["openParams", "pointSelectorConfig"]), this.model = new yt(this.config), this.isMobile = t?.openParams?.isMobile ?? !1, this.magnifier = new
|
|
2341
|
+
super(e), this.five = e, this.params = t, this.config = ge(t, ["openParams", "pointSelectorConfig"]), this.model = new yt(this.config), this.isMobile = t?.openParams?.isMobile ?? !1, this.magnifier = new r(e, t.pointSelectorConfig?.helper?.magnifierParams ?? {
|
|
2342
2342
|
width: 190,
|
|
2343
2343
|
height: 190,
|
|
2344
2344
|
scale: 2
|
|
2345
2345
|
}), this.allowMeasureType = Array.from(new Set(t.editParams?.allowMeasureType ?? ["line"])), this.currentMeasureType = this.allowMeasureType[0] ?? "line", this.group = new be(), this.group.name = "plugin-measure-group", this.container.classList.add("five-plugin-measure-container"), this.container.style.position = "absolute", this.container.style.left = "0", this.container.style.top = "0", this.container.style.visibility = "hidden", this.container.style.pointerEvents = "none", this.container.style.width = "100%", this.container.style.height = "100%", this.container.style.opacity = "0", this.container.style.zIndex = "1";
|
|
2346
|
-
let
|
|
2346
|
+
let i = t.editParams?.pointSelectorMode ?? (n ? "fixed" : "cursor"), a = this.params.openParams ?? {};
|
|
2347
2347
|
if (this.params.useUIController !== !1) {
|
|
2348
2348
|
let e = {
|
|
2349
2349
|
container: this.container,
|
|
2350
|
-
openParams:
|
|
2350
|
+
openParams: a,
|
|
2351
2351
|
i18n: t.i18n,
|
|
2352
|
-
pointSelectorMode:
|
|
2352
|
+
pointSelectorMode: i,
|
|
2353
2353
|
useNewUI: this.allowMeasureType.length > 1,
|
|
2354
2354
|
...me(this.params.useUIController)
|
|
2355
2355
|
};
|
|
@@ -2358,7 +2358,7 @@ var _n = {
|
|
|
2358
2358
|
if (this.params.useGuideController !== !1) {
|
|
2359
2359
|
let e = {
|
|
2360
2360
|
container: this.container,
|
|
2361
|
-
pointSelectorMode:
|
|
2361
|
+
pointSelectorMode: i,
|
|
2362
2362
|
i18n: t.i18n,
|
|
2363
2363
|
...me(this.params.useGuideController)
|
|
2364
2364
|
};
|
|
@@ -2485,4 +2485,4 @@ var _n = {
|
|
|
2485
2485
|
//#endregion
|
|
2486
2486
|
export { Sn as t };
|
|
2487
2487
|
|
|
2488
|
-
//# sourceMappingURL=pano-measure-
|
|
2488
|
+
//# sourceMappingURL=pano-measure-BIgCWkVJ.js.map
|