@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,1032 @@
1
+ /* eslint-disable max-len */
2
+ import Color from 'color';
3
+ import * as turf from '@turf/turf';
4
+ import { Externals, NS_THREE } from '../stage/externals';
5
+ import { Element, ElementFrameContext } from './element';
6
+ import { PathOverlay2 } from '../overlay/path-overlay2';
7
+ import { Env, EnvironmentUtils } from '../utils/environment-utils';
8
+ import { BasicCalcTool, TurningInfo } from '../utils';
9
+ // import { BasicCalcTool, TurningInfo, Helper } from '../utils';
10
+
11
+ class MeshLine2D extends Element {
12
+ public tailArrow: NS_THREE.Mesh;
13
+
14
+ // public testLines: any;
15
+
16
+ private initialized: boolean;
17
+
18
+ private ready: boolean;
19
+
20
+ public renderPixelLine: boolean;
21
+
22
+ private needsUpdate: boolean;
23
+
24
+ private points: [number, number, number][];
25
+
26
+ public orgedPoints: { point: [number, number, number]; normal: number[]; scale: number }[];
27
+
28
+ private distances: number[];
29
+
30
+ private mesh: NS_THREE.Mesh;
31
+
32
+ private bufferGeometry: NS_THREE.BufferGeometry;
33
+
34
+ private material: NS_THREE.ShaderMaterial;
35
+
36
+ private currentMoveIndex: number; // 当前到了哪里
37
+
38
+ private parentOverlay: PathOverlay2;
39
+
40
+ private viewWidth: number;
41
+
42
+ private viewHeight: number;
43
+
44
+ private options: {
45
+ textureUrl?: string;
46
+ textureMode: string;
47
+ textureSize?: [number, number];
48
+ fillOpacity?: number;
49
+ color?: Color | number | string;
50
+ viewDistance?: number;
51
+ gradientDistance?: number;
52
+ current?: number;
53
+ gradientEnabled?: boolean;
54
+ width?: number;
55
+ strokeWidth?: number;
56
+ strokeColor?: Color | number | string;
57
+ animateEnabled?: boolean;
58
+ animateSpeed?: number;
59
+ };
60
+
61
+ private uniforms: { [uniform: string]: NS_THREE.IUniform };
62
+
63
+ private static VertexShader = `
64
+ attribute vec4 last, current, next;
65
+ attribute vec2 normalVec;
66
+ attribute float normalScale;
67
+ attribute float texoff;
68
+ attribute float progress;
69
+
70
+ varying vec2 texcoord;
71
+ varying float vProgress;
72
+ varying float isBorder;
73
+
74
+ uniform float width;
75
+ uniform float texOffset;
76
+ uniform float strokeWidth;
77
+ uniform float renderPixelLine;
78
+ uniform vec2 resolution;
79
+
80
+ float pi = 3.141592653589793;
81
+ float fwidth = width;
82
+ float swidth = strokeWidth;
83
+
84
+ vec4 transform(vec3 coord){
85
+ return projectionMatrix * modelViewMatrix * vec4(coord, 1.0);
86
+ }
87
+
88
+ vec2 project(vec4 device) {
89
+ vec3 device_normal = device.xyz / device.w;
90
+ vec2 clip_pos = (device_normal * 0.5 + 0.5).xy;
91
+ return clip_pos * resolution;
92
+ }
93
+
94
+ vec4 unproject(vec2 screen, float z, float w) {
95
+ vec2 clip_pos = screen / resolution;
96
+ vec2 device_normal = clip_pos * 2.0 - 1.0;
97
+ return vec4(device_normal * w, z, w);
98
+ }
99
+
100
+ // 计算系数: 0,0,0 到 0,1,0 对应的屏幕坐标距离 越大, coefficient越大
101
+ float calcCoefficient() {
102
+ vec3 p1 = vec3(0, 0, 0);
103
+ vec2 sp1 = project(transform(p1.xyz));
104
+ vec3 p2 = vec3(0, 1, 0);
105
+ vec2 sp2 = project(transform(p2.xyz));
106
+ // 计算屏幕坐标的距离
107
+ float dist = distance(sp1, sp2);
108
+ return dist * 10.0 / width;
109
+ }
110
+
111
+ void main(){
112
+ vec2 sLast; // screenLast
113
+ vec2 sNext; // screenNext
114
+ vec2 sCurrent; // screenCurrent
115
+ vec2 normal1; // normal1
116
+ vec2 normal2; // normal2
117
+ vec2 normal; // 当前normal
118
+ vec4 dCurrent; //
119
+
120
+ float coefficient = 10.0;
121
+ float off = 1.0;
122
+ if (current.w < 0.0 ) {
123
+ off = -1.0;
124
+ }
125
+ vec4 position = vec4(0, 0, 0, 0);
126
+ vec3 pos;
127
+
128
+ float offsetW = fwidth / 2.0 * normalScale;
129
+ isBorder = -1.0;
130
+ if (abs(current.w) > 1.0) {
131
+ offsetW = swidth + (fwidth / 2.0) * normalScale;
132
+ isBorder = 1.0;
133
+ }
134
+ if (renderPixelLine < 1.0) {
135
+ // 3d 中
136
+ vec2 dir = vec2(normalVec.x, normalVec.y)*off;
137
+ float factor = 0.6 / fwidth * 0.2;
138
+ pos = vec3(current.xy + dir * offsetW, 0.0);
139
+ texcoord = vec2(off*0.5+0.5, texoff * factor + texOffset);
140
+ vProgress = progress;
141
+ gl_Position = transform(pos);
142
+ } else {
143
+ // vec2 dir = vec2(normalVec.x, normalVec.y)*off;
144
+ // pos = vec3(current.xy + dir * offsetW, 0.0);
145
+ // texcoord = vec2(off*0.5+0.5, texoff*0.2 + texOffset);
146
+ // vProgress = progress;
147
+ // gl_Position = transform(pos);
148
+
149
+ coefficient = calcCoefficient();
150
+ sLast = project(transform(last.xyz)); // last的屏幕坐标
151
+ sNext = project(transform(next.xyz)); // next的屏幕坐标
152
+
153
+ dCurrent = transform(current.xyz);
154
+ sCurrent = project(dCurrent); // current的屏幕坐标
155
+
156
+ normal1 = normalize(sLast - sCurrent);
157
+ vec2 normal2 = normalize(sCurrent - sNext);
158
+ normal = normalize(normal1 + normal2);
159
+ texcoord = vec2(off*0.5+0.5, texoff* 0.03 * coefficient + texOffset);
160
+ vProgress = progress;
161
+
162
+ vec2 dir = vec2(-normal.y, normal.x) * off;
163
+ float cosAngle = abs(dot(dir, -normal1)); // cos 45 基本 为 0.79 得到的是弧度值
164
+ float x = 90.0 - acos(cosAngle) * 180.0 / pi; // 得到角度 90 - x 则为需要 20 / length = cos(x)
165
+ float divideBy = cos(x / 180.0 * pi);
166
+ if (abs(divideBy) < 0.6) {
167
+ float positiveNum = divideBy > 0.0 ? 1.0 : -1.0;
168
+ divideBy = 0.6 * positiveNum;
169
+ }
170
+ pos = vec3((sCurrent + offsetW / divideBy * dir).xy, 0.0);
171
+ position = unproject(pos.xy, 0.0, 1.0);
172
+ gl_Position = position;
173
+ }
174
+
175
+ // texcoord = vec2(off*0.5+0.5, texoff* 0.03 * coefficient + texOffset);
176
+ // vProgress = progress;
177
+
178
+ // vec2 dir = vec2(-normal.y, normal.x) * off;
179
+ // float cosAngle = abs(dot(dir, -normal1)); // cos 45 基本 为 0.79 得到的是弧度值
180
+ // float x = 90.0 - acos(cosAngle) * 180.0 / pi; // 得到角度 90 - x 则为需要 20 / length = cos(x)
181
+ // float divideBy = cos(x / 180.0 * pi);
182
+
183
+ // vec4 position = vec4(0, 0, 0, 0);
184
+ // vec3 pos;
185
+
186
+ // if (renderPixelLine < 1.0) {
187
+ // pos = current.xyz + vec3(dir * offsetW, 0.0);
188
+ // position = transform(pos);
189
+ // } else {
190
+ // // 计算 dir 和 normal1 的夹角 , 要 叠加的长度 是 offsetW * dir
191
+ // pos = vec3((sCurrent + offsetW / divideBy * dir).xy, 0.0);
192
+ // position = unproject(pos.xy, 0.0, 1.0);
193
+ // }
194
+
195
+ // gl_Position = position;
196
+ }
197
+ `;
198
+
199
+ private static FragmentShader = `
200
+ uniform sampler2D stripTexture;
201
+ uniform float currentDistance;
202
+ uniform float fullLength;
203
+ uniform float viewDistance;
204
+ uniform float gradientDistance;
205
+ uniform vec4 fillColor;
206
+ uniform vec4 strokeColor;
207
+ uniform bool gradientEnabled;
208
+ uniform float renderPixelLine;
209
+ uniform float fillOpacity;
210
+
211
+ varying vec2 texcoord;
212
+ varying float vProgress;
213
+ varying float isBorder;
214
+
215
+ float opacity = 1.0;
216
+
217
+ void main(){
218
+ vec4 texColor = texture2D(stripTexture, texcoord);
219
+
220
+ float alpha = fillOpacity;
221
+ float cur = currentDistance;
222
+ float grad = gradientDistance;
223
+ float view = viewDistance;
224
+
225
+ if (gradientEnabled) {
226
+ if (vProgress < cur) {
227
+ alpha = 0.0;
228
+ } else {
229
+ if (vProgress > cur + view) {
230
+ alpha = 0.0;
231
+ } else {
232
+ if (fullLength <= cur + view) {
233
+ view = fullLength - cur;
234
+ if (view < 2.0 * grad) {
235
+ grad = view * 0.5;
236
+ }
237
+ }
238
+
239
+ if (vProgress > cur + grad) {
240
+ alpha = fillOpacity;
241
+ if (vProgress > cur + view - grad) {
242
+ alpha = abs(cur + view - vProgress) / grad * fillOpacity;
243
+ }
244
+ } else {
245
+ alpha = abs(vProgress - cur) / grad * fillOpacity;
246
+ }
247
+ }
248
+ }
249
+ } else if (renderPixelLine == 1.0) {
250
+ if (vProgress < cur) {
251
+ alpha = 0.0;
252
+ }
253
+ }
254
+ if (isBorder > -0.99) {
255
+ gl_FragColor = vec4(strokeColor.rgb, opacity * alpha * strokeColor.a);
256
+ } else {
257
+ gl_FragColor = vec4((fillColor * (1.0 - texColor.a) + texColor * texColor.a).rgb, opacity * alpha * (fillColor.a * (1.0 - texColor.a) + texColor.a));
258
+ }
259
+ }
260
+ `;
261
+
262
+ constructor(
263
+ points: [number, number, number][],
264
+ options: {
265
+ renderPixelLine?: boolean;
266
+ fillOpacity?: number;
267
+ textureUrl?: string;
268
+ textureMode?: string;
269
+ textureSize?: [number, number];
270
+ color?: Color | number | string;
271
+ viewDistance?: number;
272
+ gradientDistance?: number;
273
+ current?: number;
274
+ gradientEnabled?: boolean;
275
+ width?: number;
276
+ strokeWidth?: number;
277
+ strokeColor?: Color | number | string;
278
+ animateEnabled?: boolean;
279
+ animateSpeed?: number;
280
+ } = { width: 0.3 },
281
+ ) {
282
+ super();
283
+ this.initialized = false;
284
+ this.ready = true;
285
+ this.points = [];
286
+ this.distances = [];
287
+ this.currentMoveIndex = 0;
288
+ this.options = { textureMode: 'repeat', ...options };
289
+
290
+ if (!options.animateSpeed) {
291
+ this.options.animateSpeed = 0.01;
292
+ }
293
+ if (options.textureMode === 'tail') {
294
+ this.createTailArrow();
295
+ }
296
+ this.renderPixelLine = options.renderPixelLine || false;
297
+ this.init(points);
298
+ }
299
+
300
+ public calcPoints(points: [number, number, number][], scale = 0.30): number[][] {
301
+ const { THREE } = Externals.getInstance();
302
+ const len = points.length;
303
+ if (len < 2) return [];
304
+ const res = [];
305
+ const linePoints = points.map((v) => [v[0], v[1]]);
306
+ for (let i = 0; i < len; i++) {
307
+ const cur = new THREE.Vector2(...linePoints[i]);
308
+ const prev = i === 0 ? null : new THREE.Vector2(...linePoints[i - 1]);
309
+ const next = i === len - 1 ? null : new THREE.Vector2(...linePoints[i + 1]);
310
+ const formP2C = prev ? new THREE.Vector2().subVectors(cur, prev).normalize() : null;
311
+ const formC2N = next ? new THREE.Vector2().subVectors(next, cur).normalize() : null;
312
+ const fromP2N = formC2N && formP2C ? new THREE.Vector2().addVectors(formC2N, formP2C).normalize() : null;
313
+ // eslint-disable-next-line no-nested-ternary
314
+ const normal = i === 0 ? new THREE.Vector2(-(formC2N as THREE.Vector2).y, (formC2N as THREE.Vector2).x)
315
+ : (i === len - 1 ? new THREE.Vector2(-(formP2C as THREE.Vector2).y, (formP2C as THREE.Vector2).x)
316
+ : new THREE.Vector2(-(fromP2N as THREE.Vector2).y, (fromP2N as THREE.Vector2).x));
317
+ const n1 = new THREE.Vector2().addVectors(cur, normal.clone().multiplyScalar(-scale));
318
+ const n2 = new THREE.Vector2().addVectors(cur, normal.clone().multiplyScalar(scale));
319
+ res.push(
320
+ [n1.x, n1.y, 0],
321
+ [n2.x, n2.y, 0],
322
+ [normal.x, normal.y, 0],
323
+ );
324
+ }
325
+ return res;
326
+ }
327
+
328
+ public createTailArrow(): void {
329
+ const { THREE } = Externals.getInstance();
330
+ const textureUrl = this.options.textureUrl;
331
+ new NS_THREE.TextureLoader().load(textureUrl as string, (texture: THREE.Texture) => {
332
+ const fWidth = this.options.width || 0.3;
333
+ const renderPathWidth = this.options.strokeWidth ? fWidth + this.options.strokeWidth * 2 : this.options.width;
334
+ const width = this.options.textureSize ? this.options.textureSize[0] : renderPathWidth;
335
+ const height = this.options.textureSize ? this.options.textureSize[1] : width;
336
+ const planeG = new THREE.PlaneGeometry(width, height);
337
+ const color = this.options.color ? this.options.color : 0xffffff;
338
+ const material = new THREE.MeshBasicMaterial({
339
+ color: color as string,
340
+ map: texture,
341
+ transparent: true,
342
+ opacity: 1.0,
343
+ depthTest: false,
344
+ });
345
+ material.needsUpdate = true;
346
+ const plane = new THREE.Mesh(planeG, material);
347
+ plane.renderOrder = 2;
348
+ this.tailArrow = plane;
349
+ this.tailArrow.visible = false;
350
+ this.add(this.tailArrow);
351
+ });
352
+ }
353
+
354
+ // 返回 {point, normal: 法向量, scale: 沿着法向量增加/减少得到端点的 scale} 的格式、
355
+ public orgPoints(points: [number, number, number][], nScale = 0.3): { point: [number, number, number]; normal: number[]; scale: number }[] {
356
+ const normalScale = nScale > 1 ? 0.01 : nScale;
357
+ const { THREE } = Externals.getInstance();
358
+ // this.testLines = [];
359
+ // 得到路径上的拐点信息
360
+ const pLength = points.length;
361
+ const orgedPoints = this.calcPoints(points, normalScale); // 传入的一个点拓展为3个信息: 法向量 起 终
362
+ const vec3orgedPoint: THREE.Vector3[] = orgedPoints.map((pt) => new THREE.Vector3(...pt));
363
+ const vec3Chunk: THREE.Vector3[][] = BasicCalcTool.chunk(vec3orgedPoint, 3);
364
+ const res = points.map((v, i: number) => ({
365
+ point: v,
366
+ normal: [vec3Chunk[i][2].x, vec3Chunk[i][2].y],
367
+ scale: 1.0,
368
+ }));
369
+ const v2Pts = points.map((v) => [v[0], v[1]]);
370
+ const turningPoints = BasicCalcTool.calcTurning(v2Pts as [number, number][]);
371
+ if (!turningPoints.length) return res;
372
+ const turningAreas = turningPoints.map((v: TurningInfo) => {
373
+ const { startIndex, endIndex, angle } = v;
374
+ // angle < 180 右转 angle > 180 左转
375
+ const pickIndex = angle > 180 ? 1 : 0;
376
+
377
+ const line10 = startIndex > 0 ? vec3Chunk[startIndex - 1][pickIndex] : vec3Chunk[startIndex - 1][pickIndex];
378
+ const line11 = vec3Chunk[startIndex - 1][pickIndex];
379
+ const line1NormalizeVec = new THREE.Vector3().subVectors(line11, line10).normalize().multiplyScalar(normalScale);
380
+ const line12 = new THREE.Vector3().addVectors(line11, line1NormalizeVec);
381
+ const line13 = new THREE.Vector3().subVectors(line10, line1NormalizeVec);
382
+
383
+ const line20 = vec3Chunk[endIndex + 1][pickIndex];
384
+ const line21 = pLength > endIndex + 2 ? vec3Chunk[endIndex + 2][pickIndex] : vec3Chunk[endIndex][pickIndex];
385
+ const line2NormalizeVec = new THREE.Vector3().subVectors(line21, line20).normalize().multiplyScalar(normalScale);
386
+ const line22 = new THREE.Vector3().addVectors(line21, line2NormalizeVec);
387
+ const line23 = new THREE.Vector3().subVectors(line20, line2NormalizeVec);
388
+
389
+ const line1 = turf.lineString([[line13.x, line13.y], [line10.x, line10.y], [line11.x, line11.y], [line12.x, line12.y]]);
390
+ const line2 = turf.lineString([[line23.x, line23.y], [line20.x, line20.y], [line21.x, line21.y], [line22.x, line22.y]]);
391
+ const intersects = turf.lineIntersect(line1, line2);
392
+ if (!intersects.features[0]) {
393
+ // console.log('有拐角 但无相交');
394
+ // const lin01 = Helper.createLine([[line13.x, line13.y, 0], [line10.x, line10.y, 0], [line11.x, line11.y, 0], [line12.x, line12.y, 0]], '#ff0000', 3000);
395
+ // const lin02 = Helper.createLine([[p3[0], p3[1], 0], [p4[0], p4[1], 0]], '#00ff00', 3000);
396
+ // const lin3 = Helper.createLine([[p0[0], p0[1], 0], [p4[0], p4[1], 0], [p2[0], p2[1], 0], [p3[0], p3[1], 0]], '#0000ff', 3000);
397
+ // this.testLines.push(lin01);
398
+ // this.testLines.push(lin2);
399
+ // this.testLines.push(lin3);
400
+ return null;
401
+ }
402
+ const intersectCrd = intersects.features[0].geometry.coordinates;
403
+ // console.log('有交点', line1, line2, intersects, intersectCrd);
404
+ // 根据 endCrd 和 startCrd 取 向量作延长线s
405
+ const vecFromStE = new THREE.Vector2(points[endIndex][0] - points[startIndex - 1][0], points[endIndex][1] - points[startIndex - 1][1]).normalize().multiplyScalar(normalScale);
406
+ const p0 = [intersectCrd[0] - vecFromStE.x, intersectCrd[1] - vecFromStE.y];
407
+ const p2 = [intersectCrd[0] + vecFromStE.x, intersectCrd[1] + vecFromStE.y];
408
+ const normal = angle > 180 ? vecFromStE.normalize().multiplyScalar(-1) : vecFromStE.normalize().multiplyScalar(1);
409
+
410
+ // [p0, p2] 的连线中点就是intersectCrd
411
+ const p3 = [intersectCrd[0] - normal.y * normalScale, intersectCrd[1] + normal.x * normalScale];
412
+ const p4 = [intersectCrd[0] + normal.y * normalScale, intersectCrd[1] - normal.x * normalScale];
413
+
414
+ const poly = turf.featureCollection([
415
+ turf.point(p0),
416
+ turf.point(p4),
417
+ turf.point(p2),
418
+ turf.point(p3),
419
+ turf.point(p0),
420
+ ]);
421
+ // const lin1 = Helper.createLine([[p0[0], p0[1], 0], [p2[0], p2[1], 0]], '#ff0000', 3000);
422
+ // const lin2 = Helper.createLine([[p3[0], p3[1], 0], [p4[0], p4[1], 0]], '#00ff00', 3000);
423
+ // const lin3 = Helper.createLine([[p0[0], p0[1], 0], [p4[0], p4[1], 0], [p2[0], p2[1], 0], [p3[0], p3[1], 0]], '#0000ff', 3000);
424
+ // this.testLines.push(lin1);
425
+ // this.testLines.push(lin2);
426
+ // this.testLines.push(lin3);
427
+ const hull = turf.convex(poly);
428
+ return {
429
+ hull,
430
+ intersectCrd,
431
+ startIndex,
432
+ endIndex,
433
+ };
434
+ });
435
+ let inCurrentArea = 0;
436
+ let l = 0;
437
+ let ifInTuring = false;
438
+ while (l < pLength && turningAreas[inCurrentArea]) {
439
+ const [ls, le] = vec3Chunk[l];
440
+ const curHull: turf.Feature | null = turningAreas[inCurrentArea]!.hull;
441
+ const curIntersectCrd: number[] = turningAreas[inCurrentArea]!.intersectCrd;
442
+ const nextIntersectCrd = turningAreas[inCurrentArea + 1] ? turningAreas[inCurrentArea + 1]!.intersectCrd : null;
443
+ const nextHull = turningAreas[inCurrentArea + 1] ? turningAreas[inCurrentArea + 1]!.hull : null;
444
+ const ifBoolinLs = turf.booleanWithin(turf.point([ls.x, ls.y]), curHull as turf.Feature);
445
+ const ifBoolinLe = turf.booleanWithin(turf.point([le.x, le.y]), curHull as turf.Feature);
446
+
447
+ const ifBoolin = ifBoolinLs || ifBoolinLe;
448
+ if (ifBoolin && ifBoolinLs) {
449
+ // 右转
450
+ ifInTuring = true;
451
+ const startCoord = new THREE.Vector3(...curIntersectCrd, 0);
452
+ let end = le;
453
+ // 判断 end 是否在 下一个 area
454
+ if (nextIntersectCrd && nextHull && turf.booleanWithin(turf.point([le.x, le.y]), nextHull)) {
455
+ end = new THREE.Vector3(nextIntersectCrd[0], nextIntersectCrd[1], nextIntersectCrd[2]);
456
+ }
457
+ // 缩放比例是: V<ls.x - le.x, ls.y - le.y> 的length
458
+ const oL = new THREE.Vector3().subVectors(le, ls).length();
459
+ const newL = new THREE.Vector3().subVectors(end, new THREE.Vector3(startCoord.x, startCoord.y, 0)).length();
460
+ const nv = new THREE.Vector3().subVectors(end, new THREE.Vector3(startCoord.x, startCoord.y, 0)).normalize();
461
+ res.splice(l, 1, {
462
+ point: [(startCoord.x + end.x) / 2, (startCoord.y + end.y) / 2, 0],
463
+ scale: newL / oL,
464
+ normal: [nv.x, nv.y],
465
+ });
466
+ } else if (ifBoolin && ifBoolinLe) {
467
+ // 左转
468
+ // console.log('ifBoolin && ifBoolinLe', ifBoolinLs, ifBoolinLe);
469
+ ifInTuring = true;
470
+ const endCoord = new THREE.Vector3(...curIntersectCrd, 0);
471
+ let start = ls;
472
+ if (nextIntersectCrd && nextHull && turf.booleanWithin(turf.point([ls.x, ls.y]), nextHull)) {
473
+ start = new THREE.Vector3(nextIntersectCrd[0], nextIntersectCrd[1], nextIntersectCrd[2]);
474
+ }
475
+ const oL = new THREE.Vector3().subVectors(le, ls).length();
476
+ const newL = new THREE.Vector3().subVectors(start, new THREE.Vector3(endCoord.x, endCoord.y, 0)).length();
477
+ const nv = new THREE.Vector3().subVectors(new THREE.Vector3(endCoord.x, endCoord.y, 0), start).normalize();
478
+ res.splice(l, 1, {
479
+ point: [(endCoord.x + start.x) / 2, (endCoord.y + start.y) / 2, 0],
480
+ scale: newL / oL,
481
+ normal: [nv.x, nv.y],
482
+ });
483
+ } else if (ifInTuring) {
484
+ l--; // 当前点需要再判断一次
485
+ ifInTuring = false;
486
+ inCurrentArea++;
487
+ }
488
+ l++;
489
+ }
490
+
491
+ return res;
492
+ }
493
+
494
+ private init(pts: [number, number, number][]): void {
495
+ const { THREE } = Externals.getInstance();
496
+ const points = pts;
497
+ const sWidth = this.options.strokeWidth || 0;
498
+ const fWidth = this.options.width ? this.options.width : 0.3;
499
+ const normalScale = sWidth + fWidth / 2;
500
+ const res: { point: [number, number, number]; normal: number[]; scale: number }[] = this.orgPoints(points, normalScale);
501
+ this.orgedPoints = res;
502
+ this.points = [];
503
+ const firstDis = 0.1;
504
+
505
+ if (points.length > 1) {
506
+ const [first, second, secondLast, last] = [
507
+ points[0],
508
+ points[1],
509
+ points[points.length - 2],
510
+ points[points.length - 1],
511
+ ];
512
+
513
+ const firstVec = new THREE.Vector3(...first);
514
+ const secondVec = new THREE.Vector3(...second);
515
+ const dirFirst = new THREE.Vector3().subVectors(firstVec, secondVec)
516
+ .normalize().multiplyScalar(firstVec.distanceTo(secondVec) * 0.05);
517
+ const head = firstVec.clone().add(dirFirst);
518
+ const secondLastVec = new THREE.Vector3(...secondLast);
519
+ const lastVec = new THREE.Vector3(...last);
520
+ const dirLast = new THREE.Vector3().subVectors(secondLastVec, lastVec)
521
+ .normalize().multiplyScalar(firstVec.distanceTo(secondVec) * 0.05);
522
+ const tail = lastVec.clone().sub(dirLast); // 增加端点[尾巴]
523
+ const originH = this.orgedPoints[0];
524
+ const originT = this.orgedPoints[this.orgedPoints.length - 1];
525
+ this.orgedPoints.unshift({ // 加入head
526
+ point: [head.x, head.y, head.z],
527
+ normal: originH.normal,
528
+ scale: 1.0,
529
+ });
530
+ this.orgedPoints.push({ // 加入head
531
+ point: [tail.x, tail.y, tail.z],
532
+ normal: originT.normal,
533
+ scale: 1.0,
534
+ });
535
+
536
+ this.points.push([head.x, head.y, head.z]);
537
+ this.points.push(...points);
538
+ this.points.push([tail.x, tail.y, tail.z]);
539
+ }
540
+
541
+ this.distances = [-firstDis];
542
+ for (
543
+ let i = 1,
544
+ l = this.points.length,
545
+ prevVec = new THREE.Vector3(...this.points[0]),
546
+ currentVec = new THREE.Vector3();
547
+ i < l;
548
+ i += 1
549
+ ) {
550
+ currentVec.set(...this.points[i]);
551
+ this.distances.push(
552
+ i === 1 ? 0 : this.distances[i - 1] + currentVec.distanceTo(prevVec),
553
+ );
554
+ prevVec.copy(currentVec);
555
+ }
556
+
557
+ this.bufferGeometry = new THREE.BufferGeometry();
558
+ const components = 9;
559
+
560
+ let [lx, ly, lz] = this.points[0];
561
+ let d = 0;
562
+ const vertices = [];
563
+
564
+ for (let i = 0; i < this.orgedPoints.length; i += 1) {
565
+ const [x, y, z] = this.orgedPoints[i].point;
566
+ const [normalX, normalY] = this.orgedPoints[i].normal;
567
+ const scale = this.orgedPoints[i].scale;
568
+ let nx = x - lx;
569
+ let ny = y - ly;
570
+ let nz = z - lz;
571
+ const l = Math.sqrt(nx * nx + ny * ny + nz * nz);
572
+ nx /= l;
573
+ ny /= l;
574
+ nz /= l;
575
+
576
+ d += l * 3;
577
+
578
+ if (this.options.strokeWidth) {
579
+ vertices.push(x, y, z, -2, d, this.distances[i], normalX, normalY, scale);
580
+ vertices.push(x, y, z, -1, d, this.distances[i], normalX, normalY, scale);
581
+ vertices.push(x, y, z, 1, d, this.distances[i], normalX, normalY, scale);
582
+ vertices.push(x, y, z, 2, d, this.distances[i], normalX, normalY, scale);
583
+ } else {
584
+ vertices.push(x, y, z, -1, d, this.distances[i], normalX, normalY, scale);
585
+ vertices.push(x, y, z, 1, d, this.distances[i], normalX, normalY, scale);
586
+ }
587
+
588
+ lx = x;
589
+ ly = y;
590
+ lz = z;
591
+ }
592
+
593
+ const vertexBuffer = new Float32Array(vertices);
594
+ const pointToCrdsNum = this.options.strokeWidth ? 4 : 2; // 路线上的一个顶点会生成几个点
595
+ const verticesBuffer = new THREE.InterleavedBuffer(vertexBuffer, components); // 交叉存储, 表明多个类型的attributes(例如,顶点位置、法向量、UV 和颜色值)被存储到一个队列中。
596
+ // InterleavedBuffer( array : TypedArray 一个基于共享缓存的类型化队列, stride : Integer 每个顶点占用类型化队列的多少个元素 )
597
+
598
+ const lastAttrib = new THREE.InterleavedBufferAttribute(verticesBuffer, 4, 0, false);
599
+ this.bufferGeometry.setAttribute('last', lastAttrib);
600
+ const currentAttrib = new THREE.InterleavedBufferAttribute(verticesBuffer, 4, components * pointToCrdsNum, false);
601
+ this.bufferGeometry.setAttribute('current', currentAttrib);
602
+ const nextAttrib = new THREE.InterleavedBufferAttribute(verticesBuffer, 4, components * pointToCrdsNum * 2, false);
603
+ this.bufferGeometry.setAttribute('next', nextAttrib);
604
+ const texoffAttrib = new THREE.InterleavedBufferAttribute(
605
+ verticesBuffer, 1, components * pointToCrdsNum + 4, false,
606
+ );
607
+ this.bufferGeometry.setAttribute('texoff', texoffAttrib);
608
+ const progressAttrib = new THREE.InterleavedBufferAttribute(
609
+ verticesBuffer, 1, components * pointToCrdsNum + 5, false,
610
+ );
611
+ this.bufferGeometry.setAttribute('progress', progressAttrib);
612
+
613
+ const normalAttrib = new THREE.InterleavedBufferAttribute(verticesBuffer, 2, components * pointToCrdsNum + 6, false);
614
+ this.bufferGeometry.setAttribute('normalVec', normalAttrib);
615
+
616
+ const scaleAttrib = new THREE.InterleavedBufferAttribute(verticesBuffer, 1, components * pointToCrdsNum + 8, false);
617
+ this.bufferGeometry.setAttribute('normalScale', scaleAttrib);
618
+
619
+ const positionVertBuffer = new THREE.InterleavedBuffer(
620
+ vertexBuffer.slice(components * pointToCrdsNum, vertices.length - components * pointToCrdsNum),
621
+ components,
622
+ );
623
+
624
+ const positionAttrib = new THREE.InterleavedBufferAttribute(positionVertBuffer, 4, 0);
625
+ this.bufferGeometry.setAttribute('position', positionAttrib);
626
+
627
+ this.bufferGeometry.computeBoundingBox();
628
+ this.bufferGeometry.computeBoundingSphere();
629
+ this.bufferGeometry.computeVertexNormals();
630
+
631
+ let indices: number[] = [];
632
+
633
+ if (this.options.strokeWidth) {
634
+ const arr = [
635
+ 0, 1, 4,
636
+ 1, 4, 5,
637
+ 1, 2, 5,
638
+ 2, 5, 6,
639
+ 2, 3, 6,
640
+ 3, 6, 7,
641
+ ];
642
+ for (let i = 4; i < vertices.length / components - 8; i += 4) {
643
+ const curLineNum = i / 4 - 1;
644
+ const curInds = arr.map((v: number) => v + curLineNum * 4);
645
+ indices = [...indices, ...curInds];
646
+ }
647
+ } else {
648
+ for (let i = 2; i < vertices.length / components - 4; i += 2) {
649
+ indices.push(i - 2, i - 1, i);
650
+ indices.push(i, i - 1, i + 1);
651
+ }
652
+ }
653
+
654
+ this.bufferGeometry.setIndex(indices);
655
+ // const resolution = new THREE.Vector2(window.innerWidth, window.innerHeight);
656
+ const resolution = new THREE.Vector2(1, 1);
657
+
658
+ const fillColor = this.options.color ? new Color(this.options.color) : new Color('rgb(255, 255, 255)').alpha(0.0);
659
+ const strokeColor = this.options.strokeColor ? new Color(this.options.strokeColor) : new Color('rgb(255, 255, 255)').alpha(0.0);
660
+ this.uniforms = {
661
+ stripTexture: {
662
+ type: 't',
663
+ value: null,
664
+ },
665
+ fillColor: {
666
+ type: 'v4',
667
+ value: new THREE.Vector4(
668
+ fillColor.red() / 255,
669
+ fillColor.green() / 255,
670
+ fillColor.blue() / 255,
671
+ fillColor.alpha(),
672
+ ),
673
+ },
674
+ strokeColor: {
675
+ type: 'v4',
676
+ // eslint-disable-next-line max-len
677
+ value: new THREE.Vector4(
678
+ strokeColor.red() / 255,
679
+ strokeColor.green() / 255,
680
+ strokeColor.blue() / 255,
681
+ strokeColor.alpha(),
682
+ ),
683
+ },
684
+ width: {
685
+ type: 'f',
686
+ value: this.options.width || 0.3,
687
+ },
688
+ strokeWidth: {
689
+ type: 'f',
690
+ value: this.options.strokeWidth || 0.1,
691
+ },
692
+ renderPixelLine: {
693
+ type: 'f',
694
+ value: this.renderPixelLine ? 1.0 : 0.0,
695
+ },
696
+ fillOpacity: {
697
+ type: 'f',
698
+ value: this.options.fillOpacity || 0.8,
699
+ },
700
+ resolution: {
701
+ type: 'v2',
702
+ value: resolution,
703
+ },
704
+ currentDistance: { type: 'f', value: this.options.current || 0 },
705
+ texOffset: { type: 'f', value: 0 },
706
+ fullLength: { type: 'f', value: this.distances[this.distances.length - 1] },
707
+ viewDistance: { type: 'f', value: this.options.viewDistance === null || typeof (this.options.viewDistance) === 'undefined' ? 15 : this.options.viewDistance },
708
+ gradientDistance: { type: 'f', value: this.options.gradientDistance || 4 },
709
+ gradientEnabled: { value: this.options.gradientEnabled || false },
710
+ } as { [uniform: string]: NS_THREE.IUniform };
711
+
712
+ this.material = new THREE.ShaderMaterial({
713
+ fragmentShader: MeshLine2D.FragmentShader,
714
+ vertexShader: MeshLine2D.VertexShader,
715
+ uniforms: this.uniforms,
716
+ depthTest: false, // 不加入深度检测, 按照bind顺序渲染
717
+ side: THREE.DoubleSide,
718
+ wireframe: false,
719
+ transparent: true,
720
+ opacity: 1.0,
721
+ blending: THREE.NormalBlending,
722
+ blendEquation: THREE.AddEquation,
723
+ blendSrc: THREE.SrcAlphaFactor,
724
+ blendDst: THREE.OneMinusSrcAlphaFactor,
725
+ });
726
+
727
+ if (this.options.textureUrl && this.options.textureMode === 'repeat') {
728
+ new THREE.TextureLoader().load(this.options.textureUrl, (texture: THREE.Texture) => {
729
+ texture.wrapS = THREE.RepeatWrapping;
730
+ texture.wrapT = THREE.RepeatWrapping;
731
+ texture.generateMipmaps = true;
732
+ this.uniforms.stripTexture.value = texture;
733
+ this.needsUpdate = true;
734
+ });
735
+ } else if (this.options.textureUrl && this.options.textureMode === 'tail') {
736
+ const lastDistance = this.distances[this.distances.length - 1];
737
+ this.updateTailArrowPos(lastDistance);
738
+ }
739
+
740
+ this.mesh = new THREE.Mesh(this.bufferGeometry, this.material);
741
+ this.mesh.renderOrder = 1000;
742
+ this.add(this.mesh);
743
+ }
744
+
745
+ public setContainer(container: HTMLElement): void {
746
+ if (EnvironmentUtils.GetEnv() === Env.Miniapp) return;
747
+ this.resize(container.clientWidth, container.clientHeight);
748
+ }
749
+
750
+ public resize(containerWidth: number, containerHeight: number): void {
751
+ if (this.viewWidth === containerWidth && this.viewHeight === containerHeight) return;
752
+ const resolution = new NS_THREE.Vector2(containerWidth, containerHeight);
753
+ this.uniforms.resolution.value = resolution;
754
+ this.needsUpdate = true;
755
+ this.viewWidth = containerWidth;
756
+ this.viewHeight = containerHeight;
757
+ }
758
+
759
+ public getBestView(currentPoint: NS_THREE.Vector3, fromDistance: number, toDistance: number): number {
760
+ let nearPoint = this.getPointOnDistance(fromDistance + 0.2).point;
761
+ let curPoint = currentPoint;
762
+ const { THREE } = Externals.getInstance();
763
+
764
+ // 过滤0.5米转角
765
+ let f = fromDistance + 1;
766
+ for (; f < (fromDistance + 10); f += 1) {
767
+ const scan = this.getPointOnDistance(f);
768
+ const dir1 = new THREE.Vector3().subVectors(scan.point, nearPoint);
769
+ const dir2 = new THREE.Vector3().subVectors(nearPoint, curPoint);
770
+ const rad = THREE.MathUtils.radToDeg(dir1.angleTo(dir2));
771
+ if (rad > 30) {
772
+ nearPoint = this.getPointOnDistance(f + 0.5).point;
773
+ curPoint = scan.point;
774
+ break;
775
+ }
776
+ }
777
+ let maxDistance = 0;
778
+ for (let i = f; i < toDistance; i++) {
779
+ const scan = this.getPointOnDistance(i);
780
+ const dir1 = new THREE.Vector3().subVectors(scan.point, nearPoint);
781
+ const dir2 = new THREE.Vector3().subVectors(nearPoint, curPoint);
782
+ const rad = THREE.MathUtils.radToDeg(dir1.angleTo(dir2));
783
+
784
+ if (rad > 32 && (i - fromDistance) > 10) {
785
+ maxDistance = i;
786
+ break;
787
+ }
788
+ if (rad > 20 && (i - fromDistance) > 15) {
789
+ maxDistance = i;
790
+ break;
791
+ }
792
+ }
793
+ return (maxDistance - fromDistance);
794
+ }
795
+
796
+ public getPointOnDistance(distance: number): { point: NS_THREE.Vector3; index: number } {
797
+ const { THREE } = Externals.getInstance();
798
+ let left = 0;
799
+ const { distances, points } = this;
800
+ let right = points.length - 1;
801
+ let p = -1;
802
+ while (left < right - 1) {
803
+ p = Math.floor((left + right) / 2);
804
+ if (distances[p] > distance) right = p;
805
+ else if (distances[p] < distance) left = p;
806
+ else {
807
+ left = p;
808
+ break;
809
+ }
810
+ }
811
+ p = left;
812
+ if (p > -1) {
813
+ const from = new THREE.Vector3(...this.points[p]);
814
+ if (p === this.points.length - 1 || distance <= 0) {
815
+ return {
816
+ point: from,
817
+ index: p + 1,
818
+ };
819
+ }
820
+
821
+ const fromDist = this.distances[p];
822
+ const to = new THREE.Vector3(...this.points[p + 1]);
823
+ const toDist = this.distances[p + 1];
824
+ const distDiff = toDist - fromDist;
825
+ const vecDiff = to.clone().sub(from);
826
+ return {
827
+ point: from.clone().add(vecDiff.multiplyScalar((distance - fromDist) / distDiff)),
828
+ index: p + 1,
829
+ };
830
+ }
831
+ throw new Error(`Cannot find point on distance ${distance}`);
832
+ }
833
+
834
+ public getNearestPoint(position: NS_THREE.Vector3, startDistance = 0): { point: NS_THREE.Vector3; distance: number; index: number } {
835
+ const { THREE } = Externals.getInstance();
836
+ const pathLength = this.distances[this.distances.length - 1];
837
+ let precision = 8;
838
+ let best: NS_THREE.Vector3 = new THREE.Vector3();
839
+ let bestLength = 0;
840
+ let bestDistance = Infinity;
841
+ let bestIndex = -1;
842
+
843
+ for (let scan, scanLength = startDistance, scanDistance; scanLength <= pathLength; scanLength += precision) {
844
+ scan = this.getPointOnDistance(scanLength);
845
+ scanDistance = position.distanceTo(scan.point);
846
+ if (scanDistance < bestDistance) {
847
+ best = scan.point;
848
+ bestLength = scanLength;
849
+ bestDistance = scanDistance;
850
+ bestIndex = scan.index;
851
+ }
852
+ }
853
+
854
+ let before;
855
+ let after;
856
+ let beforeLength;
857
+ let afterLength;
858
+ let beforeDistance;
859
+ let afterDistance;
860
+ precision /= 2;
861
+ while (precision > 0.1) {
862
+ beforeLength = bestLength - precision;
863
+ beforeDistance = position.distanceTo(before = this.getPointOnDistance(beforeLength).point);
864
+ afterLength = bestLength + precision;
865
+ afterDistance = position.distanceTo(after = this.getPointOnDistance(afterLength).point);
866
+ if (beforeLength >= 0 && beforeDistance < bestDistance) {
867
+ best = before; bestLength = beforeLength; bestDistance = beforeDistance;
868
+ } else if (afterLength <= pathLength && afterDistance < bestDistance) {
869
+ best = after; bestLength = afterLength; bestDistance = afterDistance;
870
+ } else {
871
+ precision /= 2;
872
+ }
873
+ }
874
+
875
+ return {
876
+ point: best,
877
+ distance: bestLength,
878
+ index: bestIndex,
879
+ };
880
+ }
881
+
882
+ getPathWithScope(startDistance: number, endDistance: number): [number, number, number][] {
883
+ if (startDistance >= endDistance) {
884
+ const endPoint = this.getPointOnDistance(endDistance).point;
885
+ return [
886
+ [endPoint.x, endPoint.y, 0],
887
+ ];
888
+ }
889
+ let i = this.distances.length - 1;
890
+ let j = 0;
891
+ while (i >= 0 && this.distances[i] > startDistance) i -= 1;
892
+ while (j < this.distances.length && this.distances[j] < endDistance) j += 1;
893
+ const startPoint = this.getPointOnDistance(startDistance).point;
894
+ const endPoint = this.getPointOnDistance(endDistance).point;
895
+ return [
896
+ [startPoint.x, startPoint.y, 0],
897
+ ...this.points.slice(i + 1, j - i - 1),
898
+ [endPoint.x, endPoint.y, 0],
899
+ ];
900
+ }
901
+
902
+ getPathBaseStartPoint(distance: number): [number, number, number][] {
903
+ const startPoint = this.getPointOnDistance(distance).point;
904
+ for (let i = 0; i < this.distances.length; i += 1) {
905
+ if (this.distances[i] > distance) {
906
+ return [
907
+ [startPoint.x, startPoint.y, 0],
908
+ ...this.points.slice(i),
909
+ ];
910
+ }
911
+ }
912
+ return this.points.slice(this.distances.length - 1);
913
+ }
914
+
915
+ public update(): ElementFrameContext {
916
+ const frameContext = new ElementFrameContext(this);
917
+ if (!this.initialized && this.ready) {
918
+ this.initialized = true;
919
+ frameContext.needUpdate = true;
920
+ } else if (this.needsUpdate) {
921
+ frameContext.needUpdate = true;
922
+ this.needsUpdate = false;
923
+ }
924
+ if (this.options.animateEnabled) {
925
+ this.uniforms.texOffset.value -= this.options.animateSpeed!;
926
+ // this.uniforms.texOffset.value -= this.options.animateSpeed!;
927
+ frameContext.needUpdate = true;
928
+ }
929
+ if (this.initialized && !this.parent) {
930
+ frameContext.shouldPlaceElement = true;
931
+ }
932
+ return frameContext;
933
+ }
934
+
935
+ public dispose(): void {
936
+ if (this.parentOverlay) {
937
+ this.parentOverlay.removePath(this);
938
+ }
939
+ super.dispose();
940
+ this.remove(this.mesh);
941
+ this.material.dispose();
942
+ this.bufferGeometry.dispose();
943
+ }
944
+
945
+ public setCurrent(current: number): void {
946
+ this.uniforms.currentDistance.value = current;
947
+ this.needsUpdate = true;
948
+ }
949
+
950
+ public getLength(): number {
951
+ return this.distances[this.distances.length - 1];
952
+ }
953
+
954
+ public setCurrentIndex(currentIndex: number): void {
955
+ this.currentMoveIndex = currentIndex;
956
+ const current = this.distances[currentIndex + 1];
957
+ this.uniforms.currentDistance.value = current;
958
+ this.needsUpdate = true;
959
+ }
960
+
961
+ public getCurrent(): number {
962
+ return this.uniforms.currentDistance.value as number;
963
+ }
964
+
965
+ public getCurrentIndex(): number {
966
+ return this.currentMoveIndex;
967
+ // return this.uniforms.currentDistance.value as number;
968
+ }
969
+
970
+ public setViewDistance(value: number): void {
971
+ this.uniforms.viewDistance.value = value;
972
+ const distance = value + this.uniforms.currentDistance.value;
973
+ if (this.options.textureUrl && this.options.textureMode === 'tail') {
974
+ if (!this.tailArrow) {
975
+ setTimeout(() => {
976
+ this.setViewDistance(value);
977
+ }, 1000);
978
+ return;
979
+ }
980
+ this.updateTailArrowPos(distance);
981
+ }
982
+ }
983
+
984
+ public updateTailArrowPos(distance: number): void {
985
+ if (!this.tailArrow) {
986
+ setTimeout(() => {
987
+ this.updateTailArrowPos(distance);
988
+ }, 1000);
989
+ return;
990
+ }
991
+ this.tailArrow.visible = true;
992
+ const { index } = this.getPointOnDistance(distance);
993
+ const orgedPoint = this.orgedPoints[index];
994
+ const x = orgedPoint.point[0];
995
+ const y = orgedPoint.point[1];
996
+ const z = orgedPoint.point[2];
997
+ const normal2 = [-orgedPoint.normal[1], orgedPoint.normal[0]];
998
+ const atan3 = Math.atan2(normal2[1], normal2[0]);
999
+ const rotationZ = atan3 + Math.PI / 2;
1000
+ this.tailArrow.position.set(x, y, z);
1001
+ this.tailArrow.rotation.z = rotationZ;
1002
+ this.needsUpdate = true;
1003
+ }
1004
+
1005
+ public setWidth(width: number): void {
1006
+ if (this.uniforms.width.value !== width) {
1007
+ this.uniforms.width.value = width;
1008
+ this.needsUpdate = true;
1009
+ }
1010
+ }
1011
+
1012
+ public setColor(color: number|string): void{
1013
+ if (color == null) return;
1014
+ const c = new Color(color);
1015
+ const v = this.uniforms.fillColor.value;
1016
+ const { THREE } = Externals.getInstance();
1017
+ const cv = new THREE.Vector4(c.red(), c.green(), c.blue(), c.alpha());
1018
+ if (cv.equals(v)) return;
1019
+ this.uniforms.fillColor.value = cv;
1020
+ this.needsUpdate = true;
1021
+ }
1022
+
1023
+ public getViewDistance(): number {
1024
+ return this.uniforms.viewDistance.value as number;
1025
+ }
1026
+
1027
+ public setParentOverlay(parent: PathOverlay2): void {
1028
+ this.parentOverlay = parent;
1029
+ }
1030
+ }
1031
+
1032
+ export { MeshLine2D };