@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.
- package/CHANGELOG.md +18 -0
- package/TERMS.txt +24 -87
- package/dist/floorplan.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +34 -32
- package/dist/index.js.map +1 -1
- package/dist/internal/{BasePlugin-CPJ1ahrJ.js → BasePlugin-89hE8Cux.js} +2 -2
- package/dist/internal/{BasePlugin-CPJ1ahrJ.js.map → BasePlugin-89hE8Cux.js.map} +1 -1
- package/dist/internal/BasePluginWithData-BLOUilj_.js +7 -0
- package/dist/internal/{BasePluginWithData-Uq1cY5sC.js.map → BasePluginWithData-BLOUilj_.js.map} +1 -1
- package/dist/internal/{pano-measure-BEUknZ_O.js → Controller-B-10xO2H.js} +56 -42
- package/dist/internal/Controller-B-10xO2H.js.map +1 -0
- package/dist/internal/{measure-CTsB8Z-c.js → Controller-Bt2czarX.js} +10 -7
- package/dist/internal/Controller-Bt2czarX.js.map +1 -0
- package/dist/internal/{Controller-B9xMQukV.js → Controller-CTQsxSIv.js} +2 -2
- package/dist/internal/{Controller-B9xMQukV.js.map → Controller-CTQsxSIv.js.map} +1 -1
- package/dist/internal/{PointHelper-Bgbt0S7b.js → PointHelper-grrf8vu1.js} +23 -8
- package/dist/internal/PointHelper-grrf8vu1.js.map +1 -0
- package/dist/internal/{Rectangle-Dyjp88lU.js → Rectangle-CrP2ewnA.js} +3 -3
- package/dist/internal/{Rectangle-Dyjp88lU.js.map → Rectangle-CrP2ewnA.js.map} +1 -1
- package/dist/internal/{Work-nlQCCreU.js → Work-BeXbgDwp.js} +4 -4
- package/dist/internal/{Work-nlQCCreU.js.map → Work-BeXbgDwp.js.map} +1 -1
- package/dist/internal/{area-maker-DwPBgIH_.js → area-maker-CPQF8Zvc.js} +2 -2
- package/dist/internal/{area-maker-DwPBgIH_.js.map → area-maker-CPQF8Zvc.js.map} +1 -1
- package/dist/internal/{controller-B3u-PyQb.js → controller-18q1jMVV.js} +16 -16
- package/dist/internal/{controller-B3u-PyQb.js.map → controller-18q1jMVV.js.map} +1 -1
- package/dist/internal/{cruise-XCsWQQtZ.js → cruise-CVIrFchH.js} +2 -2
- package/dist/internal/{cruise-XCsWQQtZ.js.map → cruise-CVIrFchH.js.map} +1 -1
- package/dist/internal/{current-pano-image-Yt0ptdOO.js → current-pano-image-BaYriyS_.js} +2 -2
- package/dist/internal/{current-pano-image-Yt0ptdOO.js.map → current-pano-image-BaYriyS_.js.map} +1 -1
- package/dist/internal/edgeSnap-8fdFCcXB.js +469 -0
- package/dist/internal/edgeSnap-8fdFCcXB.js.map +1 -0
- package/dist/internal/{floorplan-Bnk3Jg8m.js → floorplan-CofR5nkn.js} +2 -2
- package/dist/internal/{floorplan-Bnk3Jg8m.js.map → floorplan-CofR5nkn.js.map} +1 -1
- package/dist/internal/measure-BEPx6Dxe.js +7 -0
- package/dist/internal/measure-BEPx6Dxe.js.map +1 -0
- package/dist/internal/measure-v2-sRY76hly.js +83 -0
- package/dist/internal/measure-v2-sRY76hly.js.map +1 -0
- package/dist/internal/{model-maker-tbF87kJz.js → model-maker-ggAsocXZ.js} +2 -2
- package/dist/internal/{model-maker-tbF87kJz.js.map → model-maker-ggAsocXZ.js.map} +1 -1
- package/dist/internal/object3d-helper-DFamC2FE.js +7 -0
- package/dist/internal/{object3d-helper-BgYvVhp2.js.map → object3d-helper-DFamC2FE.js.map} +1 -1
- package/dist/internal/{pano-compass-BwxmzCPI.js → pano-compass-DGHhaCBJ.js} +2 -2
- package/dist/internal/{pano-compass-BwxmzCPI.js.map → pano-compass-DGHhaCBJ.js.map} +1 -1
- package/dist/internal/{pano-door-label-Bwvaf5xx.js → pano-door-label-CWY7Kxkk.js} +2 -2
- package/dist/internal/{pano-door-label-Bwvaf5xx.js.map → pano-door-label-CWY7Kxkk.js.map} +1 -1
- package/dist/internal/pano-measure-CQ_ZZzz5.js +9 -0
- package/dist/internal/pano-measure-CQ_ZZzz5.js.map +1 -0
- package/dist/internal/pano-measure-v2-CzOdP5Yv.js +301 -0
- package/dist/internal/pano-measure-v2-CzOdP5Yv.js.map +1 -0
- package/dist/internal/{pano-tag-CaRrmqmS.js → pano-tag-C6g7mXhw.js} +2 -2
- package/dist/internal/{pano-tag-CaRrmqmS.js.map → pano-tag-C6g7mXhw.js.map} +1 -1
- package/dist/internal/{pano-video-DLjuDeQV.js → pano-video-DTbKV54W.js} +2 -2
- package/dist/internal/{pano-video-DLjuDeQV.js.map → pano-video-DTbKV54W.js.map} +1 -1
- package/dist/internal/{pipeline-Dg9R3h54.js → pipeline-CkYhFOhG.js} +2 -2
- package/dist/internal/{pipeline-Dg9R3h54.js.map → pipeline-CkYhFOhG.js.map} +1 -1
- package/dist/internal/{sculpt-CMFBenui.js → sculpt-rEvaT1IE.js} +3 -3
- package/dist/internal/{sculpt-CMFBenui.js.map → sculpt-rEvaT1IE.js.map} +1 -1
- package/dist/plugins/area-maker.js +1 -1
- package/dist/plugins/cruise.js +2 -2
- package/dist/plugins/current-pano-image.js +1 -1
- package/dist/plugins/guide-line.js +1 -1
- package/dist/plugins/measure-v2.d.ts +2 -0
- package/dist/plugins/measure-v2.js +3 -0
- package/dist/plugins/measure.js +3 -1
- package/dist/plugins/model-maker.js +1 -1
- package/dist/plugins/object3d-helper.js +2 -2
- package/dist/plugins/pano-compass.js +1 -1
- package/dist/plugins/pano-door-label.js +1 -1
- package/dist/plugins/pano-measure-v2.d.ts +2 -0
- package/dist/plugins/pano-measure-v2.js +1 -0
- package/dist/plugins/pano-measure.js +1 -1
- package/dist/plugins/pano-tag.js +2 -2
- package/dist/plugins/pano-video.js +1 -1
- package/dist/plugins/pipeline.js +1 -1
- package/dist/plugins/sculpt.js +2 -2
- package/dist/types/MeasurePlugin/Controller.d.ts +1 -0
- package/dist/types/MeasurePluginV2/Controller.d.ts +49 -0
- package/dist/types/MeasurePluginV2/Magnifier.d.ts +29 -0
- package/dist/types/MeasurePluginV2/PointHelper.d.ts +22 -0
- package/dist/types/MeasurePluginV2/PointOverlay.d.ts +88 -0
- package/dist/types/MeasurePluginV2/PointSelector.d.ts +51 -0
- package/dist/types/MeasurePluginV2/edgeSnap.d.ts +53 -0
- package/dist/types/MeasurePluginV2/index.d.ts +28 -0
- package/dist/types/PanoMeasurePlugin/Controller/BaseController.d.ts +1 -0
- package/dist/types/PanoMeasurePlugin/Controller/EditController.d.ts +4 -2
- package/dist/types/PanoMeasurePlugin/Controller/MixedController.d.ts +3 -1
- package/dist/types/PanoMeasurePlugin/Controller/WatchController.d.ts +4 -0
- package/dist/types/PanoMeasurePlugin/Controller/index.d.ts +9 -3
- package/dist/types/PanoMeasurePlugin/Modules/rangePiece/index.d.ts +5 -5
- package/dist/types/PanoMeasurePluginV2/Controller.d.ts +32 -0
- package/dist/types/PanoMeasurePluginV2/PointSelector.d.ts +32 -0
- package/dist/types/PanoMeasurePluginV2/PreviewLine.d.ts +6 -0
- package/dist/types/PanoMeasurePluginV2/controllers.d.ts +44 -0
- package/dist/types/PanoMeasurePluginV2/index.d.ts +8 -0
- package/dist/types/public/index.d.ts +4 -0
- package/dist/types/public/plugins/measure-v2.d.ts +5 -0
- package/dist/types/public/plugins/pano-measure-v2.d.ts +2 -0
- package/dist/types/shared-utils/three/Magnifier.d.ts +21 -0
- package/dist/types/shared-utils/three/PointSelector/index.d.ts +16 -7
- package/dist/utils.js +1 -1
- package/package.json +9 -1
- package/LICENSE-UPDATE.txt +0 -5
- package/dist/internal/BasePluginWithData-Uq1cY5sC.js +0 -7
- package/dist/internal/PointHelper-Bgbt0S7b.js.map +0 -1
- package/dist/internal/measure-CTsB8Z-c.js.map +0 -1
- package/dist/internal/object3d-helper-BgYvVhp2.js +0 -7
- package/dist/internal/pano-measure-BEUknZ_O.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { i as e, t } from "./Work-
|
|
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-
|
|
7
|
+
//# sourceMappingURL=cruise-CVIrFchH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cruise-
|
|
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-
|
|
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-
|
|
219
|
+
//# sourceMappingURL=current-pano-image-BaYriyS_.js.map
|
package/dist/internal/{current-pano-image-Yt0ptdOO.js.map → current-pano-image-BaYriyS_.js.map}
RENAMED
|
@@ -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
|