@realsee/dnalogel 4.0.0-webgpu.6 → 4.0.0-webgpu.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/floorplan.js +1 -1
  3. package/dist/index.js +15 -15
  4. package/dist/internal/{BasePlugin-BuBA8hmL.js → BasePlugin-DEJ6v9b1.js} +2 -2
  5. package/dist/internal/{BasePlugin-BuBA8hmL.js.map → BasePlugin-DEJ6v9b1.js.map} +1 -1
  6. package/dist/internal/BasePluginWithData-D5LIy_HU.js +7 -0
  7. package/dist/internal/{BasePluginWithData-C6qAOyK4.js.map → BasePluginWithData-D5LIy_HU.js.map} +1 -1
  8. package/dist/internal/{Controller-DGvWlPnA.js → Controller-B0mwyAwN.js} +2 -2
  9. package/dist/internal/{Controller-DGvWlPnA.js.map → Controller-B0mwyAwN.js.map} +1 -1
  10. package/dist/internal/{Rectangle-DMravW3j.js → Rectangle-D-ScAgcU.js} +2 -2
  11. package/dist/internal/{Rectangle-DMravW3j.js.map → Rectangle-D-ScAgcU.js.map} +1 -1
  12. package/dist/internal/{Work-b6z2Cx9z.js → Work-QO2erLBu.js} +5 -5
  13. package/dist/internal/{Work-b6z2Cx9z.js.map → Work-QO2erLBu.js.map} +1 -1
  14. package/dist/internal/{area-maker-SrpLTNHV.js → area-maker-DQMgJ_Kq.js} +2 -2
  15. package/dist/internal/{area-maker-SrpLTNHV.js.map → area-maker-DQMgJ_Kq.js.map} +1 -1
  16. package/dist/internal/{controller-DmDC_KY6.js → controller-2nCZFAqT.js} +15 -8
  17. package/dist/internal/controller-2nCZFAqT.js.map +1 -0
  18. package/dist/internal/{cruise-DvVo9SM4.js → cruise-BMohMk2t.js} +2 -2
  19. package/dist/internal/{cruise-DvVo9SM4.js.map → cruise-BMohMk2t.js.map} +1 -1
  20. package/dist/internal/{current-pano-image-VXFwOuHz.js → current-pano-image-sJVaIKKj.js} +3 -3
  21. package/dist/internal/{current-pano-image-VXFwOuHz.js.map → current-pano-image-sJVaIKKj.js.map} +1 -1
  22. package/dist/internal/{fire-scene-BzZGvyh_.js → fire-scene-C2FTu0Ka.js} +2 -2
  23. package/dist/internal/{fire-scene-BzZGvyh_.js.map → fire-scene-C2FTu0Ka.js.map} +1 -1
  24. package/dist/internal/{floorplan-Bpnl7e4_.js → floorplan-DfafJ1_G.js} +2 -2
  25. package/dist/internal/{floorplan-Bpnl7e4_.js.map → floorplan-DfafJ1_G.js.map} +1 -1
  26. package/dist/internal/loadTexture-CyYrJnqG.js +34 -0
  27. package/dist/internal/loadTexture-CyYrJnqG.js.map +1 -0
  28. package/dist/internal/{model-maker-3C_oVFXD.js → model-maker-Dw95hZnt.js} +2 -2
  29. package/dist/internal/{model-maker-3C_oVFXD.js.map → model-maker-Dw95hZnt.js.map} +1 -1
  30. package/dist/internal/object3d-helper-29XBBE95.js +7 -0
  31. package/dist/internal/{object3d-helper-DC7vwsU6.js.map → object3d-helper-29XBBE95.js.map} +1 -1
  32. package/dist/internal/{pano-compass-N8yhD2_F.js → pano-compass-DeShVUnI.js} +3 -3
  33. package/dist/internal/{pano-compass-N8yhD2_F.js.map → pano-compass-DeShVUnI.js.map} +1 -1
  34. package/dist/internal/{pano-door-label-CjdMo7Yt.js → pano-door-label-Bl26lIFI.js} +2 -2
  35. package/dist/internal/{pano-door-label-CjdMo7Yt.js.map → pano-door-label-Bl26lIFI.js.map} +1 -1
  36. package/dist/internal/{pano-measure-BRl8aw-t.js → pano-measure-CL7LlkMl.js} +6 -4
  37. package/dist/internal/{pano-measure-BRl8aw-t.js.map → pano-measure-CL7LlkMl.js.map} +1 -1
  38. package/dist/internal/{pano-tag-kRuqakeI.js → pano-tag-BNI8IJ7b.js} +2 -2
  39. package/dist/internal/{pano-tag-kRuqakeI.js.map → pano-tag-BNI8IJ7b.js.map} +1 -1
  40. package/dist/internal/{pano-video-BxxQ2Mxj.js → pano-video-DMD5ChQN.js} +2 -2
  41. package/dist/internal/{pano-video-BxxQ2Mxj.js.map → pano-video-DMD5ChQN.js.map} +1 -1
  42. package/dist/internal/{pipeline-Czu73FEJ.js → pipeline-BlfN9Fiz.js} +3 -3
  43. package/dist/internal/{pipeline-Czu73FEJ.js.map → pipeline-BlfN9Fiz.js.map} +1 -1
  44. package/dist/internal/{sculpt-CGBztvW4.js → sculpt-cfL1yLGc.js} +2 -2
  45. package/dist/internal/{sculpt-CGBztvW4.js.map → sculpt-cfL1yLGc.js.map} +1 -1
  46. package/dist/plugins/area-maker.js +1 -1
  47. package/dist/plugins/cruise.js +2 -2
  48. package/dist/plugins/current-pano-image.js +1 -1
  49. package/dist/plugins/fire-scene.js +1 -1
  50. package/dist/plugins/guide-line.js +1 -1
  51. package/dist/plugins/model-maker.js +1 -1
  52. package/dist/plugins/object3d-helper.js +2 -2
  53. package/dist/plugins/pano-compass.js +1 -1
  54. package/dist/plugins/pano-door-label.js +1 -1
  55. package/dist/plugins/pano-measure.js +1 -1
  56. package/dist/plugins/pano-tag.js +2 -2
  57. package/dist/plugins/pano-video.js +1 -1
  58. package/dist/plugins/pipeline.js +1 -1
  59. package/dist/plugins/sculpt.js +2 -2
  60. package/dist/types/PanoTagPlugin/utils/model/TagMediaTextureCache.d.ts +1 -1
  61. package/dist/types/PanoTagPlugin/utils/model/mediaPlane.d.ts +1 -0
  62. package/dist/types/shared-utils/three/loadTexture.d.ts +5 -3
  63. package/package.json +1 -1
  64. package/dist/internal/BasePluginWithData-C6qAOyK4.js +0 -7
  65. package/dist/internal/controller-DmDC_KY6.js.map +0 -1
  66. package/dist/internal/loadTexture-CJ3EbTXw.js +0 -18
  67. package/dist/internal/loadTexture-CJ3EbTXw.js.map +0 -1
  68. package/dist/internal/object3d-helper-DC7vwsU6.js +0 -7
@@ -2,7 +2,7 @@ import { t as e } from "./Subscribe-DLlAl88n.js";
2
2
  import { n as t, t as n } from "./resizeObserver-AY-35us4.js";
3
3
  import { t as r } from "./BetterTween-DmptqE8m.js";
4
4
  import { t as i } from "./equal-BiDAilPV.js";
5
- import { t as a } from "./BasePluginWithData-C6qAOyK4.js";
5
+ import { t as a } from "./BasePluginWithData-D5LIy_HU.js";
6
6
  import { t as o } from "./component.svelte-D5LYqt50.js";
7
7
  import { t as s } from "./LabelItem-Cnys51gZ.js";
8
8
  import { n as c, r as l } from "./fontSize-DMhRSrtx.js";
@@ -443,4 +443,4 @@ var b = class extends a {
443
443
  //#endregion
444
444
  export { m as n, p as r, x as t };
445
445
 
446
- //# sourceMappingURL=area-maker-SrpLTNHV.js.map
446
+ //# sourceMappingURL=area-maker-DQMgJ_Kq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"area-maker-SrpLTNHV.js","names":["Object3D","LineSegments","OriginLineSegments","Object3D","LineSegments","BasePlugin.Controller","Subscribe","_raycaster","resizeObserver","BetterTween","equal","Controller$1","mountComponent","LabelItem","getCurrentFontSize","getGlobalResponsiveFontSize","getCenterPointOfPoints","THREE","Object3D$1","intersects","raycaster","LineSegments$1","LineSegments","geometry","material","AreaMakerModelGroup","areaMakerItem","AreaMakerItem","objectData","data","bottomY","height","color","opacity","plugin","createMakerObjectGeometry","createMakerObjectMaterial","format2XOZ","hasTag","tagContainer","fontSize","colorObj","shapePoints","shapeCenterPoint","shapeCenterPoint3","zIndex","duration","options","startMakerObjectOpacity","endMakerObjectOpacity","startOutlineOpacity","endOutlineOpacity","makerObjectOpacity","outlineOpacity","resolve","event","visible","msg","modelGroupVisible","shownFloor","tagNDCPosition","ndcPosition","left","top","tagVisible","five","cameraPosition","intersection","vectorDistance","onResizeEnd","shape","matrix","rotationMatrix","translationMatrix","scaleMatrix","object","Controller","defaultState","params","config","prevData","item","dataItem","userAction","mergedOptions","prevState","state","prevConfig","newConfig","id","isV1","serverData","firstPoint","point","pluginState","mode","result","camera","aDistance","a","b","index","intersectResArray","nearestIntersectRes","prev","curr","fiveModelIntersect","AreaMakerPlugin"],"sources":["../../src/shared-utils/three/core/Object3D.ts","../../src/shared-utils/three/core/LineSegments.ts","../../src/AreaMakerPlugin/utils/Item.ts","../../src/AreaMakerPlugin/Controller.ts","../../src/AreaMakerPlugin/index.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\n\nexport class Object3D<ChildeItem extends THREE.Object3D = THREE.Object3D> extends THREE.Object3D {\n public children: ChildeItem[] = []\n\n /** 获取 raycaster 与当前物体的交点 */\n public getRaycastIntersects(raycaster: THREE.Raycaster) {\n const intersects: THREE.Intersection[] = []\n this.raycast(raycaster, intersects)\n return intersects\n }\n\n /** 获取 raycaster 与当前物体的第一个交点 */\n public getRaycastIntersection(raycaster: THREE.Raycaster) {\n return this.getRaycastIntersects(raycaster)[0] as THREE.Intersection | undefined\n }\n}\n","/** Typed LineSegments constrained to Three's current BufferGeometry model. */\nimport type { BufferGeometry, Material } from 'three/webgpu'\nimport { LineSegments as OriginLineSegments } from 'three/webgpu'\n\nclass LineSegments<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material | Material[] = Material | Material[],\n> extends OriginLineSegments<TGeometry, TMaterial> {\n public declare geometry: TGeometry\n public declare material: TMaterial\n\n public constructor(geometry: TGeometry, material: TMaterial) {\n super(geometry, material)\n }\n}\n\nexport { LineSegments }\n","import * as THREE from 'three/webgpu'\nimport { BetterTween, Object3D } from '../../shared-utils'\nimport { LineSegments } from '../../shared-utils'\nimport type { Controller } from '../Controller'\nimport type * as PluginType from '../typing'\nimport LabelItem from '../../components/AreaLabel/LabelItem.svelte'\nimport { getCenterPointOfPoints } from '../../shared-utils/math/planimetry'\nimport type { EventCallback } from '@realsee/five-webgpu'\nimport { Subscribe } from '../../shared-utils/Subscribe'\nimport { resizeObserver } from '../../shared-utils/dom/resizeObserver'\nimport { _raycaster } from '../../shared-utils/three/temp'\nimport { getCurrentFontSize, getGlobalResponsiveFontSize } from '../../shared-utils/fontSize'\n\nimport { mountComponent, type MountedComponent } from '../../shared-utils/svelte/component.svelte'\nclass AreaMakerModelGroup extends Object3D {\n private areaMakerItem: AreaMakerItem\n\n public constructor(areaMakerItem: AreaMakerItem) {\n super()\n this.areaMakerItem = areaMakerItem\n }\n\n public raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void {\n const makerObject = this.areaMakerItem.makerObject\n makerObject.raycast(raycaster, intersects)\n }\n}\n\nexport class AreaMakerItem {\n public id: string | number\n /** 标注名称 */\n public name = ''\n /** 标注几何体 */\n public makerObject: THREE.Mesh<THREE.ExtrudeGeometry, THREE.MeshBasicMaterial>\n /** 标注几何体的边框 */\n public outline: LineSegments<THREE.EdgesGeometry, THREE.LineBasicMaterial>\n /** 标注底面 Y 坐标 */\n public bottomY: PluginType.ServerAreaMakerItem['object_data']['bottom_y']\n /** 标注透明度 */\n public opacity: PluginType.ServerAreaMakerItem['object_data']['opacity']\n /** 标注高度 */\n public height: PluginType.ServerAreaMakerItem['object_data']['height']\n /** 标注所在楼层 */\n public floorIndex: PluginType.ServerAreaMakerItem['floor_index']\n /** 标注底面形状 */\n public shape: THREE.Shape\n /** 是否被挂载 */\n public mounted = false\n /** 查询问题使用的调试对象 */\n public checkMsg = {\n /** 当标注没有展示时,可以通过这个字段查看原因 */\n checkVisibleMsg: '',\n /** 当标注标签没有展示时,可以通过这个字段查看原因 */\n checkTagVisibleMsg: '',\n }\n /** 模型容器 */\n public modelGroup: AreaMakerModelGroup\n /** 标注是否可见 */\n public visible = true\n // ==================== 标签相关 ====================\n /** 标注标签实例 */\n public tagApp: MountedComponent<any>\n /** 标注标签是否可见 */\n public tagVisible: boolean | null = null\n /** 标注标签的世界坐标 */\n public tagPosition = new THREE.Vector3()\n /** 标注标签的 NDC 坐标 */\n public tagNDCPosition = new THREE.Vector3()\n /** 标注标签的 transform */\n public tagTransform = { left: 0, top: 0 }\n /** 标注标签的显示层级 */\n public tagZIndex = 0\n /** 标注实例的事件处理器 */\n public hooks = new Subscribe<PluginType.AreaMakerItemEventMap>()\n\n /** 自定义 Dom */\n public itemRenderer?: PluginType.ItemRenderer\n /** 数据 */\n private data: PluginType.ServerAreaMakerItem\n /** Plugin 实例 */\n private plugin: Controller\n /** 标注透明度动画 */\n private opacityAnime?: BetterTween<{ makerObjectOpacity: number; outlineOpacity: number }>\n /** 是否在容器 resize 动画中 */\n private isInContainerResizeAnimation = false\n /** 监听容器 resize 的计时器 id,用于判断 resize 过程是否结束 */\n private containerResizeTimeoutID: NodeJS.Timeout | null = null\n /** 容器大小变化监听器 */\n private resizeObserver?: { observe: () => void; unobserve: () => void }\n /** 响应式字体大小管理器 */\n private fontSizeManager = getGlobalResponsiveFontSize()\n /** 当前字体大小 */\n private currentFontSize = getCurrentFontSize()\n /** 字体大小订阅取消函数 */\n private unsubscribeFontSize: (() => void) | null = null\n\n public constructor(plugin: Controller, data: PluginType.ServerAreaMakerItem) {\n const objectData = data.object_data\n const bottomY = objectData.bottom_y\n const height = objectData.height\n const color = new THREE.Color(objectData.color ?? '#FFFFFF')\n const opacity = objectData.opacity ?? 0.4\n\n this.data = data\n this.id = data.id\n this.name = data.name ?? ''\n this.plugin = plugin\n this.height = height\n this.bottomY = bottomY\n this.opacity = opacity\n this.shape = new THREE.Shape().fromJSON(objectData.shape as THREE.ShapeJSON)\n this.floorIndex = data.floor_index\n // 构造模型\n this.makerObject = new THREE.Mesh(createMakerObjectGeometry(this.shape, height), createMakerObjectMaterial(color, opacity))\n format2XOZ(this.makerObject, bottomY)\n this.makerObject.material.depthTest = this.plugin.config.modelDepthTest\n // 构造 outline\n this.outline = new LineSegments(\n new THREE.EdgesGeometry(this.makerObject.geometry),\n new THREE.LineBasicMaterial({ color, transparent: true }),\n )\n format2XOZ(this.outline, bottomY)\n this.outline.material.depthTest = this.plugin.config.modelDepthTest\n this.setHeight(height)\n\n this.modelGroup = new AreaMakerModelGroup(this)\n // 初始化 modelGroup 的 visible\n this.modelGroup.visible = objectData.visible ?? true\n }\n\n /** 挂载标注 */\n public mount() {\n if (this.mounted) return\n this.mounted = true\n // 更新 visible\n this.updateVisible()\n // 更新 depthTest\n this.makerObject.material.depthTest = this.plugin.config.modelDepthTest\n this.outline.material.depthTest = this.plugin.config.modelDepthTest\n // 添加模型\n this.modelGroup.add(this.makerObject, this.outline)\n // 应用标签\n const hasTag = !!this.name\n const tagContainer = this.plugin.tagDomContainer\n if (hasTag) {\n this.tagApp = mountComponent(LabelItem, tagContainer, {\n fontSize: this.currentFontSize,\n rendererData: this.data,\n content: this.name,\n visible: this.tagVisible,\n rendererIfNeed: this.itemRenderer,\n transform: `translate(${this.tagTransform.left}px, ${this.tagTransform.top}px)`,\n onClick: (e: MouseEvent) => this.hooks.emit('tagClick', { target: this, nativeEvent: e }),\n })\n this.updateTag()\n }\n\n this.plugin.five.needsRender = true\n\n // 添加事件监听\n this.plugin.hooks.on('stateChange', this.onPluginStateChange)\n this.plugin.hooks.on('configChange', this.onPluginConfigChange)\n this.plugin.five.on('modeChange', this.updateVisible)\n this.plugin.five.on('modelShownFloorChange', this.updateVisible)\n this.plugin.five.on('cameraUpdate', this.onFiveCameraUpdate)\n this.resizeObserver = resizeObserver(this.onContainerResize, tagContainer)\n this.resizeObserver.observe()\n\n // 监听字体大小变化\n if (typeof this.fontSizeManager === 'object' && 'subscribe' in this.fontSizeManager) {\n this.unsubscribeFontSize = this.fontSizeManager.subscribe((fontSize) => {\n this.currentFontSize = fontSize\n this.updateTagFontSize()\n })\n }\n }\n\n /** 卸载标注 */\n public unmount() {\n if (!this.mounted) return\n this.mounted = false\n // 移除模型\n this.modelGroup.remove(...this.modelGroup.children)\n // 移除标签\n this.tagApp?.destroy()\n this.tagApp = null\n // 解除事件监听\n this.plugin.hooks.off('stateChange', this.onPluginStateChange)\n this.plugin.hooks.off('configChange', this.onPluginConfigChange)\n this.plugin.five.off('modeChange', this.updateVisible)\n this.plugin.five.off('modelShownFloorChange', this.updateVisible)\n this.plugin.five.off('cameraUpdate', this.onFiveCameraUpdate)\n this.resizeObserver?.unobserve()\n // 取消字体大小订阅\n this.unsubscribeFontSize?.()\n }\n\n public dispose() {\n this.unmount()\n this.opacityAnime?.dispose()\n if (this.containerResizeTimeoutID) clearTimeout(this.containerResizeTimeoutID)\n this.makerObject.geometry.dispose()\n this.makerObject.material.dispose()\n this.outline.geometry.dispose()\n this.outline.material.dispose()\n this.hooks.off()\n }\n\n /** 更改标注透明度\n * @param opacity 标注透明度,范围:0-1\n */\n public setOpacity(opacity: number) {\n this.opacity = opacity\n // 如果当前有透明度动画,应该先销毁动画\n this.opacityAnime?.dispose()\n this.makerObject.material.opacity = opacity\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注颜色\n * @param color 标注颜色,支持 hex\n * @example setColor('#FF0000')\n */\n public setColor(color: string) {\n const colorObj = new THREE.Color(color)\n this.makerObject.material.color = colorObj\n this.outline.material.color = colorObj\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注高度\n * @param height 标注高度,单位:米\n */\n public setHeight(height: number) {\n if (height <= 0) throw new Error('高度必须大于 0')\n this.height = height\n // 处理模型\n this.makerObject.geometry.dispose()\n this.outline.geometry.dispose()\n this.makerObject.geometry = createMakerObjectGeometry(this.shape, height)\n // 处理 outline\n this.outline.geometry = new THREE.EdgesGeometry(this.makerObject.geometry)\n // 计算 tagPosition\n const shapePoints = this.shape.extractPoints(10).shape.slice(0, -1)\n const shapeCenterPoint = getCenterPointOfPoints(shapePoints)\n const shapeCenterPoint3 = new THREE.Vector3(shapeCenterPoint.x, shapeCenterPoint.y, height)\n format2XOZ(shapeCenterPoint3, this.bottomY)\n this.tagPosition.copy(shapeCenterPoint3)\n this.updateTag()\n\n // 渲染场景\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注标签的显示层级\n * @description 为什么需要这个方法\n * 在相机朝向或位置发生变化时,各个标签所在的坐标与相机的远近关系发生了变化,所以标签的层级也会有变化。\n * 比如:\n * - 相机 -> 标签 A -> 标签 B: 标签 A 在标签 B 的前面\n * - 标签 A <- 标签 B <- 相机: 标签 A 在标签 B 的后面\n * 但是当前元素是无法感知到这种变化的,所以需要通过父元素调用这个方法来更新标签的层级。\n */\n public setTagZIndex(zIndex: number) {\n if (this.tagZIndex === zIndex) return\n this.tagApp?.update({ zIndex })\n }\n\n /** 显示标注 */\n // public show() {\n // return this.doOpacityAnime({\n // duration: 500,\n // makerObjectOpacity: [this.makerObject.material.opacity, this.opacity],\n // outlineOpacity: [this.outline.material.opacity, 1],\n // ...options,\n // })\n // }\n\n /** 隐藏标注 */\n // public hide() {\n // return this.doOpacityAnime({\n // duration: 500,\n // makerObjectOpacity: [this.makerObject.material.opacity, 0],\n // outlineOpacity: [this.outline.material.opacity, 0],\n // ...options,\n // })\n // }\n\n /** 透明度动画 */\n private doOpacityAnime = (\n options: Required<PluginType.AnimeOptions> & { makerObjectOpacity: [number, number]; outlineOpacity: [number, number] },\n ) => {\n this.opacityAnime?.dispose()\n const duration = options.duration\n const [startMakerObjectOpacity, endMakerObjectOpacity] = options.makerObjectOpacity\n const [startOutlineOpacity, endOutlineOpacity] = options.outlineOpacity\n\n if (duration === 0) {\n this.makerObject.material.opacity = endMakerObjectOpacity\n this.outline.material.opacity = endOutlineOpacity\n return\n }\n\n return new Promise<boolean>((resolve) => {\n this.opacityAnime = new BetterTween({ makerObjectOpacity: startMakerObjectOpacity, outlineOpacity: startOutlineOpacity })\n .to({\n makerObjectOpacity: endMakerObjectOpacity,\n outlineOpacity: endOutlineOpacity,\n })\n .onUpdate(({ makerObjectOpacity, outlineOpacity }) => {\n this.makerObject.material.opacity = makerObjectOpacity\n this.outline.material.opacity = outlineOpacity\n this.plugin.five.needsRender = true\n })\n .onComplete(() => resolve(true))\n .onDispose(() => {\n // 销毁动画的时候应该把值设置到终值\n this.makerObject.material.opacity = endMakerObjectOpacity\n this.outline.material.opacity = endOutlineOpacity\n this.plugin.five.needsRender = true\n resolve(false)\n })\n .play()\n })\n }\n\n /** 插件 Config 变化时更新自身 depthTest */\n private onPluginConfigChange = (event: { config: PluginType.Config }) => {\n this.makerObject.material.depthTest = event.config.modelDepthTest\n this.outline.material.depthTest = event.config.modelDepthTest\n this.plugin.five.needsRender = true\n }\n\n /** 插件整体可见性变化时,需要更新自身可见性 */\n private onPluginStateChange = () => {\n this.updateVisible()\n this.updateTagVisible()\n }\n\n /** 更新标注可见性 */\n private updateVisible = () => {\n const { result: visible, msg } = this.checkVisible()\n this.checkMsg.checkVisibleMsg = msg\n if (this.visible === visible) return\n this.visible = visible\n const modelGroupVisible = this.data.object_data.visible ?? true\n this.modelGroup.visible = visible && modelGroupVisible\n this.plugin.five.needsRender = true\n }\n\n /** 检测标注是否可见 */\n private checkVisible = (): { result: boolean; msg: string } => {\n const pluginState = this.plugin.state\n if (!pluginState.visible) return { result: false, msg: '插件不可见' }\n const shownFloor = this.plugin.fiveUtil.model.shownFloor\n const floorVisible = shownFloor === null || shownFloor === this.floorIndex\n if (!floorVisible) return { result: false, msg: `模型高亮楼层不符合展示条件, 当前高亮楼层为:${shownFloor}` }\n return { result: true, msg: '' }\n }\n\n /** 更新标注标签 */\n private updateTag = () => {\n if (!this.tagApp) return\n this.updateTagNDCPosition()\n this.updateTagDomTransform()\n this.updateTagVisible()\n }\n\n /** 更新标注标签的 NDC Position */\n private updateTagNDCPosition = () => {\n const tagPosition = this.tagPosition\n const tagNDCPosition = tagPosition.clone().project(this.plugin.five.camera)\n this.tagNDCPosition.copy(tagNDCPosition)\n }\n\n /** 更新标注标签的 transform */\n private updateTagDomTransform = () => {\n const ndcPosition = this.tagNDCPosition\n const left = Math.round(((ndcPosition.x + 1) / 2) * this.plugin.tagDomContainer.clientWidth)\n const top = Math.round(((-ndcPosition.y + 1) / 2) * this.plugin.tagDomContainer.clientHeight)\n if (this.tagTransform.left === left && this.tagTransform.top === top) return\n this.tagTransform = { left, top }\n this.tagApp?.update({ transform: `translate(${left}px, ${top}px)` })\n }\n\n /** 更新标注标签可见性 */\n private updateTagVisible = () => {\n const { result: tagVisible, msg } = this.checkTagVisible()\n this.checkMsg.checkTagVisibleMsg = msg\n if (this.tagVisible === tagVisible) return\n this.tagVisible = tagVisible\n if (this.tagApp) {\n this.tagVisible ? this.hooks.emit('tagShow') : this.hooks.emit('tagHide')\n this.tagApp?.update({ visible: tagVisible })\n }\n }\n\n /** 检测标注标签是否可见 */\n private checkTagVisible = (): { result: boolean; msg: string } => {\n // 检测标注整体可见性\n const makerVisible = this.visible\n if (!makerVisible) return { result: false, msg: '标注整体不可见' }\n // resize 动画中不可见\n if (this.isInContainerResizeAnimation) return { result: false, msg: '处于容器 resize 动画中' }\n // 模型遮挡检测\n const five = this.plugin.five\n const cameraPosition = five.camera.position.clone()\n _raycaster.set(cameraPosition.clone(), this.tagPosition.clone().sub(cameraPosition).normalize())\n const [intersection] = this.plugin.fiveUtil.model.intersectRaycaster(_raycaster)\n const vectorDistance = this.tagPosition.distanceTo(five.camera.position)\n if (intersection && intersection.distance + 0.1 < vectorDistance) return { result: false, msg: '标注标签被 Five 模型遮挡' }\n // 检测标注标签 NDC Position 是否在屏幕内\n const tagNDCPosition = this.tagNDCPosition\n if (Math.abs(tagNDCPosition.x) > 1.2 || Math.abs(tagNDCPosition.y) > 1.2 || Math.abs(tagNDCPosition.z) > 1)\n return { result: false, msg: '标注标签不在屏幕内' }\n\n return { result: true, msg: '' }\n }\n\n /** 相机位姿发生变化时,更新标签 */\n private onFiveCameraUpdate: EventCallback['cameraUpdate'] = () => {\n if (!this.tagApp) return\n if (!this.visible) return\n this.updateTagNDCPosition()\n this.updateTagDomTransform()\n this.updateTagVisible()\n }\n\n /** tag container DOM 发生 resize */\n private onContainerResize = () => {\n // resize start 时,更新标签\n const isResizeStart = this.isInContainerResizeAnimation === false\n if (isResizeStart) {\n this.isInContainerResizeAnimation = true\n this.updateTag()\n }\n\n const onResizeEnd = () => {\n this.isInContainerResizeAnimation = false\n this.containerResizeTimeoutID = null\n this.updateTag()\n }\n\n if (this.containerResizeTimeoutID) clearTimeout(this.containerResizeTimeoutID)\n this.containerResizeTimeoutID = setTimeout(onResizeEnd, 100)\n }\n\n /** 更新标注字体大小 */\n private updateTagFontSize = () => {\n if (this.tagApp) {\n this.tagApp.update({ fontSize: this.currentFontSize })\n }\n }\n}\n\n/** 创建标注几何体的 Geometry */\nfunction createMakerObjectGeometry(shape: THREE.Shape, height: number) {\n const geometry = new THREE.ExtrudeGeometry(shape, {\n depth: height,\n bevelEnabled: false,\n })\n return geometry\n}\n\n/** 创建标注几何体的 Material */\nfunction createMakerObjectMaterial(color: THREE.Color, opacity: number) {\n return new THREE.MeshBasicMaterial({\n color,\n opacity,\n transparent: true,\n })\n}\n\n/** 把 XOY 面上的 Mesh 转换成 XOZ 面 */\nfunction format2XOZ(object: THREE.Object3D | THREE.Box3 | THREE.Vector3, bottomY: number) {\n const matrix = new THREE.Matrix4() // 创建一个新的 Matrix4 对象\n // 创建各个子变换矩阵\n const rotationMatrix = new THREE.Matrix4().makeRotationX(Math.PI / 2)\n const translationMatrix = new THREE.Matrix4().makeTranslation(0, 0, -bottomY)\n const scaleMatrix = new THREE.Matrix4().makeScale(1, 1, -1)\n\n // 分别对 matrix 应用旋转、平移、缩放\n matrix.multiply(rotationMatrix) // 对 matrix 应用旋转\n matrix.multiply(translationMatrix) // 对 matrix 应用平移\n matrix.multiply(scaleMatrix) // 对 matrix 应用缩放\n\n // 对 object 应用 matrix 变换\n object.applyMatrix4(matrix)\n}\n","import * as THREE from 'three/webgpu'\nimport type { EventCallback, Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { equal } from '../shared-utils'\nimport { AreaMakerItem } from './utils/Item'\nimport type * as PluginType from './typing'\n\nexport class Controller extends BasePlugin.Controller<PluginType.State, PluginType.EventMap, PluginType.ServerData, PluginType.PluginData> {\n // ==================== public properties ====================\n /** 插件当前状态 */\n public state: PluginType.State\n /** 标注模型 { id: item } 的映射表 */\n public itemMap: Map<string | number, AreaMakerItem>\n /** 自定义 DOM */\n public itemRenderer?: PluginType.ItemRenderer\n /** 标注模型容器 */\n public modelGroup: THREE.Group\n /** 当前使用的数据 */\n public data?: PluginType.PluginData\n /** tag 容器 */\n public tagDomContainer: HTMLDivElement\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 childrenMountedState: '',\n }\n\n // ==================== private properties ====================\n /** 是否在 Five Change Mode 动画中 */\n private isInFiveChangeModeAnime = false\n /** 子组件是否挂载 */\n private childrenMountedState = false\n /** config 的原始值 */\n private _config: Required<PluginType.Config>\n /** disposed 的原始值 */\n private _disposed = false\n\n /** AreaMakerPlugin\n * @param `five` `<Five>` Five 实例\n * @param `params` `<PluginType.Params> | <undefined>` 插件初始化参数\n * @param `params.initialState` `<PluginType.State> | <undefined>` 插件初始化后,使用的状态\n */\n public constructor(five: Five, params?: PluginType.Params) {\n super(five)\n this.five = five\n\n this.tagDomContainer = document.createElement('div')\n this.tagDomContainer.style.position = 'absolute'\n this.tagDomContainer.style.top = '0'\n this.tagDomContainer.style.left = '0'\n this.tagDomContainer.style.width = '100%'\n this.tagDomContainer.style.height = '100%'\n this.tagDomContainer.style.pointerEvents = 'none'\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: Required<PluginType.Config> = {\n modelDepthTest: true,\n ...params?.config,\n }\n this._config = config\n\n this.modelGroup = new THREE.Group()\n this.modelGroup.name = 'ModelMakerPluginGroup'\n this.itemMap = new Map()\n\n if (this.state.enabled) this._enable({ userAction: false })\n this.five.once('dispose', this.dispose)\n }\n\n /** 加载数据,重复调用会使用新数据覆盖旧数据 */\n public async load(data: PluginType.ServerData) {\n if (this.disposed) throw new Error('AreaMakerPlugin 已销毁')\n const prevData = this.data\n this.data = this.formatData(data)\n this.hooks.emit('dataChange', this.data, prevData)\n\n // 清除原有数据\n this.modelGroup.remove(...this.modelGroup.children)\n this.itemMap.forEach((item) => item.dispose())\n this.itemMap.clear()\n this.childrenMountedState = false\n this.checkMsg.childrenMountedState = ''\n\n // 加载新数据\n this.data.list.forEach((dataItem) => {\n const item = new AreaMakerItem(this, dataItem)\n item.itemRenderer = this.itemRenderer\n this.modelGroup.add(item.modelGroup)\n this.itemMap.set(dataItem.id, item)\n item.hooks.on('tagClick', this.onMakerTagClick)\n })\n\n this.updateChildrenMountedState()\n }\n\n /** 将插件的 DOM 容器添加到指定的 DOM 元素上 */\n public appendTo(wrapper: Element): void {\n wrapper.appendChild(this.tagDomContainer)\n }\n\n /** 启用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public enable(options: BasePlugin.BaseOptions = {}) {\n if (this.disposed || this.state.enabled) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: true }, userAction)\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.state.enabled === false) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: false }, userAction)\n this._disable({ userAction })\n }\n\n /** 展示标注\n * @param `options` `<Partial<ShowHideOptions>> | <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: PluginType.ShowHideOptions = { userAction: true, ...options }\n this.updateState({ visible: true }, mergedOptions.userAction)\n await this._show(mergedOptions)\n }\n\n /** 插件内容整体隐藏\n * @param `options` `<Partial<ShowHideOptions>> | <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: PluginType.ShowHideOptions = { userAction: true, ...options }\n this.updateState({ visible: false }, mergedOptions.userAction)\n await this._hide(mergedOptions)\n }\n\n // 目前带动画的展示和隐藏功能有些需求细节没有确定,暂时不实现\n // /** 展示标注\n // * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n // * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n // * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n // * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\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: PluginType.ShowHideOptions = {\n // userAction: true,\n // anime: { duration: 500, ...options?.anime },\n // ...options,\n // }\n // this.updateState({ visible: true }, mergedOptions.userAction)\n // await this._show(mergedOptions)\n // }\n // /** 插件内容整体隐藏\n // * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n // * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n // * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n // * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n // */\n // public async hide(options?: Partial<PluginType.ShowHideOptions>) {\n // if (this.state.visible === false) return\n // const mergedOptions: PluginType.ShowHideOptions = {\n // userAction: true,\n // anime: { duration: 500, ...options?.anime },\n // ...options,\n // }\n // this.updateState({ visible: false }, mergedOptions.userAction)\n // await 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 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._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._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 const prevConfig = this.config\n const newConfig = { ...prevConfig, ...config }\n this._config = newConfig\n this.hooks.emit('configChange', { prevConfig, config: newConfig, userAction: options.userAction ?? true })\n }\n\n /** 根据 ID 获取标注 */\n public getMaskItemByID(id: string | number) {\n return this.itemMap.get(id)\n }\n\n /** 销毁插件,移除所有副作用,销毁后将不响应任何 API */\n public clear() {\n this.itemMap.forEach(item => item.dispose())\n this.itemMap.clear()\n this.modelGroup.clear()\n this.childrenMountedState = false\n this.data = undefined\n this.five.needsRender = true\n }\n\n public dispose = () => {\n if (this.disposed) return\n this._disposed = true\n this.state.enabled = false\n this._disable({ userAction: false })\n this.clear()\n this.tagDomContainer.remove()\n this.five.off('dispose', this.dispose)\n this.hooks.emit('dispose')\n this.hooks.off()\n }\n\n protected formatData(serverData: PluginType.ServerData): PluginType.PluginData {\n function isV1(data: PluginType.ServerData): data is PluginType.ServerDataV1 {\n // 如果 list 长度为 0,不能判断是 v1 还是 v2,所以默认是 v1\n if (data.list.length === 0) return true\n return !('shape' in data.list[0].object_data)\n }\n if (isV1(serverData)) {\n return {\n list: serverData.list\n // 三个点以下不能构成面\n .filter((item) => item.object_data.points.length >= 3)\n .map((item) => {\n // 通过 points 生成 shape\n const shape = new THREE.Shape()\n const firstPoint = item.object_data.points[0]\n shape.moveTo(firstPoint[0], firstPoint[2])\n item.object_data.points.slice(1).forEach((point) => shape.lineTo(point[0], point[2]))\n shape.lineTo(firstPoint[0], firstPoint[2])\n\n const formattedItem: PluginType.ServerAreaMakerItem = {\n ...item,\n floor_index: item.object_data.floorIndex,\n object_data: {\n ...item.object_data,\n bottom_y: firstPoint[1] + item.object_data.fixedY,\n shape: shape.toJSON(),\n height: item.object_data.height + item.object_data.fixedHeight,\n },\n }\n return formattedItem\n }),\n }\n }\n return serverData\n }\n\n private checkChildrenMountedState(): { result: boolean; msg: string } {\n const pluginState = this.state\n const five = this.five\n if (!pluginState.enabled) return { result: false, msg: '插件不可用' }\n const mode = five.getCurrentState().mode\n if (mode === 'Panorama') return { result: false, msg: `Five 模态不符合条件, 当前模态为:${mode}` }\n if (this.isInFiveChangeModeAnime) return { result: false, msg: '切换模态动画中不展示' }\n return { result: true, msg: '' }\n }\n\n private updateChildrenMountedState() {\n const { result, msg } = this.checkChildrenMountedState()\n this.checkMsg.childrenMountedState = msg\n if (result === this.childrenMountedState) return\n this.childrenMountedState = result\n this.itemMap.forEach((item) => {\n this.childrenMountedState ? item.mount() : item.unmount()\n })\n }\n\n private onFiveInitAnimationWillStart: EventCallback['initAnimationWillStart'] = () => {\n this.isInFiveChangeModeAnime = true\n this.updateChildrenMountedState()\n }\n\n private onFiveInitAnimationEnded: EventCallback['initAnimationEnded'] = () => {\n this.isInFiveChangeModeAnime = false\n this.updateChildrenMountedState()\n }\n\n private onFiveCameraUpdate: EventCallback['cameraUpdate'] = () => {\n const camera = this.five.camera\n const sortedItems = [...this.itemMap.values()].sort((a, b) => {\n const aDistance = a.tagPosition.distanceTo(camera.position)\n const bDistance = b.tagPosition.distanceTo(camera.position)\n return bDistance - aDistance\n })\n sortedItems.forEach((item, index) => {\n this.getMaskItemByID(item.id)?.setTagZIndex(index * 10)\n })\n }\n\n private onFiveModeChange: EventCallback['modeChange'] = () => {\n this.updateChildrenMountedState()\n }\n\n private onMakerTagClick: PluginType.AreaMakerItemEventMap['tagClick'] = (event) => {\n this.hooks.emit('wantsTap', { target: event.target, intersectObjects: [] })\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 private _enable(options: { userAction: boolean }) {\n this.hooks.emit('enable', { userAction: options.userAction })\n // resume model effects\n this.five.scene.add(this.modelGroup)\n this.updateChildrenMountedState()\n this.five.needsRender = true\n\n // resume event effects\n this.five.on('wantsTapGesture', this.onWantsFiveTapGesture)\n this.five.on('initAnimationWillStart', this.onFiveInitAnimationWillStart)\n this.five.on('initAnimationEnded', this.onFiveInitAnimationEnded)\n this.five.on('modeChange', this.onFiveModeChange)\n this.five.on('cameraUpdate', this.onFiveCameraUpdate)\n }\n\n private onWantsFiveTapGesture: EventCallback['wantsTapGesture'] = (raycaster) => {\n const intersectResArray = Array.from(this.itemMap.values())\n .filter((item) => item.mounted && item.visible)\n .map((item) => ({\n makerItem: item,\n intersects: item.modelGroup.getRaycastIntersects(raycaster),\n }))\n .filter(({ intersects }) => intersects.length > 0)\n if (intersectResArray.length === 0) return\n const nearestIntersectRes = intersectResArray.reduce((prev, curr) => {\n const prevDistance = prev.intersects[0].distance\n const currDistance = curr.intersects[0].distance\n return prevDistance < currDistance ? prev : curr\n })\n const fiveModelIntersect = this.fiveUtil.model.intersectRaycaster(raycaster)[0]\n const depthTest = this.config.modelDepthTest\n if (depthTest && fiveModelIntersect && fiveModelIntersect.distance < nearestIntersectRes.intersects[0].distance) return\n const preventDefault = this.hooks.emit('wantsTap', {\n target: nearestIntersectRes.makerItem,\n intersectObjects: nearestIntersectRes.intersects,\n })\n if (preventDefault) return false\n }\n\n private _disable(options: { userAction: boolean }) {\n this.hooks.emit('disable', { userAction: options.userAction })\n // dispose model effects\n // this.disposeAnime()\n this.five.scene.remove(this.modelGroup)\n this.updateChildrenMountedState()\n this.five.needsRender = true\n // dispose event effects\n this.five.off('wantsTapGesture', this.onWantsFiveTapGesture)\n this.five.off('initAnimationWillStart', this.onFiveInitAnimationWillStart)\n this.five.off('initAnimationEnded', this.onFiveInitAnimationEnded)\n this.five.off('modeChange', this.onFiveModeChange)\n this.five.off('cameraUpdate', this.onFiveCameraUpdate)\n }\n\n private async _show(options: PluginType.ShowHideOptions) {\n this.hooks.emit('show', options)\n this.five.needsRender = true\n }\n\n private async _hide(options: PluginType.ShowHideOptions) {\n this.hooks.emit('hide', options)\n this.five.needsRender = true\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport type * as AreaMakerPluginType from './typing'\nimport { Controller } from './Controller'\n\nexport const AreaMakerPlugin = (five: Five, params?: AreaMakerPluginType.Params) => new Controller(five, params)\n\nexport type { AreaMakerPluginType }\n"],"mappings":"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"}
1
+ {"version":3,"file":"area-maker-DQMgJ_Kq.js","names":["Object3D","LineSegments","OriginLineSegments","Object3D","LineSegments","BasePlugin.Controller","Subscribe","_raycaster","resizeObserver","BetterTween","equal","Controller$1","mountComponent","LabelItem","getCurrentFontSize","getGlobalResponsiveFontSize","getCenterPointOfPoints","THREE","Object3D$1","intersects","raycaster","LineSegments$1","LineSegments","geometry","material","AreaMakerModelGroup","areaMakerItem","AreaMakerItem","objectData","data","bottomY","height","color","opacity","plugin","createMakerObjectGeometry","createMakerObjectMaterial","format2XOZ","hasTag","tagContainer","fontSize","colorObj","shapePoints","shapeCenterPoint","shapeCenterPoint3","zIndex","duration","options","startMakerObjectOpacity","endMakerObjectOpacity","startOutlineOpacity","endOutlineOpacity","makerObjectOpacity","outlineOpacity","resolve","event","visible","msg","modelGroupVisible","shownFloor","tagNDCPosition","ndcPosition","left","top","tagVisible","five","cameraPosition","intersection","vectorDistance","onResizeEnd","shape","matrix","rotationMatrix","translationMatrix","scaleMatrix","object","Controller","defaultState","params","config","prevData","item","dataItem","userAction","mergedOptions","prevState","state","prevConfig","newConfig","id","isV1","serverData","firstPoint","point","pluginState","mode","result","camera","aDistance","a","b","index","intersectResArray","nearestIntersectRes","prev","curr","fiveModelIntersect","AreaMakerPlugin"],"sources":["../../src/shared-utils/three/core/Object3D.ts","../../src/shared-utils/three/core/LineSegments.ts","../../src/AreaMakerPlugin/utils/Item.ts","../../src/AreaMakerPlugin/Controller.ts","../../src/AreaMakerPlugin/index.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\n\nexport class Object3D<ChildeItem extends THREE.Object3D = THREE.Object3D> extends THREE.Object3D {\n public children: ChildeItem[] = []\n\n /** 获取 raycaster 与当前物体的交点 */\n public getRaycastIntersects(raycaster: THREE.Raycaster) {\n const intersects: THREE.Intersection[] = []\n this.raycast(raycaster, intersects)\n return intersects\n }\n\n /** 获取 raycaster 与当前物体的第一个交点 */\n public getRaycastIntersection(raycaster: THREE.Raycaster) {\n return this.getRaycastIntersects(raycaster)[0] as THREE.Intersection | undefined\n }\n}\n","/** Typed LineSegments constrained to Three's current BufferGeometry model. */\nimport type { BufferGeometry, Material } from 'three/webgpu'\nimport { LineSegments as OriginLineSegments } from 'three/webgpu'\n\nclass LineSegments<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material | Material[] = Material | Material[],\n> extends OriginLineSegments<TGeometry, TMaterial> {\n public declare geometry: TGeometry\n public declare material: TMaterial\n\n public constructor(geometry: TGeometry, material: TMaterial) {\n super(geometry, material)\n }\n}\n\nexport { LineSegments }\n","import * as THREE from 'three/webgpu'\nimport { BetterTween, Object3D } from '../../shared-utils'\nimport { LineSegments } from '../../shared-utils'\nimport type { Controller } from '../Controller'\nimport type * as PluginType from '../typing'\nimport LabelItem from '../../components/AreaLabel/LabelItem.svelte'\nimport { getCenterPointOfPoints } from '../../shared-utils/math/planimetry'\nimport type { EventCallback } from '@realsee/five-webgpu'\nimport { Subscribe } from '../../shared-utils/Subscribe'\nimport { resizeObserver } from '../../shared-utils/dom/resizeObserver'\nimport { _raycaster } from '../../shared-utils/three/temp'\nimport { getCurrentFontSize, getGlobalResponsiveFontSize } from '../../shared-utils/fontSize'\n\nimport { mountComponent, type MountedComponent } from '../../shared-utils/svelte/component.svelte'\nclass AreaMakerModelGroup extends Object3D {\n private areaMakerItem: AreaMakerItem\n\n public constructor(areaMakerItem: AreaMakerItem) {\n super()\n this.areaMakerItem = areaMakerItem\n }\n\n public raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void {\n const makerObject = this.areaMakerItem.makerObject\n makerObject.raycast(raycaster, intersects)\n }\n}\n\nexport class AreaMakerItem {\n public id: string | number\n /** 标注名称 */\n public name = ''\n /** 标注几何体 */\n public makerObject: THREE.Mesh<THREE.ExtrudeGeometry, THREE.MeshBasicMaterial>\n /** 标注几何体的边框 */\n public outline: LineSegments<THREE.EdgesGeometry, THREE.LineBasicMaterial>\n /** 标注底面 Y 坐标 */\n public bottomY: PluginType.ServerAreaMakerItem['object_data']['bottom_y']\n /** 标注透明度 */\n public opacity: PluginType.ServerAreaMakerItem['object_data']['opacity']\n /** 标注高度 */\n public height: PluginType.ServerAreaMakerItem['object_data']['height']\n /** 标注所在楼层 */\n public floorIndex: PluginType.ServerAreaMakerItem['floor_index']\n /** 标注底面形状 */\n public shape: THREE.Shape\n /** 是否被挂载 */\n public mounted = false\n /** 查询问题使用的调试对象 */\n public checkMsg = {\n /** 当标注没有展示时,可以通过这个字段查看原因 */\n checkVisibleMsg: '',\n /** 当标注标签没有展示时,可以通过这个字段查看原因 */\n checkTagVisibleMsg: '',\n }\n /** 模型容器 */\n public modelGroup: AreaMakerModelGroup\n /** 标注是否可见 */\n public visible = true\n // ==================== 标签相关 ====================\n /** 标注标签实例 */\n public tagApp: MountedComponent<any>\n /** 标注标签是否可见 */\n public tagVisible: boolean | null = null\n /** 标注标签的世界坐标 */\n public tagPosition = new THREE.Vector3()\n /** 标注标签的 NDC 坐标 */\n public tagNDCPosition = new THREE.Vector3()\n /** 标注标签的 transform */\n public tagTransform = { left: 0, top: 0 }\n /** 标注标签的显示层级 */\n public tagZIndex = 0\n /** 标注实例的事件处理器 */\n public hooks = new Subscribe<PluginType.AreaMakerItemEventMap>()\n\n /** 自定义 Dom */\n public itemRenderer?: PluginType.ItemRenderer\n /** 数据 */\n private data: PluginType.ServerAreaMakerItem\n /** Plugin 实例 */\n private plugin: Controller\n /** 标注透明度动画 */\n private opacityAnime?: BetterTween<{ makerObjectOpacity: number; outlineOpacity: number }>\n /** 是否在容器 resize 动画中 */\n private isInContainerResizeAnimation = false\n /** 监听容器 resize 的计时器 id,用于判断 resize 过程是否结束 */\n private containerResizeTimeoutID: NodeJS.Timeout | null = null\n /** 容器大小变化监听器 */\n private resizeObserver?: { observe: () => void; unobserve: () => void }\n /** 响应式字体大小管理器 */\n private fontSizeManager = getGlobalResponsiveFontSize()\n /** 当前字体大小 */\n private currentFontSize = getCurrentFontSize()\n /** 字体大小订阅取消函数 */\n private unsubscribeFontSize: (() => void) | null = null\n\n public constructor(plugin: Controller, data: PluginType.ServerAreaMakerItem) {\n const objectData = data.object_data\n const bottomY = objectData.bottom_y\n const height = objectData.height\n const color = new THREE.Color(objectData.color ?? '#FFFFFF')\n const opacity = objectData.opacity ?? 0.4\n\n this.data = data\n this.id = data.id\n this.name = data.name ?? ''\n this.plugin = plugin\n this.height = height\n this.bottomY = bottomY\n this.opacity = opacity\n this.shape = new THREE.Shape().fromJSON(objectData.shape as THREE.ShapeJSON)\n this.floorIndex = data.floor_index\n // 构造模型\n this.makerObject = new THREE.Mesh(createMakerObjectGeometry(this.shape, height), createMakerObjectMaterial(color, opacity))\n format2XOZ(this.makerObject, bottomY)\n this.makerObject.material.depthTest = this.plugin.config.modelDepthTest\n // 构造 outline\n this.outline = new LineSegments(\n new THREE.EdgesGeometry(this.makerObject.geometry),\n new THREE.LineBasicMaterial({ color, transparent: true }),\n )\n format2XOZ(this.outline, bottomY)\n this.outline.material.depthTest = this.plugin.config.modelDepthTest\n this.setHeight(height)\n\n this.modelGroup = new AreaMakerModelGroup(this)\n // 初始化 modelGroup 的 visible\n this.modelGroup.visible = objectData.visible ?? true\n }\n\n /** 挂载标注 */\n public mount() {\n if (this.mounted) return\n this.mounted = true\n // 更新 visible\n this.updateVisible()\n // 更新 depthTest\n this.makerObject.material.depthTest = this.plugin.config.modelDepthTest\n this.outline.material.depthTest = this.plugin.config.modelDepthTest\n // 添加模型\n this.modelGroup.add(this.makerObject, this.outline)\n // 应用标签\n const hasTag = !!this.name\n const tagContainer = this.plugin.tagDomContainer\n if (hasTag) {\n this.tagApp = mountComponent(LabelItem, tagContainer, {\n fontSize: this.currentFontSize,\n rendererData: this.data,\n content: this.name,\n visible: this.tagVisible,\n rendererIfNeed: this.itemRenderer,\n transform: `translate(${this.tagTransform.left}px, ${this.tagTransform.top}px)`,\n onClick: (e: MouseEvent) => this.hooks.emit('tagClick', { target: this, nativeEvent: e }),\n })\n this.updateTag()\n }\n\n this.plugin.five.needsRender = true\n\n // 添加事件监听\n this.plugin.hooks.on('stateChange', this.onPluginStateChange)\n this.plugin.hooks.on('configChange', this.onPluginConfigChange)\n this.plugin.five.on('modeChange', this.updateVisible)\n this.plugin.five.on('modelShownFloorChange', this.updateVisible)\n this.plugin.five.on('cameraUpdate', this.onFiveCameraUpdate)\n this.resizeObserver = resizeObserver(this.onContainerResize, tagContainer)\n this.resizeObserver.observe()\n\n // 监听字体大小变化\n if (typeof this.fontSizeManager === 'object' && 'subscribe' in this.fontSizeManager) {\n this.unsubscribeFontSize = this.fontSizeManager.subscribe((fontSize) => {\n this.currentFontSize = fontSize\n this.updateTagFontSize()\n })\n }\n }\n\n /** 卸载标注 */\n public unmount() {\n if (!this.mounted) return\n this.mounted = false\n // 移除模型\n this.modelGroup.remove(...this.modelGroup.children)\n // 移除标签\n this.tagApp?.destroy()\n this.tagApp = null\n // 解除事件监听\n this.plugin.hooks.off('stateChange', this.onPluginStateChange)\n this.plugin.hooks.off('configChange', this.onPluginConfigChange)\n this.plugin.five.off('modeChange', this.updateVisible)\n this.plugin.five.off('modelShownFloorChange', this.updateVisible)\n this.plugin.five.off('cameraUpdate', this.onFiveCameraUpdate)\n this.resizeObserver?.unobserve()\n // 取消字体大小订阅\n this.unsubscribeFontSize?.()\n }\n\n public dispose() {\n this.unmount()\n this.opacityAnime?.dispose()\n if (this.containerResizeTimeoutID) clearTimeout(this.containerResizeTimeoutID)\n this.makerObject.geometry.dispose()\n this.makerObject.material.dispose()\n this.outline.geometry.dispose()\n this.outline.material.dispose()\n this.hooks.off()\n }\n\n /** 更改标注透明度\n * @param opacity 标注透明度,范围:0-1\n */\n public setOpacity(opacity: number) {\n this.opacity = opacity\n // 如果当前有透明度动画,应该先销毁动画\n this.opacityAnime?.dispose()\n this.makerObject.material.opacity = opacity\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注颜色\n * @param color 标注颜色,支持 hex\n * @example setColor('#FF0000')\n */\n public setColor(color: string) {\n const colorObj = new THREE.Color(color)\n this.makerObject.material.color = colorObj\n this.outline.material.color = colorObj\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注高度\n * @param height 标注高度,单位:米\n */\n public setHeight(height: number) {\n if (height <= 0) throw new Error('高度必须大于 0')\n this.height = height\n // 处理模型\n this.makerObject.geometry.dispose()\n this.outline.geometry.dispose()\n this.makerObject.geometry = createMakerObjectGeometry(this.shape, height)\n // 处理 outline\n this.outline.geometry = new THREE.EdgesGeometry(this.makerObject.geometry)\n // 计算 tagPosition\n const shapePoints = this.shape.extractPoints(10).shape.slice(0, -1)\n const shapeCenterPoint = getCenterPointOfPoints(shapePoints)\n const shapeCenterPoint3 = new THREE.Vector3(shapeCenterPoint.x, shapeCenterPoint.y, height)\n format2XOZ(shapeCenterPoint3, this.bottomY)\n this.tagPosition.copy(shapeCenterPoint3)\n this.updateTag()\n\n // 渲染场景\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注标签的显示层级\n * @description 为什么需要这个方法\n * 在相机朝向或位置发生变化时,各个标签所在的坐标与相机的远近关系发生了变化,所以标签的层级也会有变化。\n * 比如:\n * - 相机 -> 标签 A -> 标签 B: 标签 A 在标签 B 的前面\n * - 标签 A <- 标签 B <- 相机: 标签 A 在标签 B 的后面\n * 但是当前元素是无法感知到这种变化的,所以需要通过父元素调用这个方法来更新标签的层级。\n */\n public setTagZIndex(zIndex: number) {\n if (this.tagZIndex === zIndex) return\n this.tagApp?.update({ zIndex })\n }\n\n /** 显示标注 */\n // public show() {\n // return this.doOpacityAnime({\n // duration: 500,\n // makerObjectOpacity: [this.makerObject.material.opacity, this.opacity],\n // outlineOpacity: [this.outline.material.opacity, 1],\n // ...options,\n // })\n // }\n\n /** 隐藏标注 */\n // public hide() {\n // return this.doOpacityAnime({\n // duration: 500,\n // makerObjectOpacity: [this.makerObject.material.opacity, 0],\n // outlineOpacity: [this.outline.material.opacity, 0],\n // ...options,\n // })\n // }\n\n /** 透明度动画 */\n private doOpacityAnime = (\n options: Required<PluginType.AnimeOptions> & { makerObjectOpacity: [number, number]; outlineOpacity: [number, number] },\n ) => {\n this.opacityAnime?.dispose()\n const duration = options.duration\n const [startMakerObjectOpacity, endMakerObjectOpacity] = options.makerObjectOpacity\n const [startOutlineOpacity, endOutlineOpacity] = options.outlineOpacity\n\n if (duration === 0) {\n this.makerObject.material.opacity = endMakerObjectOpacity\n this.outline.material.opacity = endOutlineOpacity\n return\n }\n\n return new Promise<boolean>((resolve) => {\n this.opacityAnime = new BetterTween({ makerObjectOpacity: startMakerObjectOpacity, outlineOpacity: startOutlineOpacity })\n .to({\n makerObjectOpacity: endMakerObjectOpacity,\n outlineOpacity: endOutlineOpacity,\n })\n .onUpdate(({ makerObjectOpacity, outlineOpacity }) => {\n this.makerObject.material.opacity = makerObjectOpacity\n this.outline.material.opacity = outlineOpacity\n this.plugin.five.needsRender = true\n })\n .onComplete(() => resolve(true))\n .onDispose(() => {\n // 销毁动画的时候应该把值设置到终值\n this.makerObject.material.opacity = endMakerObjectOpacity\n this.outline.material.opacity = endOutlineOpacity\n this.plugin.five.needsRender = true\n resolve(false)\n })\n .play()\n })\n }\n\n /** 插件 Config 变化时更新自身 depthTest */\n private onPluginConfigChange = (event: { config: PluginType.Config }) => {\n this.makerObject.material.depthTest = event.config.modelDepthTest\n this.outline.material.depthTest = event.config.modelDepthTest\n this.plugin.five.needsRender = true\n }\n\n /** 插件整体可见性变化时,需要更新自身可见性 */\n private onPluginStateChange = () => {\n this.updateVisible()\n this.updateTagVisible()\n }\n\n /** 更新标注可见性 */\n private updateVisible = () => {\n const { result: visible, msg } = this.checkVisible()\n this.checkMsg.checkVisibleMsg = msg\n if (this.visible === visible) return\n this.visible = visible\n const modelGroupVisible = this.data.object_data.visible ?? true\n this.modelGroup.visible = visible && modelGroupVisible\n this.plugin.five.needsRender = true\n }\n\n /** 检测标注是否可见 */\n private checkVisible = (): { result: boolean; msg: string } => {\n const pluginState = this.plugin.state\n if (!pluginState.visible) return { result: false, msg: '插件不可见' }\n const shownFloor = this.plugin.fiveUtil.model.shownFloor\n const floorVisible = shownFloor === null || shownFloor === this.floorIndex\n if (!floorVisible) return { result: false, msg: `模型高亮楼层不符合展示条件, 当前高亮楼层为:${shownFloor}` }\n return { result: true, msg: '' }\n }\n\n /** 更新标注标签 */\n private updateTag = () => {\n if (!this.tagApp) return\n this.updateTagNDCPosition()\n this.updateTagDomTransform()\n this.updateTagVisible()\n }\n\n /** 更新标注标签的 NDC Position */\n private updateTagNDCPosition = () => {\n const tagPosition = this.tagPosition\n const tagNDCPosition = tagPosition.clone().project(this.plugin.five.camera)\n this.tagNDCPosition.copy(tagNDCPosition)\n }\n\n /** 更新标注标签的 transform */\n private updateTagDomTransform = () => {\n const ndcPosition = this.tagNDCPosition\n const left = Math.round(((ndcPosition.x + 1) / 2) * this.plugin.tagDomContainer.clientWidth)\n const top = Math.round(((-ndcPosition.y + 1) / 2) * this.plugin.tagDomContainer.clientHeight)\n if (this.tagTransform.left === left && this.tagTransform.top === top) return\n this.tagTransform = { left, top }\n this.tagApp?.update({ transform: `translate(${left}px, ${top}px)` })\n }\n\n /** 更新标注标签可见性 */\n private updateTagVisible = () => {\n const { result: tagVisible, msg } = this.checkTagVisible()\n this.checkMsg.checkTagVisibleMsg = msg\n if (this.tagVisible === tagVisible) return\n this.tagVisible = tagVisible\n if (this.tagApp) {\n this.tagVisible ? this.hooks.emit('tagShow') : this.hooks.emit('tagHide')\n this.tagApp?.update({ visible: tagVisible })\n }\n }\n\n /** 检测标注标签是否可见 */\n private checkTagVisible = (): { result: boolean; msg: string } => {\n // 检测标注整体可见性\n const makerVisible = this.visible\n if (!makerVisible) return { result: false, msg: '标注整体不可见' }\n // resize 动画中不可见\n if (this.isInContainerResizeAnimation) return { result: false, msg: '处于容器 resize 动画中' }\n // 模型遮挡检测\n const five = this.plugin.five\n const cameraPosition = five.camera.position.clone()\n _raycaster.set(cameraPosition.clone(), this.tagPosition.clone().sub(cameraPosition).normalize())\n const [intersection] = this.plugin.fiveUtil.model.intersectRaycaster(_raycaster)\n const vectorDistance = this.tagPosition.distanceTo(five.camera.position)\n if (intersection && intersection.distance + 0.1 < vectorDistance) return { result: false, msg: '标注标签被 Five 模型遮挡' }\n // 检测标注标签 NDC Position 是否在屏幕内\n const tagNDCPosition = this.tagNDCPosition\n if (Math.abs(tagNDCPosition.x) > 1.2 || Math.abs(tagNDCPosition.y) > 1.2 || Math.abs(tagNDCPosition.z) > 1)\n return { result: false, msg: '标注标签不在屏幕内' }\n\n return { result: true, msg: '' }\n }\n\n /** 相机位姿发生变化时,更新标签 */\n private onFiveCameraUpdate: EventCallback['cameraUpdate'] = () => {\n if (!this.tagApp) return\n if (!this.visible) return\n this.updateTagNDCPosition()\n this.updateTagDomTransform()\n this.updateTagVisible()\n }\n\n /** tag container DOM 发生 resize */\n private onContainerResize = () => {\n // resize start 时,更新标签\n const isResizeStart = this.isInContainerResizeAnimation === false\n if (isResizeStart) {\n this.isInContainerResizeAnimation = true\n this.updateTag()\n }\n\n const onResizeEnd = () => {\n this.isInContainerResizeAnimation = false\n this.containerResizeTimeoutID = null\n this.updateTag()\n }\n\n if (this.containerResizeTimeoutID) clearTimeout(this.containerResizeTimeoutID)\n this.containerResizeTimeoutID = setTimeout(onResizeEnd, 100)\n }\n\n /** 更新标注字体大小 */\n private updateTagFontSize = () => {\n if (this.tagApp) {\n this.tagApp.update({ fontSize: this.currentFontSize })\n }\n }\n}\n\n/** 创建标注几何体的 Geometry */\nfunction createMakerObjectGeometry(shape: THREE.Shape, height: number) {\n const geometry = new THREE.ExtrudeGeometry(shape, {\n depth: height,\n bevelEnabled: false,\n })\n return geometry\n}\n\n/** 创建标注几何体的 Material */\nfunction createMakerObjectMaterial(color: THREE.Color, opacity: number) {\n return new THREE.MeshBasicMaterial({\n color,\n opacity,\n transparent: true,\n })\n}\n\n/** 把 XOY 面上的 Mesh 转换成 XOZ 面 */\nfunction format2XOZ(object: THREE.Object3D | THREE.Box3 | THREE.Vector3, bottomY: number) {\n const matrix = new THREE.Matrix4() // 创建一个新的 Matrix4 对象\n // 创建各个子变换矩阵\n const rotationMatrix = new THREE.Matrix4().makeRotationX(Math.PI / 2)\n const translationMatrix = new THREE.Matrix4().makeTranslation(0, 0, -bottomY)\n const scaleMatrix = new THREE.Matrix4().makeScale(1, 1, -1)\n\n // 分别对 matrix 应用旋转、平移、缩放\n matrix.multiply(rotationMatrix) // 对 matrix 应用旋转\n matrix.multiply(translationMatrix) // 对 matrix 应用平移\n matrix.multiply(scaleMatrix) // 对 matrix 应用缩放\n\n // 对 object 应用 matrix 变换\n object.applyMatrix4(matrix)\n}\n","import * as THREE from 'three/webgpu'\nimport type { EventCallback, Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { equal } from '../shared-utils'\nimport { AreaMakerItem } from './utils/Item'\nimport type * as PluginType from './typing'\n\nexport class Controller extends BasePlugin.Controller<PluginType.State, PluginType.EventMap, PluginType.ServerData, PluginType.PluginData> {\n // ==================== public properties ====================\n /** 插件当前状态 */\n public state: PluginType.State\n /** 标注模型 { id: item } 的映射表 */\n public itemMap: Map<string | number, AreaMakerItem>\n /** 自定义 DOM */\n public itemRenderer?: PluginType.ItemRenderer\n /** 标注模型容器 */\n public modelGroup: THREE.Group\n /** 当前使用的数据 */\n public data?: PluginType.PluginData\n /** tag 容器 */\n public tagDomContainer: HTMLDivElement\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 childrenMountedState: '',\n }\n\n // ==================== private properties ====================\n /** 是否在 Five Change Mode 动画中 */\n private isInFiveChangeModeAnime = false\n /** 子组件是否挂载 */\n private childrenMountedState = false\n /** config 的原始值 */\n private _config: Required<PluginType.Config>\n /** disposed 的原始值 */\n private _disposed = false\n\n /** AreaMakerPlugin\n * @param `five` `<Five>` Five 实例\n * @param `params` `<PluginType.Params> | <undefined>` 插件初始化参数\n * @param `params.initialState` `<PluginType.State> | <undefined>` 插件初始化后,使用的状态\n */\n public constructor(five: Five, params?: PluginType.Params) {\n super(five)\n this.five = five\n\n this.tagDomContainer = document.createElement('div')\n this.tagDomContainer.style.position = 'absolute'\n this.tagDomContainer.style.top = '0'\n this.tagDomContainer.style.left = '0'\n this.tagDomContainer.style.width = '100%'\n this.tagDomContainer.style.height = '100%'\n this.tagDomContainer.style.pointerEvents = 'none'\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: Required<PluginType.Config> = {\n modelDepthTest: true,\n ...params?.config,\n }\n this._config = config\n\n this.modelGroup = new THREE.Group()\n this.modelGroup.name = 'ModelMakerPluginGroup'\n this.itemMap = new Map()\n\n if (this.state.enabled) this._enable({ userAction: false })\n this.five.once('dispose', this.dispose)\n }\n\n /** 加载数据,重复调用会使用新数据覆盖旧数据 */\n public async load(data: PluginType.ServerData) {\n if (this.disposed) throw new Error('AreaMakerPlugin 已销毁')\n const prevData = this.data\n this.data = this.formatData(data)\n this.hooks.emit('dataChange', this.data, prevData)\n\n // 清除原有数据\n this.modelGroup.remove(...this.modelGroup.children)\n this.itemMap.forEach((item) => item.dispose())\n this.itemMap.clear()\n this.childrenMountedState = false\n this.checkMsg.childrenMountedState = ''\n\n // 加载新数据\n this.data.list.forEach((dataItem) => {\n const item = new AreaMakerItem(this, dataItem)\n item.itemRenderer = this.itemRenderer\n this.modelGroup.add(item.modelGroup)\n this.itemMap.set(dataItem.id, item)\n item.hooks.on('tagClick', this.onMakerTagClick)\n })\n\n this.updateChildrenMountedState()\n }\n\n /** 将插件的 DOM 容器添加到指定的 DOM 元素上 */\n public appendTo(wrapper: Element): void {\n wrapper.appendChild(this.tagDomContainer)\n }\n\n /** 启用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public enable(options: BasePlugin.BaseOptions = {}) {\n if (this.disposed || this.state.enabled) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: true }, userAction)\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.state.enabled === false) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: false }, userAction)\n this._disable({ userAction })\n }\n\n /** 展示标注\n * @param `options` `<Partial<ShowHideOptions>> | <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: PluginType.ShowHideOptions = { userAction: true, ...options }\n this.updateState({ visible: true }, mergedOptions.userAction)\n await this._show(mergedOptions)\n }\n\n /** 插件内容整体隐藏\n * @param `options` `<Partial<ShowHideOptions>> | <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: PluginType.ShowHideOptions = { userAction: true, ...options }\n this.updateState({ visible: false }, mergedOptions.userAction)\n await this._hide(mergedOptions)\n }\n\n // 目前带动画的展示和隐藏功能有些需求细节没有确定,暂时不实现\n // /** 展示标注\n // * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n // * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n // * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n // * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\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: PluginType.ShowHideOptions = {\n // userAction: true,\n // anime: { duration: 500, ...options?.anime },\n // ...options,\n // }\n // this.updateState({ visible: true }, mergedOptions.userAction)\n // await this._show(mergedOptions)\n // }\n // /** 插件内容整体隐藏\n // * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n // * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n // * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n // * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n // */\n // public async hide(options?: Partial<PluginType.ShowHideOptions>) {\n // if (this.state.visible === false) return\n // const mergedOptions: PluginType.ShowHideOptions = {\n // userAction: true,\n // anime: { duration: 500, ...options?.anime },\n // ...options,\n // }\n // this.updateState({ visible: false }, mergedOptions.userAction)\n // await 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 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._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._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 const prevConfig = this.config\n const newConfig = { ...prevConfig, ...config }\n this._config = newConfig\n this.hooks.emit('configChange', { prevConfig, config: newConfig, userAction: options.userAction ?? true })\n }\n\n /** 根据 ID 获取标注 */\n public getMaskItemByID(id: string | number) {\n return this.itemMap.get(id)\n }\n\n /** 销毁插件,移除所有副作用,销毁后将不响应任何 API */\n public clear() {\n this.itemMap.forEach(item => item.dispose())\n this.itemMap.clear()\n this.modelGroup.clear()\n this.childrenMountedState = false\n this.data = undefined\n this.five.needsRender = true\n }\n\n public dispose = () => {\n if (this.disposed) return\n this._disposed = true\n this.state.enabled = false\n this._disable({ userAction: false })\n this.clear()\n this.tagDomContainer.remove()\n this.five.off('dispose', this.dispose)\n this.hooks.emit('dispose')\n this.hooks.off()\n }\n\n protected formatData(serverData: PluginType.ServerData): PluginType.PluginData {\n function isV1(data: PluginType.ServerData): data is PluginType.ServerDataV1 {\n // 如果 list 长度为 0,不能判断是 v1 还是 v2,所以默认是 v1\n if (data.list.length === 0) return true\n return !('shape' in data.list[0].object_data)\n }\n if (isV1(serverData)) {\n return {\n list: serverData.list\n // 三个点以下不能构成面\n .filter((item) => item.object_data.points.length >= 3)\n .map((item) => {\n // 通过 points 生成 shape\n const shape = new THREE.Shape()\n const firstPoint = item.object_data.points[0]\n shape.moveTo(firstPoint[0], firstPoint[2])\n item.object_data.points.slice(1).forEach((point) => shape.lineTo(point[0], point[2]))\n shape.lineTo(firstPoint[0], firstPoint[2])\n\n const formattedItem: PluginType.ServerAreaMakerItem = {\n ...item,\n floor_index: item.object_data.floorIndex,\n object_data: {\n ...item.object_data,\n bottom_y: firstPoint[1] + item.object_data.fixedY,\n shape: shape.toJSON(),\n height: item.object_data.height + item.object_data.fixedHeight,\n },\n }\n return formattedItem\n }),\n }\n }\n return serverData\n }\n\n private checkChildrenMountedState(): { result: boolean; msg: string } {\n const pluginState = this.state\n const five = this.five\n if (!pluginState.enabled) return { result: false, msg: '插件不可用' }\n const mode = five.getCurrentState().mode\n if (mode === 'Panorama') return { result: false, msg: `Five 模态不符合条件, 当前模态为:${mode}` }\n if (this.isInFiveChangeModeAnime) return { result: false, msg: '切换模态动画中不展示' }\n return { result: true, msg: '' }\n }\n\n private updateChildrenMountedState() {\n const { result, msg } = this.checkChildrenMountedState()\n this.checkMsg.childrenMountedState = msg\n if (result === this.childrenMountedState) return\n this.childrenMountedState = result\n this.itemMap.forEach((item) => {\n this.childrenMountedState ? item.mount() : item.unmount()\n })\n }\n\n private onFiveInitAnimationWillStart: EventCallback['initAnimationWillStart'] = () => {\n this.isInFiveChangeModeAnime = true\n this.updateChildrenMountedState()\n }\n\n private onFiveInitAnimationEnded: EventCallback['initAnimationEnded'] = () => {\n this.isInFiveChangeModeAnime = false\n this.updateChildrenMountedState()\n }\n\n private onFiveCameraUpdate: EventCallback['cameraUpdate'] = () => {\n const camera = this.five.camera\n const sortedItems = [...this.itemMap.values()].sort((a, b) => {\n const aDistance = a.tagPosition.distanceTo(camera.position)\n const bDistance = b.tagPosition.distanceTo(camera.position)\n return bDistance - aDistance\n })\n sortedItems.forEach((item, index) => {\n this.getMaskItemByID(item.id)?.setTagZIndex(index * 10)\n })\n }\n\n private onFiveModeChange: EventCallback['modeChange'] = () => {\n this.updateChildrenMountedState()\n }\n\n private onMakerTagClick: PluginType.AreaMakerItemEventMap['tagClick'] = (event) => {\n this.hooks.emit('wantsTap', { target: event.target, intersectObjects: [] })\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 private _enable(options: { userAction: boolean }) {\n this.hooks.emit('enable', { userAction: options.userAction })\n // resume model effects\n this.five.scene.add(this.modelGroup)\n this.updateChildrenMountedState()\n this.five.needsRender = true\n\n // resume event effects\n this.five.on('wantsTapGesture', this.onWantsFiveTapGesture)\n this.five.on('initAnimationWillStart', this.onFiveInitAnimationWillStart)\n this.five.on('initAnimationEnded', this.onFiveInitAnimationEnded)\n this.five.on('modeChange', this.onFiveModeChange)\n this.five.on('cameraUpdate', this.onFiveCameraUpdate)\n }\n\n private onWantsFiveTapGesture: EventCallback['wantsTapGesture'] = (raycaster) => {\n const intersectResArray = Array.from(this.itemMap.values())\n .filter((item) => item.mounted && item.visible)\n .map((item) => ({\n makerItem: item,\n intersects: item.modelGroup.getRaycastIntersects(raycaster),\n }))\n .filter(({ intersects }) => intersects.length > 0)\n if (intersectResArray.length === 0) return\n const nearestIntersectRes = intersectResArray.reduce((prev, curr) => {\n const prevDistance = prev.intersects[0].distance\n const currDistance = curr.intersects[0].distance\n return prevDistance < currDistance ? prev : curr\n })\n const fiveModelIntersect = this.fiveUtil.model.intersectRaycaster(raycaster)[0]\n const depthTest = this.config.modelDepthTest\n if (depthTest && fiveModelIntersect && fiveModelIntersect.distance < nearestIntersectRes.intersects[0].distance) return\n const preventDefault = this.hooks.emit('wantsTap', {\n target: nearestIntersectRes.makerItem,\n intersectObjects: nearestIntersectRes.intersects,\n })\n if (preventDefault) return false\n }\n\n private _disable(options: { userAction: boolean }) {\n this.hooks.emit('disable', { userAction: options.userAction })\n // dispose model effects\n // this.disposeAnime()\n this.five.scene.remove(this.modelGroup)\n this.updateChildrenMountedState()\n this.five.needsRender = true\n // dispose event effects\n this.five.off('wantsTapGesture', this.onWantsFiveTapGesture)\n this.five.off('initAnimationWillStart', this.onFiveInitAnimationWillStart)\n this.five.off('initAnimationEnded', this.onFiveInitAnimationEnded)\n this.five.off('modeChange', this.onFiveModeChange)\n this.five.off('cameraUpdate', this.onFiveCameraUpdate)\n }\n\n private async _show(options: PluginType.ShowHideOptions) {\n this.hooks.emit('show', options)\n this.five.needsRender = true\n }\n\n private async _hide(options: PluginType.ShowHideOptions) {\n this.hooks.emit('hide', options)\n this.five.needsRender = true\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport type * as AreaMakerPluginType from './typing'\nimport { Controller } from './Controller'\n\nexport const AreaMakerPlugin = (five: Five, params?: AreaMakerPluginType.Params) => new Controller(five, params)\n\nexport type { AreaMakerPluginType }\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { r as e } from "./rolldown-runtime-B0aSnxlc.js";
2
- import { t } from "./loadTexture-CJ3EbTXw.js";
2
+ import { t } from "./loadTexture-CyYrJnqG.js";
3
3
  import { t as n } from "./GLTFLoader-DCsDrP-N.js";
4
4
  import { t as r } from "./transformPosition-Cc92Wf0o.js";
5
5
  import { t as i } from "./Subscribe-DLlAl88n.js";
@@ -19,9 +19,9 @@ import { f as de } from "./defaultUrls-CfMtGzqM.js";
19
19
  import { n as fe } from "./BetterTween-DmptqE8m.js";
20
20
  import { r as pe } from "./animationFrame-CacKXN8l.js";
21
21
  import { _ as me, a as he, b as ge, c as _e, d as ve, f as ye, g as be, h as xe, i as Se, l as Ce, m as we, n as Te, o as Ee, p as De, r as Oe, s as ke, t as Ae, u as je, y as Me } from "./animation-D9rPUNWJ.js";
22
- import { t as Ne } from "./BasePlugin-BuBA8hmL.js";
22
+ import { t as Ne } from "./BasePlugin-DEJ6v9b1.js";
23
23
  import { $ as Pe, A as Fe, B as Ie, C as A, D as Le, F as Re, G as j, H as ze, I as Be, J as Ve, K as M, L as He, M as N, N as Ue, O as We, P, Q as F, R as I, T as Ge, U as L, V as R, W as z, X as B, Y as V, Z as Ke, _ as qe, a as Je, at as Ye, b as Xe, c as Ze, et as H, f as U, g as Qe, h as $e, i as et, it as W, j as tt, k as nt, l as rt, m as it, n as G, nt as at, o as K, ot, p as q, q as J, r as st, rt as Y, s as ct, st as X, t as lt, tt as ut, v as dt, w as ft, x as pt, y as mt, z as Z } from "./component.svelte-D5LYqt50.js";
24
- import { f as ht, n as gt, r as _t, t as vt } from "./Rectangle-DMravW3j.js";
24
+ import { f as ht, n as gt, r as _t, t as vt } from "./Rectangle-D-ScAgcU.js";
25
25
  import { n as yt, t as bt } from "./safeObj-ic96Cf8D.js";
26
26
  import "./index-client-W3QT304M.js";
27
27
  import { n as xt, r as St } from "./loadVideoTexture-CWoiMWRg.js";
@@ -654,7 +654,7 @@ var En = class extends Q.MeshBasicNodeMaterial {
654
654
  let e = y(n).multiplyScalar(Et.Z_FIGHTING_OFFSET);
655
655
  o = n.map((t) => t.clone().add(e));
656
656
  }
657
- t(e).then(({ texture: e, transparent: t }) => {
657
+ t(e, r?.renderer).then(({ texture: e, transparent: t }) => {
658
658
  if (this.disposed) {
659
659
  e.dispose();
660
660
  return;
@@ -4494,7 +4494,10 @@ var Gi = class extends Rn {
4494
4494
  setData(...e) {
4495
4495
  super.setData(...e);
4496
4496
  let t = this.data.mediaPosition.map(h);
4497
- this.computeRenderType() === "Mesh" ? this.mediaPlane && this.mediaPlane.src !== this.data.mediaData[0].url && (this.mediaPlane.removeFromParent(), this.mediaPlane = new kn(this.data.mediaData[0].url, t, { objectFit: this.data.objectFit })) : this.tag3DContentSvelte?.svelteApp.update({ tag: this });
4497
+ this.computeRenderType() === "Mesh" ? this.mediaPlane && this.mediaPlane.src !== this.data.mediaData[0].url && (this.mediaPlane.removeFromParent(), this.mediaPlane = new kn(this.data.mediaData[0].url, t, {
4498
+ objectFit: this.data.objectFit,
4499
+ renderer: this.five.renderer
4500
+ })) : this.tag3DContentSvelte?.svelteApp.update({ tag: this });
4498
4501
  }
4499
4502
  loadModel = async () => {
4500
4503
  let e = this.data.modelUrl;
@@ -4521,7 +4524,10 @@ var Gi = class extends Rn {
4521
4524
  if (i && (this.plugin.gltfObjectGroup.remove(i), i.removeEventListener()), k(this)) {
4522
4525
  let e = this.data.mediaPosition.map(h);
4523
4526
  if (this.computeRenderType() === "Mesh" && !this.mediaPlane) {
4524
- this.mediaPlane = new kn(this.data.mediaData[0].url, e, { objectFit: this.data.objectFit });
4527
+ this.mediaPlane = new kn(this.data.mediaData[0].url, e, {
4528
+ objectFit: this.data.objectFit,
4529
+ renderer: this.five.renderer
4530
+ });
4525
4531
  let t = new Q.Vector3().addVectors(e[0], e[2]).divideScalar(2);
4526
4532
  this.mediaPlane.position.copy(t), r.add(this.mediaPlane);
4527
4533
  }
@@ -4828,7 +4834,8 @@ var Yi = class extends Rn {
4828
4834
  let r = this.position.map(h), i = this.currentVisible, a = !(!this.mediaPlane || i), o = !(this.mediaPlane || !i), s = !!(this.mediaPlane && this.mediaPlane.src !== n), c = !!(this.mediaPlane && this.mediaPlane.objectFit && this.mediaPlane.objectFit !== t);
4829
4835
  if ((a || s) && (this.mediaPlane &&= (this.plugin.imagePlaneGroup.remove(this.mediaPlane), this.mediaPlane.dispose(), this.mediaPlane.removeFromParent(), void 0)), (o || s) && (this.rectanglePlane && (r = this.rectanglePlane.data.points.map(h)), this.mediaPlane = new kn(n, r, {
4830
4836
  objectFit: this.data.objectFit,
4831
- opacity: this.opacity
4837
+ opacity: this.opacity,
4838
+ renderer: this.five.renderer
4832
4839
  }), this.getConfig().clickable !== !1 && this.plugin.domEvents.addAutoBindEventListener(this.mediaPlane, "click", (e) => {
4833
4840
  this.plugin.hooks.emit("click", {
4834
4841
  tag: this,
@@ -7419,4 +7426,4 @@ var co = "Dnalogel-PanoTagPlugin", lo = class extends Nn {
7419
7426
  //#endregion
7420
7427
  export { lo as t };
7421
7428
 
7422
- //# sourceMappingURL=controller-DmDC_KY6.js.map
7429
+ //# sourceMappingURL=controller-2nCZFAqT.js.map