@realsee/dnalogel 4.0.0-webgpu.18 → 4.0.0-webgpu.20

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 (93) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/floorplan.js +1 -1
  3. package/dist/index.js +19 -19
  4. package/dist/internal/{BasePlugin-Cr_atQUC.js → BasePlugin-hxM1EHtV.js} +2 -2
  5. package/dist/internal/{BasePlugin-Cr_atQUC.js.map → BasePlugin-hxM1EHtV.js.map} +1 -1
  6. package/dist/internal/BasePluginWithData-BS2O9hNu.js +7 -0
  7. package/dist/internal/{BasePluginWithData-CIQpqYGe.js.map → BasePluginWithData-BS2O9hNu.js.map} +1 -1
  8. package/dist/internal/{Controller-Cq-mYkzT.js → Controller-CDLmWyXz.js} +3 -3
  9. package/dist/internal/{Controller-Cq-mYkzT.js.map → Controller-CDLmWyXz.js.map} +1 -1
  10. package/dist/internal/{Controller-BDT5_ZNe.js → Controller-CxAUW5kD.js} +2 -2
  11. package/dist/internal/{Controller-BDT5_ZNe.js.map → Controller-CxAUW5kD.js.map} +1 -1
  12. package/dist/internal/{Controller-5BvatEWD.js → Controller-DSKeCecj.js} +171 -154
  13. package/dist/internal/Controller-DSKeCecj.js.map +1 -0
  14. package/dist/internal/PointHelper-G9EgUMWo.js +1052 -0
  15. package/dist/internal/PointHelper-G9EgUMWo.js.map +1 -0
  16. package/dist/internal/{Rectangle-Z2T_h74M.js → Rectangle-HB8jF_bX.js} +3 -3
  17. package/dist/internal/{Rectangle-Z2T_h74M.js.map → Rectangle-HB8jF_bX.js.map} +1 -1
  18. package/dist/internal/{Work-PKaUMpXd.js → Work-6uuml2Ft.js} +4 -4
  19. package/dist/internal/{Work-PKaUMpXd.js.map → Work-6uuml2Ft.js.map} +1 -1
  20. package/dist/internal/{area-maker-BTGqxG6D.js → area-maker-D2ZIYsTG.js} +2 -2
  21. package/dist/internal/{area-maker-BTGqxG6D.js.map → area-maker-D2ZIYsTG.js.map} +1 -1
  22. package/dist/internal/{controller-B0hqJtoB.js → controller-DjCi781H.js} +4 -4
  23. package/dist/internal/{controller-B0hqJtoB.js.map → controller-DjCi781H.js.map} +1 -1
  24. package/dist/internal/{cruise-BkSbiLjd.js → cruise-DWxq9GTd.js} +2 -2
  25. package/dist/internal/{cruise-BkSbiLjd.js.map → cruise-DWxq9GTd.js.map} +1 -1
  26. package/dist/internal/{current-pano-image-DqyUFIP6.js → current-pano-image-DPLm0-o2.js} +2 -2
  27. package/dist/internal/{current-pano-image-DqyUFIP6.js.map → current-pano-image-DPLm0-o2.js.map} +1 -1
  28. package/dist/internal/{edgeSnap-8fdFCcXB.js → edgeSnap-CH0HidZm.js} +206 -83
  29. package/dist/internal/edgeSnap-CH0HidZm.js.map +1 -0
  30. package/dist/internal/{floorplan-Dkp7omYn.js → floorplan-B6Y-8xjB.js} +2 -2
  31. package/dist/internal/{floorplan-Dkp7omYn.js.map → floorplan-B6Y-8xjB.js.map} +1 -1
  32. package/dist/internal/{measure-KVSCjRnS.js → measure-DIstq55p.js} +2 -2
  33. package/dist/internal/{measure-KVSCjRnS.js.map → measure-DIstq55p.js.map} +1 -1
  34. package/dist/internal/measure-v2-Byp1mE5q.js +215 -0
  35. package/dist/internal/measure-v2-Byp1mE5q.js.map +1 -0
  36. package/dist/internal/{model-maker-L5eqUgkU.js → model-maker-Cea52AmN.js} +2 -2
  37. package/dist/internal/{model-maker-L5eqUgkU.js.map → model-maker-Cea52AmN.js.map} +1 -1
  38. package/dist/internal/{model-view-BWUU0-uq.js → model-view-DSRXOhPg.js} +12 -2
  39. package/dist/internal/model-view-DSRXOhPg.js.map +1 -0
  40. package/dist/internal/object3d-helper-JrdReT4Y.js +7 -0
  41. package/dist/internal/{object3d-helper-CUhRRdCQ.js.map → object3d-helper-JrdReT4Y.js.map} +1 -1
  42. package/dist/internal/{pano-compass-dmcsnFDQ.js → pano-compass-DENjS-F-.js} +2 -2
  43. package/dist/internal/{pano-compass-dmcsnFDQ.js.map → pano-compass-DENjS-F-.js.map} +1 -1
  44. package/dist/internal/{pano-door-label-C0sd66vf.js → pano-door-label-DFcBreFx.js} +2 -2
  45. package/dist/internal/{pano-door-label-C0sd66vf.js.map → pano-door-label-DFcBreFx.js.map} +1 -1
  46. package/dist/internal/{pano-measure-NbB7-uVE.js → pano-measure-bIqtdQ8N.js} +2 -2
  47. package/dist/internal/{pano-measure-NbB7-uVE.js.map → pano-measure-bIqtdQ8N.js.map} +1 -1
  48. package/dist/internal/{pano-measure-v2-CRPvPs0e.js → pano-measure-v2-BRr9Jses.js} +4 -4
  49. package/dist/internal/{pano-measure-v2-CRPvPs0e.js.map → pano-measure-v2-BRr9Jses.js.map} +1 -1
  50. package/dist/internal/{pano-tag-j8ZPJDDK.js → pano-tag-BI_eOX_D.js} +2 -2
  51. package/dist/internal/{pano-tag-j8ZPJDDK.js.map → pano-tag-BI_eOX_D.js.map} +1 -1
  52. package/dist/internal/{pano-video-Dcspq4j1.js → pano-video-D0dQTeX6.js} +2 -2
  53. package/dist/internal/{pano-video-Dcspq4j1.js.map → pano-video-D0dQTeX6.js.map} +1 -1
  54. package/dist/internal/{pipeline-CD2YkN5U.js → pipeline-CyleoezT.js} +2 -2
  55. package/dist/internal/{pipeline-CD2YkN5U.js.map → pipeline-CyleoezT.js.map} +1 -1
  56. package/dist/internal/{sculpt-CbEBEh9F.js → sculpt-BGx4Dudb.js} +3 -3
  57. package/dist/internal/{sculpt-CbEBEh9F.js.map → sculpt-BGx4Dudb.js.map} +1 -1
  58. package/dist/plugins/area-maker.js +1 -1
  59. package/dist/plugins/cruise.js +2 -2
  60. package/dist/plugins/current-pano-image.js +1 -1
  61. package/dist/plugins/guide-line.js +1 -1
  62. package/dist/plugins/measure-v2.js +2 -2
  63. package/dist/plugins/measure.js +2 -2
  64. package/dist/plugins/model-maker.js +1 -1
  65. package/dist/plugins/model-view.js +1 -1
  66. package/dist/plugins/object3d-helper.js +2 -2
  67. package/dist/plugins/pano-compass.js +1 -1
  68. package/dist/plugins/pano-door-label.js +1 -1
  69. package/dist/plugins/pano-measure-v2.js +1 -1
  70. package/dist/plugins/pano-measure.js +1 -1
  71. package/dist/plugins/pano-tag.js +2 -2
  72. package/dist/plugins/pano-video.js +1 -1
  73. package/dist/plugins/pipeline.js +1 -1
  74. package/dist/plugins/sculpt.js +2 -2
  75. package/dist/types/MeasurePlugin/Controller.d.ts +7 -0
  76. package/dist/types/MeasurePlugin/utils/MeasureMesh.d.ts +5 -0
  77. package/dist/types/MeasurePluginV2/Controller.d.ts +9 -0
  78. package/dist/types/MeasurePluginV2/Magnifier.d.ts +33 -0
  79. package/dist/types/MeasurePluginV2/PointOverlay.d.ts +5 -0
  80. package/dist/types/MeasurePluginV2/closeupView.d.ts +69 -0
  81. package/dist/types/MeasurePluginV2/normalMeasure.d.ts +116 -0
  82. package/dist/types/shared-utils/three/Magnifier.d.ts +55 -0
  83. package/dist/utils.js +1 -1
  84. package/package.json +1 -1
  85. package/dist/internal/BasePluginWithData-CIQpqYGe.js +0 -7
  86. package/dist/internal/Controller-5BvatEWD.js.map +0 -1
  87. package/dist/internal/PointHelper-grrf8vu1.js +0 -953
  88. package/dist/internal/PointHelper-grrf8vu1.js.map +0 -1
  89. package/dist/internal/edgeSnap-8fdFCcXB.js.map +0 -1
  90. package/dist/internal/measure-v2-DqjBlSeF.js +0 -83
  91. package/dist/internal/measure-v2-DqjBlSeF.js.map +0 -1
  92. package/dist/internal/model-view-BWUU0-uq.js.map +0 -1
  93. package/dist/internal/object3d-helper-CUhRRdCQ.js +0 -7
@@ -1,7 +1,7 @@
1
- import { i as e, t } from "./Work-PKaUMpXd.js";
1
+ import { i as e, t } from "./Work-6uuml2Ft.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-BkSbiLjd.js.map
7
+ //# sourceMappingURL=cruise-DWxq9GTd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cruise-BkSbiLjd.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-DWxq9GTd.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-Cr_atQUC.js";
5
+ import { t as i } from "./BasePlugin-hxM1EHtV.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-DqyUFIP6.js.map
219
+ //# sourceMappingURL=current-pano-image-DPLm0-o2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"current-pano-image-DqyUFIP6.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-DPLm0-o2.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":";;;;;;;AASA,IAAaK,IAAb,cAAsDL,EAA6D;CAGjH;CAEA,IAAW,SAAS;EAClB,OAAO,EAAE,GAAG,KAAK,QAAQ;CAC3B;CAEA,IAAW,WAAW;EACpB,OAAO,KAAK;CACd;CAEA,WAAkB;EAEhB,YAAY;EAEZ,gBAAgB;EAEhB,cAAc;CAChB;CAGA,QAAgB,IAAII,EAAM,MAAM;CAChC;CACA;CACA;CAEA,oBAA4B;CAE5B,uBAA+B;CAE/B;CAEA,YAAoB;CAEpB,YAAmB,GAAY,GAA4B;EAEzD,AADA,MAAME,CAAI,GACV,KAAK,OAAOA;EAGZ,IAAMC,IAAiC;GACrC,SAAS;GACT,SAAS;EACX;EACA,KAAK,QAAQ,OAAO,OAAOA,GAAcC,GAAQ,YAAY;EAG7D,IAAMC,IAA4B;GAChC,OAAO;GACP,SAAS;GACT,SAAS;GACT,UAAUC;GACV,GAAGF,GAAQ;EACb;EAgBA,AAfA,KAAK,UAAUC,GAEf,KAAK,MAAM,OAAO,mCAClB,KAAK,OAAO,IAAIL,EAAM,KACpB,IAAIA,EAAM,cAAc,KAAK,OAAO,OAAO,KAAK,OAAO,KAAK,GAC5D,IAAIA,EAAM,kBAAkB;GAAE,aAAa;GAAM,SAAS;GAAG,WAAW;EAAM,CAAC,CACjF,GACA,KAAK,KAAK,UAAU,IACpB,KAAK,MAAM,IAAI,KAAK,IAAI,GACxB,KAAK,qBAAqB,KAAK,OAAO,OAAO,GAExC,KAAK,MAAM,YAAS,KAAK,SAAS,eAAe,aACjD,KAAK,MAAM,YAAS,KAAK,SAAS,iBAAiB,aACpD,KAAK,MAAM,WAAS,KAAK,QAAQ,EAAE,YAAY,GAAM,CAAC,GAE1D,KAAK,KAAK,KAAK,WAAW,KAAK,OAAO;CACxC;CAMA,OAAc,IAAkC,CAAC,GAAS;EAExD,IADI,KAAK,YACL,KAAK,MAAM,SAAS;EACxB,IAAMO,IAAaC,EAAQ,cAAc;EAGzC,AAFA,KAAK,YAAY,EAAE,SAAS,GAAK,GAAGD,CAAU,GAC9C,KAAK,SAAS,iBAAiB,IAC/B,KAAK,QAAQ,EAAE,cAAW,CAAC;CAC7B;CAMA,QAAe,IAAkC,CAAC,GAAG;EAEnD,IADI,KAAK,YACL,KAAK,MAAM,YAAY,IAAO;EAClC,IAAMA,IAAaC,EAAQ,cAAc;EAGzC,AAFA,KAAK,YAAY,EAAE,SAAS,GAAM,GAAGD,CAAU,GAC/C,KAAK,SAAS,iBAAiB,iBAC/B,KAAK,SAAS,EAAE,cAAW,CAAC;CAC9B;CAMA,MAAa,KAAK,GAA8D;EAC9E,IAAI,KAAK,MAAM,SAAS,OAAO,QAAQ,QAAQ;EAC/C,IAAI,KAAK,UAAU,OAAO,QAAQ,OAAO,gBAAI,MAAM,mBAAmB,CAAC;EACvE,IAAME,IAAgB;GAAE,YAAY;GAAM,GAAGD;EAAQ;EAGrD,AAFA,KAAK,YAAY,EAAE,SAAS,GAAK,GAAGC,EAAc,UAAU,GAC5D,KAAK,SAAS,eAAe,IAC7B,KAAK,MAAMA,CAAa;CAC1B;CAMA,MAAa,KAAK,GAA+C;EAC/D,IAAI,KAAK,MAAM,YAAY,IAAO;EAClC,IAAMA,IAAgB;GAAE,YAAY;GAAM,GAAGD;EAAQ;EAGrD,AAFA,KAAK,YAAY,EAAE,SAAS,GAAM,GAAGC,EAAc,UAAU,GAC7D,KAAK,SAAS,iBAAiB,cAC/B,KAAK,MAAMA,CAAa;CAC1B;CAOA,SAAgB,GAAkC,IAAkC,CAAC,GAAG;EACtF,IAAI,KAAK,UAAU;EACnB,IAAMC,IAAY,KAAK;EACvB,IAAIZ,EAAMa,GAAOD,GAAW,EAAE,MAAM,GAAK,CAAC,GAAG;EAE7C,IAAMH,IAAaC,EAAQ,eAAe,KAAA,KAAYA,EAAQ;EAQ9D,IAPA,KAAK,YAAYG,GAAOJ,CAAU,GAE9BI,EAAM,YAAY,KAAA,KAAaD,EAAU,YAAYC,EAAM,YAC7DA,EAAM,UAAW,KAAK,SAAS,iBAAiB,KAAO,KAAK,SAAS,iBAAiB,kBACtFA,EAAM,UAAU,KAAK,QAAQ,EAAE,cAAW,CAAC,IAAI,KAAK,SAAS,EAAE,cAAW,CAAC,IAGzEA,EAAM,YAAY,KAAA,KAAaD,EAAU,YAAYC,EAAM,SAAS;GACtE,IAAMH,IAAU;IAAE;IAAY,OAAO,EAAE,UAAU,IAAI;GAAE;GAEvD,AADAG,EAAM,UAAW,KAAK,SAAS,eAAe,KAAO,KAAK,SAAS,eAAe,kBAClFA,EAAM,UAAU,KAAK,MAAMH,CAAO,IAAI,KAAK,MAAMA,CAAO;EAC1D;CACF;CAMA,aAAoB,GAAoC,IAAkC,CAAC,GAAG;EAC5F,IAAI,KAAK,UAAU;EACnB,IAAMI,IAAa,KAAK,QAClBC,IAAY;GAAE,GAAGD;GAAY,GAAGP;EAAO;EAM7C,AALA,KAAK,UAAUQ,GACXD,EAAW,aAAaC,EAAU,YAAU,KAAK,cAAcA,EAAU,QAAQ,GACjFD,EAAW,YAAYC,EAAU,WAAS,KAAK,mBAAmB,KAAK,KAAK,gBAAgB,CAAC,CAAC,SAAS,GACvGD,EAAW,YAAYC,EAAU,WAAS,KAAK,qBAAqBA,EAAU,OAAO,GACrFD,EAAW,UAAUC,EAAU,UAAO,KAAK,KAAK,WAAW,IAAIb,EAAM,cAAca,EAAU,OAAOA,EAAU,KAAK,IACvH,KAAK,MAAM,KAAK,gBAAgB;GAAE;GAAY,QAAQA;GAAW,YAAYL,EAAQ,cAAc;EAAK,CAAC;CAC3G;CAMA,gBAAuB;EACrB,AAAI,KAAK,aACT,KAAK,YAAY,IACjB,KAAK,mBAAmB,QAAQ,GAChC,KAAK,oBAAoB,KAAA,GACzB,KAAK,wBAAwB,MAC7B,KAAK,KAAK,UAAU,IACpB,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK,GACjC,KAAK,MAAM,OAAO,GAAG,KAAK,MAAM,QAAQ,GACxC,KAAK,KAAK,IAAI,WAAW,KAAK,OAAO,GACrC,KAAK,KAAK,IAAI,eAAe,KAAK,iBAAiB,GACnD,KAAK,KAAK,IAAI,kBAAkB,KAAK,oBAAoB,GACzD,KAAK,KAAK,IAAI,YAAY,KAAK,cAAc,GAC7C,KAAK,KAAK,IAAI,cAAc,KAAK,gBAAgB;CACnD;CAGA,mBAA0B;EACxB,IAAI,KAAK,UAAU,OAAO;EAC1B,IAAI,KAAK,SAAS,gBAAgB,OAAO,KAAK,SAAS;EACvD,IAAI,KAAK,SAAS,cAAc,OAAO,KAAK,SAAS;EACrD,IAAI,KAAK,SAAS,YAAY,OAAO,KAAK,SAAS;CACrD;CAEA,YAAoB,GAAkC,GAAqB;EACzE,IAAME,IAAY,KAAK;EAEvB,AADA,KAAK,QAAQ;GAAE,GAAG,KAAK;GAAO,GAAGC;EAAM,GACvC,KAAK,MAAM,KAAK,eAAe;GAAE,OAAO,KAAK;GAAO;GAAW;EAAW,CAAC;CAC7E;CAGA,oBAA4B;EAC1B,IAAM,EAAE,WAAQ,WAAQ,KAAK,iBAAiB;EAE9C,AADA,KAAK,SAAS,aAAaG,GACvBC,MAAW,KAAK,KAAK,WAAS,KAAK,oBAAoBA,CAAM;CACnE;CAEA,mBAA2B,IAAW,KAAK,KAAK,gBAAgB,CAAC,CAAC,UAAU;EAC1E,OAAO,CAAC,CAAC,KAAK,YAAYC,MAAa,KAAK,YAAY,KAAK,KAAK,gBAAgB,CAAC,CAAC,aAAa,KAAK,YACjG,KAAK,SAAS,MAAM,aAAa,KAAK;CAC7C;CAGA,mBAA2B,GAAmB;EAC5C,IAAI,CAAC,KAAK,mBAAmB,GAAG;EAChC,IAAMC,IAAmB,KAAK,SAAS,4BAA4BC,CAAS;EAC5E,IAAI,CAACD,GAAkB;GACrB,QAAQ,KAAK,qDAAqD;GAClE;EACF;EACA,IAAME,IAAWF,EAAiB,MAAM,CAAC,CAAC,KAAKA,EAAiB,IAAI,KAAK,OAAO,OAAO;EACvF,AAAIE,KAAU,KAAK,KAAK,SAAS,KAAKA,CAAQ;CAChD;CAGA,MAAc,cAAc,GAAa;EAEvC,IADA,KAAK,KAAK,SAAS,MAAM,MACrBC,MAAQ,IAAI;GACd,IAAMC,IAAwBxB,EAAYuB,CAAG;GAC7C,KAAK,wBAAwBC;GAC7B,IAAMC,IAAU,MAAMD;GACtB,IAAI,KAAK,UAAU;IAAE,EAAQ,QAAQ;IAAG;GAAO;GAK/C,AAHA,EAAQ,YAAYrB,EAAM,cAGtB,KAAK,0BAA0BqB,MACjC,KAAK,gBAAgBC,CAAO,GAC5B,KAAK,wBAAwB;EAEjC;EACA,KAAK,kBAAkB;CACzB;CAGA,qBAA6B,GAAa;EACxC,IAAMC,IAAa,IAAIvB,EAAM,WAAW;EAOxC,AANAuB,EAAW,oBAET,IAAIvB,EAAM,WAAW,CAAC,CAAC,iBAAiB,IAAIA,EAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAEhF,IAAIA,EAAM,WAAW,CAAC,CAAC,iBAAiB,IAAIA,EAAM,QAAQ,GAAG,GAAG,CAAC,GAAGwB,CAAG,CACzE,GACA,KAAK,KAAK,WAAW,KAAKD,CAAU;CACtC;CAEA,yBACM,KAAK,WAAiB;EAAE,QAAQ;EAAO,KAAK;CAAQ,IACnD,KAAK,MAAM,UACZ,KAAK,OAAO,aAAa,KAAW;EAAE,QAAQ;EAAO,KAAK;CAAQ,IACjE,KAAK,KAAK,SAAS,MACnB,KAAK,KAAK,OACV,KAAK,mBAAmB,IACzB,KAAK,KAAK,gBAAgB,CAAC,CAAC,SAAS,aACrC,KAAK,oBAA0B;EAAE,QAAQ;EAAO,KAAK;CAAU,IAC5D;EAAE,QAAQ;EAAM,KAAK;CAAG,IAF6B;EAAE,QAAQ;EAAO,KAAK;CAAQ,IADnD;EAAE,QAAQ;EAAO,KAAK;CAAsB,IADvD;EAAE,QAAQ;EAAO,KAAK;CAAa,IAD3B;EAAE,QAAQ;EAAO,KAAK;CAAW,IAFrC;EAAE,QAAQ;EAAO,KAAK;CAAO;CAU/D,QAAgB,GAAkC;EAuBhD,AAtBA,KAAK,MAAM,KAAK,UAAU,EAAE,YAAYf,EAAQ,WAAW,CAAC,GAGxD,KAAK,OAAO,YAAY,CAAC,KAAK,KAAK,SAAS,OAAO,CAAC,KAAK,yBAC3D,KAAK,cAAc,KAAK,OAAO,QAAQ,GAIzC,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAC9B,KAAK,KAAK,cAAc,IAEpB,KAAK,KAAK,QAAM,KAAK,eAAe,GAEpC,KAAK,mBAAmB,KAAK,KAAK,KAAK,gBAAgB,CAAC,CAAC,SAAS,eACpE,KAAK,iBAAiB,GACtB,KAAK,kBAAkB,KAAK,KAAK,gBAAgB,CAAC,CAAC,SAAS,IAI9D,KAAK,KAAK,GAAG,YAAY,KAAK,cAAc,GAC5C,KAAK,KAAK,GAAG,eAAe,KAAK,iBAAiB,GAClD,KAAK,KAAK,GAAG,kBAAkB,KAAK,oBAAoB,GACxD,KAAK,KAAK,GAAG,cAAc,KAAK,gBAAgB;CAClD;CAEA,SAAiB,GAAkC;EAWjD,AAVA,KAAK,MAAM,KAAK,WAAW,EAAE,YAAYA,EAAQ,WAAW,CAAC,GAG7D,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK,GACjC,KAAK,KAAK,cAAc,IAGxB,KAAK,KAAK,IAAI,YAAY,KAAK,cAAc,GAC7C,KAAK,KAAK,IAAI,eAAe,KAAK,iBAAiB,GACnD,KAAK,KAAK,IAAI,kBAAkB,KAAK,oBAAoB,GACzD,KAAK,KAAK,IAAI,cAAc,KAAK,gBAAgB;CACnD;CAEA,MAAc,GAAqC;EAGjD,AAFA,KAAK,MAAM,KAAK,QAAQA,CAAO,GAC/B,KAAK,kBAAkB,GACvB,KAAK,KAAK,cAAc;CAC1B;CAEA,MAAc,GAAqC;EAGjD,AAFA,KAAK,MAAM,KAAK,QAAQA,CAAO,GAC/B,KAAK,kBAAkB,GACvB,KAAK,KAAK,cAAc;CAC1B;CAGA,mBAA2B,MAA2B;EAGpD,AAFA,KAAK,KAAK,SAAS,MAAMc,GACzB,KAAK,KAAK,SAAS,cAAc,IACjC,KAAK,kBAAkB;CACzB;CAGA,uBAA+B;EAI7B,AAFA,KAAK,uBAAuB,IAE5B,KAAK,kBAAkB;CACzB;CAGA,wBAAgC,GAAmB,MAAmC;EACpF,AAAK,KAAK,mBAAmBX,GAAO,QAAQ,IAOxCO,MAAc,KAAK,KAAK,gBAAgB,CAAC,CAAC,cAC9C,KAAK,oBAAoB,IACzB,KAAK,mBAAmB,QAAQ,GAChC,KAAK,kBAAkB,MATrB,KAAK,uBAAuB,IAC5B,KAAK,oBAAoB,IACzB,KAAK,mBAAmB,QAAQ,GAChC,KAAK,kBAAkB;CAO3B;CAIA,qBAA6B,GAAmB,MAAmC;EACjF,AAAK,KAAK,mBAAmBP,GAAO,QAAQ,IAQxCO,MAAc,KAAK,yBACvB,KAAK,uBAAuBA,GAC5B,KAAK,oBAAoB,IAEzB,KAAK,mBAAmBA,CAAS,GACjC,KAAK,kBAAkB,GACvB,KAAK,KAAK,cAAc,OAXjB,KAAK,mBAAmB,MAAG,KAAK,uBAAuB,KAC5D,KAAK,kBAAkB;CAW3B;CAEA,uBAA+B,MAAqB;EAElD,AADA,KAAK,mBAAmB,QAAQ,GAC3BO,KAKL,KAAK,KAAK,SAAS,UAAU,EAAE,SAAS,EAAE,CAAC,GAC3C,KAAK,KAAK,UAAU,IACpB,KAAK,oBAAoBC,EAAc,GAAI,CAAC,CACzC,UAAU,EAAE,kBAAe;GAE1B,AADA,KAAK,MAAM,SAAS,UAAU,EAAE,SAASC,EAAS,CAAC,GACnD,KAAK,KAAK,cAAc;EAC1B,CAAC,CAAC,CACD,KAAK,KAXN,KAAK,KAAK,UAAU;CAYxB;CAEA,yBAAiC;EAC/B,KAAK,kBAAkB;CACzB;AACF,GC1YaC,KAA2G,GAAM,MAC5H,IAAI3B,EAAiCC,GAAME,CAAM"}
@@ -1,4 +1,4 @@
1
- import { g as e, i as t, o as n, r, s as i, u as a } from "./PointHelper-grrf8vu1.js";
1
+ import { g as e, i as t, o as n, r, s as i, u as a } from "./PointHelper-G9EgUMWo.js";
2
2
  import { r as o } from "./resizeObserver-AY-35us4.js";
3
3
  import { t as s } from "./rayOnLine-CrCXTByv.js";
4
4
  import * as c from "three/webgpu";
@@ -180,7 +180,54 @@ var _ = class extends r {
180
180
  point: this.plane?.projectPoint(C, new c.Vector3()) ?? C
181
181
  };
182
182
  }
183
- }, v = {
183
+ }, v = Math.PI / 6;
184
+ function y(e) {
185
+ let { point: t, cameraPosition: n, cameraQuaternion: r } = e;
186
+ if (!S(t) || !S(n) || !C(r)) return null;
187
+ let i = t.clone().sub(n), a = i.length();
188
+ if (!Number.isFinite(a) || a < 1e-4) return null;
189
+ let o = i.clone().divideScalar(a), s = new c.Vector3(0, 0, -1).applyQuaternion(r).normalize(), l = new c.Quaternion().setFromUnitVectors(s, o).multiply(r);
190
+ l.normalize();
191
+ let u = e.previous ?? null, d = null, f = o.clone(), p = e.normal;
192
+ if (p && S(p) && p.lengthSq() > 1e-12) {
193
+ let t = p.clone().normalize();
194
+ d = b(t, i, u?.normalSign ?? null);
195
+ let n = t.clone().multiplyScalar(-d), r = o.angleTo(n), a = x(e.blend ?? .5, 0, 1), s = x(e.maxDeviation ?? v, 0, Math.PI), l = Math.min(r * a, s);
196
+ if (l > 1e-6 && r > 1e-6) {
197
+ let e = new c.Vector3().crossVectors(o, n);
198
+ e.lengthSq() > 1e-12 && (f = o.clone().applyAxisAngle(e.normalize(), l));
199
+ }
200
+ }
201
+ let m = new c.Quaternion().setFromUnitVectors(o, f).multiply(l);
202
+ m.normalize();
203
+ let h = e.translate !== !1, g = Math.min(e.distance ?? .6, a);
204
+ return {
205
+ position: h ? t.clone().addScaledVector(f, -g) : n.clone(),
206
+ direction: f,
207
+ quaternion: m,
208
+ state: {
209
+ direction: f.clone(),
210
+ point: t.clone(),
211
+ normalSign: d
212
+ }
213
+ };
214
+ }
215
+ function b(e, t, n) {
216
+ let r = e.dot(t);
217
+ return Math.abs(r) < .05 && n !== null ? n : r > 0 ? -1 : 1;
218
+ }
219
+ function x(e, t, n) {
220
+ return Math.min(n, Math.max(t, e));
221
+ }
222
+ function S(e) {
223
+ return Number.isFinite(e.x) && Number.isFinite(e.y) && Number.isFinite(e.z);
224
+ }
225
+ function C(e) {
226
+ return Number.isFinite(e.x) && Number.isFinite(e.y) && Number.isFinite(e.z) && Number.isFinite(e.w);
227
+ }
228
+ //#endregion
229
+ //#region src/MeasurePluginV2/PointOverlay.ts
230
+ var w = {
184
231
  axisXColor: "#EC4A4E",
185
232
  axisYColor: "#1677FF",
186
233
  axisZColor: "#065C08",
@@ -193,139 +240,159 @@ var _ = class extends r {
193
240
  planeBorderOpacity: .9,
194
241
  planeSideRadiusScale: 1.2,
195
242
  axisSnapAngle: 15
196
- }, y = [
243
+ }, T = [
197
244
  new c.Vector3(1, 0, 0),
198
245
  new c.Vector3(0, 1, 0),
199
246
  new c.Vector3(0, 0, 1)
200
- ], b = [
201
- v.axisXColor,
202
- v.axisYColor,
203
- v.axisZColor
247
+ ], E = [
248
+ w.axisXColor,
249
+ w.axisYColor,
250
+ w.axisZColor
204
251
  ];
205
- function x(e, t) {
252
+ function D(e, t) {
206
253
  let n = e.clone().project(t.camera), r = (n.x + 1) / 2 * t.renderSize.x, i = (n.y + 1) / 2 * t.renderSize.y;
207
254
  return {
208
255
  x: (r - t.readLeft) * t.pixelRadio,
209
256
  y: (t.readTop + t.readPixelsHeight - i) * t.pixelRadio
210
257
  };
211
258
  }
212
- function S(e) {
259
+ function O(e) {
213
260
  let t = e.face;
214
261
  if (!t?.normal) return null;
215
262
  let n = t.normal.clone();
216
263
  return n.lengthSq() < 1e-12 ? null : n.normalize();
217
264
  }
218
- function C(e) {
265
+ function k(e) {
219
266
  let t = e.clone().normalize(), n = 0, r = 0;
220
- y.forEach((e, i) => {
267
+ T.forEach((e, i) => {
221
268
  let a = Math.abs(t.dot(e));
222
269
  a > r && (r = a, n = i);
223
270
  });
224
- let i = Math.cos(c.MathUtils.degToRad(v.axisSnapAngle));
271
+ let i = Math.cos(c.MathUtils.degToRad(w.axisSnapAngle));
225
272
  if (r < i) return {
226
273
  normal: t,
227
274
  alignedAxisIndex: -1
228
275
  };
229
- let a = y[n], o = t.dot(a) >= 0 ? 1 : -1;
276
+ let a = T[n], o = t.dot(a) >= 0 ? 1 : -1;
230
277
  return {
231
278
  normal: a.clone().multiplyScalar(o),
232
279
  alignedAxisIndex: n
233
280
  };
234
281
  }
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(), {
282
+ function A(e) {
283
+ let t = k(e), n = t.normal, r = n.clone().multiplyScalar(n.dot(T[1])), i = T[1].clone().sub(r);
284
+ return i.lengthSq() < 1e-8 && (i = T[2].clone().sub(n.clone().multiplyScalar(n.dot(T[2])))), i.normalize(), {
238
285
  normal: n,
239
286
  xAxis: new c.Vector3().crossVectors(i, n).normalize(),
240
287
  yAxis: i,
241
288
  alignedAxisIndex: t.alignedAxisIndex
242
289
  };
243
290
  }
244
- function T(e, t) {
291
+ function j(e, t) {
245
292
  return Math.max(1e-4, t.position.distanceTo(e) * .01);
246
293
  }
247
- function E(e, t) {
248
- let n = x(e.point, e.viewport), r = x(e.point.clone().addScaledVector(t, e.probeLength), e.viewport);
294
+ function M(e, t) {
295
+ let n = D(e.point, e.viewport), r = D(e.point.clone().addScaledVector(t, e.probeLength), e.viewport);
249
296
  return {
250
297
  x: r.x - n.x,
251
298
  y: r.y - n.y
252
299
  };
253
300
  }
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;
301
+ var N = .8, P = 3;
302
+ function F(e, t, n) {
303
+ let { point: r, viewport: i } = e, a = D(r, i), o = (e) => {
304
+ let n = D(r.clone().addScaledVector(t, e), i);
305
+ return Math.hypot(n.x - a.x, n.y - a.y);
306
+ }, s = i.camera.matrixWorldInverse, c = -r.clone().applyMatrix4(s).z;
307
+ if (!(c > 0)) return 0;
308
+ let l = -r.clone().add(t).applyMatrix4(s).z - c, u = Infinity;
309
+ l < -1e-9 ? u = c * N / -l : l > 1e-9 && (u = c * P / l);
310
+ let d = u;
311
+ if (!Number.isFinite(d)) for (d = e.probeLength; o(d) < n && d < c * P;) d *= 2;
312
+ if (!(o(d) > n)) return Number.isFinite(o(d)) ? d : 0;
313
+ let f = 0;
314
+ for (let e = 0; e < 24; e += 1) {
315
+ let e = (f + d) / 2;
316
+ o(e) < n ? f = e : d = e;
262
317
  }
263
- return o;
318
+ return (f + d) / 2;
264
319
  }
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) => {
320
+ function I([e, t, n, r]) {
321
+ let i = (e, t, n) => (t.x - e.x) * (n.y - e.y) - (t.y - e.y) * (n.x - e.x), a = (e, t, n, r) => i(n, r, e) * i(n, r, t) < 0 && i(e, t, n) * i(e, t, r) < 0;
322
+ return a(e, t, n, r) || a(t, n, r, e);
323
+ }
324
+ function L(e, t) {
325
+ let { context: n, viewport: r, point: i } = e, a = Math.min(r.canvasWidth, r.canvasHeight) / 2 * w.planeSideRadiusScale / 2, o = t.xAxis.clone().negate(), s = t.yAxis.clone().negate(), c = F(e, t.xAxis, a), l = F(e, o, a), u = F(e, t.yAxis, a), d = F(e, s, a);
326
+ if (!(c > 0) || !(l > 0) || !(u > 0) || !(d > 0)) return;
327
+ let f = r.camera.matrixWorldInverse, p = (e) => -e.clone().applyMatrix4(f).z, m = p(i), h = m * .19999999999999996, g = (e) => {
328
+ let t = p(e);
329
+ if (t >= h) return e;
330
+ let n = (m - h) / (m - t);
331
+ return i.clone().lerp(e, n);
332
+ }, _ = [
333
+ i.clone().addScaledVector(t.xAxis, c).addScaledVector(t.yAxis, u),
334
+ i.clone().addScaledVector(t.xAxis, -l).addScaledVector(t.yAxis, u),
335
+ i.clone().addScaledVector(t.xAxis, -l).addScaledVector(t.yAxis, -d),
336
+ i.clone().addScaledVector(t.xAxis, c).addScaledVector(t.yAxis, -d)
337
+ ].map((e) => D(g(e), r));
338
+ _.some((e) => !Number.isFinite(e.x) || !Number.isFinite(e.y)) || I(_) || (n.save(), n.beginPath(), _.forEach((e, t) => {
275
339
  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());
340
+ }), n.closePath(), n.strokeStyle = w.planeBorderColor, n.globalAlpha = w.planeBorderOpacity, n.lineWidth = w.planeBorderWidth * (r.lineScale ?? 1), n.stroke(), n.restore());
277
341
  }
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);
342
+ function R(e, t) {
343
+ let { context: n, viewport: r, point: i } = e, a = Math.min(r.canvasWidth, r.canvasHeight) / 2, o = a * w.axisLengthRadiusScale, s = a * w.axisTipDotRadiusScale, c = D(i, r);
280
344
  if (!Number.isFinite(c.x) || !Number.isFinite(c.y)) return;
281
345
  let l = (t) => {
282
- let n = E(e, t), r = Math.hypot(n.x, n.y);
346
+ let n = M(e, t), r = Math.hypot(n.x, n.y);
283
347
  return !Number.isFinite(r) || r < .001 ? null : {
284
348
  x: n.x / r,
285
349
  y: n.y / r
286
350
  };
287
- }, u = (t) => D(e, t, o), d = (e, t, r) => {
351
+ }, u = (t) => F(e, t, o), d = (e, t, i) => {
288
352
  [
289
353
  e.x,
290
354
  e.y,
291
355
  t.x,
292
356
  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());
357
+ ].every((e) => Number.isFinite(e)) && (n.strokeStyle = i, n.globalAlpha = w.axisOpacity, n.lineWidth = w.axisLineWidth * (r.lineScale ?? 1), n.beginPath(), n.moveTo(e.x, e.y), n.lineTo(t.x, t.y), n.stroke());
294
358
  }, f = (t, n) => {
295
359
  if (!l(t)) return;
296
- let a = t.clone().negate(), s = D(e, t, o), c = D(e, a, o);
360
+ let a = t.clone().negate(), s = F(e, t, o), c = F(e, a, o);
297
361
  if (!(s > 0) || !(c > 0)) return;
298
- let u = x(i.clone().addScaledVector(a, c), r), f = x(i.clone().addScaledVector(t, s), r);
362
+ let u = D(i.clone().addScaledVector(a, c), r), f = D(i.clone().addScaledVector(t, s), r);
299
363
  d(u, f, n);
300
364
  };
301
- n.save(), n.lineCap = "round", t ? (f(t.xAxis, v.axisXColor), f(t.yAxis, v.axisYColor), ((e, t, a) => {
365
+ n.save(), n.lineCap = "round", t ? (f(t.xAxis, w.axisXColor), f(t.yAxis, w.axisYColor), ((e, t, a) => {
302
366
  if (!l(e)) return;
303
367
  let o = u(e);
304
368
  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();
369
+ let f = D(i.clone().addScaledVector(e, o), r);
370
+ d(c, f, t), a && Number.isFinite(f.x) && Number.isFinite(f.y) && (n.fillStyle = t, n.globalAlpha = w.axisOpacity, n.beginPath(), n.arc(f.x, f.y, s, 0, Math.PI * 2), n.fill());
371
+ })(t.normal, w.axisZColor, !0)) : T.forEach((e, t) => f(e, E[t])), n.restore();
308
372
  }
309
- function A(e, t, n) {
373
+ function z(e, t, n) {
310
374
  let r = n.point;
311
375
  if (!r || !Number.isFinite(r.x) || !Number.isFinite(r.y) || !Number.isFinite(r.z)) return;
312
376
  let i = {
313
377
  context: e,
314
378
  viewport: t,
315
379
  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);
380
+ probeLength: j(r, t.camera)
381
+ }, a = O(n), o = a ? A(a) : null;
382
+ o && L(i, o), R(i, o);
319
383
  }
320
384
  //#endregion
321
385
  //#region src/MeasurePluginV2/Magnifier.ts
322
- var j = class extends e {
386
+ var B = class extends e {
323
387
  overlayFive;
324
388
  overlayContext = null;
325
389
  overlayIntersection = null;
326
390
  overlayEnabled;
391
+ closeupMode;
392
+ overlayCamera = null;
393
+ closeupState = null;
327
394
  constructor(e, t) {
328
- super(e, t ?? {}), this.overlayFive = e, this.overlayEnabled = t?.overlayEnabled !== !1, this.afterRender = this.renderOverlay;
395
+ super(e, t ?? {}), this.overlayFive = e, this.overlayEnabled = t?.overlayEnabled !== !1, this.closeupMode = t?.closeupMode ?? (t?.closeupEnabled === !1 ? "off" : "rotate"), this.beforeRender = this.prepareCloseup, this.afterRender = this.renderOverlay;
329
396
  }
330
397
  setIntersection(e) {
331
398
  this.overlayIntersection = e;
@@ -333,11 +400,22 @@ var j = class extends e {
333
400
  setOverlayEnabled(e) {
334
401
  this.overlayEnabled = e;
335
402
  }
403
+ setCloseupEnabled(e) {
404
+ this.setCloseupMode(e ? "rotate" : "off");
405
+ }
406
+ setCloseupMode(e) {
407
+ this.closeupMode = e, e === "off" && (this.closeupState = null);
408
+ }
409
+ getCloseupMode() {
410
+ return this.closeupMode;
411
+ }
336
412
  renderOverlay = (e) => {
337
413
  if (!this.overlayEnabled || !this.state.enabled) return;
338
414
  let t = this.overlayIntersection;
339
415
  if (!t || t.isVirtual || !t.point) return;
340
- let n = this.overlayFive.camera, r = t.point.clone().project(n);
416
+ let n = this.overlayCamera;
417
+ if (!n) return;
418
+ let r = t.point.clone().project(n);
341
419
  if (![r.x, r.y].every((e) => Number.isFinite(e))) return;
342
420
  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
421
  if (Math.abs(i - o) > 1 || Math.abs(a - s) > 1) return;
@@ -351,33 +429,78 @@ var j = class extends e {
351
429
  readPixelsHeight: e.readHeight,
352
430
  pixelRadio: e.pixelRatio,
353
431
  canvasWidth: e.canvasWidth,
354
- canvasHeight: e.canvasHeight
432
+ canvasHeight: e.canvasHeight,
433
+ lineScale: e.canvasWidth / this.width
355
434
  };
356
435
  try {
357
- A(c, l, t);
436
+ z(c, l, t);
358
437
  } catch (e) {
359
438
  console.warn("MeasureMagnifier: 叠加层绘制失败", e);
360
439
  }
361
440
  };
441
+ prepareCloseup = (e) => {
442
+ if (!(e instanceof c.Vector3)) {
443
+ this.snapshotOverlayCamera();
444
+ return;
445
+ }
446
+ let t = this.moveCameraCloseup(e);
447
+ return t || this.snapshotOverlayCamera(), t;
448
+ };
449
+ moveCameraCloseup(e) {
450
+ if (this.closeupMode === "off" || !this.state.enabled) {
451
+ this.closeupState = null;
452
+ return;
453
+ }
454
+ let t = this.overlayIntersection;
455
+ if (!t || t.isVirtual || !e) {
456
+ this.closeupState = null;
457
+ return;
458
+ }
459
+ let n = this.overlayFive.camera;
460
+ if (!n || n.isOrthographicCamera) return;
461
+ let r = t.point && t.point.distanceTo(e) < 1e-4 ? O(t) : null;
462
+ n.updateMatrixWorld();
463
+ let i = this.closeupMode === "rotate", a = i ? Math.max(0, Math.min(v, c.MathUtils.degToRad(n.fov || 60) / 2 - c.MathUtils.degToRad(4))) : void 0, o = y({
464
+ point: e,
465
+ normal: r,
466
+ cameraPosition: n.position,
467
+ cameraQuaternion: n.quaternion,
468
+ previous: this.closeupState,
469
+ translate: !i,
470
+ maxDeviation: a
471
+ });
472
+ if (!o) return;
473
+ this.closeupState = o.state;
474
+ let s = n.position.clone(), l = n.quaternion.clone();
475
+ return n.position.copy(o.position), n.quaternion.copy(o.quaternion), n.updateMatrixWorld(!0), this.snapshotOverlayCamera(), () => {
476
+ n.position.copy(s), n.quaternion.copy(l), n.updateMatrixWorld(!0);
477
+ };
478
+ }
479
+ snapshotOverlayCamera() {
480
+ let e = this.overlayFive.camera;
481
+ if (!e) return;
482
+ let t = this.overlayCamera ??= new c.Camera();
483
+ t.matrixWorld.copy(e.matrixWorld), t.matrixWorldInverse.copy(e.matrixWorldInverse), t.projectionMatrix.copy(e.projectionMatrix), t.projectionMatrixInverse.copy(e.projectionMatrixInverse), t.position.copy(e.position);
484
+ }
362
485
  getOverlayContext() {
363
486
  return this.overlayContext ||= this.canvas.getContext("2d"), this.overlayContext;
364
487
  }
365
- }, M = .003;
366
- function N(e, t, n) {
488
+ }, V = .003;
489
+ function H(e, t, n) {
367
490
  let r = new c.CurvePath();
368
491
  r.add(new c.LineCurve3(e, t));
369
- let i = new c.TubeGeometry(r, 4, M, 8), a = new c.MeshBasicMaterial({
492
+ let i = new c.TubeGeometry(r, 4, V, 8), a = new c.MeshBasicMaterial({
370
493
  color: n,
371
494
  depthTest: !1,
372
495
  transparent: !0
373
496
  }), o = new c.Mesh(i, a);
374
497
  return o.disableGetPixel = !0, o;
375
498
  }
376
- var P = class extends a {
499
+ var U = class extends a {
377
500
  overlayGroup = new c.Group();
378
501
  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);
502
+ super(e), this.remove(this.cssBallMesh), this.paintAxisMesh(this.lineMesh, w.axisZColor), this.paintAxisMesh(this.ballMesh, w.axisZColor);
503
+ let t = this.ballMesh.position.z || .18, n = t * w.planeSideRadiusScale / (2 * w.axisLengthRadiusScale), r = H(new c.Vector3(-t, 0, 0), new c.Vector3(t, 0, 0), w.axisXColor), i = H(new c.Vector3(0, -t, 0), new c.Vector3(0, t, 0), w.axisYColor);
381
504
  r.renderOrder = 3, i.renderOrder = 3, this.overlayGroup.add(r, i);
382
505
  let a = [
383
506
  new c.Vector3(-n, -n, 0),
@@ -386,7 +509,7 @@ var P = class extends a {
386
509
  new c.Vector3(-n, n, 0)
387
510
  ];
388
511
  a.forEach((e, t) => {
389
- let n = N(e, a[(t + 1) % a.length], v.planeBorderColor);
512
+ let n = H(e, a[(t + 1) % a.length], w.planeBorderColor);
390
513
  n.renderOrder = 2, this.overlayGroup.add(n);
391
514
  }), this.add(this.overlayGroup), this.hide();
392
515
  }
@@ -394,9 +517,9 @@ var P = class extends a {
394
517
  let t = e?.point;
395
518
  if (!t) return;
396
519
  this.position.copy(t);
397
- let n = e.isVirtual ? null : S(e);
520
+ let n = e.isVirtual ? null : O(e);
398
521
  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);
522
+ let r = A(n);
400
523
  this.quaternion.setFromRotationMatrix(new c.Matrix4().makeBasis(r.xAxis, r.yAxis, r.normal));
401
524
  }
402
525
  show() {
@@ -409,31 +532,31 @@ var P = class extends a {
409
532
  let n = e.material;
410
533
  n.color.set(t), n.needsUpdate = !0;
411
534
  }
412
- }, F = {
535
+ }, W = {
413
536
  enabled: !0,
414
537
  radius: .3,
415
538
  threshold: 30,
416
539
  maxEdges: 240,
417
540
  cacheStep: .12
418
541
  };
419
- function I(e) {
420
- return e === void 0 ? { ...F } : e === !1 ? {
421
- ...F,
542
+ function G(e) {
543
+ return e === void 0 ? { ...W } : e === !1 ? {
544
+ ...W,
422
545
  enabled: !1
423
546
  } : e === !0 ? {
424
- ...F,
547
+ ...W,
425
548
  enabled: !0
426
549
  } : {
427
- ...F,
550
+ ...W,
428
551
  enabled: !0,
429
552
  ...e
430
553
  };
431
554
  }
432
- var L = new c.Vector3();
433
- function R(e, t) {
434
- return t.closestPointToPoint(e, !0, L), L.distanceToSquared(e);
555
+ var K = new c.Vector3();
556
+ function q(e, t) {
557
+ return t.closestPointToPoint(e, !0, K), K.distanceToSquared(e);
435
558
  }
436
- function z(e, t, n) {
559
+ function J(e, t, n) {
437
560
  if (!n.enabled || !e || typeof e.getEdgesBySphere != "function" || ![
438
561
  t.x,
439
562
  t.y,
@@ -444,17 +567,17 @@ function z(e, t, n) {
444
567
  let i = n.radius * n.radius;
445
568
  return r.map((e) => ({
446
569
  line: e,
447
- distanceSq: R(t, e)
570
+ distanceSq: q(t, e)
448
571
  })).filter((e) => e.distanceSq <= i).sort((e, t) => e.distanceSq - t.distanceSq).slice(0, n.maxEdges).map((e) => e.line);
449
572
  }
450
- var B = class {
573
+ var Y = class {
451
574
  center = new c.Vector3();
452
575
  edges = [];
453
576
  valid = !1;
454
577
  query(e, t, n) {
455
578
  if (!n.enabled) return this.clear(), [];
456
579
  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;
580
+ return this.valid && this.center.distanceToSquared(t) <= r || (this.center.copy(t), this.edges = J(e, t, n), this.valid = !0), this.edges;
458
581
  }
459
582
  clear() {
460
583
  this.valid = !1, this.edges = [];
@@ -464,6 +587,6 @@ var B = class {
464
587
  }
465
588
  };
466
589
  //#endregion
467
- export { P as a, I as i, B as n, j as o, z as r, _ as s, F as t };
590
+ export { U as a, G as i, Y as n, B as o, J as r, _ as s, W as t };
468
591
 
469
- //# sourceMappingURL=edgeSnap-8fdFCcXB.js.map
592
+ //# sourceMappingURL=edgeSnap-CH0HidZm.js.map