@realsee/dnalogel 4.0.0-webgpu.3 → 4.0.0-webgpu.4

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 (147) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/floorplan.js +1 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +270 -35
  5. package/dist/index.js.map +1 -0
  6. package/dist/internal/{BasePlugin-CT5K8m36.js → BasePlugin-DC5m72La.js} +3 -3
  7. package/dist/internal/{BasePlugin-CT5K8m36.js.map → BasePlugin-DC5m72La.js.map} +1 -1
  8. package/dist/internal/BasePluginWithData-D_0W46_q.js +7 -0
  9. package/dist/internal/{BasePluginWithData-9z4tpAT4.js.map → BasePluginWithData-D_0W46_q.js.map} +1 -1
  10. package/dist/internal/{BetterTween-BX0aTvP1.js → BetterTween-DmptqE8m.js} +2 -2
  11. package/dist/internal/{BetterTween-BX0aTvP1.js.map → BetterTween-DmptqE8m.js.map} +1 -1
  12. package/dist/internal/{CSS3DRenderPlugin-ccSpcvwd.js → CSS3DRenderPlugin-CEatgl0m.js} +3 -3
  13. package/dist/internal/CSS3DRenderPlugin-CEatgl0m.js.map +1 -0
  14. package/dist/internal/{Controller-Csut_kcH.js → Controller-D6o4OGWJ.js} +8 -8
  15. package/dist/internal/{Controller-Csut_kcH.js.map → Controller-D6o4OGWJ.js.map} +1 -1
  16. package/dist/internal/{FiveDomEvents-3H9NvDOz.js → FiveDomEvents-BUBLFzti.js} +2 -2
  17. package/dist/internal/{FiveDomEvents-3H9NvDOz.js.map → FiveDomEvents-BUBLFzti.js.map} +1 -1
  18. package/dist/internal/FivePuppet-C6QmVY70.js +67 -0
  19. package/dist/internal/FivePuppet-C6QmVY70.js.map +1 -0
  20. package/dist/internal/{PointHelper-D565h9b_.js → PointHelper-DIhgdjY2.js} +48 -48
  21. package/dist/internal/{PointHelper-D565h9b_.js.map → PointHelper-DIhgdjY2.js.map} +1 -1
  22. package/dist/internal/{Polygon-CBGvYUfJ.js → Polygon-D3xIL1Pl.js} +30 -30
  23. package/dist/internal/{Polygon-CBGvYUfJ.js.map → Polygon-D3xIL1Pl.js.map} +1 -1
  24. package/dist/internal/{Prism-Dm5ESkgg.js → Prism-CJlyAEAU.js} +13 -13
  25. package/dist/internal/{Prism-Dm5ESkgg.js.map → Prism-CJlyAEAU.js.map} +1 -1
  26. package/dist/internal/{Rectangle-D-zkDycu.js → Rectangle-BpL9lNKU.js} +118 -129
  27. package/dist/internal/Rectangle-BpL9lNKU.js.map +1 -0
  28. package/dist/internal/{Work-DF8j5GnL.js → Work-BE4AgdwH.js} +9 -9
  29. package/dist/internal/{Work-DF8j5GnL.js.map → Work-BE4AgdwH.js.map} +1 -1
  30. package/dist/internal/{animationFrame-XGKHIeQK.js → animationFrame-CacKXN8l.js} +14 -3
  31. package/dist/internal/animationFrame-CacKXN8l.js.map +1 -0
  32. package/dist/internal/{area-maker-Bd9l2pIp.js → area-maker-Bnhx4SkH.js} +4 -4
  33. package/dist/internal/{area-maker-Bd9l2pIp.js.map → area-maker-Bnhx4SkH.js.map} +1 -1
  34. package/dist/internal/{boundingBox-DvCor5Hd.js → boundingBox-CIqXgNXW.js} +2 -2
  35. package/dist/internal/{boundingBox-DvCor5Hd.js.map → boundingBox-CIqXgNXW.js.map} +1 -1
  36. package/dist/internal/{camera-movement-CwI7UqUk.js → camera-movement-C1pwfMk_.js} +2 -2
  37. package/dist/internal/camera-movement-C1pwfMk_.js.map +1 -0
  38. package/dist/internal/{changeMode-BVGYCoqu.js → changeMode-D_I2AOjH.js} +2 -2
  39. package/dist/internal/{changeMode-BVGYCoqu.js.map → changeMode-D_I2AOjH.js.map} +1 -1
  40. package/dist/internal/{controller-BWkZT0l1.js → controller-DIDtFrBE.js} +1991 -2050
  41. package/dist/internal/controller-DIDtFrBE.js.map +1 -0
  42. package/dist/internal/{cruise-C3F0eNQ-.js → cruise-B50Tcq66.js} +2 -2
  43. package/dist/internal/{cruise-C3F0eNQ-.js.map → cruise-B50Tcq66.js.map} +1 -1
  44. package/dist/internal/{current-pano-image-DKUWluR-.js → current-pano-image-BCFr6njt.js} +4 -4
  45. package/dist/internal/{current-pano-image-DKUWluR-.js.map → current-pano-image-BCFr6njt.js.map} +1 -1
  46. package/dist/internal/{defaultUrls-CjKkS9k9.js → defaultUrls-CfMtGzqM.js} +14 -3
  47. package/dist/internal/defaultUrls-CfMtGzqM.js.map +1 -0
  48. package/dist/internal/{fire-scene-CczaBz2_.js → fire-scene-BzZGvyh_.js} +9 -4
  49. package/dist/internal/fire-scene-BzZGvyh_.js.map +1 -0
  50. package/dist/internal/{fiveModelLoad-mg-TnpnM.js → fiveModelLoad-BUIBYxzp.js} +2 -2
  51. package/dist/internal/{fiveModelLoad-mg-TnpnM.js.map → fiveModelLoad-BUIBYxzp.js.map} +1 -1
  52. package/dist/internal/{floorplan-KWlIsTvO.js → floorplan-C8BGw87S.js} +5 -5
  53. package/dist/internal/{floorplan-KWlIsTvO.js.map → floorplan-C8BGw87S.js.map} +1 -1
  54. package/dist/internal/{generatePolygonGeometry-B_5JFq8y.js → generatePolygonGeometry-BOnzdCaG.js} +181 -178
  55. package/dist/internal/generatePolygonGeometry-BOnzdCaG.js.map +1 -0
  56. package/dist/internal/{lookObject-wesf8xt6.js → lookObject-DuRab5wf.js} +2 -2
  57. package/dist/internal/{lookObject-wesf8xt6.js.map → lookObject-DuRab5wf.js.map} +1 -1
  58. package/dist/internal/{measure-BX6boAC7.js → measure-B4jFwdQ6.js} +5 -5
  59. package/dist/internal/{measure-BX6boAC7.js.map → measure-B4jFwdQ6.js.map} +1 -1
  60. package/dist/internal/{model-chassis-compass-InVNmOAQ.js → model-chassis-compass-C6NTVMLo.js} +2 -2
  61. package/dist/internal/{model-chassis-compass-InVNmOAQ.js.map → model-chassis-compass-C6NTVMLo.js.map} +1 -1
  62. package/dist/internal/{model-entry-door-guide-wZbyY77a.js → model-entry-door-guide-DnGTLY2s.js} +2 -2
  63. package/dist/internal/{model-entry-door-guide-wZbyY77a.js.map → model-entry-door-guide-DnGTLY2s.js.map} +1 -1
  64. package/dist/internal/{model-maker-uO8xlTuO.js → model-maker-B1mnDdKY.js} +15 -15
  65. package/dist/internal/{model-maker-uO8xlTuO.js.map → model-maker-B1mnDdKY.js.map} +1 -1
  66. package/dist/internal/{model-tv-video-DzXb2JRf.js → model-tv-video-BP-7HoDC.js} +2 -2
  67. package/dist/internal/{model-tv-video-DzXb2JRf.js.map → model-tv-video-BP-7HoDC.js.map} +1 -1
  68. package/dist/internal/{model-view-CBeeMM98.js → model-view-BWUU0-uq.js} +2 -2
  69. package/dist/internal/{model-view-CBeeMM98.js.map → model-view-BWUU0-uq.js.map} +1 -1
  70. package/dist/internal/object3d-helper-CbRRhnLV.js +7 -0
  71. package/dist/internal/{object3d-helper-DDYsVPN6.js.map → object3d-helper-CbRRhnLV.js.map} +1 -1
  72. package/dist/internal/{pano-compass-jSr629BP.js → pano-compass-BRTM0dCc.js} +7 -7
  73. package/dist/internal/{pano-compass-jSr629BP.js.map → pano-compass-BRTM0dCc.js.map} +1 -1
  74. package/dist/internal/{pano-door-label-DKoYIKLa.js → pano-door-label-BLjYGZrr.js} +3 -3
  75. package/dist/internal/{pano-door-label-DKoYIKLa.js.map → pano-door-label-BLjYGZrr.js.map} +1 -1
  76. package/dist/internal/{pano-measure-DW9mdx1O.js → pano-measure-BIgCWkVJ.js} +14 -14
  77. package/dist/internal/{pano-measure-DW9mdx1O.js.map → pano-measure-BIgCWkVJ.js.map} +1 -1
  78. package/dist/internal/{pano-ruler-pro-D7q0Ob21.js → pano-ruler-pro-D9yTbHJz.js} +2 -2
  79. package/dist/internal/{pano-ruler-pro-D7q0Ob21.js.map → pano-ruler-pro-D9yTbHJz.js.map} +1 -1
  80. package/dist/internal/{pano-spatial-tag-D0qn-__S.js → pano-spatial-tag-B7Gxn3BS.js} +3 -3
  81. package/dist/internal/{pano-spatial-tag-D0qn-__S.js.map → pano-spatial-tag-B7Gxn3BS.js.map} +1 -1
  82. package/dist/internal/{pano-tag-BW5MXXws.js → pano-tag-Bchz-jED.js} +2 -2
  83. package/dist/internal/{pano-tag-BW5MXXws.js.map → pano-tag-Bchz-jED.js.map} +1 -1
  84. package/dist/internal/{pano-video-Bmud_CAn.js → pano-video-BufYQMqo.js} +3 -3
  85. package/dist/internal/{pano-video-Bmud_CAn.js.map → pano-video-BufYQMqo.js.map} +1 -1
  86. package/dist/internal/{pipeline-DDqgb1gw.js → pipeline-t_3IMXKB.js} +4 -4
  87. package/dist/internal/{pipeline-DDqgb1gw.js.map → pipeline-t_3IMXKB.js.map} +1 -1
  88. package/dist/internal/{sculpt-BNkLJR6p.js → sculpt-BCK4PMwL.js} +64 -63
  89. package/dist/internal/{sculpt-BNkLJR6p.js.map → sculpt-BCK4PMwL.js.map} +1 -1
  90. package/dist/internal/tagPosition-DA9YguT8.js +176 -0
  91. package/dist/internal/tagPosition-DA9YguT8.js.map +1 -0
  92. package/dist/internal/withResolvers-DVr4bnnk.js +15 -0
  93. package/dist/internal/withResolvers-DVr4bnnk.js.map +1 -0
  94. package/dist/plugins/area-maker.js +1 -1
  95. package/dist/plugins/camera-movement.js +1 -1
  96. package/dist/plugins/cruise.js +2 -2
  97. package/dist/plugins/css3d-render.js +1 -1
  98. package/dist/plugins/current-pano-image.js +1 -1
  99. package/dist/plugins/digital-performance.d.ts +1 -1
  100. package/dist/plugins/digital-performance.js +1 -1
  101. package/dist/plugins/fire-scene.d.ts +1 -1
  102. package/dist/plugins/fire-scene.js +1 -1
  103. package/dist/plugins/guide-line.js +1 -1
  104. package/dist/plugins/measure.js +1 -1
  105. package/dist/plugins/model-chassis-compass.js +1 -1
  106. package/dist/plugins/model-entry-door-guide.js +1 -1
  107. package/dist/plugins/model-maker.d.ts +1 -1
  108. package/dist/plugins/model-maker.js +1 -1
  109. package/dist/plugins/model-tv-video.js +1 -1
  110. package/dist/plugins/model-view.js +1 -1
  111. package/dist/plugins/object3d-helper.d.ts +1 -1
  112. package/dist/plugins/object3d-helper.js +3 -1
  113. package/dist/plugins/pano-compass.js +1 -1
  114. package/dist/plugins/pano-door-label.js +1 -1
  115. package/dist/plugins/pano-measure.js +1 -1
  116. package/dist/plugins/pano-ruler-pro.js +1 -1
  117. package/dist/plugins/pano-spatial-tag.js +1 -1
  118. package/dist/plugins/pano-tag.d.ts +1 -1
  119. package/dist/plugins/pano-tag.js +4 -1
  120. package/dist/plugins/pano-video.js +1 -1
  121. package/dist/plugins/pipeline.js +1 -1
  122. package/dist/plugins/sculpt.d.ts +1 -1
  123. package/dist/plugins/sculpt.js +7 -1
  124. package/dist/types/public/index.d.ts +2 -0
  125. package/dist/types/public/plugins/digital-performance.d.ts +1 -0
  126. package/dist/types/public/plugins/fire-scene.d.ts +1 -0
  127. package/dist/types/public/plugins/model-maker.d.ts +1 -0
  128. package/dist/types/public/plugins/object3d-helper.d.ts +1 -0
  129. package/dist/types/public/plugins/pano-tag.d.ts +2 -0
  130. package/dist/types/public/plugins/sculpt.d.ts +8 -0
  131. package/dist/types/public/utils.d.ts +5 -0
  132. package/dist/utils.d.ts +1 -1
  133. package/dist/utils.js +16 -50
  134. package/package.json +1 -1
  135. package/dist/internal/BasePluginWithData-9z4tpAT4.js +0 -7
  136. package/dist/internal/CSS3DRenderPlugin-ccSpcvwd.js.map +0 -1
  137. package/dist/internal/Rectangle-D-zkDycu.js.map +0 -1
  138. package/dist/internal/animationFrame-XGKHIeQK.js.map +0 -1
  139. package/dist/internal/blink-DD_0mH-m.js +0 -113
  140. package/dist/internal/blink-DD_0mH-m.js.map +0 -1
  141. package/dist/internal/camera-movement-CwI7UqUk.js.map +0 -1
  142. package/dist/internal/controller-BWkZT0l1.js.map +0 -1
  143. package/dist/internal/defaultUrls-CjKkS9k9.js.map +0 -1
  144. package/dist/internal/fire-scene-CczaBz2_.js.map +0 -1
  145. package/dist/internal/generatePolygonGeometry-B_5JFq8y.js.map +0 -1
  146. package/dist/internal/object3d-helper-DDYsVPN6.js +0 -7
  147. package/dist/utils.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { h as e } from "./generatePolygonGeometry-B_5JFq8y.js";
1
+ import { g as e } from "./generatePolygonGeometry-BOnzdCaG.js";
2
2
  import { t } from "./getFiveModel-CZVrrU1D.js";
3
3
  import { r as n } from "./util-vGeVT4oo.js";
4
4
  import { r } from "./resizeObserver-AY-35us4.js";
@@ -264,4 +264,4 @@ var a = class {
264
264
  //#endregion
265
265
  export { a as t };
266
266
 
267
- //# sourceMappingURL=FiveDomEvents-3H9NvDOz.js.map
267
+ //# sourceMappingURL=FiveDomEvents-BUBLFzti.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FiveDomEvents-3H9NvDOz.js","names":["calculateThreeMouse","getObjectVisible","THREE","FiveDomEvents","five","\"dragend\"","\"drag\"","\"dragstart\"","getFiveModel","config","addListener","object","event","callback","removeListener","args","index","key","item","boundObjectIndex","element","position","pointer","ray","THREERaycaster","pointers","raycaster","type","r1","r2","\"dblclick\"","objects","eventName","fiveModels","loadedModels","model","intersects","fallbackIntersect","fiveModelIntersects","_intersects","\"hover\"","domEvent","objectParent","params","isStopPropagation","preventFiveEvents","notifyNext","newIntersects","_object","topParent","emitied","handlers","handler","intersectPosition","res","originEvent","current","distance","camera","width","height","rect","pointerX","pointerY","best","threshold","worldPosition","projected","screenX","screenY","pixelDistance"],"sources":["../../src/shared-utils/five/FiveDomEvents.ts"],"sourcesContent":["\n\n/**\n * @version 2.29.0\n * 为什么重构?\n * 1. 点击事件没有考虑Five模型\n * 2. 为了在 mouseDown 的时候阻止 five tap 事件,需要提前做碰撞检测,但其实是没必要的,因为触发了 mouseDown 也不一定触发 点击事件 或者 Tap 事件,因为可能物体不可见或者有什么其他的判断\n * 3. 基于第二点,废弃了之前使用浏览器原生事件监听点击的方式,改为使用 wantsTapGesture 的方式\n * 4. 重构之后只会在 wantsTapGesture 事件触发的时候做射线检测\n */\nimport type { Five, GestureTypes, Model as FiveModel } from '@realsee/five-webgpu'\nimport * as THREE from 'three/webgpu'\nimport { getObjectVisible } from '../three/getObjectVisible'\nimport { calculateThreeMouse } from './calculateThreeMouse'\nimport { getFiveModel } from './getFiveModel'\nimport { THREERaycaster } from '../three/core/Raycaster'\n\nexport interface FiveDomEventMap {\n /**\n * @description 点击事件\n * @return {PreventFiveEvent} 返回 false 可以不阻止 five 的 tap 事件; default: true\n */\n click: (event: FiveDomEvent) => PreventFiveEvent | void\n\n /**\n * @description 双击事件\n */\n dblclick: (event: FiveDomEvent) => void\n\n /**\n * @description 鼠标按下事件\n */\n mousedown: (event: FiveDomEvent) => void\n\n /**\n * @description 鼠标抬起事件\n */\n mouseup: (event: FiveDomEvent) => void\n\n /**\n * @description 鼠标移入事件\n */\n hover: (event: FiveDomEvent) => void\n\n /**\n * @description 鼠标移出事件\n */\n unHover: (event: FiveDomEvent) => void\n\n /**\n * @description: 拖动开始\n */\n dragstart: (event: FiveDomEvent) => void\n\n /**\n * @description: 拖动中\n */\n drag: (event: FiveDomEvent) => void\n\n /**\n * @description: 拖动结束\n */\n dragend: (event: FiveDomEvent) => void\n}\n\ntype EventName = keyof FiveDomEventMap\n\ntype PreventFiveEvent = boolean\n\nexport interface EventHandlerConfig {\n /**\n * @description 不可见时不触发事件\n * @default false\n */\n noEmitWhenHide?: boolean\n\n /**\n * @description 不在场景中时不触发事件\n * @default false\n */\n noEmitWhenNotInScene?: boolean\n\n /**\n * @description 在全景点周围时,不触发事件\n * @default false\n */\n skipPano?: boolean\n\n /**\n * @description 指定参与碰撞检测的five model,传null表示不参与碰撞检测\n * @default 当前 five.state.workCode 对应的模型\n */\n fiveModels?: FiveModel[] | null\n}\n\nexport interface FiveDomEvent {\n type: EventName\n target: THREE.Object3D\n origDomEvent?: Event\n raycaster: THREE.Raycaster\n intersects?: THREE.Intersection[]\n stopPropagation: () => void\n}\n\ntype Object3DWithEvent = THREE.Object3D & {\n _domEvent?: {\n [key in `${EventName | 'wantDblclick'}Handler`]?: Array<[FiveDomEventMap[EventName], Omit<EventHandlerConfig, 'fiveModels'>]>\n }\n _hovered?: boolean\n _dragging?: boolean\n draggable?: boolean\n}\n\nexport class FiveDomEvents {\n private _five: Five\n\n public get five() {\n return this._five\n }\n\n public set five(five: Five) {\n this._five?.off('wantsGesture', this.handleWantsGesture)\n this._five = five\n this._five.on('wantsGesture', this.handleWantsGesture)\n }\n\n /**\n * @description: 拖动中\n */\n private dragging = false\n\n private get haveDragEventObject() {\n return [...new Set([this.boundObject['dragend'], this.boundObject['drag'], this.boundObject['dragstart']].flat())].filter(Boolean)\n }\n\n private boundObject: Partial<Record<EventName, Array<Object3DWithEvent>>> = {}\n\n private config: EventHandlerConfig\n\n private dragSelectTempWorld = new THREE.Vector3()\n private dragSelectTempProjected = new THREE.Vector3()\n\n private get model() {\n return getFiveModel(this.five)\n }\n\n public constructor(five: Five, config?: EventHandlerConfig) {\n this.five = five\n this.config = config\n\n five.off('wantsGesture', this.handleWantsGesture)\n five.on('wantsGesture', this.handleWantsGesture)\n document.addEventListener('pointerdown', this.handleMousedown)\n document.addEventListener('dblclick', this.handleMouseEvent)\n document.addEventListener('pointerup', this.handleMouseup)\n document.addEventListener('pointercancel', this.handleMouseup)\n document.addEventListener('pointermove', this.handleMousemove)\n\n }\n\n /**\n * @description: added 时自动绑定事件,removed时自动解绑事件,也就是说只有物体在场景中的时候才会触发事件\n * @note: 注意:目前需要触发物体的 added 事件和 removed 事件才会生效\n * @todo: added 和 removed 还是不太智能\n */\n public addAutoBindEventListener<T extends EventName = EventName>(\n object: Object3DWithEvent,\n event: T,\n callback: FiveDomEventMap[T],\n config?: Omit<EventHandlerConfig, 'fiveModels'>,\n ) {\n const addListener = () => this.addEventListener(object, event, callback, config)\n const removeListener = () => this.removeEventListener(object, event, callback, config)\n\n object.addEventListener('added', addListener)\n object.addEventListener('removed', removeListener)\n object.addEventListener('dispose', removeListener)\n\n return () => {\n object.removeEventListener('added', addListener)\n object.removeEventListener('removed', removeListener)\n object.removeEventListener('dispose', removeListener)\n }\n }\n\n /**\n * @description: add event listener\n * @param params.object: object\n * @param params.event: event name\n * @param params.callback: 返回 false 可以不阻止 five 的 tap 事件; default: true\n * @return {void}\n */\n public addEventListener<T extends EventName = EventName>(\n object: Object3DWithEvent,\n event: T,\n callback: FiveDomEventMap[T],\n config?: Omit<EventHandlerConfig, 'fiveModels'>,\n ): void {\n // init\n if (!object._domEvent) {\n object._domEvent = {}\n }\n if (!object._domEvent[`${event}Handler`]) {\n object._domEvent[`${event}Handler`] = []\n }\n if (!this.boundObject[event]) {\n this.boundObject[event] = []\n }\n // add bound object\n if (!this.boundObject[event].includes(object)) {\n this.boundObject[event].push(object)\n }\n\n // add event\n object._domEvent[`${event}Handler`].push([callback, { noEmitWhenHide: false, noEmitWhenNotInScene: false, ...config }])\n }\n\n public removeEventListener(object: Object3DWithEvent, event?: EventName, callback?: (e: FiveDomEvent) => any, ...args: any[]): void {\n if (!object._domEvent) return\n\n if (event === undefined) {\n Object.keys(this.boundObject).forEach((key) => {\n const index = this.boundObject[key]?.findIndex((item) => item === object)\n if (index !== -1) {\n this.boundObject[key]?.splice(index, 1)\n }\n })\n\n object._domEvent = {}\n }\n\n if (!object._domEvent[`${event}Handler`]) return\n\n if (callback === undefined) {\n delete object._domEvent[`${event}Handler`]\n return\n }\n\n const index = object._domEvent[`${event}Handler`].findIndex((item) => item[0] === callback)\n if (index === -1) return\n\n object._domEvent[`${event}Handler`].splice(index, 1)\n\n // delete event listener\n if (object._domEvent[`${event}Handler`].length === 0) {\n delete object._domEvent[`${event}Handler`]\n }\n\n // delete dom event\n if (object._domEvent && Object.keys(object._domEvent).length === 0) {\n delete object._domEvent\n }\n\n // delete bound object\n if (!object._domEvent) {\n const boundObjectIndex = this.boundObject[event]?.findIndex((item) => item === object)\n if (boundObjectIndex !== -1) {\n this.boundObject[event]?.splice(boundObjectIndex, 1)\n }\n }\n }\n\n public clear() {\n this.boundObject = {}\n }\n\n public dispose(): void {\n this.five?.off('wantsGesture', this.handleWantsGesture)\n document.removeEventListener('dblclick', this.handleMouseEvent)\n document.removeEventListener('pointerdown', this.handleMousedown)\n document.removeEventListener('pointerup', this.handleMouseup)\n document.removeEventListener('pointercancel', this.handleMouseup)\n document.removeEventListener('pointermove', this.handleMousemove)\n this.boundObject = {}\n }\n\n public toJSON() {\n return {\n boundObject: this.boundObject,\n }\n }\n\n private getRaycaster(pointer: { x: number; y: number }) {\n const element = this.five.getElement()\n if (!element) return\n const position = calculateThreeMouse(pointer, element)\n const ray = new THREERaycaster()\n ray.setFromCamera(position, this.five.camera)\n return ray\n }\n\n private handleWantsGesture: (type: GestureTypes, pointers: { raycaster?: THREE.Raycaster; x: number; y: number }[]) => false | void = (\n type,\n pointers,\n ) => {\n if (pointers.length !== 1) return\n\n const pointer = pointers[0]\n\n if (pointer.raycaster) {\n // five 的 raycaster 缺少一些比较新版本的three的方法,所以需要重新创建一个 THREERaycaster,如果five three版本升级了,可以考虑直接使用 five 的 raycaster\n const raycaster = new THREERaycaster()\n raycaster.ray = pointer.raycaster.ray\n raycaster.near = pointer.raycaster.near\n raycaster.far = pointer.raycaster.far\n raycaster.camera = pointer.raycaster.camera\n raycaster.layers = pointer.raycaster.layers\n raycaster.params = pointer.raycaster.params\n pointer.raycaster = raycaster\n }\n\n if (!pointer) return\n\n if (type === 'mouseMove') {\n this.onDomEvent('hover', pointer)\n }\n\n if (type === 'tap') {\n const event = new MouseEvent('click', { clientX: pointer.x, clientY: pointer.y })\n\n const r1 = this.onDomEvent('click', pointer, event)\n const r2 = this.onDomEvent('wantDblclick', pointer, event, this.boundObject['dblclick'])\n if (r1 === false) return false\n if (r2 === false) return false\n }\n\n if (this.dragging) {\n return false\n }\n }\n\n private handleDomEvent = (type: EventName, event: MouseEvent, objects?: Object3DWithEvent[]) => {\n const pointer = { x: event.clientX, y: event.clientY }\n this.onDomEvent(type, pointer, event, objects)\n }\n\n private handleMouseEvent = (event: MouseEvent) => {\n this.handleDomEvent(event.type as EventName, event)\n }\n\n private handleMousedown = (event: MouseEvent) => {\n this.handleDomEvent('mousedown', event)\n this.handleDomEvent('dragstart', event, this.haveDragEventObject)\n }\n\n private handleMouseup = (event: MouseEvent) => {\n this.dragging = false\n\n this.haveDragEventObject?.forEach((object) => {\n if (object._dragging) {\n object._dragging = false\n this.notify({\n eventName: 'dragend',\n object,\n originEvent: event,\n raycaster: this.getRaycaster({ x: event.clientX, y: event.clientY }),\n })\n }\n })\n this.handleDomEvent('mouseup', event)\n }\n\n private handleMousemove = (event: MouseEvent) => {\n if (this.dragging) {\n this.boundObject['drag']?.forEach((object) => {\n if (object._dragging) {\n this.notify({\n eventName: 'drag',\n object,\n originEvent: event,\n raycaster: this.getRaycaster({ x: event.clientX, y: event.clientY }),\n })\n }\n })\n }\n }\n\n\n private onDomEvent = (\n eventName: EventName | 'wantDblclick',\n pointer: { raycaster?: THREE.Raycaster; x: number; y: number },\n event?: Event,\n objects = this.boundObject[eventName],\n ): false | void => {\n if (!pointer) return\n if (!objects || objects?.length === 0) return\n\n const fiveModels: FiveModel[] = []\n if (this.config?.fiveModels !== null) {\n if (this.config?.fiveModels) {\n fiveModels.push(...this.config.fiveModels)\n } else {\n fiveModels.push(this.model)\n }\n }\n const loadedModels = fiveModels.filter((model) => model.loaded)\n\n const raycaster = pointer.raycaster ?? this.getRaycaster(pointer)\n raycaster.params.Points.threshold = 0.04\n\n let intersects = raycaster.intersectObjects(objects, true)\n\n if ((eventName === 'dragstart' || eventName === 'mousedown') && (!intersects || intersects.length === 0)) {\n const fallbackIntersect = this.findDragSelectIntersect(objects, pointer, raycaster)\n if (fallbackIntersect) {\n intersects = [fallbackIntersect]\n }\n }\n\n const fiveModelIntersects: THREE.Intersection[] = []\n loadedModels.forEach((model) => {\n const _intersects = model.intersectRaycaster(raycaster)\n fiveModelIntersects.push(..._intersects)\n })\n const allowError = 0.01\n if (fiveModelIntersects.length > 0 && intersects.length > 0) {\n if (fiveModelIntersects[0].distance + allowError < intersects[0].distance) return\n }\n\n const object = intersects?.[0]?.object as Object3DWithEvent\n\n if (eventName === 'wantDblclick') return false\n\n if (!object || !this.objectIsBound(object)) {\n // hover\n if (eventName === 'hover') {\n for (const object of this.boundObject['hover'] ?? []) {\n if (object._hovered) this.notify({ eventName: 'unHover', object })\n }\n }\n }\n\n if (!object) return\n\n if (object) {\n // 通用\n const preventFiveEvent = this.notify({ eventName, object, originEvent: event, raycaster, intersects, fiveModelIntersects })\n if (preventFiveEvent) return false\n }\n }\n\n private objectIsBound = (object: Object3DWithEvent): boolean => {\n let domEvent = object._domEvent\n let objectParent: Object3DWithEvent = object.parent\n while (typeof domEvent === 'undefined' && objectParent) {\n domEvent = objectParent._domEvent\n objectParent = objectParent.parent\n }\n return Boolean(domEvent)\n }\n\n private notify = (params: {\n eventName: EventName | 'wantDblclick'\n object: Object3DWithEvent\n originEvent?: Event\n raycaster?: THREE.Raycaster\n intersects?: THREE.Intersection[]\n fiveModelIntersects?: THREE.Intersection[]\n }) => {\n const { eventName, object, originEvent, raycaster, intersects, fiveModelIntersects } = params\n\n if (!object) return false\n\n let isStopPropagation = false\n let preventFiveEvents = []\n\n const objects: Object3DWithEvent[] = []\n\n // 如果这轮事件,因为一些配置原因(noEmitWhenNotInScene / noEmitWhenHide),不触发,那么就触发下一个\n const notifyNext = () => {\n if (!intersects) return false\n const newIntersects = intersects.slice(1)\n if (!newIntersects[0]) return false\n return this.notify({ ...params, object: newIntersects[0].object, intersects: newIntersects })\n }\n\n let _object = object\n objects.push(_object)\n while (_object.parent) {\n _object = _object.parent as Object3DWithEvent\n objects.push(_object as Object3DWithEvent)\n }\n\n const topParent = objects[objects.length - 1]\n\n if (this.config?.noEmitWhenNotInScene && topParent.type !== 'Scene') {\n return notifyNext()\n }\n\n let emitied = false\n\n for (const object of objects) {\n if (isStopPropagation) break\n\n if (object.draggable) {\n if (eventName === 'dragstart') {\n object._dragging = true\n this.dragging = true\n }\n if (eventName === 'dragend') {\n object._dragging = false\n this.dragging = false\n }\n }\n\n const domEvent = object._domEvent\n if (!domEvent) continue\n\n const handlers = domEvent[`${eventName}Handler`]\n if (!handlers) continue\n\n for (const [handler, config] of handlers) {\n if (config?.noEmitWhenNotInScene && topParent.type !== 'Scene') continue\n\n if (config.skipPano && fiveModelIntersects) {\n const intersectPosition = fiveModelIntersects[0]?.point\n if (\n intersectPosition &&\n this.five.observers?.[this.five.panoIndex]?.accessibleNodes?.some((panoIndex) => {\n const standingPosition = this.five.works.getResolvedObserver({\n workCode: this.five.state.workCode,\n panoIndex,\n })?.standingPosition\n return standingPosition?.distanceTo(intersectPosition) < 0.3\n })\n ) {\n continue\n }\n }\n\n if (this.config?.noEmitWhenHide || config?.noEmitWhenHide) {\n const visible = getObjectVisible(object)\n if (!visible) continue\n }\n\n emitied = true\n\n if (eventName === 'hover') {\n if (object._hovered) continue\n object._hovered = true\n for (const _object of this.boundObject['hover'] ?? []) {\n\n if (_object !== object && _object._hovered) this.notify({ eventName: 'unHover', object: _object })\n }\n }\n\n if (eventName === 'unHover') {\n if (!object._hovered) continue\n object._hovered = false\n }\n\n const res = handler({\n type: eventName as any,\n target: object,\n origDomEvent: originEvent,\n raycaster,\n intersects,\n stopPropagation: () => {\n isStopPropagation = true\n },\n })\n\n preventFiveEvents.push(res ?? true)\n }\n }\n if (emitied === false) {\n return notifyNext()\n }\n if (eventName === 'click' || eventName === 'wantDblclick') return preventFiveEvents.some((item) => item === true)\n }\n\n private getDragSelectPixelDistance(object: Object3DWithEvent): number | undefined {\n let current: Object3DWithEvent | null = object\n while (current) {\n const distance = current.userData?.dragSelectPixelDistance\n if (typeof distance === 'number') return distance\n current = (current.parent as Object3DWithEvent) ?? null\n }\n return undefined\n }\n\n private findDragSelectIntersect(\n objects: Object3DWithEvent[] | undefined,\n pointer: { x: number; y: number },\n raycaster: THREE.Raycaster,\n ): THREE.Intersection | undefined {\n if (!objects || objects.length === 0) return\n const element = this.five?.getElement?.()\n const camera = raycaster.camera\n if (!element || !camera) return\n\n const width = element.clientWidth\n const height = element.clientHeight\n const rect = element.getBoundingClientRect()\n const pointerX = pointer.x - rect.left\n const pointerY = pointer.y - rect.top\n\n let best:\n | {\n pixelDistance: number\n object: Object3DWithEvent\n worldPoint: THREE.Vector3\n distance: number\n }\n | undefined\n\n for (const object of objects) {\n const threshold = this.getDragSelectPixelDistance(object)\n if (typeof threshold !== 'number') continue\n\n const worldPosition = this.dragSelectTempWorld\n object.getWorldPosition(worldPosition)\n const projected = this.dragSelectTempProjected.copy(worldPosition).project(camera)\n const screenX = (projected.x * 0.5 + 0.5) * width\n const screenY = (1 - (projected.y * 0.5 + 0.5)) * height\n const pixelDistance = Math.hypot(screenX - pointerX, screenY - pointerY)\n if (pixelDistance > threshold) continue\n\n const distance = raycaster.ray.distanceToPoint(worldPosition)\n if (!best || pixelDistance < best.pixelDistance) {\n best = {\n pixelDistance,\n object,\n worldPoint: worldPosition.clone(),\n distance,\n }\n }\n }\n\n if (!best) return\n\n return {\n distance: best.distance,\n object: best.object,\n point: best.worldPoint,\n } as THREE.Intersection\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FiveDomEvents-BUBLFzti.js","names":["calculateThreeMouse","getObjectVisible","THREE","FiveDomEvents","five","\"dragend\"","\"drag\"","\"dragstart\"","getFiveModel","config","addListener","object","event","callback","removeListener","args","index","key","item","boundObjectIndex","element","position","pointer","ray","THREERaycaster","pointers","raycaster","type","r1","r2","\"dblclick\"","objects","eventName","fiveModels","loadedModels","model","intersects","fallbackIntersect","fiveModelIntersects","_intersects","\"hover\"","domEvent","objectParent","params","isStopPropagation","preventFiveEvents","notifyNext","newIntersects","_object","topParent","emitied","handlers","handler","intersectPosition","res","originEvent","current","distance","camera","width","height","rect","pointerX","pointerY","best","threshold","worldPosition","projected","screenX","screenY","pixelDistance"],"sources":["../../src/shared-utils/five/FiveDomEvents.ts"],"sourcesContent":["\n\n/**\n * @version 2.29.0\n * 为什么重构?\n * 1. 点击事件没有考虑Five模型\n * 2. 为了在 mouseDown 的时候阻止 five tap 事件,需要提前做碰撞检测,但其实是没必要的,因为触发了 mouseDown 也不一定触发 点击事件 或者 Tap 事件,因为可能物体不可见或者有什么其他的判断\n * 3. 基于第二点,废弃了之前使用浏览器原生事件监听点击的方式,改为使用 wantsTapGesture 的方式\n * 4. 重构之后只会在 wantsTapGesture 事件触发的时候做射线检测\n */\nimport type { Five, GestureTypes, Model as FiveModel } from '@realsee/five-webgpu'\nimport * as THREE from 'three/webgpu'\nimport { getObjectVisible } from '../three/getObjectVisible'\nimport { calculateThreeMouse } from './calculateThreeMouse'\nimport { getFiveModel } from './getFiveModel'\nimport { THREERaycaster } from '../three/core/Raycaster'\n\nexport interface FiveDomEventMap {\n /**\n * @description 点击事件\n * @return {PreventFiveEvent} 返回 false 可以不阻止 five 的 tap 事件; default: true\n */\n click: (event: FiveDomEvent) => PreventFiveEvent | void\n\n /**\n * @description 双击事件\n */\n dblclick: (event: FiveDomEvent) => void\n\n /**\n * @description 鼠标按下事件\n */\n mousedown: (event: FiveDomEvent) => void\n\n /**\n * @description 鼠标抬起事件\n */\n mouseup: (event: FiveDomEvent) => void\n\n /**\n * @description 鼠标移入事件\n */\n hover: (event: FiveDomEvent) => void\n\n /**\n * @description 鼠标移出事件\n */\n unHover: (event: FiveDomEvent) => void\n\n /**\n * @description: 拖动开始\n */\n dragstart: (event: FiveDomEvent) => void\n\n /**\n * @description: 拖动中\n */\n drag: (event: FiveDomEvent) => void\n\n /**\n * @description: 拖动结束\n */\n dragend: (event: FiveDomEvent) => void\n}\n\ntype EventName = keyof FiveDomEventMap\n\ntype PreventFiveEvent = boolean\n\nexport interface EventHandlerConfig {\n /**\n * @description 不可见时不触发事件\n * @default false\n */\n noEmitWhenHide?: boolean\n\n /**\n * @description 不在场景中时不触发事件\n * @default false\n */\n noEmitWhenNotInScene?: boolean\n\n /**\n * @description 在全景点周围时,不触发事件\n * @default false\n */\n skipPano?: boolean\n\n /**\n * @description 指定参与碰撞检测的five model,传null表示不参与碰撞检测\n * @default 当前 five.state.workCode 对应的模型\n */\n fiveModels?: FiveModel[] | null\n}\n\nexport interface FiveDomEvent {\n type: EventName\n target: THREE.Object3D\n origDomEvent?: Event\n raycaster: THREE.Raycaster\n intersects?: THREE.Intersection[]\n stopPropagation: () => void\n}\n\ntype Object3DWithEvent = THREE.Object3D & {\n _domEvent?: {\n [key in `${EventName | 'wantDblclick'}Handler`]?: Array<[FiveDomEventMap[EventName], Omit<EventHandlerConfig, 'fiveModels'>]>\n }\n _hovered?: boolean\n _dragging?: boolean\n draggable?: boolean\n}\n\nexport class FiveDomEvents {\n private _five: Five\n\n public get five() {\n return this._five\n }\n\n public set five(five: Five) {\n this._five?.off('wantsGesture', this.handleWantsGesture)\n this._five = five\n this._five.on('wantsGesture', this.handleWantsGesture)\n }\n\n /**\n * @description: 拖动中\n */\n private dragging = false\n\n private get haveDragEventObject() {\n return [...new Set([this.boundObject['dragend'], this.boundObject['drag'], this.boundObject['dragstart']].flat())].filter(Boolean)\n }\n\n private boundObject: Partial<Record<EventName, Array<Object3DWithEvent>>> = {}\n\n private config: EventHandlerConfig\n\n private dragSelectTempWorld = new THREE.Vector3()\n private dragSelectTempProjected = new THREE.Vector3()\n\n private get model() {\n return getFiveModel(this.five)\n }\n\n public constructor(five: Five, config?: EventHandlerConfig) {\n this.five = five\n this.config = config\n\n five.off('wantsGesture', this.handleWantsGesture)\n five.on('wantsGesture', this.handleWantsGesture)\n document.addEventListener('pointerdown', this.handleMousedown)\n document.addEventListener('dblclick', this.handleMouseEvent)\n document.addEventListener('pointerup', this.handleMouseup)\n document.addEventListener('pointercancel', this.handleMouseup)\n document.addEventListener('pointermove', this.handleMousemove)\n\n }\n\n /**\n * @description: added 时自动绑定事件,removed时自动解绑事件,也就是说只有物体在场景中的时候才会触发事件\n * @note: 注意:目前需要触发物体的 added 事件和 removed 事件才会生效\n * @todo: added 和 removed 还是不太智能\n */\n public addAutoBindEventListener<T extends EventName = EventName>(\n object: Object3DWithEvent,\n event: T,\n callback: FiveDomEventMap[T],\n config?: Omit<EventHandlerConfig, 'fiveModels'>,\n ) {\n const addListener = () => this.addEventListener(object, event, callback, config)\n const removeListener = () => this.removeEventListener(object, event, callback, config)\n\n object.addEventListener('added', addListener)\n object.addEventListener('removed', removeListener)\n object.addEventListener('dispose', removeListener)\n\n return () => {\n object.removeEventListener('added', addListener)\n object.removeEventListener('removed', removeListener)\n object.removeEventListener('dispose', removeListener)\n }\n }\n\n /**\n * @description: add event listener\n * @param params.object: object\n * @param params.event: event name\n * @param params.callback: 返回 false 可以不阻止 five 的 tap 事件; default: true\n * @return {void}\n */\n public addEventListener<T extends EventName = EventName>(\n object: Object3DWithEvent,\n event: T,\n callback: FiveDomEventMap[T],\n config?: Omit<EventHandlerConfig, 'fiveModels'>,\n ): void {\n // init\n if (!object._domEvent) {\n object._domEvent = {}\n }\n if (!object._domEvent[`${event}Handler`]) {\n object._domEvent[`${event}Handler`] = []\n }\n if (!this.boundObject[event]) {\n this.boundObject[event] = []\n }\n // add bound object\n if (!this.boundObject[event].includes(object)) {\n this.boundObject[event].push(object)\n }\n\n // add event\n object._domEvent[`${event}Handler`].push([callback, { noEmitWhenHide: false, noEmitWhenNotInScene: false, ...config }])\n }\n\n public removeEventListener(object: Object3DWithEvent, event?: EventName, callback?: (e: FiveDomEvent) => any, ...args: any[]): void {\n if (!object._domEvent) return\n\n if (event === undefined) {\n Object.keys(this.boundObject).forEach((key) => {\n const index = this.boundObject[key]?.findIndex((item) => item === object)\n if (index !== -1) {\n this.boundObject[key]?.splice(index, 1)\n }\n })\n\n object._domEvent = {}\n }\n\n if (!object._domEvent[`${event}Handler`]) return\n\n if (callback === undefined) {\n delete object._domEvent[`${event}Handler`]\n return\n }\n\n const index = object._domEvent[`${event}Handler`].findIndex((item) => item[0] === callback)\n if (index === -1) return\n\n object._domEvent[`${event}Handler`].splice(index, 1)\n\n // delete event listener\n if (object._domEvent[`${event}Handler`].length === 0) {\n delete object._domEvent[`${event}Handler`]\n }\n\n // delete dom event\n if (object._domEvent && Object.keys(object._domEvent).length === 0) {\n delete object._domEvent\n }\n\n // delete bound object\n if (!object._domEvent) {\n const boundObjectIndex = this.boundObject[event]?.findIndex((item) => item === object)\n if (boundObjectIndex !== -1) {\n this.boundObject[event]?.splice(boundObjectIndex, 1)\n }\n }\n }\n\n public clear() {\n this.boundObject = {}\n }\n\n public dispose(): void {\n this.five?.off('wantsGesture', this.handleWantsGesture)\n document.removeEventListener('dblclick', this.handleMouseEvent)\n document.removeEventListener('pointerdown', this.handleMousedown)\n document.removeEventListener('pointerup', this.handleMouseup)\n document.removeEventListener('pointercancel', this.handleMouseup)\n document.removeEventListener('pointermove', this.handleMousemove)\n this.boundObject = {}\n }\n\n public toJSON() {\n return {\n boundObject: this.boundObject,\n }\n }\n\n private getRaycaster(pointer: { x: number; y: number }) {\n const element = this.five.getElement()\n if (!element) return\n const position = calculateThreeMouse(pointer, element)\n const ray = new THREERaycaster()\n ray.setFromCamera(position, this.five.camera)\n return ray\n }\n\n private handleWantsGesture: (type: GestureTypes, pointers: { raycaster?: THREE.Raycaster; x: number; y: number }[]) => false | void = (\n type,\n pointers,\n ) => {\n if (pointers.length !== 1) return\n\n const pointer = pointers[0]\n\n if (pointer.raycaster) {\n // five 的 raycaster 缺少一些比较新版本的three的方法,所以需要重新创建一个 THREERaycaster,如果five three版本升级了,可以考虑直接使用 five 的 raycaster\n const raycaster = new THREERaycaster()\n raycaster.ray = pointer.raycaster.ray\n raycaster.near = pointer.raycaster.near\n raycaster.far = pointer.raycaster.far\n raycaster.camera = pointer.raycaster.camera\n raycaster.layers = pointer.raycaster.layers\n raycaster.params = pointer.raycaster.params\n pointer.raycaster = raycaster\n }\n\n if (!pointer) return\n\n if (type === 'mouseMove') {\n this.onDomEvent('hover', pointer)\n }\n\n if (type === 'tap') {\n const event = new MouseEvent('click', { clientX: pointer.x, clientY: pointer.y })\n\n const r1 = this.onDomEvent('click', pointer, event)\n const r2 = this.onDomEvent('wantDblclick', pointer, event, this.boundObject['dblclick'])\n if (r1 === false) return false\n if (r2 === false) return false\n }\n\n if (this.dragging) {\n return false\n }\n }\n\n private handleDomEvent = (type: EventName, event: MouseEvent, objects?: Object3DWithEvent[]) => {\n const pointer = { x: event.clientX, y: event.clientY }\n this.onDomEvent(type, pointer, event, objects)\n }\n\n private handleMouseEvent = (event: MouseEvent) => {\n this.handleDomEvent(event.type as EventName, event)\n }\n\n private handleMousedown = (event: MouseEvent) => {\n this.handleDomEvent('mousedown', event)\n this.handleDomEvent('dragstart', event, this.haveDragEventObject)\n }\n\n private handleMouseup = (event: MouseEvent) => {\n this.dragging = false\n\n this.haveDragEventObject?.forEach((object) => {\n if (object._dragging) {\n object._dragging = false\n this.notify({\n eventName: 'dragend',\n object,\n originEvent: event,\n raycaster: this.getRaycaster({ x: event.clientX, y: event.clientY }),\n })\n }\n })\n this.handleDomEvent('mouseup', event)\n }\n\n private handleMousemove = (event: MouseEvent) => {\n if (this.dragging) {\n this.boundObject['drag']?.forEach((object) => {\n if (object._dragging) {\n this.notify({\n eventName: 'drag',\n object,\n originEvent: event,\n raycaster: this.getRaycaster({ x: event.clientX, y: event.clientY }),\n })\n }\n })\n }\n }\n\n\n private onDomEvent = (\n eventName: EventName | 'wantDblclick',\n pointer: { raycaster?: THREE.Raycaster; x: number; y: number },\n event?: Event,\n objects = this.boundObject[eventName],\n ): false | void => {\n if (!pointer) return\n if (!objects || objects?.length === 0) return\n\n const fiveModels: FiveModel[] = []\n if (this.config?.fiveModels !== null) {\n if (this.config?.fiveModels) {\n fiveModels.push(...this.config.fiveModels)\n } else {\n fiveModels.push(this.model)\n }\n }\n const loadedModels = fiveModels.filter((model) => model.loaded)\n\n const raycaster = pointer.raycaster ?? this.getRaycaster(pointer)\n raycaster.params.Points.threshold = 0.04\n\n let intersects = raycaster.intersectObjects(objects, true)\n\n if ((eventName === 'dragstart' || eventName === 'mousedown') && (!intersects || intersects.length === 0)) {\n const fallbackIntersect = this.findDragSelectIntersect(objects, pointer, raycaster)\n if (fallbackIntersect) {\n intersects = [fallbackIntersect]\n }\n }\n\n const fiveModelIntersects: THREE.Intersection[] = []\n loadedModels.forEach((model) => {\n const _intersects = model.intersectRaycaster(raycaster)\n fiveModelIntersects.push(..._intersects)\n })\n const allowError = 0.01\n if (fiveModelIntersects.length > 0 && intersects.length > 0) {\n if (fiveModelIntersects[0].distance + allowError < intersects[0].distance) return\n }\n\n const object = intersects?.[0]?.object as Object3DWithEvent\n\n if (eventName === 'wantDblclick') return false\n\n if (!object || !this.objectIsBound(object)) {\n // hover\n if (eventName === 'hover') {\n for (const object of this.boundObject['hover'] ?? []) {\n if (object._hovered) this.notify({ eventName: 'unHover', object })\n }\n }\n }\n\n if (!object) return\n\n if (object) {\n // 通用\n const preventFiveEvent = this.notify({ eventName, object, originEvent: event, raycaster, intersects, fiveModelIntersects })\n if (preventFiveEvent) return false\n }\n }\n\n private objectIsBound = (object: Object3DWithEvent): boolean => {\n let domEvent = object._domEvent\n let objectParent: Object3DWithEvent = object.parent\n while (typeof domEvent === 'undefined' && objectParent) {\n domEvent = objectParent._domEvent\n objectParent = objectParent.parent\n }\n return Boolean(domEvent)\n }\n\n private notify = (params: {\n eventName: EventName | 'wantDblclick'\n object: Object3DWithEvent\n originEvent?: Event\n raycaster?: THREE.Raycaster\n intersects?: THREE.Intersection[]\n fiveModelIntersects?: THREE.Intersection[]\n }) => {\n const { eventName, object, originEvent, raycaster, intersects, fiveModelIntersects } = params\n\n if (!object) return false\n\n let isStopPropagation = false\n let preventFiveEvents = []\n\n const objects: Object3DWithEvent[] = []\n\n // 如果这轮事件,因为一些配置原因(noEmitWhenNotInScene / noEmitWhenHide),不触发,那么就触发下一个\n const notifyNext = () => {\n if (!intersects) return false\n const newIntersects = intersects.slice(1)\n if (!newIntersects[0]) return false\n return this.notify({ ...params, object: newIntersects[0].object, intersects: newIntersects })\n }\n\n let _object = object\n objects.push(_object)\n while (_object.parent) {\n _object = _object.parent as Object3DWithEvent\n objects.push(_object as Object3DWithEvent)\n }\n\n const topParent = objects[objects.length - 1]\n\n if (this.config?.noEmitWhenNotInScene && topParent.type !== 'Scene') {\n return notifyNext()\n }\n\n let emitied = false\n\n for (const object of objects) {\n if (isStopPropagation) break\n\n if (object.draggable) {\n if (eventName === 'dragstart') {\n object._dragging = true\n this.dragging = true\n }\n if (eventName === 'dragend') {\n object._dragging = false\n this.dragging = false\n }\n }\n\n const domEvent = object._domEvent\n if (!domEvent) continue\n\n const handlers = domEvent[`${eventName}Handler`]\n if (!handlers) continue\n\n for (const [handler, config] of handlers) {\n if (config?.noEmitWhenNotInScene && topParent.type !== 'Scene') continue\n\n if (config.skipPano && fiveModelIntersects) {\n const intersectPosition = fiveModelIntersects[0]?.point\n if (\n intersectPosition &&\n this.five.observers?.[this.five.panoIndex]?.accessibleNodes?.some((panoIndex) => {\n const standingPosition = this.five.works.getResolvedObserver({\n workCode: this.five.state.workCode,\n panoIndex,\n })?.standingPosition\n return standingPosition?.distanceTo(intersectPosition) < 0.3\n })\n ) {\n continue\n }\n }\n\n if (this.config?.noEmitWhenHide || config?.noEmitWhenHide) {\n const visible = getObjectVisible(object)\n if (!visible) continue\n }\n\n emitied = true\n\n if (eventName === 'hover') {\n if (object._hovered) continue\n object._hovered = true\n for (const _object of this.boundObject['hover'] ?? []) {\n\n if (_object !== object && _object._hovered) this.notify({ eventName: 'unHover', object: _object })\n }\n }\n\n if (eventName === 'unHover') {\n if (!object._hovered) continue\n object._hovered = false\n }\n\n const res = handler({\n type: eventName as any,\n target: object,\n origDomEvent: originEvent,\n raycaster,\n intersects,\n stopPropagation: () => {\n isStopPropagation = true\n },\n })\n\n preventFiveEvents.push(res ?? true)\n }\n }\n if (emitied === false) {\n return notifyNext()\n }\n if (eventName === 'click' || eventName === 'wantDblclick') return preventFiveEvents.some((item) => item === true)\n }\n\n private getDragSelectPixelDistance(object: Object3DWithEvent): number | undefined {\n let current: Object3DWithEvent | null = object\n while (current) {\n const distance = current.userData?.dragSelectPixelDistance\n if (typeof distance === 'number') return distance\n current = (current.parent as Object3DWithEvent) ?? null\n }\n return undefined\n }\n\n private findDragSelectIntersect(\n objects: Object3DWithEvent[] | undefined,\n pointer: { x: number; y: number },\n raycaster: THREE.Raycaster,\n ): THREE.Intersection | undefined {\n if (!objects || objects.length === 0) return\n const element = this.five?.getElement?.()\n const camera = raycaster.camera\n if (!element || !camera) return\n\n const width = element.clientWidth\n const height = element.clientHeight\n const rect = element.getBoundingClientRect()\n const pointerX = pointer.x - rect.left\n const pointerY = pointer.y - rect.top\n\n let best:\n | {\n pixelDistance: number\n object: Object3DWithEvent\n worldPoint: THREE.Vector3\n distance: number\n }\n | undefined\n\n for (const object of objects) {\n const threshold = this.getDragSelectPixelDistance(object)\n if (typeof threshold !== 'number') continue\n\n const worldPosition = this.dragSelectTempWorld\n object.getWorldPosition(worldPosition)\n const projected = this.dragSelectTempProjected.copy(worldPosition).project(camera)\n const screenX = (projected.x * 0.5 + 0.5) * width\n const screenY = (1 - (projected.y * 0.5 + 0.5)) * height\n const pixelDistance = Math.hypot(screenX - pointerX, screenY - pointerY)\n if (pixelDistance > threshold) continue\n\n const distance = raycaster.ray.distanceToPoint(worldPosition)\n if (!best || pixelDistance < best.pixelDistance) {\n best = {\n pixelDistance,\n object,\n worldPoint: worldPosition.clone(),\n distance,\n }\n }\n }\n\n if (!best) return\n\n return {\n distance: best.distance,\n object: best.object,\n point: best.worldPoint,\n } as THREE.Intersection\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { t as e } from "./StandaloneRenderer-Jo60ASPd.js";
2
+ import * as t from "three/webgpu";
3
+ //#region src/shared-utils/math/convexHull.ts
4
+ function n(e) {
5
+ e.sort(function(e, t) {
6
+ return e.x == t.x ? e.y - t.y : e.x - t.x;
7
+ });
8
+ let t = e.length, n = [];
9
+ for (let i = 0; i < 2 * t; i++) {
10
+ let a = i < t ? i : 2 * t - 1 - i;
11
+ for (; n.length >= 2 && r(n[n.length - 2], n[n.length - 1], e[a]);) n.pop();
12
+ n.push(e[a]);
13
+ }
14
+ return n.pop(), n;
15
+ }
16
+ function r(e, t, n) {
17
+ let r = (e.x - t.x) * (n.y - t.y) - (e.y - t.y) * (n.x - t.x), i = (e.x - t.x) * (n.x - t.x) + (e.y - t.y) * (n.y - t.y);
18
+ return r < 0 || r == 0 && i <= 0;
19
+ }
20
+ //#endregion
21
+ //#region src/shared-utils/math/inside.ts
22
+ function i(e, t) {
23
+ let n = e[0], r = e[1], i = !1;
24
+ for (let e = 0, a = t.length - 1; e < t.length; a = e++) {
25
+ let o = t[e][0], s = t[e][1], c = t[a][0], l = t[a][1];
26
+ s > r != l > r && n < (c - o) * (r - s) / (l - s) + o && (i = !i);
27
+ }
28
+ return i;
29
+ }
30
+ //#endregion
31
+ //#region src/shared-utils/five/FivePuppet.ts
32
+ var a = new t.Vector2(), o = class {
33
+ scene = new t.Scene();
34
+ five;
35
+ renderer;
36
+ cancelRequestAnimationFrameId;
37
+ camera;
38
+ domInited = !1;
39
+ canvasWrapper;
40
+ params;
41
+ _rendererCache;
42
+ _cameraCache;
43
+ disposed = !1;
44
+ constructor(t, n) {
45
+ this.five = t, this.camera = t.camera.clone(), this.params = n, this.renderer = new e(), this.renderer.setClearColor(0, 0), this.renderer.domElement.style.pointerEvents = "none", this.renderer.setSize(1, 1), t.on("dispose", this.dispose), this.animate();
46
+ }
47
+ animate = () => {
48
+ if (this.disposed || (this.cancelRequestAnimationFrameId = requestAnimationFrame(this.animate), !this.five.renderer)) return;
49
+ let e = this.five.renderer.getSize(a), t = this.five.renderer.getPixelRatio(), n = e.toArray().join(",") + "," + t;
50
+ n !== this._rendererCache && (this._rendererCache = n, this.renderer.setPixelRatio(t), this.renderer.setSize(e.x, e.y));
51
+ let r = this.five.camera.projectionMatrix.toArray().join(",") + this.five.camera.matrixWorld.toArray().join(",");
52
+ if (r !== this._cameraCache && (this._cameraCache = r, this.camera.copy(this.five.camera)), this.renderer.render(this.scene, this.camera), !this.domInited) {
53
+ let e = this.five.getElement()?.parentElement;
54
+ e && (this.canvasWrapper = document.createElement("div"), this.canvasWrapper.classList.add("five-puppet"), this.canvasWrapper.style.position = "absolute", this.canvasWrapper.style.pointerEvents = "none", this.canvasWrapper.style.left = "0", this.canvasWrapper.style.top = "0", this.canvasWrapper.style.zIndex = `${this.params?.zIndex ?? 1}`, this.canvasWrapper.appendChild(this.renderer.domElement), e.appendChild(this.canvasWrapper), this.domInited = !0);
55
+ }
56
+ };
57
+ stopAnimate = () => {
58
+ this.cancelRequestAnimationFrameId && cancelAnimationFrame(this.cancelRequestAnimationFrameId);
59
+ };
60
+ dispose = () => {
61
+ this.disposed || (this.disposed = !0, this.five.off("dispose", this.dispose), this.stopAnimate(), this.renderer.dispose(), this.renderer.domElement.remove(), this.canvasWrapper?.remove());
62
+ };
63
+ };
64
+ //#endregion
65
+ export { i as n, n as r, o as t };
66
+
67
+ //# sourceMappingURL=FivePuppet-C6QmVY70.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FivePuppet-C6QmVY70.js","names":["StandaloneRenderer","THREE","convexHull","a","b","n","points","hull","j","removeMiddle","cross","c","dot","inside","x","point","y","i","polygon","xi","yi","xj","yj","_vector2","FivePuppet","five","params","rendererSize","pixelRatio","_newRendererCache","_newCameraCache","wrapper"],"sources":["../../src/shared-utils/math/convexHull.ts","../../src/shared-utils/math/inside.ts","../../src/shared-utils/five/FivePuppet.ts"],"sourcesContent":["import type { Vector2Position } from '../../typings/math.type'\n\n/**\n * @description 求一组二维点的凸包\n */\nexport function convexHull(points: Vector2Position[]) {\n points.sort(function (a, b) {\n return a.x != b.x ? a.x - b.x : a.y - b.y\n })\n\n const n = points.length\n const hull: Vector2Position[] = []\n\n for (let i = 0; i < 2 * n; i++) {\n const j = i < n ? i : 2 * n - 1 - i\n while (hull.length >= 2 && removeMiddle(hull[hull.length - 2], hull[hull.length - 1], points[j])) hull.pop()\n hull.push(points[j])\n }\n\n hull.pop()\n return hull\n}\n\nfunction removeMiddle(a: Vector2Position, b: Vector2Position, c: Vector2Position) {\n const cross = (a.x - b.x) * (c.y - b.y) - (a.y - b.y) * (c.x - b.x)\n const dot = (a.x - b.x) * (c.x - b.x) + (a.y - b.y) * (c.y - b.y)\n return cross < 0 || (cross == 0 && dot <= 0)\n}\n","// https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\n// https://github.com/substack/point-in-polygon\nfunction inside(point: number[], polygon: number[][]) {\n const x = point[0]\n const y = point[1]\n let inside = false\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i][0]\n const yi = polygon[i][1]\n const xj = polygon[j][0]\n const yj = polygon[j][1]\n\n const intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi\n if (intersect) inside = !inside\n }\n return inside\n}\n\nexport { inside, inside as pointInPolygon }\n","import type { Five } from '@realsee/five-webgpu'\nimport * as THREE from 'three/webgpu'\nimport { StandaloneRenderer } from '../rendering/StandaloneRenderer'\n\nconst _vector2 = new THREE.Vector2()\n\n/**\n * @description 模拟 Five 行为的 canvas,与 Five 唯一区别是 scene 是空的\n * @usecase\n * 当需 five 的 canvas 上层有一些额外的 Dom 元素比如平面图时,希望在这些 Dom 元素上层再绘制一些三维物体,可以\n * 使用 FivePuppet,将要渲染的物体加入到 FivePuppet 的 scene 中即可。甚至可以是原本在 five 中的物体,可以使\n * 用 `.clone()` 将物体克隆一份然后加入到 FivePuppet 的 scene 中。\n * @example react\n ```typescript\n import { FivePuppet } from '@realsee/dnalogel/utils'\n\n function App() {\n const fivePuppet = React.useRef<FivePuppet>()\n const five = unsafe__useFiveInstance()\n\n React.useEffect(() => {\n fivePuppet.current = new FivePuppet(five, { zIndex: 20 })\n\n const object = new THREE.Mesh(new THREE.BoxGeometry(), new THREE.MeshBasicMaterial({ color: 0xff0000 }))\n fivePuppet.current.scene.add(object)\n\n return () => {\n fivePuppet.current?.dispose()\n }\n }, [five])\n }\n ```\n * @example javascript\n ```typescript\n import { FivePuppet } from '@realsee/dnalogel/utils'\n\n const five = new Five({\n plugins: [\n [(five) => new FivePuppet(five), 'fivePuppet']\n ],\n })\n\n const object = new THREE.Mesh(new THREE.BoxGeometry(), new THREE.MeshBasicMaterial({ color: 0xff0000 }))\n five.plugins.fivePuppet.scene.add(object)\n ```\n */\nexport class FivePuppet {\n public scene = new THREE.Scene()\n\n private five: Five\n private renderer: StandaloneRenderer\n private cancelRequestAnimationFrameId: number\n private camera: Five['camera']\n\n private domInited = false\n private canvasWrapper?: HTMLDivElement\n private params?: { zIndex?: number }\n\n private _rendererCache: string\n private _cameraCache: string\n private disposed = false\n\n public constructor(\n five: Five,\n params?: {\n /**\n * @description canvas 的 zIndex\n * @default 1\n */\n zIndex: number\n },\n ) {\n this.five = five\n this.camera = five.camera.clone() as Five['camera']\n this.params = params\n\n this.renderer = new StandaloneRenderer()\n this.renderer.setClearColor(0, 0)\n this.renderer.domElement.style.pointerEvents = 'none'\n this.renderer.setSize(1, 1)\n\n five.on('dispose', this.dispose)\n\n this.animate()\n }\n\n public animate = () => {\n if (this.disposed) return\n this.cancelRequestAnimationFrameId = requestAnimationFrame(this.animate)\n\n if (!this.five.renderer) return\n\n const rendererSize = this.five.renderer.getSize(_vector2)\n const pixelRatio = this.five.renderer.getPixelRatio()\n const _newRendererCache = rendererSize.toArray().join(',') + ',' + pixelRatio\n if (_newRendererCache !== this._rendererCache) {\n this._rendererCache = _newRendererCache\n this.renderer.setPixelRatio(pixelRatio)\n this.renderer.setSize(rendererSize.x, rendererSize.y)\n }\n\n const _newCameraCache = this.five.camera.projectionMatrix.toArray().join(',') + this.five.camera.matrixWorld.toArray().join(',')\n if (_newCameraCache !== this._cameraCache) {\n this._cameraCache = _newCameraCache\n this.camera.copy(this.five.camera)\n }\n\n this.renderer.render(this.scene, this.camera)\n\n if (!this.domInited) {\n const wrapper = this.five.getElement()?.parentElement\n if (wrapper) {\n this.canvasWrapper = document.createElement('div')\n this.canvasWrapper.classList.add('five-puppet')\n this.canvasWrapper.style.position = 'absolute'\n this.canvasWrapper.style.pointerEvents = 'none'\n this.canvasWrapper.style.left = '0'\n this.canvasWrapper.style.top = '0'\n this.canvasWrapper.style.zIndex = `${this.params?.zIndex ?? 1}`\n\n this.canvasWrapper.appendChild(this.renderer.domElement)\n wrapper.appendChild(this.canvasWrapper)\n\n this.domInited = true\n }\n }\n }\n\n public stopAnimate = () => {\n this.cancelRequestAnimationFrameId && cancelAnimationFrame(this.cancelRequestAnimationFrameId)\n }\n\n public dispose = () => {\n if (this.disposed) return\n this.disposed = true\n this.five.off('dispose', this.dispose)\n this.stopAnimate()\n this.renderer.dispose()\n this.renderer.domElement.remove()\n this.canvasWrapper?.remove()\n }\n}\n"],"mappings":"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"}