@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,1633 @@
1
+ import TWEEN from '@tweenjs/tween.js';
2
+ import { Externals, NS_THREE } from '../stage/externals';
3
+ import {
4
+ Controller, Events, FloorModel, View,
5
+ } from '..';
6
+ import { TilePlane } from '../element/tile-plane';
7
+ import { TextureController, TextureEventEnum } from './texture-controller';
8
+ import { TileUtil, TileTextureInfo } from '../utils/tile-util';
9
+ import { TilePanorama } from '../element/tile-panorama';
10
+ import { TilePanoramaGroup } from '../element/tile-panorama-group';
11
+ import { BasicController } from './basic-controller';
12
+ import { CubeTextureCache } from '../utils/cube-texture-cache';
13
+ import { TextureCache } from '../utils/texture-cache';
14
+ import { PanoramaModelUtil } from '../utils/panorama-model-util';
15
+ import { OwllyEvents } from '../utils/events';
16
+
17
+ class TilePanoramaController extends Controller {
18
+ static __instance: TilePanoramaController;
19
+
20
+ private container: HTMLElement;
21
+
22
+ private view: View;
23
+
24
+ private panoramaGroups: TilePanoramaGroup[];
25
+
26
+ private pid2GroupMap: Map<number, TilePanoramaGroup>;
27
+
28
+ private curPanoramaGroup: TilePanoramaGroup;
29
+
30
+ private basicController: BasicController;
31
+
32
+ private modelMaterial: NS_THREE.ShaderMaterial;
33
+
34
+ private instantTranslationMaterial: NS_THREE.ShaderMaterial;
35
+
36
+ private planeMap: Map<number, TilePlane>;
37
+
38
+ private levelMap: Map<number, number>;
39
+
40
+ private planeNeedUpdate: boolean;
41
+
42
+ private planeWillUpdate: boolean;
43
+
44
+ private handlePanoramaUpdate: Function;
45
+
46
+ private handlePanoramaLevel: Function;
47
+
48
+ private mouseDrag: boolean;
49
+
50
+ private showModel: boolean;
51
+
52
+ private curPanorama: TilePanorama;
53
+
54
+ private initialized: boolean;
55
+
56
+ private panoramaGroupChanged: boolean;
57
+
58
+ private isAnimating: boolean;
59
+
60
+ private translatePromise: Promise<unknown> | undefined;
61
+
62
+ private cancelAnimation: boolean;
63
+
64
+ private static DirectionVectorScalar = -0.0001;
65
+
66
+ private renderFrame: boolean | undefined;
67
+
68
+ private raycaster: NS_THREE.Raycaster;
69
+
70
+ private onScreenDetectRadius: number;
71
+
72
+ /** 移动点击 */
73
+ public moveOnClick: boolean;
74
+
75
+ private captureMove: boolean;
76
+
77
+ private levels: number[] = [1, 1.5, 3];
78
+
79
+ private enabled: boolean;
80
+
81
+ /** 最大等级控制 */
82
+ public levelMax = 2;
83
+
84
+ private touches: {
85
+ c: [NS_THREE.Vector2, NS_THREE.Vector2];
86
+ s: [NS_THREE.Vector2, NS_THREE.Vector2];
87
+ state: 'down' | 'move' | 'idle' | 'zoom';
88
+ dist: number;
89
+ fov: number;
90
+ }
91
+
92
+ private eventListeners: {
93
+ onTextureUpdate: (updates: TileTextureInfo[], deletes: TileTextureInfo[]) => void;
94
+ onMouseDown: (e: MouseEvent) => void;
95
+ onMouseMove: (e: MouseEvent) => void;
96
+ onMouseUp: (e: MouseEvent) => void;
97
+ onMouseWheel: (e: WheelEvent) => void;
98
+ // onContextMenu: (e: MouseEvent) => void;
99
+ onTouchStart: (e: TouchEvent) => void;
100
+ onTouchMove: (e: TouchEvent) => void;
101
+ onTouchEnd: (e: TouchEvent) => void;
102
+ }
103
+
104
+ /**
105
+ * 构造
106
+ * @param view 视图
107
+ * @param panoramaGroup 全景组
108
+ * @param basicController 基础控制器
109
+ * @param showModel 是否显示模型
110
+ */
111
+ constructor(
112
+ view?: View,
113
+ panoramaGroup?: TilePanoramaGroup | TilePanoramaGroup[],
114
+ basicController?: BasicController,
115
+ showModel?: boolean,
116
+ ) {
117
+ super();
118
+ const { THREE } = Externals.getInstance();
119
+ this.planeMap = new Map<number, TilePlane>();
120
+ this.showModel = showModel === undefined || showModel;
121
+ this.levelMap = new Map<number, number>();
122
+ this.isAnimating = false;
123
+ this.touches = {
124
+ s: [new THREE.Vector2(), new THREE.Vector2()],
125
+ c: [new THREE.Vector2(), new THREE.Vector2()],
126
+ state: 'idle',
127
+ dist: 0,
128
+ fov: 60,
129
+ };
130
+ if (panoramaGroup) {
131
+ if (panoramaGroup instanceof TilePanoramaGroup) {
132
+ this.panoramaGroups = [panoramaGroup];
133
+ } else {
134
+ this.panoramaGroups = panoramaGroup;
135
+ }
136
+ if (this.panoramaGroups.length > 0) {
137
+ this.curPanoramaGroup = this.panoramaGroups[0];
138
+ }
139
+ }
140
+ if (basicController) {
141
+ this.basicController = basicController;
142
+ }
143
+ this.pid2GroupMap = new Map();
144
+
145
+ this.eventListeners = {
146
+ onTextureUpdate: (updates: TileTextureInfo[], deletes: TileTextureInfo[]): void => {
147
+ this.updatePanoramaTextureInfos(updates, deletes);
148
+ },
149
+ onMouseDown: (e): void => { this.onMouseDown(e); },
150
+ onMouseMove: (e): void => { this.onMouseMove(e); },
151
+ onMouseUp: (e): void => { this.onMouseUp(e); },
152
+ onMouseWheel: (e): void => { this.onMouseWheel(e); },
153
+ onTouchStart: (e): void => { this.onTouchStart(e); },
154
+ onTouchMove: (e): void => { this.onTouchMove(e); },
155
+ onTouchEnd: (e): void => { this.onTouchEnd(e); },
156
+ // onContextMenu: (e): void => { this.onContextMenu(e); },
157
+ };
158
+ if (view) {
159
+ this.bindView(view);
160
+ }
161
+ this.raycaster = new THREE.Raycaster();
162
+ this.onScreenDetectRadius = 1000;
163
+ this.moveOnClick = true;
164
+
165
+ this.handlePanoramaUpdate = TileUtil.throttle((tview: View) => { this.updatePlaneInCamera(tview); }, 100);
166
+ this.handlePanoramaLevel = TileUtil.throttle(() => { this.updateLevel(); }, 200);
167
+ TextureController.instance.on(TextureEventEnum.TEXTURE_UPDATE, this.eventListeners.onTextureUpdate);
168
+ const modelVisible = (undefined === showModel ? this.showModel : showModel === true);
169
+ this.panoramaGroups.forEach((panoGroup) => {
170
+ const modelMesh = TilePanoramaController.getModelMesh(panoGroup);
171
+ this.setModelAppearance(panoGroup.modelElement!, modelVisible, undefined, modelMesh);
172
+ });
173
+ }
174
+
175
+ /**
176
+ * 设置是否激活可用
177
+ * @param enabled 是否激活
178
+ */
179
+ public setEnabled(enabled: boolean): void {
180
+ if (enabled === this.enabled) return;
181
+ this.enabled = enabled;
182
+ if (enabled) {
183
+ this.registerEvents();
184
+ } else {
185
+ this.unregisterEvents();
186
+ }
187
+ }
188
+
189
+ private registerEvents(): void {
190
+ if (!this.view) return;
191
+ this.view.on(OwllyEvents.MOUSE_DOWN, this.eventListeners.onMouseDown);
192
+ this.view.on(OwllyEvents.MOUSE_MOVE, this.eventListeners.onMouseMove);
193
+ this.view.on(OwllyEvents.MOUSE_UP, this.eventListeners.onMouseUp);
194
+ this.view.on(OwllyEvents.MOUSE_WHEEL, this.eventListeners.onMouseWheel);
195
+ this.view.on(OwllyEvents.TOUCH_START, this.eventListeners.onTouchStart);
196
+ this.view.on(OwllyEvents.TOUCH_MOVE, this.eventListeners.onTouchMove);
197
+ this.view.on(OwllyEvents.TOUCH_END, this.eventListeners.onTouchEnd);
198
+ }
199
+
200
+ private unregisterEvents(): void {
201
+ if (!this.view) return;
202
+ this.view.off(OwllyEvents.MOUSE_DOWN, this.eventListeners.onMouseDown);
203
+ this.view.off(OwllyEvents.MOUSE_MOVE, this.eventListeners.onMouseMove);
204
+ this.view.off(OwllyEvents.MOUSE_UP, this.eventListeners.onMouseUp);
205
+ this.view.off(OwllyEvents.MOUSE_WHEEL, this.eventListeners.onMouseWheel);
206
+ this.view.off(OwllyEvents.TOUCH_START, this.eventListeners.onTouchStart);
207
+ this.view.off(OwllyEvents.TOUCH_MOVE, this.eventListeners.onTouchMove);
208
+ this.view.off(OwllyEvents.TOUCH_END, this.eventListeners.onTouchEnd);
209
+ }
210
+
211
+ private onMouseDown(event: MouseEvent): void {
212
+ const { THREE } = Externals.getInstance();
213
+ // this.mouseMovement = new THREE.Vector2(event.movementX, event.movementY).length();
214
+ this.touches.s[0] = new THREE.Vector2(event.clientX, event.clientY);
215
+ this.touches.state = 'down';
216
+ }
217
+
218
+ private onMouseMove(event: MouseEvent): void {
219
+ // this.mouseMovement += new THREE.Vector2(event.movementX, event.movementY).length();
220
+ const { THREE } = Externals.getInstance();
221
+ this.touches.c[0] = new THREE.Vector2(event.clientX, event.clientY);
222
+ if (this.touches.state === 'down' && this.touches.c[0].distanceToSquared(this.touches.s[0]) > 100) {
223
+ this.touches.state = 'move';
224
+ }
225
+ if (this.raycaster && this.captureMove) {
226
+ const { clientWidth, clientHeight } = this.view.container;
227
+ const { left: rectX, top: rectY } = this.view.container.getBoundingClientRect();
228
+ const x = event.clientX - rectX;
229
+ const y = event.clientY - rectY;
230
+ this.raycaster.setFromCamera({ x, y }, (this.view.camera as NS_THREE.Camera));
231
+ if (this.curPanoramaGroup) {
232
+ let toPID: number;
233
+ if (this.onScreenDetectRadius > 0 && this.view.camera) {
234
+ toPID = this.curPanoramaGroup.intersectIndicatorsOnScreen(
235
+ new THREE.Vector2(x, y),
236
+ this.onScreenDetectRadius,
237
+ { screenWidth: clientWidth, screenHeight: clientHeight },
238
+ this.view.camera,
239
+ );
240
+ } else {
241
+ toPID = this.curPanoramaGroup.intersectIndicators(
242
+ this.raycaster.ray.origin,
243
+ this.raycaster.ray.direction,
244
+ );
245
+ }
246
+ if (toPID > -1) {
247
+ this.emit(
248
+ Events.PANORAMA_HOVER,
249
+ toPID,
250
+ this.curPanoramaGroup.getIndicatorPosition(toPID),
251
+ );
252
+ }
253
+ }
254
+ }
255
+ if (this.touches.state === 'move') {
256
+ this.onMouseDrag();
257
+ }
258
+ }
259
+
260
+ private async onMouseUp(event: MouseEvent): Promise<void> {
261
+ const { THREE } = Externals.getInstance();
262
+ if (this.touches.state === 'down') {
263
+ const { clientWidth, clientHeight } = this.view.container;
264
+ const { left: rectX, top: rectY } = this.view.container.getBoundingClientRect();
265
+ const x = event.clientX - rectX;
266
+ const y = event.clientY - rectY;
267
+ if (this.raycaster) {
268
+ this.raycaster.setFromCamera({ x, y }, (this.view.camera as NS_THREE.Camera));
269
+ if (this.onScreenDetectRadius && this.curPanoramaGroup) {
270
+ let toPID: number;
271
+ if (this.view.camera) {
272
+ toPID = this.curPanoramaGroup.intersectIndicatorsOnScreen(
273
+ new THREE.Vector2(x, y),
274
+ this.onScreenDetectRadius,
275
+ { screenWidth: clientWidth, screenHeight: clientHeight },
276
+ this.view.camera,
277
+ );
278
+ } else {
279
+ toPID = this.curPanoramaGroup.intersectIndicators(
280
+ this.raycaster.ray.origin,
281
+ this.raycaster.ray.direction,
282
+ );
283
+ }
284
+ if (toPID !== -1) {
285
+ this.emit(Events.CLICK_PANORAMA, toPID, event);
286
+ // this.moveToPanorama(toPID, { interval: 2000, toDirection: new THREE.Vector3(-0.8, 0.6, 0.0) });
287
+ if (event.button === 0 && this.moveOnClick && this.curPanoramaGroup.currentPanoramaID !== toPID) {
288
+ await this.moveToPanorama(toPID, { interval: 1000, fadeInOut: false });
289
+ }
290
+ }
291
+ }
292
+ }
293
+ }
294
+ this.touches.state = 'idle';
295
+ }
296
+
297
+ private onMouseWheel(event: WheelEvent): void {
298
+ event.preventDefault();
299
+ this.handlePanoramaLevel();
300
+ // this.handleMouseWheel(e);
301
+ }
302
+
303
+ private onTouchStart(event: TouchEvent): void {
304
+ // e.preventDefault();
305
+ const { THREE } = Externals.getInstance();
306
+ const l = event.touches.length;
307
+ const tl = event.targetTouches.length;
308
+ for (let i = 0; i < Math.min(l, 2); i++) {
309
+ const t = event.touches[i];
310
+ this.touches.s[i] = new THREE.Vector2(t.clientX, t.clientY);
311
+ }
312
+ this.touches.state = 'down';
313
+ if (tl > 1 && this.view.camera instanceof THREE.PerspectiveCamera) {
314
+ this.touches.state = 'zoom';
315
+ this.touches.dist = this.touches.s[0].distanceTo(this.touches.s[1]);
316
+ this.touches.fov = this.view.camera.fov;
317
+ }
318
+ }
319
+
320
+ private onTouchMove(event: TouchEvent): void {
321
+ const { THREE } = Externals.getInstance();
322
+ if (!this.view.camera || !(this.view.camera instanceof THREE.PerspectiveCamera)) return;
323
+ if (this.touches.state === 'idle') return;
324
+ event.preventDefault();
325
+ event.stopPropagation();
326
+ const l = event.touches.length;
327
+ for (let i = 0; i < Math.min(l, 2); i++) {
328
+ const t = event.touches[i];
329
+ this.touches.c[i] = new THREE.Vector2(t.clientX, t.clientY);
330
+ }
331
+ if (this.touches.state === 'down' && this.touches.c[0].distanceToSquared(this.touches.s[0]) > 100) {
332
+ this.touches.state = 'move';
333
+ } else if (this.touches.state === 'zoom') {
334
+ this.handlePanoramaLevel();
335
+ }
336
+ if (this.touches.state === 'move') {
337
+ this.onMouseDrag();
338
+ }
339
+ }
340
+
341
+ private async onTouchEnd(event: TouchEvent): Promise<void> {
342
+ if (this.touches.state === 'idle') return;
343
+ const { THREE } = Externals.getInstance();
344
+ if (this.touches.state === 'down' && this.view.renderer) {
345
+ const touchPoint = new THREE.Vector2(this.touches.s[0].x, this.touches.s[0].y);
346
+ const { clientWidth, clientHeight } = this.view.container;
347
+ const { left: rectX, top: rectY } = this.view.container.getBoundingClientRect();
348
+ const x = touchPoint.x - rectX;
349
+ const y = touchPoint.y - rectY;
350
+ this.raycaster.setFromCamera({ x, y }, (this.view.camera as NS_THREE.Camera));
351
+ if (this.curPanoramaGroup) {
352
+ let toPID: number;
353
+ if (this.onScreenDetectRadius > 0 && this.view.camera) {
354
+ toPID = this.curPanoramaGroup.intersectIndicatorsOnScreen(
355
+ new THREE.Vector2(x, y),
356
+ this.onScreenDetectRadius,
357
+ { screenWidth: clientWidth, screenHeight: clientHeight },
358
+ this.view.camera,
359
+ );
360
+ } else {
361
+ toPID = this.curPanoramaGroup.intersectIndicators(
362
+ this.raycaster.ray.origin,
363
+ this.raycaster.ray.direction,
364
+ );
365
+ }
366
+ if (toPID !== -1) {
367
+ this.emit(Events.CLICK_PANORAMA, toPID, event);
368
+ if (this.moveOnClick && this.curPanoramaGroup.currentPanoramaID !== toPID) {
369
+ await this.moveToPanorama(toPID, { interval: 1000, showModel: true, fadeInOut: false });
370
+ }
371
+ }
372
+ }
373
+ }
374
+ this.touches.state = 'idle';
375
+ }
376
+
377
+ public setLevels(levels: number[]): void {
378
+ this.levels = levels;
379
+ }
380
+
381
+ public updateLevel(): void {
382
+ if (!this.curPanorama) {
383
+ return;
384
+ }
385
+ const { THREE } = Externals.getInstance();
386
+ const view = this.view;
387
+ if (view.camera) {
388
+ const { levels, levelMax } = this;
389
+ const { y } = new THREE.Vector3().setFromMatrixScale(view.camera.projectionMatrix);
390
+ let level = 0;
391
+ let change = false;
392
+ for (let i = 0; i < levels.length; i++) {
393
+ if (y < levels[i]) {
394
+ level = i;
395
+ change = true;
396
+ break;
397
+ }
398
+ }
399
+ if (!change) {
400
+ level = levels.length;
401
+ }
402
+ if (level > levelMax) {
403
+ level = levelMax;
404
+ }
405
+ const pLevelMax = this.curPanorama.levelMax;
406
+ if (level > pLevelMax) {
407
+ level = pLevelMax;
408
+ }
409
+ // console.log('level', level, 'y', y);
410
+ this.curPanorama.updateLevel(level);
411
+ this.planeNeedUpdate = true;
412
+ }
413
+ }
414
+
415
+ /**
416
+ * 更新最大等级
417
+ * @param levelMax 最大等级
418
+ */
419
+ public updateLevelMax(levelMax: number): void{
420
+ if (levelMax === this.levelMax) return;
421
+ this.levelMax = levelMax;
422
+ for (let i = 0; i < this.panoramaGroups.length; i++) {
423
+ const panoramaGroup = this.panoramaGroups[i];
424
+ // eslint-disable-next-line no-await-in-loop
425
+ panoramaGroup.updateLevelMax(levelMax);
426
+ }
427
+ }
428
+
429
+ private onMouseDrag(): void {
430
+ this.planeNeedUpdate = true;
431
+ }
432
+
433
+ /**
434
+ * 绑定视图
435
+ * @param view
436
+ */
437
+ public bindView(view: View): void {
438
+ this.view = view;
439
+ this.container = view.container;
440
+ this.setEnabled(true);
441
+ }
442
+
443
+ // public async bindPanorama(panorama: TilePanorama): Promise<void> {
444
+ // this.initialized = false;
445
+ // this.emit(Events.WILL_LOAD_PANORAMA, panorama.pid);
446
+ // const lastPanorama = this.curPanorama;
447
+ // this.curPanorama = panorama;
448
+ // await this.initTextures(panorama);
449
+ // this.updateLevel();
450
+ // this.initialized = true;
451
+ // this.planeNeedUpdate = true;
452
+ // this.emit(Events.DID_LOAD_PANORAMA, panorama.pid);
453
+ // this.diposeInfos(lastPanorama);
454
+ // }
455
+
456
+ // public async initTextures(panorama: TilePanorama): Promise<void> {
457
+ // const textureUrls = panorama.textureURLs;
458
+ // const needInits = [] as TileTextureInfo[];
459
+ // panorama.tilePlanes.forEach((plane, index) => {
460
+ // const rootUrl = textureUrls[index];
461
+ // const info = new TileTextureInfo(plane.pfid, 0, 0, 0, rootUrl);
462
+ // info.frize = true;
463
+ // needInits.push(info);
464
+ // });
465
+ // await TextureController.instance.initTextures(needInits);
466
+ // }
467
+
468
+ /**
469
+ * 从全景点看
470
+ * @param pid 全景点id
471
+ * @param lookDirection 看的方向 v3
472
+ * @param showModel 是否显示模型
473
+ * @param preInitPanoramasStrategy 初始化全景策略
474
+ */
475
+ public async lookFromPanorama(pid: number,
476
+ lookDirection?: NS_THREE.Vector3,
477
+ showModel?: boolean,
478
+ preInitPanoramasStrategy?: 'all' | number | number[]): Promise<void> {
479
+ const pano = await this.showPanorama(pid, { lookDirection, showModel, preInitPanoramasStrategy });
480
+ if (pano) {
481
+ this.emit(Events.MOVE_TO_PANORAMA, pid, pano ? pano.position : null, this.panoramaGroupChanged);
482
+ }
483
+ this.panoramaGroupChanged = false;
484
+ // const pano = await this.showPanorama(pid, { lookDirection, showModel, preInitPanoramasStrategy });
485
+ }
486
+
487
+ /**
488
+ * 仅显示指定全景图,但不操作摄像机
489
+ * @param pid 全景点PID
490
+ * @parama showModel 可选,是否一开始就显示模型
491
+ * @param preInitPanoramasStrategy 可选,预创建全景对象的顺序策略,详见[PanoramaGroup]的【initializePanoramasIfNecessary]方法说明
492
+ */
493
+ public async showPanorama(pid: number,
494
+ options?: {
495
+ lookDirection?: NS_THREE.Vector3;
496
+ target?: NS_THREE.Vector3;
497
+ showModel?: boolean;
498
+ preInitPanoramasStrategy?: 'all' | number | number[];
499
+ }): Promise<TilePanorama | undefined> {
500
+ const {
501
+ lookDirection, target, showModel, preInitPanoramasStrategy,
502
+ } = options || {};
503
+ // const lastPanorama = this.curPanorama;
504
+ const { pano, panoramaGroup } = this.getPanoramaOfPID(pid);
505
+ if (panoramaGroup) {
506
+ if (this.curPanoramaGroup !== panoramaGroup) this.panoramaGroupChanged = true;
507
+
508
+ this.curPanoramaGroup = panoramaGroup;
509
+ if (panoramaGroup.modelElement) {
510
+ this.setModelAppearance(panoramaGroup.modelElement, false, undefined);
511
+ }
512
+ if (preInitPanoramasStrategy) {
513
+ panoramaGroup.initializePanoramasIfNecessary(preInitPanoramasStrategy);
514
+ }
515
+ panoramaGroup.panoramaIDsAround(pid);
516
+
517
+ panoramaGroup.presentPanoramaIndicatorsAround(pid, this.view);
518
+ if (pano) {
519
+ if (lookDirection) {
520
+ this.setCameraLookAt(pano.position, lookDirection);
521
+ } else if (target) {
522
+ this.setCameraLookAt(pano.position, target.clone().sub(pano.position));
523
+ }
524
+ // pano.updateLevel(0);
525
+ this.emit(Events.WILL_LOAD_PANORAMA, pano.pid);
526
+ if (this.curPanorama) {
527
+ this.panoramaUnmount(this.curPanorama);
528
+ }
529
+ this.curPanorama = pano;
530
+ this.panoramaMount(this.curPanorama);
531
+ const res = await panoramaGroup.presentPanoramaAround(pid, this.view);
532
+ if (!res) {
533
+ return undefined;
534
+ }
535
+ this.updateLevel();
536
+
537
+ if (undefined === showModel || showModel === true) {
538
+ const material = this.getModelMaterial();
539
+ const uniforms = material.uniforms as { [uniform: string]: NS_THREE.IUniform };
540
+ uniforms.pano0Matrix.value = pano.matrix;
541
+ uniforms.pano0Position.value = pano.position;
542
+ uniforms.pano1Matrix.value = pano.matrix;
543
+ uniforms.pano1Position.value = pano.position;
544
+ uniforms.weight0.value = 1.0;
545
+ uniforms.weight1.value = 0.0;
546
+
547
+ const texture = TextureController.instance.getCubeTextureByPid(pano.pid);
548
+ [uniforms.pano0Map.value, uniforms.pano1Map.value] = [texture, texture];
549
+ this.setModelAppearance(panoramaGroup.modelElement!, true, material);
550
+ }
551
+ }
552
+ return pano;
553
+ }
554
+ return undefined;
555
+ }
556
+
557
+ /**
558
+ * 设置摄像机按指定视线方向看向目标位置
559
+ * @param target 目标位置
560
+ * @param sightDirection 可选,视线方向,不设置则默认以摄像机当前方向
561
+ */
562
+ public setCameraLookAt(target: NS_THREE.Vector3, sightDirection?: NS_THREE.Vector3): void {
563
+ let direction;
564
+ const { THREE } = Externals.getInstance();
565
+ if (sightDirection) {
566
+ direction = sightDirection.clone().normalize();
567
+ } else if (this.view.camera) {
568
+ direction = this.view.camera.getWorldDirection(new THREE.Vector3(0, 0, -1));
569
+ } else {
570
+ direction = new THREE.Vector3(1, 0, 0);
571
+ }
572
+ const p0 = direction
573
+ .multiplyScalar(TilePanoramaController.DirectionVectorScalar)
574
+ .add(target);
575
+ this.setCameraPose(p0, target);
576
+ }
577
+
578
+ private getPanoramaOfPID(pid: number): {
579
+ pano?: TilePanorama;
580
+ panoramaGroup?: TilePanoramaGroup;
581
+ } {
582
+ const panoGroup = this.pid2GroupMap.get(pid);
583
+ if (panoGroup) {
584
+ const pano = panoGroup.getPanoramaByPID(pid);
585
+ return { pano, panoramaGroup: panoGroup };
586
+ }
587
+ for (let i = 0; i < this.panoramaGroups.length; i++) {
588
+ const panoramaGroup = this.panoramaGroups[i];
589
+ // eslint-disable-next-line no-await-in-loop
590
+ const pano = panoramaGroup.getPanoramaByPID(pid);
591
+ if (pano) {
592
+ this.pid2GroupMap.set(pid, panoramaGroup);
593
+ return { pano, panoramaGroup };
594
+ }
595
+ }
596
+ return {};
597
+ }
598
+
599
+ /**
600
+ * @ignore
601
+ * @param capture
602
+ */
603
+ public setCaptureMove(capture: boolean): void {
604
+ this.captureMove = capture;
605
+ }
606
+
607
+ /**
608
+ * 移动到指定的全景点处
609
+ * @param toPID 目标全景点ID
610
+ * @param interval 可选,过渡所用时长
611
+ * @param easing 可选,插值函数
612
+ * @param fadeInOut 可选,是否使用淡出淡入变换
613
+ * @param toDirection 可选,到达目的点时要转到的视线方向,
614
+ * 若不设置则默认以从起始点到目的点的连线为最终视线方向
615
+ * @param lookAtTarget 可选,到达目的点时视线看向的位置,优先于toDirection
616
+ * @param fov 可选,视场角度数
617
+ */
618
+ public async moveToPanorama(toPID: number,
619
+ params?: {
620
+ toDirection?: NS_THREE.Vector3;
621
+ lookAtTarget?: NS_THREE.Vector3;
622
+ interval?: number;
623
+ fov?: number;
624
+ fadeInOut?: boolean;
625
+ easing?: {
626
+ (k: number): number;
627
+ };
628
+ showModel?: boolean;
629
+ }): Promise<void> {
630
+ const p = params || {};
631
+ return this.moveInPath([toPID], {
632
+ queueIfBusy: false,
633
+ lookAtTargets: p.lookAtTarget,
634
+ toDirections: p.toDirection,
635
+ intervals: p.interval,
636
+ fovs: p.fov,
637
+ fadeInOuts: p.fadeInOut,
638
+ easings: p.easing,
639
+ freeRotation: !p.lookAtTarget,
640
+ showModel: p.showModel,
641
+ });
642
+ }
643
+
644
+ /**
645
+ * 移动到指定的全景点处
646
+ * 此方法与[[moveToPanorama]]的不同点在于通过Promise机制实现同步阻塞,
647
+ * 在前一个Translation未完成时发起的Translation会自动被阻塞到前一个完成时再执行
648
+ * @param toPID 目标全景点ID
649
+ * @param interval 可选,过渡所用时长
650
+ * @param easing 可选,插值函数
651
+ * @param fadeInOut 可选,是否使用淡出淡入变换
652
+ * @param toDirection 可选,到达目的点时要转到的视线方向,
653
+ * 若不设置则默认以从起始点到目的点的连线为最终视线方向
654
+ * @param lookAtTarget 可选,到达目的点时视线看向的位置,优先于toDirection
655
+ * @param fov 可选,视场角度数
656
+ */
657
+ public async moveToPanoramaSync(toPID: number,
658
+ params?: {
659
+ toDirection?: NS_THREE.Vector3;
660
+ lookAtTarget?: NS_THREE.Vector3;
661
+ interval?: number;
662
+ fov?: number;
663
+ fadeInOut?: boolean;
664
+ easing?: {
665
+ (k: number): number;
666
+ };
667
+ showModel?: boolean;
668
+ }): Promise<void> {
669
+ const p = params || {};
670
+ return this.moveInPath([toPID], {
671
+ queueIfBusy: true,
672
+ lookAtTargets: p.lookAtTarget,
673
+ toDirections: p.toDirection,
674
+ intervals: p.interval,
675
+ fovs: p.fov,
676
+ fadeInOuts: p.fadeInOut,
677
+ easings: p.easing,
678
+ freeRotation: !p.lookAtTarget,
679
+ showModel: p.showModel,
680
+ });
681
+ }
682
+
683
+ private static getModelMesh(panoGroup: TilePanoramaGroup): NS_THREE.Mesh | undefined {
684
+ if (panoGroup && panoGroup.modelElement) { // TODO: Multiple children mesh?
685
+ return PanoramaModelUtil.getModelMeshInElement(panoGroup.modelElement);
686
+ }
687
+ return undefined;
688
+ }
689
+
690
+ private getModelMaterial(): NS_THREE.ShaderMaterial {
691
+ if (this.modelMaterial) {
692
+ return this.modelMaterial;
693
+ }
694
+ const { THREE } = Externals.getInstance();
695
+ const uniforms = PanoramaModelUtil.createModelUniforms();
696
+ this.modelMaterial = new THREE.ShaderMaterial({
697
+ side: THREE.DoubleSide,
698
+ vertexShader: PanoramaModelUtil.getModelVS(),
699
+ fragmentShader: PanoramaModelUtil.getModelFS(),
700
+ uniforms,
701
+ name: 'modelMaterial',
702
+ });
703
+ return this.modelMaterial;
704
+ }
705
+
706
+ private async preloadCubeTexturesOfPIDs(pids: number[], waitForReadyCount: number,
707
+ recycleIntermediateTextures?: boolean[]): Promise<NS_THREE.CubeTexture[]> {
708
+ const panos = pids.map((pid) => this.getPanoramaOfPID(pid));
709
+ const textureURLsArray: (string[] | undefined)[] = panos.map(({ pano }) => {
710
+ if (pano) {
711
+ return pano.textureURLs;
712
+ }
713
+ return undefined;
714
+ });
715
+ return CubeTextureCache.sharedInstance.preloadCubeTextures(
716
+ textureURLsArray,
717
+ waitForReadyCount,
718
+ recycleIntermediateTextures,
719
+ );
720
+ }
721
+
722
+ private getInstantTranslationMaterial(): NS_THREE.ShaderMaterial {
723
+ if (this.instantTranslationMaterial) {
724
+ return this.instantTranslationMaterial;
725
+ }
726
+ const { THREE } = Externals.getInstance();
727
+ const uniforms = PanoramaModelUtil.createInstantTranslationUniforms();
728
+ this.instantTranslationMaterial = new THREE.ShaderMaterial({
729
+ side: THREE.DoubleSide,
730
+ vertexShader: PanoramaModelUtil.getInstantTranslationVS(),
731
+ fragmentShader: PanoramaModelUtil.getModelFS(),
732
+ uniforms,
733
+ name: 'instantTranslationMaterial',
734
+ });
735
+ return this.instantTranslationMaterial;
736
+ }
737
+
738
+ /**
739
+ * @ignore
740
+ * @param visible
741
+ */
742
+ public setModelAppearance(
743
+ modelElement: NS_THREE.Object3D, visible: boolean,
744
+ meshMaterial?: NS_THREE.Material | NS_THREE.Material[],
745
+ modelMesh?: NS_THREE.Mesh,
746
+ ): void {
747
+ if (modelElement) {
748
+ modelElement.visible = visible;
749
+ if (modelElement instanceof FloorModel) {
750
+ // (modelElement as FloorModel).addViewConfiguration({
751
+ // targetView: this.view,
752
+ // visible,
753
+ // meshMaterial,
754
+ // });
755
+ if (meshMaterial) {
756
+ modelElement.addMeshMaterial(meshMaterial);
757
+ }
758
+ } else {
759
+ let mesh = modelMesh;
760
+ if (!mesh) {
761
+ mesh = PanoramaModelUtil.getModelMeshInElement(modelElement);
762
+ }
763
+ if (mesh && meshMaterial) {
764
+ mesh.material = meshMaterial;
765
+ }
766
+ }
767
+ }
768
+ }
769
+
770
+ public async moveInPath(path: number[],
771
+ params?: {
772
+ queueIfBusy?: boolean;
773
+ showModel?: boolean;
774
+ toDirections?: NS_THREE.Vector3 | NS_THREE.Vector3[];
775
+ lookAtTargets?: NS_THREE.Vector3 | NS_THREE.Vector3[];
776
+ intervals?: number | number[];
777
+ fovs?: number | number[];
778
+ fadeInOuts?: boolean | boolean[];
779
+ easings?: {
780
+ (k: number): number;
781
+ } | { (k: number): number }[];
782
+ freeRotation?: boolean;
783
+ rotateDelays?: number | number[];
784
+ }): Promise<void> {
785
+ if (path.length === 0) return;
786
+ const { THREE } = Externals.getInstance();
787
+
788
+ const pathPositions: NS_THREE.Vector3[] = [];
789
+ const inPathPanos = path.map((pid: number) => this.getPanoramaOfPID(pid));
790
+ inPathPanos.forEach((item) => {
791
+ if (item.pano) {
792
+ pathPositions.push(item.pano.position.clone());
793
+ }
794
+ });
795
+
796
+ const {
797
+ toDirections, lookAtTargets, intervals,
798
+ fovs, easings,
799
+ fadeInOuts,
800
+ queueIfBusy, showModel, freeRotation, rotateDelays,
801
+ } = params || {};
802
+ const modelVisible = (showModel === undefined ? this.showModel : showModel === true);
803
+
804
+ let material: NS_THREE.ShaderMaterial;
805
+ let uniforms: { [uniform: string]: NS_THREE.IUniform };
806
+ let previousMaterial: NS_THREE.Material | NS_THREE.Material[] | undefined;
807
+ let fromPID = -1;
808
+ let toPID: number;
809
+ let fadeInOut = false;
810
+
811
+ const preloadTextureCount = CubeTextureCache.sharedInstance.getCapacity();
812
+ let from: {
813
+ pano?: TilePanorama;
814
+ panoramaGroup?: TilePanoramaGroup;
815
+ modelMesh?: NS_THREE.Mesh;
816
+ };
817
+ let to: {
818
+ pano?: TilePanorama;
819
+ panoramaGroup?: TilePanoramaGroup;
820
+ modelMesh?: NS_THREE.Mesh;
821
+ };
822
+
823
+ let modelElement: NS_THREE.Object3D;
824
+
825
+ const trivialProgressTransform = (progress: number): number => progress;
826
+ const fadeInOutProgressTransform = (progress: number): number => {
827
+ if (progress < 0.25) return 0;
828
+ if (progress > 0.75) return 1;
829
+ return 2 * (progress - 0.25);
830
+ };
831
+ let progressTransforms: {
832
+ (progress: number): number;
833
+ } | { (progress: number): number }[] | undefined;
834
+ if (Array.isArray(fadeInOuts)) {
835
+ progressTransforms = fadeInOuts.map((b) => (b ? fadeInOutProgressTransform : trivialProgressTransform));
836
+ } else if (fadeInOuts === true) {
837
+ progressTransforms = fadeInOutProgressTransform;
838
+ }
839
+
840
+ await this.moveCameraInPath(pathPositions, {
841
+ queueIfBusy,
842
+ toDirections,
843
+ lookAtTargets,
844
+ intervals,
845
+ fovs,
846
+ easings,
847
+ progressTransforms,
848
+ freeRotation,
849
+ rotateDelays,
850
+ beforeAllMoves: async () => {
851
+ fromPID = this.curPanoramaGroup ? this.curPanoramaGroup.currentPanoramaID : -1;
852
+ material = this.getModelMaterial();
853
+ uniforms = material.uniforms as { [uniform: string]: NS_THREE.IUniform };
854
+
855
+ if (path.length > 1) this.emit(Events.PATH_MOVEMENT_START, path);
856
+ },
857
+ onOneMoveStart: async (index: number,
858
+ target0: NS_THREE.Vector3,
859
+ eye0: NS_THREE.Vector3,
860
+ target1: NS_THREE.Vector3,
861
+ eye1: NS_THREE.Vector3,
862
+ error: { loadedError?: boolean },
863
+ ): Promise<boolean> => {
864
+ toPID = path[index];
865
+ from = this.getPanoramaOfPID(fromPID);
866
+ to = this.getPanoramaOfPID(toPID);
867
+
868
+ if (!from.pano || !to.pano || !from.panoramaGroup || !to.panoramaGroup) return false;
869
+ from.modelMesh = TilePanoramaController.getModelMesh(from.panoramaGroup);
870
+ to.modelMesh = TilePanoramaController.getModelMesh(to.panoramaGroup);
871
+
872
+ const preloadPIDs = [fromPID];
873
+ const preloadPIDsSet = new Set();
874
+ preloadPIDsSet.add(fromPID);
875
+ for (let i = index; preloadPIDs.length < preloadTextureCount && i < path.length; i += 1) {
876
+ if (!preloadPIDsSet.has(path[i])) {
877
+ preloadPIDsSet.add(path[i]);
878
+ preloadPIDs.push(path[i]);
879
+ }
880
+ }
881
+ this.emit(Events.WILL_MOVE_TO_PANORAMA, toPID, to.pano ? to.pano.position : null);
882
+ const res = await from.panoramaGroup.presentPanoramaAround(to.pano.pid, this.view);
883
+ if (!res) {
884
+ error.loadedError = true;
885
+ return false;
886
+ }
887
+ this.emit(Events.DID_LOAD_PANORAMA, to.pano.pid);
888
+ if (fromPID === toPID) return false;
889
+
890
+ if (Array.isArray(fadeInOuts)) {
891
+ if (fadeInOuts.length > index) {
892
+ fadeInOut = fadeInOuts[index];
893
+ } else if (fadeInOuts.length > 0) {
894
+ fadeInOut = fadeInOuts[fadeInOuts.length - 1];
895
+ }
896
+ } else if (fadeInOuts) {
897
+ fadeInOut = fadeInOuts as boolean;
898
+ }
899
+
900
+ const translateBetweenGroups = (from.panoramaGroup !== to.panoramaGroup);
901
+ if (translateBetweenGroups) {
902
+ material = this.getInstantTranslationMaterial();
903
+ uniforms = material.uniforms as { [uniform: string]: NS_THREE.IUniform };
904
+ } else {
905
+ material = this.getModelMaterial();
906
+ uniforms = material.uniforms as { [uniform: string]: NS_THREE.IUniform };
907
+ }
908
+
909
+ if (!translateBetweenGroups && !modelVisible) {
910
+ const distance = to.pano!.position.distanceTo(from.pano!.position);
911
+ const boxGeometry = new THREE.BoxGeometry(5, (from.pano.position.z + 0.93) * 2, distance * 4);
912
+ modelElement = new THREE.Mesh(
913
+ boxGeometry,
914
+ material,
915
+ );
916
+ modelElement.position.copy(from.pano.position);
917
+ modelElement.up.set(0, 0, 1);
918
+ modelElement.lookAt(to.pano!.position);
919
+ to.panoramaGroup.add(modelElement);
920
+ }
921
+
922
+ [to].forEach(({ panoramaGroup, modelMesh }) => {
923
+ if (modelMesh && panoramaGroup) {
924
+ previousMaterial = modelMesh.material;
925
+ if (from.panoramaGroup === to.panoramaGroup) {
926
+ this.setModelAppearance(panoramaGroup.modelElement!, modelVisible, material, modelMesh);
927
+ } else {
928
+ this.setModelAppearance(panoramaGroup.modelElement!, false, material, modelMesh);
929
+ }
930
+ panoramaGroup.setBoundBoxAppearance(material);
931
+ panoramaGroup.addGroupViewConfiguration({
932
+ targetView: this.view,
933
+ showBoundBox: true,
934
+ });
935
+ }
936
+ });
937
+
938
+ if (translateBetweenGroups) {
939
+ // Inv(L0) * L1
940
+ let up = new THREE.Vector3(0, 1, 0);
941
+ if (this.view.camera) {
942
+ up = this.view.camera.up;
943
+ }
944
+ const invLookAt0 = new THREE.Matrix4().lookAt(eye0, target0, up);
945
+ const invLookAt1 = new THREE.Matrix4().lookAt(eye1, target1, up);
946
+ uniforms.matrixT.value = invLookAt0.multiply(new THREE.Matrix4().copy(invLookAt1).invert());
947
+ }
948
+ uniforms.pano0Matrix.value = from.pano.matrix;
949
+ uniforms.pano0Position.value = from.pano.position;
950
+ uniforms.pano1Matrix.value = to.pano.matrix;
951
+ uniforms.pano1Position.value = to.pano.position;
952
+ uniforms.weight0.value = 1.0;
953
+ uniforms.weight1.value = 0.0;
954
+ const fromCubeText = TextureController.instance.getCubeTextureByPid(from.pano.pid);
955
+ const toCubeText = TextureController.instance.getCubeTextureByPid(to.pano.pid);
956
+ uniforms.pano0Map.value = fromCubeText;
957
+ uniforms.pano1Map.value = toCubeText;
958
+ this.panoramaUnmount(from.pano);
959
+
960
+ return translateBetweenGroups;
961
+ },
962
+ onOneMoveUpdate: (index: number, progress: number) => {
963
+ if (fromPID === toPID) return;
964
+ const translateBetweenGroups = (from.panoramaGroup !== to.panoramaGroup);
965
+ if (translateBetweenGroups) {
966
+ if (progress < 0.5) {
967
+ uniforms.weight0.value = 1.0 - progress * 2;
968
+ uniforms.weight1.value = 0.0;
969
+ } else {
970
+ uniforms.weight1.value = progress * 2 - 1.0;
971
+ uniforms.weight0.value = 0.0;
972
+ }
973
+ } else if (fadeInOut) {
974
+ if (progress < 0.25) {
975
+ uniforms.weight0.value = 1.0 - progress * 4;
976
+ uniforms.weight1.value = 0.0;
977
+ } else if (progress > 0.75) {
978
+ uniforms.weight1.value = progress * 4 - 3.0;
979
+ uniforms.weight0.value = 0.0;
980
+ } else {
981
+ uniforms.weight1.value = 0.0;
982
+ uniforms.weight0.value = 0.0;
983
+ }
984
+ } else {
985
+ uniforms.weight0.value = 1.0 - progress;
986
+ uniforms.weight1.value = progress;
987
+ }
988
+ },
989
+ onOneMoveComplete: async (index: number) => {
990
+ if (from.modelMesh && from.panoramaGroup && from.panoramaGroup !== to.panoramaGroup) {
991
+ if (!modelVisible) {
992
+ this.setModelAppearance(from.panoramaGroup.modelElement!, false, previousMaterial, from.modelMesh);
993
+ }
994
+ from.panoramaGroup.addGroupViewConfiguration({
995
+ targetView: this.view,
996
+ showBoundBox: false,
997
+ });
998
+ }
999
+
1000
+ to.panoramaGroup!.remove(modelElement);
1001
+ if (to.pano) {
1002
+ this.curPanorama = to.pano;
1003
+ this.panoramaMount(this.curPanorama);
1004
+ this.updateCurPanoramTextureInfo();
1005
+ this.updateLevel();
1006
+ }
1007
+
1008
+ this.emit(
1009
+ Events.MOVE_TO_PANORAMA,
1010
+ toPID,
1011
+ to.pano ? to.pano.position : null,
1012
+ from.panoramaGroup !== to.panoramaGroup,
1013
+ );
1014
+ this.panoramaGroupChanged = false;
1015
+
1016
+ if (index < path.length - 1) {
1017
+ fromPID = path[index];
1018
+ }
1019
+ },
1020
+ afterAllMoves: async () => {
1021
+ to.panoramaGroup!.presentPanoramaIndicatorsAround(toPID, this.view);
1022
+ if (fromPID !== toPID && to && from) {
1023
+ if (to.modelMesh && to.panoramaGroup) {
1024
+ if (!modelVisible) {
1025
+ this.setModelAppearance(to.panoramaGroup.modelElement!, false, previousMaterial, to.modelMesh);
1026
+ }
1027
+ to.panoramaGroup.addGroupViewConfiguration({
1028
+ targetView: this.view,
1029
+ showBoundBox: false,
1030
+ });
1031
+ }
1032
+ if (to.panoramaGroup) {
1033
+ this.curPanoramaGroup = to.panoramaGroup;
1034
+ }
1035
+ }
1036
+ if (path.length > 1) this.emit(Events.PATH_MOVEMENT_COMPLETED, path);
1037
+ },
1038
+ });
1039
+ }
1040
+
1041
+ /**
1042
+ * 根据路径移动相机
1043
+ * @param pathPoints 摄像机运动的路径上每一段目的点的Vector3坐标数组
1044
+ * @param queueIfBusy 可选,指示当当前有动画在进行中时,是把此次动作排队还是直接放弃
1045
+ * @param intervals 可选,若为数组则依次是每一段路径所花费的时间间隔,若是一个数则全都用该时间间隔
1046
+ * @param fovs 可选,若为数组则依次是每一段路径结束时的视场角,若是一个数则全都用该视场角
1047
+ * @param toDirections 可选,若为数组则依次是每一段路径结束点的视线方向,若是单一Vector3对象则全用此视线方向
1048
+ * @param lookAtTargets 可选,若为数组则依次是每一段路径所看向的位置,若是单一Vector3对象则始终看向此位置
1049
+ * toDirections与lookAtTargets最多只能有一个,如果同时传入了则只以lookAtTargets为准
1050
+ * @param easings 可选,若为数组则依次是每一段路径的动画插值函数,
1051
+ * 若是单一{(k: number): number}对象则全用此插值函数
1052
+ * @param rotateDelays 可选,旋转时的延迟时间
1053
+ * @param progressTransforms 可选,转换progress的映射函数,从0~1之间的小数映射到另一个0~1之间的小数
1054
+ * @param beforeAllMoves 整个路径移动即将开始前的回调
1055
+ * @param onOneMoveStart 每段路径移动开始时的回调
1056
+ * @param onOneMoveUpdate 每段路径移动进行中的进度回调
1057
+ * @param onOneMoveComplete 每段路径移动结束时的回调
1058
+ * @param afterAllMoves 整个路径移动结束时的回调
1059
+ * @returns
1060
+ */
1061
+ public async moveCameraInPath(pathPoints: NS_THREE.Vector3[],
1062
+ params?: {
1063
+ queueIfBusy?: boolean;
1064
+ toDirections?: NS_THREE.Vector3 | NS_THREE.Vector3[];
1065
+ lookAtTargets?: NS_THREE.Vector3 | NS_THREE.Vector3[];
1066
+ intervals?: number | number[];
1067
+ fovs?: number | number[];
1068
+ easings?: {
1069
+ (k: number): number;
1070
+ } | { (k: number): number }[];
1071
+ progressTransforms?: { (progress: number): number } | { (progress: number): number }[];
1072
+ rotateDelays?: number | number[];
1073
+
1074
+ beforeAllMoves?: { (): Promise<void> };
1075
+ onOneMoveStart?: {
1076
+ (index: number,
1077
+ target0: NS_THREE.Vector3,
1078
+ eye0: NS_THREE.Vector3,
1079
+ target1: NS_THREE.Vector3,
1080
+ eye1: NS_THREE.Vector3,
1081
+ error?: { loadedError?: boolean }
1082
+ ): Promise<boolean>;
1083
+ };
1084
+ onOneMoveUpdate?: { (index: number, progress0: number, progress: number): void };
1085
+ onOneMoveComplete?: { (index: number): void };
1086
+ afterAllMoves?: { (): Promise<void> };
1087
+ freeRotation?: boolean;
1088
+ }): Promise<void> {
1089
+ if (!pathPoints || pathPoints.length === 0) return;
1090
+ const { THREE } = Externals.getInstance();
1091
+
1092
+ const { queueIfBusy = false } = params || {};
1093
+ if (!queueIfBusy) {
1094
+ if (this.isAnimating) return;
1095
+ this.isAnimating = true;
1096
+ }
1097
+ while (this.translatePromise) {
1098
+ // eslint-disable-next-line no-await-in-loop
1099
+ await this.translatePromise;
1100
+ }
1101
+ // eslint-disable-next-line no-async-promise-executor
1102
+ const translatePromise = new Promise<void>(async (resolve0) => {
1103
+ const {
1104
+ beforeAllMoves,
1105
+ onOneMoveStart,
1106
+ onOneMoveUpdate,
1107
+ onOneMoveComplete,
1108
+ afterAllMoves,
1109
+ } = params || {};
1110
+ let iPath = 0;
1111
+ // eslint-disable-next-line no-async-promise-executor
1112
+ const createTask = (): Promise<void> => new Promise(async (resolve, reject) => {
1113
+ if (!this.view.camera || this.cancelAnimation) {
1114
+ reject();
1115
+ this.cancelAnimation = false;
1116
+ return;
1117
+ }
1118
+
1119
+ const {
1120
+ toDirections,
1121
+ lookAtTargets,
1122
+ intervals,
1123
+ fovs,
1124
+ easings,
1125
+ progressTransforms,
1126
+ freeRotation,
1127
+ rotateDelays,
1128
+ } = params || {};
1129
+
1130
+ const fromPosition = this.basicController.getCameraTarget();
1131
+ const toPosition = pathPoints[iPath];
1132
+
1133
+ const diff = toPosition.clone().sub(fromPosition);
1134
+
1135
+ let toDirection = toPosition.clone();
1136
+ // let directionFrom = toPosition;
1137
+ if (Array.isArray(lookAtTargets)) {
1138
+ if (lookAtTargets.length > iPath) {
1139
+ toDirection = lookAtTargets[iPath].clone();
1140
+ } else if (lookAtTargets.length > 0) {
1141
+ toDirection = lookAtTargets[lookAtTargets.length - 1].clone();
1142
+ }
1143
+ } else if (lookAtTargets instanceof THREE.Vector3) {
1144
+ toDirection = (lookAtTargets as THREE.Vector3).clone();
1145
+ } // else {
1146
+ // directionFrom = fromPosition;
1147
+ // }
1148
+
1149
+ let rotateDelay = 0;
1150
+ if (rotateDelays) {
1151
+ if (Array.isArray(rotateDelays)) {
1152
+ if (rotateDelays.length > iPath) {
1153
+ rotateDelay = rotateDelays[iPath];
1154
+ } else if (rotateDelays.length > 0) {
1155
+ rotateDelay = rotateDelays[rotateDelays.length - 1];
1156
+ }
1157
+ } else {
1158
+ rotateDelay = rotateDelays || 0;
1159
+ }
1160
+ }
1161
+
1162
+ if (lookAtTargets || !toDirections) {
1163
+ if (toDirection.distanceToSquared(toPosition) < 0.000001) {
1164
+ toDirection = this.basicController.getCameraTarget().sub(this.view.camera.position);
1165
+ } else {
1166
+ toDirection.sub(toPosition);
1167
+ }
1168
+ } else if (Array.isArray(toDirections)) {
1169
+ if (toDirections.length > iPath) {
1170
+ toDirection = toDirections[iPath];
1171
+ } else if (toDirections.length > 0) {
1172
+ toDirection = toDirections[toDirections.length - 1];
1173
+ }
1174
+ } else if (toDirections instanceof THREE.Vector3) {
1175
+ toDirection = toDirections as NS_THREE.Vector3;
1176
+ }
1177
+
1178
+ toDirection.normalize();
1179
+
1180
+ const fromDirection = this.basicController.getCameraTarget().sub(this.view.camera.position).normalize();
1181
+ const quat = new THREE.Quaternion().setFromUnitVectors(this.view.camera.up, new THREE.Vector3(0, 1, 0));
1182
+ const quatInverse = quat.clone().invert();
1183
+
1184
+ fromDirection.applyQuaternion(quat);
1185
+ toDirection.applyQuaternion(quat);
1186
+ const fromSpherical = new THREE.Spherical().setFromVector3(fromDirection);
1187
+ const toSpherical = new THREE.Spherical().setFromVector3(toDirection);
1188
+ const thetaDiff = fromSpherical.theta - toSpherical.theta;
1189
+ fromDirection.applyQuaternion(quatInverse);
1190
+ toDirection.applyQuaternion(quatInverse);
1191
+
1192
+ let toFOV = 60;
1193
+ let fromFOV = 60;
1194
+ if (this.view.camera instanceof THREE.PerspectiveCamera) {
1195
+ const camera = this.view.camera as NS_THREE.PerspectiveCamera;
1196
+ fromFOV = camera.fov;
1197
+ toFOV = camera.fov;
1198
+ if (Array.isArray(fovs)) {
1199
+ if (fovs.length > iPath) {
1200
+ toFOV = fovs[iPath];
1201
+ } else if (fovs.length > 0) {
1202
+ toFOV = fovs[fovs.length - 1];
1203
+ }
1204
+ } else if (fovs) {
1205
+ toFOV = fovs as number;
1206
+ }
1207
+ }
1208
+
1209
+ let interval = 1000;
1210
+ if (Array.isArray(intervals)) {
1211
+ if (intervals.length > iPath) {
1212
+ interval = intervals[iPath];
1213
+ } else if (intervals.length > 0) {
1214
+ interval = intervals[intervals.length - 1];
1215
+ }
1216
+ } else if (intervals) {
1217
+ interval = intervals as number;
1218
+ }
1219
+
1220
+ let easing = TWEEN.Easing.Linear.None;
1221
+ if (Array.isArray(easings)) {
1222
+ if (easings.length > iPath) {
1223
+ easing = easings[iPath];
1224
+ } else if (easings.length > 0) {
1225
+ easing = easings[easings.length - 1];
1226
+ }
1227
+ } else if (typeof easings === 'function') {
1228
+ easing = easings as { (k: number): number };
1229
+ } else if (iPath === 0) {
1230
+ easing = TWEEN.Easing.Quadratic.Out;
1231
+ if ((iPath === pathPoints.length - 1)) easing = TWEEN.Easing.Quadratic.InOut;
1232
+ } else if (iPath === pathPoints.length - 1) {
1233
+ easing = TWEEN.Easing.Quadratic.In;
1234
+ }
1235
+
1236
+ let progressTransform: { (progress: number): number } | undefined;
1237
+ if (Array.isArray(progressTransforms)) {
1238
+ if (progressTransforms.length > iPath) {
1239
+ progressTransform = progressTransforms[iPath];
1240
+ } else if (progressTransforms.length > 0) {
1241
+ progressTransform = progressTransforms[progressTransforms.length - 1];
1242
+ }
1243
+ } else if (progressTransforms) {
1244
+ progressTransform = progressTransforms as { (progress: number): number };
1245
+ }
1246
+
1247
+ const target1 = toPosition;
1248
+ const eye1 = toDirection.clone()
1249
+ .multiplyScalar(TilePanoramaController.DirectionVectorScalar)
1250
+ .add(target1);
1251
+ const target0 = fromPosition;
1252
+ const eye0 = fromDirection.clone()
1253
+ .multiplyScalar(TilePanoramaController.DirectionVectorScalar)
1254
+ .add(target0);
1255
+
1256
+ let skipPositionTranslate = false;
1257
+ if (onOneMoveStart) {
1258
+ const errorInfo = { loadedError: false };
1259
+ skipPositionTranslate = await onOneMoveStart(iPath, target0, eye0, target1, eye1, errorInfo);
1260
+ if (errorInfo.loadedError) {
1261
+ this.cancelAnimation = true;
1262
+ resolve();
1263
+ return;
1264
+ }
1265
+ }
1266
+
1267
+ const fromTheta = fromSpherical.theta;
1268
+ const toTheta = Math.abs(thetaDiff) > Math.PI
1269
+ ? toSpherical.theta + Math.sign(thetaDiff) * Math.PI * 2 : toSpherical.theta;
1270
+ const fromPhi = fromSpherical.phi;
1271
+ const toPhi = toSpherical.phi;
1272
+
1273
+ new TWEEN.Tween({ timer: 0 })
1274
+ .to({
1275
+ timer: interval,
1276
+ }, interval)
1277
+ .easing(easing)
1278
+ .onStart(() => {
1279
+ let eye = skipPositionTranslate ? eye1 : eye0;
1280
+ const target = skipPositionTranslate ? target1 : target0;
1281
+
1282
+ if (freeRotation) {
1283
+ this.basicController.update();
1284
+ const orbitControlTarget = this.basicController.getCameraTarget();
1285
+ const cameraPosition = this.basicController.getCameraPosition();
1286
+ const originDiff = orbitControlTarget.sub(cameraPosition).normalize();
1287
+ eye = originDiff.multiplyScalar(TilePanoramaController.DirectionVectorScalar).add(target);
1288
+ }
1289
+ this.setCameraPose(eye, target);
1290
+ this.renderThisFrame();
1291
+ })
1292
+ .onUpdate(({ timer }) => {
1293
+ const progress = timer / interval;
1294
+ let rotateProgress = (timer - rotateDelay) / (interval - rotateDelay);
1295
+ rotateProgress = easing(Math.max(Math.min(rotateProgress, 1), 0));
1296
+ const theta = fromTheta + (toTheta - fromTheta) * rotateProgress;
1297
+ const phi = fromPhi + (toPhi - fromPhi) * rotateProgress;
1298
+
1299
+ const transformedProgress = progressTransform ? progressTransform(progress) : progress;
1300
+ // const progress = progress0;
1301
+ if (!skipPositionTranslate) {
1302
+ // if (freeRotation) lookAt = this.orbitControl.target.clone();
1303
+ const spherical = new THREE.Spherical(
1304
+ 1,
1305
+ phi,
1306
+ Math.abs(theta) > Math.PI ? theta - Math.sign(theta) * Math.PI * 2 : theta,
1307
+ );
1308
+ spherical.makeSafe();
1309
+ const direction = new THREE.Vector3().setFromSpherical(spherical).applyQuaternion(quatInverse);
1310
+ // console.log(`#PanoCtrl# onUpdate: direction=(${direction.x}, ${direction.y}, ${direction.z})`);
1311
+ const lookAt: NS_THREE.Vector3 = fromPosition.clone().addScaledVector(diff, transformedProgress);
1312
+ this.basicController.update();
1313
+ const orbitControlTarget = this.basicController.getCameraTarget();
1314
+ const cameraPosition = this.basicController.getCameraPosition();
1315
+ const originDiff = orbitControlTarget.sub(cameraPosition).normalize();
1316
+ const fromNormalized = fromDirection.clone().normalize();
1317
+ const dist = originDiff.distanceToSquared(fromNormalized);
1318
+ const cameraPos = (freeRotation && dist > 0.0001 ? originDiff : direction)
1319
+ .multiplyScalar(TilePanoramaController.DirectionVectorScalar)
1320
+ .add(lookAt);
1321
+ this.setCameraPose(cameraPos, lookAt);
1322
+ }
1323
+
1324
+ const currentFOV = fromFOV + transformedProgress * (toFOV - fromFOV);
1325
+ this.setFOV(currentFOV);
1326
+
1327
+ if (onOneMoveUpdate) {
1328
+ onOneMoveUpdate(iPath, progress, transformedProgress);
1329
+ }
1330
+
1331
+ this.renderThisFrame();
1332
+ })
1333
+ .onComplete(async () => {
1334
+ if (!skipPositionTranslate) {
1335
+ const toLookAt = toPosition;
1336
+ this.basicController.update();
1337
+ const orbitControlTarget = this.basicController.getCameraTarget();
1338
+ const cameraPosition = this.basicController.getCameraPosition();
1339
+ const originDiff = orbitControlTarget.sub(cameraPosition).normalize();
1340
+ const cameraPos = (freeRotation ? originDiff : toDirection).clone()
1341
+ .multiplyScalar(TilePanoramaController.DirectionVectorScalar)
1342
+ .add(toLookAt);
1343
+ this.setCameraPose(cameraPos, toLookAt);
1344
+ }
1345
+
1346
+ this.renderThisFrame();
1347
+
1348
+ if (onOneMoveComplete) {
1349
+ await onOneMoveComplete(iPath);
1350
+ }
1351
+ resolve();
1352
+ })
1353
+ .start();
1354
+ });
1355
+
1356
+ if (beforeAllMoves) {
1357
+ await beforeAllMoves();
1358
+ }
1359
+
1360
+ while (iPath < pathPoints.length) {
1361
+ if (this.cancelAnimation) break;
1362
+ const task = createTask();
1363
+ // eslint-disable-next-line no-await-in-loop
1364
+ await task;
1365
+ iPath += 1;
1366
+ }
1367
+
1368
+ if (!this.cancelAnimation) {
1369
+ if (afterAllMoves) {
1370
+ await afterAllMoves();
1371
+ }
1372
+ }
1373
+
1374
+ this.cancelAnimation = false;
1375
+
1376
+ this.translatePromise = undefined;
1377
+
1378
+ if (!queueIfBusy) {
1379
+ this.isAnimating = false;
1380
+ }
1381
+
1382
+ resolve0();
1383
+ });
1384
+ this.translatePromise = translatePromise;
1385
+ // eslint-disable-next-line consistent-return
1386
+ await translatePromise;
1387
+ }
1388
+
1389
+ /**
1390
+ * 设置FOV, 不可以超过setFOVRange所设置的范围.
1391
+ * @param fov 垂直方向视场角
1392
+ */
1393
+ public setFOV(fov: number): void {
1394
+ if (!this.basicController) return;
1395
+ this.basicController.setFov(fov);
1396
+ this.renderFrame = true;
1397
+ }
1398
+
1399
+ /**
1400
+ * 设置FOV范围, 默认为[60, 90]
1401
+ * @param min 垂直方向视场角最小值
1402
+ * @param max 垂直方向视场角最大值
1403
+ */
1404
+ public setFOVRange(min: number, max: number): void {
1405
+ if (!this.basicController) return;
1406
+ this.basicController.setFovRange(min, max);
1407
+ this.renderFrame = true;
1408
+ }
1409
+
1410
+ /**
1411
+ * 设置摄像机观察方向和位置
1412
+ * @param position 摄像机所在位置
1413
+ * @param lookAt 观察目标点,同时也是[[OrbitControls]]的旋转中心
1414
+ */
1415
+ public setCameraPose(position: NS_THREE.Vector3, lookAt: NS_THREE.Vector3, useLookAt = true): void {
1416
+ this.basicController.setCameraPosition(position, false);
1417
+ if (useLookAt) {
1418
+ this.basicController.setCameraLookAt(lookAt);
1419
+ }
1420
+ this.renderThisFrame();
1421
+ }
1422
+
1423
+ /**
1424
+ * 渲染帧
1425
+ */
1426
+ protected renderThisFrame(): void {
1427
+ if (!this.renderFrame) {
1428
+ this.renderFrame = true;
1429
+ }
1430
+ }
1431
+
1432
+ /**
1433
+ * 删除平面
1434
+ * @param pid
1435
+ */
1436
+ private deletePlane(pid: number): void {
1437
+ this.planeMap.delete(pid);
1438
+ }
1439
+
1440
+ /**
1441
+ * 更新全景纹理信息
1442
+ * @param updates
1443
+ * @param deletes
1444
+ */
1445
+ private updatePanoramaTextureInfos(updates: TileTextureInfo[], deletes: TileTextureInfo[]): void {
1446
+ const waitPfids = new Map<number, Map<string, TileTextureInfo>>();
1447
+ // console.log('contorller', 'updates', updates.length, 'deletes', deletes.length);
1448
+ for (let i = 0; i < updates.length; i++) {
1449
+ const pfid = updates[i].pfid;
1450
+ if (!waitPfids.has(pfid)) {
1451
+ waitPfids.set(pfid, new Map<string, TileTextureInfo>());
1452
+ }
1453
+ }
1454
+ for (let i = 0; i < deletes.length; i++) {
1455
+ const pfid = deletes[i].pfid;
1456
+ if (!waitPfids.has(pfid)) {
1457
+ waitPfids.set(pfid, new Map<string, TileTextureInfo>());
1458
+ }
1459
+ }
1460
+ // const textureInfos = TextureController.instance.getTextureInfos();
1461
+ this.updateCurPanoramTextureInfo(waitPfids);
1462
+ }
1463
+
1464
+ /**
1465
+ * 更新当前全景纹理信息
1466
+ * @param waitPfids
1467
+ */
1468
+ private updateCurPanoramTextureInfo(waitPfids?: Map<number, Map<string, TileTextureInfo>>): void {
1469
+ const { curPanorama } = this;
1470
+ if (curPanorama) {
1471
+ const { textures, textureMap } = TextureController.instance;
1472
+ const { tilePlanes } = curPanorama;
1473
+ let tWaitPfids: Map<number, Map<string, TileTextureInfo>>;
1474
+ if (!waitPfids) {
1475
+ tWaitPfids = new Map<number, Map<string, TileTextureInfo>>();
1476
+ tilePlanes.forEach((plane) => {
1477
+ tWaitPfids.set(plane.pfid, new Map<string, TileTextureInfo>());
1478
+ });
1479
+ } else {
1480
+ tWaitPfids = waitPfids;
1481
+ }
1482
+ textureMap.forEach((info, id) => {
1483
+ const { pfid } = info;
1484
+ const map = tWaitPfids.get(pfid);
1485
+ if (map) {
1486
+ map.set(id, info);
1487
+ }
1488
+ });
1489
+ tilePlanes.forEach((plane) => {
1490
+ const { pfid } = plane;
1491
+ const map = tWaitPfids.get(pfid);
1492
+ if (map) {
1493
+ plane.updateTextures(textures, map);
1494
+ }
1495
+ });
1496
+ }
1497
+ }
1498
+
1499
+ /**
1500
+ * 删除全景点的纹理信息
1501
+ * @param panorama
1502
+ */
1503
+ private deleteTextureInfos(panorama: TilePanorama): void {
1504
+ panorama.tilePlanes.forEach((plane) => {
1505
+ const { textureMap } = plane;
1506
+ textureMap.forEach((info) => {
1507
+ TextureController.instance.deleteTexture(info);
1508
+ });
1509
+ });
1510
+ }
1511
+
1512
+ /**
1513
+ * 清理全景点纹理信息
1514
+ * @param panorama
1515
+ */
1516
+ private disposeTextureInfos(panorama: TilePanorama): void {
1517
+ if (panorama) {
1518
+ panorama.tilePlanes.forEach((plane) => {
1519
+ const textureMap = plane.textureMap;
1520
+ TextureController.instance.deteteTextureMap(textureMap, true);
1521
+ });
1522
+ }
1523
+ }
1524
+
1525
+ private updateTexture(): boolean {
1526
+ return TextureController.instance.update();
1527
+ }
1528
+
1529
+ /**
1530
+ * 更新平面再相机中的信息
1531
+ * @param view
1532
+ * @returns
1533
+ */
1534
+ private updatePlaneInCamera(view: View): void {
1535
+ if (!this.curPanorama) return;
1536
+ const updates = [] as TileTextureInfo[];
1537
+ this.curPanorama.tilePlanes.forEach((plane) => {
1538
+ const toUpdates = plane.udpateInCamera(view);
1539
+ updates.push(...toUpdates);
1540
+ });
1541
+ for (let i = 0; i < updates.length; i++) {
1542
+ const info = updates[i];
1543
+ if (info.isInCamera) {
1544
+ TextureController.instance.addTexture(info);
1545
+ } else {
1546
+ TextureController.instance.deleteTexture(info);
1547
+ }
1548
+ }
1549
+ }
1550
+
1551
+ private panoramaeUpdate(view: View): boolean {
1552
+ return this.handlePanoramaUpdate(view);
1553
+ }
1554
+
1555
+ public update(): boolean {
1556
+ let isUpdate = false;
1557
+ // if (!this.initialized) {
1558
+ // return isUpdate;
1559
+ // }
1560
+ const textureUpdate = this.updateTexture();
1561
+ if (textureUpdate || this.planeNeedUpdate || this.renderFrame) {
1562
+ isUpdate = true;
1563
+ this.renderFrame = false;
1564
+ }
1565
+ if (this.planeNeedUpdate) {
1566
+ if (this.view) { this.panoramaeUpdate(this.view); }
1567
+ this.planeNeedUpdate = false;
1568
+ }
1569
+ return isUpdate;
1570
+ }
1571
+
1572
+ // /**
1573
+ // * 跟下视图变化
1574
+ // * @param view
1575
+ // */
1576
+ // public renderingViewChanged(view: View): void {
1577
+ // if (this.planeNeedUpdate) {
1578
+ // this.panoramaeUpdate(view);
1579
+ // this.planeNeedUpdate = false;
1580
+ // }
1581
+ // }
1582
+
1583
+ /**
1584
+ * 全景点挂载
1585
+ * @param pano
1586
+ */
1587
+ private panoramaMount(pano: TilePanorama): void {
1588
+ pano.mount();
1589
+ this.emit(Events.DID_LOAD_PANORAMA, pano.pid);
1590
+ }
1591
+
1592
+ /**
1593
+ * 全景点卸载
1594
+ * @param pano
1595
+ */
1596
+ private panoramaUnmount(pano: TilePanorama): void {
1597
+ pano.unMount();
1598
+ TextureController.instance.deleteTexturesByPid(pano.pid, true);
1599
+ }
1600
+
1601
+ /**
1602
+ * 清理
1603
+ */
1604
+ public dispose(): void {
1605
+ this.planeMap.clear();
1606
+ this.setEnabled(false);
1607
+ TextureController.instance.off(TextureEventEnum.TEXTURE_UPDATE, this.eventListeners.onTextureUpdate);
1608
+ if (this.curPanorama) {
1609
+ this.panoramaUnmount(this.curPanorama);
1610
+ }
1611
+ if (this.modelMaterial) {
1612
+ this.modelMaterial.dispose();
1613
+ }
1614
+ if (this.instantTranslationMaterial) {
1615
+ this.instantTranslationMaterial.dispose();
1616
+ }
1617
+ TextureCache.disposeAll();
1618
+ CubeTextureCache.disposeAll();
1619
+ super.dispose();
1620
+ }
1621
+
1622
+ // /**
1623
+ // * 单例
1624
+ // */
1625
+ // static get instance(): TilePanoramaController {
1626
+ // if (!this.__instance) {
1627
+ // this.__instance = new TilePanoramaController();
1628
+ // }
1629
+ // return this.__instance;
1630
+ // }
1631
+ }
1632
+
1633
+ export { TilePanoramaController };