@realsee/dnalogel 4.0.0-webgpu.17 → 4.0.0-webgpu.19
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 +11 -0
- package/dist/floorplan.js +1 -1
- package/dist/index.js +19 -19
- package/dist/internal/{BasePlugin-BW03eBFv.js → BasePlugin-AYcNjiyG.js} +2 -2
- package/dist/internal/{BasePlugin-BW03eBFv.js.map → BasePlugin-AYcNjiyG.js.map} +1 -1
- package/dist/internal/BasePluginWithData-CWgZY4u8.js +7 -0
- package/dist/internal/{BasePluginWithData-5iUuu45u.js.map → BasePluginWithData-CWgZY4u8.js.map} +1 -1
- package/dist/internal/{Controller-DPvcZw20.js → Controller-DPpDpYsR.js} +3 -3
- package/dist/internal/{Controller-DPvcZw20.js.map → Controller-DPpDpYsR.js.map} +1 -1
- package/dist/internal/{Controller-5BvatEWD.js → Controller-DSKeCecj.js} +171 -154
- package/dist/internal/Controller-DSKeCecj.js.map +1 -0
- package/dist/internal/{Controller-CS5gPzPg.js → Controller-DZwww-c4.js} +2 -2
- package/dist/internal/{Controller-CS5gPzPg.js.map → Controller-DZwww-c4.js.map} +1 -1
- package/dist/internal/PointHelper-G9EgUMWo.js +1052 -0
- package/dist/internal/PointHelper-G9EgUMWo.js.map +1 -0
- package/dist/internal/{Rectangle-Bw-_5i6A.js → Rectangle-DSOdWXl_.js} +3 -3
- package/dist/internal/{Rectangle-Bw-_5i6A.js.map → Rectangle-DSOdWXl_.js.map} +1 -1
- package/dist/internal/{Work-njB4pAsT.js → Work-HQHipxJj.js} +4 -4
- package/dist/internal/{Work-njB4pAsT.js.map → Work-HQHipxJj.js.map} +1 -1
- package/dist/internal/{area-maker-T7a6vfXC.js → area-maker-Diy_UkTD.js} +2 -2
- package/dist/internal/{area-maker-T7a6vfXC.js.map → area-maker-Diy_UkTD.js.map} +1 -1
- package/dist/internal/{controller-Vl3H6GBQ.js → controller-DZUdbdd8.js} +4 -4
- package/dist/internal/{controller-Vl3H6GBQ.js.map → controller-DZUdbdd8.js.map} +1 -1
- package/dist/internal/{cruise-rzsfiLn-.js → cruise-Bo8CD4vF.js} +2 -2
- package/dist/internal/{cruise-rzsfiLn-.js.map → cruise-Bo8CD4vF.js.map} +1 -1
- package/dist/internal/{current-pano-image-CAodOmyS.js → current-pano-image-Cqq4DRPh.js} +2 -2
- package/dist/internal/{current-pano-image-CAodOmyS.js.map → current-pano-image-Cqq4DRPh.js.map} +1 -1
- package/dist/internal/{edgeSnap-8fdFCcXB.js → edgeSnap-CH0HidZm.js} +206 -83
- package/dist/internal/edgeSnap-CH0HidZm.js.map +1 -0
- package/dist/internal/{floorplan-B82VmXnE.js → floorplan-DwcrbASA.js} +2 -2
- package/dist/internal/{floorplan-B82VmXnE.js.map → floorplan-DwcrbASA.js.map} +1 -1
- package/dist/internal/{measure-KVSCjRnS.js → measure-DIstq55p.js} +2 -2
- package/dist/internal/{measure-KVSCjRnS.js.map → measure-DIstq55p.js.map} +1 -1
- package/dist/internal/measure-v2-Byp1mE5q.js +215 -0
- package/dist/internal/measure-v2-Byp1mE5q.js.map +1 -0
- package/dist/internal/{model-maker-BHPMSkqn.js → model-maker-pQcaAh5M.js} +2 -2
- package/dist/internal/{model-maker-BHPMSkqn.js.map → model-maker-pQcaAh5M.js.map} +1 -1
- package/dist/internal/object3d-helper-zRXHAcbm.js +7 -0
- package/dist/internal/{object3d-helper-CxJ_Ju1y.js.map → object3d-helper-zRXHAcbm.js.map} +1 -1
- package/dist/internal/{pano-compass-2S5mt7af.js → pano-compass-CMIljzhC.js} +2 -2
- package/dist/internal/{pano-compass-2S5mt7af.js.map → pano-compass-CMIljzhC.js.map} +1 -1
- package/dist/internal/{pano-door-label-CK0sYPKY.js → pano-door-label-B4nqTTzN.js} +2 -2
- package/dist/internal/{pano-door-label-CK0sYPKY.js.map → pano-door-label-B4nqTTzN.js.map} +1 -1
- package/dist/internal/{pano-measure-DEofgQkM.js → pano-measure-C2r0ecHk.js} +2 -2
- package/dist/internal/{pano-measure-DEofgQkM.js.map → pano-measure-C2r0ecHk.js.map} +1 -1
- package/dist/internal/{pano-measure-v2-DVlj0AUQ.js → pano-measure-v2-BfSAjO-I.js} +4 -4
- package/dist/internal/{pano-measure-v2-DVlj0AUQ.js.map → pano-measure-v2-BfSAjO-I.js.map} +1 -1
- package/dist/internal/pano-ruler-BW78w4lv.js +240 -0
- package/dist/internal/pano-ruler-BW78w4lv.js.map +1 -0
- package/dist/internal/{pano-tag-BwRqx3wU.js → pano-tag-BXo_4I6D.js} +2 -2
- package/dist/internal/{pano-tag-BwRqx3wU.js.map → pano-tag-BXo_4I6D.js.map} +1 -1
- package/dist/internal/{pano-video-DF7h9OyJ.js → pano-video-CS6-eXci.js} +2 -2
- package/dist/internal/{pano-video-DF7h9OyJ.js.map → pano-video-CS6-eXci.js.map} +1 -1
- package/dist/internal/{pipeline-Bcxx8i_q.js → pipeline-BN9A4lPZ.js} +2 -2
- package/dist/internal/{pipeline-Bcxx8i_q.js.map → pipeline-BN9A4lPZ.js.map} +1 -1
- package/dist/internal/{sculpt-heTYi32h.js → sculpt-e0IRMtjB.js} +3 -3
- package/dist/internal/{sculpt-heTYi32h.js.map → sculpt-e0IRMtjB.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.js +2 -2
- package/dist/plugins/measure.js +2 -2
- 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.js +1 -1
- package/dist/plugins/pano-measure.js +1 -1
- package/dist/plugins/pano-ruler.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 +7 -0
- package/dist/types/MeasurePlugin/utils/MeasureMesh.d.ts +5 -0
- package/dist/types/MeasurePluginV2/Controller.d.ts +9 -0
- package/dist/types/MeasurePluginV2/Magnifier.d.ts +33 -0
- package/dist/types/MeasurePluginV2/PointOverlay.d.ts +5 -0
- package/dist/types/MeasurePluginV2/closeupView.d.ts +69 -0
- package/dist/types/MeasurePluginV2/normalMeasure.d.ts +116 -0
- package/dist/types/PanoRulerPlugin/room-height.d.ts +19 -0
- package/dist/types/shared-utils/three/Magnifier.d.ts +55 -0
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/dist/internal/BasePluginWithData-5iUuu45u.js +0 -7
- package/dist/internal/Controller-5BvatEWD.js.map +0 -1
- package/dist/internal/PointHelper-grrf8vu1.js +0 -953
- package/dist/internal/PointHelper-grrf8vu1.js.map +0 -1
- package/dist/internal/edgeSnap-8fdFCcXB.js.map +0 -1
- package/dist/internal/measure-v2-DqjBlSeF.js +0 -83
- package/dist/internal/measure-v2-DqjBlSeF.js.map +0 -1
- package/dist/internal/object3d-helper-CxJ_Ju1y.js +0 -7
- package/dist/internal/pano-ruler-fzlUTkVu.js +0 -236
- package/dist/internal/pano-ruler-fzlUTkVu.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { i as e, t } from "./Work-
|
|
1
|
+
import { i as e, t } from "./Work-HQHipxJj.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-Bo8CD4vF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cruise-
|
|
1
|
+
{"version":3,"file":"cruise-Bo8CD4vF.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-AYcNjiyG.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-Cqq4DRPh.js.map
|
package/dist/internal/{current-pano-image-CAodOmyS.js.map → current-pano-image-Cqq4DRPh.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"current-pano-image-CAodOmyS.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-Cqq4DRPh.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,4 +1,4 @@
|
|
|
1
|
-
import { g as e, i as t, o as n, r, s as i, u as a } from "./PointHelper-
|
|
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
|
-
},
|
|
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
|
-
],
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
247
|
+
], E = [
|
|
248
|
+
w.axisXColor,
|
|
249
|
+
w.axisYColor,
|
|
250
|
+
w.axisZColor
|
|
204
251
|
];
|
|
205
|
-
function
|
|
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
|
|
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
|
|
265
|
+
function k(e) {
|
|
219
266
|
let t = e.clone().normalize(), n = 0, r = 0;
|
|
220
|
-
|
|
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(
|
|
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 =
|
|
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
|
|
236
|
-
let t =
|
|
237
|
-
return i.lengthSq() < 1e-8 && (i =
|
|
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
|
|
291
|
+
function j(e, t) {
|
|
245
292
|
return Math.max(1e-4, t.position.distanceTo(e) * .01);
|
|
246
293
|
}
|
|
247
|
-
function
|
|
248
|
-
let n =
|
|
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
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
|
318
|
+
return (f + d) / 2;
|
|
264
319
|
}
|
|
265
|
-
function
|
|
266
|
-
let
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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 =
|
|
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
|
|
279
|
-
let { context: n, viewport: r, point: i } = e, a = Math.min(r.canvasWidth, r.canvasHeight) / 2, o = a *
|
|
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 =
|
|
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) =>
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,
|
|
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 =
|
|
306
|
-
d(c, f, t), a && Number.isFinite(f.x) && Number.isFinite(f.y) && (n.fillStyle = t, n.globalAlpha =
|
|
307
|
-
})(t.normal,
|
|
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
|
|
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:
|
|
317
|
-
}, a =
|
|
318
|
-
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
},
|
|
366
|
-
function
|
|
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,
|
|
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
|
|
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,
|
|
380
|
-
let t = this.ballMesh.position.z || .18, n = t *
|
|
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 =
|
|
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 :
|
|
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 =
|
|
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
|
-
},
|
|
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
|
|
420
|
-
return e === void 0 ? { ...
|
|
421
|
-
...
|
|
542
|
+
function G(e) {
|
|
543
|
+
return e === void 0 ? { ...W } : e === !1 ? {
|
|
544
|
+
...W,
|
|
422
545
|
enabled: !1
|
|
423
546
|
} : e === !0 ? {
|
|
424
|
-
...
|
|
547
|
+
...W,
|
|
425
548
|
enabled: !0
|
|
426
549
|
} : {
|
|
427
|
-
...
|
|
550
|
+
...W,
|
|
428
551
|
enabled: !0,
|
|
429
552
|
...e
|
|
430
553
|
};
|
|
431
554
|
}
|
|
432
|
-
var
|
|
433
|
-
function
|
|
434
|
-
return t.closestPointToPoint(e, !0,
|
|
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
|
|
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:
|
|
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
|
|
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 =
|
|
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 {
|
|
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-
|
|
592
|
+
//# sourceMappingURL=edgeSnap-CH0HidZm.js.map
|