@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 +1 @@
1
- {"version":3,"file":"model-tv-video-DzXb2JRf.js","names":["CSS3DRenderPlugin","Image_Play_Icon_With_Text","THREE","DIRECTION","\"TOP_LEFT\"","\"TOP_RIGHT\"","\"BOTTOM_LEFT\"","\"BOTTOM_RIGHT\"","parseModelTVVideoPoints","points","newPoints","newPoint","point","ModelTVVideoPlugin","state","loadGeneration","pendingXHR","objectURL","playbackGeneration","session","playbackController","mediaManager","cancelPlayback","playAudible","next","muted","generation","video","operations","error","css3DRenderPlugin","five","playIconMap","setMuted","userAction","getMuted","enable","createPanoVideoMeshes","mesh","play","timeupdate","disable","geometry","verticesArray","i","uvArray","indicesArray","material","index","pointsForCss3DRender","dom3DContainer","playIcon","playIconImg","getImageTexture","texture","source","getVideoTexture","_video","xhr","url","createVideoTexture","resolve","reject","load","data","video_src","items","x","y","z","video_poster_src","videoElement","fiveWantsTapGesturehandler","targetMesh","raycaster","fiveModeChangeHandler","mode","fivePanoArrivedhandler","cameraPosition","center","vector","intersection","distance","visible","centerVector","meshes"],"sources":["../../src/ModelTVVideoPlugin/typings.ts","../../src/ModelTVVideoPlugin/utils/parseData.ts","../../src/ModelTVVideoPlugin/Plugin.ts"],"sourcesContent":["import type { PlaybackManager } from '../shared-utils/playback'\nexport interface ModelTVVideoPluginParameterType {\n mediaManager?: PlaybackManager\n videoElement?: HTMLVideoElement\n}\n\nexport enum DIRECTION {\n TOP_LEFT = 'topLeft',\n TOP_RIGHT = 'topRight',\n BOTTOM_LEFT = 'bottomLeft',\n BOTTOM_RIGHT = 'bottomRight',\n}\n\nexport interface Point {\n x: number\n y: number\n z: number\n}\n\nexport interface ModelTVVideoPluginData {\n enable?: boolean\n video_src: string\n video_poster_src: string\n points: Point[][] | Record<DIRECTION, Point>[]\n}\n\n// export interface ModelTVVideoPluginInnerData {\n// enable?: boolean\n// video_src: string\n// video_poster_src: string\n// points: Point[][]\n// }\n\nexport interface ModelTVVideoPluginExportType {\n enable: () => void\n disable: () => void\n load: (data: ModelTVVideoPluginData, videoElement?: HTMLVideoElement) => Promise<void>\n}\n","import type { Point } from '../typings'\nimport { DIRECTION } from '../typings'\n\nexport function parseModelTVVideoPoints(points: Point[][] | Record<DIRECTION, Point>[]): Point[][] {\n if (points.length === 0) return []\n if (Array.isArray(points[0])) return points as Point[][]\n let newPoints: Point[][] = []\n points.forEach((point) => {\n const newPoint: Point[] = [\n point[DIRECTION.TOP_LEFT],\n point[DIRECTION.BOTTOM_LEFT],\n point[DIRECTION.BOTTOM_RIGHT],\n point[DIRECTION.TOP_RIGHT],\n ]\n newPoints.push(newPoint)\n })\n\n return newPoints\n}\n","import { createVideoTexture } from '../shared-utils/three/loadVideoTexture'\nimport type { PlaybackSession } from '../shared-utils/playback'\nimport type { FivePlugin, Mode } from '@realsee/five-webgpu'\nimport type { ModelTVVideoPluginData, ModelTVVideoPluginExportType, ModelTVVideoPluginParameterType } from './typings'\nimport type { Create3DDomContainerReturnType } from '../CSS3DRenderPlugin'\nimport * as THREE from 'three/webgpu'\nimport { parseModelTVVideoPoints } from './utils/parseData'\nimport CSS3DRenderPlugin from '../CSS3DRenderPlugin'\nimport { Image_Play_Icon_With_Text } from '../PanoTagPlugin/Assets/Icon'\n\ntype ModelTVVideoPluginPoints = THREE.Vector3[][]\n\ninterface ModelTVVideoPluginState {\n videoMeshes: THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial>[]\n videoTextureEnabled: boolean\n videoSource: string\n rectPoints: ModelTVVideoPluginPoints\n enabled: boolean\n imageTexture?: THREE.Texture\n videoTexture?: THREE.VideoTexture\n videoElement?: HTMLVideoElement\n}\n\nexport const ModelTVVideoPlugin: FivePlugin<ModelTVVideoPluginParameterType, ModelTVVideoPluginExportType> = (five, { videoElement, mediaManager }) => {\n const state: ModelTVVideoPluginState = {\n videoMeshes: [],\n videoTextureEnabled: false,\n videoSource: '',\n rectPoints: [],\n enabled: false,\n videoElement: videoElement,\n }\n\n let loadGeneration = 0\n let pendingXHR: XMLHttpRequest | undefined\n let objectURL: string | undefined\n let playbackGeneration = 0\n let session: PlaybackSession | undefined\n const playbackController = mediaManager?.createController({ label: 'model-tv', onCancel: () => { playbackGeneration++; session = undefined } })\n const cancelPlayback = () => {\n playbackController?.cancel()\n playbackGeneration++\n session = undefined\n if (state.videoTexture) { state.videoTexture.image.muted = true; state.videoTexture.image.pause() }\n }\n const playAudible = async (userAction = false, muted = false) => {\n if (!state.videoTexture) return\n const next = playbackController?.begin({ userAction, audible: !muted })\n if (playbackController && !next) return\n session = next\n const generation = ++playbackGeneration\n const video = state.videoTexture.image as HTMLVideoElement\n const operations = next?.bind(video) ?? video\n operations.muted = muted\n try { await operations.play() } catch (error) {\n if (next?.signal.aborted || generation !== playbackGeneration || next !== session) return\n if ((error as Error).name === 'AbortError') { cancelPlayback(); return }\n cancelPlayback()\n throw error\n }\n }\n const css3DRenderPlugin = CSS3DRenderPlugin(five)\n\n const playIconMap = new Map<(typeof state)['videoMeshes'][number], Create3DDomContainerReturnType>()\n\n const setMuted = (muted: boolean, userAction = false) => {\n if (!state.videoTexture) return\n if (!muted) {\n if (!state.videoTexture.image.paused) return playAudible(userAction)\n const next = playbackController?.begin({ userAction, audible: true })\n if (playbackController && !next) return\n session = next\n }\n const video = state.videoTexture.image as HTMLVideoElement\n const operations = session?.bind(video) ?? video\n operations.muted = muted\n }\n const getMuted = () => {\n if (state.videoTexture) return state.videoTexture.image.muted\n else return true\n }\n\n const enable = () => {\n if (state.enabled) return\n if (!state.videoTexture) return\n\n state.enabled = true\n state.videoMeshes = createPanoVideoMeshes()\n state.videoMeshes.forEach((mesh) => five.scene.add(mesh))\n\n const play = () => {\n if (!state.enabled || !state.videoTexture) return\n\n const timeupdate = () => {\n if (!state.videoTexture) return\n state.videoTexture?.image.removeEventListener('timeupdate', timeupdate)\n state.videoTextureEnabled = true\n state.videoMeshes.forEach((mesh) => {\n if (mesh.material.map !== state.videoTexture) mesh.material.map = state.videoTexture!\n })\n five.needsRender = true\n }\n state.videoTexture.image.addEventListener('timeupdate', timeupdate)\n if (state.videoTexture && state.videoMeshes.length) {\n void playAudible(false, state.videoTexture.image.muted)\n state.videoTexture.image.onplay = () => {\n css3DRenderPlugin.hide()\n }\n state.videoTexture.image.onpause = () => {\n css3DRenderPlugin.show()\n }\n state.videoTexture.image.onclick = () => {\n playAudible(true)\n }\n }\n }\n\n if (five.model.loaded) play()\n else {\n return five.once('modelLoaded', () => play())\n }\n }\n\n const disable = () => {\n loadGeneration++\n pendingXHR?.abort()\n cancelPlayback()\n if (!state.enabled) return\n state.enabled = false\n state.videoMeshes.forEach((mesh) => {\n mesh.geometry.dispose()\n mesh.material.dispose()\n five.scene.remove(mesh)\n if (state.videoTexture) state.videoTexture.image.pause()\n })\n state.videoMeshes = []\n five.needsRender = true\n }\n\n const createPanoVideoMeshes = () => {\n return state.rectPoints.map((points, index) => {\n const geometry = new THREE.BufferGeometry()\n const segments = 128\n\n const verticesArray = []\n verticesArray.push(...points[0].toArray())\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n points[0].x + ((points[1].x - points[0].x) * i) / segments,\n points[0].y + ((points[1].y - points[0].y) * i) / segments,\n points[0].z + ((points[1].z - points[0].z) * i) / segments,\n )\n }\n verticesArray.push(...points[1].toArray())\n verticesArray.push(...points[2].toArray())\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n points[2].x + ((points[3].x - points[2].x) * i) / segments,\n points[2].y + ((points[3].y - points[2].y) * i) / segments,\n points[2].z + ((points[3].z - points[2].z) * i) / segments,\n )\n }\n verticesArray.push(...points[3].toArray())\n\n const uvArray = []\n uvArray.push(0, 1)\n for (let i = 1; i < segments; i++) {\n uvArray.push(0, 1 - i / segments)\n }\n uvArray.push(0, 0)\n uvArray.push(1, 0)\n for (let i = 1; i < segments; i++) {\n uvArray.push(1, i / segments)\n }\n uvArray.push(1, 1)\n\n const indicesArray = []\n for (let i = 0; i < segments; i++) {\n indicesArray.push(i, i + 1, segments * 2 - i, i, segments * 2 - i, segments * 2 + 1 - i)\n }\n geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(verticesArray), 3))\n geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvArray), 2))\n geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(indicesArray), 1))\n\n const material = new THREE.MeshBasicMaterial({\n map: state.videoTextureEnabled ? state.videoTexture : state.imageTexture,\n side: THREE.DoubleSide,\n })\n const mesh = new THREE.Mesh(geometry, material)\n mesh.renderOrder = 1\n mesh.name = `ModelTVVideoPlugin-${index}-${performance.now()}`\n\n const pointsForCss3DRender = [points[1], points[2], points[3], points[0]] // omg, 顺序竟然不一样\n\n // create play icon\n const dom3DContainer = css3DRenderPlugin.create3DDomContainer(pointsForCss3DRender)\n if (dom3DContainer?.container) {\n const playIcon = document.createElement('div')\n playIcon.classList.add('play-icon')\n playIcon.style.width = '100%'\n playIcon.style.height = '100%'\n playIcon.style.display = 'flex'\n playIcon.style.justifyContent = 'center'\n playIcon.style.alignItems = 'center'\n playIcon.style.pointerEvents = 'none'\n dom3DContainer.container.appendChild(playIcon)\n\n const playIconImg = document.createElement('img')\n playIconImg.src = Image_Play_Icon_With_Text\n playIconImg.style.width = '200px'\n playIconImg.style.pointerEvents = 'auto'\n playIconImg.onclick = () => {\n playAudible(true)\n }\n playIcon.appendChild(playIconImg)\n playIconMap.set(mesh, dom3DContainer)\n }\n return mesh\n })\n }\n\n const getImageTexture = (source: string) => {\n const texture = new THREE.TextureLoader().load(source)\n texture.minFilter = THREE.LinearFilter\n texture.magFilter = THREE.LinearFilter\n texture.colorSpace = THREE.SRGBColorSpace\n return texture\n }\n\n const getVideoTexture = (source: string, _video?: HTMLVideoElement): Promise<THREE.VideoTexture & { videoSource: string }> => {\n let video = _video\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n pendingXHR?.abort()\n pendingXHR = xhr\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n const url = window.URL || window.webkitURL\n video = video || document.createElement('video')\n video.crossOrigin = 'anonymous'\n // video.autoplay = true\n video.muted = true\n video.loop = true\n video.playsInline = true\n if (objectURL) URL.revokeObjectURL(objectURL)\n objectURL = url.createObjectURL(xhr.response)\n video.src = objectURL\n const texture = createVideoTexture(video)\n texture.minFilter = THREE.LinearFilter\n texture.magFilter = THREE.LinearFilter\n resolve(Object.assign(texture, { videoSource: source }))\n } else {\n reject(new Error('Video download Error: ' + xhr.status))\n }\n }\n }\n xhr.onerror = (error) => reject(error)\n xhr.onabort = () => reject(new DOMException('Video load canceled', 'AbortError'))\n xhr.open('GET', source)\n xhr.responseType = 'blob'\n xhr.send()\n })\n }\n\n const load = async (data: ModelTVVideoPluginData, videoElement?: HTMLVideoElement) => {\n const generation = ++loadGeneration\n cancelPlayback()\n const { video_src, video_poster_src, points } = data\n state.videoSource = video_src\n // TODO 存疑,先处理多一次遍历 o(2n)\n state.rectPoints = parseModelTVVideoPoints(points).map((items) => items.map(({ x, y, z }) => new THREE.Vector3(x, y, z)))\n state.imageTexture = getImageTexture(video_poster_src)\n\n if (videoElement) {\n state.videoElement = videoElement\n }\n\n let texture: THREE.VideoTexture & { videoSource: string }\n try { texture = await getVideoTexture(state.videoSource, state.videoElement) }\n catch (error) { if (generation !== loadGeneration) return; throw error }\n if (generation !== loadGeneration) { texture.dispose(); return }\n state.videoTexture = texture\n state.enabled = false\n if (data.enable) enable()\n }\n\n const fiveWantsTapGesturehandler = (raycaster): false | void => {\n if (!state.enabled) return\n const targetMesh = state.videoMeshes\n if (!targetMesh) return\n const intersectObjects = raycaster.intersectObjects(targetMesh)\n if (intersectObjects.length === 0) return\n if (state.videoTexture) {\n if (!state.videoTexture.image.paused) {\n cancelPlayback()\n }\n }\n return false\n }\n\n const fiveModeChangeHandler = (mode: Mode) => {\n if (mode === 'Floorplan') {\n css3DRenderPlugin.hide()\n } else {\n css3DRenderPlugin.show()\n }\n }\n\n const fivePanoArrivedhandler = () => {\n if (!state.enabled) return\n const cameraPosition = five.camera.position\n playIconMap.forEach((dom3DContainer, mesh) => {\n const center = dom3DContainer.css3DObject.position.clone()\n const vector = center.clone().sub(cameraPosition).normalize()\n const raycaster = new THREE.Raycaster(cameraPosition, vector)\n const intersection = five.model.intersectRaycaster(raycaster)[0]\n const distance = center.distanceTo(cameraPosition)\n const distanceError = 0.01\n if (intersection && intersection.distance + distanceError < distance) {\n // 不可见\n dom3DContainer.hide()\n } else {\n // 可见\n dom3DContainer.show()\n }\n })\n if (!getMuted()) {\n const visible = state.rectPoints.find((points) => {\n const centerVector = points[0].clone().add(points[1]).add(points[2]).add(points[3]).divideScalar(4)\n return (\n points\n .map((point) => point.clone().add(centerVector).divideScalar(2))\n .filter((vector) => {\n const distance = vector.distanceTo(cameraPosition)\n const raycaster = new THREE.Raycaster(cameraPosition, vector.clone().sub(cameraPosition).normalize())\n const intersection = five.model.intersectRaycaster(raycaster)[0]\n const distanceError = 0.01\n if (intersection && intersection.distance + distanceError < distance) {\n return false\n } else {\n return true\n }\n }).length >= 2\n )\n })\n if (!visible || visible.length === 0) setMuted(true)\n }\n }\n\n const dispose = () => {\n disable()\n cancelPlayback(); playbackController?.dispose()\n if (objectURL) URL.revokeObjectURL(objectURL)\n state.videoTexture?.dispose()\n state.videoTexture = undefined\n five.off('modeChange', fiveModeChangeHandler)\n five.off('wantsTapGesture', fiveWantsTapGesturehandler)\n five.off('panoArrived', fivePanoArrivedhandler)\n five.off('renderFrame', () => {\n state.videoMeshes.forEach((meshes) => {\n if (meshes)\n // @ts-ignore\n meshes.needsRender = true\n })\n })\n }\n\n five.on('modeChange', fiveModeChangeHandler)\n\n five.on('wantsTapGesture', fiveWantsTapGesturehandler)\n\n five.on('panoArrived', fivePanoArrivedhandler)\n\n five.on('renderFrame', () => {\n state.videoMeshes.forEach((meshes) => {\n if (meshes)\n // @ts-ignore\n meshes.needsRender = true\n })\n })\n\n return { enable, disable, load, dispose, state, css3DRenderPlugin, setMuted, getMuted }\n}\n\nexport default ModelTVVideoPlugin\n"],"mappings":";;;;;AAMA,IAAYG,IAAL,yBAAA,GAAA;QACL,EAAAC,WAAA,WACA,EAAAC,YAAA,YACA,EAAAC,cAAA,cACA,EAAAC,eAAA;AACF,EAAA,CAAA,CAAA;;;ACRA,SAAgBC,EAAwB,GAA2D;CACjG,IAAIC,EAAO,WAAW,GAAG,OAAO,CAAC;CACjC,IAAI,MAAM,QAAQA,EAAO,EAAE,GAAG,OAAOA;CACrC,IAAIC,IAAuB,CAAC;CAW5B,OAVAD,EAAO,SAAS,MAAU;EACxB,IAAME,IAAoB;GACxBC,EAAMT,EAAU;GAChBS,EAAMT,EAAU;GAChBS,EAAMT,EAAU;GAChBS,EAAMT,EAAU;EAClB;EACA,EAAU,KAAKQ,CAAQ;CACzB,CAAC,GAEMD;AACT;;;ACKA,IAAaG,KAAiG,GAAM,EAAE,iBAAc,sBAAmB;CACrJ,IAAMC,IAAiC;EACrC,aAAa,CAAC;EACd,qBAAqB;EACrB,aAAa;EACb,YAAY,CAAC;EACb,SAAS;EACK;CAChB,GAEIC,IAAiB,GACjBC,GACAC,GACAC,IAAqB,GACrBC,GACEC,IAAqBC,GAAc,iBAAiB;EAAE,OAAO;EAAY,gBAAgB;GAAwB,AAAtB,KAAsB,IAAU,KAAA;EAAU;CAAE,CAAC,GACxIC,UAAuB;EAI3B,AAHAF,GAAoB,OAAO,GAC3B,KACA,IAAU,KAAA,GACNN,EAAM,iBAAgB,EAAM,aAAa,MAAM,QAAQ,IAAMA,EAAM,aAAa,MAAM,MAAM;CAClG,GACMS,IAAc,OAAO,IAAa,IAAO,IAAQ,OAAU;EAC/D,IAAI,CAACT,EAAM,cAAc;EACzB,IAAMU,IAAOJ,GAAoB,MAAM;GAAE;GAAY,SAAS,CAACK;EAAM,CAAC;EACtE,IAAIL,KAAsB,CAACI,GAAM;EACjC,IAAUA;EACV,IAAME,IAAa,EAAER,GACfS,IAAQb,EAAM,aAAa,OAC3Bc,IAAaJ,GAAM,KAAKG,CAAK,KAAKA;EACxC,EAAW,QAAQF;EACnB,IAAI;GAAE,MAAMG,EAAW,KAAK;EAAE,SAASC,GAAO;GAC5C,IAAIL,GAAM,OAAO,WAAWE,MAAeR,KAAsBM,MAASL,GAAS;GACnF,IAAKU,EAAgB,SAAS,cAAc;IAAE,EAAe;IAAG;GAAO;GAEvE,MADAP,EAAe,GACTO;EACR;CACF,GACMC,IAAoB9B,EAAkB+B,CAAI,GAE1CC,oBAAc,IAAI,IAA2E,GAE7FC,KAAY,GAAgB,IAAa,OAAU;EACvD,IAAI,CAACnB,EAAM,cAAc;EACzB,IAAI,CAACW,GAAO;GACV,IAAI,CAACX,EAAM,aAAa,MAAM,QAAQ,OAAOS,EAAYW,CAAU;GACnE,IAAMV,IAAOJ,GAAoB,MAAM;IAAE;IAAY,SAAS;GAAK,CAAC;GACpE,IAAIA,KAAsB,CAACI,GAAM;GACjC,IAAUA;EACZ;EACA,IAAMG,IAAQb,EAAM,aAAa,OAC3Bc,IAAaT,GAAS,KAAKQ,CAAK,KAAKA;EAC3C,EAAW,QAAQF;CACrB,GACMU,UACJ,CAAIrB,EAAM,gBAAqBA,EAAM,aAAa,MAAM,OAIpDsB,UAAe;EAEnB,IADItB,EAAM,WACN,CAACA,EAAM,cAAc;EAIzB,AAFA,EAAM,UAAU,IAChB,EAAM,cAAcuB,EAAsB,GAC1CvB,EAAM,YAAY,SAAS,MAASiB,EAAK,MAAM,IAAIO,CAAI,CAAC;EAExD,IAAMC,UAAa;GACjB,IAAI,CAACzB,EAAM,WAAW,CAACA,EAAM,cAAc;GAE3C,IAAM0B,UAAmB;IACvB,AAAK1B,EAAM,iBACXA,EAAM,cAAc,MAAM,oBAAoB,cAAc0B,CAAU,GACtE,EAAM,sBAAsB,IAC5B1B,EAAM,YAAY,SAAS,MAAS;KAClC,AAAIwB,EAAK,SAAS,QAAQxB,EAAM,iBAAc,EAAK,SAAS,MAAMA,EAAM;IAC1E,CAAC,GACD,EAAK,cAAc;GACrB;GAEA,AADAA,EAAM,aAAa,MAAM,iBAAiB,cAAc0B,CAAU,GAC9D1B,EAAM,gBAAgBA,EAAM,YAAY,WAC1CS,EAAiB,IAAOT,EAAM,aAAa,MAAM,KAAK,GACtD,EAAM,aAAa,MAAM,eAAe;IACtC,EAAkB,KAAK;GACzB,GACA,EAAM,aAAa,MAAM,gBAAgB;IACvC,EAAkB,KAAK;GACzB,GACA,EAAM,aAAa,MAAM,gBAAgB;IACvC,EAAY,EAAI;GAClB;EAEJ;EAEA,IAAIiB,EAAK,MAAM,QAAQ,EAAK;OAE1B,OAAOA,EAAK,KAAK,qBAAqBQ,EAAK,CAAC;CAEhD,GAEME,UAAgB;EAIpB,AAHA,KACAzB,GAAY,MAAM,GAClBM,EAAe,GACVR,EAAM,YACX,EAAM,UAAU,IAChBA,EAAM,YAAY,SAAS,MAAS;GAIlC,AAHAwB,EAAK,SAAS,QAAQ,GACtBA,EAAK,SAAS,QAAQ,GACtBP,EAAK,MAAM,OAAOO,CAAI,GAClBxB,EAAM,gBAAcA,EAAM,aAAa,MAAM,MAAM;EACzD,CAAC,GACD,EAAM,cAAc,CAAC,GACrB,EAAK,cAAc;CACrB,GAEMuB,UACGvB,EAAM,WAAW,KAAK,GAAQ,MAAU;EAC7C,IAAM4B,IAAW,IAAIxC,EAAM,eAAe,GAGpCyC,IAAgB,CAAC;EACvB,EAAc,KAAK,GAAGlC,EAAO,EAAE,CAAC,QAAQ,CAAC;EACzC,KAAK,IAAImC,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAc,KACZnC,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKmC,IAAK,KAClDnC,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKmC,IAAK,KAClDnC,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKmC,IAAK,GACpD;EAGF,AADAD,EAAc,KAAK,GAAGlC,EAAO,EAAE,CAAC,QAAQ,CAAC,GACzCkC,EAAc,KAAK,GAAGlC,EAAO,EAAE,CAAC,QAAQ,CAAC;EACzC,KAAK,IAAImC,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAc,KACZnC,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKmC,IAAK,KAClDnC,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKmC,IAAK,KAClDnC,EAAO,EAAE,CAAC,KAAMA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAKmC,IAAK,GACpD;EAEF,EAAc,KAAK,GAAGnC,EAAO,EAAE,CAAC,QAAQ,CAAC;EAEzC,IAAMoC,IAAU,CAAC;EACjB,EAAQ,KAAK,GAAG,CAAC;EACjB,KAAK,IAAID,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAQ,KAAK,GAAG,IAAIA,IAAI,GAAQ;EAGlC,AADAC,EAAQ,KAAK,GAAG,CAAC,GACjBA,EAAQ,KAAK,GAAG,CAAC;EACjB,KAAK,IAAID,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAQ,KAAK,GAAGA,IAAI,GAAQ;EAE9B,EAAQ,KAAK,GAAG,CAAC;EAEjB,IAAME,IAAe,CAAC;EACtB,KAAK,IAAIF,IAAI,GAAGA,IAAI,KAAU,KAC5B,EAAa,KAAKA,GAAGA,IAAI,GAAG,MAAeA,GAAGA,GAAG,MAAeA,GAAG,MAAmBA,CAAC;EAIzF,AAFAF,EAAS,aAAa,YAAY,IAAIxC,EAAM,gBAAgB,IAAI,aAAayC,CAAa,GAAG,CAAC,CAAC,GAC/FD,EAAS,aAAa,MAAM,IAAIxC,EAAM,gBAAgB,IAAI,aAAa2C,CAAO,GAAG,CAAC,CAAC,GACnFH,EAAS,SAAS,IAAIxC,EAAM,gBAAgB,IAAI,YAAY4C,CAAY,GAAG,CAAC,CAAC;EAE7E,IAAMC,IAAW,IAAI7C,EAAM,kBAAkB;GAC3C,KAAKY,EAAM,sBAAsBA,EAAM,eAAeA,EAAM;GAC5D,MAAMZ,EAAM;EACd,CAAC,GACKoC,IAAO,IAAIpC,EAAM,KAAKwC,GAAUK,CAAQ;EAE9C,AADA,EAAK,cAAc,GACnB,EAAK,OAAO,sBAAsBC,EAAM,GAAG,YAAY,IAAI;EAE3D,IAAMC,IAAuB;GAACxC,EAAO;GAAIA,EAAO;GAAIA,EAAO;GAAIA,EAAO;EAAE,GAGlEyC,IAAiBpB,EAAkB,qBAAqBmB,CAAoB;EAClF,IAAIC,GAAgB,WAAW;GAC7B,IAAMC,IAAW,SAAS,cAAc,KAAK;GAQ7C,AAPAA,EAAS,UAAU,IAAI,WAAW,GAClC,EAAS,MAAM,QAAQ,QACvB,EAAS,MAAM,SAAS,QACxB,EAAS,MAAM,UAAU,QACzB,EAAS,MAAM,iBAAiB,UAChC,EAAS,MAAM,aAAa,UAC5B,EAAS,MAAM,gBAAgB,QAC/BD,EAAe,UAAU,YAAYC,CAAQ;GAE7C,IAAMC,IAAc,SAAS,cAAc,KAAK;GAQhD,AAPA,EAAY,MAAMnD,GAClB,EAAY,MAAM,QAAQ,SAC1B,EAAY,MAAM,gBAAgB,QAClC,EAAY,gBAAgB;IAC1B,EAAY,EAAI;GAClB,GACAkD,EAAS,YAAYC,CAAW,GAChCpB,EAAY,IAAIM,GAAMY,CAAc;EACtC;EACA,OAAOZ;CACT,CAAC,GAGGe,KAAmB,MAAmB;EAC1C,IAAMC,IAAU,IAAIpD,EAAM,cAAc,CAAC,CAAC,KAAKqD,CAAM;EAIrD,OAHA,EAAQ,YAAYrD,EAAM,cAC1B,EAAQ,YAAYA,EAAM,cAC1B,EAAQ,aAAaA,EAAM,gBACpBoD;CACT,GAEME,KAAmB,GAAgB,MAAqF;EAC5H,IAAI7B,IAAQ8B;EACZ,OAAO,IAAI,SAAS,GAAS,MAAW;GACtC,IAAMC,IAAM,IAAI,eAAe;GA6B/B,AA5BA1C,GAAY,MAAM,GAClB,IAAa0C,GACb,EAAI,2BAA2B;IAC7B,IAAIA,EAAI,eAAe,GAAG;KACxB,IAAIA,EAAI,WAAW,KAAK;MACtB,IAAMC,IAAM,OAAO,OAAO,OAAO;MASjC,AARA,MAAiB,SAAS,cAAc,OAAO,GAC/C,EAAM,cAAc,aAEpB,EAAM,QAAQ,IACd,EAAM,OAAO,IACb,EAAM,cAAc,IAChB1C,KAAW,IAAI,gBAAgBA,CAAS,GAC5C,IAAY0C,EAAI,gBAAgBD,EAAI,QAAQ,GAC5C,EAAM,MAAMzC;MACZ,IAAMqC,IAAUM,EAAmBjC,CAAK;MAGhC,AAFR,EAAQ,YAAYzB,EAAM,cAC1B,EAAQ,YAAYA,EAAM,cAClB2D,EAAQ,OAAO,OAAOP,GAAS,EAAE,aAAaC,EAAO,CAAC,CAAC;KACjE,OACE,EAAO,gBAAI,MAAM,2BAA2BG,EAAI,MAAM,CAAC;IAE3D;GACF,GACA,EAAI,WAAW,MAAUI,EAAOjC,CAAK,GACrC,EAAI,gBAAgBiC,EAAO,IAAI,aAAa,uBAAuB,YAAY,CAAC,GAChFJ,EAAI,KAAK,OAAOH,CAAM,GACtB,EAAI,eAAe,QACnBG,EAAI,KAAK;EACX,CAAC;CACH,GAEMK,IAAO,OAAO,GAA8B,MAAoC;EACpF,IAAMrC,IAAa,EAAEX;EACrB,EAAe;EACf,IAAM,EAAE,cAAW,qBAAkB,cAAWiD;EAMhD,AALA,EAAM,cAAcC,GAEpB,EAAM,aAAazD,EAAwBC,CAAM,CAAC,CAAC,KAAK,MAAUyD,EAAM,KAAK,EAAE,MAAG,MAAG,WAAQ,IAAIhE,EAAM,QAAQiE,GAAGC,GAAGC,CAAC,CAAC,CAAC,GACxH,EAAM,eAAehB,EAAgBiB,CAAgB,GAEjDC,MACF,EAAM,eAAeA;EAGvB,IAAIjB;EACJ,IAAI;GAAE,IAAU,MAAME,EAAgB1C,EAAM,aAAaA,EAAM,YAAY;EAAE,SACtEe,GAAO;GAAE,IAAIH,MAAeX,GAAgB;GAAQ,MAAMc;EAAM;EACvE,AAAIH,MAAeX,KACnB,EAAM,eAAeuC,GACrB,EAAM,UAAU,IACZU,EAAK,UAAQ5B,EAAO,KAHakB,EAAQ,QAAQ;CAIvD,GAEMkB,KAA8B,MAA4B;EAC9D,IAAI,CAAC1D,EAAM,SAAS;EACpB,IAAM2D,IAAa3D,EAAM;EACzB,IAAK2D,KACoBC,EAAU,iBAAiBD,CAChD,CAAA,CAAiB,WAAW,GAMhC,OALI3D,EAAM,iBACHA,EAAM,aAAa,MAAM,UAC5BQ,EAAe,IAGZ;CACT,GAEMqD,KAAyB,MAAe;EAC5C,AAAIC,MAAS,cACX9C,EAAkB,KAAK,IAEvBA,EAAkB,KAAK;CAE3B,GAEM+C,UAA+B;EACnC,IAAI,CAAC/D,EAAM,SAAS;EACpB,IAAMgE,IAAiB/C,EAAK,OAAO;EAgBnC,IAfAC,EAAY,SAAS,GAAgB,MAAS;GAC5C,IAAM+C,IAAS7B,EAAe,YAAY,SAAS,MAAM,GACnD8B,IAASD,EAAO,MAAM,CAAC,CAAC,IAAID,CAAc,CAAC,CAAC,UAAU,GACtDJ,IAAY,IAAIxE,EAAM,UAAU4E,GAAgBE,CAAM,GACtDC,IAAelD,EAAK,MAAM,mBAAmB2C,CAAS,CAAC,CAAC,IACxDQ,IAAWH,EAAO,WAAWD,CAAc;GAEjD,AAAIG,KAAgBA,EAAa,WAAW,MAAgBC,IAE1DhC,EAAe,KAAK,IAGpBA,EAAe,KAAK;EAExB,CAAC,GACG,CAACf,EAAS,GAAG;GACf,IAAMgD,IAAUrE,EAAM,WAAW,MAAM,MAAW;IAChD,IAAMsE,IAAe3E,EAAO,EAAE,CAAC,MAAM,CAAC,CAAC,IAAIA,EAAO,EAAE,CAAC,CAAC,IAAIA,EAAO,EAAE,CAAC,CAAC,IAAIA,EAAO,EAAE,CAAC,CAAC,aAAa,CAAC;IAClG,OACEA,EACG,KAAK,MAAUG,EAAM,MAAM,CAAC,CAAC,IAAIwE,CAAY,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAC/D,QAAQ,MAAW;KAClB,IAAMF,IAAWF,EAAO,WAAWF,CAAc,GAC3CJ,IAAY,IAAIxE,EAAM,UAAU4E,GAAgBE,EAAO,MAAM,CAAC,CAAC,IAAIF,CAAc,CAAC,CAAC,UAAU,CAAC,GAC9FG,IAAelD,EAAK,MAAM,mBAAmB2C,CAAS,CAAC,CAAC;KAK5D,OAHF,EAAIO,KAAgBA,EAAa,WAAW,MAAgBC;IAK9D,CAAC,CAAC,CAAC,UAAU;GAEnB,CAAC;GACD,CAAI,CAACC,KAAWA,EAAQ,WAAW,MAAGlD,EAAS,EAAI;EACrD;CACF;CAkCA,OAdAF,EAAK,GAAG,cAAc4C,CAAqB,GAE3C5C,EAAK,GAAG,mBAAmByC,CAA0B,GAErDzC,EAAK,GAAG,eAAe8C,CAAsB,GAE7C9C,EAAK,GAAG,qBAAqB;EAC3B,EAAM,YAAY,SAAS,MAAW;GACpC,AAAIsD,MAEF,EAAO,cAAc;EACzB,CAAC;CACH,CAAC,GAEM;EAAE;EAAQ;EAAS;EAAM,eAhCV;GASpB,AARA5C,EAAQ,GACRnB,EAAe,GAAGF,GAAoB,QAAQ,GAC1CH,KAAW,IAAI,gBAAgBA,CAAS,GAC5CH,EAAM,cAAc,QAAQ,GAC5B,EAAM,eAAe,KAAA,GACrBiB,EAAK,IAAI,cAAc4C,CAAqB,GAC5C5C,EAAK,IAAI,mBAAmByC,CAA0B,GACtDzC,EAAK,IAAI,eAAe8C,CAAsB,GAC9C9C,EAAK,IAAI,qBAAqB;IAC5B,EAAM,YAAY,SAAS,MAAW;KACpC,AAAIsD,MAEF,EAAO,cAAc;IACzB,CAAC;GACH,CAAC;EACH;EAgByC;EAAO;EAAmB;EAAU;CAAS;AACxF"}
1
+ {"version":3,"file":"model-tv-video-BP-7HoDC.js","names":["CSS3DRenderPlugin","Image_Play_Icon_With_Text","THREE","DIRECTION","\"TOP_LEFT\"","\"TOP_RIGHT\"","\"BOTTOM_LEFT\"","\"BOTTOM_RIGHT\"","parseModelTVVideoPoints","points","newPoints","newPoint","point","ModelTVVideoPlugin","state","loadGeneration","pendingXHR","objectURL","playbackGeneration","session","playbackController","mediaManager","cancelPlayback","playAudible","next","muted","generation","video","operations","error","css3DRenderPlugin","five","playIconMap","setMuted","userAction","getMuted","enable","createPanoVideoMeshes","mesh","play","timeupdate","disable","geometry","verticesArray","i","uvArray","indicesArray","material","index","pointsForCss3DRender","dom3DContainer","playIcon","playIconImg","getImageTexture","texture","source","getVideoTexture","_video","xhr","url","createVideoTexture","resolve","reject","load","data","video_src","items","x","y","z","video_poster_src","videoElement","fiveWantsTapGesturehandler","targetMesh","raycaster","fiveModeChangeHandler","mode","fivePanoArrivedhandler","cameraPosition","center","vector","intersection","distance","visible","centerVector","meshes"],"sources":["../../src/ModelTVVideoPlugin/typings.ts","../../src/ModelTVVideoPlugin/utils/parseData.ts","../../src/ModelTVVideoPlugin/Plugin.ts"],"sourcesContent":["import type { PlaybackManager } from '../shared-utils/playback'\nexport interface ModelTVVideoPluginParameterType {\n mediaManager?: PlaybackManager\n videoElement?: HTMLVideoElement\n}\n\nexport enum DIRECTION {\n TOP_LEFT = 'topLeft',\n TOP_RIGHT = 'topRight',\n BOTTOM_LEFT = 'bottomLeft',\n BOTTOM_RIGHT = 'bottomRight',\n}\n\nexport interface Point {\n x: number\n y: number\n z: number\n}\n\nexport interface ModelTVVideoPluginData {\n enable?: boolean\n video_src: string\n video_poster_src: string\n points: Point[][] | Record<DIRECTION, Point>[]\n}\n\n// export interface ModelTVVideoPluginInnerData {\n// enable?: boolean\n// video_src: string\n// video_poster_src: string\n// points: Point[][]\n// }\n\nexport interface ModelTVVideoPluginExportType {\n enable: () => void\n disable: () => void\n load: (data: ModelTVVideoPluginData, videoElement?: HTMLVideoElement) => Promise<void>\n}\n","import type { Point } from '../typings'\nimport { DIRECTION } from '../typings'\n\nexport function parseModelTVVideoPoints(points: Point[][] | Record<DIRECTION, Point>[]): Point[][] {\n if (points.length === 0) return []\n if (Array.isArray(points[0])) return points as Point[][]\n let newPoints: Point[][] = []\n points.forEach((point) => {\n const newPoint: Point[] = [\n point[DIRECTION.TOP_LEFT],\n point[DIRECTION.BOTTOM_LEFT],\n point[DIRECTION.BOTTOM_RIGHT],\n point[DIRECTION.TOP_RIGHT],\n ]\n newPoints.push(newPoint)\n })\n\n return newPoints\n}\n","import { createVideoTexture } from '../shared-utils/three/loadVideoTexture'\nimport type { PlaybackSession } from '../shared-utils/playback'\nimport type { FivePlugin, Mode } from '@realsee/five-webgpu'\nimport type { ModelTVVideoPluginData, ModelTVVideoPluginExportType, ModelTVVideoPluginParameterType } from './typings'\nimport type { Create3DDomContainerReturnType } from '../CSS3DRenderPlugin'\nimport * as THREE from 'three/webgpu'\nimport { parseModelTVVideoPoints } from './utils/parseData'\nimport CSS3DRenderPlugin from '../CSS3DRenderPlugin'\nimport { Image_Play_Icon_With_Text } from '../PanoTagPlugin/Assets/Icon'\n\ntype ModelTVVideoPluginPoints = THREE.Vector3[][]\n\ninterface ModelTVVideoPluginState {\n videoMeshes: THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial>[]\n videoTextureEnabled: boolean\n videoSource: string\n rectPoints: ModelTVVideoPluginPoints\n enabled: boolean\n imageTexture?: THREE.Texture\n videoTexture?: THREE.VideoTexture\n videoElement?: HTMLVideoElement\n}\n\nexport const ModelTVVideoPlugin: FivePlugin<ModelTVVideoPluginParameterType, ModelTVVideoPluginExportType> = (five, { videoElement, mediaManager }) => {\n const state: ModelTVVideoPluginState = {\n videoMeshes: [],\n videoTextureEnabled: false,\n videoSource: '',\n rectPoints: [],\n enabled: false,\n videoElement: videoElement,\n }\n\n let loadGeneration = 0\n let pendingXHR: XMLHttpRequest | undefined\n let objectURL: string | undefined\n let playbackGeneration = 0\n let session: PlaybackSession | undefined\n const playbackController = mediaManager?.createController({ label: 'model-tv', onCancel: () => { playbackGeneration++; session = undefined } })\n const cancelPlayback = () => {\n playbackController?.cancel()\n playbackGeneration++\n session = undefined\n if (state.videoTexture) { state.videoTexture.image.muted = true; state.videoTexture.image.pause() }\n }\n const playAudible = async (userAction = false, muted = false) => {\n if (!state.videoTexture) return\n const next = playbackController?.begin({ userAction, audible: !muted })\n if (playbackController && !next) return\n session = next\n const generation = ++playbackGeneration\n const video = state.videoTexture.image as HTMLVideoElement\n const operations = next?.bind(video) ?? video\n operations.muted = muted\n try { await operations.play() } catch (error) {\n if (next?.signal.aborted || generation !== playbackGeneration || next !== session) return\n if ((error as Error).name === 'AbortError') { cancelPlayback(); return }\n cancelPlayback()\n throw error\n }\n }\n const css3DRenderPlugin = CSS3DRenderPlugin(five)\n\n const playIconMap = new Map<(typeof state)['videoMeshes'][number], Create3DDomContainerReturnType>()\n\n const setMuted = (muted: boolean, userAction = false) => {\n if (!state.videoTexture) return\n if (!muted) {\n if (!state.videoTexture.image.paused) return playAudible(userAction)\n const next = playbackController?.begin({ userAction, audible: true })\n if (playbackController && !next) return\n session = next\n }\n const video = state.videoTexture.image as HTMLVideoElement\n const operations = session?.bind(video) ?? video\n operations.muted = muted\n }\n const getMuted = () => {\n if (state.videoTexture) return state.videoTexture.image.muted\n else return true\n }\n\n const enable = () => {\n if (state.enabled) return\n if (!state.videoTexture) return\n\n state.enabled = true\n state.videoMeshes = createPanoVideoMeshes()\n state.videoMeshes.forEach((mesh) => five.scene.add(mesh))\n\n const play = () => {\n if (!state.enabled || !state.videoTexture) return\n\n const timeupdate = () => {\n if (!state.videoTexture) return\n state.videoTexture?.image.removeEventListener('timeupdate', timeupdate)\n state.videoTextureEnabled = true\n state.videoMeshes.forEach((mesh) => {\n if (mesh.material.map !== state.videoTexture) mesh.material.map = state.videoTexture!\n })\n five.needsRender = true\n }\n state.videoTexture.image.addEventListener('timeupdate', timeupdate)\n if (state.videoTexture && state.videoMeshes.length) {\n void playAudible(false, state.videoTexture.image.muted)\n state.videoTexture.image.onplay = () => {\n css3DRenderPlugin.hide()\n }\n state.videoTexture.image.onpause = () => {\n css3DRenderPlugin.show()\n }\n state.videoTexture.image.onclick = () => {\n playAudible(true)\n }\n }\n }\n\n if (five.model.loaded) play()\n else {\n return five.once('modelLoaded', () => play())\n }\n }\n\n const disable = () => {\n loadGeneration++\n pendingXHR?.abort()\n cancelPlayback()\n if (!state.enabled) return\n state.enabled = false\n state.videoMeshes.forEach((mesh) => {\n mesh.geometry.dispose()\n mesh.material.dispose()\n five.scene.remove(mesh)\n if (state.videoTexture) state.videoTexture.image.pause()\n })\n state.videoMeshes = []\n five.needsRender = true\n }\n\n const createPanoVideoMeshes = () => {\n return state.rectPoints.map((points, index) => {\n const geometry = new THREE.BufferGeometry()\n const segments = 128\n\n const verticesArray = []\n verticesArray.push(...points[0].toArray())\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n points[0].x + ((points[1].x - points[0].x) * i) / segments,\n points[0].y + ((points[1].y - points[0].y) * i) / segments,\n points[0].z + ((points[1].z - points[0].z) * i) / segments,\n )\n }\n verticesArray.push(...points[1].toArray())\n verticesArray.push(...points[2].toArray())\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n points[2].x + ((points[3].x - points[2].x) * i) / segments,\n points[2].y + ((points[3].y - points[2].y) * i) / segments,\n points[2].z + ((points[3].z - points[2].z) * i) / segments,\n )\n }\n verticesArray.push(...points[3].toArray())\n\n const uvArray = []\n uvArray.push(0, 1)\n for (let i = 1; i < segments; i++) {\n uvArray.push(0, 1 - i / segments)\n }\n uvArray.push(0, 0)\n uvArray.push(1, 0)\n for (let i = 1; i < segments; i++) {\n uvArray.push(1, i / segments)\n }\n uvArray.push(1, 1)\n\n const indicesArray = []\n for (let i = 0; i < segments; i++) {\n indicesArray.push(i, i + 1, segments * 2 - i, i, segments * 2 - i, segments * 2 + 1 - i)\n }\n geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(verticesArray), 3))\n geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvArray), 2))\n geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(indicesArray), 1))\n\n const material = new THREE.MeshBasicMaterial({\n map: state.videoTextureEnabled ? state.videoTexture : state.imageTexture,\n side: THREE.DoubleSide,\n })\n const mesh = new THREE.Mesh(geometry, material)\n mesh.renderOrder = 1\n mesh.name = `ModelTVVideoPlugin-${index}-${performance.now()}`\n\n const pointsForCss3DRender = [points[1], points[2], points[3], points[0]] // omg, 顺序竟然不一样\n\n // create play icon\n const dom3DContainer = css3DRenderPlugin.create3DDomContainer(pointsForCss3DRender)\n if (dom3DContainer?.container) {\n const playIcon = document.createElement('div')\n playIcon.classList.add('play-icon')\n playIcon.style.width = '100%'\n playIcon.style.height = '100%'\n playIcon.style.display = 'flex'\n playIcon.style.justifyContent = 'center'\n playIcon.style.alignItems = 'center'\n playIcon.style.pointerEvents = 'none'\n dom3DContainer.container.appendChild(playIcon)\n\n const playIconImg = document.createElement('img')\n playIconImg.src = Image_Play_Icon_With_Text\n playIconImg.style.width = '200px'\n playIconImg.style.pointerEvents = 'auto'\n playIconImg.onclick = () => {\n playAudible(true)\n }\n playIcon.appendChild(playIconImg)\n playIconMap.set(mesh, dom3DContainer)\n }\n return mesh\n })\n }\n\n const getImageTexture = (source: string) => {\n const texture = new THREE.TextureLoader().load(source)\n texture.minFilter = THREE.LinearFilter\n texture.magFilter = THREE.LinearFilter\n texture.colorSpace = THREE.SRGBColorSpace\n return texture\n }\n\n const getVideoTexture = (source: string, _video?: HTMLVideoElement): Promise<THREE.VideoTexture & { videoSource: string }> => {\n let video = _video\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n pendingXHR?.abort()\n pendingXHR = xhr\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n const url = window.URL || window.webkitURL\n video = video || document.createElement('video')\n video.crossOrigin = 'anonymous'\n // video.autoplay = true\n video.muted = true\n video.loop = true\n video.playsInline = true\n if (objectURL) URL.revokeObjectURL(objectURL)\n objectURL = url.createObjectURL(xhr.response)\n video.src = objectURL\n const texture = createVideoTexture(video)\n texture.minFilter = THREE.LinearFilter\n texture.magFilter = THREE.LinearFilter\n resolve(Object.assign(texture, { videoSource: source }))\n } else {\n reject(new Error('Video download Error: ' + xhr.status))\n }\n }\n }\n xhr.onerror = (error) => reject(error)\n xhr.onabort = () => reject(new DOMException('Video load canceled', 'AbortError'))\n xhr.open('GET', source)\n xhr.responseType = 'blob'\n xhr.send()\n })\n }\n\n const load = async (data: ModelTVVideoPluginData, videoElement?: HTMLVideoElement) => {\n const generation = ++loadGeneration\n cancelPlayback()\n const { video_src, video_poster_src, points } = data\n state.videoSource = video_src\n // TODO 存疑,先处理多一次遍历 o(2n)\n state.rectPoints = parseModelTVVideoPoints(points).map((items) => items.map(({ x, y, z }) => new THREE.Vector3(x, y, z)))\n state.imageTexture = getImageTexture(video_poster_src)\n\n if (videoElement) {\n state.videoElement = videoElement\n }\n\n let texture: THREE.VideoTexture & { videoSource: string }\n try { texture = await getVideoTexture(state.videoSource, state.videoElement) }\n catch (error) { if (generation !== loadGeneration) return; throw error }\n if (generation !== loadGeneration) { texture.dispose(); return }\n state.videoTexture = texture\n state.enabled = false\n if (data.enable) enable()\n }\n\n const fiveWantsTapGesturehandler = (raycaster): false | void => {\n if (!state.enabled) return\n const targetMesh = state.videoMeshes\n if (!targetMesh) return\n const intersectObjects = raycaster.intersectObjects(targetMesh)\n if (intersectObjects.length === 0) return\n if (state.videoTexture) {\n if (!state.videoTexture.image.paused) {\n cancelPlayback()\n }\n }\n return false\n }\n\n const fiveModeChangeHandler = (mode: Mode) => {\n if (mode === 'Floorplan') {\n css3DRenderPlugin.hide()\n } else {\n css3DRenderPlugin.show()\n }\n }\n\n const fivePanoArrivedhandler = () => {\n if (!state.enabled) return\n const cameraPosition = five.camera.position\n playIconMap.forEach((dom3DContainer, mesh) => {\n const center = dom3DContainer.css3DObject.position.clone()\n const vector = center.clone().sub(cameraPosition).normalize()\n const raycaster = new THREE.Raycaster(cameraPosition, vector)\n const intersection = five.model.intersectRaycaster(raycaster)[0]\n const distance = center.distanceTo(cameraPosition)\n const distanceError = 0.01\n if (intersection && intersection.distance + distanceError < distance) {\n // 不可见\n dom3DContainer.hide()\n } else {\n // 可见\n dom3DContainer.show()\n }\n })\n if (!getMuted()) {\n const visible = state.rectPoints.find((points) => {\n const centerVector = points[0].clone().add(points[1]).add(points[2]).add(points[3]).divideScalar(4)\n return (\n points\n .map((point) => point.clone().add(centerVector).divideScalar(2))\n .filter((vector) => {\n const distance = vector.distanceTo(cameraPosition)\n const raycaster = new THREE.Raycaster(cameraPosition, vector.clone().sub(cameraPosition).normalize())\n const intersection = five.model.intersectRaycaster(raycaster)[0]\n const distanceError = 0.01\n if (intersection && intersection.distance + distanceError < distance) {\n return false\n } else {\n return true\n }\n }).length >= 2\n )\n })\n if (!visible || visible.length === 0) setMuted(true)\n }\n }\n\n const dispose = () => {\n disable()\n cancelPlayback(); playbackController?.dispose()\n if (objectURL) URL.revokeObjectURL(objectURL)\n state.videoTexture?.dispose()\n state.videoTexture = undefined\n five.off('modeChange', fiveModeChangeHandler)\n five.off('wantsTapGesture', fiveWantsTapGesturehandler)\n five.off('panoArrived', fivePanoArrivedhandler)\n five.off('renderFrame', () => {\n state.videoMeshes.forEach((meshes) => {\n if (meshes)\n // @ts-ignore\n meshes.needsRender = true\n })\n })\n }\n\n five.on('modeChange', fiveModeChangeHandler)\n\n five.on('wantsTapGesture', fiveWantsTapGesturehandler)\n\n five.on('panoArrived', fivePanoArrivedhandler)\n\n five.on('renderFrame', () => {\n state.videoMeshes.forEach((meshes) => {\n if (meshes)\n // @ts-ignore\n meshes.needsRender = true\n })\n })\n\n return { enable, disable, load, dispose, state, css3DRenderPlugin, setMuted, getMuted }\n}\n\nexport default ModelTVVideoPlugin\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./Subscribe-DLlAl88n.js";
2
2
  import { t } from "./StandaloneRenderer-Jo60ASPd.js";
3
- import { t as n } from "./boundingBox-DvCor5Hd.js";
3
+ import { n } from "./boundingBox-CIqXgNXW.js";
4
4
  import * as r from "three/webgpu";
5
5
  import { Camera as i, loadAt3d as a } from "@realsee/five-webgpu";
6
6
  //#region src/ModelViewPlugin/Plugin.ts
@@ -116,4 +116,4 @@ var o = (o, s) => {
116
116
  //#endregion
117
117
  export { o as t };
118
118
 
119
- //# sourceMappingURL=model-view-CBeeMM98.js.map
119
+ //# sourceMappingURL=model-view-BWUU0-uq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-view-CBeeMM98.js","names":["Subscribe","Subscribe$1","boundingBox","THREE","ModelViewPlugin","hooks","enabled","params","hasModelLoaded","loading","disposed","loadGeneration","disposeModelResources","needsRender","renderer","config","scene","camera","Camera","model","distance","offset","light","loadModel","work","five","fileUrl","textureBaseUrl","textureArrayUrl","generation","result","loadAt3d","_bounding","bounding","radius","_distance","update","error","initRendererIfNeeds","StandaloneRenderer","handleFiveWillLoad","handleFiveLoaded","enable","disable","render","appendTo","element","refresh","size","positionType","container","width","height","pose","dispose","userConfig"],"sources":["../../src/ModelViewPlugin/Plugin.ts"],"sourcesContent":["import type { PartialDeep } from 'type-fest'\nimport type { Fetcher, FivePlugin , Five} from '@realsee/five-webgpu'\nimport { Camera, loadAt3d } from '@realsee/five-webgpu'\nimport { Subscribe } from '../shared-utils/Subscribe'\nimport { boundingBox } from '../shared-utils'\nimport * as THREE from 'three/webgpu'\nimport { StandaloneRenderer } from '../shared-utils/rendering/StandaloneRenderer'\n\nexport interface Config {\n lookAtCurrentCamera: boolean\n lockedPanoIndex: number | null\n lockedLatitude: number | null\n lockedLongitude: number | null\n fetcher?: Fetcher | undefined\n}\n\nexport interface ModelViewPluginExportType {\n dispose: () => void\n enable: () => void\n\n disable: () => void\n\n hooks: Subscribe<{ loaded: () => void; willLoad: () => void }>\n\n getCurrentState: () => { enabled: boolean }\n\n appendTo: (element: HTMLElement, size?: { width?: number; height?: number }) => void\n\n refresh: (size?: { width?: number; height?: number }) => void\n\n changeConfigs: (config: Partial<Config>) => void\n}\n\nexport interface ModelViewPluginParameterType {\n config: Config\n initialState: { enabled: boolean }\n}\n\n/**\n * Five 模型插件\n * @template ExportType 导出方法\n */\nexport const ModelViewPlugin: FivePlugin<PartialDeep<ModelViewPluginParameterType> | undefined, ModelViewPluginExportType> = (\n five: Five,\n params,\n) => {\n const hooks = new Subscribe<{ loaded: () => void; willLoad: () => void }>()\n let enabled = params?.initialState?.enabled ?? true\n let hasModelLoaded = false\n let loading = false\n let disposed = false\n let loadGeneration = 0\n let disposeModelResources: (() => void) | undefined\n let needsRender = true\n let renderer: StandaloneRenderer | null = null\n\n const defaultConfig: Config = {\n lookAtCurrentCamera: false,\n lockedPanoIndex: null,\n lockedLatitude: null,\n lockedLongitude: null,\n }\n\n // @ts-ignore\n const config: Config = { ...defaultConfig, ...params?.config }\n\n const scene = new THREE.Scene()\n const camera = new Camera(60)\n camera.near = 1\n camera.updateTime(Date.now())\n\n let model = new THREE.Object3D()\n let distance: number | undefined\n let offset: THREE.Vector3 | undefined\n\n {\n const light = new THREE.DirectionalLight(0xffffff, 0.5)\n light.position.copy(new THREE.Vector3(1, 1, 1))\n scene.add(light)\n }\n {\n const light = new THREE.DirectionalLight(0xffffff, 0.3)\n scene.add(light)\n }\n {\n const light = new THREE.AmbientLight(0xffffff, 0.3)\n scene.add(light)\n }\n\n scene.add(model)\n\n const loadModel = async () => {\n if (disposed || loading || hasModelLoaded) return\n const work = five.work\n if (!work?.model?.file) return\n\n scene.remove(model)\n\n const fileUrl = work.getURL(work.model.file)\n const textureBaseUrl = work.getURL(work.model.textureBase)\n const textureArrayUrl = [...(work.model.textures || [])]\n if (!fileUrl || !textureBaseUrl || !textureArrayUrl) {\n return\n }\n\n loading = true\n const generation = ++loadGeneration\n try {\n const result = await loadAt3d(fileUrl, {\n textureOptions: { size: 128, quality: 70 },\n textureArray: textureArrayUrl,\n textureBaseUri: textureBaseUrl,\n fetcher: config.fetcher ?? undefined,\n })\n if (disposed || generation !== loadGeneration) {\n result.dispose()\n return\n }\n model = result.scene\n model.rotateX(-Math.PI / 2)\n disposeModelResources = result.dispose\n\n const _bounding = boundingBox(model)\n const bounding = new THREE.Box3()\n bounding.expandByPoint(new THREE.Vector3(_bounding.min.x, _bounding.min.z, -_bounding.min.y))\n bounding.expandByPoint(new THREE.Vector3(_bounding.max.x, _bounding.max.z, -_bounding.max.y))\n\n const radius = Math.pow(\n Math.pow(bounding.max.x - bounding.min.x + 1, 2) +\n Math.pow(bounding.max.y - bounding.min.y + 1, 2) +\n Math.pow(bounding.max.z - bounding.min.z + 1, 2),\n 1 / 2,\n )\n let _distance = radius / 2 / Math.tan((Math.PI * camera.fov) / 360)\n if (camera.aspect < 1) _distance /= camera.aspect\n\n distance = isNaN(_distance) ? radius : _distance\n offset = bounding.getCenter(new THREE.Vector3())\n\n scene.add(model)\n hasModelLoaded = true\n\n hooks.emit('loaded')\n update()\n five.needsRender = true\n } catch (error) {\n if (!disposed && generation === loadGeneration) console.error('ModelViewPlugin: Failed to load model', error)\n } finally {\n if (generation === loadGeneration) loading = false\n }\n }\n\n if (enabled) loadModel()\n\n const initRendererIfNeeds = () => {\n if (disposed || !five.renderer) return\n if (!renderer) {\n renderer = new StandaloneRenderer({ antialias: false, onReady: () => {\n needsRender = true\n five.needsRender = true\n } })\n renderer.setPixelRatio(five.renderer.getPixelRatio())\n renderer.setClearColor(0x181a1c, 0)\n }\n return renderer\n }\n\n const handleFiveWillLoad = () => {\n loadGeneration += 1\n loading = false\n disposeModelResources?.()\n disposeModelResources = undefined\n scene.remove(model)\n model = new THREE.Object3D()\n scene.add(model)\n hasModelLoaded = false\n distance = undefined\n offset = undefined\n hooks.emit('willLoad')\n update()\n }\n\n const handleFiveLoaded = () => {\n if (disposed || !enabled) return\n if (hasModelLoaded) return\n loadModel()\n }\n\n const enable = () => {\n if (disposed || enabled) return\n\n enabled = true\n scene.add(model)\n\n if (!hasModelLoaded && five.work?.model?.file) {\n loadModel()\n }\n\n update()\n }\n\n const disable = () => {\n if (disposed || !enabled) return\n\n scene.remove(model)\n needsRender = true\n render()\n\n enabled = false\n }\n\n const appendTo = (element: HTMLElement, size: { width?: number; height?: number } = {}) => {\n const renderer = initRendererIfNeeds()\n if (!renderer) return\n element.appendChild(renderer.domElement)\n refresh(size)\n const positionType = window.getComputedStyle(element).position\n if (positionType !== 'relative' && positionType !== 'absolute' && positionType !== 'fixed' && positionType !== 'sticky')\n element.style.position = 'relative'\n }\n\n const refresh = (size: { width?: number; height?: number } = {}) => {\n if (disposed || !renderer) return\n const element = renderer.domElement\n const container = element.parentNode as HTMLElement\n if (container?.nodeName) {\n const { width = container.offsetWidth, height = container.offsetHeight } = size\n renderer.setSize(width, height)\n // 修改摄像机 aspect 比值\n camera.aspect = width / height\n camera.updateProjectionMatrix()\n }\n\n update()\n }\n\n const update = () => {\n if (disposed || !enabled) return\n if (!distance || !offset) return\n const pose = five.getPose()\n pose.fov = camera.fov\n pose.offset = offset\n pose.distance = distance\n if (typeof config.lockedLatitude === 'number') pose.latitude = config.lockedLatitude\n if (typeof config.lockedLongitude === 'number') pose.longitude = config.lockedLongitude\n if (typeof config.lockedPanoIndex === 'number') {\n pose.offset = five.work.observers[config.lockedPanoIndex].standingPosition.clone()\n }\n if (config.lookAtCurrentCamera) pose.offset = five.camera.position.clone().setY(five.camera.position.y + 1)\n camera.setFromPose(pose)\n needsRender = true\n }\n\n const render = () => {\n if (disposed || !enabled) return\n if (needsRender !== true) return\n if (!renderer) return\n if (!renderer.domElement.parentNode) return\n const parentNode = renderer.domElement.parentNode as HTMLElement\n if (parentNode.offsetWidth === 0) return\n if (renderer.render(scene, camera)) needsRender = false\n }\n\n const dispose = () => {\n if (disposed) return\n disposed = true\n loadGeneration += 1\n disposeModelResources?.()\n disposeModelResources = undefined\n scene.remove(model)\n if (renderer) {\n renderer.dispose()\n renderer.domElement.remove()\n }\n renderer = null\n five.off('loaded', handleFiveLoaded)\n five.off('willLoad', handleFiveWillLoad)\n five.off('cameraDirectionUpdate', update)\n five.off('dispose', dispose)\n five.off('renderFrame', render)\n five.off('cameraPositionUpdate', update)\n hooks.off()\n }\n\n const changeConfigs = (userConfig: Partial<Config>) => {\n Object.assign(config, userConfig)\n update()\n }\n\n const getCurrentState = () => ({\n enabled,\n })\n\n five.on('loaded', handleFiveLoaded)\n five.on('willLoad', handleFiveWillLoad)\n five.on('cameraDirectionUpdate', update)\n five.on('dispose', dispose)\n five.on('renderFrame', render)\n five.on('cameraPositionUpdate', update)\n\n return { appendTo, refresh, changeConfigs, enable, disable, dispose, getCurrentState, hooks }\n}\n\nexport default ModelViewPlugin\n"],"mappings":"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"}
1
+ {"version":3,"file":"model-view-BWUU0-uq.js","names":["Subscribe","Subscribe$1","THREE","ModelViewPlugin","hooks","enabled","params","hasModelLoaded","loading","disposed","loadGeneration","disposeModelResources","needsRender","renderer","config","scene","camera","Camera","model","distance","offset","light","loadModel","work","five","fileUrl","textureBaseUrl","textureArrayUrl","generation","result","loadAt3d","_bounding","boundingBox","bounding","radius","_distance","update","error","initRendererIfNeeds","StandaloneRenderer","handleFiveWillLoad","handleFiveLoaded","enable","disable","render","appendTo","element","refresh","size","positionType","container","width","height","pose","dispose","userConfig"],"sources":["../../src/ModelViewPlugin/Plugin.ts"],"sourcesContent":["import type { PartialDeep } from 'type-fest'\nimport type { Fetcher, FivePlugin , Five} from '@realsee/five-webgpu'\nimport { Camera, loadAt3d } from '@realsee/five-webgpu'\nimport { Subscribe } from '../shared-utils/Subscribe'\nimport { boundingBox } from '../shared-utils'\nimport * as THREE from 'three/webgpu'\nimport { StandaloneRenderer } from '../shared-utils/rendering/StandaloneRenderer'\n\nexport interface Config {\n lookAtCurrentCamera: boolean\n lockedPanoIndex: number | null\n lockedLatitude: number | null\n lockedLongitude: number | null\n fetcher?: Fetcher | undefined\n}\n\nexport interface ModelViewPluginExportType {\n dispose: () => void\n enable: () => void\n\n disable: () => void\n\n hooks: Subscribe<{ loaded: () => void; willLoad: () => void }>\n\n getCurrentState: () => { enabled: boolean }\n\n appendTo: (element: HTMLElement, size?: { width?: number; height?: number }) => void\n\n refresh: (size?: { width?: number; height?: number }) => void\n\n changeConfigs: (config: Partial<Config>) => void\n}\n\nexport interface ModelViewPluginParameterType {\n config: Config\n initialState: { enabled: boolean }\n}\n\n/**\n * Five 模型插件\n * @template ExportType 导出方法\n */\nexport const ModelViewPlugin: FivePlugin<PartialDeep<ModelViewPluginParameterType> | undefined, ModelViewPluginExportType> = (\n five: Five,\n params,\n) => {\n const hooks = new Subscribe<{ loaded: () => void; willLoad: () => void }>()\n let enabled = params?.initialState?.enabled ?? true\n let hasModelLoaded = false\n let loading = false\n let disposed = false\n let loadGeneration = 0\n let disposeModelResources: (() => void) | undefined\n let needsRender = true\n let renderer: StandaloneRenderer | null = null\n\n const defaultConfig: Config = {\n lookAtCurrentCamera: false,\n lockedPanoIndex: null,\n lockedLatitude: null,\n lockedLongitude: null,\n }\n\n // @ts-ignore\n const config: Config = { ...defaultConfig, ...params?.config }\n\n const scene = new THREE.Scene()\n const camera = new Camera(60)\n camera.near = 1\n camera.updateTime(Date.now())\n\n let model = new THREE.Object3D()\n let distance: number | undefined\n let offset: THREE.Vector3 | undefined\n\n {\n const light = new THREE.DirectionalLight(0xffffff, 0.5)\n light.position.copy(new THREE.Vector3(1, 1, 1))\n scene.add(light)\n }\n {\n const light = new THREE.DirectionalLight(0xffffff, 0.3)\n scene.add(light)\n }\n {\n const light = new THREE.AmbientLight(0xffffff, 0.3)\n scene.add(light)\n }\n\n scene.add(model)\n\n const loadModel = async () => {\n if (disposed || loading || hasModelLoaded) return\n const work = five.work\n if (!work?.model?.file) return\n\n scene.remove(model)\n\n const fileUrl = work.getURL(work.model.file)\n const textureBaseUrl = work.getURL(work.model.textureBase)\n const textureArrayUrl = [...(work.model.textures || [])]\n if (!fileUrl || !textureBaseUrl || !textureArrayUrl) {\n return\n }\n\n loading = true\n const generation = ++loadGeneration\n try {\n const result = await loadAt3d(fileUrl, {\n textureOptions: { size: 128, quality: 70 },\n textureArray: textureArrayUrl,\n textureBaseUri: textureBaseUrl,\n fetcher: config.fetcher ?? undefined,\n })\n if (disposed || generation !== loadGeneration) {\n result.dispose()\n return\n }\n model = result.scene\n model.rotateX(-Math.PI / 2)\n disposeModelResources = result.dispose\n\n const _bounding = boundingBox(model)\n const bounding = new THREE.Box3()\n bounding.expandByPoint(new THREE.Vector3(_bounding.min.x, _bounding.min.z, -_bounding.min.y))\n bounding.expandByPoint(new THREE.Vector3(_bounding.max.x, _bounding.max.z, -_bounding.max.y))\n\n const radius = Math.pow(\n Math.pow(bounding.max.x - bounding.min.x + 1, 2) +\n Math.pow(bounding.max.y - bounding.min.y + 1, 2) +\n Math.pow(bounding.max.z - bounding.min.z + 1, 2),\n 1 / 2,\n )\n let _distance = radius / 2 / Math.tan((Math.PI * camera.fov) / 360)\n if (camera.aspect < 1) _distance /= camera.aspect\n\n distance = isNaN(_distance) ? radius : _distance\n offset = bounding.getCenter(new THREE.Vector3())\n\n scene.add(model)\n hasModelLoaded = true\n\n hooks.emit('loaded')\n update()\n five.needsRender = true\n } catch (error) {\n if (!disposed && generation === loadGeneration) console.error('ModelViewPlugin: Failed to load model', error)\n } finally {\n if (generation === loadGeneration) loading = false\n }\n }\n\n if (enabled) loadModel()\n\n const initRendererIfNeeds = () => {\n if (disposed || !five.renderer) return\n if (!renderer) {\n renderer = new StandaloneRenderer({ antialias: false, onReady: () => {\n needsRender = true\n five.needsRender = true\n } })\n renderer.setPixelRatio(five.renderer.getPixelRatio())\n renderer.setClearColor(0x181a1c, 0)\n }\n return renderer\n }\n\n const handleFiveWillLoad = () => {\n loadGeneration += 1\n loading = false\n disposeModelResources?.()\n disposeModelResources = undefined\n scene.remove(model)\n model = new THREE.Object3D()\n scene.add(model)\n hasModelLoaded = false\n distance = undefined\n offset = undefined\n hooks.emit('willLoad')\n update()\n }\n\n const handleFiveLoaded = () => {\n if (disposed || !enabled) return\n if (hasModelLoaded) return\n loadModel()\n }\n\n const enable = () => {\n if (disposed || enabled) return\n\n enabled = true\n scene.add(model)\n\n if (!hasModelLoaded && five.work?.model?.file) {\n loadModel()\n }\n\n update()\n }\n\n const disable = () => {\n if (disposed || !enabled) return\n\n scene.remove(model)\n needsRender = true\n render()\n\n enabled = false\n }\n\n const appendTo = (element: HTMLElement, size: { width?: number; height?: number } = {}) => {\n const renderer = initRendererIfNeeds()\n if (!renderer) return\n element.appendChild(renderer.domElement)\n refresh(size)\n const positionType = window.getComputedStyle(element).position\n if (positionType !== 'relative' && positionType !== 'absolute' && positionType !== 'fixed' && positionType !== 'sticky')\n element.style.position = 'relative'\n }\n\n const refresh = (size: { width?: number; height?: number } = {}) => {\n if (disposed || !renderer) return\n const element = renderer.domElement\n const container = element.parentNode as HTMLElement\n if (container?.nodeName) {\n const { width = container.offsetWidth, height = container.offsetHeight } = size\n renderer.setSize(width, height)\n // 修改摄像机 aspect 比值\n camera.aspect = width / height\n camera.updateProjectionMatrix()\n }\n\n update()\n }\n\n const update = () => {\n if (disposed || !enabled) return\n if (!distance || !offset) return\n const pose = five.getPose()\n pose.fov = camera.fov\n pose.offset = offset\n pose.distance = distance\n if (typeof config.lockedLatitude === 'number') pose.latitude = config.lockedLatitude\n if (typeof config.lockedLongitude === 'number') pose.longitude = config.lockedLongitude\n if (typeof config.lockedPanoIndex === 'number') {\n pose.offset = five.work.observers[config.lockedPanoIndex].standingPosition.clone()\n }\n if (config.lookAtCurrentCamera) pose.offset = five.camera.position.clone().setY(five.camera.position.y + 1)\n camera.setFromPose(pose)\n needsRender = true\n }\n\n const render = () => {\n if (disposed || !enabled) return\n if (needsRender !== true) return\n if (!renderer) return\n if (!renderer.domElement.parentNode) return\n const parentNode = renderer.domElement.parentNode as HTMLElement\n if (parentNode.offsetWidth === 0) return\n if (renderer.render(scene, camera)) needsRender = false\n }\n\n const dispose = () => {\n if (disposed) return\n disposed = true\n loadGeneration += 1\n disposeModelResources?.()\n disposeModelResources = undefined\n scene.remove(model)\n if (renderer) {\n renderer.dispose()\n renderer.domElement.remove()\n }\n renderer = null\n five.off('loaded', handleFiveLoaded)\n five.off('willLoad', handleFiveWillLoad)\n five.off('cameraDirectionUpdate', update)\n five.off('dispose', dispose)\n five.off('renderFrame', render)\n five.off('cameraPositionUpdate', update)\n hooks.off()\n }\n\n const changeConfigs = (userConfig: Partial<Config>) => {\n Object.assign(config, userConfig)\n update()\n }\n\n const getCurrentState = () => ({\n enabled,\n })\n\n five.on('loaded', handleFiveLoaded)\n five.on('willLoad', handleFiveWillLoad)\n five.on('cameraDirectionUpdate', update)\n five.on('dispose', dispose)\n five.on('renderFrame', render)\n five.on('cameraPositionUpdate', update)\n\n return { appendTo, refresh, changeConfigs, enable, disable, dispose, getCurrentState, hooks }\n}\n\nexport default ModelViewPlugin\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { t as e } from "./Controller-D6o4OGWJ.js";
2
+ //#region src/Object3DHelperPlugin/index.ts
3
+ var t = (t) => new e(t);
4
+ //#endregion
5
+ export { t };
6
+
7
+ //# sourceMappingURL=object3d-helper-CbRRhnLV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"object3d-helper-DDYsVPN6.js","names":["Object3DHelperController","Object3DHelperPlugin","five"],"sources":["../../src/Object3DHelperPlugin/index.ts"],"sourcesContent":["export type { HelperOffset, Color, ClassFunctionParameters, PositionFrom, ObjectHelperControllers, ScaleCallback, ScalePosition, Scissor, Direction, Direction4, HelperEventMap, InternalHelperEventMap, Object3DHelperState, Object3DHelperEventMap } from '../shared-utils/Object3DHelper/typings'\nexport { PLUGIN, Object3DHelperController } from './Controller'\nexport type { AddObject3DHelperConfig } from './Controller'\nimport type { Five, FivePlugin } from '@realsee/five-webgpu'\nimport { Object3DHelperController } from './Controller'\n\nexport const Object3DHelperPlugin: FivePlugin<void, InstanceType<typeof Object3DHelperController>> = (five: Five) =>\n new Object3DHelperController(five)\n\nexport default Object3DHelperPlugin\n"],"mappings":";;AAMA,IAAaC,KAAyF,MACpG,IAAID,EAAyBE,CAAI"}
1
+ {"version":3,"file":"object3d-helper-CbRRhnLV.js","names":["Object3DHelperController","Object3DHelperPlugin","five"],"sources":["../../src/Object3DHelperPlugin/index.ts"],"sourcesContent":["export type { HelperOffset, Color, ClassFunctionParameters, PositionFrom, ObjectHelperControllers, ScaleCallback, ScalePosition, Scissor, Direction, Direction4, HelperEventMap, InternalHelperEventMap, Object3DHelperState, Object3DHelperEventMap } from '../shared-utils/Object3DHelper/typings'\nexport { PLUGIN, Object3DHelperController } from './Controller'\nexport type { AddObject3DHelperConfig } from './Controller'\nimport type { Five, FivePlugin } from '@realsee/five-webgpu'\nimport { Object3DHelperController } from './Controller'\n\nexport const Object3DHelperPlugin: FivePlugin<void, InstanceType<typeof Object3DHelperController>> = (five: Five) =>\n new Object3DHelperController(five)\n\nexport default Object3DHelperPlugin\n"],"mappings":";;AAMA,IAAaC,KAAyF,MACpG,IAAID,EAAyBE,CAAI"}
@@ -1,8 +1,8 @@
1
1
  import { n as e } from "./loadTexture-CJ3EbTXw.js";
2
- import { l as t, r as n } from "./defaultUrls-CjKkS9k9.js";
3
- import { n as r } from "./BetterTween-BX0aTvP1.js";
4
- import { t as i } from "./CSS3DRenderPlugin-ccSpcvwd.js";
5
- import { t as a } from "./BasePluginWithData-9z4tpAT4.js";
2
+ import { i as t, u as n } from "./defaultUrls-CfMtGzqM.js";
3
+ import { n as r } from "./BetterTween-DmptqE8m.js";
4
+ import { t as i } from "./CSS3DRenderPlugin-CEatgl0m.js";
5
+ import { t as a } from "./BasePluginWithData-D_0W46_q.js";
6
6
  import * as o from "three/webgpu";
7
7
  import { Five as s } from "@realsee/five-webgpu";
8
8
  //#region src/PanoCompassPlugin/Assets/roomInfoIcon.ts
@@ -36,8 +36,8 @@ var u = { userAction: !0 }, d = class extends a {
36
36
  visible: !0,
37
37
  enabled: !0,
38
38
  config: {
39
- compassImageUrl: t,
40
- entryDoorImageUrl: n
39
+ compassImageUrl: n,
40
+ entryDoorImageUrl: t
41
41
  }
42
42
  };
43
43
  data;
@@ -190,4 +190,4 @@ var u = { userAction: !0 }, d = class extends a {
190
190
  //#endregion
191
191
  export { f as t };
192
192
 
193
- //# sourceMappingURL=pano-compass-jSr629BP.js.map
193
+ //# sourceMappingURL=pano-compass-BRTM0dCc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pano-compass-jSr629BP.js","names":["BasePlugin.Controller","loadTexture","PANO_COMPASS_DEFAULT_IMAGE","ENTRY_DOOR_DEFAULT_IMAGE","tweenProgress","CSS3DRenderPlugin","Controller","THREE","roomInfoIcon","getRoomInfoInstance","infoDom","iconDom","textDom","room","defaultBaseOptions","PanoCompassController","five","config","options","prevState","state","nextData","data","serverData","northRad","entrance","compassImageUrl","compassTexture","compassGeometry","compassMaterial","compassMesh","url","texture","geometry","material","mesh","entryDoorImageUrl","entryDoorTexture","entryDoorGeometry","entryDoorMaterial","entryDoorMesh","points","panoIndex","standingPosition","progress","panoToEntryDoorVector","compassEntryDoorPosition","longitude","latitude","mode","prevMode","Five","PanoCompassPlugin"],"sources":["../../src/PanoCompassPlugin/Assets/roomInfoIcon.ts","../../src/PanoCompassPlugin/getRoomInfoInstance.ts","../../src/PanoCompassPlugin/Controller.ts","../../src/PanoCompassPlugin/index.ts"],"sourcesContent":["export const roomInfoIcon =\n 'data:image/png;base64,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'\n","import type { FloorplanServerRoomItem } from '../floorplan/typings/floorplanServerData'\nimport { roomInfoIcon } from './Assets/roomInfoIcon'\n\nexport function getRoomInfoInstance() {\n const infoDom = document.createElement('div')\n const iconDom = document.createElement('i')\n const textDom = document.createElement('span')\n infoDom.appendChild(iconDom)\n infoDom.appendChild(textDom)\n // infoDom style\n infoDom.style.position = 'relative'\n infoDom.style.width = '100%'\n infoDom.style.display = 'flex'\n infoDom.style.flexDirection = 'column'\n infoDom.style.alignItems = 'center'\n infoDom.style.marginTop = `${150 / 16}rem`\n infoDom.style.opacity = '0'\n infoDom.style.transition = 'opacity 1000ms linear'\n // iconDom style\n iconDom.style.display = 'block'\n iconDom.style.width = `${134 / 16}rem`\n iconDom.style.height = `${22 / 16}rem`\n iconDom.style.backgroundSize = '100%'\n iconDom.style.backgroundRepeat = 'no-repeat'\n iconDom.style.backgroundImage = `url(${roomInfoIcon})`\n textDom.style.marginTop = `${10 / 16}rem`\n // textDom style\n textDom.style.fontSize = `${16 / 16}rem`\n textDom.style.color = '#fff'\n textDom.style.opacity = '0.7'\n textDom.style.textShadow = '0 2px 16px rgb(22 34 83 / 24%)'\n textDom.style.fontWeight = 'bold'\n\n return {\n appendTo(element: Element) {\n element.appendChild(infoDom)\n },\n dispose() {\n infoDom.remove()\n },\n setRoom(room: FloorplanServerRoomItem) {\n textDom.innerHTML = room.name + ' ' + Math.floor(room.size / 1000000) + '㎡'\n },\n show() {\n infoDom.style.opacity = '1'\n },\n hide() {\n infoDom.style.opacity = '0'\n }\n }\n}\n","import * as THREE from 'three/webgpu'\nimport type { Mode, Pose } from '@realsee/five-webgpu'\nimport type { BaseOptions } from '../base/BasePlugin'\nimport type { CSS3DRenderPluginExportType } from '../CSS3DRenderPlugin'\nimport { Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { getRoomInfoInstance } from './getRoomInfoInstance'\nimport { loadTexture } from '../shared-utils/three/loadTexture'\nimport CSS3DRenderPlugin from '../CSS3DRenderPlugin'\nimport type { BetterTween } from '../shared-utils/animationFrame/BetterTween'\nimport { tweenProgress } from '../shared-utils/animationFrame/BetterTween'\n\nimport type { EventMap, PanoCompassPluginData, PanoCompassPluginParameterType, PluginData, PluginServerData, State } from './typings'\nimport { ENTRY_DOOR_DEFAULT_IMAGE, PANO_COMPASS_DEFAULT_IMAGE } from '../shared-utils/url/defaultUrls'\n\nconst defaultBaseOptions: Required<BaseOptions> = { userAction: true }\n\nexport class PanoCompassController extends BasePlugin.Controller<State, EventMap, PluginServerData, PluginData> {\n /**\n * 默认状态\n */\n public state: State = {\n visible: true,\n enabled: true,\n config: {\n /**\n * @todo 图片转base64\n */\n compassImageUrl: PANO_COMPASS_DEFAULT_IMAGE,\n entryDoorImageUrl: ENTRY_DOOR_DEFAULT_IMAGE,\n },\n }\n public data?: PanoCompassPluginData\n private group = new THREE.Group()\n private roomInfoInstance?: ReturnType<typeof getRoomInfoInstance>\n private roomInfoWrapperInstance?: ReturnType<CSS3DRenderPluginExportType['create3DDomContainer']>\n private compassMeshTween?: BetterTween<{ progress: number }>\n private compassMesh?: THREE.Mesh<THREE.CircleGeometry, THREE.MeshBasicMaterial>\n private logoMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n private logoMeshTween?: BetterTween<{ progress: number }>\n private entryDoorMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n\n public constructor(five: Five, config?: PanoCompassPluginParameterType) {\n super(five, config)\n this.five.scene.add(this.group)\n this.five.once('dispose', this.dispose)\n this.setState({\n visible: true,\n enabled: true,\n config: {\n ...this.state.config,\n ...(config || {}),\n },\n })\n }\n\n /**\n * 启用插件,响应用户操作并展示UI\n * @param options\n */\n public enable(options: Required<BaseOptions> = defaultBaseOptions): void {\n this.setState(\n {\n enabled: true,\n },\n options,\n )\n }\n\n /**\n * 禁用插件,禁止响应用户操作并隐藏UI\n * @param options\n */\n public disable(options: Required<BaseOptions> = defaultBaseOptions): void {\n this.setState(\n {\n enabled: false,\n },\n options,\n )\n }\n\n /**\n * 展示UI\n * @param options\n * @returns\n * @todo 需要考虑动画\n */\n public show(options: Required<BaseOptions> = defaultBaseOptions): Promise<void> {\n if (!this.state.enabled) return\n this.setState(\n {\n visible: true,\n },\n options,\n )\n return Promise.resolve()\n }\n\n /**\n * 隐藏UI\n * @param options\n * @returns\n * @todo 需要考虑动画\n */\n public hide(options: Required<BaseOptions> = defaultBaseOptions): Promise<void> {\n if (!this.state.enabled) return\n this.setState(\n {\n visible: false,\n },\n options,\n )\n return Promise.resolve()\n }\n\n public setState(state: Partial<State>, options: Required<BaseOptions> = { userAction: true }): void {\n const prevState = JSON.parse(JSON.stringify(this.state))\n this.state = {\n visible: state.visible ?? prevState.visible,\n enabled: state.enabled ?? prevState.enabled,\n config: { ...prevState.config, ...(state.config || {}) },\n }\n this.hooks.emit('stateChange', {\n state: this.state,\n prevState,\n userAction: options.userAction,\n })\n\n if (state.enabled === true) {\n this._enable()\n this.hooks.emit('enable', options)\n }\n if (state.enabled === false) {\n this._disable()\n this.hooks.emit('disable', options)\n }\n\n if (state.visible === false) {\n this._toggleVisible()\n this.hooks.emit('hide', options)\n }\n\n if (state.visible === true) {\n this._toggleVisible()\n this.hooks.emit('show', options)\n }\n\n /**\n * @todo config变化不应该重新初始化,需要做精准的替换\n */\n if (state.config) {\n this.init()\n }\n }\n\n public async load(data: PluginServerData | PluginData, state?: State, userAction = true) {\n const nextData = await this.formatData(data)\n if (JSON.stringify(this.data) !== JSON.stringify(nextData)) {\n this.hooks.emit('dataChange', nextData, this.data)\n this.data = { ...nextData }\n this.init()\n if (state) {\n this.setState(state, { userAction })\n }\n this.hooks.emit('dataLoaded', this.data)\n }\n }\n\n /**\n * 销毁插件\n * @todo 销毁贴图时,最好还是直接销毁贴图吧,this.compassMesh?.material.map 这种都是很深层的引用了。THREE 的建议我看也是自己去管理和销毁公共贴图。\n */\n public dispose = () => {\n this.five.scene.remove(this.group)\n this.group.remove(...this.group.children)\n this.compassMesh?.material.map?.dispose()\n this.entryDoorMesh?.material.map?.dispose()\n this.five.off('dispose', this.dispose)\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n protected formatData(serverData: PluginServerData | PluginData): Promise<PluginData> {\n if ((serverData as PluginServerData).version && (serverData as PluginServerData).data) {\n return Promise.resolve((serverData as PluginServerData).data)\n } else {\n return Promise.resolve(serverData as unknown as PluginData)\n }\n }\n\n /**\n * 添加事件监听\n */\n private _addEventListener = () => {\n this.five.on('panoArrived', this.onFivePanoArrived)\n this.five.on('panoWillArrive', this.onFivePanoWillArrive)\n this.five.on('modeChange', this.onFiveModeChange)\n this.five.on('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n /**\n * 移除事件监听\n */\n private _removeEventListener = () => {\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('modeChange', this.onFiveModeChange)\n this.five.off('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n /**\n * 启用,响应事件,展示UI\n */\n private _enable = () => {\n this.five.scene.add(this.group)\n this.init()\n this.onFivePanoArrived(this.five.panoIndex || 0)\n this._addEventListener()\n }\n\n /**\n * 禁用,不响应事件,不展示UI\n */\n private _disable = () => {\n this._clearCompassIfNeed()\n this._clearEntryDoorIfNeed()\n this.five.scene.remove(this.group)\n this._removeEventListener()\n }\n\n /**\n * 展示UI\n */\n private _toggleVisible = () => {\n this.group.visible = this.state.visible\n this.five.needsRender = true\n }\n\n private _clearCompassIfNeed = () => {\n if (this.compassMesh) {\n this.group.remove(this.compassMesh)\n this.compassMesh.material.map?.dispose()\n this.compassMesh = null\n }\n }\n\n private _clearLogoIfNeed = () => {\n if (this.logoMesh) {\n this.group.remove(this.logoMesh)\n this.logoMesh.material.map?.dispose()\n this.logoMesh = null\n }\n }\n\n private _clearEntryDoorIfNeed = () => {\n if (this.entryDoorMesh) {\n this.group.remove(this.entryDoorMesh)\n this.entryDoorMesh.material.map?.dispose()\n this.entryDoorMesh = null\n }\n\n if (this.roomInfoInstance) {\n this.roomInfoInstance.dispose()\n this.roomInfoInstance = null\n }\n\n if (this.roomInfoWrapperInstance) {\n this.roomInfoWrapperInstance.dispose()\n this.roomInfoWrapperInstance = null\n }\n }\n\n /**\n * 初始化\n * @todo 逻辑需要细分\n */\n private async init() {\n // 初始化指南针\n const northRad = this.data?.north_rad ?? null\n this._clearCompassIfNeed()\n if (northRad !== null) {\n this.compassMesh = await this.loadCompassMesh()\n if (this.compassMesh) {\n this.compassMesh.rotateX(-Math.PI / 2)\n this.compassMesh.rotateZ(northRad - Math.PI / 2)\n this.group.add(this.compassMesh)\n }\n }\n // 初始化 logo\n this._clearLogoIfNeed()\n this.logoMesh = await this.loadLogoMesh()\n if (this.logoMesh) {\n this.logoMesh.rotateX(-Math.PI / 2)\n this.group.add(this.logoMesh)\n }\n // 初始化入户门指引\n const entrance = this.data?.entrance ?? null\n this._clearEntryDoorIfNeed()\n if (entrance !== null) {\n this.entryDoorMesh = await this.loadEntryDoorMesh()\n this.roomInfoWrapperInstance = this.loadRoomInfo()\n this.roomInfoInstance = getRoomInfoInstance()\n this.entryDoorMesh.rotateX(-Math.PI / 2)\n if (this.roomInfoWrapperInstance) {\n this.roomInfoInstance.appendTo(this.roomInfoWrapperInstance.container)\n }\n this.group.add(this.entryDoorMesh)\n }\n this.onFivePanoArrived(this.five.panoIndex || 0)\n this.five.needsRender = true\n }\n\n private async loadCompassMesh() {\n const compassImageUrl = this.state.config.compassImageUrl\n const compassTexture = await loadTexture(compassImageUrl)\n const compassGeometry = new THREE.CircleGeometry(0.7, 32)\n const compassMaterial = new THREE.MeshBasicMaterial({\n map: compassTexture,\n transparent: true,\n opacity: 0,\n depthTest: false,\n })\n const compassMesh = new THREE.Mesh(compassGeometry, compassMaterial)\n compassMesh.name = 'pano-compass-mesh'\n return compassMesh\n }\n\n private async loadLogoMesh() {\n if (!this.state.config.logoURL) return\n const url = this.state.config.logoURL\n const texture = await loadTexture(url)\n texture.minFilter = THREE.NearestFilter\n texture.magFilter = THREE.NearestFilter\n const geometry = new THREE.PlaneGeometry(0.4, 0.4)\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n opacity: 0,\n transparent: true,\n depthTest: false,\n })\n const mesh = new THREE.Mesh(geometry, material)\n mesh.name = 'pano-compass-logo-mesh'\n return mesh\n }\n\n private async loadEntryDoorMesh() {\n const entryDoorImageUrl = this.state.config.entryDoorImageUrl\n const entryDoorTexture = await loadTexture(entryDoorImageUrl)\n const entryDoorGeometry = new THREE.PlaneGeometry(0.2, 0.16)\n const entryDoorMaterial = new THREE.MeshBasicMaterial({\n map: entryDoorTexture,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n })\n const entryDoorMesh = new THREE.Mesh(entryDoorGeometry, entryDoorMaterial)\n entryDoorMesh.name = 'pano-compass-entry-door'\n return entryDoorMesh\n }\n\n private loadRoomInfo() {\n const points = [\n new THREE.Vector3(-0.7, 0, -0.7),\n new THREE.Vector3(0.7, 0, -0.7),\n new THREE.Vector3(0.7, 0, 0.7),\n new THREE.Vector3(-0.7, 0, 0.7),\n ]\n const roomInfo = CSS3DRenderPlugin(this.five).create3DDomContainer(points)\n\n return roomInfo\n }\n\n private onFivePanoWillArrive = (panoIndex: number) => {\n if (panoIndex === this.five.panoIndex) return\n this.compassMeshTween?.dispose()\n this.compassMesh?.material.setValues({ opacity: 0 })\n this.logoMeshTween?.dispose()\n this.logoMesh?.material.setValues({ opacity: 0 })\n }\n\n private onFivePanoArrived = (panoIndex: number) => {\n // ======== fix compass position ========\n const standingPosition = this.five.work?.observers?.[panoIndex]?.standingPosition\n if (this.compassMesh && standingPosition) {\n // 指南针上移 0.01m,防止与地板重合\n this.compassMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01))\n if (this.compassMesh.material.opacity === 0) {\n this.compassMeshTween?.dispose()\n this.compassMeshTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.compassMesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n }\n // ======== fix logo position ========\n if (this.logoMesh && standingPosition) {\n // logo 上移 0.011m,防止与地板重合,防止与指南针重合\n this.logoMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.011))\n if (this.logoMesh.material.opacity === 0) {\n this.logoMeshTween?.dispose()\n this.logoMeshTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.logoMesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n }\n // ======== fix entry door label position and rotation ========\n if (this.entryDoorMesh) {\n const entryDoorPosition = new THREE.Vector3(\n this.data.entrance.position.x,\n this.data.entrance.position.y,\n this.data.entrance.position.z,\n )\n const panoToEntryDoorVector = entryDoorPosition.clone().setY(standingPosition.y).sub(standingPosition).normalize()\n const compassEntryDoorPosition = standingPosition\n .clone()\n .add(panoToEntryDoorVector.clone().multiplyScalar(0.7))\n .setY(standingPosition.y + 0.01)\n this.entryDoorMesh.rotation.z = new THREE.Vector3(0, 0, -1).angleTo(panoToEntryDoorVector)\n this.entryDoorMesh.position.copy(compassEntryDoorPosition)\n // 不是客厅时,隐藏入户门指引\n this.data?.room_observers[panoIndex].room.type === 1\n ? this.entryDoorMesh?.material.setValues({ opacity: 1 })\n : this.entryDoorMesh?.material.setValues({ opacity: 0 })\n }\n // ======== fix room info ========\n if (this.roomInfoInstance && this.roomInfoWrapperInstance && standingPosition) {\n this.roomInfoWrapperInstance.css3DObject.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01))\n this.roomInfoInstance.setRoom(this.data.room_observers[panoIndex].room)\n }\n this.five.needsRender = true\n }\n\n private onFiveCameraDirectionUpdate = ({ longitude, latitude }: { longitude: number; latitude: number }) => {\n if (!this.roomInfoWrapperInstance) return\n this.roomInfoWrapperInstance.css3DObject.rotation.z = longitude\n latitude > 0.66 && this.five.getCurrentState().mode === 'Panorama' ? this.roomInfoInstance?.show() : this.roomInfoInstance?.hide()\n }\n\n\n private onFiveModeChange = (mode: Mode, prevMode: Mode, panoIndex: number, toPose: Pose, userAction: boolean) => {\n if (mode === prevMode) return\n this.setState(\n {\n visible: mode === Five.Mode.Panorama,\n },\n { userAction },\n )\n }\n}\n","import type { FivePlugin } from '@realsee/five-webgpu'\nimport { PanoCompassController } from './Controller'\nimport type { PanoCompassPluginParameterType } from './typings'\n\nexport type PanoCompassPluginExportType = PanoCompassController\n\nexport const PanoCompassPlugin: FivePlugin<\n PanoCompassPluginParameterType,\n PanoCompassPluginExportType\n> = (five, config) => new PanoCompassController(five, config)\n\nexport default PanoCompassPlugin\n\nexport type { PanoCompassPluginParameterType, PanoCompassPluginData } from './typings'\n"],"mappings":"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"}
1
+ {"version":3,"file":"pano-compass-BRTM0dCc.js","names":["BasePlugin.Controller","loadTexture","ENTRY_DOOR_DEFAULT_IMAGE","PANO_COMPASS_DEFAULT_IMAGE","tweenProgress","CSS3DRenderPlugin","Controller","THREE","roomInfoIcon","getRoomInfoInstance","infoDom","iconDom","textDom","room","defaultBaseOptions","PanoCompassController","five","config","options","prevState","state","nextData","data","serverData","northRad","entrance","compassImageUrl","compassTexture","compassGeometry","compassMaterial","compassMesh","url","texture","geometry","material","mesh","entryDoorImageUrl","entryDoorTexture","entryDoorGeometry","entryDoorMaterial","entryDoorMesh","points","panoIndex","standingPosition","progress","panoToEntryDoorVector","compassEntryDoorPosition","longitude","latitude","mode","prevMode","Five","PanoCompassPlugin"],"sources":["../../src/PanoCompassPlugin/Assets/roomInfoIcon.ts","../../src/PanoCompassPlugin/getRoomInfoInstance.ts","../../src/PanoCompassPlugin/Controller.ts","../../src/PanoCompassPlugin/index.ts"],"sourcesContent":["export const roomInfoIcon =\n 'data:image/png;base64,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'\n","import type { FloorplanServerRoomItem } from '../floorplan/typings/floorplanServerData'\nimport { roomInfoIcon } from './Assets/roomInfoIcon'\n\nexport function getRoomInfoInstance() {\n const infoDom = document.createElement('div')\n const iconDom = document.createElement('i')\n const textDom = document.createElement('span')\n infoDom.appendChild(iconDom)\n infoDom.appendChild(textDom)\n // infoDom style\n infoDom.style.position = 'relative'\n infoDom.style.width = '100%'\n infoDom.style.display = 'flex'\n infoDom.style.flexDirection = 'column'\n infoDom.style.alignItems = 'center'\n infoDom.style.marginTop = `${150 / 16}rem`\n infoDom.style.opacity = '0'\n infoDom.style.transition = 'opacity 1000ms linear'\n // iconDom style\n iconDom.style.display = 'block'\n iconDom.style.width = `${134 / 16}rem`\n iconDom.style.height = `${22 / 16}rem`\n iconDom.style.backgroundSize = '100%'\n iconDom.style.backgroundRepeat = 'no-repeat'\n iconDom.style.backgroundImage = `url(${roomInfoIcon})`\n textDom.style.marginTop = `${10 / 16}rem`\n // textDom style\n textDom.style.fontSize = `${16 / 16}rem`\n textDom.style.color = '#fff'\n textDom.style.opacity = '0.7'\n textDom.style.textShadow = '0 2px 16px rgb(22 34 83 / 24%)'\n textDom.style.fontWeight = 'bold'\n\n return {\n appendTo(element: Element) {\n element.appendChild(infoDom)\n },\n dispose() {\n infoDom.remove()\n },\n setRoom(room: FloorplanServerRoomItem) {\n textDom.innerHTML = room.name + ' ' + Math.floor(room.size / 1000000) + '㎡'\n },\n show() {\n infoDom.style.opacity = '1'\n },\n hide() {\n infoDom.style.opacity = '0'\n }\n }\n}\n","import * as THREE from 'three/webgpu'\nimport type { Mode, Pose } from '@realsee/five-webgpu'\nimport type { BaseOptions } from '../base/BasePlugin'\nimport type { CSS3DRenderPluginExportType } from '../CSS3DRenderPlugin'\nimport { Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { getRoomInfoInstance } from './getRoomInfoInstance'\nimport { loadTexture } from '../shared-utils/three/loadTexture'\nimport CSS3DRenderPlugin from '../CSS3DRenderPlugin'\nimport type { BetterTween } from '../shared-utils/animationFrame/BetterTween'\nimport { tweenProgress } from '../shared-utils/animationFrame/BetterTween'\n\nimport type { EventMap, PanoCompassPluginData, PanoCompassPluginParameterType, PluginData, PluginServerData, State } from './typings'\nimport { ENTRY_DOOR_DEFAULT_IMAGE, PANO_COMPASS_DEFAULT_IMAGE } from '../shared-utils/url/defaultUrls'\n\nconst defaultBaseOptions: Required<BaseOptions> = { userAction: true }\n\nexport class PanoCompassController extends BasePlugin.Controller<State, EventMap, PluginServerData, PluginData> {\n /**\n * 默认状态\n */\n public state: State = {\n visible: true,\n enabled: true,\n config: {\n /**\n * @todo 图片转base64\n */\n compassImageUrl: PANO_COMPASS_DEFAULT_IMAGE,\n entryDoorImageUrl: ENTRY_DOOR_DEFAULT_IMAGE,\n },\n }\n public data?: PanoCompassPluginData\n private group = new THREE.Group()\n private roomInfoInstance?: ReturnType<typeof getRoomInfoInstance>\n private roomInfoWrapperInstance?: ReturnType<CSS3DRenderPluginExportType['create3DDomContainer']>\n private compassMeshTween?: BetterTween<{ progress: number }>\n private compassMesh?: THREE.Mesh<THREE.CircleGeometry, THREE.MeshBasicMaterial>\n private logoMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n private logoMeshTween?: BetterTween<{ progress: number }>\n private entryDoorMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial>\n\n public constructor(five: Five, config?: PanoCompassPluginParameterType) {\n super(five, config)\n this.five.scene.add(this.group)\n this.five.once('dispose', this.dispose)\n this.setState({\n visible: true,\n enabled: true,\n config: {\n ...this.state.config,\n ...(config || {}),\n },\n })\n }\n\n /**\n * 启用插件,响应用户操作并展示UI\n * @param options\n */\n public enable(options: Required<BaseOptions> = defaultBaseOptions): void {\n this.setState(\n {\n enabled: true,\n },\n options,\n )\n }\n\n /**\n * 禁用插件,禁止响应用户操作并隐藏UI\n * @param options\n */\n public disable(options: Required<BaseOptions> = defaultBaseOptions): void {\n this.setState(\n {\n enabled: false,\n },\n options,\n )\n }\n\n /**\n * 展示UI\n * @param options\n * @returns\n * @todo 需要考虑动画\n */\n public show(options: Required<BaseOptions> = defaultBaseOptions): Promise<void> {\n if (!this.state.enabled) return\n this.setState(\n {\n visible: true,\n },\n options,\n )\n return Promise.resolve()\n }\n\n /**\n * 隐藏UI\n * @param options\n * @returns\n * @todo 需要考虑动画\n */\n public hide(options: Required<BaseOptions> = defaultBaseOptions): Promise<void> {\n if (!this.state.enabled) return\n this.setState(\n {\n visible: false,\n },\n options,\n )\n return Promise.resolve()\n }\n\n public setState(state: Partial<State>, options: Required<BaseOptions> = { userAction: true }): void {\n const prevState = JSON.parse(JSON.stringify(this.state))\n this.state = {\n visible: state.visible ?? prevState.visible,\n enabled: state.enabled ?? prevState.enabled,\n config: { ...prevState.config, ...(state.config || {}) },\n }\n this.hooks.emit('stateChange', {\n state: this.state,\n prevState,\n userAction: options.userAction,\n })\n\n if (state.enabled === true) {\n this._enable()\n this.hooks.emit('enable', options)\n }\n if (state.enabled === false) {\n this._disable()\n this.hooks.emit('disable', options)\n }\n\n if (state.visible === false) {\n this._toggleVisible()\n this.hooks.emit('hide', options)\n }\n\n if (state.visible === true) {\n this._toggleVisible()\n this.hooks.emit('show', options)\n }\n\n /**\n * @todo config变化不应该重新初始化,需要做精准的替换\n */\n if (state.config) {\n this.init()\n }\n }\n\n public async load(data: PluginServerData | PluginData, state?: State, userAction = true) {\n const nextData = await this.formatData(data)\n if (JSON.stringify(this.data) !== JSON.stringify(nextData)) {\n this.hooks.emit('dataChange', nextData, this.data)\n this.data = { ...nextData }\n this.init()\n if (state) {\n this.setState(state, { userAction })\n }\n this.hooks.emit('dataLoaded', this.data)\n }\n }\n\n /**\n * 销毁插件\n * @todo 销毁贴图时,最好还是直接销毁贴图吧,this.compassMesh?.material.map 这种都是很深层的引用了。THREE 的建议我看也是自己去管理和销毁公共贴图。\n */\n public dispose = () => {\n this.five.scene.remove(this.group)\n this.group.remove(...this.group.children)\n this.compassMesh?.material.map?.dispose()\n this.entryDoorMesh?.material.map?.dispose()\n this.five.off('dispose', this.dispose)\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n protected formatData(serverData: PluginServerData | PluginData): Promise<PluginData> {\n if ((serverData as PluginServerData).version && (serverData as PluginServerData).data) {\n return Promise.resolve((serverData as PluginServerData).data)\n } else {\n return Promise.resolve(serverData as unknown as PluginData)\n }\n }\n\n /**\n * 添加事件监听\n */\n private _addEventListener = () => {\n this.five.on('panoArrived', this.onFivePanoArrived)\n this.five.on('panoWillArrive', this.onFivePanoWillArrive)\n this.five.on('modeChange', this.onFiveModeChange)\n this.five.on('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n /**\n * 移除事件监听\n */\n private _removeEventListener = () => {\n this.five.off('panoArrived', this.onFivePanoArrived)\n this.five.off('panoWillArrive', this.onFivePanoWillArrive)\n this.five.off('modeChange', this.onFiveModeChange)\n this.five.off('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate)\n }\n\n /**\n * 启用,响应事件,展示UI\n */\n private _enable = () => {\n this.five.scene.add(this.group)\n this.init()\n this.onFivePanoArrived(this.five.panoIndex || 0)\n this._addEventListener()\n }\n\n /**\n * 禁用,不响应事件,不展示UI\n */\n private _disable = () => {\n this._clearCompassIfNeed()\n this._clearEntryDoorIfNeed()\n this.five.scene.remove(this.group)\n this._removeEventListener()\n }\n\n /**\n * 展示UI\n */\n private _toggleVisible = () => {\n this.group.visible = this.state.visible\n this.five.needsRender = true\n }\n\n private _clearCompassIfNeed = () => {\n if (this.compassMesh) {\n this.group.remove(this.compassMesh)\n this.compassMesh.material.map?.dispose()\n this.compassMesh = null\n }\n }\n\n private _clearLogoIfNeed = () => {\n if (this.logoMesh) {\n this.group.remove(this.logoMesh)\n this.logoMesh.material.map?.dispose()\n this.logoMesh = null\n }\n }\n\n private _clearEntryDoorIfNeed = () => {\n if (this.entryDoorMesh) {\n this.group.remove(this.entryDoorMesh)\n this.entryDoorMesh.material.map?.dispose()\n this.entryDoorMesh = null\n }\n\n if (this.roomInfoInstance) {\n this.roomInfoInstance.dispose()\n this.roomInfoInstance = null\n }\n\n if (this.roomInfoWrapperInstance) {\n this.roomInfoWrapperInstance.dispose()\n this.roomInfoWrapperInstance = null\n }\n }\n\n /**\n * 初始化\n * @todo 逻辑需要细分\n */\n private async init() {\n // 初始化指南针\n const northRad = this.data?.north_rad ?? null\n this._clearCompassIfNeed()\n if (northRad !== null) {\n this.compassMesh = await this.loadCompassMesh()\n if (this.compassMesh) {\n this.compassMesh.rotateX(-Math.PI / 2)\n this.compassMesh.rotateZ(northRad - Math.PI / 2)\n this.group.add(this.compassMesh)\n }\n }\n // 初始化 logo\n this._clearLogoIfNeed()\n this.logoMesh = await this.loadLogoMesh()\n if (this.logoMesh) {\n this.logoMesh.rotateX(-Math.PI / 2)\n this.group.add(this.logoMesh)\n }\n // 初始化入户门指引\n const entrance = this.data?.entrance ?? null\n this._clearEntryDoorIfNeed()\n if (entrance !== null) {\n this.entryDoorMesh = await this.loadEntryDoorMesh()\n this.roomInfoWrapperInstance = this.loadRoomInfo()\n this.roomInfoInstance = getRoomInfoInstance()\n this.entryDoorMesh.rotateX(-Math.PI / 2)\n if (this.roomInfoWrapperInstance) {\n this.roomInfoInstance.appendTo(this.roomInfoWrapperInstance.container)\n }\n this.group.add(this.entryDoorMesh)\n }\n this.onFivePanoArrived(this.five.panoIndex || 0)\n this.five.needsRender = true\n }\n\n private async loadCompassMesh() {\n const compassImageUrl = this.state.config.compassImageUrl\n const compassTexture = await loadTexture(compassImageUrl)\n const compassGeometry = new THREE.CircleGeometry(0.7, 32)\n const compassMaterial = new THREE.MeshBasicMaterial({\n map: compassTexture,\n transparent: true,\n opacity: 0,\n depthTest: false,\n })\n const compassMesh = new THREE.Mesh(compassGeometry, compassMaterial)\n compassMesh.name = 'pano-compass-mesh'\n return compassMesh\n }\n\n private async loadLogoMesh() {\n if (!this.state.config.logoURL) return\n const url = this.state.config.logoURL\n const texture = await loadTexture(url)\n texture.minFilter = THREE.NearestFilter\n texture.magFilter = THREE.NearestFilter\n const geometry = new THREE.PlaneGeometry(0.4, 0.4)\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n opacity: 0,\n transparent: true,\n depthTest: false,\n })\n const mesh = new THREE.Mesh(geometry, material)\n mesh.name = 'pano-compass-logo-mesh'\n return mesh\n }\n\n private async loadEntryDoorMesh() {\n const entryDoorImageUrl = this.state.config.entryDoorImageUrl\n const entryDoorTexture = await loadTexture(entryDoorImageUrl)\n const entryDoorGeometry = new THREE.PlaneGeometry(0.2, 0.16)\n const entryDoorMaterial = new THREE.MeshBasicMaterial({\n map: entryDoorTexture,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n })\n const entryDoorMesh = new THREE.Mesh(entryDoorGeometry, entryDoorMaterial)\n entryDoorMesh.name = 'pano-compass-entry-door'\n return entryDoorMesh\n }\n\n private loadRoomInfo() {\n const points = [\n new THREE.Vector3(-0.7, 0, -0.7),\n new THREE.Vector3(0.7, 0, -0.7),\n new THREE.Vector3(0.7, 0, 0.7),\n new THREE.Vector3(-0.7, 0, 0.7),\n ]\n const roomInfo = CSS3DRenderPlugin(this.five).create3DDomContainer(points)\n\n return roomInfo\n }\n\n private onFivePanoWillArrive = (panoIndex: number) => {\n if (panoIndex === this.five.panoIndex) return\n this.compassMeshTween?.dispose()\n this.compassMesh?.material.setValues({ opacity: 0 })\n this.logoMeshTween?.dispose()\n this.logoMesh?.material.setValues({ opacity: 0 })\n }\n\n private onFivePanoArrived = (panoIndex: number) => {\n // ======== fix compass position ========\n const standingPosition = this.five.work?.observers?.[panoIndex]?.standingPosition\n if (this.compassMesh && standingPosition) {\n // 指南针上移 0.01m,防止与地板重合\n this.compassMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01))\n if (this.compassMesh.material.opacity === 0) {\n this.compassMeshTween?.dispose()\n this.compassMeshTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.compassMesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n }\n // ======== fix logo position ========\n if (this.logoMesh && standingPosition) {\n // logo 上移 0.011m,防止与地板重合,防止与指南针重合\n this.logoMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.011))\n if (this.logoMesh.material.opacity === 0) {\n this.logoMeshTween?.dispose()\n this.logoMeshTween = tweenProgress(1000)\n .onUpdate(({ progress }) => {\n this.logoMesh?.material.setValues({ opacity: progress })\n this.five.needsRender = true\n })\n .play()\n }\n }\n // ======== fix entry door label position and rotation ========\n if (this.entryDoorMesh) {\n const entryDoorPosition = new THREE.Vector3(\n this.data.entrance.position.x,\n this.data.entrance.position.y,\n this.data.entrance.position.z,\n )\n const panoToEntryDoorVector = entryDoorPosition.clone().setY(standingPosition.y).sub(standingPosition).normalize()\n const compassEntryDoorPosition = standingPosition\n .clone()\n .add(panoToEntryDoorVector.clone().multiplyScalar(0.7))\n .setY(standingPosition.y + 0.01)\n this.entryDoorMesh.rotation.z = new THREE.Vector3(0, 0, -1).angleTo(panoToEntryDoorVector)\n this.entryDoorMesh.position.copy(compassEntryDoorPosition)\n // 不是客厅时,隐藏入户门指引\n this.data?.room_observers[panoIndex].room.type === 1\n ? this.entryDoorMesh?.material.setValues({ opacity: 1 })\n : this.entryDoorMesh?.material.setValues({ opacity: 0 })\n }\n // ======== fix room info ========\n if (this.roomInfoInstance && this.roomInfoWrapperInstance && standingPosition) {\n this.roomInfoWrapperInstance.css3DObject.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01))\n this.roomInfoInstance.setRoom(this.data.room_observers[panoIndex].room)\n }\n this.five.needsRender = true\n }\n\n private onFiveCameraDirectionUpdate = ({ longitude, latitude }: { longitude: number; latitude: number }) => {\n if (!this.roomInfoWrapperInstance) return\n this.roomInfoWrapperInstance.css3DObject.rotation.z = longitude\n latitude > 0.66 && this.five.getCurrentState().mode === 'Panorama' ? this.roomInfoInstance?.show() : this.roomInfoInstance?.hide()\n }\n\n\n private onFiveModeChange = (mode: Mode, prevMode: Mode, panoIndex: number, toPose: Pose, userAction: boolean) => {\n if (mode === prevMode) return\n this.setState(\n {\n visible: mode === Five.Mode.Panorama,\n },\n { userAction },\n )\n }\n}\n","import type { FivePlugin } from '@realsee/five-webgpu'\nimport { PanoCompassController } from './Controller'\nimport type { PanoCompassPluginParameterType } from './typings'\n\nexport type PanoCompassPluginExportType = PanoCompassController\n\nexport const PanoCompassPlugin: FivePlugin<\n PanoCompassPluginParameterType,\n PanoCompassPluginExportType\n> = (five, config) => new PanoCompassController(five, config)\n\nexport default PanoCompassPlugin\n\nexport type { PanoCompassPluginParameterType, PanoCompassPluginData } from './typings'\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { r as e } from "./rolldown-runtime-B0aSnxlc.js";
2
- import { t } from "./fiveModelLoad-mg-TnpnM.js";
3
- import { t as n } from "./BasePlugin-CT5K8m36.js";
2
+ import { n as t } from "./fiveModelLoad-BUIBYxzp.js";
3
+ import { t as n } from "./BasePlugin-DC5m72La.js";
4
4
  import { G as r, J as i, K as a, L as o, M as s, P as c, Q as l, R as u, U as d, V as f, W as p, X as m, f as h, h as g, it as _, j as v, l as y, m as b, n as x, o as S, ot as C, p as w, rt as T, st as E, t as D, z as O } from "./component.svelte-D5LYqt50.js";
5
5
  import { t as k } from "./classnames-DUxZNrrI.js";
6
6
  import { Euler as A, Quaternion as j, Raycaster as M, Vector3 as N } from "three/webgpu";
@@ -255,4 +255,4 @@ var V = { userAction: !0 }, H = class extends n {
255
255
  //#endregion
256
256
  export { U as t };
257
257
 
258
- //# sourceMappingURL=pano-door-label-DKoYIKLa.js.map
258
+ //# sourceMappingURL=pano-door-label-BLjYGZrr.js.map