@aibee/owlly 1.0.25

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 (500) hide show
  1. package/README.external.md +75 -0
  2. package/README.md +28 -0
  3. package/lib/src/external/lines/line-geometry.d.ts +9 -0
  4. package/lib/src/external/lines/line-geometry.js +52 -0
  5. package/lib/src/external/lines/line-geometry.js.map +1 -0
  6. package/lib/src/external/lines/line-material.d.ts +10 -0
  7. package/lib/src/external/lines/line-material.js +377 -0
  8. package/lib/src/external/lines/line-material.js.map +1 -0
  9. package/lib/src/external/lines/line-segments-2.d.ts +7 -0
  10. package/lib/src/external/lines/line-segments-2.js +144 -0
  11. package/lib/src/external/lines/line-segments-2.js.map +1 -0
  12. package/lib/src/external/lines/line-segments-geometry.d.ts +15 -0
  13. package/lib/src/external/lines/line-segments-geometry.js +141 -0
  14. package/lib/src/external/lines/line-segments-geometry.js.map +1 -0
  15. package/lib/src/external/loaders/gltf-loader.d.ts +77 -0
  16. package/lib/src/external/loaders/gltf-loader.js +2319 -0
  17. package/lib/src/external/loaders/gltf-loader.js.map +1 -0
  18. package/lib/src/external/orbit-controls.d.ts +44 -0
  19. package/lib/src/external/orbit-controls.js +746 -0
  20. package/lib/src/external/orbit-controls.js.map +1 -0
  21. package/lib/src/external/renderers/css-2d-renderer.d.ts +16 -0
  22. package/lib/src/external/renderers/css-2d-renderer.js +122 -0
  23. package/lib/src/external/renderers/css-2d-renderer.js.map +1 -0
  24. package/lib/src/external/renderers/css-3d-renderer.d.ts +18 -0
  25. package/lib/src/external/renderers/css-3d-renderer.js +139 -0
  26. package/lib/src/external/renderers/css-3d-renderer.js.map +1 -0
  27. package/lib/src/external/transform-controls.d.ts +106 -0
  28. package/lib/src/external/transform-controls.js +1113 -0
  29. package/lib/src/external/transform-controls.js.map +1 -0
  30. package/lib/src/external/util/buffer-geometry-utils.d.ts +45 -0
  31. package/lib/src/external/util/buffer-geometry-utils.js +569 -0
  32. package/lib/src/external/util/buffer-geometry-utils.js.map +1 -0
  33. package/lib/src/owlly/controller/aerial-element-controller.d.ts +65 -0
  34. package/lib/src/owlly/controller/aerial-element-controller.js +236 -0
  35. package/lib/src/owlly/controller/aerial-element-controller.js.map +1 -0
  36. package/lib/src/owlly/controller/basic-controller.d.ts +324 -0
  37. package/lib/src/owlly/controller/basic-controller.js +1239 -0
  38. package/lib/src/owlly/controller/basic-controller.js.map +1 -0
  39. package/lib/src/owlly/controller/camera-controller.d.ts +37 -0
  40. package/lib/src/owlly/controller/camera-controller.js +138 -0
  41. package/lib/src/owlly/controller/camera-controller.js.map +1 -0
  42. package/lib/src/owlly/controller/controller.d.ts +61 -0
  43. package/lib/src/owlly/controller/controller.js +24 -0
  44. package/lib/src/owlly/controller/controller.js.map +1 -0
  45. package/lib/src/owlly/controller/index.d.ts +2 -0
  46. package/lib/src/owlly/controller/index.js +14 -0
  47. package/lib/src/owlly/controller/index.js.map +1 -0
  48. package/lib/src/owlly/controller/mouse-indicator-controller.d.ts +34 -0
  49. package/lib/src/owlly/controller/mouse-indicator-controller.js +119 -0
  50. package/lib/src/owlly/controller/mouse-indicator-controller.js.map +1 -0
  51. package/lib/src/owlly/controller/orbit-control.d.ts +147 -0
  52. package/lib/src/owlly/controller/orbit-control.js +265 -0
  53. package/lib/src/owlly/controller/orbit-control.js.map +1 -0
  54. package/lib/src/owlly/controller/panorama-adjust-controller.d.ts +45 -0
  55. package/lib/src/owlly/controller/panorama-adjust-controller.js +158 -0
  56. package/lib/src/owlly/controller/panorama-adjust-controller.js.map +1 -0
  57. package/lib/src/owlly/controller/panorama-controller.d.ts +441 -0
  58. package/lib/src/owlly/controller/panorama-controller.js +1944 -0
  59. package/lib/src/owlly/controller/panorama-controller.js.map +1 -0
  60. package/lib/src/owlly/controller/panorama-transform-controller.d.ts +66 -0
  61. package/lib/src/owlly/controller/panorama-transform-controller.js +137 -0
  62. package/lib/src/owlly/controller/panorama-transform-controller.js.map +1 -0
  63. package/lib/src/owlly/controller/plane-controller.d.ts +43 -0
  64. package/lib/src/owlly/controller/plane-controller.js +174 -0
  65. package/lib/src/owlly/controller/plane-controller.js.map +1 -0
  66. package/lib/src/owlly/controller/texture-controller.d.ts +181 -0
  67. package/lib/src/owlly/controller/texture-controller.js +876 -0
  68. package/lib/src/owlly/controller/texture-controller.js.map +1 -0
  69. package/lib/src/owlly/controller/tile-panorama-controller.d.ts +308 -0
  70. package/lib/src/owlly/controller/tile-panorama-controller.js +1354 -0
  71. package/lib/src/owlly/controller/tile-panorama-controller.js.map +1 -0
  72. package/lib/src/owlly/controller/transform-controller.d.ts +106 -0
  73. package/lib/src/owlly/controller/transform-controller.js +546 -0
  74. package/lib/src/owlly/controller/transform-controller.js.map +1 -0
  75. package/lib/src/owlly/element/bottom-nav-element.d.ts +65 -0
  76. package/lib/src/owlly/element/bottom-nav-element.js +258 -0
  77. package/lib/src/owlly/element/bottom-nav-element.js.map +1 -0
  78. package/lib/src/owlly/element/camera.d.ts +82 -0
  79. package/lib/src/owlly/element/camera.js +284 -0
  80. package/lib/src/owlly/element/camera.js.map +1 -0
  81. package/lib/src/owlly/element/dom-2d-element.d.ts +35 -0
  82. package/lib/src/owlly/element/dom-2d-element.js +49 -0
  83. package/lib/src/owlly/element/dom-2d-element.js.map +1 -0
  84. package/lib/src/owlly/element/dom-3d-element.d.ts +27 -0
  85. package/lib/src/owlly/element/dom-3d-element.js +34 -0
  86. package/lib/src/owlly/element/dom-3d-element.js.map +1 -0
  87. package/lib/src/owlly/element/dom-label-2d.d.ts +116 -0
  88. package/lib/src/owlly/element/dom-label-2d.js +383 -0
  89. package/lib/src/owlly/element/dom-label-2d.js.map +1 -0
  90. package/lib/src/owlly/element/element.d.ts +53 -0
  91. package/lib/src/owlly/element/element.js +76 -0
  92. package/lib/src/owlly/element/element.js.map +1 -0
  93. package/lib/src/owlly/element/floor-model.d.ts +83 -0
  94. package/lib/src/owlly/element/floor-model.js +228 -0
  95. package/lib/src/owlly/element/floor-model.js.map +1 -0
  96. package/lib/src/owlly/element/gif-kit/Gif.d.ts +96 -0
  97. package/lib/src/owlly/element/gif-kit/Gif.js +433 -0
  98. package/lib/src/owlly/element/gif-kit/Gif.js.map +1 -0
  99. package/lib/src/owlly/element/gif-kit/GifColor.d.ts +21 -0
  100. package/lib/src/owlly/element/gif-kit/GifColor.js +38 -0
  101. package/lib/src/owlly/element/gif-kit/GifColor.js.map +1 -0
  102. package/lib/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.d.ts +20 -0
  103. package/lib/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.js +51 -0
  104. package/lib/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.js.map +1 -0
  105. package/lib/src/owlly/element/gif-kit/GifFrame.d.ts +31 -0
  106. package/lib/src/owlly/element/gif-kit/GifFrame.js +97 -0
  107. package/lib/src/owlly/element/gif-kit/GifFrame.js.map +1 -0
  108. package/lib/src/owlly/element/gif-kit/GifImage.d.ts +23 -0
  109. package/lib/src/owlly/element/gif-kit/GifImage.js +8 -0
  110. package/lib/src/owlly/element/gif-kit/GifImage.js.map +1 -0
  111. package/lib/src/owlly/element/gif-kit/GifParser.d.ts +17 -0
  112. package/lib/src/owlly/element/gif-kit/GifParser.js +197 -0
  113. package/lib/src/owlly/element/gif-kit/GifParser.js.map +1 -0
  114. package/lib/src/owlly/element/gif-kit/GifPresenter.d.ts +20 -0
  115. package/lib/src/owlly/element/gif-kit/GifPresenter.js +44 -0
  116. package/lib/src/owlly/element/gif-kit/GifPresenter.js.map +1 -0
  117. package/lib/src/owlly/element/gif-kit/GifVersion.d.ts +10 -0
  118. package/lib/src/owlly/element/gif-kit/GifVersion.js +13 -0
  119. package/lib/src/owlly/element/gif-kit/GifVersion.js.map +1 -0
  120. package/lib/src/owlly/element/gltf-mesh-element.d.ts +31 -0
  121. package/lib/src/owlly/element/gltf-mesh-element.js +137 -0
  122. package/lib/src/owlly/element/gltf-mesh-element.js.map +1 -0
  123. package/lib/src/owlly/element/index.d.ts +20 -0
  124. package/lib/src/owlly/element/index.js +25 -0
  125. package/lib/src/owlly/element/index.js.map +1 -0
  126. package/lib/src/owlly/element/map-kit/area.d.ts +24 -0
  127. package/lib/src/owlly/element/map-kit/area.js +218 -0
  128. package/lib/src/owlly/element/map-kit/area.js.map +1 -0
  129. package/lib/src/owlly/element/map-kit/block-set.d.ts +39 -0
  130. package/lib/src/owlly/element/map-kit/block-set.js +91 -0
  131. package/lib/src/owlly/element/map-kit/block-set.js.map +1 -0
  132. package/lib/src/owlly/element/map-kit/block.d.ts +77 -0
  133. package/lib/src/owlly/element/map-kit/block.js +339 -0
  134. package/lib/src/owlly/element/map-kit/block.js.map +1 -0
  135. package/lib/src/owlly/element/map-kit/index.d.ts +4 -0
  136. package/lib/src/owlly/element/map-kit/index.js +7 -0
  137. package/lib/src/owlly/element/map-kit/index.js.map +1 -0
  138. package/lib/src/owlly/element/map-kit/shape.d.ts +131 -0
  139. package/lib/src/owlly/element/map-kit/shape.js +190 -0
  140. package/lib/src/owlly/element/map-kit/shape.js.map +1 -0
  141. package/lib/src/owlly/element/mesh-element.d.ts +22 -0
  142. package/lib/src/owlly/element/mesh-element.js +64 -0
  143. package/lib/src/owlly/element/mesh-element.js.map +1 -0
  144. package/lib/src/owlly/element/mesh-line-2d.d.ts +82 -0
  145. package/lib/src/owlly/element/mesh-line-2d.js +888 -0
  146. package/lib/src/owlly/element/mesh-line-2d.js.map +1 -0
  147. package/lib/src/owlly/element/meshline-o.d.ts +64 -0
  148. package/lib/src/owlly/element/meshline-o.js +679 -0
  149. package/lib/src/owlly/element/meshline-o.js.map +1 -0
  150. package/lib/src/owlly/element/panorama-group.d.ts +241 -0
  151. package/lib/src/owlly/element/panorama-group.js +967 -0
  152. package/lib/src/owlly/element/panorama-group.js.map +1 -0
  153. package/lib/src/owlly/element/panorama.d.ts +132 -0
  154. package/lib/src/owlly/element/panorama.js +813 -0
  155. package/lib/src/owlly/element/panorama.js.map +1 -0
  156. package/lib/src/owlly/element/path-group.d.ts +69 -0
  157. package/lib/src/owlly/element/path-group.js +172 -0
  158. package/lib/src/owlly/element/path-group.js.map +1 -0
  159. package/lib/src/owlly/element/path.d.ts +99 -0
  160. package/lib/src/owlly/element/path.js +532 -0
  161. package/lib/src/owlly/element/path.js.map +1 -0
  162. package/lib/src/owlly/element/placeable-2d.d.ts +158 -0
  163. package/lib/src/owlly/element/placeable-2d.js +471 -0
  164. package/lib/src/owlly/element/placeable-2d.js.map +1 -0
  165. package/lib/src/owlly/element/polygon-mesh.d.ts +107 -0
  166. package/lib/src/owlly/element/polygon-mesh.js +308 -0
  167. package/lib/src/owlly/element/polygon-mesh.js.map +1 -0
  168. package/lib/src/owlly/element/ring-element.d.ts +79 -0
  169. package/lib/src/owlly/element/ring-element.js +384 -0
  170. package/lib/src/owlly/element/ring-element.js.map +1 -0
  171. package/lib/src/owlly/element/sphere-mesh.d.ts +28 -0
  172. package/lib/src/owlly/element/sphere-mesh.js +70 -0
  173. package/lib/src/owlly/element/sphere-mesh.js.map +1 -0
  174. package/lib/src/owlly/element/svg-floor-model.d.ts +22 -0
  175. package/lib/src/owlly/element/svg-floor-model.js +185 -0
  176. package/lib/src/owlly/element/svg-floor-model.js.map +1 -0
  177. package/lib/src/owlly/element/svg-floors.d.ts +27 -0
  178. package/lib/src/owlly/element/svg-floors.js +110 -0
  179. package/lib/src/owlly/element/svg-floors.js.map +1 -0
  180. package/lib/src/owlly/element/tile-panorama-group.d.ts +335 -0
  181. package/lib/src/owlly/element/tile-panorama-group.js +1007 -0
  182. package/lib/src/owlly/element/tile-panorama-group.js.map +1 -0
  183. package/lib/src/owlly/element/tile-panorama.d.ts +161 -0
  184. package/lib/src/owlly/element/tile-panorama.js +511 -0
  185. package/lib/src/owlly/element/tile-panorama.js.map +1 -0
  186. package/lib/src/owlly/element/tile-plane.d.ts +105 -0
  187. package/lib/src/owlly/element/tile-plane.js +361 -0
  188. package/lib/src/owlly/element/tile-plane.js.map +1 -0
  189. package/lib/src/owlly/element/video-element.d.ts +33 -0
  190. package/lib/src/owlly/element/video-element.js +160 -0
  191. package/lib/src/owlly/element/video-element.js.map +1 -0
  192. package/lib/src/owlly/geometries/ExtrudeGeometry2.d.ts +15 -0
  193. package/lib/src/owlly/geometries/ExtrudeGeometry2.js +211 -0
  194. package/lib/src/owlly/geometries/ExtrudeGeometry2.js.map +1 -0
  195. package/lib/src/owlly/index.d.ts +13 -0
  196. package/lib/src/owlly/index.js +17 -0
  197. package/lib/src/owlly/index.js.map +1 -0
  198. package/lib/src/owlly/overlay/canvas-overlay.d.ts +96 -0
  199. package/lib/src/owlly/overlay/canvas-overlay.js +511 -0
  200. package/lib/src/owlly/overlay/canvas-overlay.js.map +1 -0
  201. package/lib/src/owlly/overlay/css-2d-overlay.d.ts +14 -0
  202. package/lib/src/owlly/overlay/css-2d-overlay.js +36 -0
  203. package/lib/src/owlly/overlay/css-2d-overlay.js.map +1 -0
  204. package/lib/src/owlly/overlay/css-3d-overlay.d.ts +16 -0
  205. package/lib/src/owlly/overlay/css-3d-overlay.js +37 -0
  206. package/lib/src/owlly/overlay/css-3d-overlay.js.map +1 -0
  207. package/lib/src/owlly/overlay/index.d.ts +6 -0
  208. package/lib/src/owlly/overlay/index.js +12 -0
  209. package/lib/src/owlly/overlay/index.js.map +1 -0
  210. package/lib/src/owlly/overlay/label-overlay.d.ts +62 -0
  211. package/lib/src/owlly/overlay/label-overlay.js +329 -0
  212. package/lib/src/owlly/overlay/label-overlay.js.map +1 -0
  213. package/lib/src/owlly/overlay/overlay.d.ts +14 -0
  214. package/lib/src/owlly/overlay/overlay.js +5 -0
  215. package/lib/src/owlly/overlay/overlay.js.map +1 -0
  216. package/lib/src/owlly/overlay/path-overlay.d.ts +39 -0
  217. package/lib/src/owlly/overlay/path-overlay.js +125 -0
  218. package/lib/src/owlly/overlay/path-overlay.js.map +1 -0
  219. package/lib/src/owlly/overlay/path-overlay2.d.ts +35 -0
  220. package/lib/src/owlly/overlay/path-overlay2.js +119 -0
  221. package/lib/src/owlly/overlay/path-overlay2.js.map +1 -0
  222. package/lib/src/owlly/overlay/poi-overlay-3d.d.ts +278 -0
  223. package/lib/src/owlly/overlay/poi-overlay-3d.js +1433 -0
  224. package/lib/src/owlly/overlay/poi-overlay-3d.js.map +1 -0
  225. package/lib/src/owlly/overlay/poi-overlay.d.ts +277 -0
  226. package/lib/src/owlly/overlay/poi-overlay.js +1412 -0
  227. package/lib/src/owlly/overlay/poi-overlay.js.map +1 -0
  228. package/lib/src/owlly/owlly-2d/index.d.ts +28 -0
  229. package/lib/src/owlly/owlly-2d/index.js +93 -0
  230. package/lib/src/owlly/owlly-2d/index.js.map +1 -0
  231. package/lib/src/owlly/screen/index.d.ts +1 -0
  232. package/lib/src/owlly/screen/index.js +2 -0
  233. package/lib/src/owlly/screen/index.js.map +1 -0
  234. package/lib/src/owlly/screen/screen.d.ts +73 -0
  235. package/lib/src/owlly/screen/screen.js +237 -0
  236. package/lib/src/owlly/screen/screen.js.map +1 -0
  237. package/lib/src/owlly/stage/__test__/stage.spec.d.ts +1 -0
  238. package/lib/src/owlly/stage/__test__/stage.spec.js +15 -0
  239. package/lib/src/owlly/stage/__test__/stage.spec.js.map +1 -0
  240. package/lib/src/owlly/stage/externals.d.ts +19 -0
  241. package/lib/src/owlly/stage/externals.js +25 -0
  242. package/lib/src/owlly/stage/externals.js.map +1 -0
  243. package/lib/src/owlly/stage/index.d.ts +4 -0
  244. package/lib/src/owlly/stage/index.js +7 -0
  245. package/lib/src/owlly/stage/index.js.map +1 -0
  246. package/lib/src/owlly/stage/owlly.d.ts +38 -0
  247. package/lib/src/owlly/stage/owlly.js +168 -0
  248. package/lib/src/owlly/stage/owlly.js.map +1 -0
  249. package/lib/src/owlly/stage/stage.d.ts +108 -0
  250. package/lib/src/owlly/stage/stage.js +235 -0
  251. package/lib/src/owlly/stage/stage.js.map +1 -0
  252. package/lib/src/owlly/utils/alignment-utils.d.ts +20 -0
  253. package/lib/src/owlly/utils/alignment-utils.js +64 -0
  254. package/lib/src/owlly/utils/alignment-utils.js.map +1 -0
  255. package/lib/src/owlly/utils/basic-calc.d.ts +18 -0
  256. package/lib/src/owlly/utils/basic-calc.js +130 -0
  257. package/lib/src/owlly/utils/basic-calc.js.map +1 -0
  258. package/lib/src/owlly/utils/basic-tools.d.ts +71 -0
  259. package/lib/src/owlly/utils/basic-tools.js +236 -0
  260. package/lib/src/owlly/utils/basic-tools.js.map +1 -0
  261. package/lib/src/owlly/utils/bvh-tree.d.ts +105 -0
  262. package/lib/src/owlly/utils/bvh-tree.js +540 -0
  263. package/lib/src/owlly/utils/bvh-tree.js.map +1 -0
  264. package/lib/src/owlly/utils/camera.d.ts +37 -0
  265. package/lib/src/owlly/utils/camera.js +51 -0
  266. package/lib/src/owlly/utils/camera.js.map +1 -0
  267. package/lib/src/owlly/utils/cube-texture-cache.d.ts +25 -0
  268. package/lib/src/owlly/utils/cube-texture-cache.js +144 -0
  269. package/lib/src/owlly/utils/cube-texture-cache.js.map +1 -0
  270. package/lib/src/owlly/utils/device-utils.d.ts +18 -0
  271. package/lib/src/owlly/utils/device-utils.js +42 -0
  272. package/lib/src/owlly/utils/device-utils.js.map +1 -0
  273. package/lib/src/owlly/utils/environment-utils.d.ts +37 -0
  274. package/lib/src/owlly/utils/environment-utils.js +74 -0
  275. package/lib/src/owlly/utils/environment-utils.js.map +1 -0
  276. package/lib/src/owlly/utils/event-hub.d.ts +50 -0
  277. package/lib/src/owlly/utils/event-hub.js +107 -0
  278. package/lib/src/owlly/utils/event-hub.js.map +1 -0
  279. package/lib/src/owlly/utils/events.d.ts +219 -0
  280. package/lib/src/owlly/utils/events.js +220 -0
  281. package/lib/src/owlly/utils/events.js.map +1 -0
  282. package/lib/src/owlly/utils/geometry-utils.d.ts +119 -0
  283. package/lib/src/owlly/utils/geometry-utils.js +623 -0
  284. package/lib/src/owlly/utils/geometry-utils.js.map +1 -0
  285. package/lib/src/owlly/utils/helper.d.ts +6 -0
  286. package/lib/src/owlly/utils/helper.js +25 -0
  287. package/lib/src/owlly/utils/helper.js.map +1 -0
  288. package/lib/src/owlly/utils/index.d.ts +14 -0
  289. package/lib/src/owlly/utils/index.js +18 -0
  290. package/lib/src/owlly/utils/index.js.map +1 -0
  291. package/lib/src/owlly/utils/lru-cache.d.ts +26 -0
  292. package/lib/src/owlly/utils/lru-cache.js +110 -0
  293. package/lib/src/owlly/utils/lru-cache.js.map +1 -0
  294. package/lib/src/owlly/utils/map-utils.d.ts +7 -0
  295. package/lib/src/owlly/utils/map-utils.js +53 -0
  296. package/lib/src/owlly/utils/map-utils.js.map +1 -0
  297. package/lib/src/owlly/utils/number-utils.d.ts +8 -0
  298. package/lib/src/owlly/utils/number-utils.js +73 -0
  299. package/lib/src/owlly/utils/number-utils.js.map +1 -0
  300. package/lib/src/owlly/utils/panorama-model-util.d.ts +46 -0
  301. package/lib/src/owlly/utils/panorama-model-util.js +246 -0
  302. package/lib/src/owlly/utils/panorama-model-util.js.map +1 -0
  303. package/lib/src/owlly/utils/path-utils.d.ts +80 -0
  304. package/lib/src/owlly/utils/path-utils.js +729 -0
  305. package/lib/src/owlly/utils/path-utils.js.map +1 -0
  306. package/lib/src/owlly/utils/svgutils.d.ts +138 -0
  307. package/lib/src/owlly/utils/svgutils.js +562 -0
  308. package/lib/src/owlly/utils/svgutils.js.map +1 -0
  309. package/lib/src/owlly/utils/texture-cache.d.ts +29 -0
  310. package/lib/src/owlly/utils/texture-cache.js +116 -0
  311. package/lib/src/owlly/utils/texture-cache.js.map +1 -0
  312. package/lib/src/owlly/utils/tile-util.d.ts +187 -0
  313. package/lib/src/owlly/utils/tile-util.js +457 -0
  314. package/lib/src/owlly/utils/tile-util.js.map +1 -0
  315. package/lib/src/owlly/utils/time-profiler.d.ts +21 -0
  316. package/lib/src/owlly/utils/time-profiler.js +49 -0
  317. package/lib/src/owlly/utils/time-profiler.js.map +1 -0
  318. package/lib/src/owlly/view/__test__/perspective-view.spec.d.ts +0 -0
  319. package/lib/src/owlly/view/__test__/perspective-view.spec.js +22 -0
  320. package/lib/src/owlly/view/__test__/perspective-view.spec.js.map +1 -0
  321. package/lib/src/owlly/view/camera-view.d.ts +35 -0
  322. package/lib/src/owlly/view/camera-view.js +102 -0
  323. package/lib/src/owlly/view/camera-view.js.map +1 -0
  324. package/lib/src/owlly/view/index.d.ts +3 -0
  325. package/lib/src/owlly/view/index.js +6 -0
  326. package/lib/src/owlly/view/index.js.map +1 -0
  327. package/lib/src/owlly/view/orthographic-view.d.ts +40 -0
  328. package/lib/src/owlly/view/orthographic-view.js +95 -0
  329. package/lib/src/owlly/view/orthographic-view.js.map +1 -0
  330. package/lib/src/owlly/view/perspective-view.d.ts +40 -0
  331. package/lib/src/owlly/view/perspective-view.js +96 -0
  332. package/lib/src/owlly/view/perspective-view.js.map +1 -0
  333. package/lib/src/owlly/view/svg-map-view.d.ts +46 -0
  334. package/lib/src/owlly/view/svg-map-view.js +145 -0
  335. package/lib/src/owlly/view/svg-map-view.js.map +1 -0
  336. package/lib/src/owlly/view/view.d.ts +146 -0
  337. package/lib/src/owlly/view/view.js +318 -0
  338. package/lib/src/owlly/view/view.js.map +1 -0
  339. package/lib/src/web/main.centroid.d.ts +0 -0
  340. package/lib/src/web/main.centroid.js +74 -0
  341. package/lib/src/web/main.centroid.js.map +1 -0
  342. package/lib/src/web/main.hyma.meshline2d.d.ts +1 -0
  343. package/lib/src/web/main.hyma.meshline2d.js +76 -0
  344. package/lib/src/web/main.hyma.meshline2d.js.map +1 -0
  345. package/lib/src/web/main.jyfang.sample.d.ts +0 -0
  346. package/lib/src/web/main.jyfang.sample.js +122 -0
  347. package/lib/src/web/main.jyfang.sample.js.map +1 -0
  348. package/lib/src/web/main.rpeng.extrude.d.ts +1 -0
  349. package/lib/src/web/main.rpeng.extrude.js +180 -0
  350. package/lib/src/web/main.rpeng.extrude.js.map +1 -0
  351. package/lib/src/web/main.rpeng.mes.plane.d.ts +1 -0
  352. package/lib/src/web/main.rpeng.mes.plane.js +135 -0
  353. package/lib/src/web/main.rpeng.mes.plane.js.map +1 -0
  354. package/lib/src/web/main.rpeng.sample.d.ts +0 -0
  355. package/lib/src/web/main.rpeng.sample.js +318 -0
  356. package/lib/src/web/main.rpeng.sample.js.map +1 -0
  357. package/lib/src/web/main.rpeng.vr.d.ts +1 -0
  358. package/lib/src/web/main.rpeng.vr.js +141 -0
  359. package/lib/src/web/main.rpeng.vr.js.map +1 -0
  360. package/lib/src/web/main.sample.d.ts +1 -0
  361. package/lib/src/web/main.sample.js +52 -0
  362. package/lib/src/web/main.sample.js.map +1 -0
  363. package/lib/src/web/quattree.hyma.d.ts +0 -0
  364. package/lib/src/web/quattree.hyma.js +150 -0
  365. package/lib/src/web/quattree.hyma.js.map +1 -0
  366. package/lib/src/web/sensor-vr-plugin.d.ts +0 -0
  367. package/lib/src/web/sensor-vr-plugin.js +166 -0
  368. package/lib/src/web/sensor-vr-plugin.js.map +1 -0
  369. package/package.json +142 -0
  370. package/src/@types/SceneUtils.d.ts +9 -0
  371. package/src/@types/chaikin-smooth.d.ts +5 -0
  372. package/src/@types/global.d.ts +3 -0
  373. package/src/@types/snapsvg.d.ts +11 -0
  374. package/src/@types/svgson.d.ts +30 -0
  375. package/src/assets/favicon.ico +0 -0
  376. package/src/external/lines/line-geometry.ts +70 -0
  377. package/src/external/lines/line-material.ts +453 -0
  378. package/src/external/lines/line-segments-2.ts +194 -0
  379. package/src/external/lines/line-segments-geometry.ts +197 -0
  380. package/src/external/loaders/gltf-loader.ts +3004 -0
  381. package/src/external/orbit-controls.ts +1070 -0
  382. package/src/external/renderers/css-2d-renderer.ts +185 -0
  383. package/src/external/renderers/css-3d-renderer.ts +245 -0
  384. package/src/external/transform-controls.ts +1532 -0
  385. package/src/external/util/buffer-geometry-utils.ts +783 -0
  386. package/src/owlly/controller/aerial-element-controller.ts +277 -0
  387. package/src/owlly/controller/basic-controller.ts +1509 -0
  388. package/src/owlly/controller/camera-controller.ts +155 -0
  389. package/src/owlly/controller/controller.ts +76 -0
  390. package/src/owlly/controller/index.ts +15 -0
  391. package/src/owlly/controller/mouse-indicator-controller.ts +157 -0
  392. package/src/owlly/controller/orbit-control.ts +310 -0
  393. package/src/owlly/controller/panorama-adjust-controller.ts +183 -0
  394. package/src/owlly/controller/panorama-controller.ts +2234 -0
  395. package/src/owlly/controller/panorama-transform-controller.ts +151 -0
  396. package/src/owlly/controller/plane-controller.ts +222 -0
  397. package/src/owlly/controller/texture-controller.ts +949 -0
  398. package/src/owlly/controller/tile-panorama-controller.ts +1633 -0
  399. package/src/owlly/controller/transform-controller.ts +684 -0
  400. package/src/owlly/element/bottom-nav-element.ts +352 -0
  401. package/src/owlly/element/camera.ts +389 -0
  402. package/src/owlly/element/dom-2d-element.ts +88 -0
  403. package/src/owlly/element/dom-3d-element.ts +87 -0
  404. package/src/owlly/element/dom-label-2d.ts +497 -0
  405. package/src/owlly/element/element.ts +117 -0
  406. package/src/owlly/element/floor-model.ts +290 -0
  407. package/src/owlly/element/gif-kit/Gif.ts +509 -0
  408. package/src/owlly/element/gif-kit/GifColor.ts +44 -0
  409. package/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.ts +56 -0
  410. package/src/owlly/element/gif-kit/GifFrame.ts +207 -0
  411. package/src/owlly/element/gif-kit/GifImage.ts +26 -0
  412. package/src/owlly/element/gif-kit/GifParser.ts +254 -0
  413. package/src/owlly/element/gif-kit/GifPresenter.ts +46 -0
  414. package/src/owlly/element/gif-kit/GifVersion.ts +12 -0
  415. package/src/owlly/element/gltf-mesh-element.ts +184 -0
  416. package/src/owlly/element/index.ts +25 -0
  417. package/src/owlly/element/map-kit/area.ts +232 -0
  418. package/src/owlly/element/map-kit/block-set.ts +102 -0
  419. package/src/owlly/element/map-kit/block.ts +417 -0
  420. package/src/owlly/element/map-kit/index.ts +6 -0
  421. package/src/owlly/element/map-kit/shape.ts +285 -0
  422. package/src/owlly/element/mesh-element.ts +94 -0
  423. package/src/owlly/element/mesh-line-2d.ts +1032 -0
  424. package/src/owlly/element/meshline-o.ts +802 -0
  425. package/src/owlly/element/panorama-group.ts +1250 -0
  426. package/src/owlly/element/panorama.ts +1044 -0
  427. package/src/owlly/element/path-group.ts +212 -0
  428. package/src/owlly/element/path.ts +727 -0
  429. package/src/owlly/element/placeable-2d.ts +627 -0
  430. package/src/owlly/element/polygon-mesh.ts +344 -0
  431. package/src/owlly/element/ring-element.ts +517 -0
  432. package/src/owlly/element/sphere-mesh.ts +96 -0
  433. package/src/owlly/element/svg-floor-model.ts +200 -0
  434. package/src/owlly/element/svg-floors.ts +121 -0
  435. package/src/owlly/element/tile-panorama-group.ts +1314 -0
  436. package/src/owlly/element/tile-panorama.ts +636 -0
  437. package/src/owlly/element/tile-plane.ts +430 -0
  438. package/src/owlly/element/video-element.ts +190 -0
  439. package/src/owlly/geometries/ExtrudeGeometry2.ts +255 -0
  440. package/src/owlly/index.ts +19 -0
  441. package/src/owlly/overlay/canvas-overlay.ts +642 -0
  442. package/src/owlly/overlay/css-2d-overlay.ts +48 -0
  443. package/src/owlly/overlay/css-3d-overlay.ts +50 -0
  444. package/src/owlly/overlay/index.ts +11 -0
  445. package/src/owlly/overlay/label-overlay.ts +419 -0
  446. package/src/owlly/overlay/overlay.ts +17 -0
  447. package/src/owlly/overlay/path-overlay.ts +170 -0
  448. package/src/owlly/overlay/path-overlay2.ts +149 -0
  449. package/src/owlly/overlay/poi-overlay-3d.ts +1759 -0
  450. package/src/owlly/overlay/poi-overlay.ts +1739 -0
  451. package/src/owlly/owlly-2d/index.ts +108 -0
  452. package/src/owlly/screen/index.ts +1 -0
  453. package/src/owlly/screen/screen.ts +323 -0
  454. package/src/owlly/stage/__test__/stage.spec.ts +15 -0
  455. package/src/owlly/stage/externals.ts +45 -0
  456. package/src/owlly/stage/index.ts +12 -0
  457. package/src/owlly/stage/owlly.ts +223 -0
  458. package/src/owlly/stage/stage.ts +274 -0
  459. package/src/owlly/utils/alignment-utils.ts +84 -0
  460. package/src/owlly/utils/basic-calc.ts +141 -0
  461. package/src/owlly/utils/basic-tools.ts +286 -0
  462. package/src/owlly/utils/bvh-tree.ts +695 -0
  463. package/src/owlly/utils/camera.ts +72 -0
  464. package/src/owlly/utils/cube-texture-cache.ts +155 -0
  465. package/src/owlly/utils/device-utils.ts +53 -0
  466. package/src/owlly/utils/environment-utils.ts +81 -0
  467. package/src/owlly/utils/event-hub.ts +120 -0
  468. package/src/owlly/utils/events.ts +266 -0
  469. package/src/owlly/utils/geometry-utils.ts +749 -0
  470. package/src/owlly/utils/helper.ts +33 -0
  471. package/src/owlly/utils/index.ts +17 -0
  472. package/src/owlly/utils/lru-cache.ts +126 -0
  473. package/src/owlly/utils/map-utils.ts +55 -0
  474. package/src/owlly/utils/number-utils.ts +75 -0
  475. package/src/owlly/utils/panorama-model-util.ts +255 -0
  476. package/src/owlly/utils/path-utils.ts +837 -0
  477. package/src/owlly/utils/svgutils.ts +732 -0
  478. package/src/owlly/utils/texture-cache.ts +132 -0
  479. package/src/owlly/utils/tile-util.ts +563 -0
  480. package/src/owlly/utils/time-profiler.ts +57 -0
  481. package/src/owlly/view/__test__/perspective-view.spec.ts +23 -0
  482. package/src/owlly/view/camera-view.ts +114 -0
  483. package/src/owlly/view/index.ts +5 -0
  484. package/src/owlly/view/orthographic-view.ts +124 -0
  485. package/src/owlly/view/perspective-view.ts +125 -0
  486. package/src/owlly/view/svg-map-view.ts +187 -0
  487. package/src/owlly/view/view.ts +409 -0
  488. package/src/public/js/jsmpeg.min.js +3129 -0
  489. package/src/web/index.html +52 -0
  490. package/src/web/main.centroid.ts +85 -0
  491. package/src/web/main.hyma.meshline2d.ts +84 -0
  492. package/src/web/main.jyfang.sample.ts +139 -0
  493. package/src/web/main.rpeng.extrude.ts +194 -0
  494. package/src/web/main.rpeng.mes.plane.ts +161 -0
  495. package/src/web/main.rpeng.sample.ts +345 -0
  496. package/src/web/main.rpeng.vr.ts +159 -0
  497. package/src/web/main.sample.ts +59 -0
  498. package/src/web/quattree.hyma.ts +163 -0
  499. package/src/web/sensor-vr-plugin.ts +201 -0
  500. package/src/web/testPixel.png +0 -0
@@ -0,0 +1,1314 @@
1
+ import { NS_THREE, Externals } from '../stage/externals';
2
+ import { Element, ElementFrameContext } from './element';
3
+ import { CubeTextureCache } from '../utils/cube-texture-cache';
4
+ import { View } from '../view/view';
5
+ import { EventHub } from '../utils/event-hub';
6
+ import { FloorModel, GroundParameters } from './floor-model';
7
+ import { OwllyEvents, Events } from '../utils/events';
8
+ import { BasicTools } from '../utils/basic-tools';
9
+ import { TilePanorama } from './tile-panorama';
10
+ import { TextureController } from '../controller/texture-controller';
11
+
12
+ /** 全景点位显示模式
13
+ * 点位的显示/隐藏状态通过[setIndicatorVisibility]方法设置,
14
+ * 但是最终是否显示、以何外观显示,则是结合PanoramaGroup在当前View的显示模式来决定
15
+ * @param AlwaysHide 不论显示/隐藏的设置如何,都不显示
16
+ * @param AlwaysShow 不论显示/隐藏的设置如何,都不显示。该模式主要用于俯视全局视图用
17
+ * @param Editing 编辑模式,隐藏/显示状态的点位用不同的外观显示
18
+ * @param Show 按显示/隐葳的状态设置决定是否显示
19
+ */
20
+ enum IndicatorDisplayMode {
21
+ AlwaysHide, // 不论显示/隐藏的设置如何,都不显示
22
+ AlwaysShow, // 不论显示/隐藏的设置如何,都不显示
23
+ Editing, // 编辑模式,隐藏/显示状态的点位用不同的外观显示
24
+ Show, // 按显示/隐葳的状态设置决定是否显示
25
+ }
26
+
27
+ /**
28
+ * 全景图组显示状态配置
29
+ */
30
+ interface TilePanoramaGroupViewConfiguration {
31
+ targetView: View;
32
+ hidden?: boolean;
33
+ /** 可视范围半径,会根据此数值来决定预加载哪些全景图以及显示哪些点位 */
34
+ visibleRadius?: number;
35
+ /** 全景点位显示模式 */
36
+ indicatorDisplayMode?: IndicatorDisplayMode;
37
+ /** 是否显示模型包围盒,用于全景漫游时 */
38
+ showBoundBox?: boolean;
39
+ }
40
+
41
+ interface TilePanoramaData {
42
+ pid: number;
43
+ seqID: number;
44
+ textureURLs: string[];
45
+ neighbourPanoramaIDs: number[];
46
+ highTextureURLs?: string[];
47
+ useLowTextureURLsOnly?: boolean;
48
+ tiledTextureURLRoot?: string;
49
+ position?: NS_THREE.Vector3;
50
+ quaternion?: NS_THREE.Quaternion;
51
+ legacyMode?: boolean;
52
+ visible?: boolean;
53
+ offLineTextureUrls?: string[];
54
+ offLineTextureLevel?: number;
55
+ }
56
+
57
+ interface MeshExtended extends NS_THREE.Mesh {
58
+ hidden?: boolean;
59
+ }
60
+
61
+ /**
62
+ * 全景图组
63
+ * @noInheritDoc
64
+ */
65
+ class TilePanoramaGroup extends Element {
66
+ private initialized: boolean;
67
+
68
+ private needUpdate: boolean;
69
+
70
+ /** 当前全景点 */
71
+ public currentPanorama: TilePanorama | undefined;
72
+
73
+ /** 模型元素 */
74
+ public modelElement: NS_THREE.Object3D | null;
75
+
76
+ private groundParams?: GroundParameters;
77
+
78
+ private boundBox: NS_THREE.Mesh | null;
79
+
80
+ /** 当前全景点id */
81
+ public currentPanoramaID: number;
82
+
83
+ private panoramaDatas: Map<number, TilePanoramaData>;
84
+
85
+ private panoramaMap: Map<number, TilePanorama>;
86
+
87
+ private indicatorMeshPrototype: NS_THREE.Mesh;
88
+
89
+ private indicatorMaterials: Map<IndicatorDisplayMode, Map<boolean, NS_THREE.Material>>;
90
+
91
+ private indicatorShaderUniforms: { [uniform: string]: NS_THREE.IUniform };
92
+
93
+ private invisibleIndicatorShaderUniforms: { [uniform: string]: NS_THREE.IUniform };
94
+
95
+ private indicatorMap: Map<number, MeshExtended>;
96
+
97
+ private inSightIndicators: Array<number>;
98
+
99
+ private indicatorVisibilityMap: Map<number, boolean>;
100
+
101
+ private indicatorHiddenMap: Map<number, boolean>;
102
+
103
+ private indicatorPositionMap: Map<number, NS_THREE.Vector3>;
104
+
105
+ private indicatorImageURL: string;
106
+
107
+ private indicatorWidth: number;
108
+
109
+ private indicatorHeight: number;
110
+
111
+ private panoramaCreatingTasks: Map<number, Promise<TilePanorama>>;
112
+
113
+ private group: NS_THREE.Group;
114
+
115
+ private viewConfigurations: Map<View, TilePanoramaGroupViewConfiguration>;
116
+
117
+ private showInvisible: boolean;
118
+
119
+ private eventListeners: {
120
+ onFloorModelLoaded: Function;
121
+ };
122
+
123
+ private maxWorldDistance: number;
124
+
125
+ /** 默认有效半径 */
126
+ public static DefaultVisibleRadius = 10;
127
+
128
+ /** 标签显示半径 */
129
+ public static IndicatorRadius = 0.1;
130
+
131
+ /** 标签高度偏移 */
132
+ public static IndicatorOffsetZ = 0.1;
133
+
134
+ /** 全局缩放 */
135
+ private globalScale: number;
136
+
137
+ /**
138
+ * @param modelElement 模型对象,通常应该是FloorModel
139
+ * @param groundParams 地面参数对象,若有则在计算地面高度时忽略modelElement,优先使用它
140
+ * @param indicatorImageURL 显示状态全景点地面标识的图片URL
141
+ * @param invisibleIndicatorImageURL 编辑模式下隐藏状态全景点地面标识的图片URL
142
+ * @param indicatorWidth 全景点地面标识宽度
143
+ * @param indicatorHeight 全景点地面标识高度
144
+ * @example
145
+ * ``` typescript
146
+ * panoMgr = new TilePanoramaGroup(panoramaDataList, 2, {
147
+ * floorModel,
148
+ * groundParams,
149
+ * });
150
+ * stage.bindElement(panoMgr);
151
+ */
152
+ constructor(panoramaDataList: TilePanoramaData[],
153
+ options:
154
+ {
155
+ modelElement?: NS_THREE.Object3D;
156
+ groundParams?: GroundParameters;
157
+ indicatorImageURL?: string;
158
+ invisibleIndicatorImageURL?: string;
159
+ indicatorWidth?: number;
160
+ indicatorHeight?: number;
161
+ indicatorPositionMap?: Map<number, NS_THREE.Vector3>;
162
+ globalScale?: number;
163
+ showInvisible?: boolean;
164
+ }) {
165
+ super();
166
+
167
+ this.initialized = false;
168
+ // this.currentPanorama = null;
169
+ const {
170
+ modelElement,
171
+ groundParams,
172
+ indicatorImageURL,
173
+ invisibleIndicatorImageURL,
174
+ indicatorWidth,
175
+ indicatorHeight,
176
+ indicatorPositionMap,
177
+ globalScale,
178
+ showInvisible,
179
+ } = options || { globalScale: 1 };
180
+ const { THREE } = Externals.getInstance();
181
+ this.currentPanoramaID = -1;
182
+ this.panoramaMap = new Map();
183
+ this.indicatorMap = new Map();
184
+ this.indicatorVisibilityMap = new Map();
185
+ this.indicatorHiddenMap = new Map();
186
+ this.indicatorPositionMap = indicatorPositionMap ? indicatorPositionMap! : new Map();
187
+ this.inSightIndicators = [];
188
+ this.indicatorWidth = indicatorWidth || (2 * TilePanoramaGroup.IndicatorRadius);
189
+ this.indicatorHeight = indicatorHeight || (2 * TilePanoramaGroup.IndicatorRadius);
190
+ this.maxWorldDistance = 13;
191
+ this.globalScale = globalScale || 1;
192
+ this.showInvisible = showInvisible || false;
193
+ this.group = new THREE.Group();
194
+ this.add(this.group);
195
+
196
+ this.viewConfigurations = new Map<View, TilePanoramaGroupViewConfiguration>();
197
+
198
+ this.eventListeners = {
199
+ onFloorModelLoaded: (element: Element): void => {
200
+ if (element !== this.modelElement) return;
201
+ this.updateIndicatorsPositions();
202
+ },
203
+ };
204
+
205
+ this.groundParams = groundParams;
206
+
207
+ this.bindModelElement(modelElement);
208
+
209
+ this.initIndicator(indicatorImageURL, invisibleIndicatorImageURL);
210
+
211
+ this.initPanoramas(panoramaDataList);
212
+
213
+ this.initIndicatorPosition();
214
+
215
+ EventHub.on(OwllyEvents.ELEMENT_LOADED, this.eventListeners.onFloorModelLoaded);
216
+
217
+ this.initialized = false;
218
+ this.needUpdate = false;
219
+ }
220
+
221
+ /**
222
+ * @ignore
223
+ * @param panoramaDataList
224
+ */
225
+ private initPanoramas(panoramaDataList: TilePanoramaData[]): void {
226
+ this.panoramaDatas = new Map();
227
+ panoramaDataList.forEach((item: TilePanoramaData) => {
228
+ this.panoramaDatas.set(item.pid, item);
229
+ });
230
+
231
+ panoramaDataList.forEach((item: TilePanoramaData) => {
232
+ const panorama = new TilePanorama(
233
+ item.pid,
234
+ item.seqID,
235
+ item.useLowTextureURLsOnly
236
+ ? (item.textureURLs || item.highTextureURLs)
237
+ : (item.highTextureURLs || item.textureURLs),
238
+ item.neighbourPanoramaIDs,
239
+ item.useLowTextureURLsOnly ? 1 : 2,
240
+ item.offLineTextureUrls,
241
+ item.offLineTextureLevel,
242
+ item.position,
243
+ item.quaternion,
244
+ );
245
+ panorama.scale.set(this.globalScale, this.globalScale, this.globalScale);
246
+ this.putPanorama(panorama);
247
+ });
248
+ }
249
+
250
+ private initIndicatorPosition(): void {
251
+ if (this.modelElement instanceof FloorModel) {
252
+ if ((this.modelElement as FloorModel).isModelLoaded()) {
253
+ this.updateIndicatorsPositions();
254
+ }
255
+ }
256
+ }
257
+
258
+ /**
259
+ * 更新最大等级
260
+ * @param levelMax 最大等级
261
+ */
262
+ public updateLevelMax(levelMax: number): void{
263
+ if (this.panoramaMap) {
264
+ this.panoramaMap.forEach((pano: TilePanorama) => {
265
+ pano.levelMax = levelMax;
266
+ });
267
+ }
268
+ }
269
+
270
+ /**
271
+ * 销毁
272
+ * @param exceptForCubeTextureOfPID
273
+ */
274
+ public dispose(exceptForCubeTextureOfPID?: number): void {
275
+ super.dispose();
276
+ EventHub.off(OwllyEvents.ELEMENT_LOADED, this.eventListeners.onFloorModelLoaded);
277
+ if (this.panoramaMap) {
278
+ this.panoramaMap.forEach((pano: TilePanorama) => {
279
+ // console.info('#PanoCtrl# 5 Will remove pano:', pano.position);
280
+ this.group.remove(pano);
281
+ if (exceptForCubeTextureOfPID !== pano.pid) {
282
+ CubeTextureCache.sharedInstance.recycleCubeTexture(pano.textureURLs);
283
+ }
284
+ pano.dispose();
285
+ });
286
+ this.panoramaMap.clear();
287
+ }
288
+
289
+ if (this.indicatorMap) {
290
+ this.indicatorMap.forEach((indicator: NS_THREE.Mesh) => {
291
+ this.group.remove(indicator);
292
+ });
293
+ this.indicatorMap.clear();
294
+ }
295
+
296
+ if (this.boundBox) {
297
+ this.group.remove(this.boundBox);
298
+ this.boundBox.geometry.dispose();
299
+ this.boundBox = null;
300
+ }
301
+
302
+ this.remove(this.group);
303
+ }
304
+
305
+ /**
306
+ * 初始化indicator
307
+ * @param indicatorImageURL
308
+ * @param invisibleIndicatorImageURL
309
+ */
310
+ private initIndicator(indicatorImageURL?: string, invisibleIndicatorImageURL?: string): void {
311
+ const { THREE } = Externals.getInstance();
312
+ const vertexShader = `
313
+ varying vec2 vUv;
314
+ void main(){
315
+ vUv = uv;
316
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
317
+ }
318
+ `;
319
+ const fragmentShader = `
320
+ uniform sampler2D map;
321
+ uniform float opacity;
322
+ uniform vec4 blendColor;
323
+ varying vec2 vUv;
324
+ void main(){
325
+ vec4 texColor = texture2D(map, vUv);
326
+ gl_FragColor = vec4((texColor * (1.0 - blendColor.a) + blendColor * blendColor.a).rgb, texColor.a * opacity);
327
+ }
328
+ `;
329
+
330
+ this.indicatorShaderUniforms = {
331
+ map: {
332
+ type: 't',
333
+ value: null,
334
+ },
335
+ blendColor: {
336
+ type: 'v4',
337
+ value: new THREE.Vector4(0, 0, 0, 0),
338
+ },
339
+ opacity: { value: 1 },
340
+ } as { [uniform: string]: NS_THREE.IUniform };
341
+
342
+ this.invisibleIndicatorShaderUniforms = {
343
+ map: {
344
+ type: 't',
345
+ value: null,
346
+ },
347
+ blendColor: {
348
+ type: 'v4',
349
+ value: new THREE.Vector4(1.0, 0.0, 0.0, 0.5),
350
+ },
351
+ opacity: { value: 1 },
352
+ } as { [uniform: string]: NS_THREE.IUniform };
353
+
354
+ this.indicatorMaterials = new Map();
355
+ let indicatorMaterial;
356
+ let indicatorGeometry;
357
+ if (indicatorImageURL) {
358
+ indicatorGeometry = new THREE.PlaneBufferGeometry(
359
+ this.indicatorWidth,
360
+ this.indicatorHeight,
361
+ );
362
+
363
+ indicatorMaterial = new THREE.ShaderMaterial({
364
+ // 设置透明属性,这样透过全景图就能看到标签
365
+ transparent: true,
366
+ vertexShader,
367
+ fragmentShader,
368
+ uniforms: this.indicatorShaderUniforms,
369
+ side: NS_THREE.DoubleSide,
370
+ depthTest: false,
371
+ depthWrite: false,
372
+ name: 'indicatorMaterial',
373
+ });
374
+
375
+ this.indicatorImageURL = indicatorImageURL;
376
+ new THREE.TextureLoader().load(indicatorImageURL, (texture) => {
377
+ this.indicatorShaderUniforms.map.value = texture;
378
+ });
379
+ } else {
380
+ indicatorGeometry = new THREE.CircleGeometry(this.indicatorWidth / 2, 32);
381
+
382
+ indicatorMaterial = new THREE.MeshBasicMaterial({ transparent: true });
383
+ indicatorMaterial.side = NS_THREE.DoubleSide;
384
+ indicatorMaterial.depthTest = false;
385
+ indicatorMaterial.depthWrite = false;
386
+ indicatorMaterial.color = new THREE.Color(0xffffff);
387
+ }
388
+
389
+ let invisibleIndicatorMaterial;
390
+ const invisibleIndicatorImageURL1 = invisibleIndicatorImageURL || indicatorImageURL;
391
+ if (invisibleIndicatorImageURL1) {
392
+ invisibleIndicatorMaterial = new THREE.ShaderMaterial({
393
+ // 设置透明属性,这样透过全景图就能看到标签
394
+ transparent: true,
395
+ vertexShader,
396
+ fragmentShader,
397
+ uniforms: this.invisibleIndicatorShaderUniforms,
398
+ side: NS_THREE.DoubleSide,
399
+ depthTest: false,
400
+ depthWrite: false,
401
+ name: 'invisibleIndicatorMaterial',
402
+ });
403
+ new THREE.TextureLoader().load(invisibleIndicatorImageURL1, (texture) => {
404
+ this.invisibleIndicatorShaderUniforms.map.value = texture;
405
+ });
406
+ } else {
407
+ invisibleIndicatorMaterial = new THREE.MeshBasicMaterial();
408
+ invisibleIndicatorMaterial.side = NS_THREE.DoubleSide;
409
+ invisibleIndicatorMaterial.depthTest = false;
410
+ invisibleIndicatorMaterial.depthWrite = false;
411
+ invisibleIndicatorMaterial.color = new THREE.Color(0xff0000);
412
+ }
413
+ const indicator = new THREE.Mesh(indicatorGeometry, indicatorMaterial);
414
+ this.setIndicatorMeshPrototype(indicator);
415
+ this.setIndicatorMaterial(indicatorMaterial, IndicatorDisplayMode.Editing, true);
416
+ this.setIndicatorMaterial(invisibleIndicatorMaterial, IndicatorDisplayMode.Editing, false);
417
+ this.setIndicatorMaterial(indicatorMaterial, IndicatorDisplayMode.Show, true);
418
+ }
419
+
420
+ /**
421
+ * 更新标签
422
+ */
423
+ private updateIndicators(): void {
424
+ const pidPositionMap = this.getPIDPositionMap(this.inSightIndicators);
425
+ pidPositionMap.forEach((p: NS_THREE.Vector3, pid: number) => {
426
+ const position = this.indicatorPositionMap.get(pid);
427
+ if (!position) {
428
+ if (this.groundParams || this.modelElement instanceof FloorModel) {
429
+ let precisePosition;
430
+ // console.log('## TilePanoramaGroup.update() will update indicator position');
431
+ if (this.groundParams && this.groundParams.groundPlane) {
432
+ precisePosition = FloorModel.intersectWithGroundPlane(p, this.groundParams);
433
+ } else {
434
+ const model = this.modelElement as FloorModel;
435
+ precisePosition = model.intersectGround(p);
436
+ }
437
+ if (precisePosition) {
438
+ this.indicatorPositionMap.set(pid, precisePosition);
439
+ }
440
+ }
441
+ }
442
+ });
443
+ this.inSightIndicators.forEach((pid: number) => {
444
+ let indicator = this.indicatorMap.get(pid);
445
+ if (!indicator) {
446
+ indicator = this.indicatorMeshPrototype.clone();
447
+ this.indicatorMap.set(pid, indicator);
448
+ this.group.add(indicator);
449
+
450
+ const panoData = this.panoramaDatas.get(pid);
451
+ if (panoData && panoData.position) {
452
+ indicator.position.copy(panoData.position);
453
+ }
454
+ }
455
+ const position = this.indicatorPositionMap.get(pid);
456
+ if (position) {
457
+ indicator.position.copy(position);
458
+ }
459
+ });
460
+ }
461
+
462
+ /**
463
+ * @ignore
464
+ */
465
+ public update(): ElementFrameContext {
466
+ const frameContext = new ElementFrameContext(this);
467
+ if (!this.initialized) {
468
+ this.initialized = true;
469
+ frameContext.needUpdate = true;
470
+ } else if (this.needUpdate) {
471
+ this.updateIndicators();
472
+ this.needUpdate = false;
473
+ frameContext.needUpdate = true;
474
+ } else if (this.currentPanorama) {
475
+ const subFrameContext = this.currentPanorama.update();
476
+ if (subFrameContext.needUpdate) {
477
+ frameContext.needUpdate = true;
478
+ }
479
+ }
480
+ if (this.initialized && !this.parent) {
481
+ frameContext.shouldPlaceElement = true;
482
+ }
483
+ return frameContext;
484
+ }
485
+
486
+ /**
487
+ * 绑定模型Element对象(用于创建天空包围盒供全景切换时使用)
488
+ * @param modelElement 模型Element对象
489
+ */
490
+ public bindModelElement(modelElement?: NS_THREE.Object3D): void {
491
+ if (modelElement) {
492
+ this.modelElement = modelElement;
493
+ }
494
+ if (this.boundBox) {
495
+ this.group.remove(this.boundBox);
496
+ this.boundBox = null;
497
+ }
498
+ this.getModelBoundBox();
499
+ }
500
+
501
+ /**
502
+ * 获取盒子
503
+ * @param rootObj
504
+ * @param globalScale
505
+ * @returns
506
+ */
507
+ public static getBoundBox(rootObj: NS_THREE.Object3D | null): NS_THREE.Mesh | null {
508
+ if (!rootObj) return null;
509
+ const { THREE } = Externals.getInstance();
510
+ const box = new THREE.Box3().setFromObject(rootObj);
511
+ const size = box.getSize(new THREE.Vector3());
512
+ const sideLength = Math.max(size.x, size.y, size.z);// 外扩10个单位
513
+
514
+ // const minX = -sideLength;
515
+ // const maxX = sideLength;
516
+ // const minY = -sideLength;
517
+ // const maxY = sideLength;
518
+ // const minZ = -sideLength;
519
+ // const maxZ = sideLength;
520
+ // const boundBox = new THREE.Mesh(new THREE.BoxBufferGeometry(maxX - minX, maxY - minY, maxZ - minZ));
521
+ // boundBox.position.set((maxX + minX) / 2, (maxY + minY) / 2, (maxZ + minZ) / 2);
522
+ const boundBox = new THREE.Mesh(new THREE.BoxBufferGeometry(sideLength, sideLength, sideLength));
523
+ boundBox.position.copy(box.max.clone().add(box.min).multiplyScalar(0.5));
524
+ return boundBox;
525
+ }
526
+
527
+ /**
528
+ * 获取模型盒子
529
+ * @returns
530
+ */
531
+ private getModelBoundBox(): void {
532
+ if (this.boundBox) return;
533
+ this.boundBox = TilePanoramaGroup.getBoundBox(this.modelElement);
534
+ if (this.boundBox) {
535
+ this.boundBox.visible = true;
536
+ // 设置天空盒不被视锥裁剪,这样天空盒资源就能直接加载到GPU里面
537
+ this.boundBox.frustumCulled = false;
538
+ this.boundBox.renderOrder = 100;
539
+ this.group.add(this.boundBox);
540
+ }
541
+ }
542
+
543
+ /**
544
+ * 设置包围盒出现
545
+ * @param material
546
+ * @returns
547
+ */
548
+ public setBoundBoxAppearance(material: NS_THREE.Material): void {
549
+ this.getModelBoundBox();
550
+ if (!this.boundBox) return;
551
+ this.boundBox.material = material;
552
+ this.needUpdate = true;
553
+ }
554
+
555
+ private setBoundBoxVisible(visible: boolean): void {
556
+ if (!this.boundBox) return;
557
+ this.boundBox.visible = visible;
558
+ }
559
+
560
+ /**
561
+ * 加载指定全景图并加入场景(显示要通过PanoramaController)
562
+ * @param panorama 要加载的全景图
563
+ */
564
+ private async presentPanorama(panorama: TilePanorama): Promise<number> {
565
+ const res = await this.initTexturesByPanorama(panorama);
566
+ return res;
567
+ }
568
+
569
+ /**
570
+ * 根据全景对象初始化纹理
571
+ * @param panorama
572
+ */
573
+ private async initTexturesByPanorama(panorama: TilePanorama): Promise<number> {
574
+ panorama.updateLevel(0);
575
+ // console.log('initTextures', panorama.pid);
576
+ const needInits = panorama.getPreTextureInfos();
577
+ const res = await TextureController.instance.initTextures(needInits);
578
+ return res;
579
+ // console.log('initTexturesEnd', panorama.pid);
580
+ }
581
+
582
+ /**
583
+ * 加载指定PID的全景图并加入场景(显示要通过PanoramaController)
584
+ * @param pid 要加载的全景图ID
585
+ */
586
+ private async presentPanoramaOfPID(pid: number): Promise<number> {
587
+ const pano = this.getPanoramaByPID(pid);
588
+ let res = 1;
589
+ if (pano) {
590
+ res = await this.presentPanorama(pano);
591
+ }
592
+ if (res) {
593
+ this.currentPanoramaID = pid;
594
+ this.currentPanorama = pano;
595
+ this.emit(Events.PANORAMA_PRESENTED, pid);
596
+ }
597
+ return res;
598
+ }
599
+
600
+ private visibleRadiusOfView(view?: View): number {
601
+ if (!view) return TilePanoramaGroup.DefaultVisibleRadius;
602
+ const conf = this.viewConfigurations.get(view);
603
+ if (conf && conf.visibleRadius) return conf.visibleRadius;
604
+ return TilePanoramaGroup.DefaultVisibleRadius;
605
+ }
606
+
607
+ /**
608
+ * @ignore
609
+ * @param centerPID
610
+ * @param view
611
+ * @returns
612
+ */
613
+ public panoramaIDsAround(centerPID: number, view?: View): number[] | null {
614
+ const rootNode = this.panoramaDatas.get(centerPID);
615
+ if (!rootNode || !rootNode.position) {
616
+ return null;
617
+ }
618
+ const ret: number[] = [centerPID];
619
+
620
+ const visibleRadius = this.visibleRadiusOfView(view);
621
+ const neighbours = rootNode.neighbourPanoramaIDs.map((pid: number) => this.panoramaDatas.get(pid));
622
+ neighbours.forEach((neighbour: TilePanoramaData | undefined) => {
623
+ if (neighbour && neighbour.position) {
624
+ const distance = rootNode.position!.distanceTo(neighbour.position);
625
+ if ((this.showInvisible || neighbour.visible) && distance <= visibleRadius) { ret.push(neighbour.pid); }
626
+ }
627
+ });
628
+ return ret;
629
+ }
630
+
631
+ /**
632
+ * 设置当前位于的全景点位。将加载指定全景点并预加载其相邻全景点
633
+ * @param {number} currentPID 全景点位ID
634
+ * @returns 1为初始化成功, 0为初始化失败
635
+ */
636
+ public async presentPanoramaAround(currentPID: number, view?: View): Promise<number> {
637
+ const panoIDs: number[] | null = this.panoramaIDsAround(currentPID, view);
638
+ let res = 1;
639
+ if (panoIDs) {
640
+ res = await this.presentPanoramaOfPID(currentPID);
641
+ }
642
+ return res;
643
+ }
644
+
645
+ /** @ignore */
646
+ private getPIDPositionMap(pids: number[]): Map<number, NS_THREE.Vector3> {
647
+ const ret = new Map<number, NS_THREE.Vector3>();
648
+ pids.forEach((value: number) => {
649
+ const panoData = this.panoramaDatas.get(value);
650
+ if (panoData) {
651
+ ret.set(value, panoData.position!);
652
+ }
653
+ });
654
+ return ret;
655
+ }
656
+
657
+ /**
658
+ * 根据pid获取标签的位置
659
+ * @param pid
660
+ * @returns
661
+ */
662
+ public getIndicatorPosition(pid: number): NS_THREE.Vector3 | undefined {
663
+ return this.indicatorPositionMap.get(pid);
664
+ }
665
+
666
+ /**
667
+ * 显示指定全景点位标签
668
+ * @param pidPositionMap 从PID映射到全景点位位置的Map
669
+ */
670
+ public presentPanoramaIndicators(pidPositionMap: Map<number, NS_THREE.Vector3>): void {
671
+ if (!this.modelElement) return;
672
+ const { THREE } = Externals.getInstance();
673
+ this.inSightIndicators = [];
674
+ pidPositionMap.forEach((position: NS_THREE.Vector3, pid: number) => {
675
+ if (this.groundParams || this.modelElement instanceof FloorModel) {
676
+ const savedPosition = this.indicatorPositionMap.get(pid);
677
+ if (!savedPosition) {
678
+ let p;
679
+ // console.log('## TilePanoramaGroup.presentPanoramaIndicators() will update indicator position');
680
+ if (this.groundParams && this.groundParams.groundPlane) {
681
+ p = FloorModel.intersectWithGroundPlane(position, this.groundParams);
682
+ } else {
683
+ const model = this.modelElement as FloorModel;
684
+ p = model.intersectGround(position);
685
+ }
686
+ if (p) {
687
+ this.indicatorPositionMap.set(pid, p.add(new THREE.Vector3(0, 0, TilePanoramaGroup.IndicatorOffsetZ)));
688
+ }
689
+ }
690
+ }
691
+ this.inSightIndicators.push(pid);
692
+ });
693
+ this.needUpdate = true;
694
+ }
695
+
696
+ /**
697
+ * 更新标签位置
698
+ */
699
+ private async updateIndicatorsPositions(): Promise<void> {
700
+ const { THREE } = Externals.getInstance();
701
+ this.panoramaMap.forEach((pano: TilePanorama, pid: number) => {
702
+ const savedPosition = this.indicatorPositionMap.get(pid);
703
+ if (savedPosition) return;
704
+ const { position } = pano;
705
+ let p;
706
+ // console.log('## TilePanoramaGroup.presentPanoramaIndicators() will update indicator position');
707
+ if (this.groundParams && this.groundParams.groundPlane) {
708
+ p = FloorModel.intersectWithGroundPlane(position, this.groundParams);
709
+ } else {
710
+ const model = this.modelElement as FloorModel;
711
+ p = model.intersectGround(position);
712
+ }
713
+ if (p) {
714
+ this.indicatorPositionMap.set(pid, p.add(new THREE.Vector3(0, 0, TilePanoramaGroup.IndicatorOffsetZ)));
715
+ }
716
+ });
717
+
718
+ const pidPositionMap = await this.getPIDPositionMap(this.inSightIndicators);
719
+ this.presentPanoramaIndicators(pidPositionMap);
720
+ }
721
+
722
+ /**
723
+ * 显示指定全景点及其相邻全景点上的标签
724
+ * @param pid “中心”全景点ID,一般指摄像机当前所在的全景点PID
725
+ */
726
+ public async presentPanoramaIndicatorsAround(pid: number, view?: View): Promise<void> {
727
+ const pids = this.panoramaIDsAround(pid, view);
728
+ if (pids) {
729
+ const pidPositionMap = await this.getPIDPositionMap(pids);
730
+ this.presentPanoramaIndicators(pidPositionMap);
731
+ }
732
+ }
733
+
734
+ /**
735
+ * 获取pid的标签是否可见
736
+ * @param pid
737
+ * @returns
738
+ */
739
+ public getIndicatorVisibility(pid: number): boolean {
740
+ const visibility = this.indicatorVisibilityMap.get(pid);
741
+ if (undefined === visibility) return true;
742
+ return visibility;
743
+ }
744
+
745
+ /**
746
+ * 设置指定全景点位的显示/隐藏状态
747
+ * @param visibility 显示/隐藏状态
748
+ * @param pid 可选,可以是全景图点位PID数组,也可以是单个PID,
749
+ * 若不设置则应用到本PanoramaGroup的所有全景点位上
750
+ */
751
+ public setIndicatorVisibility(visibility: boolean, pid?: number | number[]): void {
752
+ let pidArray: number[];
753
+ if (pid === undefined) {
754
+ pidArray = [];
755
+ this.indicatorMap.forEach((value: NS_THREE.Mesh, key: number) => {
756
+ pidArray.push(key);
757
+ });
758
+ } else if (Array.isArray(pid)) {
759
+ pidArray = pid;
760
+ } else {
761
+ pidArray = [pid as number];
762
+ }
763
+
764
+ pidArray.forEach((value: number) => {
765
+ this.indicatorVisibilityMap.set(value, visibility);
766
+
767
+ const indicator = this.indicatorMap.get(value);
768
+ if (indicator) {
769
+ this.group.remove(indicator);
770
+ this.indicatorMap.delete(value);
771
+ }
772
+ });
773
+ this.needUpdate = true;
774
+ }
775
+
776
+ /**
777
+ * 设置标签隐藏
778
+ * @param hidden 隐藏
779
+ * @param pid 指定pid
780
+ */
781
+ public setIndicatorHidden(hidden: boolean, pid?: number | number[]): void {
782
+ let pidArray: number[];
783
+ if (pid === undefined) {
784
+ pidArray = [];
785
+ this.indicatorMap.forEach((value: NS_THREE.Mesh, key: number) => {
786
+ pidArray.push(key);
787
+ });
788
+ } else if (Array.isArray(pid)) {
789
+ pidArray = pid;
790
+ } else {
791
+ pidArray = [pid as number];
792
+ }
793
+
794
+ pidArray.forEach((value: number) => {
795
+ this.indicatorHiddenMap.set(value, hidden);
796
+
797
+ const indicator = this.indicatorMap.get(value);
798
+ if (indicator) {
799
+ this.group.remove(indicator);
800
+ this.indicatorMap.delete(value);
801
+ }
802
+ });
803
+ this.needUpdate = true;
804
+ }
805
+
806
+ /**
807
+ * 与全景点标志作相交测试
808
+ * 若有任一个全景点标志与射线相交则返回最近一个的相应PID
809
+ * 若没有则返回-1
810
+ * @param rayOrigin 射线起点
811
+ * @param rayDirection 射线方向
812
+ */
813
+ public intersectIndicators(rayOrigin: NS_THREE.Vector3, rayDirection: NS_THREE.Vector3): number {
814
+ let results: Array<{ pid: number; distance: number }> = [];
815
+ const v = rayDirection.normalize();
816
+ const radius = Math.min(this.indicatorHeight, this.indicatorWidth) / 2;
817
+ this.indicatorMap.forEach((indicator: NS_THREE.Mesh, pid: number) => {
818
+ const p = indicator.position;
819
+ if (Number.isNaN(p.x)) return;
820
+ const u = p.clone().sub(rayOrigin);
821
+ const uDotV = u.dot(v);
822
+ if (uDotV > 0) {
823
+ const uOnV = v.clone().multiplyScalar(uDotV);
824
+ const distance = u.sub(uOnV).length();
825
+ if (distance <= radius) {
826
+ results.push({
827
+ pid,
828
+ distance,
829
+ });
830
+ }
831
+ }
832
+ });
833
+ if (results.length > 0) {
834
+ results = results.sort((a, b) => {
835
+ if (a.distance < b.distance) return -1;
836
+ if (a.distance > b.distance) return 1;
837
+ return 0;
838
+ });
839
+ return results[0].pid;
840
+ }
841
+ return -1;
842
+ }
843
+
844
+ /**
845
+ * @ignore
846
+ * @param screenPosition
847
+ * @param radius
848
+ * @param param2
849
+ * @param camera
850
+ * @returns
851
+ */
852
+ public intersectIndicatorsOnScreen(
853
+ screenPosition: NS_THREE.Vector2,
854
+ radius: number,
855
+ { screenWidth, screenHeight }: { screenWidth: number; screenHeight: number },
856
+ camera: NS_THREE.Camera,
857
+ ): number {
858
+ const indicatorsEntries = Array.from(this.indicatorMap);
859
+ const indicators = indicatorsEntries.map(([, mesh]) => mesh);
860
+ const intersection = BasicTools.getMouseIntersectionOnScreen(
861
+ indicators,
862
+ screenPosition,
863
+ { screenWidth, screenHeight },
864
+ radius,
865
+ camera,
866
+ indicators,
867
+ this.maxWorldDistance,
868
+ );
869
+ if (intersection) {
870
+ const target = indicatorsEntries.find(([, mesh]) => mesh === intersection);
871
+ if (target) return target[0];
872
+ }
873
+ return -1;
874
+ }
875
+
876
+ /**
877
+ * 添加全景点
878
+ * @param {Panorama} pano 全景图对象
879
+ */
880
+ public putPanorama(pano: TilePanorama): void {
881
+ const oldNode = this.panoramaMap.get(pano.pid);
882
+ if (oldNode) {
883
+ // console.info('#PanoCtrl# 4 Will remove pano:', oldNode.position);
884
+ this.group.remove(oldNode);
885
+ oldNode.dispose();
886
+ }
887
+ this.panoramaMap.set(pano.pid, pano);
888
+ // pano.visible = false;
889
+ this.group.add(pano);
890
+ this.needUpdate = true;
891
+ }
892
+
893
+ /**
894
+ * 指定预构建全景对象的顺序策略
895
+ * @param preInitStrategy 多义参数,表示具体的创建顺序
896
+ * 当为'all'时,直接按构造函数中panoramaDataList的顺序创建全部全景对象
897
+ * 当为一个整数值时,表示一个全景PID,将按全景点邻接关系以广度优先搜索的顺序创建全景对象
898
+ * 当为一个整数数组时,以数组指定的PID顺序依次创建
899
+ */
900
+ public async initializePanoramasIfNecessary(preInitStrategy: 'all' | number | number[]): Promise<(TilePanorama | undefined)[]> {
901
+ let pids: number[] = [];
902
+ if (Array.isArray(preInitStrategy)) {
903
+ pids = preInitStrategy as number[];
904
+ } else if (preInitStrategy === 'all') {
905
+ pids = Array.from(this.panoramaDatas.keys());
906
+ } else {
907
+ const pid0 = preInitStrategy as number;
908
+ pids.push(pid0);
909
+ const visited: Set<number> = new Set();
910
+ visited.add(pid0);
911
+ const bfsQueue: number[] = [pid0];
912
+ while (bfsQueue.length > 0) {
913
+ const pid = bfsQueue.splice(0, 1)[0];
914
+ const pano = this.panoramaDatas.get(pid);
915
+ if (pano) {
916
+ pano.neighbourPanoramaIDs.forEach((neighbourPID: number) => {
917
+ if (!visited.has(neighbourPID)) {
918
+ visited.add(neighbourPID);
919
+ bfsQueue.push(neighbourPID);
920
+ pids.push(neighbourPID);
921
+ }
922
+ });
923
+ }
924
+ }
925
+ }
926
+ const promises = pids.map((pid: number) => this.getPanoramaByPID(pid));
927
+ return Promise.all(promises);
928
+ }
929
+
930
+ /**
931
+ * 获得指定ID的全景点对象
932
+ * @param pid 全景点ID
933
+ */
934
+ public getPanoramaByPID(pid: number): TilePanorama | undefined {
935
+ const ret = this.panoramaMap.get(pid);
936
+ if (ret) {
937
+ return ret;
938
+ }
939
+ const item = this.panoramaDatas.get(pid);
940
+ if (!item) {
941
+ return undefined;
942
+ }
943
+ const panorama = new TilePanorama(
944
+ item.pid,
945
+ item.seqID,
946
+ item.useLowTextureURLsOnly
947
+ ? (item.textureURLs || item.highTextureURLs)
948
+ : (item.highTextureURLs || item.textureURLs),
949
+ item.neighbourPanoramaIDs,
950
+ item.useLowTextureURLsOnly ? 1 : 2,
951
+ item.offLineTextureUrls,
952
+ item.offLineTextureLevel,
953
+ item.position,
954
+ item.quaternion,
955
+ );
956
+ panorama.scale.set(this.globalScale, this.globalScale, this.globalScale);
957
+ this.putPanorama(panorama);
958
+ return panorama;
959
+ }
960
+
961
+ /**
962
+ * 立刻获得指定ID的全景点对象
963
+ * @param pid 全景点ID
964
+ */
965
+ public getPanoramaByPIDInstant(pid: number): TilePanorama | null {
966
+ const ret = this.panoramaMap.get(pid);
967
+ return ret || null;
968
+ }
969
+
970
+ /**
971
+ * @ignore
972
+ * @param rayDirection
973
+ */
974
+ public getNeghbourPanoClosestToRay(rayDirection: NS_THREE.Vector3): number {
975
+ if (this.currentPanoramaID === -1) return -1;
976
+ const pano = this.panoramaMap.get(this.currentPanoramaID);
977
+ if (!pano) return -1;
978
+ if (!pano.neighborPanoramaIDs || pano.neighborPanoramaIDs.length === 0) return -1;
979
+
980
+ const AngleDegreeThreshold = 12.0;
981
+ const direction = rayDirection.clone().normalize();
982
+ let maxCos = -1.0;
983
+ let ret = -1;
984
+ pano.neighborPanoramaIDs.forEach((pid) => {
985
+ const neighbour = this.panoramaMap.get(pid);
986
+ if (!neighbour) return;
987
+
988
+ const cosin = neighbour.position.clone().sub(pano.position).normalize().dot(direction);
989
+ if (cosin > maxCos) {
990
+ maxCos = cosin;
991
+ ret = pid;
992
+ }
993
+ });
994
+ if (maxCos >= Math.cos(Math.PI * AngleDegreeThreshold / 180.0)) {
995
+ return ret;
996
+ }
997
+
998
+ return -1;
999
+ }
1000
+
1001
+ /**
1002
+ * @ignore
1003
+ */
1004
+ public updateIndicatorGeometry(): void {
1005
+ const { THREE } = Externals.getInstance();
1006
+ let indicatorGeometry: NS_THREE.PlaneBufferGeometry | NS_THREE.CircleGeometry;
1007
+ if (this.indicatorImageURL) {
1008
+ indicatorGeometry = new THREE.PlaneBufferGeometry(
1009
+ this.indicatorWidth,
1010
+ this.indicatorHeight,
1011
+ );
1012
+ } else {
1013
+ indicatorGeometry = new THREE.CircleGeometry(this.indicatorWidth / 2, 32);
1014
+ }
1015
+ const indicatorSet = new Set();
1016
+ Array.from(this.indicatorMap).forEach(([, mesh]) => {
1017
+ indicatorSet.add(mesh.geometry);
1018
+ mesh.geometry = indicatorGeometry;
1019
+ });
1020
+ Array.from(indicatorSet).forEach((geometry: NS_THREE.PlaneBufferGeometry | NS_THREE.CircleGeometry) => {
1021
+ geometry.dispose();
1022
+ });
1023
+ this.indicatorMeshPrototype.geometry = indicatorGeometry;
1024
+ const indicator = new THREE.Mesh(indicatorGeometry, this.indicatorMeshPrototype.material);
1025
+ this.setIndicatorMeshPrototype(indicator);
1026
+ }
1027
+
1028
+ /**
1029
+ * 改变地面全景点标识的尺寸
1030
+ * @param width 宽度
1031
+ * @param height 高度
1032
+ */
1033
+ public setIndicatorSize(width: number, height: number): void {
1034
+ this.indicatorWidth = width;
1035
+ this.indicatorHeight = height;
1036
+ this.updateIndicatorGeometry();
1037
+ }
1038
+
1039
+ /**
1040
+ * 设置标签的图片
1041
+ * @param url
1042
+ */
1043
+ public setIndicatorImageURL(url: string): void {
1044
+ const { THREE } = Externals.getInstance();
1045
+ new THREE.TextureLoader().load(url, (texture) => {
1046
+ const vertexShader = `
1047
+ varying vec2 vUv;
1048
+ void main(){
1049
+ vUv = uv;
1050
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
1051
+ }
1052
+ `;
1053
+ const fragmentShader = `
1054
+ uniform sampler2D map;
1055
+ uniform float opacity;
1056
+ uniform vec4 blendColor;
1057
+ varying vec2 vUv;
1058
+ void main(){
1059
+ vec4 texColor = texture2D(map, vUv);
1060
+ gl_FragColor = vec4((texColor * (1.0 - blendColor.a) + blendColor * blendColor.a).rgb, texColor.a * opacity);
1061
+ }
1062
+ `;
1063
+ let currentMaterial = this.getIndicatorMaterial(IndicatorDisplayMode.Editing, true)!;
1064
+ let newMaterial = new THREE.ShaderMaterial({
1065
+ // 设置透明属性,这样透过全景图就能看到标签
1066
+ transparent: true,
1067
+ vertexShader,
1068
+ fragmentShader,
1069
+ uniforms: this.indicatorShaderUniforms,
1070
+ side: NS_THREE.DoubleSide,
1071
+ depthTest: false,
1072
+ depthWrite: false,
1073
+ name: 'indicatorMaterial',
1074
+ });
1075
+ this.setIndicatorMaterial(newMaterial, IndicatorDisplayMode.Editing, true);
1076
+ currentMaterial.dispose();
1077
+
1078
+ currentMaterial = this.getIndicatorMaterial(IndicatorDisplayMode.Show, true)!;
1079
+ this.setIndicatorMaterial(newMaterial, IndicatorDisplayMode.Show, true);
1080
+ currentMaterial.dispose();
1081
+
1082
+ newMaterial = new THREE.ShaderMaterial({
1083
+ transparent: true,
1084
+ vertexShader,
1085
+ fragmentShader,
1086
+ uniforms: this.invisibleIndicatorShaderUniforms,
1087
+ side: NS_THREE.DoubleSide,
1088
+ depthTest: false,
1089
+ depthWrite: false,
1090
+ name: 'invisibleIndicatorMaterial',
1091
+ });
1092
+
1093
+ this.indicatorShaderUniforms.map.value = texture;
1094
+ this.invisibleIndicatorShaderUniforms.map.value = texture;
1095
+ this.setIndicatorMaterial(newMaterial, IndicatorDisplayMode.Editing, false);
1096
+ if (!this.indicatorImageURL) {
1097
+ this.setIndicatorMeshPrototype(new THREE.Mesh(
1098
+ new THREE.PlaneBufferGeometry(
1099
+ this.indicatorWidth,
1100
+ this.indicatorHeight,
1101
+ ),
1102
+ newMaterial,
1103
+ ));
1104
+ }
1105
+ this.indicatorImageURL = url;
1106
+ this.needUpdate = true;
1107
+ this.updateIndicatorGeometry();
1108
+ });
1109
+ }
1110
+
1111
+ /**
1112
+ * 查询当前设置的地面全景点标识尺寸
1113
+ * @returns number数组,依次是width, height
1114
+ */
1115
+ public getIndicatorSize(): number[] {
1116
+ return [this.indicatorWidth, this.indicatorHeight];
1117
+ }
1118
+
1119
+ private setIndicatorMeshPrototype(mesh: NS_THREE.Mesh): void {
1120
+ this.indicatorMeshPrototype = mesh;
1121
+ this.panoramaMap.forEach((pano: TilePanorama, pid: number) => {
1122
+ const indicator = this.indicatorMap.get(pid);
1123
+ if (indicator) {
1124
+ this.group.remove(indicator);
1125
+ this.indicatorMap.delete(pid);
1126
+ }
1127
+ });
1128
+ mesh.renderOrder = 300;
1129
+ this.needUpdate = true;
1130
+ }
1131
+
1132
+ /**
1133
+ * 设定全景点位标签的原型对象,每个全景点位的标签会以该原型对象为母本clone出来
1134
+ * @param prototypeObject 点位标签原型Object3D对象
1135
+ * @param mode 点位的展示模式
1136
+ * @param visibility 点位的显隐状态设置
1137
+ */
1138
+ public setIndicatorMaterial(material: NS_THREE.Material, mode: IndicatorDisplayMode, visibility: boolean): void {
1139
+ let map1 = this.indicatorMaterials.get(mode);
1140
+ if (!map1) {
1141
+ map1 = new Map();
1142
+ this.indicatorMaterials.set(mode, map1);
1143
+ }
1144
+ map1.set(visibility, material);
1145
+ this.needUpdate = true;
1146
+ }
1147
+
1148
+ /**
1149
+ * 获取标签材质
1150
+ * @param mode
1151
+ * @param visibility
1152
+ * @returns
1153
+ */
1154
+ public getIndicatorMaterial(mode: IndicatorDisplayMode, visibility: boolean): NS_THREE.Material | undefined {
1155
+ let map1 = this.indicatorMaterials.get(mode);
1156
+ if (!map1) {
1157
+ map1 = new Map();
1158
+ this.indicatorMaterials.set(mode, map1);
1159
+ }
1160
+ return map1.get(visibility);
1161
+ }
1162
+
1163
+ /**
1164
+ * 配置全景图组在不同view中的显示状态
1165
+ * @param configuration 全景图组配置,见[[PanoramaGroupViewConfiguration]]
1166
+ */
1167
+ public addGroupViewConfiguration(configuration: TilePanoramaGroupViewConfiguration): void {
1168
+ const conf0 = this.viewConfigurations.get(configuration.targetView);
1169
+ if (conf0) {
1170
+ if (configuration.showBoundBox === undefined && conf0.showBoundBox !== undefined) {
1171
+ configuration.showBoundBox = conf0.showBoundBox;
1172
+ }
1173
+ if (configuration.visibleRadius === undefined && conf0.visibleRadius !== undefined) {
1174
+ configuration.visibleRadius = conf0.visibleRadius;
1175
+ }
1176
+ if (configuration.indicatorDisplayMode === undefined && conf0.indicatorDisplayMode !== undefined) {
1177
+ configuration.indicatorDisplayMode = conf0.indicatorDisplayMode;
1178
+ }
1179
+ }
1180
+ this.viewConfigurations.set(configuration.targetView, configuration);
1181
+ this.needUpdate = true;
1182
+ // /!!!For Debug #Async#
1183
+ // this.setBoundBoxVisible(configuration.showBoundBox!);
1184
+ }
1185
+
1186
+ /**
1187
+ * 设置最大时间距离
1188
+ * @param distance
1189
+ */
1190
+ public setMaxWorldDistance(distance: number): void {
1191
+ this.maxWorldDistance = distance;
1192
+ }
1193
+
1194
+ // /**
1195
+ // * @ignore
1196
+ // * @param view
1197
+ // */
1198
+ // public renderingViewChanged(view: View): void {
1199
+ // if (this.currentPanorama) {
1200
+ // this.currentPanorama.renderingViewChanged(view);
1201
+ // }
1202
+ // // this.setBoundBoxVisible(conf.showBoundBox!);
1203
+
1204
+ // // switch (conf.indicatorDisplayMode) {
1205
+ // // case IndicatorDisplayMode.AlwaysHide:
1206
+ // // this.panoramaDatas.forEach((pano: TilePanoramaData, pid: number) => {
1207
+ // // const indicator = this.indicatorMap.get(pid);
1208
+ // // if (!indicator) return;
1209
+ // // if (indicator.material instanceof NS_THREE.ShaderMaterial) {
1210
+ // // (indicator.material as NS_THREE.ShaderMaterial).uniforms.opacity.value = 0;
1211
+ // // } else {
1212
+ // // (indicator.material as NS_THREE.MeshBasicMaterial).opacity = 0;
1213
+ // // }
1214
+ // // });
1215
+ // // break;
1216
+ // // case IndicatorDisplayMode.AlwaysShow:
1217
+ // // this.panoramaDatas.forEach((pano: TilePanoramaData, pid: number) => {
1218
+ // // const indicator = this.indicatorMap.get(pid);
1219
+ // // if (!indicator) return;
1220
+
1221
+ // // let visibility = this.indicatorVisibilityMap.get(pid);
1222
+ // // if (visibility === undefined) visibility = true;
1223
+ // // const material = this.getIndicatorMaterial(IndicatorDisplayMode.AlwaysShow, visibility);
1224
+ // // if (material) indicator.material = material;
1225
+
1226
+ // // if (indicator.material instanceof NS_THREE.ShaderMaterial) {
1227
+ // // (indicator.material as NS_THREE.ShaderMaterial).uniforms.opacity.value = 1;
1228
+ // // } else {
1229
+ // // (indicator.material as NS_THREE.MeshBasicMaterial).opacity = 1;
1230
+ // // }
1231
+ // // });
1232
+ // // break;
1233
+ // // case IndicatorDisplayMode.Editing:
1234
+ // // this.panoramaDatas.forEach((pano: TilePanoramaData, pid: number) => {
1235
+ // // const indicator = this.indicatorMap.get(pid);
1236
+ // // if (!indicator) return;
1237
+
1238
+ // // let visibility = this.indicatorVisibilityMap.get(pid);
1239
+ // // const hidden = !!this.indicatorHiddenMap.get(pid);
1240
+ // // if (visibility === undefined) visibility = true;
1241
+ // // indicator.visible = !hidden;
1242
+ // // const material = this.getIndicatorMaterial(IndicatorDisplayMode.Editing, visibility);
1243
+ // // if (material) indicator.material = material;
1244
+ // // if (indicator.material instanceof NS_THREE.ShaderMaterial) {
1245
+ // // (indicator.material as NS_THREE.ShaderMaterial).uniforms.opacity.value = 1;
1246
+ // // } else {
1247
+ // // (indicator.material as NS_THREE.MeshBasicMaterial).opacity = 1;
1248
+ // // }
1249
+ // // });
1250
+ // // break;
1251
+ // // case IndicatorDisplayMode.Show:
1252
+ // // this.panoramaDatas.forEach((pano: TilePanoramaData, pid: number) => {
1253
+ // // const indicator = this.indicatorMap.get(pid);
1254
+ // // if (!indicator) return;
1255
+ // // (indicator.material as NS_THREE.Material).visible = false;
1256
+ // // indicator.visible = false;
1257
+ // // if (indicator.material instanceof NS_THREE.ShaderMaterial) {
1258
+ // // (indicator.material as NS_THREE.ShaderMaterial).uniforms.opacity.value = 0;
1259
+ // // } else {
1260
+ // // (indicator.material as NS_THREE.MeshBasicMaterial).opacity = 0;
1261
+ // // }
1262
+ // // });
1263
+ // // this.inSightIndicators.forEach((pid: number) => {
1264
+ // // const indicator = this.indicatorMap.get(pid);
1265
+ // // if (!indicator) return;
1266
+
1267
+ // // let visibility = this.indicatorVisibilityMap.get(pid);
1268
+ // // if (visibility === undefined) visibility = true;
1269
+ // // const material = this.getIndicatorMaterial(IndicatorDisplayMode.Editing, visibility);
1270
+ // // if (material) indicator.material = material;
1271
+
1272
+ // // const precisePosition = this.indicatorPositionMap.get(pid);
1273
+ // // (indicator.material as NS_THREE.Material).visible = visibility && precisePosition !== undefined;
1274
+ // // indicator.visible = visibility && precisePosition !== undefined;
1275
+ // // if (indicator.material instanceof NS_THREE.ShaderMaterial) {
1276
+ // // (indicator.material as NS_THREE.ShaderMaterial).uniforms.opacity.value = (
1277
+ // // visibility && precisePosition !== undefined ? 1 : 0
1278
+ // // );
1279
+ // // } else {
1280
+ // // (indicator.material as NS_THREE.MeshBasicMaterial).opacity = (
1281
+ // // visibility && precisePosition !== undefined ? 1 : 0
1282
+ // // );
1283
+ // // }
1284
+ // // });
1285
+ // // break;
1286
+ // // default:
1287
+ // // break;
1288
+ // // }
1289
+
1290
+ // // this.panoramaMap.forEach((panorama) => {
1291
+ // // panorama.renderingViewChanged(view);
1292
+ // // });
1293
+ // }
1294
+
1295
+ // TODO(rpeng)显示盒子处理
1296
+ // public async showBox(visible: boolean, all: boolean, pids: number[]): Promise<void> {
1297
+ // if (all) {
1298
+ // this.panoramaMap.forEach((panorama) => {
1299
+ // const box = panorama.getBox();
1300
+ // });
1301
+ // } else {
1302
+ // pids.forEach((pid) => {
1303
+ // const panorama = this.panoramaMap.get(pid);
1304
+ // if (panorama) {
1305
+ // const box = panorama.getBox();
1306
+ // }
1307
+ // });
1308
+ // }
1309
+ // }
1310
+ }
1311
+
1312
+ export {
1313
+ TilePanoramaGroup, IndicatorDisplayMode, TilePanoramaGroupViewConfiguration, TilePanoramaData,
1314
+ };