@realsee/dnalogel 4.0.0-webgpu.14 → 4.0.0-webgpu.16

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.
Files changed (108) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/TERMS.txt +24 -87
  3. package/dist/floorplan.js +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.js +34 -32
  6. package/dist/index.js.map +1 -1
  7. package/dist/internal/{BasePlugin-CPJ1ahrJ.js → BasePlugin-89hE8Cux.js} +2 -2
  8. package/dist/internal/{BasePlugin-CPJ1ahrJ.js.map → BasePlugin-89hE8Cux.js.map} +1 -1
  9. package/dist/internal/BasePluginWithData-BLOUilj_.js +7 -0
  10. package/dist/internal/{BasePluginWithData-Uq1cY5sC.js.map → BasePluginWithData-BLOUilj_.js.map} +1 -1
  11. package/dist/internal/{pano-measure-BEUknZ_O.js → Controller-B-10xO2H.js} +56 -42
  12. package/dist/internal/Controller-B-10xO2H.js.map +1 -0
  13. package/dist/internal/{measure-CTsB8Z-c.js → Controller-Bt2czarX.js} +10 -7
  14. package/dist/internal/Controller-Bt2czarX.js.map +1 -0
  15. package/dist/internal/{Controller-B9xMQukV.js → Controller-CTQsxSIv.js} +2 -2
  16. package/dist/internal/{Controller-B9xMQukV.js.map → Controller-CTQsxSIv.js.map} +1 -1
  17. package/dist/internal/{PointHelper-Bgbt0S7b.js → PointHelper-grrf8vu1.js} +23 -8
  18. package/dist/internal/PointHelper-grrf8vu1.js.map +1 -0
  19. package/dist/internal/{Rectangle-Dyjp88lU.js → Rectangle-CrP2ewnA.js} +3 -3
  20. package/dist/internal/{Rectangle-Dyjp88lU.js.map → Rectangle-CrP2ewnA.js.map} +1 -1
  21. package/dist/internal/{Work-nlQCCreU.js → Work-BeXbgDwp.js} +4 -4
  22. package/dist/internal/{Work-nlQCCreU.js.map → Work-BeXbgDwp.js.map} +1 -1
  23. package/dist/internal/{area-maker-DwPBgIH_.js → area-maker-CPQF8Zvc.js} +2 -2
  24. package/dist/internal/{area-maker-DwPBgIH_.js.map → area-maker-CPQF8Zvc.js.map} +1 -1
  25. package/dist/internal/{controller-B3u-PyQb.js → controller-18q1jMVV.js} +16 -16
  26. package/dist/internal/{controller-B3u-PyQb.js.map → controller-18q1jMVV.js.map} +1 -1
  27. package/dist/internal/{cruise-XCsWQQtZ.js → cruise-CVIrFchH.js} +2 -2
  28. package/dist/internal/{cruise-XCsWQQtZ.js.map → cruise-CVIrFchH.js.map} +1 -1
  29. package/dist/internal/{current-pano-image-Yt0ptdOO.js → current-pano-image-BaYriyS_.js} +2 -2
  30. package/dist/internal/{current-pano-image-Yt0ptdOO.js.map → current-pano-image-BaYriyS_.js.map} +1 -1
  31. package/dist/internal/edgeSnap-8fdFCcXB.js +469 -0
  32. package/dist/internal/edgeSnap-8fdFCcXB.js.map +1 -0
  33. package/dist/internal/{floorplan-Bnk3Jg8m.js → floorplan-CofR5nkn.js} +2 -2
  34. package/dist/internal/{floorplan-Bnk3Jg8m.js.map → floorplan-CofR5nkn.js.map} +1 -1
  35. package/dist/internal/measure-BEPx6Dxe.js +7 -0
  36. package/dist/internal/measure-BEPx6Dxe.js.map +1 -0
  37. package/dist/internal/measure-v2-sRY76hly.js +83 -0
  38. package/dist/internal/measure-v2-sRY76hly.js.map +1 -0
  39. package/dist/internal/{model-maker-tbF87kJz.js → model-maker-ggAsocXZ.js} +2 -2
  40. package/dist/internal/{model-maker-tbF87kJz.js.map → model-maker-ggAsocXZ.js.map} +1 -1
  41. package/dist/internal/object3d-helper-DFamC2FE.js +7 -0
  42. package/dist/internal/{object3d-helper-BgYvVhp2.js.map → object3d-helper-DFamC2FE.js.map} +1 -1
  43. package/dist/internal/{pano-compass-BwxmzCPI.js → pano-compass-DGHhaCBJ.js} +2 -2
  44. package/dist/internal/{pano-compass-BwxmzCPI.js.map → pano-compass-DGHhaCBJ.js.map} +1 -1
  45. package/dist/internal/{pano-door-label-Bwvaf5xx.js → pano-door-label-CWY7Kxkk.js} +2 -2
  46. package/dist/internal/{pano-door-label-Bwvaf5xx.js.map → pano-door-label-CWY7Kxkk.js.map} +1 -1
  47. package/dist/internal/pano-measure-CQ_ZZzz5.js +9 -0
  48. package/dist/internal/pano-measure-CQ_ZZzz5.js.map +1 -0
  49. package/dist/internal/pano-measure-v2-CzOdP5Yv.js +301 -0
  50. package/dist/internal/pano-measure-v2-CzOdP5Yv.js.map +1 -0
  51. package/dist/internal/{pano-tag-CaRrmqmS.js → pano-tag-C6g7mXhw.js} +2 -2
  52. package/dist/internal/{pano-tag-CaRrmqmS.js.map → pano-tag-C6g7mXhw.js.map} +1 -1
  53. package/dist/internal/{pano-video-DLjuDeQV.js → pano-video-DTbKV54W.js} +2 -2
  54. package/dist/internal/{pano-video-DLjuDeQV.js.map → pano-video-DTbKV54W.js.map} +1 -1
  55. package/dist/internal/{pipeline-Dg9R3h54.js → pipeline-CkYhFOhG.js} +2 -2
  56. package/dist/internal/{pipeline-Dg9R3h54.js.map → pipeline-CkYhFOhG.js.map} +1 -1
  57. package/dist/internal/{sculpt-CMFBenui.js → sculpt-rEvaT1IE.js} +3 -3
  58. package/dist/internal/{sculpt-CMFBenui.js.map → sculpt-rEvaT1IE.js.map} +1 -1
  59. package/dist/plugins/area-maker.js +1 -1
  60. package/dist/plugins/cruise.js +2 -2
  61. package/dist/plugins/current-pano-image.js +1 -1
  62. package/dist/plugins/guide-line.js +1 -1
  63. package/dist/plugins/measure-v2.d.ts +2 -0
  64. package/dist/plugins/measure-v2.js +3 -0
  65. package/dist/plugins/measure.js +3 -1
  66. package/dist/plugins/model-maker.js +1 -1
  67. package/dist/plugins/object3d-helper.js +2 -2
  68. package/dist/plugins/pano-compass.js +1 -1
  69. package/dist/plugins/pano-door-label.js +1 -1
  70. package/dist/plugins/pano-measure-v2.d.ts +2 -0
  71. package/dist/plugins/pano-measure-v2.js +1 -0
  72. package/dist/plugins/pano-measure.js +1 -1
  73. package/dist/plugins/pano-tag.js +2 -2
  74. package/dist/plugins/pano-video.js +1 -1
  75. package/dist/plugins/pipeline.js +1 -1
  76. package/dist/plugins/sculpt.js +2 -2
  77. package/dist/types/MeasurePlugin/Controller.d.ts +1 -0
  78. package/dist/types/MeasurePluginV2/Controller.d.ts +49 -0
  79. package/dist/types/MeasurePluginV2/Magnifier.d.ts +29 -0
  80. package/dist/types/MeasurePluginV2/PointHelper.d.ts +22 -0
  81. package/dist/types/MeasurePluginV2/PointOverlay.d.ts +88 -0
  82. package/dist/types/MeasurePluginV2/PointSelector.d.ts +51 -0
  83. package/dist/types/MeasurePluginV2/edgeSnap.d.ts +53 -0
  84. package/dist/types/MeasurePluginV2/index.d.ts +28 -0
  85. package/dist/types/PanoMeasurePlugin/Controller/BaseController.d.ts +1 -0
  86. package/dist/types/PanoMeasurePlugin/Controller/EditController.d.ts +4 -2
  87. package/dist/types/PanoMeasurePlugin/Controller/MixedController.d.ts +3 -1
  88. package/dist/types/PanoMeasurePlugin/Controller/WatchController.d.ts +4 -0
  89. package/dist/types/PanoMeasurePlugin/Controller/index.d.ts +9 -3
  90. package/dist/types/PanoMeasurePlugin/Modules/rangePiece/index.d.ts +5 -5
  91. package/dist/types/PanoMeasurePluginV2/Controller.d.ts +32 -0
  92. package/dist/types/PanoMeasurePluginV2/PointSelector.d.ts +32 -0
  93. package/dist/types/PanoMeasurePluginV2/PreviewLine.d.ts +6 -0
  94. package/dist/types/PanoMeasurePluginV2/controllers.d.ts +44 -0
  95. package/dist/types/PanoMeasurePluginV2/index.d.ts +8 -0
  96. package/dist/types/public/index.d.ts +4 -0
  97. package/dist/types/public/plugins/measure-v2.d.ts +5 -0
  98. package/dist/types/public/plugins/pano-measure-v2.d.ts +2 -0
  99. package/dist/types/shared-utils/three/Magnifier.d.ts +21 -0
  100. package/dist/types/shared-utils/three/PointSelector/index.d.ts +16 -7
  101. package/dist/utils.js +1 -1
  102. package/package.json +9 -1
  103. package/LICENSE-UPDATE.txt +0 -5
  104. package/dist/internal/BasePluginWithData-Uq1cY5sC.js +0 -7
  105. package/dist/internal/PointHelper-Bgbt0S7b.js.map +0 -1
  106. package/dist/internal/measure-CTsB8Z-c.js.map +0 -1
  107. package/dist/internal/object3d-helper-BgYvVhp2.js +0 -7
  108. package/dist/internal/pano-measure-BEUknZ_O.js.map +0 -1
@@ -1,7 +1,7 @@
1
- import { i as e, t } from "./Work-nlQCCreU.js";
1
+ import { i as e, t } from "./Work-BeXbgDwp.js";
2
2
  //#region src/CruisePlugin/index.ts
3
3
  var n = (e, n) => new t(e, n), r = (t, n) => new e(t, n);
4
4
  //#endregion
5
5
  export { r as n, n as t };
6
6
 
7
- //# sourceMappingURL=cruise-XCsWQQtZ.js.map
7
+ //# sourceMappingURL=cruise-CVIrFchH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cruise-XCsWQQtZ.js","names":["MoveController","CruisePlugin","WalkController","five","parameters","MovePlugin"],"sources":["../../src/CruisePlugin/index.ts"],"sourcesContent":["import type { FivePlugin } from '@realsee/five-webgpu'\nimport * as CruisePluginTypes from './typing'\nimport type { Config } from './typing'\nimport type { MoveConfig as MovePluginConfig } from './Move'\nimport WalkController from './Work'\nimport MoveController from './Move'\n\nexport const CruisePlugin: FivePlugin<Config | undefined, InstanceType<typeof WalkController>> = (five, parameters?) =>\n new WalkController(five, parameters)\nexport const MovePlugin: FivePlugin<MovePluginConfig | undefined, InstanceType<typeof MoveController>> = (five, parameters?) =>\n new MoveController(five, parameters)\n\nexport { WalkController, MoveController, WalkController as CruisePluginController }\nexport type { CruisePluginExportType } from './typing'\nexport { CruisePluginTypes }\n\nexport default CruisePlugin\n"],"mappings":";;AAOA,IAAaC,KAAqF,GAAM,MACtG,IAAIC,EAAeC,GAAMC,CAAU,GACxBC,KAA6F,GAAM,MAC9G,IAAIL,EAAeG,GAAMC,CAAU"}
1
+ {"version":3,"file":"cruise-CVIrFchH.js","names":["MoveController","CruisePlugin","WalkController","five","parameters","MovePlugin"],"sources":["../../src/CruisePlugin/index.ts"],"sourcesContent":["import type { FivePlugin } from '@realsee/five-webgpu'\nimport * as CruisePluginTypes from './typing'\nimport type { Config } from './typing'\nimport type { MoveConfig as MovePluginConfig } from './Move'\nimport WalkController from './Work'\nimport MoveController from './Move'\n\nexport const CruisePlugin: FivePlugin<Config | undefined, InstanceType<typeof WalkController>> = (five, parameters?) =>\n new WalkController(five, parameters)\nexport const MovePlugin: FivePlugin<MovePluginConfig | undefined, InstanceType<typeof MoveController>> = (five, parameters?) =>\n new MoveController(five, parameters)\n\nexport { WalkController, MoveController, WalkController as CruisePluginController }\nexport type { CruisePluginExportType } from './typing'\nexport { CruisePluginTypes }\n\nexport default CruisePlugin\n"],"mappings":";;AAOA,IAAaC,KAAqF,GAAM,MACtG,IAAIC,EAAeC,GAAMC,CAAU,GACxBC,KAA6F,GAAM,MAC9G,IAAIL,EAAeG,GAAMC,CAAU"}
@@ -2,7 +2,7 @@ import { n as e } from "./loadTexture-CyYrJnqG.js";
2
2
  import { t } from "./defaultUrls-CfMtGzqM.js";
3
3
  import { n } from "./BetterTween-DmptqE8m.js";
4
4
  import { t as r } from "./equal-BiDAilPV.js";
5
- import { t as i } from "./BasePlugin-CPJ1ahrJ.js";
5
+ import { t as i } from "./BasePlugin-89hE8Cux.js";
6
6
  import * as a from "three/webgpu";
7
7
  //#region src/CurrentPanoImagePlugin/Controller.ts
8
8
  var o = class extends i {
@@ -216,4 +216,4 @@ var o = class extends i {
216
216
  //#endregion
217
217
  export { s as t };
218
218
 
219
- //# sourceMappingURL=current-pano-image-Yt0ptdOO.js.map
219
+ //# sourceMappingURL=current-pano-image-BaYriyS_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"current-pano-image-Yt0ptdOO.js","names":["BasePlugin.Controller","loadTexture","equal","Controller","THREE","CurrentPanoImagePluginController","five","defaultState","params","config","CURRENT_PANO_IMAGE_DEFAULT_IMAGE","userAction","options","mergedOptions","prevState","state","prevConfig","newConfig","msg","result","workCode","standingPosition","panoIndex","position","url","textureLoadingPromise","texture","quaternion","rad","visible","tweenProgress","progress","CurrentPanoImagePlugin"],"sources":["../../src/CurrentPanoImagePlugin/Controller.ts","../../src/CurrentPanoImagePlugin/index.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\nimport type { Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePlugin'\nimport type { BetterTween } from '../shared-utils/animationFrame/BetterTween'\nimport { tweenProgress } from '../shared-utils/animationFrame/BetterTween'\nimport type * as PluginType from './typings'\nimport { CURRENT_PANO_IMAGE_DEFAULT_IMAGE, equal } from '../shared-utils'\nimport { loadTexture } from '../shared-utils/three/loadTexture'\n\nexport class CurrentPanoImagePluginController extends BasePlugin.Controller<PluginType.State, PluginType.EventMap> {\n // ==================== public properties ====================\n /** 插件当前状态 */\n public state: PluginType.State\n /** 插件配置项 */\n public get config() {\n return { ...this._config }\n }\n /** 是否已经被销毁 */\n public get disposed() {\n return this._disposed\n }\n /** 查询问题使用的调试对象 */\n public checkMsg = {\n /** mesh 隐藏的原因 */\n meshHidden: '',\n /** 插件 enabled 校验信息 */\n pluginDisabled: '',\n /** 插件 visible 校验信息 */\n pluginHidden: '',\n }\n\n // ==================== private properties ====================\n private group = new THREE.Group()\n private mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n private textureLoadingPromise?: Promise<THREE.Texture> | null\n private opacityAnimeTween?: BetterTween<{ progress: number }>\n /** 是否正在走点动画中 */\n private isInPanoMoveAnime = false\n /** 上一次走点的全景图索引 */\n private lastArrivedPanoIndex = -1\n /** config 的原始值 */\n private _config: PluginType.Config\n /** disposed 的原始值 */\n private _disposed = false\n\n public constructor(five: Five, params?: PluginType.Params) {\n super(five)\n this.five = five\n\n // 处理 initialState\n const defaultState: PluginType.State = {\n enabled: true,\n visible: true,\n }\n this.state = Object.assign(defaultState, params?.initialState)\n\n // 处理 config\n const config: PluginType.Config = {\n width: 1.4,\n yOffset: 0.01,\n yRotate: 0,\n imageURL: CURRENT_PANO_IMAGE_DEFAULT_IMAGE,\n ...params?.config,\n }\n this._config = config\n\n this.group.name = 'current-pano-image-plugin-group'\n this.mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(this.config.width, this.config.width),\n new THREE.MeshBasicMaterial({ transparent: true, opacity: 0, depthTest: false }),\n )\n this.mesh.visible = false\n this.group.add(this.mesh)\n this.updateMeshQuaternion(this.config.yRotate)\n\n if (!this.state.visible) this.checkMsg.pluginHidden = '初始值设置为隐藏'\n if (!this.state.enabled) this.checkMsg.pluginDisabled = '初始值设置为禁用'\n if (this.state.enabled) this._enable({ userAction: false })\n\n this.five.once('dispose', this.dispose)\n }\n\n /**\n * 启用插件,响应用户操作并展示UI\n * @param options\n */\n public enable(options: BasePlugin.BaseOptions = {}): void {\n if (this.disposed) return\n if (this.state.enabled) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: true }, userAction)\n this.checkMsg.pluginDisabled = ''\n this._enable({ userAction })\n }\n\n /** 禁用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public disable(options: BasePlugin.BaseOptions = {}) {\n if (this.disposed) return\n if (this.state.enabled === false) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: false }, userAction)\n this.checkMsg.pluginDisabled = '调用 disable 禁用'\n this._disable({ userAction })\n }\n\n /** 插件内容整体展示\n * @param `options` `<Partial<BaseOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public async show(options?: Partial<PluginType.ShowHideOptions>): Promise<void> {\n if (this.state.visible) return Promise.resolve()\n if (this.disposed) return Promise.reject(new Error('不能在已销毁的插件上调用 show'))\n const mergedOptions = { userAction: true, ...options }\n this.updateState({ visible: true }, mergedOptions.userAction)\n this.checkMsg.pluginHidden = ''\n this._show(mergedOptions)\n }\n\n /** 插件内容整体隐藏\n * @param `options` `<Partial<BaseOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public async hide(options?: Partial<PluginType.ShowHideOptions>) {\n if (this.state.visible === false) return\n const mergedOptions = { userAction: true, ...options }\n this.updateState({ visible: false }, mergedOptions.userAction)\n this.checkMsg.pluginDisabled = '调用 hide 隐藏'\n this._hide(mergedOptions)\n }\n\n /** 更改插件 State\n * @param `state` `<Partial<Plugin.State>>` 插件属性 `state` 的子集。\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public setState(state: Partial<PluginType.State>, options: BasePlugin.BaseOptions = {}) {\n if (this.disposed) return\n const prevState = this.state\n if (equal(state, prevState, { deep: true })) return\n\n const userAction = options.userAction !== undefined ? options.userAction : true\n this.updateState(state, userAction)\n\n if (state.enabled !== undefined && prevState.enabled !== state.enabled) {\n state.enabled ? (this.checkMsg.pluginDisabled = '') : (this.checkMsg.pluginDisabled = '调用 setState 禁用')\n state.enabled ? this._enable({ userAction }) : this._disable({ userAction })\n }\n\n if (state.visible !== undefined && prevState.visible !== state.visible) {\n const options = { userAction, anime: { duration: 500 } }\n state.visible ? (this.checkMsg.pluginHidden = '') : (this.checkMsg.pluginHidden = '调用 setState 隐藏')\n state.visible ? this._show(options) : this._hide(options)\n }\n }\n\n /** 更改插件 Config\n * @param `config` `<Partial<Plugin.Config>>` 插件属性 `config` 的子集。\n * @param `options` `<Option> | <undefined>`\n */\n public updateConfig(config: Partial<PluginType.Config>, options: BasePlugin.BaseOptions = {}) {\n if (this.disposed) return\n const prevConfig = this.config\n const newConfig = { ...prevConfig, ...config }\n this._config = newConfig\n if (prevConfig.imageURL !== newConfig.imageURL) this.reloadTexture(newConfig.imageURL)\n if (prevConfig.yOffset !== newConfig.yOffset) this.updateMeshPosition(this.five.getCurrentState().panoIndex)\n if (prevConfig.yRotate !== newConfig.yRotate) this.updateMeshQuaternion(newConfig.yRotate)\n if (prevConfig.width !== newConfig.width) this.mesh.geometry = new THREE.PlaneGeometry(newConfig.width, newConfig.width)\n this.hooks.emit('configChange', { prevConfig, config: newConfig, userAction: options.userAction ?? true })\n }\n\n /**\n * 销毁插件\n * @todo 销毁贴图时,最好还是直接销毁贴图吧,this.mesh?.material.map 这种都是很深层的引用了。THREE 的建议我看也是自己去管理和销毁公共贴图。\n */\n public dispose = () => {\n if (this.disposed) return\n this._disposed = true\n this.opacityAnimeTween?.dispose()\n this.opacityAnimeTween = undefined\n this.textureLoadingPromise = null\n this.mesh.visible = false\n this.five.scene.remove(this.group)\n this.group.remove(...this.group.children)\n this.five.off('dispose', this.dispose)\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('willLoad', this.onFiveWillLoad)\n this.five.off('modeChange', this.onFiveModeChange)\n }\n\n /** 问什么看不到模型 */\n public __whyCantSeeMesh() {\n if (this.disposed) return '插件已销毁'\n if (this.checkMsg.pluginDisabled) return this.checkMsg.pluginDisabled\n if (this.checkMsg.pluginHidden) return this.checkMsg.pluginHidden\n if (this.checkMsg.meshHidden) return this.checkMsg.meshHidden\n }\n\n private updateState(state: Partial<PluginType.State>, userAction: boolean) {\n const prevState = this.state\n this.state = { ...this.state, ...state }\n this.hooks.emit('stateChange', { state: this.state, prevState, userAction })\n }\n\n /** 根据各种条件更新 Mesh 的可见性 */\n private updateMeshVisible() {\n const { result, msg } = this.checkMeshVisible()\n this.checkMsg.meshHidden = msg\n if (result !== this.mesh.visible) this.onMeshVisibleChange(result)\n }\n\n private isCurrentOwnerWork(workCode = this.five.getCurrentState().workCode) {\n return !!this.workCode && workCode === this.workCode && this.five.getCurrentState().workCode === this.workCode\n && this.workUtil.work?.workCode === this.workCode\n }\n\n /** 根据点位更新 Mesh 坐标 */\n private updateMeshPosition(panoIndex: number) {\n if (!this.isCurrentOwnerWork()) return\n const standingPosition = this.workUtil.getObserverStandingPosition(panoIndex)\n if (!standingPosition) {\n console.warn('CurrentPanoImagePlugin: 无法获取到当前点位的 standingPosition')\n return\n }\n const position = standingPosition.clone().setY(standingPosition.y + this.config.yOffset)\n if (position) this.mesh.position.copy(position)\n }\n\n /** 重新加载贴图,调用时会先清除已有的贴图 */\n private async reloadTexture(url: string) {\n this.mesh.material.map = null\n if (url !== '') {\n const textureLoadingPromise = loadTexture(url)\n this.textureLoadingPromise = textureLoadingPromise\n const texture = await textureLoadingPromise\n if (this.disposed) { texture.dispose(); return }\n // texture.minFilter 默认是 THREE.LinearMipmapLinearFilter\n texture.minFilter = THREE.LinearFilter\n // texture.magFilter 不需要改,默认就是 THREE.LinearFilter\n // 需要判断一下 Promise 的一致性,防止在加载过程中,又加载了新的贴图\n if (this.textureLoadingPromise === textureLoadingPromise) {\n this.onTextureLoaded(texture)\n this.textureLoadingPromise = null\n }\n }\n this.updateMeshVisible()\n }\n\n /** north_rad 变化时,需要更新模型的旋转角度 */\n private updateMeshQuaternion(rad: number) {\n const quaternion = new THREE.Quaternion()\n quaternion.multiplyQuaternions(\n // 沿着自身 X 轴旋转 -90 度\n new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 2),\n // 沿着自身 Z 轴旋转 rad 弧度\n new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), rad),\n )\n this.mesh.quaternion.copy(quaternion)\n }\n\n private checkMeshVisible = (): { result: boolean; msg: string } => {\n if (this.disposed) return { result: false, msg: '插件已销毁' }\n if (!this.state.visible) return { result: false, msg: '插件隐藏' }\n if (this.config.imageURL === '') return { result: false, msg: '图片不存在' }\n if (!this.mesh.material.map) return { result: false, msg: '指南针贴图未加载' }\n if (!this.five.work) return { result: false, msg: 'Five 数据未加载' }\n if (!this.isCurrentOwnerWork()) return { result: false, msg: '当前 Work 不是插件所属 Work' }\n if (this.five.getCurrentState().mode !== 'Panorama') return { result: false, msg: '非全景模式' }\n if (this.isInPanoMoveAnime) return { result: false, msg: '处于走点动画中' }\n return { result: true, msg: '' }\n }\n\n private _enable(options: { userAction: boolean }) {\n this.hooks.emit('enable', { userAction: options.userAction })\n\n // 插件启用时,再加载贴图\n if (this.config.imageURL && !this.mesh.material.map && !this.textureLoadingPromise) {\n this.reloadTexture(this.config.imageURL)\n }\n\n // resume model effects\n this.five.scene.add(this.group)\n this.five.needsRender = true\n\n if (this.five.work) this.onFiveWillLoad()\n // enable may precede this owner's first Work; normal panoArrived will position it after loading.\n if (this.isCurrentOwnerWork() && this.five.getCurrentState().mode === 'Panorama') {\n this.onFiveModeChange()\n this.onFivePanoArrived(this.five.getCurrentState().panoIndex)\n }\n\n // resume event effects\n this.five.on('willLoad', this.onFiveWillLoad)\n this.five.on('panoArrived', this.onFivePanoArrived)\n this.five.on('panoWillArrive', this.onFivePanoWillArrive)\n this.five.on('modeChange', this.onFiveModeChange)\n }\n\n private _disable(options: { userAction: boolean }) {\n this.hooks.emit('disable', { userAction: options.userAction })\n\n // dispose model effects\n this.five.scene.remove(this.group)\n this.five.needsRender = true\n\n // dispose event effects\n this.five.off('willLoad', this.onFiveWillLoad)\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('modeChange', this.onFiveModeChange)\n }\n\n private _show(options: PluginType.ShowHideOptions) {\n this.hooks.emit('show', options)\n this.updateMeshVisible()\n this.five.needsRender = true\n }\n\n private _hide(options: PluginType.ShowHideOptions) {\n this.hooks.emit('hide', options)\n this.updateMeshVisible()\n this.five.needsRender = true\n }\n\n /** 贴图加载完成的回调 */\n private onTextureLoaded = (texture: THREE.Texture) => {\n this.mesh.material.map = texture\n this.mesh.material.needsUpdate = true\n this.updateMeshVisible()\n }\n\n /** Five load Work 后 */\n private onFiveWillLoad = () => {\n // 重启插件时,重置 lastArrivedPanoIndex\n this.lastArrivedPanoIndex = -1\n\n this.updateMeshVisible()\n }\n\n /** 走点前 */\n private onFivePanoWillArrive = (panoIndex: number, state?: Partial<Five['state']>) => {\n if (!this.isCurrentOwnerWork(state?.workCode)) {\n this.lastArrivedPanoIndex = -1\n this.isInPanoMoveAnime = true\n this.opacityAnimeTween?.dispose()\n this.updateMeshVisible()\n return\n }\n if (panoIndex === this.five.getCurrentState().panoIndex) return\n this.isInPanoMoveAnime = true\n this.opacityAnimeTween?.dispose()\n this.updateMeshVisible()\n }\n\n /** 走点后 */\n\n private onFivePanoArrived = (panoIndex: number, state?: Partial<Five['state']>) => {\n if (!this.isCurrentOwnerWork(state?.workCode)) {\n // A global arrival may belong to another Work in the same Five.\n // Do not use its pano index for this owner's position or arrival cache.\n if (!this.isCurrentOwnerWork()) this.lastArrivedPanoIndex = -1\n this.updateMeshVisible()\n return\n }\n // 过滤同一个点位重复 arrived\n if (panoIndex === this.lastArrivedPanoIndex) return\n this.lastArrivedPanoIndex = panoIndex\n this.isInPanoMoveAnime = false\n // 根据点位跟新位置\n this.updateMeshPosition(panoIndex)\n this.updateMeshVisible()\n this.five.needsRender = true\n }\n\n private onMeshVisibleChange = (visible: boolean) => {\n this.opacityAnimeTween?.dispose()\n if (!visible) {\n this.mesh.visible = false\n return\n }\n\n this.mesh.material.setValues({ opacity: 0 })\n this.mesh.visible = true\n this.opacityAnimeTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.mesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n\n private onFiveModeChange = () => {\n this.updateMeshVisible()\n }\n}\n","import type { FivePlugin } from '@realsee/five-webgpu'\nimport type * as CurrentPanoImagePluginType from './typings'\nimport { CurrentPanoImagePluginController } from './Controller'\n\nexport const CurrentPanoImagePlugin: FivePlugin<CurrentPanoImagePluginType.Params, CurrentPanoImagePluginController> = (five, params) =>\n new CurrentPanoImagePluginController(five, params)\n\nexport default CurrentPanoImagePlugin\nexport type CurrentPanoImagePluginExportType = CurrentPanoImagePluginController\nexport type { CurrentPanoImagePluginType }\n"],"mappings":"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"}
1
+ {"version":3,"file":"current-pano-image-BaYriyS_.js","names":["BasePlugin.Controller","loadTexture","equal","Controller","THREE","CurrentPanoImagePluginController","five","defaultState","params","config","CURRENT_PANO_IMAGE_DEFAULT_IMAGE","userAction","options","mergedOptions","prevState","state","prevConfig","newConfig","msg","result","workCode","standingPosition","panoIndex","position","url","textureLoadingPromise","texture","quaternion","rad","visible","tweenProgress","progress","CurrentPanoImagePlugin"],"sources":["../../src/CurrentPanoImagePlugin/Controller.ts","../../src/CurrentPanoImagePlugin/index.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\nimport type { Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePlugin'\nimport type { BetterTween } from '../shared-utils/animationFrame/BetterTween'\nimport { tweenProgress } from '../shared-utils/animationFrame/BetterTween'\nimport type * as PluginType from './typings'\nimport { CURRENT_PANO_IMAGE_DEFAULT_IMAGE, equal } from '../shared-utils'\nimport { loadTexture } from '../shared-utils/three/loadTexture'\n\nexport class CurrentPanoImagePluginController extends BasePlugin.Controller<PluginType.State, PluginType.EventMap> {\n // ==================== public properties ====================\n /** 插件当前状态 */\n public state: PluginType.State\n /** 插件配置项 */\n public get config() {\n return { ...this._config }\n }\n /** 是否已经被销毁 */\n public get disposed() {\n return this._disposed\n }\n /** 查询问题使用的调试对象 */\n public checkMsg = {\n /** mesh 隐藏的原因 */\n meshHidden: '',\n /** 插件 enabled 校验信息 */\n pluginDisabled: '',\n /** 插件 visible 校验信息 */\n pluginHidden: '',\n }\n\n // ==================== private properties ====================\n private group = new THREE.Group()\n private mesh: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n private textureLoadingPromise?: Promise<THREE.Texture> | null\n private opacityAnimeTween?: BetterTween<{ progress: number }>\n /** 是否正在走点动画中 */\n private isInPanoMoveAnime = false\n /** 上一次走点的全景图索引 */\n private lastArrivedPanoIndex = -1\n /** config 的原始值 */\n private _config: PluginType.Config\n /** disposed 的原始值 */\n private _disposed = false\n\n public constructor(five: Five, params?: PluginType.Params) {\n super(five)\n this.five = five\n\n // 处理 initialState\n const defaultState: PluginType.State = {\n enabled: true,\n visible: true,\n }\n this.state = Object.assign(defaultState, params?.initialState)\n\n // 处理 config\n const config: PluginType.Config = {\n width: 1.4,\n yOffset: 0.01,\n yRotate: 0,\n imageURL: CURRENT_PANO_IMAGE_DEFAULT_IMAGE,\n ...params?.config,\n }\n this._config = config\n\n this.group.name = 'current-pano-image-plugin-group'\n this.mesh = new THREE.Mesh(\n new THREE.PlaneGeometry(this.config.width, this.config.width),\n new THREE.MeshBasicMaterial({ transparent: true, opacity: 0, depthTest: false }),\n )\n this.mesh.visible = false\n this.group.add(this.mesh)\n this.updateMeshQuaternion(this.config.yRotate)\n\n if (!this.state.visible) this.checkMsg.pluginHidden = '初始值设置为隐藏'\n if (!this.state.enabled) this.checkMsg.pluginDisabled = '初始值设置为禁用'\n if (this.state.enabled) this._enable({ userAction: false })\n\n this.five.once('dispose', this.dispose)\n }\n\n /**\n * 启用插件,响应用户操作并展示UI\n * @param options\n */\n public enable(options: BasePlugin.BaseOptions = {}): void {\n if (this.disposed) return\n if (this.state.enabled) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: true }, userAction)\n this.checkMsg.pluginDisabled = ''\n this._enable({ userAction })\n }\n\n /** 禁用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public disable(options: BasePlugin.BaseOptions = {}) {\n if (this.disposed) return\n if (this.state.enabled === false) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: false }, userAction)\n this.checkMsg.pluginDisabled = '调用 disable 禁用'\n this._disable({ userAction })\n }\n\n /** 插件内容整体展示\n * @param `options` `<Partial<BaseOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public async show(options?: Partial<PluginType.ShowHideOptions>): Promise<void> {\n if (this.state.visible) return Promise.resolve()\n if (this.disposed) return Promise.reject(new Error('不能在已销毁的插件上调用 show'))\n const mergedOptions = { userAction: true, ...options }\n this.updateState({ visible: true }, mergedOptions.userAction)\n this.checkMsg.pluginHidden = ''\n this._show(mergedOptions)\n }\n\n /** 插件内容整体隐藏\n * @param `options` `<Partial<BaseOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public async hide(options?: Partial<PluginType.ShowHideOptions>) {\n if (this.state.visible === false) return\n const mergedOptions = { userAction: true, ...options }\n this.updateState({ visible: false }, mergedOptions.userAction)\n this.checkMsg.pluginDisabled = '调用 hide 隐藏'\n this._hide(mergedOptions)\n }\n\n /** 更改插件 State\n * @param `state` `<Partial<Plugin.State>>` 插件属性 `state` 的子集。\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public setState(state: Partial<PluginType.State>, options: BasePlugin.BaseOptions = {}) {\n if (this.disposed) return\n const prevState = this.state\n if (equal(state, prevState, { deep: true })) return\n\n const userAction = options.userAction !== undefined ? options.userAction : true\n this.updateState(state, userAction)\n\n if (state.enabled !== undefined && prevState.enabled !== state.enabled) {\n state.enabled ? (this.checkMsg.pluginDisabled = '') : (this.checkMsg.pluginDisabled = '调用 setState 禁用')\n state.enabled ? this._enable({ userAction }) : this._disable({ userAction })\n }\n\n if (state.visible !== undefined && prevState.visible !== state.visible) {\n const options = { userAction, anime: { duration: 500 } }\n state.visible ? (this.checkMsg.pluginHidden = '') : (this.checkMsg.pluginHidden = '调用 setState 隐藏')\n state.visible ? this._show(options) : this._hide(options)\n }\n }\n\n /** 更改插件 Config\n * @param `config` `<Partial<Plugin.Config>>` 插件属性 `config` 的子集。\n * @param `options` `<Option> | <undefined>`\n */\n public updateConfig(config: Partial<PluginType.Config>, options: BasePlugin.BaseOptions = {}) {\n if (this.disposed) return\n const prevConfig = this.config\n const newConfig = { ...prevConfig, ...config }\n this._config = newConfig\n if (prevConfig.imageURL !== newConfig.imageURL) this.reloadTexture(newConfig.imageURL)\n if (prevConfig.yOffset !== newConfig.yOffset) this.updateMeshPosition(this.five.getCurrentState().panoIndex)\n if (prevConfig.yRotate !== newConfig.yRotate) this.updateMeshQuaternion(newConfig.yRotate)\n if (prevConfig.width !== newConfig.width) this.mesh.geometry = new THREE.PlaneGeometry(newConfig.width, newConfig.width)\n this.hooks.emit('configChange', { prevConfig, config: newConfig, userAction: options.userAction ?? true })\n }\n\n /**\n * 销毁插件\n * @todo 销毁贴图时,最好还是直接销毁贴图吧,this.mesh?.material.map 这种都是很深层的引用了。THREE 的建议我看也是自己去管理和销毁公共贴图。\n */\n public dispose = () => {\n if (this.disposed) return\n this._disposed = true\n this.opacityAnimeTween?.dispose()\n this.opacityAnimeTween = undefined\n this.textureLoadingPromise = null\n this.mesh.visible = false\n this.five.scene.remove(this.group)\n this.group.remove(...this.group.children)\n this.five.off('dispose', this.dispose)\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('willLoad', this.onFiveWillLoad)\n this.five.off('modeChange', this.onFiveModeChange)\n }\n\n /** 问什么看不到模型 */\n public __whyCantSeeMesh() {\n if (this.disposed) return '插件已销毁'\n if (this.checkMsg.pluginDisabled) return this.checkMsg.pluginDisabled\n if (this.checkMsg.pluginHidden) return this.checkMsg.pluginHidden\n if (this.checkMsg.meshHidden) return this.checkMsg.meshHidden\n }\n\n private updateState(state: Partial<PluginType.State>, userAction: boolean) {\n const prevState = this.state\n this.state = { ...this.state, ...state }\n this.hooks.emit('stateChange', { state: this.state, prevState, userAction })\n }\n\n /** 根据各种条件更新 Mesh 的可见性 */\n private updateMeshVisible() {\n const { result, msg } = this.checkMeshVisible()\n this.checkMsg.meshHidden = msg\n if (result !== this.mesh.visible) this.onMeshVisibleChange(result)\n }\n\n private isCurrentOwnerWork(workCode = this.five.getCurrentState().workCode) {\n return !!this.workCode && workCode === this.workCode && this.five.getCurrentState().workCode === this.workCode\n && this.workUtil.work?.workCode === this.workCode\n }\n\n /** 根据点位更新 Mesh 坐标 */\n private updateMeshPosition(panoIndex: number) {\n if (!this.isCurrentOwnerWork()) return\n const standingPosition = this.workUtil.getObserverStandingPosition(panoIndex)\n if (!standingPosition) {\n console.warn('CurrentPanoImagePlugin: 无法获取到当前点位的 standingPosition')\n return\n }\n const position = standingPosition.clone().setY(standingPosition.y + this.config.yOffset)\n if (position) this.mesh.position.copy(position)\n }\n\n /** 重新加载贴图,调用时会先清除已有的贴图 */\n private async reloadTexture(url: string) {\n this.mesh.material.map = null\n if (url !== '') {\n const textureLoadingPromise = loadTexture(url)\n this.textureLoadingPromise = textureLoadingPromise\n const texture = await textureLoadingPromise\n if (this.disposed) { texture.dispose(); return }\n // texture.minFilter 默认是 THREE.LinearMipmapLinearFilter\n texture.minFilter = THREE.LinearFilter\n // texture.magFilter 不需要改,默认就是 THREE.LinearFilter\n // 需要判断一下 Promise 的一致性,防止在加载过程中,又加载了新的贴图\n if (this.textureLoadingPromise === textureLoadingPromise) {\n this.onTextureLoaded(texture)\n this.textureLoadingPromise = null\n }\n }\n this.updateMeshVisible()\n }\n\n /** north_rad 变化时,需要更新模型的旋转角度 */\n private updateMeshQuaternion(rad: number) {\n const quaternion = new THREE.Quaternion()\n quaternion.multiplyQuaternions(\n // 沿着自身 X 轴旋转 -90 度\n new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 2),\n // 沿着自身 Z 轴旋转 rad 弧度\n new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), rad),\n )\n this.mesh.quaternion.copy(quaternion)\n }\n\n private checkMeshVisible = (): { result: boolean; msg: string } => {\n if (this.disposed) return { result: false, msg: '插件已销毁' }\n if (!this.state.visible) return { result: false, msg: '插件隐藏' }\n if (this.config.imageURL === '') return { result: false, msg: '图片不存在' }\n if (!this.mesh.material.map) return { result: false, msg: '指南针贴图未加载' }\n if (!this.five.work) return { result: false, msg: 'Five 数据未加载' }\n if (!this.isCurrentOwnerWork()) return { result: false, msg: '当前 Work 不是插件所属 Work' }\n if (this.five.getCurrentState().mode !== 'Panorama') return { result: false, msg: '非全景模式' }\n if (this.isInPanoMoveAnime) return { result: false, msg: '处于走点动画中' }\n return { result: true, msg: '' }\n }\n\n private _enable(options: { userAction: boolean }) {\n this.hooks.emit('enable', { userAction: options.userAction })\n\n // 插件启用时,再加载贴图\n if (this.config.imageURL && !this.mesh.material.map && !this.textureLoadingPromise) {\n this.reloadTexture(this.config.imageURL)\n }\n\n // resume model effects\n this.five.scene.add(this.group)\n this.five.needsRender = true\n\n if (this.five.work) this.onFiveWillLoad()\n // enable may precede this owner's first Work; normal panoArrived will position it after loading.\n if (this.isCurrentOwnerWork() && this.five.getCurrentState().mode === 'Panorama') {\n this.onFiveModeChange()\n this.onFivePanoArrived(this.five.getCurrentState().panoIndex)\n }\n\n // resume event effects\n this.five.on('willLoad', this.onFiveWillLoad)\n this.five.on('panoArrived', this.onFivePanoArrived)\n this.five.on('panoWillArrive', this.onFivePanoWillArrive)\n this.five.on('modeChange', this.onFiveModeChange)\n }\n\n private _disable(options: { userAction: boolean }) {\n this.hooks.emit('disable', { userAction: options.userAction })\n\n // dispose model effects\n this.five.scene.remove(this.group)\n this.five.needsRender = true\n\n // dispose event effects\n this.five.off('willLoad', this.onFiveWillLoad)\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('modeChange', this.onFiveModeChange)\n }\n\n private _show(options: PluginType.ShowHideOptions) {\n this.hooks.emit('show', options)\n this.updateMeshVisible()\n this.five.needsRender = true\n }\n\n private _hide(options: PluginType.ShowHideOptions) {\n this.hooks.emit('hide', options)\n this.updateMeshVisible()\n this.five.needsRender = true\n }\n\n /** 贴图加载完成的回调 */\n private onTextureLoaded = (texture: THREE.Texture) => {\n this.mesh.material.map = texture\n this.mesh.material.needsUpdate = true\n this.updateMeshVisible()\n }\n\n /** Five load Work 后 */\n private onFiveWillLoad = () => {\n // 重启插件时,重置 lastArrivedPanoIndex\n this.lastArrivedPanoIndex = -1\n\n this.updateMeshVisible()\n }\n\n /** 走点前 */\n private onFivePanoWillArrive = (panoIndex: number, state?: Partial<Five['state']>) => {\n if (!this.isCurrentOwnerWork(state?.workCode)) {\n this.lastArrivedPanoIndex = -1\n this.isInPanoMoveAnime = true\n this.opacityAnimeTween?.dispose()\n this.updateMeshVisible()\n return\n }\n if (panoIndex === this.five.getCurrentState().panoIndex) return\n this.isInPanoMoveAnime = true\n this.opacityAnimeTween?.dispose()\n this.updateMeshVisible()\n }\n\n /** 走点后 */\n\n private onFivePanoArrived = (panoIndex: number, state?: Partial<Five['state']>) => {\n if (!this.isCurrentOwnerWork(state?.workCode)) {\n // A global arrival may belong to another Work in the same Five.\n // Do not use its pano index for this owner's position or arrival cache.\n if (!this.isCurrentOwnerWork()) this.lastArrivedPanoIndex = -1\n this.updateMeshVisible()\n return\n }\n // 过滤同一个点位重复 arrived\n if (panoIndex === this.lastArrivedPanoIndex) return\n this.lastArrivedPanoIndex = panoIndex\n this.isInPanoMoveAnime = false\n // 根据点位跟新位置\n this.updateMeshPosition(panoIndex)\n this.updateMeshVisible()\n this.five.needsRender = true\n }\n\n private onMeshVisibleChange = (visible: boolean) => {\n this.opacityAnimeTween?.dispose()\n if (!visible) {\n this.mesh.visible = false\n return\n }\n\n this.mesh.material.setValues({ opacity: 0 })\n this.mesh.visible = true\n this.opacityAnimeTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.mesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n\n private onFiveModeChange = () => {\n this.updateMeshVisible()\n }\n}\n","import type { FivePlugin } from '@realsee/five-webgpu'\nimport type * as CurrentPanoImagePluginType from './typings'\nimport { CurrentPanoImagePluginController } from './Controller'\n\nexport const CurrentPanoImagePlugin: FivePlugin<CurrentPanoImagePluginType.Params, CurrentPanoImagePluginController> = (five, params) =>\n new CurrentPanoImagePluginController(five, params)\n\nexport default CurrentPanoImagePlugin\nexport type CurrentPanoImagePluginExportType = CurrentPanoImagePluginController\nexport type { CurrentPanoImagePluginType }\n"],"mappings":"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"}
@@ -0,0 +1,469 @@
1
+ import { g as e, i as t, o as n, r, s as i, u as a } from "./PointHelper-grrf8vu1.js";
2
+ import { r as o } from "./resizeObserver-AY-35us4.js";
3
+ import { t as s } from "./rayOnLine-CrCXTByv.js";
4
+ import * as c from "three/webgpu";
5
+ //#region src/MeasurePluginV2/PointSelector.ts
6
+ var l = new c.Vector3(), u = new c.Vector3(), d = new c.Vector3(), f = new c.Vector3(), p = 4, m = .6, h = 60;
7
+ function g(e) {
8
+ let { rayOrigin: t, rayDirection: n, line: r, clampToLine: i } = e;
9
+ l.subVectors(r.end, r.start);
10
+ let a = l.lengthSq();
11
+ if (a < 1e-12) return 0;
12
+ u.subVectors(t, r.start);
13
+ let o = n.dot(l), s = n.dot(u), d = l.dot(u), f = a - o * o, p;
14
+ return p = f < 1e-9 ? new c.Vector3().subVectors(r.start, t).cross(n).length() <= new c.Vector3().subVectors(r.end, t).cross(n).length() ? 0 : 1 : (d - o * s) / f, i ? Math.min(1, Math.max(0, p)) : p;
15
+ }
16
+ var _ = class extends r {
17
+ adhereLineProvider = null;
18
+ dynamicAdhereScreenRadius = 10;
19
+ dynamicAdhereKeepScreenRadius = 14;
20
+ dynamicAdhereMaxDistance = .45;
21
+ dynamicAdhereLine = null;
22
+ get mouseNdcPosition() {
23
+ return this.mode === "fixed" ? {
24
+ x: .5,
25
+ y: .5
26
+ } : super.mouseNdcPosition;
27
+ }
28
+ refresh() {
29
+ let e = this.mouseNdcPosition;
30
+ this.enabled && e && this.updateByNdcPosition(e);
31
+ }
32
+ onFocusLost = () => {
33
+ this.adhereEnabled = !0, this.clearDynamicAdhereLine();
34
+ };
35
+ enable() {
36
+ super.enable(), window.addEventListener("blur", this.onFocusLost);
37
+ }
38
+ disable() {
39
+ window.removeEventListener("blur", this.onFocusLost), this.clearDynamicAdhereLine(), super.disable(), this.adhereEnabled = !0;
40
+ }
41
+ clearDynamicAdhereLine() {
42
+ this.dynamicAdhereLine = null;
43
+ }
44
+ updatePointSelectorHelperIntersect = (e) => {
45
+ if (!e) {
46
+ this.dynamicAdhereLine = null, this.pointSelectorHelper.hide(), this.pointSelectorHelper.position = e, this.emit("intersectionUpdate", e), this.five.getElement().style.cursor = t;
47
+ return;
48
+ }
49
+ this.onEnter(), this.cursorError || (this.five.getElement().style.cursor = "");
50
+ let n = { ...e };
51
+ if (this.adhereEnabled && this.mouseNdcPosition && this.five.renderer && typeof this.adhereRadius == "number") {
52
+ let t = {
53
+ x: this.mouseNdcPosition.x,
54
+ y: 1 - this.mouseNdcPosition.y
55
+ }, r = this.five.renderer.getSize(new c.Vector2()), a = this.adhereLineProvider?.({
56
+ intersection: e,
57
+ pointSelector: this
58
+ }) ?? [];
59
+ if (typeof this.adherePoints == "function" || this.adherePlane.length > 0 || this.adhereLine.length > 0 || a.length > 0 || this.dynamicAdhereLine !== null) {
60
+ for (let t of this.adherePlane) {
61
+ let r = t.distanceToPoint(e.point), a = t.projectPoint(e.point, new c.Vector3());
62
+ (!this.plane || this.plane.distanceToPoint(a) < .01) && (a = this.plane?.projectPoint(a, new c.Vector3()) ?? a, r < this.adhereRadius && (n.point = a.clone(), n.adherePoint = a.clone(), this.plane || (n.face = i(t.normal.clone())), n.isAdsorbed = !0));
63
+ }
64
+ for (let i of this.adhereLine) {
65
+ let a = i.closestPointToPoint(e.point, !1, new c.Vector3());
66
+ if (a.distanceTo(e.point) < this.adhereRadius) (!this.plane || this.plane.distanceToPoint(a) < .01) && (a = this.plane?.projectPoint(a, new c.Vector3()) ?? a, n.point = a.clone(), n.adhereLine = i.clone(), n.isAdsorbed = !0);
67
+ else {
68
+ let a = s({
69
+ raycaster: new o(this.five.camera.position, e.point.clone().sub(this.five.camera.position).normalize()),
70
+ line: i,
71
+ clampToLine: !1
72
+ }), l = a.clone().project(this.five.camera);
73
+ if (l.z <= 1) {
74
+ let e = {
75
+ x: (l.x + 1) / 2,
76
+ y: (1 - l.y) / 2
77
+ }, o = {
78
+ x: Math.abs(e.x - t.x) * r.width,
79
+ y: Math.abs(e.y - t.y) * r.height
80
+ }, s = a.clone();
81
+ o.x < 10 && o.y < 10 && (!this.plane || this.plane.distanceToPoint(s) < .01) && (s = this.plane?.projectPoint(s, new c.Vector3()) ?? s, n.point = s.clone(), n.adhereLine = i.clone(), n.isAdsorbed = !0);
82
+ }
83
+ }
84
+ }
85
+ let l = this.getBestDynamicAdhereResult({
86
+ lines: a,
87
+ point: e.point,
88
+ mouseNdcPosition: t,
89
+ size: r
90
+ });
91
+ l && (n.point = l.point, n.adhereLine = l.line.clone(), n.isAdsorbed = !0);
92
+ for (let r of this.adherePoints?.({
93
+ intersection: e,
94
+ pointSelectorInstance: this
95
+ }) ?? []) {
96
+ let a = r;
97
+ if (a.IsAlwaysVisible = r.IsAlwaysVisible, !(this.plane && this.plane.distanceToPoint(a) > .01)) {
98
+ if (a.distanceTo(e.point) < this.adhereRadius) {
99
+ n.point = this.plane?.projectPoint(a, new c.Vector3()) ?? a.clone(), !this.plane && r.normal && (n.face = i(r.normal)), n.isAdsorbed = !0;
100
+ break;
101
+ }
102
+ {
103
+ let e = a.clone().project(this.five.camera);
104
+ if (e.z > 1) continue;
105
+ let o = this.five.renderer.getSize(new c.Vector2()), s = {
106
+ x: (e.x + 1) / 2,
107
+ y: (1 - e.y) / 2
108
+ }, l = {
109
+ x: Math.abs(s.x - t.x) * o.width,
110
+ y: Math.abs(s.y - t.y) * o.height
111
+ };
112
+ if (l.x < 10 && l.y < 10) {
113
+ let e = !1;
114
+ if (a.IsAlwaysVisible) e = !0;
115
+ else {
116
+ let t = new c.Raycaster();
117
+ t.setFromCamera(new c.Vector2(s.x, s.y), this.five.camera);
118
+ let n = this.five.model.intersectRaycaster(t)[0], r = this.five.camera.position.distanceTo(a);
119
+ n && n.distance < r + .1 && (e = !0);
120
+ }
121
+ if (e) {
122
+ n.point = a.clone(), !this.plane && r.normal && (n.face = i(r.normal)), n.isAdsorbed = !0;
123
+ break;
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ } else this.dynamicAdhereLine = null;
131
+ this.pointSelectorHelper.updateWithIntersect(n, { emitEvent: !1 }), this.emit("intersectionUpdate", n);
132
+ };
133
+ getBestDynamicAdhereResult(e) {
134
+ let { lines: t, point: r, mouseNdcPosition: i, size: a } = e;
135
+ if (t.length === 0 && !this.dynamicAdhereLine) return this.dynamicAdhereLine = null, null;
136
+ let o = n(this.five, {
137
+ x: i.x,
138
+ y: 1 - i.y
139
+ }), s = o.ray.origin, l = o.ray.direction, u = i.x * a.width, _ = i.y * a.height, v = [], y = (e, t) => {
140
+ let n = g({
141
+ rayOrigin: s,
142
+ rayDirection: l,
143
+ line: e,
144
+ clampToLine: !0
145
+ });
146
+ d.lerpVectors(e.start, e.end, n);
147
+ let i = d.distanceTo(r);
148
+ if (i > this.dynamicAdhereMaxDistance || this.plane && Math.abs(this.plane.distanceToPoint(d)) > .01 || (f.copy(d).project(this.five.camera), f.z > 1)) return null;
149
+ let o = Math.hypot((f.x + 1) / 2 * a.width - u, (1 - f.y) / 2 * a.height - _), c = 1 - .6 * (this.dynamicAdhereMaxDistance > 0 ? Math.min(1, i / this.dynamicAdhereMaxDistance) : 0);
150
+ return o > (t ? this.dynamicAdhereKeepScreenRadius : this.dynamicAdhereScreenRadius) * c ? null : {
151
+ line: e,
152
+ t: n,
153
+ screenDistance: o,
154
+ depthDistance: i,
155
+ isSticky: t
156
+ };
157
+ }, b = this.dynamicAdhereLine;
158
+ if (b) {
159
+ let e = y(b, !0);
160
+ e && v.push(e);
161
+ }
162
+ for (let e of t) {
163
+ let t = y(e, !1);
164
+ t && v.push(t);
165
+ }
166
+ if (v.length === 0) return this.dynamicAdhereLine = null, null;
167
+ let x = null, S = v.find((e) => e.isSticky);
168
+ if (S && S.screenDistance <= this.dynamicAdhereScreenRadius * m && (x = S), !x) {
169
+ let e = Infinity;
170
+ for (let t of v) {
171
+ let n = t.screenDistance + t.depthDistance * h - (t.isSticky ? p : 0);
172
+ n < e && (e = n, x = t);
173
+ }
174
+ }
175
+ if (!x) return this.dynamicAdhereLine = null, null;
176
+ this.dynamicAdhereLine = x.line.clone();
177
+ let C = new c.Vector3().lerpVectors(x.line.start, x.line.end, x.t);
178
+ return {
179
+ line: x.line,
180
+ point: this.plane?.projectPoint(C, new c.Vector3()) ?? C
181
+ };
182
+ }
183
+ }, v = {
184
+ axisXColor: "#EC4A4E",
185
+ axisYColor: "#1677FF",
186
+ axisZColor: "#065C08",
187
+ axisLineWidth: 1.5,
188
+ axisOpacity: .9,
189
+ axisLengthRadiusScale: .9,
190
+ axisTipDotRadiusScale: .03,
191
+ planeBorderColor: "#FF4D4F",
192
+ planeBorderWidth: 1.5,
193
+ planeBorderOpacity: .9,
194
+ planeSideRadiusScale: 1.2,
195
+ axisSnapAngle: 15
196
+ }, y = [
197
+ new c.Vector3(1, 0, 0),
198
+ new c.Vector3(0, 1, 0),
199
+ new c.Vector3(0, 0, 1)
200
+ ], b = [
201
+ v.axisXColor,
202
+ v.axisYColor,
203
+ v.axisZColor
204
+ ];
205
+ function x(e, t) {
206
+ let n = e.clone().project(t.camera), r = (n.x + 1) / 2 * t.renderSize.x, i = (n.y + 1) / 2 * t.renderSize.y;
207
+ return {
208
+ x: (r - t.readLeft) * t.pixelRadio,
209
+ y: (t.readTop + t.readPixelsHeight - i) * t.pixelRadio
210
+ };
211
+ }
212
+ function S(e) {
213
+ let t = e.face;
214
+ if (!t?.normal) return null;
215
+ let n = t.normal.clone();
216
+ return n.lengthSq() < 1e-12 ? null : n.normalize();
217
+ }
218
+ function C(e) {
219
+ let t = e.clone().normalize(), n = 0, r = 0;
220
+ y.forEach((e, i) => {
221
+ let a = Math.abs(t.dot(e));
222
+ a > r && (r = a, n = i);
223
+ });
224
+ let i = Math.cos(c.MathUtils.degToRad(v.axisSnapAngle));
225
+ if (r < i) return {
226
+ normal: t,
227
+ alignedAxisIndex: -1
228
+ };
229
+ let a = y[n], o = t.dot(a) >= 0 ? 1 : -1;
230
+ return {
231
+ normal: a.clone().multiplyScalar(o),
232
+ alignedAxisIndex: n
233
+ };
234
+ }
235
+ function w(e) {
236
+ let t = C(e), n = t.normal, r = n.clone().multiplyScalar(n.dot(y[1])), i = y[1].clone().sub(r);
237
+ return i.lengthSq() < 1e-8 && (i = y[2].clone().sub(n.clone().multiplyScalar(n.dot(y[2])))), i.normalize(), {
238
+ normal: n,
239
+ xAxis: new c.Vector3().crossVectors(i, n).normalize(),
240
+ yAxis: i,
241
+ alignedAxisIndex: t.alignedAxisIndex
242
+ };
243
+ }
244
+ function T(e, t) {
245
+ return Math.max(1e-4, t.position.distanceTo(e) * .01);
246
+ }
247
+ function E(e, t) {
248
+ let n = x(e.point, e.viewport), r = x(e.point.clone().addScaledVector(t, e.probeLength), e.viewport);
249
+ return {
250
+ x: r.x - n.x,
251
+ y: r.y - n.y
252
+ };
253
+ }
254
+ function D(e, t, n) {
255
+ let r = E(e, t), i = Math.hypot(r.x, r.y);
256
+ if (!Number.isFinite(i) || i < 1e-6) return 0;
257
+ let a = x(e.point, e.viewport), o = n / i * e.probeLength;
258
+ for (let r = 0; r < 2; r += 1) {
259
+ let r = x(e.point.clone().addScaledVector(t, o), e.viewport), i = Math.hypot(r.x - a.x, r.y - a.y);
260
+ if (!Number.isFinite(i) || i < 1e-6) break;
261
+ o *= n / i;
262
+ }
263
+ return o;
264
+ }
265
+ function O(e, t) {
266
+ let { context: n, viewport: r, point: i } = e, a = Math.min(r.canvasWidth, r.canvasHeight) / 2 * v.planeSideRadiusScale / 2, o = D(e, t.xAxis, a), s = D(e, t.yAxis, a);
267
+ if (!(o > 0) || !(s > 0)) return;
268
+ let c = [
269
+ i.clone().addScaledVector(t.xAxis, o).addScaledVector(t.yAxis, s),
270
+ i.clone().addScaledVector(t.xAxis, -o).addScaledVector(t.yAxis, s),
271
+ i.clone().addScaledVector(t.xAxis, -o).addScaledVector(t.yAxis, -s),
272
+ i.clone().addScaledVector(t.xAxis, o).addScaledVector(t.yAxis, -s)
273
+ ].map((e) => x(e, r));
274
+ c.some((e) => !Number.isFinite(e.x) || !Number.isFinite(e.y)) || (n.save(), n.beginPath(), c.forEach((e, t) => {
275
+ t === 0 ? n.moveTo(e.x, e.y) : n.lineTo(e.x, e.y);
276
+ }), n.closePath(), n.strokeStyle = v.planeBorderColor, n.globalAlpha = v.planeBorderOpacity, n.lineWidth = v.planeBorderWidth, n.stroke(), n.restore());
277
+ }
278
+ function k(e, t) {
279
+ let { context: n, viewport: r, point: i } = e, a = Math.min(r.canvasWidth, r.canvasHeight) / 2, o = a * v.axisLengthRadiusScale, s = a * v.axisTipDotRadiusScale, c = x(i, r);
280
+ if (!Number.isFinite(c.x) || !Number.isFinite(c.y)) return;
281
+ let l = (t) => {
282
+ let n = E(e, t), r = Math.hypot(n.x, n.y);
283
+ return !Number.isFinite(r) || r < .001 ? null : {
284
+ x: n.x / r,
285
+ y: n.y / r
286
+ };
287
+ }, u = (t) => D(e, t, o), d = (e, t, r) => {
288
+ [
289
+ e.x,
290
+ e.y,
291
+ t.x,
292
+ t.y
293
+ ].every((e) => Number.isFinite(e)) && (n.strokeStyle = r, n.globalAlpha = v.axisOpacity, n.lineWidth = v.axisLineWidth, n.beginPath(), n.moveTo(e.x, e.y), n.lineTo(t.x, t.y), n.stroke());
294
+ }, f = (t, n) => {
295
+ if (!l(t)) return;
296
+ let a = t.clone().negate(), s = D(e, t, o), c = D(e, a, o);
297
+ if (!(s > 0) || !(c > 0)) return;
298
+ let u = x(i.clone().addScaledVector(a, c), r), f = x(i.clone().addScaledVector(t, s), r);
299
+ d(u, f, n);
300
+ };
301
+ n.save(), n.lineCap = "round", t ? (f(t.xAxis, v.axisXColor), f(t.yAxis, v.axisYColor), ((e, t, a) => {
302
+ if (!l(e)) return;
303
+ let o = u(e);
304
+ if (!(o > 0)) return;
305
+ let f = x(i.clone().addScaledVector(e, o), r);
306
+ d(c, f, t), a && Number.isFinite(f.x) && Number.isFinite(f.y) && (n.fillStyle = t, n.globalAlpha = v.axisOpacity, n.beginPath(), n.arc(f.x, f.y, s, 0, Math.PI * 2), n.fill());
307
+ })(t.normal, v.axisZColor, !0)) : y.forEach((e, t) => f(e, b[t])), n.restore();
308
+ }
309
+ function A(e, t, n) {
310
+ let r = n.point;
311
+ if (!r || !Number.isFinite(r.x) || !Number.isFinite(r.y) || !Number.isFinite(r.z)) return;
312
+ let i = {
313
+ context: e,
314
+ viewport: t,
315
+ point: r,
316
+ probeLength: T(r, t.camera)
317
+ }, a = S(n), o = a ? w(a) : null;
318
+ o && O(i, o), k(i, o);
319
+ }
320
+ //#endregion
321
+ //#region src/MeasurePluginV2/Magnifier.ts
322
+ var j = class extends e {
323
+ overlayFive;
324
+ overlayContext = null;
325
+ overlayIntersection = null;
326
+ overlayEnabled;
327
+ constructor(e, t) {
328
+ super(e, t ?? {}), this.overlayFive = e, this.overlayEnabled = t?.overlayEnabled !== !1, this.afterRender = this.renderOverlay;
329
+ }
330
+ setIntersection(e) {
331
+ this.overlayIntersection = e;
332
+ }
333
+ setOverlayEnabled(e) {
334
+ this.overlayEnabled = e;
335
+ }
336
+ renderOverlay = (e) => {
337
+ if (!this.overlayEnabled || !this.state.enabled) return;
338
+ let t = this.overlayIntersection;
339
+ if (!t || t.isVirtual || !t.point) return;
340
+ let n = this.overlayFive.camera, r = t.point.clone().project(n);
341
+ if (![r.x, r.y].every((e) => Number.isFinite(e))) return;
342
+ let i = (r.x + 1) / 2 * e.renderSize.x, a = (r.y + 1) / 2 * e.renderSize.y, o = e.readLeft + e.readWidth / 2, s = e.readTop + e.readHeight / 2;
343
+ if (Math.abs(i - o) > 1 || Math.abs(a - s) > 1) return;
344
+ let c = this.getOverlayContext();
345
+ if (!c) return;
346
+ let l = {
347
+ camera: n,
348
+ renderSize: e.renderSize,
349
+ readLeft: e.readLeft,
350
+ readTop: e.readTop,
351
+ readPixelsHeight: e.readHeight,
352
+ pixelRadio: e.pixelRatio,
353
+ canvasWidth: e.canvasWidth,
354
+ canvasHeight: e.canvasHeight
355
+ };
356
+ try {
357
+ A(c, l, t);
358
+ } catch (e) {
359
+ console.warn("MeasureMagnifier: 叠加层绘制失败", e);
360
+ }
361
+ };
362
+ getOverlayContext() {
363
+ return this.overlayContext ||= this.canvas.getContext("2d"), this.overlayContext;
364
+ }
365
+ }, M = .003;
366
+ function N(e, t, n) {
367
+ let r = new c.CurvePath();
368
+ r.add(new c.LineCurve3(e, t));
369
+ let i = new c.TubeGeometry(r, 4, M, 8), a = new c.MeshBasicMaterial({
370
+ color: n,
371
+ depthTest: !1,
372
+ transparent: !0
373
+ }), o = new c.Mesh(i, a);
374
+ return o.disableGetPixel = !0, o;
375
+ }
376
+ var P = class extends a {
377
+ overlayGroup = new c.Group();
378
+ constructor(e) {
379
+ super(e), this.remove(this.cssBallMesh), this.paintAxisMesh(this.lineMesh, v.axisZColor), this.paintAxisMesh(this.ballMesh, v.axisZColor);
380
+ let t = this.ballMesh.position.z || .18, n = t * v.planeSideRadiusScale / (2 * v.axisLengthRadiusScale), r = N(new c.Vector3(-t, 0, 0), new c.Vector3(t, 0, 0), v.axisXColor), i = N(new c.Vector3(0, -t, 0), new c.Vector3(0, t, 0), v.axisYColor);
381
+ r.renderOrder = 3, i.renderOrder = 3, this.overlayGroup.add(r, i);
382
+ let a = [
383
+ new c.Vector3(-n, -n, 0),
384
+ new c.Vector3(n, -n, 0),
385
+ new c.Vector3(n, n, 0),
386
+ new c.Vector3(-n, n, 0)
387
+ ];
388
+ a.forEach((e, t) => {
389
+ let n = N(e, a[(t + 1) % a.length], v.planeBorderColor);
390
+ n.renderOrder = 2, this.overlayGroup.add(n);
391
+ }), this.add(this.overlayGroup), this.hide();
392
+ }
393
+ updateWithIntersect(e) {
394
+ let t = e?.point;
395
+ if (!t) return;
396
+ this.position.copy(t);
397
+ let n = e.isVirtual ? null : S(e);
398
+ if (this.overlayGroup.visible = n !== null, this.lineMesh.visible = n !== null, this.ballMesh.visible = n !== null, this.planeMesh.visible = n !== null, this.ringMesh.visible = n !== null, !n) return;
399
+ let r = w(n);
400
+ this.quaternion.setFromRotationMatrix(new c.Matrix4().makeBasis(r.xAxis, r.yAxis, r.normal));
401
+ }
402
+ show() {
403
+ this.visible = !0;
404
+ }
405
+ hide() {
406
+ this.visible = !1;
407
+ }
408
+ paintAxisMesh(e, t) {
409
+ let n = e.material;
410
+ n.color.set(t), n.needsUpdate = !0;
411
+ }
412
+ }, F = {
413
+ enabled: !0,
414
+ radius: .3,
415
+ threshold: 30,
416
+ maxEdges: 240,
417
+ cacheStep: .12
418
+ };
419
+ function I(e) {
420
+ return e === void 0 ? { ...F } : e === !1 ? {
421
+ ...F,
422
+ enabled: !1
423
+ } : e === !0 ? {
424
+ ...F,
425
+ enabled: !0
426
+ } : {
427
+ ...F,
428
+ enabled: !0,
429
+ ...e
430
+ };
431
+ }
432
+ var L = new c.Vector3();
433
+ function R(e, t) {
434
+ return t.closestPointToPoint(e, !0, L), L.distanceToSquared(e);
435
+ }
436
+ function z(e, t, n) {
437
+ if (!n.enabled || !e || typeof e.getEdgesBySphere != "function" || ![
438
+ t.x,
439
+ t.y,
440
+ t.z
441
+ ].every((e) => Number.isFinite(e))) return [];
442
+ let r = e.getEdgesBySphere(new c.Sphere(t.clone(), n.radius), c.MathUtils.degToRad(n.threshold));
443
+ if (!r?.length) return [];
444
+ let i = n.radius * n.radius;
445
+ return r.map((e) => ({
446
+ line: e,
447
+ distanceSq: R(t, e)
448
+ })).filter((e) => e.distanceSq <= i).sort((e, t) => e.distanceSq - t.distanceSq).slice(0, n.maxEdges).map((e) => e.line);
449
+ }
450
+ var B = class {
451
+ center = new c.Vector3();
452
+ edges = [];
453
+ valid = !1;
454
+ query(e, t, n) {
455
+ if (!n.enabled) return this.clear(), [];
456
+ let r = n.cacheStep * n.cacheStep;
457
+ return this.valid && this.center.distanceToSquared(t) <= r || (this.center.copy(t), this.edges = z(e, t, n), this.valid = !0), this.edges;
458
+ }
459
+ clear() {
460
+ this.valid = !1, this.edges = [];
461
+ }
462
+ get size() {
463
+ return this.edges.length;
464
+ }
465
+ };
466
+ //#endregion
467
+ export { P as a, I as i, B as n, j as o, z as r, _ as s, F as t };
468
+
469
+ //# sourceMappingURL=edgeSnap-8fdFCcXB.js.map