@openglobus/og 0.18.0 → 0.18.1

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 (476) hide show
  1. package/README.md +8 -8
  2. package/lib/@openglobus/og.esm.js +2 -0
  3. package/lib/@openglobus/og.esm.js.map +1 -0
  4. package/lib/@openglobus/og.umd.js +2 -0
  5. package/lib/@openglobus/og.umd.js.map +1 -0
  6. package/lib/js/Clock.d.ts +106 -0
  7. package/{src/Clock.ts → lib/js/Clock.js} +31 -126
  8. package/lib/js/Deferred.d.ts +6 -0
  9. package/lib/js/Deferred.js +13 -0
  10. package/lib/js/Events.d.ts +90 -0
  11. package/{src/Events.ts → lib/js/Events.js} +29 -84
  12. package/lib/js/Extent.d.ts +145 -0
  13. package/{src/Extent.ts → lib/js/Extent.js} +74 -120
  14. package/lib/js/Globe.d.ts +132 -0
  15. package/{src/Globe.ts → lib/js/Globe.js} +61 -159
  16. package/lib/js/ImageCanvas.d.ts +128 -0
  17. package/{src/ImageCanvas.ts → lib/js/ImageCanvas.js} +24 -65
  18. package/lib/js/Lock.d.ts +15 -0
  19. package/{src/Lock.ts → lib/js/Lock.js} +7 -21
  20. package/lib/js/LonLat.d.ts +128 -0
  21. package/{src/LonLat.ts → lib/js/LonLat.js} +44 -75
  22. package/lib/js/Object3d.d.ts +49 -0
  23. package/{src/Object3d.ts → lib/js/Object3d.js} +64 -184
  24. package/lib/js/Popup.d.ts +46 -0
  25. package/{src/Popup.ts → lib/js/Popup.js} +42 -110
  26. package/lib/js/QueueArray.d.ts +16 -0
  27. package/{src/QueueArray.ts → lib/js/QueueArray.js} +12 -25
  28. package/lib/js/Rectangle.d.ts +76 -0
  29. package/{src/Rectangle.ts → lib/js/Rectangle.js} +12 -50
  30. package/lib/js/Stack.d.ts +20 -0
  31. package/{src/Stack.ts → lib/js/Stack.js} +13 -29
  32. package/lib/js/astro/astro.d.ts +39 -0
  33. package/{src/astro/astro.ts → lib/js/astro/astro.js} +2 -8
  34. package/lib/js/astro/earth.d.ts +8 -0
  35. package/{src/astro/earth.ts → lib/js/astro/earth.js} +3 -39
  36. package/lib/js/astro/jd.d.ts +234 -0
  37. package/{src/astro/jd.ts → lib/js/astro/jd.js} +55 -134
  38. package/lib/js/astro/orbit.d.ts +5 -0
  39. package/{src/astro/orbit.ts → lib/js/astro/orbit.js} +26 -39
  40. package/lib/js/astro/rotation.d.ts +2 -0
  41. package/{src/astro/rotation.ts → lib/js/astro/rotation.js} +2 -11
  42. package/lib/js/bv/Box.d.ts +32 -0
  43. package/{src/bv/Box.ts → lib/js/bv/Box.js} +7 -35
  44. package/lib/js/bv/Sphere.d.ts +37 -0
  45. package/{src/bv/Sphere.ts → lib/js/bv/Sphere.js} +6 -34
  46. package/{src/bv/index.ts → lib/js/bv/index.d.ts} +0 -1
  47. package/lib/js/bv/index.js +3 -0
  48. package/lib/js/camera/Camera.d.ts +314 -0
  49. package/{src/camera/Camera.ts → lib/js/camera/Camera.js} +77 -326
  50. package/lib/js/camera/Frustum.d.ts +139 -0
  51. package/{src/camera/Frustum.ts → lib/js/camera/Frustum.js} +66 -185
  52. package/lib/js/camera/PlanetCamera.d.ts +234 -0
  53. package/{src/camera/PlanetCamera.ts → lib/js/camera/PlanetCamera.js} +65 -338
  54. package/{src/camera/index.ts → lib/js/camera/index.d.ts} +0 -1
  55. package/lib/js/camera/index.js +3 -0
  56. package/lib/js/cons.d.ts +40 -0
  57. package/{src/cons.ts → lib/js/cons.js} +10 -22
  58. package/lib/js/control/Atmosphere.d.ts +16 -0
  59. package/{src/control/Atmosphere.ts → lib/js/control/Atmosphere.js} +33 -86
  60. package/lib/js/control/CompassButton.d.ts +16 -0
  61. package/{src/control/CompassButton.ts → lib/js/control/CompassButton.js} +18 -43
  62. package/lib/js/control/Control.d.ts +100 -0
  63. package/{src/control/Control.ts → lib/js/control/Control.js} +22 -89
  64. package/lib/js/control/DebugInfo.d.ts +25 -0
  65. package/{src/control/DebugInfo.ts → lib/js/control/DebugInfo.js} +38 -84
  66. package/lib/js/control/DrawingSwitcher.d.ts +13 -0
  67. package/{src/control/DrawingSwitcher.ts → lib/js/control/DrawingSwitcher.js} +13 -30
  68. package/lib/js/control/EarthCoordinates.d.ts +41 -0
  69. package/{src/control/EarthCoordinates.ts → lib/js/control/EarthCoordinates.js} +58 -119
  70. package/lib/js/control/EarthNavigation.d.ts +50 -0
  71. package/{src/control/EarthNavigation.ts → lib/js/control/EarthNavigation.js} +70 -161
  72. package/lib/js/control/GeoImageDragControl.d.ts +22 -0
  73. package/{src/control/GeoImageDragControl.ts → lib/js/control/GeoImageDragControl.js} +26 -49
  74. package/lib/js/control/KeyboardNavigation.d.ts +28 -0
  75. package/{src/control/KeyboardNavigation.ts → lib/js/control/KeyboardNavigation.js} +67 -92
  76. package/lib/js/control/LayerAnimation.d.ts +71 -0
  77. package/{src/control/LayerAnimation.ts → lib/js/control/LayerAnimation.js} +82 -162
  78. package/lib/js/control/LayerSwitcher.d.ts +21 -0
  79. package/{src/control/LayerSwitcher.ts → lib/js/control/LayerSwitcher.js} +16 -41
  80. package/lib/js/control/Lighting.d.ts +49 -0
  81. package/{src/control/Lighting.ts → lib/js/control/Lighting.js} +106 -219
  82. package/lib/js/control/MouseNavigation.d.ts +62 -0
  83. package/{src/control/MouseNavigation.ts → lib/js/control/MouseNavigation.js} +105 -211
  84. package/lib/js/control/MouseWheelZoomControl.d.ts +44 -0
  85. package/lib/js/control/MouseWheelZoomControl.js +181 -0
  86. package/lib/js/control/RulerSwitcher.d.ts +17 -0
  87. package/{src/control/RulerSwitcher.ts → lib/js/control/RulerSwitcher.js} +13 -28
  88. package/lib/js/control/ScaleControl.d.ts +24 -0
  89. package/lib/js/control/ScaleControl.js +91 -0
  90. package/lib/js/control/SegmentBoundVisualization.d.ts +12 -0
  91. package/lib/js/control/SegmentBoundVisualization.js +37 -0
  92. package/lib/js/control/ShowFps.d.ts +9 -0
  93. package/lib/js/control/ShowFps.js +20 -0
  94. package/lib/js/control/SimpleNavigation.d.ts +25 -0
  95. package/{src/control/SimpleNavigation.ts → lib/js/control/SimpleNavigation.js} +29 -51
  96. package/lib/js/control/SimpleSkyBackground.d.ts +15 -0
  97. package/{src/control/SimpleSkyBackground.ts → lib/js/control/SimpleSkyBackground.js} +21 -48
  98. package/lib/js/control/Sun.d.ts +33 -0
  99. package/{src/control/Sun.ts → lib/js/control/Sun.js} +34 -85
  100. package/lib/js/control/ToggleWireframe.d.ts +14 -0
  101. package/lib/js/control/ToggleWireframe.js +28 -0
  102. package/lib/js/control/TouchNavigation.d.ts +52 -0
  103. package/{src/control/TouchNavigation.ts → lib/js/control/TouchNavigation.js} +88 -193
  104. package/lib/js/control/ZoomControl.d.ts +27 -0
  105. package/{src/control/ZoomControl.ts → lib/js/control/ZoomControl.js} +25 -50
  106. package/lib/js/control/drawing/DrawingControl.d.ts +12 -0
  107. package/{src/control/drawing/DrawingControl.ts → lib/js/control/drawing/DrawingControl.js} +10 -20
  108. package/lib/js/control/drawing/LineStringDrawingScene.d.ts +15 -0
  109. package/{src/control/drawing/LineStringDrawingScene.ts → lib/js/control/drawing/LineStringDrawingScene.js} +28 -85
  110. package/lib/js/control/drawing/PolygonDrawingScene.d.ts +98 -0
  111. package/{src/control/drawing/PolygonDrawingScene.ts → lib/js/control/drawing/PolygonDrawingScene.js} +190 -388
  112. package/lib/js/control/elevationProfile/ElevationProfile.d.ts +61 -0
  113. package/{src/control/elevationProfile/ElevationProfile.ts → lib/js/control/elevationProfile/ElevationProfile.js} +56 -148
  114. package/lib/js/control/heightRuler/HeightRuler.d.ts +7 -0
  115. package/{src/control/heightRuler/HeightRuler.ts → lib/js/control/heightRuler/HeightRuler.js} +4 -9
  116. package/lib/js/control/heightRuler/HeightRulerScene.d.ts +35 -0
  117. package/{src/control/heightRuler/HeightRulerScene.ts → lib/js/control/heightRuler/HeightRulerScene.js} +47 -99
  118. package/lib/js/control/heightRuler/HeightRulerSwitcher.d.ts +6 -0
  119. package/{src/control/heightRuler/HeightRulerSwitcher.ts → lib/js/control/heightRuler/HeightRulerSwitcher.js} +2 -4
  120. package/{src/control/index.ts → lib/js/control/index.d.ts} +1 -18
  121. package/lib/js/control/index.js +28 -0
  122. package/lib/js/control/ruler/Ruler.d.ts +13 -0
  123. package/lib/js/control/ruler/Ruler.js +23 -0
  124. package/lib/js/control/ruler/RulerScene.d.ts +88 -0
  125. package/lib/js/control/ruler/RulerScene.js +324 -0
  126. package/lib/js/control/selection/Selection.d.ts +55 -0
  127. package/{src/control/selection/Selection.ts → lib/js/control/selection/Selection.js} +15 -34
  128. package/lib/js/control/selection/SelectionScene.d.ts +44 -0
  129. package/{src/control/selection/SelectionScene.ts → lib/js/control/selection/SelectionScene.js} +26 -113
  130. package/lib/js/control/timeline/TimelineControl.d.ts +18 -0
  131. package/{src/control/timeline/TimelineControl.ts → lib/js/control/timeline/TimelineControl.js} +13 -43
  132. package/lib/js/control/timeline/TimelineModel.d.ts +41 -0
  133. package/{src/control/timeline/TimelineModel.ts → lib/js/control/timeline/TimelineModel.js} +26 -74
  134. package/lib/js/control/timeline/TimelineView.d.ts +85 -0
  135. package/{src/control/timeline/TimelineView.ts → lib/js/control/timeline/TimelineView.js} +133 -281
  136. package/lib/js/control/timeline/timelineUtils.d.ts +12 -0
  137. package/lib/js/control/timeline/timelineUtils.js +112 -0
  138. package/lib/js/control/visibleExtent/Segment.d.ts +277 -0
  139. package/{src → lib/js}/control/visibleExtent/Segment.js +145 -698
  140. package/lib/js/control/visibleExtent/VisibleExtent.d.ts +5 -0
  141. package/{src → lib/js}/control/visibleExtent/VisibleExtent.js +1 -18
  142. package/lib/js/control/visibleExtent/drawnode.d.ts +7 -0
  143. package/{src/control/visibleExtent/drawnode.ts → lib/js/control/visibleExtent/drawnode.js} +1 -28
  144. package/lib/js/ellipsoid/Ellipsoid.d.ts +187 -0
  145. package/{src/ellipsoid/Ellipsoid.ts → lib/js/ellipsoid/Ellipsoid.js} +82 -267
  146. package/lib/js/ellipsoid/index.d.ts +3 -0
  147. package/lib/js/ellipsoid/index.js +3 -0
  148. package/lib/js/ellipsoid/wgs84.d.ts +6 -0
  149. package/{src/ellipsoid/wgs84.ts → lib/js/ellipsoid/wgs84.js} +1 -2
  150. package/lib/js/entity/BaseBillboard.d.ts +222 -0
  151. package/{src/entity/BaseBillboard.ts → lib/js/entity/BaseBillboard.js} +48 -165
  152. package/lib/js/entity/BaseBillboardHandler.d.ts +81 -0
  153. package/{src/entity/BaseBillboardHandler.ts → lib/js/entity/BaseBillboardHandler.js} +139 -365
  154. package/lib/js/entity/Billboard.d.ts +113 -0
  155. package/{src/entity/Billboard.ts → lib/js/entity/Billboard.js} +19 -83
  156. package/lib/js/entity/BillboardHandler.d.ts +15 -0
  157. package/{src/entity/BillboardHandler.ts → lib/js/entity/BillboardHandler.js} +27 -59
  158. package/lib/js/entity/Entity.d.ts +354 -0
  159. package/{src/entity/Entity.ts → lib/js/entity/Entity.js} +101 -373
  160. package/lib/js/entity/EntityCollection.d.ts +364 -0
  161. package/{src/entity/EntityCollection.ts → lib/js/entity/EntityCollection.js} +51 -353
  162. package/lib/js/entity/GeoObject.d.ts +138 -0
  163. package/{src/entity/GeoObject.ts → lib/js/entity/GeoObject.js} +41 -146
  164. package/lib/js/entity/GeoObjectHandler.d.ts +99 -0
  165. package/{src/entity/GeoObjectHandler.ts → lib/js/entity/GeoObjectHandler.js} +162 -423
  166. package/lib/js/entity/Geometry.d.ts +111 -0
  167. package/lib/js/entity/Geometry.js +283 -0
  168. package/lib/js/entity/GeometryHandler.d.ts +84 -0
  169. package/{src/entity/GeometryHandler.ts → lib/js/entity/GeometryHandler.js} +162 -657
  170. package/lib/js/entity/Label.d.ts +207 -0
  171. package/{src/entity/Label.ts → lib/js/entity/Label.js} +62 -164
  172. package/lib/js/entity/LabelHandler.d.ts +65 -0
  173. package/{src/entity/LabelHandler.ts → lib/js/entity/LabelHandler.js} +175 -408
  174. package/lib/js/entity/LabelWorker.d.ts +15 -0
  175. package/{src/entity/LabelWorker.ts → lib/js/entity/LabelWorker.js} +24 -45
  176. package/lib/js/entity/PointCloud.d.ts +179 -0
  177. package/{src/entity/PointCloud.ts → lib/js/entity/PointCloud.js} +65 -265
  178. package/lib/js/entity/PointCloudHandler.d.ts +42 -0
  179. package/{src/entity/PointCloudHandler.ts → lib/js/entity/PointCloudHandler.js} +19 -62
  180. package/lib/js/entity/Polyline.d.ts +337 -0
  181. package/{src/entity/Polyline.ts → lib/js/entity/Polyline.js} +289 -924
  182. package/lib/js/entity/PolylineHandler.d.ts +22 -0
  183. package/{src/entity/PolylineHandler.ts → lib/js/entity/PolylineHandler.js} +12 -37
  184. package/lib/js/entity/Ray.d.ts +133 -0
  185. package/{src/entity/Ray.ts → lib/js/entity/Ray.js} +26 -146
  186. package/lib/js/entity/RayHandler.d.ts +70 -0
  187. package/{src/entity/RayHandler.ts → lib/js/entity/RayHandler.js} +102 -342
  188. package/lib/js/entity/Strip.d.ts +127 -0
  189. package/{src/entity/Strip.ts → lib/js/entity/Strip.js} +102 -372
  190. package/lib/js/entity/StripHandler.d.ts +42 -0
  191. package/{src/entity/StripHandler.ts → lib/js/entity/StripHandler.js} +22 -74
  192. package/{src/entity/index.ts → lib/js/entity/index.d.ts} +1 -2
  193. package/lib/js/entity/index.js +11 -0
  194. package/lib/js/index.d.ts +33 -0
  195. package/lib/js/index.js +33 -0
  196. package/lib/js/input/KeyboardHandler.d.ts +33 -0
  197. package/{src/input/KeyboardHandler.ts → lib/js/input/KeyboardHandler.js} +45 -84
  198. package/lib/js/input/MouseHandler.d.ts +16 -0
  199. package/{src/input/MouseHandler.ts → lib/js/input/MouseHandler.js} +12 -36
  200. package/lib/js/input/TouchHandler.d.ts +11 -0
  201. package/{src/input/TouchHandler.ts → lib/js/input/TouchHandler.js} +11 -23
  202. package/lib/js/input/input.d.ts +3 -0
  203. package/{src/input/input.ts → lib/js/input/input.js} +1 -1
  204. package/lib/js/layer/BaseGeoImage.d.ts +145 -0
  205. package/{src/layer/BaseGeoImage.ts → lib/js/layer/BaseGeoImage.js} +70 -235
  206. package/lib/js/layer/CanvasTiles.d.ts +103 -0
  207. package/{src/layer/CanvasTiles.ts → lib/js/layer/CanvasTiles.js} +54 -146
  208. package/lib/js/layer/GeoImage.d.ts +61 -0
  209. package/{src/layer/GeoImage.ts → lib/js/layer/GeoImage.js} +24 -54
  210. package/lib/js/layer/GeoTexture2d.d.ts +17 -0
  211. package/lib/js/layer/GeoTexture2d.js +37 -0
  212. package/lib/js/layer/GeoVideo.d.ts +68 -0
  213. package/{src/layer/GeoVideo.ts → lib/js/layer/GeoVideo.js} +31 -61
  214. package/lib/js/layer/KML.d.ts +72 -0
  215. package/{src/layer/KML.ts → lib/js/layer/KML.js} +94 -138
  216. package/lib/js/layer/Layer.d.ts +401 -0
  217. package/{src/layer/Layer.ts → lib/js/layer/Layer.js} +92 -443
  218. package/lib/js/layer/Material.d.ts +34 -0
  219. package/{src/layer/Material.ts → lib/js/layer/Material.js} +9 -43
  220. package/lib/js/layer/Vector.d.ts +244 -0
  221. package/{src/layer/Vector.ts → lib/js/layer/Vector.js} +147 -418
  222. package/lib/js/layer/WMS.d.ts +75 -0
  223. package/{src/layer/WMS.ts → lib/js/layer/WMS.js} +18 -100
  224. package/lib/js/layer/XYZ.d.ts +149 -0
  225. package/{src/layer/XYZ.ts → lib/js/layer/XYZ.js} +71 -171
  226. package/lib/js/layer/index.d.ts +11 -0
  227. package/lib/js/layer/index.js +11 -0
  228. package/lib/js/light/LightSource.d.ts +174 -0
  229. package/{src/light/LightSource.ts → lib/js/light/LightSource.js} +22 -131
  230. package/lib/js/math/Line2.d.ts +11 -0
  231. package/{src/math/Line2.ts → lib/js/math/Line2.js} +5 -15
  232. package/lib/js/math/Line3.d.ts +28 -0
  233. package/lib/js/math/Line3.js +85 -0
  234. package/lib/js/math/Mat3.d.ts +77 -0
  235. package/{src/math/Mat3.ts → lib/js/math/Mat3.js} +22 -51
  236. package/lib/js/math/Mat4.d.ts +195 -0
  237. package/{src/math/Mat4.ts → lib/js/math/Mat4.js} +53 -219
  238. package/lib/js/math/Plane.d.ts +20 -0
  239. package/{src/math/Plane.ts → lib/js/math/Plane.js} +26 -40
  240. package/lib/js/math/Quat.d.ts +373 -0
  241. package/{src/math/Quat.ts → lib/js/math/Quat.js} +106 -319
  242. package/lib/js/math/Ray.d.ts +76 -0
  243. package/{src/math/Ray.ts → lib/js/math/Ray.js} +21 -66
  244. package/lib/js/math/Vec2.d.ts +310 -0
  245. package/{src/math/Vec2.ts → lib/js/math/Vec2.js} +55 -121
  246. package/lib/js/math/Vec3.d.ts +472 -0
  247. package/{src/math/Vec3.ts → lib/js/math/Vec3.js} +103 -236
  248. package/lib/js/math/Vec4.d.ts +163 -0
  249. package/{src/math/Vec4.ts → lib/js/math/Vec4.js} +23 -79
  250. package/lib/js/math/coder.d.ts +51 -0
  251. package/{src/math/coder.ts → lib/js/math/coder.js} +14 -20
  252. package/lib/js/math/index.d.ts +11 -0
  253. package/lib/js/math/index.js +11 -0
  254. package/lib/js/math.d.ts +266 -0
  255. package/{src/math.ts → lib/js/math.js} +37 -85
  256. package/lib/js/mercator.d.ts +92 -0
  257. package/{src/mercator.ts → lib/js/mercator.js} +13 -37
  258. package/lib/js/proj/EPSG3857.d.ts +9 -0
  259. package/{src/proj/EPSG3857.ts → lib/js/proj/EPSG3857.js} +0 -2
  260. package/lib/js/proj/EPSG4326.d.ts +9 -0
  261. package/{src/proj/EPSG4326.ts → lib/js/proj/EPSG4326.js} +0 -2
  262. package/lib/js/proj/Proj.d.ts +43 -0
  263. package/{src/proj/Proj.ts → lib/js/proj/Proj.js} +4 -29
  264. package/lib/js/quadTree/EPSG4326QuadTreeStrategy.d.ts +6 -0
  265. package/lib/js/quadTree/EPSG4326QuadTreeStrategy.js +17 -0
  266. package/lib/js/quadTree/EarthQuadTreeStrategy.d.ts +6 -0
  267. package/lib/js/quadTree/EarthQuadTreeStrategy.js +19 -0
  268. package/lib/js/quadTree/EntityCollectionNode.d.ts +54 -0
  269. package/{src/quadTree/EntityCollectionNode.ts → lib/js/quadTree/EntityCollectionNode.js} +83 -150
  270. package/lib/js/quadTree/MarsQuadTreeStrategy.d.ts +6 -0
  271. package/lib/js/quadTree/MarsQuadTreeStrategy.js +17 -0
  272. package/lib/js/quadTree/Node.d.ts +61 -0
  273. package/{src/quadTree/Node.ts → lib/js/quadTree/Node.js} +140 -357
  274. package/lib/js/quadTree/QuadTreeStrategy.d.ts +25 -0
  275. package/{src/quadTree/QuadTreeStrategy.ts → lib/js/quadTree/QuadTreeStrategy.js} +13 -44
  276. package/lib/js/quadTree/Wgs84QuadTreeStrategy.d.ts +6 -0
  277. package/lib/js/quadTree/Wgs84QuadTreeStrategy.js +15 -0
  278. package/lib/js/quadTree/index.d.ts +12 -0
  279. package/lib/js/quadTree/index.js +12 -0
  280. package/lib/js/quadTree/quadTree.d.ts +40 -0
  281. package/{src/quadTree/quadTree.ts → lib/js/quadTree/quadTree.js} +0 -9
  282. package/lib/js/renderer/Renderer.d.ts +311 -0
  283. package/{src/renderer/Renderer.ts → lib/js/renderer/Renderer.js} +169 -611
  284. package/lib/js/renderer/RendererEvents.d.ts +237 -0
  285. package/{src/renderer/RendererEvents.ts → lib/js/renderer/RendererEvents.js} +134 -471
  286. package/lib/js/scene/Axes.d.ts +12 -0
  287. package/lib/js/scene/Axes.js +59 -0
  288. package/lib/js/scene/BaseNode.d.ts +61 -0
  289. package/{src/scene/BaseNode.ts → lib/js/scene/BaseNode.js} +11 -57
  290. package/lib/js/scene/Planet.d.ts +623 -0
  291. package/{src/scene/Planet.ts → lib/js/scene/Planet.js} +251 -935
  292. package/lib/js/scene/RenderNode.d.ts +150 -0
  293. package/{src/scene/RenderNode.ts → lib/js/scene/RenderNode.js} +33 -138
  294. package/lib/js/scene/SkyBox.d.ts +13 -0
  295. package/{src/scene/SkyBox.ts → lib/js/scene/SkyBox.js} +16 -37
  296. package/{src/scene/index.ts → lib/js/scene/index.d.ts} +0 -1
  297. package/lib/js/scene/index.js +5 -0
  298. package/lib/js/segment/Segment.d.ts +278 -0
  299. package/{src/segment/Segment.ts → lib/js/segment/Segment.js} +242 -913
  300. package/lib/js/segment/SegmentLonLat.d.ts +48 -0
  301. package/{src/segment/SegmentLonLat.ts → lib/js/segment/SegmentLonLat.js} +58 -132
  302. package/lib/js/segment/SegmentLonLatWgs84.d.ts +10 -0
  303. package/lib/js/segment/SegmentLonLatWgs84.js +23 -0
  304. package/lib/js/segment/Slice.d.ts +13 -0
  305. package/{src/segment/Slice.ts → lib/js/segment/Slice.js} +4 -22
  306. package/lib/js/segment/segmentHelper.d.ts +18 -0
  307. package/{src/segment/segmentHelper.ts → lib/js/segment/segmentHelper.js} +30 -88
  308. package/lib/js/shaders/atmos.d.ts +4 -0
  309. package/{src/shaders/atmos.ts → lib/js/shaders/atmos.js} +8 -26
  310. package/lib/js/shaders/billboard.d.ts +3 -0
  311. package/{src/shaders/billboard.ts → lib/js/shaders/billboard.js} +9 -18
  312. package/lib/js/shaders/bloom.d.ts +2 -0
  313. package/{src/shaders/bloom.ts → lib/js/shaders/bloom.js} +5 -8
  314. package/lib/js/shaders/blur.d.ts +3 -0
  315. package/{src/shaders/blur.ts → lib/js/shaders/blur.js} +11 -19
  316. package/lib/js/shaders/depth.d.ts +2 -0
  317. package/{src/shaders/depth.ts → lib/js/shaders/depth.js} +3 -6
  318. package/lib/js/shaders/drawnode.d.ts +8 -0
  319. package/{src/shaders/drawnode.ts → lib/js/shaders/drawnode.js} +23 -75
  320. package/lib/js/shaders/geoObject.d.ts +3 -0
  321. package/{src/shaders/geoObject.ts → lib/js/shaders/geoObject.js} +51 -63
  322. package/lib/js/shaders/label.d.ts +4 -0
  323. package/{src/shaders/label.ts → lib/js/shaders/label.js} +12 -25
  324. package/lib/js/shaders/lumFilter.d.ts +2 -0
  325. package/{src/shaders/lumFilter.ts → lib/js/shaders/lumFilter.js} +4 -7
  326. package/lib/js/shaders/pickingMask.d.ts +2 -0
  327. package/{src/shaders/pickingMask.ts → lib/js/shaders/pickingMask.js} +5 -8
  328. package/lib/js/shaders/pointCloud.d.ts +2 -0
  329. package/{src/shaders/pointCloud.ts → lib/js/shaders/pointCloud.js} +4 -7
  330. package/lib/js/shaders/polyline.d.ts +3 -0
  331. package/{src/shaders/polyline.ts → lib/js/shaders/polyline.js} +7 -22
  332. package/lib/js/shaders/ray.d.ts +2 -0
  333. package/{src/shaders/ray.ts → lib/js/shaders/ray.js} +4 -7
  334. package/lib/js/shaders/screenFrame.d.ts +2 -0
  335. package/{src/shaders/screenFrame.ts → lib/js/shaders/screenFrame.js} +5 -8
  336. package/lib/js/shaders/skybox.d.ts +2 -0
  337. package/{src/shaders/skybox.ts → lib/js/shaders/skybox.js} +10 -13
  338. package/lib/js/shaders/toneMapping.d.ts +2 -0
  339. package/{src/shaders/toneMapping.ts → lib/js/shaders/toneMapping.js} +5 -8
  340. package/lib/js/shaders/utils.d.ts +1 -0
  341. package/{src/shaders/utils.ts → lib/js/shaders/utils.js} +1 -1
  342. package/lib/js/terrain/BilTerrain.d.ts +18 -0
  343. package/{src/terrain/BilTerrain.ts → lib/js/terrain/BilTerrain.js} +21 -118
  344. package/lib/js/terrain/EmptyTerrain.d.ts +106 -0
  345. package/{src/terrain/EmptyTerrain.ts → lib/js/terrain/EmptyTerrain.js} +20 -144
  346. package/lib/js/terrain/Geoid.d.ts +33 -0
  347. package/lib/js/terrain/Geoid.js +191 -0
  348. package/lib/js/terrain/GlobusTerrain.d.ts +134 -0
  349. package/{src/terrain/GlobusTerrain.ts → lib/js/terrain/GlobusTerrain.js} +82 -239
  350. package/lib/js/terrain/MapboxTerrain.d.ts +21 -0
  351. package/{src/terrain/MapboxTerrain.ts → lib/js/terrain/MapboxTerrain.js} +46 -215
  352. package/{src/terrain/index.ts → lib/js/terrain/index.d.ts} +0 -1
  353. package/lib/js/terrain/index.js +5 -0
  354. package/lib/js/ui/Button.d.ts +32 -0
  355. package/lib/js/ui/Button.js +78 -0
  356. package/lib/js/ui/ButtonGroup.d.ts +16 -0
  357. package/lib/js/ui/ButtonGroup.js +41 -0
  358. package/lib/js/ui/Dialog.d.ts +55 -0
  359. package/lib/js/ui/Dialog.js +173 -0
  360. package/lib/js/ui/Slider.d.ts +38 -0
  361. package/lib/js/ui/Slider.js +129 -0
  362. package/lib/js/ui/ToggleButton.d.ts +20 -0
  363. package/lib/js/ui/ToggleButton.js +42 -0
  364. package/lib/js/ui/View.d.ts +37 -0
  365. package/{src/ui/View.ts → lib/js/ui/View.js} +31 -77
  366. package/lib/js/ui/icons.d.ts +1 -0
  367. package/{src/ui/icons.ts → lib/js/ui/icons.js} +1 -1
  368. package/lib/js/utils/BaseWorker.d.ts +14 -0
  369. package/{src/utils/BaseWorker.ts → lib/js/utils/BaseWorker.js} +15 -28
  370. package/lib/js/utils/FontAtlas.d.ts +82 -0
  371. package/{src/utils/FontAtlas.ts → lib/js/utils/FontAtlas.js} +45 -181
  372. package/lib/js/utils/GeoImageCreator.d.ts +34 -0
  373. package/{src/utils/GeoImageCreator.ts → lib/js/utils/GeoImageCreator.js} +34 -91
  374. package/lib/js/utils/ImagesCacheManager.d.ts +22 -0
  375. package/{src/utils/ImagesCacheManager.ts → lib/js/utils/ImagesCacheManager.js} +16 -38
  376. package/lib/js/utils/Loader.d.ts +63 -0
  377. package/lib/js/utils/Loader.js +156 -0
  378. package/lib/js/utils/NormalMapCreator.d.ts +52 -0
  379. package/{src/utils/NormalMapCreator.ts → lib/js/utils/NormalMapCreator.js} +64 -195
  380. package/lib/js/utils/PlainSegmentWorker.d.ts +24 -0
  381. package/{src/utils/PlainSegmentWorker.ts → lib/js/utils/PlainSegmentWorker.js} +24 -56
  382. package/lib/js/utils/TerrainWorker.d.ts +28 -0
  383. package/{src/utils/TerrainWorker.ts → lib/js/utils/TerrainWorker.js} +19 -56
  384. package/lib/js/utils/TextureAtlas.d.ts +113 -0
  385. package/{src/utils/TextureAtlas.ts → lib/js/utils/TextureAtlas.js} +40 -131
  386. package/lib/js/utils/VectorTileCreator.d.ts +18 -0
  387. package/{src/utils/VectorTileCreator.ts → lib/js/utils/VectorTileCreator.js} +61 -147
  388. package/lib/js/utils/colorTable.d.ts +3 -0
  389. package/{src/utils/colorTable.ts → lib/js/utils/colorTable.js} +2 -2
  390. package/lib/js/utils/earcut.d.ts +7 -0
  391. package/{src/utils/earcut.ts → lib/js/utils/earcut.js} +95 -223
  392. package/lib/js/utils/objParser.d.ts +24 -0
  393. package/{src/utils/objParser.ts → lib/js/utils/objParser.js} +38 -93
  394. package/lib/js/utils/shared.d.ts +267 -0
  395. package/{src/utils/shared.ts → lib/js/utils/shared.js} +184 -341
  396. package/lib/js/utils/units.d.ts +16 -0
  397. package/lib/js/utils/units.js +61 -0
  398. package/lib/js/webgl/BaseFramebuffer.d.ts +53 -0
  399. package/{src/webgl/BaseFramebuffer.ts → lib/js/webgl/BaseFramebuffer.js} +22 -59
  400. package/lib/js/webgl/Framebuffer.d.ts +69 -0
  401. package/{src/webgl/Framebuffer.ts → lib/js/webgl/Framebuffer.js} +30 -87
  402. package/lib/js/webgl/Handler.d.ts +473 -0
  403. package/{src/webgl/Handler.ts → lib/js/webgl/Handler.js} +175 -586
  404. package/lib/js/webgl/Multisample.d.ts +27 -0
  405. package/lib/js/webgl/Multisample.js +77 -0
  406. package/lib/js/webgl/Program.d.ts +159 -0
  407. package/{src/webgl/Program.ts → lib/js/webgl/Program.js} +73 -210
  408. package/lib/js/webgl/ProgramController.d.ts +86 -0
  409. package/{src/webgl/ProgramController.ts → lib/js/webgl/ProgramController.js} +11 -45
  410. package/{src/webgl/index.ts → lib/js/webgl/index.d.ts} +1 -8
  411. package/lib/js/webgl/index.js +6 -0
  412. package/lib/js/webgl/types.d.ts +9 -0
  413. package/{src/webgl/types.ts → lib/js/webgl/types.js} +5 -8
  414. package/lib/js/webgl/variableHandlers.d.ts +22 -0
  415. package/lib/js/webgl/variableHandlers.js +78 -0
  416. package/package.json +23 -34
  417. package/dist/@openglobus/og.esm.js +0 -2
  418. package/dist/@openglobus/og.esm.js.map +0 -1
  419. package/dist/@openglobus/og.umd.js +0 -2
  420. package/dist/@openglobus/og.umd.js.map +0 -1
  421. package/src/Deferred.ts +0 -17
  422. package/src/control/MouseWheelZoomControl.ts +0 -269
  423. package/src/control/ScaleControl.ts +0 -131
  424. package/src/control/SegmentBoundVisualization.ts +0 -50
  425. package/src/control/ShowFps.ts +0 -28
  426. package/src/control/ToggleWireframe.ts +0 -35
  427. package/src/control/ruler/Ruler.ts +0 -35
  428. package/src/control/ruler/RulerScene.ts +0 -437
  429. package/src/control/timeline/timelineUtils.ts +0 -133
  430. package/src/ellipsoid/index.ts +0 -4
  431. package/src/entity/Geometry.ts +0 -486
  432. package/src/index.ts +0 -173
  433. package/src/layer/GeoTexture2d.ts +0 -56
  434. package/src/layer/index.ts +0 -12
  435. package/src/math/Line3.ts +0 -162
  436. package/src/math/index.ts +0 -26
  437. package/src/quadTree/EPSG4326QuadTreeStrategy.ts +0 -24
  438. package/src/quadTree/EarthQuadTreeStrategy.ts +0 -28
  439. package/src/quadTree/MarsQuadTreeStrategy.ts +0 -25
  440. package/src/quadTree/Wgs84QuadTreeStrategy.ts +0 -22
  441. package/src/quadTree/index.ts +0 -14
  442. package/src/scene/Axes.ts +0 -78
  443. package/src/segment/SegmentLonLatWgs84.ts +0 -33
  444. package/src/terrain/Geoid.ts +0 -273
  445. package/src/ui/Button.ts +0 -121
  446. package/src/ui/ButtonGroup.ts +0 -63
  447. package/src/ui/Dialog.ts +0 -244
  448. package/src/ui/Slider.ts +0 -188
  449. package/src/ui/ToggleButton.ts +0 -68
  450. package/src/utils/Loader.ts +0 -247
  451. package/src/utils/units.ts +0 -78
  452. package/src/webgl/Multisample.ts +0 -153
  453. package/src/webgl/variableHandlers.ts +0 -114
  454. /package/{dist → lib}/@openglobus/og.css +0 -0
  455. /package/{dist → lib}/@openglobus/res/fonts/Karla-Bold.json +0 -0
  456. /package/{dist → lib}/@openglobus/res/fonts/Karla-Bold.ttf.cfg +0 -0
  457. /package/{dist → lib}/@openglobus/res/fonts/Karla-Bold.ttf.png +0 -0
  458. /package/{dist → lib}/@openglobus/res/fonts/Karla-Light.json +0 -0
  459. /package/{dist → lib}/@openglobus/res/fonts/Karla-Light.ttf.cfg +0 -0
  460. /package/{dist → lib}/@openglobus/res/fonts/Karla-Light.ttf.png +0 -0
  461. /package/{dist → lib}/@openglobus/res/fonts/Karla-Medium.json +0 -0
  462. /package/{dist → lib}/@openglobus/res/fonts/Karla-Medium.ttf.cfg +0 -0
  463. /package/{dist → lib}/@openglobus/res/fonts/Karla-Medium.ttf.png +0 -0
  464. /package/{dist → lib}/@openglobus/res/fonts/NotoSansArabic-Regular.json +0 -0
  465. /package/{dist → lib}/@openglobus/res/fonts/NotoSansArabic-Regular.ttf.cfg +0 -0
  466. /package/{dist → lib}/@openglobus/res/fonts/NotoSansArabic-Regular.ttf.png +0 -0
  467. /package/{dist → lib}/@openglobus/res/fonts/Roboto-Regular.json +0 -0
  468. /package/{dist → lib}/@openglobus/res/fonts/Roboto-Regular.ttf.cfg +0 -0
  469. /package/{dist → lib}/@openglobus/res/fonts/Roboto-Regular.ttf.png +0 -0
  470. /package/{dist → lib}/@openglobus/res/fonts/arial.js +0 -0
  471. /package/{dist → lib}/@openglobus/res/fonts/arial.json +0 -0
  472. /package/{dist → lib}/@openglobus/res/fonts/arial.ttf.cfg +0 -0
  473. /package/{dist → lib}/@openglobus/res/fonts/arial.ttf.png +0 -0
  474. /package/{dist → lib}/@openglobus/res/night-4326.png +0 -0
  475. /package/{dist → lib}/@openglobus/res/night.png +0 -0
  476. /package/{dist → lib}/@openglobus/res/spec.png +0 -0
@@ -0,0 +1,2 @@
1
+ const e=2*Math.PI,t=Math.PI/2,i=Number.MAX_VALUE||17976931348623157e292,r=Math.log(2),n=2147483647,s=549755748352,a=-s,o=Math.PI/180,l=180/Math.PI,h=2*l,c=.5*o,d=Math.sqrt(.5),_=1e-5,u=1e-10,f=1e-12,g=1e-14;function p(e,t,i){return Math.max(t,Math.min(e,i))}function m(e){return 0==(e&e-1)}function v(e,t=4096){--e;for(let t=1;t<32;t<<=1)e|=e>>t;return e+1>t?t:e+1}function y(e=0,t=1){return Math.floor(Math.random()*(t-e))+e}function x(e,t){return(e%t+t)%t}function b(t){const i=x(t,e);return Math.abs(i)<g&&Math.abs(t)>g?e:i}function w(e,t){return t<e?0:1}function T(e){const t=Math.abs(e);return t-Math.floor(t)}function C(e){return Math.pow(2,e)}function L(e,t,i){return i+e*(t-i)}function A(e){return e*e*e}function E(e){return e*e}function P(e){return e-360*Math.floor(e/360)}var M=Object.freeze({__proto__:null,ARCSECONDS_TO_RADIANS:484813681109536e-20,DEG2RAD:function(e){return e*o},DEGREES:l,DEGREES_DOUBLE:h,DEGREES_TO_HOURS:1/15,EPS1:.1,EPS10:u,EPS11:1e-11,EPS12:f,EPS13:1e-13,EPS14:g,EPS15:1e-15,EPS16:1e-16,EPS17:1e-17,EPS18:1e-18,EPS19:1e-19,EPS2:.01,EPS20:1e-20,EPS3:.001,EPS4:1e-4,EPS5:_,EPS6:1e-6,EPS7:1e-7,EPS8:1e-8,EPS9:1e-9,HOURS_TO_DEGREES:15,HOURS_TO_RADIANS:.26179938779914946,LOG2:r,MAX:s,MAX32:n,MAX_FLOAT:i,MIN:a,PI_TWO:t,RAD2DEG:function(e){return e*l},RADIANS:o,RADIANS_HALF:c,RADIANS_TO_HOURS:3.819718634205488,SQRT_HALF:d,TWO_PI:e,W:3,X:0,Y:1,Z:2,bezier1v:function(e,t,i,r,n){return A(1-e)*t+3*E(1-e)*e*i+3*(1-e)*E(e)*r+A(e)*n},bezier3v:function(e,t,i,r,n){let s=1-e,a=e*e,o=s*s,l=o*s,h=a*e;return t.scaleTo(l).addA(i.scaleTo(3*o*e)).addA(r.scaleTo(3*s*a)).addA(n.scaleTo(h))},clamp:p,cube:A,degToDec:function(e,t,i,r){return r?e+t/60+i/3600:-e-t/60-i/3600},exp2:C,frac:T,getAngleBetweenAzimuths:function(e,t){return(((e=b(e))-(t=b(t)))%360+360+180)%360-180},isPowerOfTwo:m,lerp:L,log:function(e,t){return Math.log(e)/Math.log(t)},log2:function(e){return Math.log(e)/r},mod:x,negativePItoPI:function(e){return b(e+Math.PI)-Math.PI},nextHighestPowerOfTwo:v,norm_lon:function(e){return e>180?(e+180)%360-180:e<-180?(e-180)%360+180:e},pow2i:function(e){return 2<<e-1},random:function(e=0,t=1){return Math.random()*(t-e)+e},randomi:y,rev:P,slice:function(e,t,i){return e*(t-i)},solve_iteration:function(e,t,i,r=50){let n=0,s=t;for(let t=0;t<r;t++)if(n=s,s=e(n),Math.abs(s-n)<i)return s;return s},solve_iteration_fixed:function(e,t,i){let r=0,n=t;for(let t=0;t<i;t++)r=n,n=e(r);return n},square:E,step:w,zeroTwoPI:b});const S=.5*Math.PI,B=180/Math.PI,k=2*B,R=Math.PI/360,z=B*S;class I{constructor(e=0,t=0,i=0){this.lon=0,this.lat=0,this.height=0,this.lon=e,this.lat=t,this.height=i}isZero(){return 0===this.lon&&0===this.lat&&0===this.height}static join(e){let t=[];for(let i=0;i<e.length;i++){let r=e[i];t[i]=new I(r[0],r[1],r[2])}return t}static createFromArray(e){return new I(e[0],e[1],e[2])}static toArray(e){return[e.lon,e.lat,e.height]}toArray(){return I.toArray(this)}static forwardMercator(e,t,i){return new I(e*V,Math.log(Math.tan((90+t)*R))*H,i)}static forwardMercatorRes(e,t){return t.lon=e.lon*V,t.lat=Math.log(Math.tan((90+e.lat)*R))*H,t.height=e.height,t}static inverseMercator(e,t,i=0){return new I(e*U,k*Math.atan(Math.exp(t*N))-z,i)}set(e=0,t=0,i=0){return this.lon=e,this.lat=t,this.height=i,this}copy(e){return this.lon=e.lon,this.lat=e.lat,this.height=e.height,this}clone(){return new I(this.lon,this.lat,this.height)}forwardMercator(){return I.forwardMercator(this.lon,this.lat,this.height)}forwardMercatorEPS01(){let e=this.lat;return e>89.9?e=89.9:e<-89.9&&(e=-89.9),new I(this.lon*V,Math.log(Math.tan((90+e)*R))*H)}inverseMercator(){return I.inverseMercator(this.lon,this.lat,this.height)}equal(e){return e.height?this.lon===e.lon&&this.lat===e.lat&&this.height===e.height:this.lon===e.lon&&this.lat===e.lat}}const F=20037508.34,D=2*F,N=Math.PI/F,H=F/Math.PI,O=.5*Math.PI,V=F/180,U=180/F,G=Math.PI/360,W=Math.PI/180,j=180/Math.PI,Y=2*F,q=1/Y;function Z(e){return new I(e.lon*F/180,Math.log(Math.tan((90+e.lat)*G))*H,e.height)}function X(e){return e*F/180}function $(e){return Math.log(Math.tan((90+e)*G))*H}function K(e){return j*(2*Math.atan(Math.exp(e*N))-O)}function Q(e,t,i){let r=D/Math.pow(2,i),n=new I(e*r-F,F-t*r-r);return new ie(n,new I(n.lon+r,n.lat+r))}const J=K(F),ee=-J;var te=Object.freeze({__proto__:null,INV_POLE_BY_180:U,MAX_LAT:J,MIN_LAT:ee,ONE_BY_POLE_DOUBLE:q,PI_BY_POLE:N,POLE:F,POLE2:D,POLE_BY_180:V,POLE_BY_PI:H,POLE_DOUBLE:Y,forward:Z,forwardArray:function(e){let t=[];for(let i=0;i<e.length;i++)t.push(e[i].forwardMercator());return t},forward_lat:$,forward_lon:X,getTileExtent:Q,getTileX:function(e,t){return Math.floor((e+180)/360*Math.pow(2,t))},getTileY:function(e,t){return Math.floor(.5*(1-Math.log(Math.tan(e*W)+1/Math.cos(e*W))/Math.PI)*Math.pow(2,t))},inverse_lat:K,inverse_lon:function(e){return 180*e/F}});class ie{constructor(e=new I,t=new I){this.southWest=e,this.northEast=t}static createFromArray(e){return new ie(new I(e[0],e[1]),new I(e[2],e[3]))}static createByCoordinates(e){let t=s,i=a,r=s,n=a;for(let s=0;s<e.length;s++){const a=e[s];a.lon<t&&(t=a.lon),a.lon>i&&(i=a.lon),a.lat<r&&(r=a.lat),a.lat>n&&(n=a.lat)}return new ie(new I(t,r),new I(i,n))}static createByCoordinatesArr(e){let t=s,i=a,r=s,n=a;for(let s=0;s<e.length;s++){const a=e[s];a[0]<t&&(t=a[0]),a[0]>i&&(i=a[0]),a[1]<r&&(r=a[1]),a[1]>n&&(n=a[1])}return new ie(new I(t,r),new I(i,n))}static fromTile(e,t,i,r=40075016.68,n=40075016.68){const s=Math.pow(2,i),a=r/Math.pow(2,i),o=n/s,l=.5*-r+e*a,h=.5*n-t*o,c=l+a;return new ie(new I(l,h-o),new I(c,h))}setByCoordinates(e){let t=s,i=a,r=s,n=a;for(let s=0;s<e.length;s++){const a=e[s];a.lon<t&&(t=a.lon),a.lon>i&&(i=a.lon),a.lat<r&&(r=a.lat),a.lat>n&&(n=a.lat)}return this.southWest.lon=t,this.southWest.lat=r,this.northEast.lon=i,this.northEast.lat=n,this}isInside(e){const t=this.southWest,i=this.northEast;return e.lon>=t.lon&&e.lon<=i.lon&&e.lat>=t.lat&&e.lat<=i.lat}overlaps(e){const t=this.southWest,i=this.northEast;return t.lon<=e.northEast.lon&&i.lon>=e.southWest.lon&&t.lat<=e.northEast.lat&&i.lat>=e.southWest.lat}getWidth(){return this.northEast.lon-this.southWest.lon}getHeight(){return this.northEast.lat-this.southWest.lat}clone(){return new ie(this.southWest.clone(),this.northEast.clone())}getCenter(){const e=this.southWest,t=this.northEast;return new I(e.lon+.5*(t.lon-e.lon),e.lat+.5*(t.lat-e.lat))}getNorthWest(){return new I(this.southWest.lon,this.northEast.lat)}getNorthEast(){return new I(this.northEast.lon,this.northEast.lat)}getSouthWest(){return new I(this.southWest.lon,this.southWest.lat)}getSouthEast(){return new I(this.northEast.lon,this.southWest.lat)}getNorth(){return this.northEast.lat}getEast(){return this.northEast.lon}getWest(){return this.southWest.lon}getSouth(){return this.southWest.lat}equals(e){return this.southWest.lon===e.southWest.lon&&this.southWest.lat===e.southWest.lat&&this.northEast.lon===e.northEast.lon&&this.northEast.lat===e.northEast.lat}forwardMercator(){return new ie(this.southWest.forwardMercator(),this.northEast.forwardMercator())}inverseMercator(){return new ie(this.southWest.inverseMercator(),this.northEast.inverseMercator())}getCartesianBounds(e){let t=s,i=a,r=s,n=a,o=s,l=a;const h=[new I(this.southWest.lon,this.southWest.lat),new I(this.southWest.lon,this.northEast.lat),new I(this.northEast.lon,this.northEast.lat),new I(this.northEast.lon,this.southWest.lat)];for(let s=0;s<h.length;s++){const a=e.lonLatToCartesian(h[s]),c=a.x,d=a.y,_=a.z;c<t&&(t=c),c>i&&(i=c),d<r&&(r=d),d>n&&(n=d),_<o&&(o=_),_>l&&(l=_)}return[t,r,o,i,n,l]}toString(){return`[${this.southWest.lon.toFixed(5)}, ${this.southWest.lat.toFixed(5)}, ${this.northEast.lon.toFixed(5)}, ${this.northEast.lat.toFixed(5)}]`}}class re{constructor(){this._m=[0,0,0,0,0,0,0,0,0]}set(e){return this._m[0]=e[0],this._m[1]=e[1],this._m[2]=e[2],this._m[3]=e[3],this._m[4]=e[4],this._m[5]=e[5],this._m[6]=e[6],this._m[7]=e[7],this._m[8]=e[8],this}clone(){let e=new re;return e.set(this._m),e}copy(e){return this.set(e._m)}transposeTo(){let e=new re,t=this._m;return e._m[0]=t[0],e._m[1]=t[3],e._m[2]=t[6],e._m[3]=t[1],e._m[4]=t[4],e._m[5]=t[7],e._m[6]=t[2],e._m[7]=t[5],e._m[8]=t[8],e}setIdentity(){return this._m[0]=1,this._m[1]=0,this._m[2]=0,this._m[3]=0,this._m[4]=1,this._m[5]=0,this._m[6]=0,this._m[7]=0,this._m[8]=1,this}mulVec(e){let t=e.x,i=e.y,r=e.z,n=this._m;return new oe(n[0]*t+n[3]*i+n[6]*r,n[1]*t+n[4]*i+n[7]*r,n[2]*t+n[5]*i+n[8]*r)}toMatrix4(){let e=new se,t=e._m,i=this._m;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=0,t[4]=i[3],t[5]=i[4],t[6]=i[5],t[7]=0,t[8]=i[6],t[9]=i[7],t[10]=i[8],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,e}}class ne{constructor(e=0,t=0,i=0,r=0){this.x=e,this.y=t,this.z=i,this.w=r}static get identity(){return new ne(0,0,0,1)}static fromVec(e){return new ne(e[0],e[1],e[2],e[3])}toVec3(){return new oe(this.x,this.y,this.z)}clone(){return new ne(this.x,this.y,this.z,this.w)}equal(e){return this.x===e.x&&this.y===e.y&&this.z===e.z&&this.w===e.w}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w,this}toArray(){return[this.x,this.y,this.z,this.w]}toArray3(){return[this.x,this.y,this.z]}set(e,t,i,r){return this.x=e,this.y=t,this.z=i,this.w=r,this}addA(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}subA(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}scale(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}affinity(){let e=1/this.w;return this.x*=e,this.y*=e,this.z*=e,this.w=1,this}scaleTo(e){return new ne(this.x*e,this.y*e,this.z*e,this.w*e)}getStep(e){return new ne(this.x<e?0:1,this.y<e?0:1,this.z<e?0:1,this.w<e?0:1)}getFrac(e){return new ne(T(e.x),T(e.y),T(e.z),T(e.w))}dot(e){return e.x*this.x+e.y*this.y+e.z*this.z+e.w*this.w}isZero(){return!(this.x||this.y||this.z||this.w)}}class se{constructor(){this._m=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}static identity(){let e=new se;return e._m[0]=1,e._m[1]=0,e._m[2]=0,e._m[3]=0,e._m[4]=0,e._m[5]=1,e._m[6]=0,e._m[7]=0,e._m[8]=0,e._m[9]=0,e._m[10]=1,e._m[11]=0,e._m[12]=0,e._m[13]=0,e._m[14]=0,e._m[15]=1,e}set(e){return this._m[0]=e[0],this._m[1]=e[1],this._m[2]=e[2],this._m[3]=e[3],this._m[4]=e[4],this._m[5]=e[5],this._m[6]=e[6],this._m[7]=e[7],this._m[8]=e[8],this._m[9]=e[9],this._m[10]=e[10],this._m[11]=e[11],this._m[12]=e[12],this._m[13]=e[13],this._m[14]=e[14],this._m[15]=e[15],this}clone(){let e=new se;return e.set(this._m),e}copy(e){return this.set(e._m)}toMatrix3(){let e=new re,t=this._m,i=e._m;return i[0]=t[0],i[1]=t[1],i[2]=t[2],i[3]=t[4],i[4]=t[5],i[5]=t[6],i[6]=t[8],i[7]=t[9],i[8]=t[10],e}mulVec3(e){let t=e.x,i=e.y,r=e.z;return new oe(this._m[0]*t+this._m[4]*i+this._m[8]*r+this._m[12],this._m[1]*t+this._m[5]*i+this._m[9]*r+this._m[13],this._m[2]*t+this._m[6]*i+this._m[10]*r+this._m[14])}mulVec4(e){let t=e.x,i=e.y,r=e.z,n=e.w;return new ne(this._m[0]*t+this._m[4]*i+this._m[8]*r+this._m[12]*n,this._m[1]*t+this._m[5]*i+this._m[9]*r+this._m[13]*n,this._m[2]*t+this._m[6]*i+this._m[10]*r+this._m[14]*n,this._m[3]*t+this._m[7]*i+this._m[11]*r+this._m[15]*n)}toInverseMatrix3(){let e=this._m,t=e[0],i=e[1],r=e[2],n=e[4],s=e[5],a=e[6],o=e[8],l=e[9],h=e[10],c=h*s-a*l,d=-h*n+a*o,_=l*n-s*o,u=t*c+i*d+r*_;if(!u)return;u=1/u;let f=new re;return f._m[0]=c*u,f._m[1]=(-h*i+r*l)*u,f._m[2]=(a*i-r*s)*u,f._m[3]=d*u,f._m[4]=(h*t-r*o)*u,f._m[5]=(-a*t+r*n)*u,f._m[6]=_*u,f._m[7]=(-l*t+i*o)*u,f._m[8]=(s*t-i*n)*u,f}inverseTo(e=new se){let t=this._m[0],i=this._m[1],r=this._m[2],n=this._m[3],s=this._m[4],a=this._m[5],o=this._m[6],l=this._m[7],h=this._m[8],c=this._m[9],d=this._m[10],_=this._m[11],u=this._m[12],f=this._m[13],g=this._m[14],p=this._m[15],m=t*a-i*s,v=t*o-r*s,y=t*l-n*s,x=i*o-r*a,b=i*l-n*a,w=r*l-n*o,T=h*f-c*u,C=h*g-d*u,L=h*p-_*u,A=c*g-d*f,E=c*p-_*f,P=d*p-_*g,M=1/(m*P-v*E+y*A+x*L-b*C+w*T);return e._m[0]=(a*P-o*E+l*A)*M,e._m[1]=(-i*P+r*E-n*A)*M,e._m[2]=(f*w-g*b+p*x)*M,e._m[3]=(-c*w+d*b-_*x)*M,e._m[4]=(-s*P+o*L-l*C)*M,e._m[5]=(t*P-r*L+n*C)*M,e._m[6]=(-u*w+g*y-p*v)*M,e._m[7]=(h*w-d*y+_*v)*M,e._m[8]=(s*E-a*L+l*T)*M,e._m[9]=(-t*E+i*L-n*T)*M,e._m[10]=(u*b-f*y+p*m)*M,e._m[11]=(-h*b+c*y-_*m)*M,e._m[12]=(-s*A+a*C-o*T)*M,e._m[13]=(t*A-i*C+r*T)*M,e._m[14]=(-u*x+f*v-g*m)*M,e._m[15]=(h*x-c*v+d*m)*M,e}transposeTo(){let e=new se;return e._m[0]=this._m[0],e._m[1]=this._m[4],e._m[2]=this._m[8],e._m[3]=this._m[12],e._m[4]=this._m[1],e._m[5]=this._m[5],e._m[6]=this._m[9],e._m[7]=this._m[13],e._m[8]=this._m[2],e._m[9]=this._m[6],e._m[10]=this._m[10],e._m[11]=this._m[14],e._m[12]=this._m[3],e._m[13]=this._m[7],e._m[14]=this._m[11],e._m[15]=this._m[15],e}setIdentity(){return this._m[0]=1,this._m[1]=0,this._m[2]=0,this._m[3]=0,this._m[4]=0,this._m[5]=1,this._m[6]=0,this._m[7]=0,this._m[8]=0,this._m[9]=0,this._m[10]=1,this._m[11]=0,this._m[12]=0,this._m[13]=0,this._m[14]=0,this._m[15]=1,this}mul(e){let t=this._m[0],i=this._m[1],r=this._m[2],n=this._m[3],s=this._m[4],a=this._m[5],o=this._m[6],l=this._m[7],h=this._m[8],c=this._m[9],d=this._m[10],_=this._m[11],u=this._m[12],f=this._m[13],g=this._m[14],p=this._m[15],m=e._m[0],v=e._m[1],y=e._m[2],x=e._m[3],b=e._m[4],w=e._m[5],T=e._m[6],C=e._m[7],L=e._m[8],A=e._m[9],E=e._m[10],P=e._m[11],M=e._m[12],S=e._m[13],B=e._m[14],k=e._m[15],R=new se;return R._m[0]=m*t+v*s+y*h+x*u,R._m[1]=m*i+v*a+y*c+x*f,R._m[2]=m*r+v*o+y*d+x*g,R._m[3]=m*n+v*l+y*_+x*p,R._m[4]=b*t+w*s+T*h+C*u,R._m[5]=b*i+w*a+T*c+C*f,R._m[6]=b*r+w*o+T*d+C*g,R._m[7]=b*n+w*l+T*_+C*p,R._m[8]=L*t+A*s+E*h+P*u,R._m[9]=L*i+A*a+E*c+P*f,R._m[10]=L*r+A*o+E*d+P*g,R._m[11]=L*n+A*l+E*_+P*p,R._m[12]=M*t+S*s+B*h+k*u,R._m[13]=M*i+S*a+B*c+k*f,R._m[14]=M*r+S*o+B*d+k*g,R._m[15]=M*n+S*l+B*_+k*p,R}translate(e){let t=e.x,i=e.y,r=e.z,n=this._m;return n[12]=n[0]*t+n[4]*i+n[8]*r+n[12],n[13]=n[1]*t+n[5]*i+n[9]*r+n[13],n[14]=n[2]*t+n[6]*i+n[10]*r+n[14],n[15]=n[3]*t+n[7]*i+n[11]*r+n[15],this}translateToPosition(e){let t=this._m;return t[12]=e.x,t[13]=e.y,t[14]=e.z,this}rotate(e,t){let i=Math.cos(t),r=Math.sin(t),n=new se,s=n._m;return s[0]=i+(1-i)*e.x*e.x,s[1]=(1-i)*e.y*e.x-r*e.z,s[2]=(1-i)*e.z*e.x+r*e.y,s[3]=0,s[4]=(1-i)*e.x*e.y+r*e.z,s[5]=i+(1-i)*e.y*e.y,s[6]=(1-i)*e.z*e.y-r*e.x,s[7]=0,s[8]=(1-i)*e.x*e.z-r*e.y,s[9]=(1-i)*e.y*e.z+r*e.x,s[10]=i+(1-i)*e.z*e.z,s[11]=0,s[12]=0,s[13]=0,s[14]=0,s[15]=1,this.mul(n)}setRotation(e,t){let i=Math.cos(t),r=Math.sin(t),n=this._m;return n[0]=i+(1-i)*e.x*e.x,n[1]=(1-i)*e.y*e.x-r*e.z,n[2]=(1-i)*e.z*e.x+r*e.y,n[3]=0,n[4]=(1-i)*e.x*e.y+r*e.z,n[5]=i+(1-i)*e.y*e.y,n[6]=(1-i)*e.z*e.y-r*e.x,n[7]=0,n[8]=(1-i)*e.x*e.z-r*e.y,n[9]=(1-i)*e.y*e.z+r*e.x,n[10]=i+(1-i)*e.z*e.z,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}rotateBetweenVectors(e,t){return ae.getRotationBetweenVectors(e,t).getMat4()}scale(e){let t=this._m;return t[0]=t[0]*e.x,t[1]=t[1]*e.x,t[2]=t[2]*e.x,t[3]=t[3]*e.x,t[4]=t[4]*e.y,t[5]=t[5]*e.y,t[6]=t[6]*e.y,t[7]=t[7]*e.y,t[8]=t[8]*e.z,t[9]=t[9]*e.z,t[10]=t[10]*e.z,t[11]=t[11]*e.z,this}setPerspective(e,t,i,r,n,s){let a=t-e,o=r-i,l=s-n;return this._m[0]=2*n/a,this._m[1]=0,this._m[2]=0,this._m[3]=0,this._m[4]=0,this._m[5]=2*n/o,this._m[6]=0,this._m[7]=0,this._m[8]=(t+e)/a,this._m[9]=(r+i)/o,this._m[10]=-(s+n)/l,this._m[11]=-1,this._m[12]=0,this._m[13]=0,this._m[14]=-s*n*2/l,this._m[15]=0,this}setOrtho(e,t,i,r,n,s){let a=1/(e-t),o=1/(i-r),l=1/(n-s),h=this._m;return h[0]=-2*a,h[1]=0,h[2]=0,h[3]=0,h[4]=0,h[5]=-2*o,h[6]=0,h[7]=0,h[8]=0,h[9]=0,h[10]=2*l,h[11]=0,h[12]=(e+t)*a,h[13]=(r+i)*o,h[14]=(s+n)*l,h[15]=1,this}eulerToMatrix(e,t,i){let r=Math.cos(e),n=Math.sin(e),s=Math.cos(t),a=Math.sin(t),o=Math.cos(i),l=Math.sin(i),h=r*a,c=n*a,d=this._m;return d[0]=s*o,d[1]=-s*l,d[2]=-a,d[4]=-c*o+r*l,d[5]=c*l+r*o,d[6]=-n*s,d[8]=h*o+n*l,d[9]=-h*l+n*o,d[10]=r*s,d[3]=d[7]=d[11]=d[12]=d[13]=d[14]=0,d[15]=1,this}}class ae{constructor(e=0,t=0,i=0,r=0){this.x=e,this.y=t,this.z=i,this.w=r}static get IDENTITY(){return new ae(0,0,0,1)}static xRotation(e){return e*=.5,new ae(Math.sin(e),0,0,Math.cos(e))}static yRotation(e){return e*=.5,new ae(0,Math.sin(e),0,Math.cos(e))}static zRotation(e){return e*=.5,new ae(0,0,Math.sin(e),Math.cos(e))}static axisAngleToQuat(e,t=0){let i=e.getNormal(),r=.5*t,n=Math.sin(r);return new ae(i.x*n,i.y*n,i.z*n,Math.cos(r))}static getLookRotation(e,t){let i=e.getNormal().negate(),r=t.cross(i).normalize(),n=i.cross(r),s=1+r.x+n.y+i.z;if(s>1e-6){let e=1/(2*Math.sqrt(s));return new ae((i.y-n.z)*e,(r.z-i.x)*e,(n.x-r.y)*e,.25/e)}if(r.x>n.y&&r.x>i.z){let e=1/(2*Math.sqrt(1+r.x-n.y-i.z));return new ae(.25/e,(n.x+r.y)*e,(r.z+i.x)*e,(i.y-n.z)*e)}if(n.y>i.z){let e=1/(2*Math.sqrt(1+n.y-r.x-i.z));return new ae((n.x+r.y)*e,.25/e,(i.y+n.z)*e,(r.z-i.x)*e)}let a=1/(2*Math.sqrt(1+i.z-r.x-n.y));return new ae((r.z+i.x)*a,(i.y+n.z)*a,.25/a,(n.x-r.y)*a)}static getLookAtSourceDest(e,t){let i=t.subA(e).normalize(),r=oe.FORWARD.dot(i);if(Math.abs(r- -1)<1e-6)return ae.axisAngleToQuat(oe.UP,Math.PI);if(Math.abs(r-1)<1e-6)return new ae(0,0,0,1);let n=Math.acos(r),s=oe.FORWARD.cross(i).normalize();return ae.axisAngleToQuat(s,n)}static getRotationBetweenVectors(e,t){let i=e.cross(t);return new ae(i.x,i.y,i.z,1+e.dot(t)).normalize()}static getRotationBetweenVectorsRes(e,t,i){let r=e.cross(t);return i.set(r.x,r.y,r.z,1+e.dot(t)),i.normalize()}static getRotationBetweenVectorsUp(e,t,i){let r=e.dot(t);if(Math.abs(r+1)<1e-6)return ae.axisAngleToQuat(i,Math.PI);if(Math.abs(r-1)<1e-6)return new ae(0,0,0,1);let n=Math.acos(r),s=e.cross(t).normalize();return ae.axisAngleToQuat(s,n)}isZero(){return 0===this.x&&0===this.y&&0===this.z&&0===this.w}clear(){return this.x=this.y=this.z=this.w=0,this}set(e,t,i,r){return this.x=e,this.y=t,this.z=i,this.w=r,this}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w,this}setIdentity(){return this.x=0,this.y=0,this.z=0,this.w=1,this}clone(){return new ae(this.x,this.y,this.z,this.w)}add(e){return new ae(this.x+e.x,this.y+e.y,this.z+e.z,this.w+e.w)}sub(e){return new ae(this.x-e.x,this.y-e.y,this.z-e.z,this.w-e.w)}scaleTo(e){return new ae(this.x*e,this.y*e,this.z*e,this.w*e)}scale(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}toVec(){return[this.x,this.y,this.z,this.w]}setFromSphericalCoords(e,t,i){let r=Math.sin(i/2),n=Math.cos(i/2),s=Math.sin(e),a=Math.cos(e),o=Math.sin(t),l=Math.cos(t);return this.x=r*a*o,this.y=r*s,this.z=r*s*l,this.w=n,this}setLookRotation(e,t){let i=e.getNormal().negate(),r=t.cross(i).normalize(),n=i.cross(r),s=1+r.x+n.y+i.z;if(s>1e-6){let e=1/(2*Math.sqrt(s));this.x=(i.y-n.z)*e,this.y=(r.z-i.x)*e,this.z=(n.x-r.y)*e,this.w=.25/e}else if(r.x>n.y&&r.x>i.z){let e=1/(2*Math.sqrt(1+r.x-n.y-i.z));this.x=.25/e,this.y=(n.x+r.y)*e,this.z=(r.z+i.x)*e,this.w=(i.y-n.z)*e}else if(n.y>i.z){let e=1/(2*Math.sqrt(1+n.y-r.x-i.z));this.x=(n.x+r.y)*e,this.y=.25/e,this.z=(i.y+n.z)*e,this.w=(r.z-i.x)*e}else{let e=1/(2*Math.sqrt(1+i.z-r.x-n.y));this.x=(r.z+i.x)*e,this.y=(i.y+n.z)*e,this.z=.25/e,this.w=(n.x-r.y)*e}return this}toSphericalCoords(){let e=this.w,t=Math.sqrt(1-e*e);Math.abs(t)<5e-4&&(t=1);let i,r=this.x/t,n=this.y/t,s=this.z/t,a=-Math.asin(n);return i=r*r+s*s<5e-4?0:Math.atan2(r,s),i<0&&(i+=360),{lat:a,lon:i,alpha:Math.acos(e)}}setFromAxisAngle(e,t){let i=e.getNormal(),r=.5*t,n=Math.sin(r);return this.set(i.x*n,i.y*n,i.z*n,Math.cos(r)),this}getAxisAngle(){let e,t,i=this.x,r=this.y,n=this.z,s=this.w,a=Math.sqrt(i*i+r*r+n*n);if(a>1e-7){let o=1/a;e=new oe(i*o,r*o,n*o),t=s<0?2*Math.atan2(-a,-s):2*Math.atan2(a,s)}else e=new oe(0,0,0),t=0;return{axis:e,angle:t}}setFromEulerAngles(e,t,i){let r=e*c,n=t*c,s=i*c,a=Math.cos(r),o=Math.cos(n),l=Math.cos(s),h=Math.sin(r),d=Math.sin(n),_=Math.sin(s),u=o*l,f=d*_;return this.w=a*u+h*f,this.x=h*u-a*f,this.y=a*d*l+h*o*_,this.z=a*o*_-h*d*l,this.normalize()}getEulerAngles(){let e=this.x,t=this.y,i=this.z,r=this.w,n=t*t,s=r*t-i*e;return s<-1?s=-1:s>1&&(s=1),{roll:Math.atan2(2*(r*e+t*i),1-2*(e*e+n)),pitch:Math.asin(2*s),yaw:Math.atan2(2*(r*i+e*t),1-2*(n+i*i))}}setFromMatrix4(e){let t,i,r,n,s,a=[],o=e._m,l=[1,2,0];return t=o[0]+o[5]+o[10],t>0?(i=Math.sqrt(t+1),this.w=i/2,i=.5/i,this.x=(o[6]-o[9])*i,this.y=(o[8]-o[2])*i,this.z=(o[1]-o[4])*i):(r=0,o[5]>o[0]&&(r=1),o[10]>o[5*r]&&(r=2),n=l[r],s=l[n],i=Math.sqrt(o[5*r]-(o[5*n]+o[5*s])+1),a[r]=.5*i,0!==i&&(i=.5/i),a[3]=(o[4*n+s]-o[4*s+n])*i,a[n]=(o[4*r+n]+o[4*n+r])*i,a[s]=(o[4*r+s]+o[4*s+r])*i,this.x=a[0],this.y=a[1],this.z=a[2],this.w=a[3]),this}getMat4(e=new se){let t=this.x+this.x,i=this.y+this.y,r=this.z+this.z,n=this.w*t,s=this.w*i,a=this.w*r,o=this.x*t,l=this.x*i,h=this.x*r,c=this.y*i,d=this.y*r,_=this.z*r;return e.set([1-(c+_),l-a,h+s,0,l+a,1-(o+_),d-n,0,h-s,d+n,1-(o+c),0,0,0,0,1])}getMat3(){let e=new re,t=e._m,i=this.x,r=this.y,n=this.z,s=this.w,a=i+i,o=r+r,l=n+n,h=i*a,c=i*o;i*=l;let d=r*o;return r*=l,n*=l,a*=s,o*=s,s*=l,t[0]=1-(d+n),t[1]=c-s,t[2]=i+o,t[3]=c+s,t[4]=1-(h+n),t[5]=r-a,t[6]=i-o,t[7]=r+a,t[8]=1-(h+d),e}mulVec3(e){let t=e.x,i=e.y,r=e.z,n=this.x,s=this.y,a=this.z,o=this.w,l=o*t+s*r-a*i,h=o*i+a*t-n*r,c=o*r+n*i-s*t;return t=-n*t-s*i-a*r,new oe(l*o+t*-n+h*-a-c*-s,h*o+t*-s+c*-n-l*-a,c*o+t*-a+l*-s-h*-n)}mul(e){let t=this.x,i=this.y,r=this.z,n=this.w,s=e.x,a=e.y,o=e.z,l=e.w;return new ae(t*l+n*s+i*o-r*a,i*l+n*a+r*s-t*o,r*l+n*o+t*a-i*s,n*l-t*s-i*a-r*o)}mulA(e){let t=this.x,i=this.y,r=this.z,n=this.w,s=e.x,a=e.y,o=e.z,l=e.w;return this.x=t*l+n*s+i*o-r*a,this.y=i*l+n*a+r*s-t*o,this.z=r*l+n*o+t*a-i*s,this.w=n*l-t*s-i*a-r*o,this}conjugate(){return new ae(-this.x,-this.y,-this.z,this.w)}inverse(){let e=1/this.magnitude2();return new ae(-this.x*e,-this.y*e,-this.z*e,this.w*e)}magnitude(){let e=this.x,t=this.y,i=this.z,r=this.w;return Math.sqrt(e*e+t*t+i*i+r*r)}magnitude2(){let e=this.x,t=this.y,i=this.z,r=this.w;return e*e+t*t+i*i+r*r}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}normalize(){let e=this.x,t=this.y,i=this.z,r=this.w,n=Math.sqrt(e*e+t*t+i*i+r*r);return 0===n?(this.x=0,this.y=0,this.z=0,this.w=0,this):(n=1/n,this.x=e*n,this.y=t*n,this.z=i*n,this.w=r*n,this)}isEqual(e){let t=this.dot(e);return Math.abs(t-1)<.001}slerp(e,t){let i,r,n,s,a,o=this.x,l=this.y,h=this.z,c=this.w,d=e.x,_=e.y,u=e.z,f=e.w;return r=o*d+l*_+h*u+c*f,r<0&&(r=-r,d=-d,_=-_,u=-u,f=-f),1-r>1e-6?(i=Math.acos(r),n=Math.sin(i),s=Math.sin((1-t)*i)/n,a=Math.sin(t*i)/n):(s=1-t,a=t),new ae(s*o+a*d,s*l+a*_,s*h+a*u,s*c+a*f)}getRoll(e=!1){let t=this.x,i=this.y,r=this.z,n=this.w;if(e){let e=2*i,s=2*r,a=s*n,o=e*t,l=e*i,h=s*r;return Math.atan2(o+a,1-(l+h))}return Math.atan2(2*(t*i+n*r),n*n+t*t-i*i-r*r)}getPitch(e=!1){let t=this.x,i=this.y,r=this.z,n=this.w;if(e){let e=2*t,s=2*r,a=e*n,o=e*t,l=s*i,h=s*r;return Math.atan2(l+a,1-(o+h))}return Math.atan2(2*(i*r+n*t),n*n-t*t-i*i+r*r)}getYaw(e=!1){let t=this.x,i=this.y,r=this.z,n=this.w;if(e){let e=2*i,s=e*n,a=2*t*t,o=2*r*t,l=e*i;return Math.atan2(o+s,1-(a+l))}return Math.asin(-2*(t*r-n*i))}}class oe{constructor(e=0,t=0,i=0){this.x=e,this.y=t,this.z=i}static get UP(){return new oe(0,1,0)}static get DOWN(){return new oe(0,-1,0)}static get RIGHT(){return new oe(1,0,0)}static get LEFT(){return new oe(-1,0,0)}static get FORWARD(){return new oe(0,0,-1)}static get BACKWARD(){return new oe(0,0,1)}static get ZERO(){return new oe}static get UNIT_X(){return new oe(1,0,0)}static get UNIT_Y(){return new oe(0,1,0)}static get UNIT_Z(){return new oe(0,0,1)}static get NORTH(){return oe.UNIT_Z}static doubleToTwoFloats(e,t,i){let r=e.x,n=e.y,s=e.z;if(r>=0){let e=65536*Math.floor(r/65536);t.x=Math.fround(e),i.x=Math.fround(r-e)}else{let e=65536*Math.floor(-r/65536);t.x=Math.fround(-e),i.x=Math.fround(r+e)}if(n>=0){let e=65536*Math.floor(n/65536);t.y=Math.fround(e),i.y=Math.fround(n-e)}else{let e=65536*Math.floor(-n/65536);t.y=Math.fround(-e),i.y=Math.fround(n+e)}if(s>=0){let e=65536*Math.floor(s/65536);t.z=Math.fround(e),i.z=Math.fround(s-e)}else{let e=65536*Math.floor(-s/65536);t.z=Math.fround(-e),i.z=Math.fround(s+e)}}static doubleToTwoFloat32Array(e,t,i){let r=e.x,n=e.y,s=e.z;if(r>=0){let e=65536*Math.floor(r/65536);t[0]=Math.fround(e),i[0]=Math.fround(r-e)}else{let e=65536*Math.floor(-r/65536);t[0]=Math.fround(-e),i[0]=Math.fround(r+e)}if(n>=0){let e=65536*Math.floor(n/65536);t[1]=Math.fround(e),i[1]=Math.fround(n-e)}else{let e=65536*Math.floor(-n/65536);t[1]=Math.fround(-e),i[1]=Math.fround(n+e)}if(s>=0){let e=65536*Math.floor(s/65536);t[2]=Math.fround(e),i[2]=Math.fround(s-e)}else{let e=65536*Math.floor(-s/65536);t[2]=Math.fround(-e),i[2]=Math.fround(s+e)}}static fromVec(e){return new oe(e[0],e[1],e[2])}static angle(e,t){return Math.acos(e.dot(t)/Math.sqrt(e.length2()*t.length2()))}static lerp(e,t,i){return new oe(e.x+(t.x-e.x)*i,e.y+(t.y-e.y)*i,e.z+(t.z-e.z)*i)}static add(e,t){let i=new oe(e.x,e.y,e.z);return i.addA(t),i}static sub(e,t){let i=new oe(e.x,e.y,e.z);return i.subA(t),i}static scale(e,t){return e.scaleTo(t)}static mul(e,t){let i=new oe(e.x,e.y,e.z);return i.mulA(t),i}static noncollinear(e,t){return Boolean(e.y*t.z-e.z*t.y||e.z*t.x-e.x*t.z||e.x*t.y-e.y*t.z)}static proj_b_to_plane(e,t,i){let r=e.sub(t.scaleTo(t.dot(e)/t.dot(t)));return i&&r.isZero()?new oe(i.x,i.y,i.z):r}static proj_b_to_a(e,t){return t.scaleTo(t.dot(e)/t.dot(t))}static orthoNormalize(e,t){return(e=e.getNormal()).scale(t.dot(e)),t.subA(e).normalize()}static div(e,t){let i=new oe(e.x,e.y,e.z);return i.divA(t),i}static length2(e){return e.length2()}static dot(e,t){return e.dot(t)}toVec4(){return new ne(this.x,this.y,this.z,1)}clone(){return new oe(this.x,this.y,this.z)}toString(){return`(${this.x},${this.y},${this.z})`}isZero(){return!(this.x||this.y||this.z)}projToVec(e){return e.scaleTo(e.dot(this)/e.dot(e))}equal(e){return this.x===e.x&&this.y===e.y&&this.z===e.z}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}length2(){return this.x*this.x+this.y*this.y+this.z*this.z}getQuat(){return new ae(this.x,this.y,this.z)}addA(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}add(e){return new oe(this.x+e.x,this.y+e.y,this.z+e.z)}subA(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}sub(e){return new oe(this.x-e.x,this.y-e.y,this.z-e.z)}scale(e){return this.x*=e,this.y*=e,this.z*=e,this}scaleTo(e){return new oe(this.x*e,this.y*e,this.z*e)}mulA(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}mul(e){return new oe(this.x*e.x,this.y*e.y,this.z*e.z)}divA(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}div(e){return new oe(this.x/e.x,this.y/e.y,this.z/e.z)}dot(e){return e.x*this.x+e.y*this.y+e.z*this.z}dotArr(e){return e[0]*this.x+e[1]*this.y+e[2]*this.z}cross(e){return new oe(this.y*e.z-this.z*e.y,this.z*e.x-this.x*e.z,this.x*e.y-this.y*e.x)}clear(){return this.x=this.y=this.z=0,this}getNormal(){let e=new oe;e.copy(this);let t=1/e.length();return e.x*=t,e.y*=t,e.z*=t,e}normal(){let e=new oe;e.copy(this);let t=1/e.length();return e.x*=t,e.y*=t,e.z*=t,e}normalNegate(){let e=new oe;e.copy(this);let t=-1/e.length();return e.x*=t,e.y*=t,e.z*=t,e}normalNegateScale(e){let t=new oe;t.copy(this);let i=-e/t.length();return t.x*=i,t.y*=i,t.z*=i,t}normalScale(e){let t=new oe;t.copy(this);let i=e/t.length();return t.x*=i,t.y*=i,t.z*=i,t}normalize(){let e=1/this.length();return this.x*=e,this.y*=e,this.z*=e,this}toVec(){return[this.x,this.y,this.z]}toArray(){return[this.x,this.y,this.z]}distance(e){let t=this.x-e.x,i=this.y-e.y,r=this.z-e.z;return Math.sqrt(t*t+i*i+r*r)}distance2(e){let t=this.x-e.x,i=this.y-e.y,r=this.z-e.z;return t*t+i*i+r*r}set(e,t,i){return this.x=e,this.y=t,this.z=i,this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}negateTo(){return new oe(-this.x,-this.y,-this.z)}projToRay(e,t){let i=oe.proj_b_to_a(oe.sub(this,e),t);return i.addA(e),i}angle(e){return oe.angle(this,e)}lerp(e,t){return new oe(this.x+(e.x-this.x)*t,this.y+(e.y-this.y)*t,this.z+(e.z-this.z)*t)}smerp(e,t){let i=1-t;return new oe(this.x*t+e.x*i,this.y*t+e.y*i,this.z*t+e.z*i)}static get LERP_DELTA(){return 1e-6}slerp(e,t){let i,r,n,s,a=new oe;if(t<=0)return a.copy(this),a;if(t>=1)return a.copy(e),a;let o=this.dot(e);return 1-o>oe.LERP_DELTA?(i=Math.acos(o),r=Math.sin(i),n=Math.sin((1-t)*i)/r,s=Math.sin(t*i)/r):(n=1-t,s=t),oe.add(this.scaleTo(n),e.scale(s))}getRotationTo(e,t){let i=this.clone(),r=e.clone();i.normalize(),r.normalize();let n=i.dot(r);if(n>=1)return ae.IDENTITY.clone();if(n<-.999999){if(t.equal(oe.ZERO)){let e=oe.UNIT_X.cross(i);return e.isZero()&&(e=oe.UNIT_Y.cross(i)),e.normalize(),ae.axisAngleToQuat(e,Math.PI)}return ae.axisAngleToQuat(t,Math.PI)}{let e=Math.sqrt(2*(1+n)),t=1/e,s=i.cross(r),a=new ae(s.x*t,s.y*t,s.z*t,.5*e);return a.normalize(),a}}}class le{constructor(e=0,t=0){this.x=e,this.y=t}static get UP(){return new le(0,1)}static get DOWN(){return new le(0,-1)}static get RIGHT(){return new le(1,0)}static get LEFT(){return new le(-1,0)}static get ZERO(){return new le}static add(e,t){const i=new le(e.x,e.y);return i.addA(t),i}static sub(e,t){var i=new le(e.x,e.y);return i.subA(t),i}static scale(e,t){let i=new le(e.x,e.y);return i.scale(t),i}static mul(e,t){let i=new le(e.x,e.y);return i.mulA(t),i}static div(e,t){let i=new le(e.x,e.y);return i.divA(t),i}static proj_b_to_a(e,t){return t.scaleTo(t.dot(e)/t.dot(t))}static angle(e,t){return Math.acos(e.dot(t)/Math.sqrt(e.length2()*t.length2()))}static orthoNormalize(e,t){return(e=e.normal()).scale(t.dot(e)),t.sub(e).normalize()}toVector3(){return new oe(this.x,this.y,0)}clone(){return new le(this.x,this.y)}equal(e){return this.x===e.x&&this.y===e.y}copy(e){return this.x=e.x,this.y=e.y,this}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}length2(){return this.x*this.x+this.y*this.y}addA(e){return this.x+=e.x,this.y+=e.y,this}add(e){return new le(this.x+e.x,this.y+e.y)}subA(e){return this.x-=e.x,this.y-=e.y,this}sub(e){return new le(this.x-e.x,this.y-e.y)}scale(e){return this.x*=e,this.y*=e,this}scaleTo(e){return new le(this.x*e,this.y*e)}mulA(e){return this.x*=e.x,this.y*=e.y,this}mul(e){return new le(this.x*e.x,this.y*e.y)}divA(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return e.x*this.x+e.y*this.y}dotArr(e){return e[0]*this.x+e[1]*this.y}cross(e){return this.x*e.y-this.y*e.x}clear(){return this.x=this.y=0,this}normal(){let e=new le;e.copy(this);let t=1/e.length();return e.x*=t,e.y*=t,e}normalize(){let e=1/this.length();return this.x*=e,this.y*=e,this}toVec(){return[this.x,this.y]}distance(e){return le.sub(this,e).length()}set(e,t){return this.x=e,this.y=t,this}negate(){return this.x=-this.x,this.y=-this.y,this}negateTo(){return new le(-this.x,-this.y)}projToRay(e,t){let i=le.proj_b_to_a(le.sub(this,e),t);return i.add(e),i}angle(e){return le.angle(this,e)}lerp(e,t,i){let r=this.clone();return i<=0?r.copy(e):i>=1?r.copy(t):r=le.add(e,le.sub(t,e).scale(i)),r}static get LERP_DELTA(){return 1e-6}slerp(e,t){let i,r,n,s,a=new le;if(t<=0)return a.copy(this),a;if(t>=1)return a.copy(e),a;let o=this.dot(e);return 1-o>le.LERP_DELTA?(i=Math.acos(o),r=Math.sin(i),n=Math.sin((1-t)*i)/r,s=Math.sin(t*i)/r):(n=1-t,s=t),le.add(this.scale(n),e.scale(s))}}const he={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4","indianred ":"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function ce(e,t){return null!=e?e:t}function de(e){return null==e}function _e(e){return void 0===e}let ue=0;function fe(e){let t=e._openglobus_id;return t||(t=e._openglobus_id=++ue),t}function ge(e){return"string"==typeof e||e instanceof String}function pe(e,t){let i=he[e];if(i&&(e=i),"#"===e[0]){let i=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,r=e.replace(i,(function(e,t,i,r){return t+t+i+i+r+r})),n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(r);return n?new ne(parseInt(n[1],16)/255,parseInt(n[2],16)/255,parseInt(n[3],16)/255,de(t)?1:t):new ne}{de(t)&&(t=1);let i=e.split(",");return new ne(parseInt(i[0].split("(")[1])/255,parseInt(i[1])/255,parseInt(i[2])/255,de(i[3])?t:parseFloat(i[3]))}}function me(e,t){let i=pe(e,t);return new Float32Array([i.x,i.y,i.z,i.w])}function ve(e){let t=he[e];if(t&&(e=t),"#"===e[0]){let t=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,i=e.replace(t,(function(e,t,i,r){return t+t+i+i+r+r})),r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(i);return r?new oe(parseInt(r[1],16)/255,parseInt(r[2],16)/255,parseInt(r[3],16)/255):new oe}{let t=e.split(",");return new oe(parseInt(t[0].split("(")[1])/255,parseInt(t[1])/255,parseInt(t[2])/255)}}function ye(e,t){return e.replace(/{[^{}]+}/g,(function(e){return t[e.replace(/[{}]+/g,"")]||""}))}function xe(e){let t=document.createElement("div");t.innerHTML=e;let i=[];for(let e=0;e<t.childNodes.length;e++)i.push(t.childNodes[e]),t.removeChild(t.childNodes[e]);return i}function be(e,t,i,r){let n=document.getElementById(e);n||(n=document.createElement("div"),n.id=e,n.classList.add("defaultText"),document.body.appendChild(n)),n.innerHTML=t,n.style.left=`${i}px`,n.style.top=`${r}px`}function we(e,t=""){return e?e.trim().toLowerCase():t}function Te(e,t){if(e){if(e instanceof oe)return e.clone();if(e instanceof Array)return oe.fromVec(e);if(e instanceof le)return new oe(e.x,e.y,0)}else if(t)return t;return new oe}function Ce(e,t){if(e){if(ge(e))return pe(e);if(e instanceof Array)return ne.fromVec(e);if(e instanceof ne)return e.clone()}else if(t)return t;return new ne(1,1,1,1)}function Le(e,t){if(e){if(ge(e))return ve(e);if(e instanceof Array)return oe.fromVec(e);if(e instanceof oe)return e.clone()}else if(t)return t;return new oe(1,1,1)}function Ae(e,t){if(e){if(e instanceof Array)return new ie(Ee(e[0]),Ee(e[1]));if(e instanceof ie)return e.clone()}else if(t)return t;return new ie}function Ee(e,t){if(e){if(e instanceof Array)return new I(e[0],e[1],e[2]);if(e instanceof I)return e.clone()}else if(t)return t;return new I}function Pe(e,t){let i=0,r=e.length-1;for(;i<=r;){let n=Math.floor(.5*(i+r));if(e[n]===t)return n;e[n]<t?i=n+1:r=n-1}return-1}function Me(e,t,i){let r=0,n=e.length-1;for(;r<=n;){let s=n+r>>1,a=i(t,e[s],s);if(a>0)r=s+1;else{if(!(a<0))return s;n=s-1}}return-r-1}function Se(e,t,i){let r=Me(e,t,i);return r<0&&(r=~r),e.splice(r,0,t),r}function Be(e,t,i,r,n=!1){let s=new I(t.lon-e.lon,t.lat-e.lat),a=new I(r.lon-i.lon,r.lat-i.lat),o=-s.lat,l=+s.lon,h=-(o*e.lon+l*e.lat),c=-a.lat,d=+a.lon,_=-(c*i.lon+d*i.lat),u=c*e.lon+d*e.lat+_,f=c*t.lon+d*t.lat+_,g=o*i.lon+l*i.lat+h,p=o*r.lon+l*r.lat+h;if(n&&(u*f>0||g*p>0))return;let m=u/(u-f);return new I(e.lon+m*s.lon,e.lat+m*s.lat)}const ke={string:function(e){return de(e)?e:e.toString()},date:function(e){return de(e)?e:new Date(1e3*e)},datetime:function(e){return de(e)?e:new Date(1e3*e)},time:function(e){return de(e)?e:parseInt(e)},integer:function(e){return de(e)?e:parseInt(e)},float:function(e){return de(e)?e:parseFloat(e)},boolean:function(e){if(null===e)return e;if("boolean"==typeof e)return!0===e;if("string"==typeof e){if(""===e)return!1;if("true"===(e=e.replace(/^\s+|\s+$/g,"")).toLowerCase()||"yes"===e.toLowerCase())return!0;e=(e=e.replace(/,/g,".")).replace(/^\s*\-\s*/g,"-")}return!isNaN(e)&&0!==parseFloat(e)}};function Re(e,t=""){let i=1024,r=atob(e),n=r.length,s=Math.ceil(n/i),a=new Array(s);for(let e=0;e<s;++e){let t=e*i,s=Math.min(t+i,n),o=new Array(s-t);for(let e=t,i=0;e<s;++i,++e)o[i]=r[e].charCodeAt(0);a[e]=new Uint8Array(o)}return new Blob(a,{type:t})}function ze(e,t,i){let r,n=0;return function(){const s=arguments;n?(i&&clearTimeout(r),r=setTimeout((()=>{Date.now()-n>=t&&(e.apply(null,s),n=Date.now())}),t-(Date.now()-n))):(e.apply(null,s),n=Date.now())}}function Ie(e,t){let i=new e.constructor(e.length+t.length);return i.set(e,0),i.set(t,e.length),i}function Fe(e=[],t=[]){if(ArrayBuffer.isView(e))return Ie(e,t);for(let i=0;i<t.length;i++)e.push(t[i]);return e}function De(e,t=Float32Array){if(ArrayBuffer.isView(e))return e;{const i=new t(e.length);return i.set(e,0),i}}function Ne(e){return ArrayBuffer.isView(e)?Array.from(e):e}function He(e,t,i,r){if(ArrayBuffer.isView(e))return t<0&&(i=Math.abs(t),t+=e.length),Oe(e,t,i,r);{let n;return n=t<0?e.splice(t):e.splice(t,i),r&&(r.result=n),e}}function Oe(e,t,i,r){if(0===e.length)return e;const n=e.length-i,s=new e.constructor(n);return s.set(e.subarray(0,t)),s.set(e.subarray(t+i),t),r&&(r.result=e.subarray(t,t+i)),s}function Ve(e,t,i,r,n){const s=n+1,a=i+s,o=r+s;let l=new Float64Array(s*s*3),h=0;for(let n=i;n<a;n++)for(let i=r;i<o;i++){let r=3*(n*(t+1)+i);l[h++]=e[r],l[h++]=e[r+1],l[h++]=e[r+2]}return l}function Ue(e,t,i,r,n){const s=n+1,a=i+s,o=r+s;let l=new Float32Array(s*s*3),h=0;for(let n=i;n<a;n++)for(let i=r;i<o;i++){let r=3*(n*(t+1)+i);l[h++]=e[r],l[h++]=e[r+1],l[h++]=e[r+2]}return l}function Ge(e,t,i,r,n,s,a,o,l,h,c,d,_){const u=s+o+1,f=a+o+1;n+=1;let g=0,p=0;for(let o=s;o<u;o++)for(let s=a;s<f;s++){let a=o*n+s,u=3*a,f=e[u],m=e[u+1],v=e[u+2];r&&0!==r[a]?_[p]=1:(f<d.xmin&&(d.xmin=f),f>d.xmax&&(d.xmax=f),m<d.ymin&&(d.ymin=m),m>d.ymax&&(d.ymax=m),v<d.zmin&&(d.zmin=v),v>d.zmax&&(d.zmax=v)),p++,l[g]=f,c[g]=i[u],h[g++]=t[u],l[g]=m,c[g]=i[u+1],h[g++]=t[u+1],l[g]=v,c[g]=i[u+2],h[g++]=t[u+2]}}function We(e){return e.map((e=>Array.isArray(e)?We(e):e))}async function je(e){return new Promise((t=>{const i=new Image;return i.addEventListener("load",(()=>{t(i)})),i.src=e,i.crossOrigin="",i}))}function Ye(e){return e.complete&&0!==e.naturalHeight}function qe(e){let t=new URLSearchParams(location.search).get(e);if(t)return Number(t)}var Ze=Object.freeze({__proto__:null,base64StringToBlog:function(e){let t=e.split(";"),i=t[0].split(":")[1];return Re(t[1].split(",")[1],i)},base64toBlob:Re,binaryInsert:Se,binarySearch:Me,binarySearchFast:Pe,blerp:function(e,t,i,r,n,s,a=0,o=1,l=0,h=1){return(i*(o-e)*(h-t)+r*(e-a)*(h-t)+n*(o-e)*(t-l)+s*(e-a)*(t-l))/((o-a)*(h-l))},blerp2:function(e,t,i,r,n,s){return i*(1-e)*(1-t)+r*e*(1-t)+n*(1-e)*t+s*e*t},castType:ke,cloneArray:We,concatArrays:Fe,concatTypedArrays:Ie,createColorRGB:Le,createColorRGBA:Ce,createExtent:Ae,createLonLat:Ee,createVector3:Te,createVector4:function(e,t){if(e){if(e instanceof ne)return e.clone();if(e instanceof Array)return ne.fromVec(e)}else if(t)return t;return new ne},defaultString:we,distanceFormat:function(e){return e>1e3?`${(e/1e3).toFixed(1)} km`:e>9?`${Math.round(e)} m`:`${e.toFixed(1)} m`},extractElevationTiles:function(e,t,i){let r=Math.sqrt(t.length)-1,n=r+1,s=Math.sqrt(e.length/4),a=s/r,o=0,l=0;for(let h=0,c=0,d=e.length/4;h<d;h++){let d=e[4*h],_=Math.floor(h/s),u=h%s,f=Math.floor(u/r),g=Math.floor(_/r),p=i[g][f],m=_%r,v=u%r,y=(m+g)*n+v+f;if(p[y]=d,(_+g)%a==0&&(u+f)%a==0&&(t[c++]=d),(u+1)%r==0&&u!==s-1){o=e[4*(h+1)];let s=.5*(d+o);y=(m+g)*n+v+1,p[y]=s,(_+g)%a==0&&(t[c++]=s);let l=(m+g)*n+(v+1)%r;i[g][f+1][l]=s}if((_+1)%r==0&&_!==s-1){l=e[4*(h+s)];let o=.5*(d+l);y=(m+1)*n+v+f,p[y]=o,(u+f)%a==0&&(t[c++]=o);let _=(m+1)%r*n+v+f;i[g+1][f][_]=o}if((u+1)%r==0&&u!==s-1&&(_+1)%r==0&&_!==s-1){let a=.25*(d+o+l+e[4*(h+s+1)]);y=(m+1)*n+(v+1),p[y]=a,t[c++]=a;let _=(m+1)*n;i[g][f+1][_]=a;let u=r;i[g+1][f][u]=a;let x=0;i[g+1][f+1][x]=a}}},getDefault:ce,getHTML:function(e,t){return ye(e,t)},getLinesIntersection2v:function(e,t,i,r,n){let s=t.sub(e),a=r.sub(i),o=-s.y,l=+s.x,h=-(o*e.x+l*e.y),c=-a.y,d=+a.x,_=-(c*i.x+d*i.y),u=c*e.x+d*e.y+_,f=c*t.x+d*t.y+_,g=o*i.x+l*i.y+h,p=o*r.x+l*r.y+h;if(n&&(u*f>0||g*p>0))return;let m=u/(u-f);return new le(e.x+m*s.x,e.y+m*s.y)},getLinesIntersectionLonLat:Be,getMatrixSubArray32:Ue,getMatrixSubArray64:Ve,getMatrixSubArrayBoundsExt:Ge,getUrlParam:qe,htmlColorToFloat32Array:me,htmlColorToRgb:ve,htmlColorToRgba:pe,isEmpty:de,isImageLoaded:Ye,isString:ge,isUndef:_e,isUndefExt:function(e,t){return _e(e)?t:e},loadImage:je,makeArray:Ne,makeArrayTyped:De,parseHTML:xe,print2d:be,spliceArray:He,spliceTypedArray:Oe,stamp:fe,stringTemplate:ye,throttle:ze,xmlToJson:function e(t){let i={};if(1===t.nodeType){if(t.attributes.length>0){i["@attributes"]={};for(let e=0;e<t.attributes.length;e++){let r=t.attributes.item(e);i["@attributes"][r.nodeName]=r.nodeValue}}}else 3===t.nodeType&&(i=t.nodeValue);if(t.hasChildNodes())for(let r=0;r<t.childNodes.length;r++){let n=t.childNodes.item(r),s=n.nodeName;if(void 0===i[s])i[s]=e(n);else{if(void 0===i[s].push){let e=i[s];i[s]=[],i[s].push(e)}i[s].push(e(n))}}return i}});const Xe=.001,$e=1e3,Ke=60,Qe=1/Ke,Je=1/24,et=3600,tt=1/et,it=12*et,rt=1440,nt=86400,st=864e5,at=1.1574074074074074e-8,ot=1/nt,lt=2451545;function ht(e,t,i){let r=(t-14)/12|0,n=e+4800+r;return(1461*n/4|0)+(367*(t-2-12*r)/12|0)-(3*((n+100)/100|0)/4|0)+i-32075}function ct(e){let t=ht(e.getUTCFullYear(),e.getUTCMonth()+1,e.getUTCDate()),i=e.getUTCHours()-12;i<0&&(i+=24);let r=e.getUTCSeconds()+i*et+e.getUTCMinutes()*Ke+e.getUTCMilliseconds()*Xe;r>=it&&t--;let n=r*ot|0;return t+=n,r-=nt*n,r<0&&(t--,r+=nt),t+r*ot}function dt(e){let t=mt,i=Me(t,e,(function(e,t){return e-t.jd}));i<0&&(i=~i),i>=t.length&&(i=t.length-1);let r=t[i].leapSeconds;return 0!==i&&(t[i].jd-e)*nt>r&&(r=t[i-1].leapSeconds),e+r*ot}function _t(e){let t=mt,i=Me(t,e,(function(e,t){return e-t.jd}));if(i<0&&(i=~i),i>=t.length)return e-t[i-1].leapSeconds*ot;if(0===i)return e-t[0].leapSeconds*ot;let r=(t[i].jd-e)*nt;return 0===r?e-t[i].leapSeconds*ot:r<=1?void 0:e-t[i-1].leapSeconds*ot}function ut(e){let t=0|e,i=(e-t)*nt;i>=it&&t++;let r=t+68569|0,n=4*r/146097|0;r=r-((146097*n+3)/4|0)|0;let s=4e3*(r+1)/1461001|0;r=r-(1461*s/4|0)+31|0;let a=80*r/2447|0,o=r-(2447*a/80|0)|0;r=a/11|0;let l=a+2-12*r|0,h=100*(n-49)+s+r|0,c=i*tt|0,d=i-c*et,_=d*Qe|0;d-=_*Ke;let u=0|d,f=(d-u)*$e|0;return c+=12,c>23&&(c-=24),new Date(Date.UTC(h,l-1,o,c,_,u,f))}function ft(e,t){return e+t*at}function gt(e,t){return e+t*ot}function pt(e,t){return{jd:e,leapSeconds:t}}const mt=[pt(2441317.5,10),pt(2441499.5,11),pt(2441683.5,12),pt(2442048.5,13),pt(2442413.5,14),pt(2442778.5,15),pt(2443144.5,16),pt(2443509.5,17),pt(2443874.5,18),pt(2444239.5,19),pt(2444786.5,20),pt(2445151.5,21),pt(2445516.5,22),pt(2446247.5,23),pt(2447161.5,24),pt(2447892.5,25),pt(2448257.5,26),pt(2448804.5,27),pt(2449169.5,28),pt(2449534.5,29),pt(2450083.5,30),pt(2450630.5,31),pt(2451179.5,32),pt(2453736.5,33),pt(2454832.5,34),pt(2456109.5,35),pt(2457204.5,36)],vt=dt(lt);var yt=Object.freeze({__proto__:null,DAYS_PER_JULIAN_CENTURY:36525,DAYS_PER_JULIAN_YEAR:365.25,DateToTAI:function(e){return dt(ct(e))},DateToUTC:ct,HOURS_PER_DAY:24,J2000:lt,J2000TAI:vt,MILLISECONDS_PER_DAY:st,MILLISECONDS_PER_SECOND:$e,MINUTES_PER_DAY:rt,MINUTES_PER_HOUR:60,MODIFIED_JULIAN_DATE_DIFFERENCE:2400000.5,ONE_BY_HOURS_PER_DAY:Je,ONE_BY_MILLISECONDS_PER_DAY:at,ONE_BY_MINUTES_PER_DAY:.0006944444444444445,ONE_BY_SECONDS_PER_DAY:ot,ONE_BY_SECONDS_PER_HOUR:tt,ONE_BY_SECONDS_PER_MINUTE:Qe,PICOSECOND:1e-9,SECONDS_PER_12_HOURS:it,SECONDS_PER_DAY:nt,SECONDS_PER_HOUR:et,SECONDS_PER_MILLISECOND:Xe,SECONDS_PER_MINUTE:Ke,T:function(e){return(e-lt)/36525},TAItoDate:function(e){let t=_t(e);return t||(t=_t(gt(e,-1)),console.trace(`TAItoDate - can't convert ${e.toString()} to utc.`)),ut(t)},TAItoUTC:_t,UTCtoDate:ut,UTCtoTAI:dt,addDays:function(e,t){return e+t},addHours:function(e,t){return e+t*Je},addMilliseconds:ft,addMinutes:function(e,t){return e+t*rt},addSeconds:gt,daysToSeconds:function(e){return e*nt},getDayNumber:ht,getDays:function(e){return 0|e},getHours:function(e){let t=(e-(0|e))*nt,i=t*tt|0,r=t-i*et,n=r*Qe|0;r-=n*Ke;let s=0|r;return i+=12+n/60+s/3600+((r-s)*$e|0)/1e3,i>23&&(i-=24),i},getMilliseconds:function(e){let t=e-(0|e);return t*=nt,(t-(0|t))*$e|0},getMinutes:function(e){return(e-(0|e))*rt|0},getSeconds:function(e){return(e-(0|e))*nt},secondsToDays:function(e){return e*ot}});class xt{constructor(e){this.vertices=[new oe,new oe,new oe,new oe,new oe,new oe,new oe,new oe],e&&this.setFromBoundsArr(e)}copy(e){for(let t=0,i=this.vertices.length;t<i;t++)this.vertices[t].copy(e.vertices[t])}setFromBoundsArr(e){let t=e[0],i=e[3],r=e[1],n=e[4],s=e[2],a=e[5],o=this.vertices;o[0].set(t,r,s),o[1].set(i,r,s),o[2].set(i,r,a),o[3].set(t,r,a),o[4].set(t,n,s),o[5].set(i,n,s),o[6].set(i,n,a),o[7].set(t,n,a)}setFromExtent(e,t){this.setFromBoundsArr(t.getCartesianBounds(e))}}class bt{constructor(e=0,t){this.radius=e,this.center=t?t.clone():new oe}setFromBounds(e){let t=new oe(e[0],e[1],e[2]);this.center.set(t.x+.5*(e[3]-t.x),t.y+.5*(e[3]-t.y),t.z+.5*(e[5]-t.z)),this.radius=this.center.distance(t)}setFromExtent(e,t){this.setFromBounds(t.getCartesianBounds(e))}}var wt=Object.freeze({__proto__:null,Box:xt,Sphere:bt});function Tt(e,t){return new Ct(e,t)}class Ct{constructor(e,t){this.__id=Ct.__counter__++,this._eventNames=[],e&&this.registerNames(e),this._sender=t||this,this._stopPropagation=!1,this._stampCache={}}bindSender(e){this._sender=e||this}registerNames(e){for(let t=0;t<e.length;t++)this[e[t]]={active:!0,handlers:[]},this._eventNames.push(e[t]);return this}_getStamp(e,t,i){return`${e}_${t}_${i}`}_stamp(e,t){let i=fe(t),r=this._getStamp(e,this.__id,i);return!this._stampCache[r]&&(this._stampCache[r]=i,!0)}on(e,t,i,r=0){if(this._stamp(e,t)&&this[e]){let n=t.bind(i||this._sender);n._openglobus_id=t._openglobus_id,n._openglobus_priority=r,Se(this[e].handlers,n,((e,t)=>(t._openglobus_priority||0)-(e._openglobus_priority||0)))}}off(e,t){if(t){let i=this._getStamp(e,this.__id,t._openglobus_id);if(t._openglobus_id&&this._stampCache[i]){let r=this[e].handlers,n=r.length,s=-1;for(;n--;){if(r[n]._openglobus_id===t._openglobus_id){s=n;break}}-1!==s&&(r.splice(s,1),this._stampCache[i]=void 0,delete this._stampCache[i])}}}dispatch(e,...t){let i=!0;if(e&&e.active&&!this._stopPropagation){let r=e.handlers.slice(0),n=r.length;for(;n--;)!1===r[n](...t)&&(i=!1)}return this._stopPropagation=!1,i}stopPropagation(){this._stopPropagation=!0}clear(){for(let e=0;e<this._eventNames.length;e++){let t=this[this._eventNames[e]];t.handlers.length=0,t.handlers=[]}this._eventNames.length=0,this._eventNames=[]}}Ct.__counter__=0;const Lt=["render"];class At{constructor(e={}){this.__id=At.__counter__++,this.events=Tt(Lt),this.model=e.model||null,this.template=e.template||"",this.parent=e.parent||null,this._classList=e.classList||[],this.el=null}static getHTML(e,t){return ye(e,t)}static parseHTML(e){return xe(e)}static insertAfter(e,t){Array.isArray(e)||(e=[e]);for(let i=0;i<e.length;i++)t.parentNode&&t.parentNode.insertBefore(e[i],t.nextSibling);return e}static insertBefore(e,t){Array.isArray(e)||(e=[e]);for(let i=0;i<e.length;i++)t.parentNode&&t.parentNode.insertBefore(e[i],t);return e}insertBefore(e){this.el||this.render(),this.el&&(e instanceof HTMLElement&&e.parentNode&&At.insertBefore(this.el,e),e instanceof At&&e.el&&e.el.parentNode&&At.insertBefore(this.el,e.el))}insertAfter(e){this.el||this.render(),this.el&&(e instanceof HTMLElement&&e.parentNode&&At.insertAfter(this.el,e),e instanceof At&&e.el&&e.el.parentNode&&At.insertAfter(this.el,e.el))}isEqual(e){return e.__id===this.__id}appendTo(e,t=!1,i=!1){return e&&(this.el||(this.beforeRender(e),this.render()),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el),t&&(e.innerHTML=""),this.el&&(i&&e.childNodes[0]?At.insertBefore(this.el,e.childNodes[0]):e.appendChild(this.el)),this.afterRender(e)),this}afterRender(e){}beforeRender(e){}stopPropagation(){this.events.stopPropagation()}renderTemplate(e){return At.parseHTML(At.getHTML(this.template,e||{}))[0]}render(e){this.el=this.renderTemplate(e);for(let e=0,t=this._classList.length;e<t;e++)this.el.classList.add(this._classList[e]);return this.events.dispatch(this.events.render,this),this}select(e){return this.el?this.el.querySelector(e):null}selectRemove(e){if(this.el){let t=this.select(e);if(t&&t.parentNode)return t.parentNode.removeChild(t),t}}selectAll(e,t){if(this.el){const i=this.el.querySelectorAll(e);if(t)for(let e=0,r=i.length;e<r;e++)t(i[e],e);return i}}remove(){this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}At.__counter__=0;const Et=["click","mousedown","mouseup","touchstart","touchend","touchcancel"];class Pt extends At{constructor(e={}){super({template:ye('<div class="og-button" title="{title}">\n <div class="og-button-icon">{icon}</div>\n <div class="og-button-text">{text}</div>\n </div>',{icon:e.icon||"",text:e.text||"",title:e.title||""}),...e}),this._onMouseDown=e=>{e.preventDefault(),this.events.dispatch(this.events.mousedown,this,e)},this._onMouseUp=e=>{e.preventDefault(),this.events.dispatch(this.events.mouseup,this,e)},this._onTouchStart=e=>{e.preventDefault(),this.events.dispatch(this.events.touchstart,this,e)},this._onTouchEnd=e=>{e.preventDefault(),this.events.dispatch(this.events.touchend,this,e)},this._onTouchCancel=e=>{e.preventDefault(),this.events.dispatch(this.events.touchcancel,this,e)},this._onMouseClick=e=>{this._mouseClickHandler(e)},this.events=this.events.registerNames(Et),this.el=null,this.name=e.name||"",this.$icon=null,this.$text=null}render(e){return super.render(e),this.$icon=this.select(".og-button-icon"),this.$text=this.select(".og-button-text"),this.el.__og_button__=this,this._initEvents(),this}_initEvents(){this.el&&(this.el.addEventListener("click",this._onMouseClick),this.el.addEventListener("mousedown",this._onMouseDown),this.el.addEventListener("mouseup",this._onMouseUp),this.el.addEventListener("touchstart",this._onTouchStart),this.el.addEventListener("touchend",this._onTouchEnd),this.el.addEventListener("touchcancel",this._onTouchCancel))}_mouseClickHandler(e){e.preventDefault(),this.events.dispatch(this.events.click,this,e)}remove(){this._clearEvents(),super.remove()}_clearEvents(){this.el&&this.el.removeEventListener("click",this._onMouseClick)}}class Mt{constructor(e={}){this.__id=Mt.__counter__++,this._name=e.name||`_control_${this.__id.toString()}`,this.planet=null,this._initialized=!1,this.renderer=null,this.autoActivate=e.autoActivate||!1,this._active=!1,this._deferredActive=!0}get name(){return this._name}oninit(){}onadd(){}onremove(){}onactivate(){}ondeactivate(){}addTo(e){e&&(this.renderer=e,e.controls[this.name]=this,this.onadd&&this.onadd(),e.isInitialized()&&(this._initialized=!0,this.oninit&&this.oninit(),this.autoActivate&&this.activate()))}remove(){this.deactivate(),this.onremove&&this.onremove();let e=this.renderer,t=this.name;if(!e)return;let i=e.controls[t];i&&this.isEqual(i)&&delete e.controls[t],this.renderer=null,this._active=!1,this._initialized=!1}activate(){this._active||(this._initialized||(this._initialized=!0,this.oninit&&this.oninit()),this._deferredActive?(this._active=!0,this.onactivate&&this.onactivate()):this._deferredActive=!0)}deactivate(){this._active?(this._active=!1,this.ondeactivate&&this.ondeactivate()):this._initialized||(this._deferredActive=!1)}isActive(){return this._active}isEqual(e){return e.__id===this.__id}}Mt.__counter__=0;class St extends Mt{constructor(e={}){super(e),this._heading=0,this._svg=null}oninit(){let e=new Pt({classList:["og-map-button","og-compass-button"],icon:'<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<svg\n xmlns:dc="http://purl.org/dc/elements/1.1/"\n xmlns:cc="http://creativecommons.org/ns#"\n xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\n xmlns:svg="http://www.w3.org/2000/svg"\n xmlns="http://www.w3.org/2000/svg"\n xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"\n xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"\n viewBox="0 0 110.6 110.3"\n version="1.1"\n id="svg21"\n sodipodi:docname="aaa.svg"\n inkscape:version="0.92.3 (2405546, 2018-03-11)">\n <metadata\n id="metadata11">\n <rdf:RDF>\n <cc:Work\n rdf:about="">\n <dc:format>image/svg+xml</dc:format>\n <dc:type\n rdf:resource="http://purl.org/dc/dcmitype/StillImage" />\n </cc:Work>\n </rdf:RDF>\n </metadata>\n <defs\n id="defs25" />\n <sodipodi:namedview\n pagecolor="#ffffff"\n bordercolor="#666666"\n borderopacity="1"\n objecttolerance="10"\n gridtolerance="10"\n guidetolerance="10"\n inkscape:pageopacity="0"\n inkscape:pageshadow="2"\n inkscape:window-width="1920"\n inkscape:window-height="1001"\n id="namedview23"\n showgrid="false"\n inkscape:zoom="9.4900968"\n inkscape:cx="28.376998"\n inkscape:cy="60.17054"\n inkscape:window-x="-9"\n inkscape:window-y="-9"\n inkscape:window-maximized="1"\n inkscape:current-layer="svg21" />\n <g\n id="Layer_2"\n data-name="Layer 2"\n transform="matrix(1,0,0,-1,0,110.3)">\n <g\n id="Слой_1"\n data-name="Слой 1">\n <g\n id="_Group_"\n data-name="&lt;Group&gt;">\n <g\n id="_Group_7"\n data-name="&lt;Group&gt;">\n <polygon\n id="_Path_7"\n data-name="&lt;Path&gt;"\n points="55.2,97.6 55.3,97.4 55.3,97.6 55.3,97.2 65.3,55.1 55.3,55.1 55.2,55.1 45.3,55.1 55.2,97.2 "\n style="fill:#ff2b45" />\n <polygon\n id="_Path_8"\n data-name="&lt;Path&gt;"\n points="55.3,12.7 55.3,12.9 55.2,12.7 55.2,13.1 45.3,55.1 55.2,55.1 55.3,55.1 65.3,55.1 55.3,13.1 "\n style="fill:#cecece;" />\n </g>\n </g>\n </g>\n </g>\n</svg>'});e.appendTo(this.renderer.div),e.events.on("click",this._onClick,this),this._svg=e.select("svg"),this.renderer.events.on("draw",this._draw,this)}_onClick(){const e=this.planet;let t=e.getCartesianFromPixelTerrain(this.renderer.handler.getCenter());t?e.flyCartesian(t.normal().scaleTo(t.length()+t.distance(e.camera.eye)),null,null,0,null,null,(()=>{e.camera.look(t)})):e.flyCartesian(e.camera.eye)}_draw(){this.setHeading(this.planet.camera.getHeading())}setHeading(e){this._heading!==e&&(this._heading=e,this._svg.style.transform=`rotateZ(${-e}deg)`)}}const Bt='<svg className="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor; overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">\n <path d="M777.856 280.192l-33.92-33.952-231.872 231.872-231.84-231.872-33.984 33.888 231.872 231.904-231.84 231.84 33.888 33.984 231.904-231.904 231.84 231.872 33.952-33.888-231.872-231.904z"/>\n</svg>',kt=["resize","focus","visibility","dragstart","dragend"];class Rt extends At{constructor(e={}){super({template:ye('<div class="og-ddialog" \n style="display:{display}; resize:{resize}; width: {width}px; {height}; top: {top}px; left: {left}px; min-height: {minHeight}; max-height: {maxHeight}; min-width: {minWidth}; max-width: {maxWidth};">\n <div class="og-ddialog-header">\n <div class="og-ddialog-header__title">{title}</div> \n <div class="og-ddialog-header__buttons"></div> \n </div>\n <div class="og-ddialog-container"></div>\n </div>>',{title:e.title||"",display:ce(e.visible,!0)?"flex":"none",resize:ce(e.resizable,!0)?"both":"none",width:e.width||300,height:e.height?`height:${e.height||200}`:"",left:e.left||0,top:e.top||0,minHeight:e.minHeight?`${e.minHeight}px`:"unset",maxHeight:e.maxHeight?`${e.maxHeight}px`:"unset",minWidth:e.minWidth?`${e.minWidth}px`:"unset",maxWidth:e.maxWidth?`${e.maxWidth}px`:"unset"}),...e}),this._onCloseBtnClick=()=>{this.close()},this._onMouseDownAll=()=>{this.bringToFront()},this._onMouseDown=e=>{e.preventDefault(),this._startDragging(),this._startPosX=e.clientX,this._startPosY=e.clientY,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp)},this._onMouseMove=e=>{e.preventDefault();let t=this._startPosX-e.clientX,i=this._startPosY-e.clientY;this._startPosX=e.clientX,this._startPosY=e.clientY,this.setPosition(this.el.offsetLeft-t,this.el.offsetTop-i)},this._onMouseUp=()=>{this._clearDragging(),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("mousemove",this._onMouseMove)},this.events=this.events.registerNames(kt),this._startPosX=0,this._startPosY=0,this.$header=null,this.$title=null,this.$container=null,this.$buttons=null,this._closeBtn=new Pt({icon:Bt,classList:["og-button-size__20"]}),this.useHide=e.useHide||!1,this._visibility=ce(e.visible,!0)}setContainer(e){this.$container.innerHTML=e}get container(){return this.$container}get width(){return this.el?parseFloat(this.el.style.width):0}get height(){return this.el?parseFloat(this.el.style.height):0}bringToFront(){this.el.style.zIndex=String(Rt.__zIndex__++)}render(e){return super.render(e),this.bringToFront(),this.$header=this.select(".og-ddialog-header"),this.$title=this.select(".og-ddialog-header__title"),this.$container=this.select(".og-ddialog-container"),this.$buttons=this.select(".og-ddialog-header__buttons"),this._initEvents(),this._initButtons(),this}show(){this._visibility||(this._visibility=!0,this.el.style.display="flex",this.bringToFront(),this.events.dispatch(this.events.visibility,!0,this))}hide(){this._visibility&&(this._visibility=!1,this.el.style.display="none",this.events.dispatch(this.events.visibility,!1,this))}close(){this.useHide?this.hide():this.remove()}setVisibility(e){e?this.show():this.hide()}_initButtons(){this._closeBtn.events.on("click",this._onCloseBtnClick),this._closeBtn.appendTo(this.$buttons)}_initEvents(){this.$header.addEventListener("mousedown",this._onMouseDown),this.el.addEventListener("mousedown",this._onMouseDownAll)}setPosition(e,t){null!=e&&(this.el.style.left=`${e}px`),null!=t&&(this.el.style.top=`${t}px`)}_startDragging(){this.el.classList.contains("dragging")||(this.el.classList.add("dragging"),this.events.dispatch(this.events.dragstart,this))}_clearDragging(){this.el.classList.contains("dragging")&&(this.events.dispatch(this.events.dragend,this),this.el.classList.remove("dragging"))}remove(){this._clearDragging(),this._clearEvents(),super.remove()}_clearEvents(){this._closeBtn.events.off("click",this._onCloseBtnClick),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("mousemove",this._onMouseMove),this.$header.removeEventListener("mousedown",this._onMouseDown),this.el.removeEventListener("mousedown",this._onMouseDownAll)}}Rt.__zIndex__=0;const zt=["change"];class It extends Pt{constructor(e){super({...e}),this._onMouseClick=e=>{this.preventClick||(this._mouseClickHandler(e),this.setActive(!this.isActive))},this.events=this.events.registerNames(zt),this._isActive=e.isActive||!1,this.preventClick=e.preventClick||!1}setActive(e,t=!1){e!==this._isActive&&(this._isActive=e,this._toggle(),t||this.events.dispatch(this.events.change,e,this))}_toggle(){this.el&&this.el.classList.toggle("og-button__active")}get isActive(){return this._isActive}render(e){return super.render(e),this._isActive&&this._toggle(),this}}const Ft=[2,3,0,1],Dt=[[-1,-1,0,1],[1,-1,3,-1],[2,3,-1,-1],[-1,0,-1,2]],Nt=[[2,3,0,1],[1,0,3,2],[2,3,0,1],[1,0,3,2]],Ht=[[0,1,0,0],[1,0,0,0],[0,1,0,1],[1,1,1,1]];class Ot{constructor(e,t){this.segment=e,this.layer=t,this.isReady=!1,this.isLoading=!1,this.texture=null,this.pickingMask=null,this.textureExists=!1,this.appliedNodeId=0,this.appliedNode=null,this.texOffset=[0,0,1,1],this.loadingAttempts=0,this._updateTexture=null,this._updatePickingMask=null,this.pickingReady=!1}abortLoading(){this.layer.abortMaterialLoading(this)}_createTexture(e){return this.layer._planet&&this.layer.createTexture(e,this.layer._internalFormat,this.isReady?this.texture:null)}applyImage(e){this.segment.initialized&&(this._updateTexture=null,this.texture=this._createTexture(e),this.isReady=!0,this.pickingReady=!0,this.textureExists=!0,this.isLoading=!1,this.appliedNodeId=this.segment.node.nodeId,this.texOffset=[0,0,1,1])}applyTexture(e,t){this.segment.initialized&&(this.texture=e,this._updateTexture=null,this.pickingMask=t||null,this._updatePickingMask=null,this.isReady=!0,this.pickingReady=!0,this.textureExists=!0,this.isLoading=!1,this.appliedNodeId=this.segment.node.nodeId,this.texOffset=[0,0,1,1])}textureNotExists(){this.segment.initialized&&(this.pickingReady=!0,this.isLoading=!1,this.isReady=!0,this.textureExists=!1)}clear(){this.loadingAttempts=0,this.layer.clearMaterial(this)}}const Vt=15.8;class Ut{constructor(e,t={}){if(this.isVector=!1,this.__id=Ut.__counter__++,this.events=Tt(Gt,this),this.name=e||"noname",this.properties=t.properties||{},this.displayInLayerSwitcher=void 0===t.displayInLayerSwitcher||t.displayInLayerSwitcher,this._hasImageryTiles=!0,this._opacity=t.opacity||1,this.minZoom=t.minZoom||0,this.maxZoom=t.maxZoom||50,this._planet=null,this.isVector=!1,this._attribution=t.attribution||"",this._zIndex=t.zIndex||0,this._isBaseLayer=t.isBaseLayer||!1,this._defaultTextures=t.defaultTextures||[null,null],this._visibility=void 0===t.visibility||t.visibility,this._fading=t.fading||!1,this._fadingFactor=this._opacity/Vt,this._fading?this._fadingOpacity=this._visibility?this._opacity:0:this._fadingOpacity=this._opacity,this._height=t.height||0,this._extent=new ie,this.createTexture=null,this._textureFilter=t.textureFilter?t.textureFilter.trim().toUpperCase():"MIPMAP",this._isSRGB=null!=t.isSRGB&&t.isSRGB,this._internalFormat=null,this._extentMerc=new ie,this.setExtent(Ae(t.extent,new ie(new I(-180,-90),new I(180,90)))),this._pickingColor=new oe,this._pickingEnabled=void 0===t.pickingEnabled||t.pickingEnabled,this._isPreloadDone=!1,this._preLoadZoomLevels=t.preLoadZoomLevels||[0,1],this._ambient=null,this._diffuse=null,this._specular=null,t.ambient){let e=Le(t.ambient,new oe(.2,.2,.2));this._ambient=new Float32Array([e.x,e.y,e.z])}if(t.diffuse){let e=Le(t.diffuse,new oe(.8,.8,.8));this._diffuse=new Float32Array([e.x,e.y,e.z])}if(t.specular){let e=Le(t.specular,new oe(3e-4,3e-4,3e-4)),i=t.shininess||20;this._specular=new Float32Array([e.x,e.y,e.z,i])}this.nightTextureCoefficient=t.nightTextureCoefficient||1}set diffuse(e){if(e){let t=Le(e);this._diffuse=new Float32Array(t.toArray())}else this._diffuse=null}set ambient(e){if(e){let t=Le(e);this._ambient=new Float32Array(t.toArray())}else this._ambient=null}set specular(e){if(e){let t=Le(e);this._specular=new Float32Array([t.x,t.y,t.y,this._specular?this._specular[3]:0])}else this._specular=null}set shininess(e){this._specular&&(this._specular[3]=e)}static getTMS(e,t,i){return{x:e,y:(1<<i)-t-1,z:i}}static getTileIndex(...e){return e.join("_")}get instanceName(){return"Layer"}get rendererEvents(){return this.events}set opacity(e){e!==this._opacity&&(this._fading?(e>this._opacity||e<this._opacity)&&(this._fadingFactor=(e-this._opacity)/Vt):this._fadingOpacity=e,this._opacity=e)}set pickingEnabled(e){this._pickingEnabled=e}get pickingEnabled(){return this._pickingEnabled}hasImageryTiles(){return this._hasImageryTiles}getID(){return this.__id}get id(){return this.__id}get _id(){return this.__id}isEqual(e){return e.__id===this.__id}_assignPlanet(e){this._planet=e,e._layers.push(this),e.renderer&&e.renderer.isInitialized()&&(this._isSRGB?this._internalFormat=e.renderer.handler.gl.SRGB8_ALPHA8:this._internalFormat=e.renderer.handler.gl.RGBA8,this.createTexture=e.renderer.handler.createTexture[this._textureFilter],this.events.on("visibilitychange",e._onLayerVisibilityChanged,e),this._isBaseLayer&&this._visibility&&e.setBaseLayer(this),e.events.dispatch(e.events.layeradd,this),this.events.dispatch(this.events.add,e),e.updateVisibleLayers(),this._bindPicking(),this._visibility&&this.hasImageryTiles()&&this._preLoad())}get isIdle(){return this._planet&&this._planet._terrainCompletedActivated||!1}_bindPicking(){this._planet&&this._planet.renderer&&this._planet.renderer.assignPickingColor(this)}addTo(e){this._planet||this._assignPlanet(e)}remove(){let e=this._planet;if(e)for(let t=0;t<e._layers.length;t++)if(this.isEqual(e._layers[t]))return e.renderer&&e.renderer.clearPickingColor(this),e._layers.splice(t,1),e.updateVisibleLayers(),this.clear(),e.events.dispatch(e.events.layerremove,this),this.events.dispatch(this.events.remove,e),this._planet=null,this._internalFormat=null,this.createTexture=null,this;return this}clear(){this._planet&&this._planet._clearLayerMaterial(this)}get planet(){return this._planet}setAttribution(e){this._attribution!==e&&(this._attribution=e,this._planet&&this._planet.updateAttributionsList())}getAttribution(){return this._attribution}setHeight(e){this._height=e,this._planet&&this._planet.updateVisibleLayers()}getHeight(){return this._height}setZIndex(e){this._zIndex=e,this._planet&&this._planet.updateVisibleLayers()}getZIndex(){return this._zIndex}bringToFront(){if(this._planet){let e=this._planet.visibleTileLayers,t=e[e.length-1];t.isEqual(this)||this.setZIndex(t.getZIndex()+1)}}isBaseLayer(){return this._isBaseLayer}setBaseLayer(e){this._isBaseLayer=e,this._planet&&(!e&&this._planet.baseLayer&&this.isEqual(this._planet.baseLayer)&&(this._planet.baseLayer=null),this._planet.updateVisibleLayers())}setVisibility(e){e!==this._visibility&&(this._visibility=e,this._planet&&(this._isBaseLayer&&e&&this._planet.setBaseLayer(this),this._planet.updateVisibleLayers(),!e||this._isPreloadDone||this.isVector||(this._isPreloadDone=!0,this._preLoad())),this.events.dispatch(this.events.visibilitychange,this))}_forceMaterialApply(e){let t=e.materials,i=t[this.__id];i||(i=t[this.__id]=this.createMaterial(e)),i.isReady||(this._planet._renderCompleted=!1),this.applyMaterial(i,!0)}clearMaterial(e){}loadMaterial(e,t=!1){}applyMaterial(e,t=!1){return[0,0,1,1]}_preLoadRecursive(e,t){if(!(e.segment.tileZoom>t)){this._preLoadZoomLevels.includes(e.segment.tileZoom)&&this._forceMaterialApply(e.segment);for(let i=0,r=e.nodes.length;i<r;i++)e.nodes[i]&&this._preLoadRecursive(e.nodes[i],t)}}_preLoad(){if(this._planet&&this._preLoadZoomLevels.length){let e=this._planet,t=Math.max(...this._preLoadZoomLevels);for(let i=0,r=e.quadTreeStrategy.quadTreeList.length;i<r;i++)this._preLoadRecursive(e.quadTreeStrategy.quadTreeList[i],t)}}getVisibility(){return this._visibility}setExtent(e){let t=e.southWest.clone(),i=e.northEast.clone();t.lat<ee&&(t.lat=ee),i.lat>J&&(i.lat=J),this._extent=e.clone(),this._extentMerc=new ie(t.forwardMercator(),i.forwardMercator()),this._correctFullExtent()}getExtent(){return this._extent}getExtentMerc(){return this._extentMerc}_correctFullExtent(){}get opacity(){return this._opacity}get screenOpacity(){return this._fading?this._fadingOpacity:this._opacity}_refreshFadingOpacity(){let e=this._planet;return this._visibility&&e.getViewExtent().overlaps(this._extent)&&e.maxCurrZoom>=this.minZoom&&e.minCurrZoom<=this.maxZoom?(this._fadingOpacity+=this._fadingFactor,(this._fadingFactor>0&&this._fadingOpacity>this._opacity||this._fadingFactor<0&&this._fadingOpacity<this._opacity)&&(this._fadingOpacity=this._opacity),!1):(this._fadingOpacity=0,!this._visibility)}createMaterial(e){return new Ot(e,this)}redraw(){this._planet&&this._planet.quadTreeStrategy.clearLayerMaterial(this)}abortMaterialLoading(e){}abortLoading(){}}Ut.__counter__=0;const Gt=["visibilitychange","add","remove","mousemove","mouseenter","mouseleave","lclick","rclick","mclick","ldblclick","rdblclick","mdblclick","lup","rup","mup","ldown","rdown","mdown","lhold","rhold","mhold","mousewheel","touchmove","touchstart","touchend","doubletouch","touchleave","touchenter"],Wt=["load","loadend"];class jt extends Ut{constructor(e,t){super(e,t),this.events=this.events.registerNames(Wt),this.animated=t.animated||!1,this.minNativeZoom=t.minNativeZoom||0,this.maxNativeZoom=t.maxNativeZoom||100,this._counter=0,this._pendingsQueue=[],this.drawTile=t.drawTile,this._onLoadend_=null}addTo(e){return this._onLoadend_=this._onLoadend.bind(this),this.events.on("loadend",this._onLoadend_,this),super.addTo(e)}remove(){return this.events.off("loadend",this._onLoadend_),this._onLoadend_=null,super.remove()}_onLoadend(){this._planet&&this._planet._terrainCompletedActivated&&this._planet.events.dispatch(this._planet.events.layerloadend,this)}get instanceName(){return"CanvasTiles"}get isIdle(){return super.isIdle&&0===this._counter}abortLoading(){this._pendingsQueue.forEach((e=>{this.abortMaterialLoading(e)})),this._pendingsQueue=[]}setVisibility(e){e!==this._visibility&&(super.setVisibility(e),e||this.abortLoading())}loadMaterial(e){let t=e.segment;this._isBaseLayer?e.texture=t._isNorth?t.planet.solidTextureOne:t.planet.solidTextureTwo:e.texture=t.planet.transparentTexture,(this._planet.layerLock.isFree()||e.segment.tileZoom<2)&&(e.isReady=!1,e.isLoading=!0,jt.__requestsCounter>=jt.MAX_REQUESTS&&this._counter?this._pendingsQueue.push(e):this._exec(e))}_exec(e){jt.__requestsCounter++,this._counter++;const t=this.events.load;t.handlers.length&&this.events.dispatch(t,e),requestAnimationFrame((()=>{this.drawTile(e,(t=>{this._counter--,jt.__requestsCounter--,this._correctCounter(),e.isLoading&&e.applyImage(t),this._dequeueRequest()}))}))}_correctCounter(){this._counter<0&&(this._counter=0),jt.__requestsCounter<0&&(jt.__requestsCounter=0)}abortMaterialLoading(e){e.isLoading&&(this._counter--,jt.__requestsCounter--,this._correctCounter(),this._dequeueRequest()),e.isLoading=!1,e.isReady=!1}_dequeueRequest(){if(this._pendingsQueue.length){if(jt.__requestsCounter<jt.MAX_REQUESTS){const e=this._whilePendings();e&&this._exec(e)}}else 0===this._counter&&this._planet&&this._planet._terrainCompletedActivated&&this.events.dispatch(this.events.loadend)}_whilePendings(){for(;this._pendingsQueue.length;){const e=this._pendingsQueue.pop();if(e&&e.segment&&e.segment.node){if(e.segment.initialized&&1===e.segment.node.getState())return e;e.isLoading=!1}}return null}applyMaterial(e){if(e.isReady)return e.layer.animated&&requestAnimationFrame((()=>{this.drawTile(e,(function(t){e.applyImage(t)}))})),e.texOffset;if(e.segment.tileZoom<this.minNativeZoom)e.textureNotExists();else{let t=e.segment,i=t.node,r=!1,n=e.layer.maxNativeZoom;t.passReady&&!e.isLoading&&t.tileZoom<=n&&this.loadMaterial(e);let s=this._id,a=e;for(;i.parentNode;)if(i=i.parentNode,a=i.segment.materials[s],a&&a.textureExists){r=!0;break}if(t.passReady)if(i.segment.tileZoom===n)t.tileZoom>n&&e.textureNotExists();else if(i.segment.tileZoom<n){let i=t.node;for(;i.segment.tileZoom>n;)i=i.parentNode;let r=i.segment.materials[s];r?!r.isLoading&&!r.isReady&&this.loadMaterial(r):(r=i.segment.materials[e.layer._id]=e.layer.createMaterial(i.segment),this.loadMaterial(r))}if(r){e.layer.animated&&requestAnimationFrame((()=>{this.drawTile(e,(function(t){e.applyImage(t)}))})),e.appliedNodeId=i.nodeId,e.texture=a.texture;let r=1/(2<<t.tileZoom-i.segment.tileZoom-1);e.texOffset[0]=t.tileX*r-i.segment.tileX,e.texOffset[1]=t.tileY*r-i.segment.tileY,e.texOffset[2]=r,e.texOffset[3]=r}else e.texture=t.planet.transparentTexture,e.texOffset[0]=0,e.texOffset[1]=0,e.texOffset[2]=1,e.texOffset[3]=1}return e.texOffset}clearMaterial(e){e.isReady&&(e.isReady=!1,e.textureExists&&e.texture&&!e.texture.default&&(e.segment.handler.gl.deleteTexture(e.texture),e.texture=null)),this.abortMaterialLoading(e),e.isLoading=!1,e.textureExists=!1,e.layer=null,e.segment=null}}jt.MAX_REQUESTS=20,jt.__requestsCounter=0;const Yt=["change"];class qt{constructor(e={}){this._onChange=(e,t)=>{if(e){t.preventClick=!0;for(let e=0;e<this._buttons.length;e++){let i=this._buttons[e];i.isEqual(t)||(i.setActive(!1),i.preventClick=!1)}this.events.dispatch(this.events.change,t)}},this.events=Tt(Yt),this._buttons=e.buttons||[];for(let e=0;e<this._buttons.length;e++)this._bindButton(this._buttons[e])}_bindButton(e){e.events.on("change",this._onChange)}add(e){this._buttons.push(e),this._bindButton(e)}remove(e){for(let t=0;t<this._buttons.length;t++)if(this._buttons[t].isEqual(e))return this._buttons.splice(t),void e.events.off("change",this._onChange)}}class Zt{constructor(e=2,t){this._sourceId=0,this._source=new Map,this._pendingQueue=[],this._numWorkers=e,this._workerQueue=[],t&&this.setProgram(t)}check(){this._pendingQueue.length&&this.make(this._pendingQueue.pop())}setProgram(e){let t=new Blob([e],{type:"application/javascript"});for(let e=0;e<this._numWorkers;e++){let e=new Worker(URL.createObjectURL(t));e.onmessage=e=>{this._onMessage(e),this._workerQueue&&this._workerQueue.unshift(e.target),this.check()},this._workerQueue.push(e)}}make(e){}_onMessage(e){}destroy(){for(let e=0;e<this._workerQueue.length;e++){const t=this._workerQueue[e];t.onmessage=null,t.terminate()}this._pendingQueue=null,this._workerQueue=null}get pendingQueue(){return this._pendingQueue}}const Xt=-2,$t=-1;class Kt extends Zt{constructor(e=4){super(e,Qt)}_onMessage(e){let t=this._source.get(e.data.id);t.label._lockId===Xt?requestAnimationFrame((()=>{this.make({handler:t.handler,label:t.label})})):t.handler.workerCallback(e.data,t.label),this._source.delete(e.data.id)}make(e){let t=e.label;if(e.handler._entityCollection)if(this._workerQueue.length){let i=this._workerQueue.pop(),r=t.serializeWorkerData(this._sourceId);r&&(this._source.set(this._sourceId,e),t._lockId=this._sourceId,this._sourceId++,i.postMessage({labelData:r},[r.buffer]))}else this._pendingQueue.push(e)}}const Qt="'use strict';\n\n function concatTypedArrays(dest, index, source) {\n let len = source.length,\n offset = index * len;\n for(let i = 0; i < len; i++) {\n dest[offset + i] = source[i];\n }\n }\n\n self.onmessage = function (e) {\n var labelData = e.data.labelData,\n id = labelData[0],\n maxLetters = labelData[1],\n isVisible = labelData[2],\n /*3, 4, 5*/_positionHigh_x = labelData[3], _positionHigh_y = labelData[4], _positionHigh_z = labelData[5],\n /*6, 7, 8*/_positionLow_x = labelData[6], _positionLow_y = labelData[7], _positionLow_z = labelData[8],\n /*9*/_size = labelData[9],\n /*10, 11, 12*/_offset_x = labelData[10], _offset_y = labelData[11], _offset_z = labelData[12],\n /*13, 14, 15, 16*/_color_x = labelData[13], _color_y = labelData[14], _color_z = labelData[15], _color_w = labelData[16],\n /*17*/_rotation = labelData[17],\n /*18, 19, 20*/_alignedAxis_x = labelData[18], _alignedAxis_y = labelData[19], _alignedAxis_z = labelData[20],\n /*21*/_fontIndex = labelData[21],\n /*22*/_outline = labelData[22],\n /*23, 24, 25, 26*/_outlineColor_x = labelData[23], _outlineColor_y = labelData[24], _outlineColor_z = labelData[25], _outlineColor_w = labelData[26],\n /*27, 28, 29*/_pickingColor_x = labelData[27], _pickingColor_y = labelData[28], _pickingColor_z = labelData[29]\n \n\n let _vertexArr = new Float32Array(maxLetters * 12),\n _texCoordArr = new Float32Array(maxLetters * 24),\n _gliphParamArr = new Float32Array(maxLetters * 24),\n _positionHighArr = new Float32Array(maxLetters * 18),\n _positionLowArr = new Float32Array(maxLetters * 18),\n _sizeArr = new Float32Array(maxLetters * 6),\n _offsetArr = new Float32Array(maxLetters * 18),\n _rgbaArr = new Float32Array(maxLetters * 24),\n _rotationArr = new Float32Array(maxLetters * 6),\n _alignedAxisArr = new Float32Array(maxLetters * 18),\n _fontIndexArr = new Float32Array(maxLetters * 6),\n _outlineArr = new Float32Array(maxLetters * 6),\n _outlineColorArr = new Float32Array(maxLetters * 24),\n _pickingColorArr = new Float32Array(maxLetters * 18);\n \n for (let i = 0; i < maxLetters; i++) {\n if (isVisible !== 0) {\n concatTypedArrays(_vertexArr, i, [0, 0, 0, -1, 1, -1, 1, -1, 1, 0, 0, 0]);\n } else {\n concatTypedArrays(_vertexArr, i, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n }\n\n concatTypedArrays(_texCoordArr, i, [0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0]);\n concatTypedArrays(_gliphParamArr, i, [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0]);\n\n var x = _positionHigh_x, y = _positionHigh_y, z = _positionHigh_z, w;\n concatTypedArrays(_positionHighArr, i, [x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y, z]);\n\n x = _positionLow_x; y = _positionLow_y; z = _positionLow_z;\n concatTypedArrays(_positionLowArr, i, [x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y, z]);\n\n x = _size;\n concatTypedArrays(_sizeArr, i, [x, x, x, x, x, x]);\n\n x = _offset_x; y = _offset_y; z = _offset_z;\n concatTypedArrays(_offsetArr, i, [x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y, z]);\n\n x = _color_x; y = _color_y; z = _color_z; w = _color_w;\n concatTypedArrays(_rgbaArr, i, [x, y, z, w, x, y, z, w, x, y, z, w, x, y, z, w, x, y, z, w, x, y, z, w]);\n\n x = _rotation;\n concatTypedArrays(_rotationArr, i, [x, x, x, x, x, x]);\n\n x = _alignedAxis_x; y = _alignedAxis_y; z = _alignedAxis_z;\n concatTypedArrays(_alignedAxisArr, i, [x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y, z]);\n\n x = _fontIndex;\n concatTypedArrays(_fontIndexArr, i, [x, x, x, x, x, x]);\n\n x = _outline;\n concatTypedArrays(_outlineArr, i, [x, x, x, x, x, x]);\n\n x = _outlineColor_x; y = _outlineColor_y; z = _outlineColor_z; w = _outlineColor_w;\n concatTypedArrays(_outlineColorArr, i, [x, y, z, w, x, y, z, w, x, y, z, w, x, y, z, w, x, y, z, w, x, y, z, w]);\n\n x = _pickingColor_x / 255; y = _pickingColor_y / 255; z = _pickingColor_z / 255;\n concatTypedArrays(_pickingColorArr, i, [x, y, z, x, y, z, x, y, z, x, y, z, x, y, z, x, y, z]);\n }\n\n self.postMessage({\n id: id,\n vertexArr: _vertexArr,\n texCoordArr: _texCoordArr,\n gliphParamArr: _gliphParamArr,\n positionHighArr: _positionHighArr,\n positionLowArr: _positionLowArr,\n sizeArr: _sizeArr,\n offsetArr: _offsetArr,\n rgbaArr: _rgbaArr,\n rotationArr: _rotationArr,\n alignedAxisArr: _alignedAxisArr,\n fontIndexArr: _fontIndexArr,\n outlineArr: _outlineArr,\n outlineColorArr: _outlineColorArr,\n pickingColorArr: _pickingColorArr\n }, [\n _vertexArr.buffer,\n _texCoordArr.buffer,\n _gliphParamArr.buffer,\n _positionHighArr.buffer,\n _positionLowArr.buffer,\n _sizeArr.buffer,\n _offsetArr.buffer,\n _rgbaArr.buffer,\n _rotationArr.buffer,\n _alignedAxisArr.buffer,\n _fontIndexArr.buffer,\n _outlineArr.buffer,\n _outlineColorArr.buffer,\n _pickingColorArr.buffer\n ]);\n }";class Jt{constructor(e={}){this.__id=Jt.__counter__++,this._position=Te(e.position),this._positionHigh=new oe,this._positionLow=new oe,oe.doubleToTwoFloats(this._position,this._positionHigh,this._positionLow),this._rotation=e.rotation||0,this._color=Ce(e.color),this._alignedAxis=Te(e.alignedAxis),this._offset=Te(e.offset),this._visibility=null==e.visibility||e.visibility,this._entity=null,this._handler=null,this._handlerIndex=-1,this._isReady=!1,this._lockId=$t}setPosition(e,t,i){this._position.x=e,this._position.y=t,this._position.z=i,oe.doubleToTwoFloats(this._position,this._positionHigh,this._positionLow),this._isReady&&this._handler?this._handler.setPositionArr(this._handlerIndex,this._positionHigh,this._positionLow):this._lockId!==$t&&(this._lockId=Xt)}setPosition3v(e){this._position.x=e.x,this._position.y=e.y,this._position.z=e.z,oe.doubleToTwoFloats(e,this._positionHigh,this._positionLow),this._isReady&&this._handler?this._handler.setPositionArr(this._handlerIndex,this._positionHigh,this._positionLow):this._lockId!==$t&&(this._lockId=Xt)}getPosition(){return this._position}setOffset(e,t,i){this._offset.x=e,this._offset.y=t,null!=i&&(this._offset.z=i),this._isReady&&this._handler?this._handler.setOffsetArr(this._handlerIndex,this._offset):this._lockId!==$t&&(this._lockId=Xt)}setOffset3v(e){this.setOffset(e.x,e.y,e.z)}getOffset(){return this._offset}setRotation(e){e!==this._rotation&&(this._rotation=e,this._isReady&&this._handler?this._handler.setRotationArr(this._handlerIndex,e):this._lockId!==$t&&(this._lockId=Xt))}getRotation(){return this._rotation}setOpacity(e){e!==this._color.w&&(null!=e&&(this._color.w=e),this._isReady&&this._handler?this._handler.setRgbaArr(this._handlerIndex,this._color):this._lockId!==$t&&(this._lockId=Xt))}setColor(e,t,i,r){r===this._color.w&&e===this._color.x&&t===this._color.y&&this._color.z===i||(this._color.x=e,this._color.y=t,this._color.z=i,null!=r&&(this._color.w=r),this._isReady&&this._handler?this._handler.setRgbaArr(this._handlerIndex,this._color):this._lockId!==$t&&(this._lockId=Xt))}setColor4v(e){this.setColor(e.x,e.y,e.z,e.w)}setColorHTML(e){this.setColor4v(pe(e))}getColor(){return this._color}setVisibility(e){e!==this._visibility&&(this._visibility=e,this._isReady&&this._handler?this._handler.setVisibility(this._handlerIndex,e):this._lockId!==$t&&(this._lockId=Xt))}getVisibility(){return this._visibility}setAlignedAxis(e,t,i){this._alignedAxis.x=e,this._alignedAxis.y=t,this._alignedAxis.z=i,this._isReady&&this._handler?this._handler.setAlignedAxisArr(this._handlerIndex,this._alignedAxis):this._lockId!==$t&&(this._lockId=Xt)}setAlignedAxis3v(e){this.setAlignedAxis(e.x,e.y,e.z)}getAlignedAxis(){return this._alignedAxis}remove(){this._entity=null,this._handler&&this._handler.remove(this)}setPickingColor3v(e){this._isReady&&this._handler?this._handler.setPickingColorArr(this._handlerIndex,e):this._lockId!==$t&&(this._lockId=Xt)}serializeWorkerData(e){return this._handler?new Float32Array([]):null}}Jt.__counter__=0;class ei extends Jt{constructor(e={}){super(e),this._handler=null,this._src=e.src||null,this._image=e.image||null,this._scale=1,this._width=e.width||(e.size?e.size[0]:30),this._height=e.height||(e.size?e.size[1]:30)}setSrc(e){this._src=e;let t=this._handler;if(t&&e&&e.length){let i=t._entityCollection.renderNode;if(i&&i.renderer){let r=i.renderer.billboardsTextureAtlas,n=this;r.loadImage(e,(function(e){null!=e.__nodeIndex&&r.get(e.__nodeIndex)?(n._image=e,t.setTexCoordArr(n._handlerIndex,r.get(n._image.__nodeIndex).texCoords)):(r.addImage(e),r.createTexture(),n._image=e,i.updateBillboardsTexCoords())}))}}}getSrc(){return this._src}setImage(e){this.setSrc(e.src)}getImage(){return this._image}setSize(e,t){this._width=e,this._height=t,this._handler&&this._handler.setSizeArr(this._handlerIndex,e*this._scale,t*this._scale)}getSize(){return{width:this._width,height:this._height}}setWidth(e){this.setSize(e,this._height)}getWidth(){return this._width}setHeight(e){this.setSize(this._width,e)}getHeight(){return this._height}}const ti={POINT:1,LINESTRING:2,POLYGON:3,MULTIPOLYGON:4,MULTILINESTRING:5};class ii{constructor(e={}){this.__id=ii.__counter__++,this._entity=null,this._handler=null,this._handlerIndex=-1,this._polyVerticesHighMerc=[],this._polyVerticesLowMerc=[],this._polyVerticesLength=-1,this._polyIndexesLength=-1,this._polyVerticesHandlerIndex=-1,this._polyIndexesHandlerIndex=-1,this._lineVerticesHighMerc=[],this._lineVerticesLowMerc=[],this._lineVerticesLength=-1,this._lineOrdersLength=-1,this._lineIndexesLength=-1,this._lineColorsLength=-1,this._lineThicknessLength=-1,this._lineVerticesHandlerIndex=-1,this._lineOrdersHandlerIndex=-1,this._lineIndexesHandlerIndex=-1,this._lineThicknessHandlerIndex=-1,this._lineColorsHandlerIndex=-1,this._type=e.type&&ii.getType(e.type)||ti.POINT,this._coordinates=[],this._extent=ii.getExtent({type:e.type||"Point",coordinates:e.coordinates||[]},this._coordinates),e.style=e.style||{},this._style={fillColor:Ce(e.style.fillColor,new ne(.19,.62,.85,.4)),lineColor:Ce(e.style.lineColor,new ne(.19,.62,.85,1)),strokeColor:Ce(e.style.strokeColor,new ne(1,1,1,.95)),lineWidth:e.style.lineWidth||3,strokeWidth:e.style.strokeWidth||0},this._visibility=e.visibility||!0,this._pickingReady=!1}get id(){return this.__id}get type(){return this._type}static getType(e){return ti[e.toUpperCase()]}static getExtent(e,t){let i=new ie(new I(180,90),new I(-180,-90)),r=ii.getType(e.type);if(r===ti.POINT){let r=e.coordinates[0],n=e.coordinates[1];i.southWest.lon=r,i.southWest.lat=n,i.northEast.lon=r,i.northEast.lat=n,t&&(t[0]=r)&&(t[1]=n)}else if(r===ti.LINESTRING){let r=e.coordinates;for(let e=0;e<r.length;e++){let n=r[e][0],s=r[e][1];n<i.southWest.lon&&(i.southWest.lon=n),s<i.southWest.lat&&(i.southWest.lat=s),n>i.northEast.lon&&(i.northEast.lon=n),s>i.northEast.lat&&(i.northEast.lat=s),t&&(t[e]=[n,s])}}else if(r===ti.POLYGON){let r=e.coordinates;for(let e=0;e<r.length;e++){let n=r[e];t&&(t[e]=[]);for(let r=0;r<n.length;r++){let s=n[r],a=s[0],o=s[1];a<i.southWest.lon&&(i.southWest.lon=a),o<i.southWest.lat&&(i.southWest.lat=o),a>i.northEast.lon&&(i.northEast.lon=a),o>i.northEast.lat&&(i.northEast.lat=o),t&&(t[e][r]=[a,o])}}}else if(r===ti.MULTIPOLYGON){let r=e.coordinates;for(let e=0;e<r.length;e++){let n=r[e];t&&(t[e]=[]);for(let r=0;r<n.length;r++){let s=n[r];t&&(t[e][r]=[]);for(let n=0;n<s.length;n++){let a=s[n],o=a[0],l=a[1];o<i.southWest.lon&&(i.southWest.lon=o),l<i.southWest.lat&&(i.southWest.lat=l),o>i.northEast.lon&&(i.northEast.lon=o),l>i.northEast.lat&&(i.northEast.lat=l),t&&(t[e][r][n]=[o,l])}}}}else if(r===ti.MULTILINESTRING){let r=e.coordinates;for(let e=0;e<r.length;e++){let n=r[e];t&&(t[e]=[]);for(let r=0;r<n.length;r++){let s=n[r],a=s[0],o=s[1];a<i.southWest.lon&&(i.southWest.lon=a),o<i.southWest.lat&&(i.southWest.lat=o),a>i.northEast.lon&&(i.northEast.lon=a),o>i.northEast.lat&&(i.northEast.lat=o),t&&(t[e][r]=[a,o])}}}else i.southWest.lon=i.southWest.lat=i.northEast.lon=i.northEast.lat=0,t&&(t[0]=0)&&(t[1]=0);return i}setGeometry(e){let t=this._handler;return t&&(this.remove(),this._type=ii.getType(e.type||"Point"),this._extent=ii.getExtent(e,this._coordinates),t.add(this)),this}setFillColor(e,t,i,r=1){let n=this._style.fillColor;return(0===n.w&&0!==r||0!==n.w&&0===r)&&(this._pickingReady=!1),n.x=e,n.y=t,n.z=i,n.w=r,this._handler&&this._handler.setPolyColorArr(this,n),this}overlaps(e){return this._extent.overlaps(e)}setFillColor4v(e){return this.setFillColor(e.x,e.y,e.z,e.w)}setStrokeColor(e,t,i,r=1){let n=this._style.strokeColor;return(0===n.w&&0!==r||0!==n.w&&0===r)&&(this._pickingReady=!1),n.x=e,n.y=t,n.z=i,n.w=r,this._handler&&this._handler.setLineStrokeColorArr(this,n),this}setLineColor(e,t,i,r=1){let n=this._style.lineColor;return(0===n.w&&0!==r||0!==n.w&&0===r)&&(this._pickingReady=!1),n.x=e,n.y=t,n.z=i,n.w=r,this._handler&&this._handler.setLineColorArr(this,n),this}setStrokeColor4v(e){return this.setStrokeColor(e.x,e.y,e.z,e.w)}setLineColor4v(e){return this.setLineColor(e.x,e.y,e.z,e.w)}setStrokeOpacity(e){let t=this._style.strokeColor;return t.w=e,this.setStrokeColor(t.x,t.y,t.z,e)}setLineOpacity(e){let t=this._style.lineColor;return t.w=e,this.setLineColor(t.x,t.y,t.z,e)}setStrokeWidth(e){return this._style.strokeWidth=e,this._pickingReady=!1,this._handler&&this._handler.setLineStrokeArr(this,e),this}bringToFront(){return this._handler&&this._handler.bringToFront(this),this}setLineWidth(e){return this._style.lineWidth=e,this._pickingReady=!1,this._handler&&this._handler.setLineThicknessArr(this,e),this}setFillOpacity(e){let t=this._style.fillColor;return(0===t.w&&0!==e||0!==t.w&&0===e)&&(this._pickingReady=!1),t.w=e,this._handler&&this._handler.setPolyColorArr(this,t),this}setVisibility(e){return this._visibility=e,this._handler&&this._handler.setGeometryVisibility(this),this}getVisibility(){return this._visibility}remove(){this._handler&&this._handler.remove(this)}getExtent(){return this._extent.clone()}getType(){return this._type}}ii.__counter__=0;class ri{constructor(e=0,t=0,i=0){this.a=e,this.b=t,this.c=i}static get(e,t){return new ri(t.y-e.y,e.x-t.x,t.x*e.y-e.x*t.y)}static getParallel(e,t){return new ri(e.a,e.b,-e.a*t.x-e.b*t.y)}static getIntersection(e,t){let i=(t.b*e.c-e.b*t.c)/(e.b*t.a-t.b*e.a);return new le(i,-(e.c+e.a*i)/e.b)}intersects(e){return ri.getIntersection(this,e)}}class ni{constructor(e,t){this.p0=e||new oe,this.p1=t||new oe}getMagnitude(){return this.p0.distance(this.p1)}getSphereIntersection(e){let t=this.p0,i=this.p1,r=e.center.x,n=e.center.y,s=e.center.z,a=t.x,o=t.y,l=t.z,h=i.x-a,c=i.y-o,d=i.z-l,_=h*h+c*c+d*d,u=2*(a*h+o*c+l*d-h*r-c*n-d*s),f=u*u-4*_*(a*a-2*a*r+r*r+o*o-2*o*n+n*n+l*l-2*l*s+s*s-e.radius*e.radius);if(f<0)return[];let g=(-u-Math.sqrt(f))/(2*_),p=new oe(t.x*(1-g)+g*i.x,t.y*(1-g)+g*i.y,t.z*(1-g)+g*i.z);if(0==f)return[p];let m=(-u+Math.sqrt(f))/(2*_),v=new oe(t.x*(1-m)+m*i.x,t.y*(1-m)+m*i.y,t.z*(1-m)+m*i.z);return Math.abs(g-.5)<Math.abs(m-.5)?[p,v]:[v,p]}intersects(e,t,i){let r=this.p0.sub(e.p0),n=e.p1.sub(e.p0);if(Math.abs(n.x)<u&&Math.abs(n.y)<u&&Math.abs(n.z)<u)return!1;let s=this.p1.sub(this.p0);if(Math.abs(s.x)<u&&Math.abs(s.y)<u&&Math.abs(s.z)<u)return!1;let a=r.x*n.x+r.y*n.y+r.z*n.z,o=n.x*s.x+n.y*s.y+n.z*s.z,l=r.x*s.x+r.y*s.y+r.z*s.z,h=n.x*n.x+n.y*n.y+n.z*n.z,c=(s.x*s.x+s.y*s.y+s.z*s.z)*h-o*o;if(Math.abs(c)<u)return!1;let d=(a*o-l*h)/c;if(t.x=this.p0.x+d*s.x,t.y=this.p0.y+d*s.y,t.z=this.p0.z+d*s.z,i){let t=(a+o*d)/h;i.x=e.p0.x+t*n.x,i.y=e.p0.y+t*n.y,i.z=e.p0.z+t*n.z}return!0}getNearestDistancePoint(e,t){let i=this.p0,r=this.p1,n=this.getMagnitude(),s=((e.x-i.x)*(r.x-i.x)+(e.y-i.y)*(r.y-i.y)+(e.z-i.z)*(r.z-i.z))/(n*n);return t.x=i.x+s*(r.x-i.x),t.y=i.y+s*(r.y-i.y),t.z=i.z+s*(r.z-i.z),!(s<0||s>1)}}class si{constructor(e,t){this.p=e?e.clone():new oe,this.n=t?t.clone():this.p.normal()}set(e,t){this.p.copy(e),this.n.copy(t)}getNormal(){return this.n.clone()}distance(e){let t=this.getProjection(e);return e.distance(t)}getProjection(e,t){return oe.proj_b_to_plane(e,this.n,t)}getProjectionPoint(e,t){let i=e.sub(this.p),r=this.n,n=i.dot(r);return t?t.copy(r.scale(n)):t=r.scale(n),e.sub(t)}getIntersection(e,t,i){let r,n=e.n.cross(t.n),s=n.x>=0?n.x:-n.x,a=n.y>=0?n.y:-n.y,o=n.z>=0?n.z:-n.z;if(s+a+o<_){let i=t.p.sub(e.p);return 0==e.n.dot(i)?1:0}r=s>a?s>o?1:3:a>o?2:3;let l,h,c=new oe;return l=-e.n.dot(e.p),h=-t.n.dot(t.p),1===r?(c.x=0,c.y=(h*e.n.z-l*t.n.z)/n.x,c.z=(l*t.n.y-h*e.n.y)/n.x):2===r?(c.x=(l*t.n.z-h*e.n.z)/n.y,c.y=0,c.z=(h*e.n.x-l*t.n.x)/n.y):3===r&&(c.x=(h*e.n.y-l*t.n.y)/n.z,c.y=(l*t.n.x-h*e.n.x)/n.z,c.z=0),i.p0.copy(c),i.p1.copy(c.add(n)),2}}let ai=class e{constructor(e=oe.ZERO,t=oe.ZERO){this.origin=e,this.direction=t}static get OUTSIDE(){return 0}static get INSIDE(){return 1}static get INPLANE(){return 2}static get AWAY(){return 3}set(e,t){return this.origin=e,this.direction=t,this}getPoint(e){return oe.add(this.origin,this.direction.scaleTo(e))}hitTriangle(t,i,r,n){let s=i.sub(t),a=r.sub(t),o=s.cross(a),l=this.origin.sub(t),h=-o.dot(l),c=o.dot(this.direction);if(Math.abs(c)<u)return 0===h?(n.copy(this.origin),e.INPLANE):e.OUTSIDE;let d=h/c;if(n.copy(this.origin.add(this.direction.scaleTo(d))),d<0)return e.AWAY;let _=s.dot(s),f=s.dot(a),g=a.dot(a),p=n.sub(t),m=p.dot(s),v=p.dot(a),y=f*f-_*g,x=(f*v-g*m)/y;if(x<0||x>1)return e.OUTSIDE;let b=(f*m-_*v)/y;return b<0||x+b>1?e.OUTSIDE:e.INSIDE}hitPlane(t,i,r,n){let s=oe.sub(i,t),a=oe.sub(r,t),o=s.cross(a),l=oe.sub(this.origin,t),h=-o.dot(l),c=o.dot(this.direction);if(Math.abs(c)<u&&0===h)return e.OUTSIDE;let d=h/c;if(d<0)return e.OUTSIDE;let _=this.direction.scaleTo(d);return n.x=this.origin.x+_.x,n.y=this.origin.y+_.y,n.z=this.origin.z+_.z,e.INSIDE}hitSphere(e){let t=e.radius,i=e.center,r=this.origin,n=this.direction,s=oe.sub(i,r);if(s.dot(n)<0){var a=s.length();if(a>t)return null;if(a===t)return r.clone();let e=i.projToRay(r,s);var o=oe.sub(e,i).length();let l=Math.sqrt(t*t-o*o)-oe.sub(e,r).length();return oe.add(r,n.scaleTo(l))}{let a=i.projToRay(r,n);var l=oe.sub(i,a).length();if(l>e.radius)return null;{let e,i=Math.sqrt(t*t-l*l);return a.subA(r),e=s.length()>t?a.length()-i:a.length()+i,oe.add(r,n.scaleTo(e))}}}hitBox(e){}};class oi{constructor(e){this._handlerIndex=-1,this._tag=e.tag||"none",this.instanced=!0,this._entity=null,this._position=Te(e.position),this._positionHigh=new oe,this._positionLow=new oe,oe.doubleToTwoFloats(this._position,this._positionHigh,this._positionLow),this._pitch=e.pitch||0,this._yaw=e.yaw||0,this._roll=e.roll||0,this._scale=e.scale||1,this._color=Ce(e.color),this._direction=new oe(0,1,0),this._handler=null,this._handlerIndex=-1,this._tagData=null,this._tagDataIndex=-1,this._object3d=e.object3d,this._visibility=!0,this._qNorthFrame=new ae}get tag(){return this._tag}getPosition(){return this._position}getPitch(){return this._pitch}getYaw(){return this._yaw}getRoll(){return this._roll}getDirection(){return this._direction}get object3d(){return this._object3d}get vertices(){return this._object3d.vertices}get normals(){return this._object3d.normals}get texCoords(){return this._object3d.texCoords}get indices(){return this._object3d.indices}setOpacity(e){this._color.w=e,this.setColor(this._color.x,this._color.y,this._color.z,e)}setColor(e,t,i,r){this._color.x=e,this._color.y=t,this._color.z=i,null!=r&&(this._color.w=r),this._handler&&this._handler.setRgbaArr(this._tagData,this._tagDataIndex,this._color)}setColor4v(e){this._color.x=e.x,this._color.y=e.y,this._color.z=e.z,null!=e.w&&(this._color.w=e.w),this._handler&&this._handler.setRgbaArr(this._tagData,this._tagDataIndex,this._color)}setVisibility(e){this._visibility=e,this._handler&&this._handler.setVisibility(this._tagData,this._tagDataIndex,e)}getVisibility(){return this._visibility}setPosition(e,t,i){this._position.x=e,this._position.y=t,this._position.z=i,oe.doubleToTwoFloats(this._position,this._positionHigh,this._positionLow),this._handler&&this._handler.setPositionArr(this._tagData,this._tagDataIndex,this._positionHigh,this._positionLow),this.updateDirection()}setPosition3v(e){this._position.x=e.x,this._position.y=e.y,this._position.z=e.z,oe.doubleToTwoFloats(e,this._positionHigh,this._positionLow),this._handler&&this._handler.setPositionArr(this._tagData,this._tagDataIndex,this._positionHigh,this._positionLow),this.updateDirection()}setYaw(e){this._yaw=e,this.updateDirection()}setPitch(e){this._pitch=e,this._handler&&this._handler.setPitchRollArr(this._tagData,this._tagDataIndex,e,this._roll)}setRoll(e){this._roll=e,this._handler&&this._handler.setPitchRollArr(this._tagData,this._tagDataIndex,this._pitch,e)}setScale(e){this._scale=e,this._handler&&this._handler.setScaleArr(this._tagData,this._tagDataIndex,e)}getScale(){return this._scale}remove(){this._entity=null,this._handler&&this._handler.remove(this)}setPickingColor3v(e){this._handler&&this._handler.setPickingColorArr(this._tagData,this._tagDataIndex,e)}updateDirection(){if(this._handler&&this._handler._planet){this._qNorthFrame=this._handler._planet.getNorthFrameRotation(this._position);let e=ae.yRotation(this._yaw).mul(this._qNorthFrame).conjugate();this._direction=e.mulVec3(new oe(0,0,-1)).normalize(),this._handler.setDirectionArr(this._tagData,this._tagDataIndex,this._direction)}}}const li=0,hi=2,ci={left:1,right:li,center:hi};class di extends Jt{constructor(e={}){super(e),this._handler=null,this._text=e.text||"",this._face=we(e.face,"arial"),this._size=e.size||24,this._outline=null!=e.outline?e.outline:0,this._outlineColor=Ce(e.outlineColor,new ne(0,0,0,1)),this._align=e.align&&ci[e.align.trim().toLowerCase()]||li,this._fontIndex=0,this._fontAtlas=null,this._isRTL=e.isRTL||!1}setText(e){this._text=e.toString(),this._isReady&&this._handler&&this._handler.setText(this._handlerIndex,e,this._fontIndex,this._align,this._isRTL)}getText(){return this._text}setAlign(e){this._align=ci[e.trim().toLowerCase()],this._isReady&&this._handler?this._handler.setText(this._handlerIndex,this._text,this._fontIndex,this._align,this._isRTL):this._lockId!==$t&&(this._lockId=Xt)}getAlign(){return this._align}setFace(e){this._face=e.trim().toLowerCase(),this.update()}getFace(){return this._face}setSize(e){e!==this._size&&(this._size=e,this._isReady&&this._handler?this._handler.setSizeArr(this._handlerIndex,e):this._lockId!==$t&&(this._lockId=Xt))}getSize(){return this._size}setOutline(e){this._outline=e,this._isReady&&this._handler?this._handler.setOutlineArr(this._handlerIndex,e):this._lockId!==$t&&(this._lockId=Xt)}getOutline(){return this._outline}setOpacity(e){super.setOpacity(e),this.setOutlineOpacity(e)}setOutlineColor(e,t,i,r){r===this._outlineColor.w&&e===this._outlineColor.x&&t===this._outlineColor.y&&i===this._outlineColor.z||(this._outlineColor.x=e,this._outlineColor.y=t,this._outlineColor.z=i,this._outlineColor.w=r,this._isReady&&this._handler?this._handler.setOutlineColorArr(this._handlerIndex,this._outlineColor):this._lockId!==$t&&(this._lockId=Xt))}setOutlineColor4v(e){this.setOutlineColor(e.x,e.y,e.z,e.w)}setOutlineColorHTML(e){this.setOutlineColor4v(pe(e))}getOutlineColor(){return this._outlineColor}setOutlineOpacity(e){e!==this._outlineColor.w&&(this._outlineColor.w=e,this._isReady&&this._handler?this._handler.setOutlineColorArr(this._handlerIndex,this._outlineColor):this._lockId!==$t&&(this._lockId=Xt))}getOutlineOpacity(){return this._outlineColor.w}async update(){if(this._fontAtlas){const e=await this._fontAtlas.getFontIndex(this._face);this._applyFontIndex(e)}}_applyFontIndex(e){this._fontIndex=e,this._isReady&&this._handler?(this._handler.setFontIndexArr(this._handlerIndex,this._fontIndex),this._handler.setText(this._handlerIndex,this._text,this._fontIndex,this._align,this._isRTL)):this._lockId!==$t&&(this._lockId=Xt)}assignFontAtlas(e){this._fontAtlas||(this._fontAtlas=e),this.update()}serializeWorkerData(e){return this._handler?new Float32Array([e,this._handler._maxLetters,this.getVisibility()?1:0,this._positionHigh.x,this._positionHigh.y,this._positionHigh.z,this._positionLow.x,this._positionLow.y,this._positionLow.z,this._size,this._offset.x,this._offset.y,this._offset.z,this._color.x,this._color.y,this._color.z,this._color.w,this._rotation,this._alignedAxis.x,this._alignedAxis.y,this._alignedAxis.z,this._fontIndex,this._outline,this._outlineColor.x,this._outlineColor.y,this._outlineColor.z,this._outlineColor.w,this._entity._pickingColor.x,this._entity._pickingColor.y,this._entity._pickingColor.z]):null}}class _i{constructor(e={}){this.__id=_i.__counter__++,this.visibility=null==e.visibility||e.visibility,this.pointSize=e.pointSize||3,this.pickingScale=e.pickingScale||0,this._renderNode=null,this._entity=null,this._points=[],this._coordinatesData=[],this._colorData=[],this._pickingColorData=[],this._coordinatesBuffer=null,this._colorBuffer=null,this._pickingColorBuffer=null,this._handler=null,this._handlerIndex=-1,this._buffersUpdateCallbacks=[],this._buffersUpdateCallbacks[0]=this._createCoordinatesBuffer,this._buffersUpdateCallbacks[1]=this._createColorBuffer,this._buffersUpdateCallbacks[2]=this._createPickingColorBuffer,this._changedBuffers=new Array(this._buffersUpdateCallbacks.length),e.points&&this.setPoints(e.points)}clear(){this._points.length=0,this._points=[],this._coordinatesData.length=0,this._coordinatesData=[],this._colorData.length=0,this._colorData=[],this._pickingColorData.length=0,this._pickingColorData=[],this._deleteBuffers()}setVisibility(e){this.visibility=e}getVisibility(){return this.visibility}setRenderNode(e){this._renderNode=e,this._setPickingColors()}remove(){this._entity=null,this._handler&&this._handler.remove(this)}setPoints(e){this.clear();for(let t=0;t<e.length;t++){let i=e[t],r=new oe(i[0],i[1],i[2]),n=new ne(i[3],i[4],i[5],null==i[6]?255:i[6]);this._coordinatesData.push(r.x,r.y,r.z),this._colorData.push(n.x/255,n.y/255,n.z/255,n.w/255);let s={_entity:this._entity,_pickingColor:new oe,_entityCollection:this._entity?this._entity._entityCollection:null,index:t,position:r,color:n,pointCloud:this,properties:i[7]||{}};this._points.push(s),this._renderNode&&this._renderNode.renderer&&(this._renderNode.renderer.assignPickingColor(s),this._pickingColorData.push(s._pickingColor.x/255,s._pickingColor.y/255,s._pickingColor.z/255,1))}this._changedBuffers[0]=!0,this._changedBuffers[1]=!0,this._changedBuffers[2]=!0}setPointPosition(e,t,i,r){this._changedBuffers[0]=!0}setPointColor(e,t,i,r,n){this._changedBuffers[1]=!0}addPoints(e){this._changedBuffers[0]=!0,this._changedBuffers[1]=!0,this._changedBuffers[2]=!0}addPoint(e,t){this._changedBuffers[0]=!0,this._changedBuffers[1]=!0,this._changedBuffers[2]=!0}getPoint(e){return this._points[e]}removePoint(e){this._changedBuffers[0]=!0,this._changedBuffers[1]=!0,this._changedBuffers[2]=!0}insertPoint(e,t){this._changedBuffers[0]=!0,this._changedBuffers[1]=!0,this._changedBuffers[2]=!0}draw(){if(this.visibility&&this._coordinatesData.length){this._update();let e=this._renderNode.renderer,t=e.handler.programs.pointCloud,i=t._program,r=e.handler.gl,n=i.attributes,s=i.uniforms;t.activate(),r.uniformMatrix4fv(s.projectionViewMatrix,!1,e.activeCamera.getProjectionViewMatrix()),r.uniform1f(s.opacity,this._handler._entityCollection._fadingOpacity),r.uniform1f(s.pointSize,this.pointSize),r.bindBuffer(r.ARRAY_BUFFER,this._coordinatesBuffer),r.vertexAttribPointer(n.coordinates,this._coordinatesBuffer.itemSize,r.FLOAT,!1,0,0),r.bindBuffer(r.ARRAY_BUFFER,this._colorBuffer),r.vertexAttribPointer(n.colors,this._colorBuffer.itemSize,r.FLOAT,!1,0,0),r.drawArrays(r.POINTS,0,this._coordinatesBuffer.numItems)}}drawPicking(){if(this.visibility&&this._coordinatesData.length){let e=this._renderNode.renderer,t=e.handler.programs.pointCloud,i=t._program,r=e.handler.gl,n=i.attributes,s=i.uniforms;t.activate(),r.uniformMatrix4fv(s.projectionViewMatrix,!1,e.activeCamera.getProjectionViewMatrix()),r.uniform1f(s.opacity,this._handler._entityCollection._fadingOpacity),r.uniform1f(s.pointSize,this.pointSize+this.pickingScale),r.bindBuffer(r.ARRAY_BUFFER,this._coordinatesBuffer),r.vertexAttribPointer(n.coordinates,this._coordinatesBuffer.itemSize,r.FLOAT,!1,0,0),r.bindBuffer(r.ARRAY_BUFFER,this._pickingColorBuffer),r.vertexAttribPointer(n.colors,this._pickingColorBuffer.itemSize,r.FLOAT,!1,0,0),r.drawArrays(r.POINTS,0,this._coordinatesBuffer.numItems)}}_update(){if(this._renderNode){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]&&(this._buffersUpdateCallbacks[e].call(this),this._changedBuffers[e]=!1)}}_deleteBuffers(){if(this._renderNode){let e=this._renderNode.renderer.handler.gl;e.deleteBuffer(this._coordinatesBuffer),e.deleteBuffer(this._colorBuffer),e.deleteBuffer(this._pickingColorBuffer)}this._coordinatesBuffer=null,this._colorBuffer=null,this._pickingColorBuffer=null}_createCoordinatesBuffer(){let e=this._renderNode.renderer.handler;e.gl.deleteBuffer(this._coordinatesBuffer),this._coordinatesBuffer=e.createArrayBuffer(new Float32Array(this._coordinatesData),3,this._coordinatesData.length/3)}_createColorBuffer(){let e=this._renderNode.renderer.handler;e.gl.deleteBuffer(this._colorBuffer),this._colorBuffer=e.createArrayBuffer(new Float32Array(this._colorData),4,this._colorData.length/4)}_createPickingColorBuffer(){let e=this._renderNode.renderer.handler;e.gl.deleteBuffer(this._pickingColorBuffer),this._pickingColorBuffer=e.createArrayBuffer(new Float32Array(this._pickingColorData),4,this._pickingColorData.length/4)}_setPickingColors(){if(this._renderNode&&this._renderNode.renderer){for(let e=0;e<this._points.length;e++){let t=this._points[e];t._entity=this._entity,t._entityCollection=this._entity._entityCollection,this._renderNode.renderer.assignPickingColor(t),this._pickingColorData.push(t._pickingColor.x/255,t._pickingColor.y/255,t._pickingColor.z/255,1)}this._changedBuffers[2]=!0}}}_i.__counter__=0;class ui{constructor(e={}){this.__id=ui.__counter__++,this.altitude=e.altitude||0,this.thickness=e.thickness||1.5,this._opacity=null!=e.opacity?e.opacity:1,this._defaultColor=me(e.color||"#0000FF",e.opacity),this.visibility=null==e.visibility||e.visibility,this._closedLine=e.isClosed||!1,this._path3v=[],this._pathLengths=[],this._pathLonLat=[],this._pathLonLatMerc=[],this._pathColors=e.pathColors?We(e.pathColors):[],this._extent=new ie,this._verticesHigh=[],this._verticesLow=[],this._orders=[],this._indexes=[],this._colors=[],this._verticesHighBuffer=null,this._verticesLowBuffer=null,this._ordersBuffer=null,this._indexesBuffer=null,this._colorsBuffer=null,this._pickingColor=[0,0,0],this._renderNode=null,this._entity=null,this._handler=null,this._handlerIndex=-1,this._buffersUpdateCallbacks=[],this._buffersUpdateCallbacks[0]=this._createVerticesBuffer,this._buffersUpdateCallbacks[1]=this._createIndexBuffer,this._buffersUpdateCallbacks[2]=this._createColorsBuffer,this._changedBuffers=new Array(this._buffersUpdateCallbacks.length),e.pathLonLat?this.setPathLonLat(e.pathLonLat):e.path3v&&this.setPath3v(e.path3v),this._refresh()}static appendLineData3v(e,t,i,r,n,s,a,o,l,h,c,d,_,u){var f=0,g=new oe,p=new oe;_&&(_.southWest.set(180,90),_.northEast.set(-180,-90)),o.length>0?(f=o[o.length-5]+9,o.push(f,f)):o.push(0,0);for(let A=0,E=e.length;A<E;A++){var m=e[A],v=t[A];if(h[A]=[],d[A]=[],c[A]=[],0===m.length)continue;var y,x=f;if(r)(y=m[m.length-1])instanceof Array&&(y=new oe(y[0],y[1],y[2]));else{var b=m[0],w=m[1]||b;b instanceof Array&&(b=new oe(b[0],b[1],b[2])),w instanceof Array&&(w=new oe(w[0],w[1],w[2])),y=new oe(b.x+b.x-w.x,b.y+b.y-w.y,b.z+b.z-w.z)}let E=i;v&&v[0]&&(E=v[0]),oe.doubleToTwoFloats(y,g,p),n.push(g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z),s.push(p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z);let P=E[0],M=E[1],S=E[2],B=null!=E[3]?E[3]:1;A>0&&u.push(P,M,S,B,P,M,S,B,P,M,S,B,P,M,S,B),a.push(1,-1,2,-2);for(let e=0,t=m.length;e<t;e++){var T=m[e];if(T instanceof Array&&(T=new oe(T[0],T[1],T[2])),c[A].push(T),l){var C=l.cartesianToLonLat(T);h[A].push(C),d[A].push(C.forwardMercator()),C.lon<_.southWest.lon&&(_.southWest.lon=C.lon),C.lat<_.southWest.lat&&(_.southWest.lat=C.lat),C.lon>_.northEast.lon&&(_.northEast.lon=C.lon),C.lat>_.northEast.lat&&(_.northEast.lat=C.lat)}v&&v[e]&&(E=v[e]),P=E[0],M=E[1],S=E[2],B=null!=E[3]?E[3]:1,oe.doubleToTwoFloats(T,g,p),n.push(g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z),s.push(p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z),u.push(P,M,S,B,P,M,S,B,P,M,S,B,P,M,S,B),a.push(1,-1,2,-2),o.push(f++,f++,f++,f++)}var L;if(r)(L=m[0])instanceof Array&&(L=new oe(L[0],L[1],L[2])),o.push(x,x+1,x+1,x+1);else{let e=m[m.length-1],t=m[m.length-2]||e;e instanceof Array&&(e=new oe(e[0],e[1],e[2])),t instanceof Array&&(t=new oe(t[0],t[1],t[2])),L=new oe(e.x+e.x-t.x,e.y+e.y-t.y,e.z+e.z-t.z),o.push(f-1,f-1,f-1,f-1)}v&&v[m.length-1]&&(E=v[m.length-1]),P=E[0],M=E[1],S=E[2],B=null!=E[3]?E[3]:1,oe.doubleToTwoFloats(L,g,p),n.push(g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z),s.push(p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z),u.push(P,M,S,B,P,M,S,B,P,M,S,B,P,M,S,B),a.push(1,-1,2,-2),A<e.length-1&&0!==e[A+1].length&&(f+=8,o.push(f,f))}}static appendPoint3v(e,t,i,r,n,s,a,o,l,h,c,d,_,u){var f=new oe,g=new oe,p=h.length-4,m=h[p-1]+1;0===e.length?(e.push([]),i[0]||(i[0]=[])):i[e.length-1]||(i[e.length-1]=[]);var v=e[e.length-1],y=v.length;v.push(t);let x=r[0],b=r[1],w=r[2],T=null!=r[3]?r[3]:1,C=i[e.length-1];if(C[y]?(C[y][0]=x,C[y][1]=b,C[y][2]=w,C[y][3]=T):C.push(r),1===y){var L;if(n)(L=v[y-1])instanceof Array&&(L=new oe(L[0],L[1],L[2]));else{let e=v[0],t=v[1]||e;e instanceof Array&&(e=new oe(e[0],e[1],e[2])),t instanceof Array&&(t=new oe(t[0],t[1],t[2])),L=new oe(e.x+e.x-t.x,e.y+e.y-t.y,e.z+e.z-t.z)}oe.doubleToTwoFloats(L,f,g);let e=s.length-36;s[e]=f.x,s[e+1]=f.y,s[e+2]=f.z,s[e+3]=f.x,s[e+4]=f.y,s[e+5]=f.z,s[e+6]=f.x,s[e+7]=f.y,s[e+8]=f.z,s[e+9]=f.x,s[e+10]=f.y,s[e+11]=f.z,a[e]=g.x,a[e+1]=g.y,a[e+2]=g.z,a[e+3]=g.x,a[e+4]=g.y,a[e+5]=g.z,a[e+6]=g.x,a[e+7]=g.y,a[e+8]=g.z,a[e+9]=g.x,a[e+10]=g.y,a[e+11]=g.z}var A=m;if(c){0===d.length&&d.push([]),0===_.length&&_.push([]);var E=d[d.length-1],P=_[_.length-1];let e=c.cartesianToLonLat(t);E.push(e),P.push(e.forwardMercator()),e.lon<u.southWest.lon&&(u.southWest.lon=e.lon),e.lat<u.southWest.lat&&(u.southWest.lat=e.lat),e.lon>u.northEast.lon&&(u.northEast.lon=e.lon),e.lat>u.northEast.lat&&(u.northEast.lat=e.lat)}oe.doubleToTwoFloats(t,f,g);let M=s.length-12;s[M]=f.x,s[M+1]=f.y,s[M+2]=f.z,s[M+3]=f.x,s[M+4]=f.y,s[M+5]=f.z,s[M+6]=f.x,s[M+7]=f.y,s[M+8]=f.z,s[M+9]=f.x,s[M+10]=f.y,s[M+11]=f.z,a[M]=g.x,a[M+1]=g.y,a[M+2]=g.z,a[M+3]=g.x,a[M+4]=g.y,a[M+5]=g.z,a[M+6]=g.x,a[M+7]=g.y,a[M+8]=g.z,a[M+9]=g.x,a[M+10]=g.y,a[M+11]=g.z;let S=o.length-16;var B;if(o[S]=x,o[S+1]=b,o[S+2]=w,o[S+3]=T,o[S+4]=x,o[S+5]=b,o[S+6]=w,o[S+7]=T,o[S+8]=x,o[S+9]=b,o[S+10]=w,o[S+11]=T,o[S+12]=x,o[S+13]=b,o[S+14]=w,o[S+15]=T,h[p]=m++,h[p+1]=m++,h[p+2]=m++,h[p+3]=m++,n)B=v[0],h.push(A,A+1,A+1,A+1);else{let e=v[v.length-1],t=v[v.length-2]||e;B=new oe(e.x+e.x-t.x,e.y+e.y-t.y,e.z+e.z-t.z),h.push(m-1,m-1,m-1,m-1)}oe.doubleToTwoFloats(B,f,g),s.push(f.x,f.y,f.z,f.x,f.y,f.z,f.x,f.y,f.z,f.x,f.y,f.z),a.push(g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z),o.push(x,b,w,T,x,b,w,T,x,b,w,T,x,b,w,T),l.push(1,-1,2,-2)}static appendLineDataLonLat(e,t,i,r,n,s,a,o,l,h,c,d,_,u){var f=0,g=new oe,p=new oe;_&&(_.southWest.set(180,90),_.northEast.set(-180,-90)),o.length>0?(f=o[o.length-5]+9,o.push(f,f)):o.push(0,0);for(let C=0,L=e.length;C<L;C++){var m=e[C],v=t[C];if(h[C]=[],d[C]=[],c[C]=[],0===m.length)continue;var y,x=f;if(r){let e=m[m.length-1];y=e instanceof Array?l.lonLatToCartesian(new I(e[0],e[1],e[2])):l.lonLatToCartesian(e)}else{let e,t,i=m[0];e=i instanceof Array?l.lonLatToCartesian(new I(i[0],i[1],i[2])):l.lonLatToCartesian(i),i=m[1],i||(i=m[0]),t=i instanceof Array?l.lonLatToCartesian(new I(i[0],i[1],i[2])):l.lonLatToCartesian(i),y=new oe(e.x+e.x-t.x,e.y+e.y-t.y,e.z+e.z-t.z)}let L=i;v&&v[0]&&(L=v[0]),oe.doubleToTwoFloats(y,g,p),n.push(g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z),s.push(p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z);let A=L[0],E=L[1],P=L[2],M=null!=L[3]?L[3]:1;C>0&&u.push(A,E,P,M,A,E,P,M,A,E,P,M,A,E,P,M),a.push(1,-1,2,-2);for(let e=0,t=m.length;e<t;e++){var b=m[e];b instanceof Array&&(b=new I(b[0],b[1],b[2])),v&&v[e]&&(L=v[e]),A=L[0],E=L[1],P=L[2],M=null!=L[3]?L[3]:1;var w=l.lonLatToCartesian(b);h[C].push(w),c[C].push(b),d[C].push(b.forwardMercator()),oe.doubleToTwoFloats(w,g,p),n.push(g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z),s.push(p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z),u.push(A,E,P,M,A,E,P,M,A,E,P,M,A,E,P,M),a.push(1,-1,2,-2),o.push(f++,f++,f++,f++),b.lon<_.southWest.lon&&(_.southWest.lon=b.lon),b.lat<_.southWest.lat&&(_.southWest.lat=b.lat),b.lon>_.northEast.lon&&(_.northEast.lon=b.lon),b.lat>_.northEast.lat&&(_.northEast.lat=b.lat)}var T;if(r){let e=m[0];T=e instanceof Array?l.lonLatToCartesian(new I(e[0],e[1],e[2])):l.lonLatToCartesian(e),o.push(x,x+1,x+1,x+1)}else{let e,t,i=m[m.length-1];e=i instanceof Array?l.lonLatToCartesian(new I(i[0],i[1],i[2])):l.lonLatToCartesian(i),i=m[m.length-2],i||(i=m[0]),t=i instanceof Array?l.lonLatToCartesian(new I(i[0],i[1],i[2])):l.lonLatToCartesian(i),T=new oe(e.x+e.x-t.x,e.y+e.y-t.y,e.z+e.z-t.z),o.push(f-1,f-1,f-1,f-1)}v&&v[m.length-1]&&(L=v[m.length-1]),A=L[0],E=L[1],P=L[2],M=null!=L[3]?L[3]:1,oe.doubleToTwoFloats(T,g,p),n.push(g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z,g.x,g.y,g.z),s.push(p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z,p.x,p.y,p.z),u.push(A,E,P,M,A,E,P,M,A,E,P,M,A,E,P,M),a.push(1,-1,2,-2),C<e.length-1&&0!==e[C+1].length&&(f+=8,o.push(f,f))}}_setEqualPath3v(e){var t=this._extent;t.southWest.set(180,90),t.northEast.set(-180,-90);var i=new oe,r=new oe,n=this._verticesHigh,s=this._verticesLow,a=this._pathLonLat,o=this._pathLonLatMerc,l=0,h=this._renderNode.ellipsoid;for(let m=0;m<e.length;m++){var c,d,_=e[m];c=this._closedLine?_[_.length-1]:new oe(_[0].x+_[0].x-_[1].x,_[0].y+_[0].y-_[1].y,_[0].z+_[0].z-_[1].z),oe.doubleToTwoFloats(c,i,r),n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z,n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z,n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z,n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z;for(let e=0;e<_.length;e++){var u=_[e],f=this._path3v[m][e];if(f.x=u.x,f.y=u.y,f.z=u.z,h){var g=h.cartesianToLonLat(u);this._pathLonLat[m][e]=g,a[m][e]=g,o[m][e]=g.forwardMercator(),g.lon<t.southWest.lon&&(t.southWest.lon=g.lon),g.lat<t.southWest.lat&&(t.southWest.lat=g.lat),g.lon>t.northEast.lon&&(t.northEast.lon=g.lon),g.lat>t.northEast.lat&&(t.northEast.lat=g.lat)}oe.doubleToTwoFloats(u,i,r),n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z,n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z,n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z,n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z}if(this._closedLine)d=_[0];else{var p=_.length-1;d=new oe(_[p].x+_[p].x-_[p-1].x,_[p].y+_[p].y-_[p-1].y,_[p].z+_[p].z-_[p-1].z)}oe.doubleToTwoFloats(d,i,r),n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z,n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z,n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z,n[l]=i.x,s[l++]=r.x,n[l]=i.y,s[l++]=r.y,n[l]=i.z,s[l++]=r.z}}_setEqualPathLonLat(e){var t=this._extent;t.southWest.set(180,90),t.northEast.set(-180,-90);var i=new oe,r=new oe,n=this._verticesHigh,s=this._verticesLow,a=this._pathLonLat,o=this._pathLonLatMerc,l=this._path3v,h=0,c=this._renderNode.ellipsoid;for(let p=0;p<e.length;p++){var d,_,u=e[p];if(this._closedLine)d=c.lonLatToCartesian(u[u.length-1]);else{let e=c.lonLatToCartesian(u[0]),t=c.lonLatToCartesian(u[1]);d=new oe(e.x+e.x-t.x,e.y+e.y-t.y,e.z+e.z-t.z)}oe.doubleToTwoFloats(d,i,r),n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z;for(let e=0;e<u.length;e++){var f=u[e],g=c.lonLatToCartesian(f);l[p][e]=g,o[p][e]=f.forwardMercator(),a[p][e]=f,oe.doubleToTwoFloats(g,i,r),n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,f.lon<t.southWest.lon&&(t.southWest.lon=f.lon),f.lat<t.southWest.lat&&(t.southWest.lat=f.lat),f.lon>t.northEast.lon&&(t.northEast.lon=f.lon),f.lat>t.northEast.lat&&(t.northEast.lat=f.lat)}if(this._closedLine)_=c.lonLatToCartesian(u[0]);else{let e=c.lonLatToCartesian(u[u.length-1]),t=c.lonLatToCartesian(u[u.length-2]);_=new oe(e.x+e.x-t.x,e.y+e.y-t.y,e.z+e.z-t.z)}oe.doubleToTwoFloats(_,i,r),n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z,n[h]=i.x,s[h++]=r.x,n[h]=i.y,s[h++]=r.y,n[h]=i.z,s[h++]=r.z}}setPointLonLat(e,t,i){if(this._renderNode&&this._renderNode.ellipsoid){let o=this._pathLonLat,l=this._pathLonLatMerc;o[i][t]=e,l[i][t]=e.forwardMercator();var r=this._extent;r.southWest.set(180,90),r.northEast.set(-180,-90);for(let e=0;e<o.length;e++){var n=o[e];for(let e=0;e<n.length;e++){var s=n[e].lon,a=n[e].lat;s>r.northEast.lon&&(r.northEast.lon=s),a>r.northEast.lat&&(r.northEast.lat=a),s<r.southWest.lon&&(r.southWest.lon=s),a<r.southWest.lat&&(r.southWest.lat=a)}}this.setPoint3v(this._renderNode.ellipsoid.lonLatToCartesian(e),t,i,!0)}else{let r=this._pathLonLat[i];r[t].lon=e.lon,r[t].lat=e.lat,r[t].height=e.height}}setPoint3v(e,t=0,i=0,r=!1){if(this._renderNode){var n,s=new oe,a=new oe,o=this._verticesHigh,l=this._verticesLow,h=this._pathLonLat,c=this._pathLonLatMerc,d=0;n=12*this._pathLengths[i]+24*i;let x=this._path3v[i];x[t].x=e.x,x[t].y=e.y,x[t].z=e.z;let b=this._closedLine||1===x.length;var _;if(0===t||1===t)_=b?x[x.length-1]:new oe(x[0].x+x[0].x-x[1].x,x[0].y+x[0].y-x[1].y,x[0].z+x[0].z-x[1].z),d=n,oe.doubleToTwoFloats(_,s,a),o[d]=s.x,o[d+1]=s.y,o[d+2]=s.z,o[d+3]=s.x,o[d+4]=s.y,o[d+5]=s.z,o[d+6]=s.x,o[d+7]=s.y,o[d+8]=s.z,o[d+9]=s.x,o[d+10]=s.y,o[d+11]=s.z,l[d]=a.x,l[d+1]=a.y,l[d+2]=a.z,l[d+3]=a.x,l[d+4]=a.y,l[d+5]=a.z,l[d+6]=a.x,l[d+7]=a.y,l[d+8]=a.z,l[d+9]=a.x,l[d+10]=a.y,l[d+11]=a.z;if(!r&&this._renderNode.ellipsoid){var u=this._renderNode.ellipsoid.cartesianToLonLat(e);h[i][t]=u,c[i][t]=u.forwardMercator();var f=this._extent;f.southWest.set(180,90),f.northEast.set(-180,-90);for(let e=0;e<h.length;e++){var g=h[e];for(let e=0;e<g.length;e++){var p=g[e].lon,m=g[e].lat;p>f.northEast.lon&&(f.northEast.lon=p),m>f.northEast.lat&&(f.northEast.lat=m),p<f.southWest.lon&&(f.southWest.lon=p),m<f.southWest.lat&&(f.southWest.lat=m)}}}if(d=n+12*t+12,oe.doubleToTwoFloats(e,s,a),o[d]=s.x,o[d+1]=s.y,o[d+2]=s.z,o[d+3]=s.x,o[d+4]=s.y,o[d+5]=s.z,o[d+6]=s.x,o[d+7]=s.y,o[d+8]=s.z,o[d+9]=s.x,o[d+10]=s.y,o[d+11]=s.z,l[d]=a.x,l[d+1]=a.y,l[d+2]=a.z,l[d+3]=a.x,l[d+4]=a.y,l[d+5]=a.z,l[d+6]=a.x,l[d+7]=a.y,l[d+8]=a.z,l[d+9]=a.x,l[d+10]=a.y,l[d+11]=a.z,t===x.length-1||t===x.length-2){var v;if(b)v=x[0];else{var y=x.length-1;v=new oe(x[y].x+x[y].x-x[y-1].x,x[y].y+x[y].y-x[y-1].y,x[y].z+x[y].z-x[y-1].z)}d=n+12*x.length+12,oe.doubleToTwoFloats(v,s,a),o[d]=s.x,o[d+1]=s.y,o[d+2]=s.z,o[d+3]=s.x,o[d+4]=s.y,o[d+5]=s.z,o[d+6]=s.x,o[d+7]=s.y,o[d+8]=s.z,o[d+9]=s.x,o[d+10]=s.y,o[d+11]=s.z,l[d]=a.x,l[d+1]=a.y,l[d+2]=a.z,l[d+3]=a.x,l[d+4]=a.y,l[d+5]=a.z,l[d+6]=a.x,l[d+7]=a.y,l[d+8]=a.z,l[d+9]=a.x,l[d+10]=a.y,l[d+11]=a.z}this._changedBuffers[0]=!0}else{let r=this._path3v[i];r[t].x=e.x,r[t].y=e.y,r[t].z=e.z}}_resizePathLengths(e=0){this._pathLengths[0]=0;for(let t=e+1,i=this._path3v.length;t<=i;t++)this._pathLengths[t]=this._pathLengths[t-1]+this._path3v[t-1].length}removeSegment(e){this._path3v.splice(e,1),this.setPath3v([].concat(this._path3v))}removePoint(e,t=0){this._path3v[t].splice(e,1),0===this._path3v[t].length&&this._path3v.splice(t,1),this.setPath3v([].concat(this._path3v))}insertPoint3v(e,t=0,i,r=0){let n=[].concat(this._path3v),s=n[r];if(s){let a=[].concat(this._pathColors);if(s.splice(t,0,e),i){let e=a[r];e||(e=new Array(s.length)),e.splice(t,0,i)}this.setPath3v(n,a)}else this.addPoint3v(e,r)}appendPoint3v(e,t,i){0===this._path3v.length?(this._pathColors.push([t||this._defaultColor]),this.addPoint3v(e)):(this._verticesHigh=Ne(this._verticesHigh),this._verticesLow=Ne(this._verticesLow),this._colors=Ne(this._colors),this._orders=Ne(this._orders),this._indexes=Ne(this._indexes),ui.appendPoint3v(this._path3v,e,this._pathColors,t||this._defaultColor,this._closedLine,this._verticesHigh,this._verticesLow,this._colors,this._orders,this._indexes,i?null:this._renderNode.ellipsoid,this._pathLonLat,this._pathLonLatMerc,this._extent),this._pathLengths[this._path3v.length]+=1,this._changedBuffers[0]=!0,this._changedBuffers[2]=!0,this._changedBuffers[1]=!0)}addPoint3v(e,t=0){t>=this._path3v.length&&this._path3v.push([]),this._path3v[t].push(e),this.setPath3v([].concat(this._path3v))}addPointLonLat(e,t=0){t>=this._pathLonLat.length&&this._pathLonLat.push([]),this._pathLonLat[t].push(e),this.setPathLonLat([].concat(this._pathLonLat))}clear(){this._clearData()}setPointColor(e,t=0,i=0){if(this._renderNode&&t<this._path3v[i].length){let r=this._pathColors[i];if(!r){if(!(this._path3v[i]&&t<this._path3v[i].length))return;this._pathColors[i]=new Array(this._path3v[i].length)}r[t]?(r[t][0]=e[0],r[t][1]=e[1],r[t][2]=e[2],r[t][3]=e[3]||1):r[t]=[e[0],e[1],e[2],e[3]||1];let n=this._colors,s=16*t+16*this._pathLengths[i]+32*i;n[s]=n[s+4]=n[s+8]=n[s+12]=e[0],n[s+1]=n[s+5]=n[s+9]=n[s+13]=e[1],n[s+2]=n[s+6]=n[s+10]=n[s+14]=e[2],n[s+3]=n[s+7]=n[s+11]=n[s+15]=e[3]||1,this._changedBuffers[2]=!0}else{this._pathColors[i][t]=e}}setOpacity(e){this._opacity=e}setThickness(e){this.thickness=e}getThickness(){return this.thickness}setVisibility(e){this.visibility=e}getVisibility(){return this.visibility}setRenderNode(e){e&&(this._renderNode=e,this._pathLonLat.length?this._createDataLonLat([].concat(this._pathLonLat)):this._createData3v([].concat(this._path3v)),this._refresh(),e.renderer&&e.renderer.isInitialized()&&this._update())}_clearData(){this._verticesHigh=null,this._verticesLow=null,this._orders=null,this._indexes=null,this._colors=null,this._verticesHigh=[],this._verticesLow=[],this._orders=[],this._indexes=[],this._colors=[],this._path3v.length=0,this._pathLonLat.length=0,this._pathLonLatMerc.length=0,this._path3v=[],this._pathLonLat=[],this._pathLonLatMerc=[]}_createData3v(e){this._clearData(),ui.appendLineData3v(e,this._pathColors,this._defaultColor,this._closedLine,this._verticesHigh,this._verticesLow,this._orders,this._indexes,this._renderNode.ellipsoid,this._pathLonLat,this._path3v,this._pathLonLatMerc,this._extent,this._colors),this._resizePathLengths(0)}_createDataLonLat(e){this._clearData(),ui.appendLineDataLonLat(e,this._pathColors,this._defaultColor,this._closedLine,this._verticesHigh,this._verticesLow,this._orders,this._indexes,this._renderNode.ellipsoid,this._path3v,this._pathLonLat,this._pathLonLatMerc,this._extent,this._colors),this._resizePathLengths(0)}remove(){this._entity=null,this._pathColors.length=0,this._pathColors=[],this._verticesHigh=null,this._verticesLow=null,this._orders=null,this._indexes=null,this._colors=null,this._verticesHigh=[],this._verticesLow=[],this._orders=[],this._indexes=[],this._colors=[],this._deleteBuffers(),this._handler&&this._handler.remove(this)}setPickingColor3v(e){this._pickingColor[0]=e.x/255,this._pickingColor[1]=e.y/255,this._pickingColor[2]=e.z/255}getExtent(){return this._extent.clone()}getPath3v(){return this._path3v}getPathLonLat(){return this._pathLonLat}getPathColors(){return this._pathColors}setPathColors(e){this._renderNode}setColorHTML(e){this._defaultColor=me(e);let t=pe(e),i=this._pathColors;for(let e=0,r=i.length;e<r;e++){let r=i[e];for(let e=0,i=r.length;e<i;e++)r[e][0]=t.x,r[e][1]=t.y,r[e][2]=t.z,r[e][3]=t.w}let r=this._colors;for(let e=0,i=r.length;e<i;e+=4)r[e]=t.x,r[e+1]=t.y,r[e+2]=t.z,r[e+3]=t.w;this._changedBuffers[2]=!0}setPathLonLat(e,t=!1){this._renderNode&&this._renderNode.ellipsoid?t?(this._setEqualPathLonLat(e),this._changedBuffers[0]=!0,this._changedBuffers[2]=!0):(this._createDataLonLat(e),this._changedBuffers[0]=!0,this._changedBuffers[1]=!0,this._changedBuffers[2]=!0):this._pathLonLat=[].concat(e)}setPath3v(e,t,i=!1){t&&(this._pathColors=[].concat(t)),this._renderNode?i?(this._setEqualPath3v(e),this._changedBuffers[0]=!0,this._changedBuffers[2]=!0):(this._createData3v(e),this._changedBuffers[0]=!0,this._changedBuffers[1]=!0,this._changedBuffers[2]=!0):this._path3v=[].concat(e)}draw(){if(this.visibility&&this._path3v.length){this._update();let e=this._renderNode,t=e.renderer,i=t.handler.programs.polyline_screen,r=i._program,n=t.handler.gl,s=r.attributes,a=r.uniforms,o=this._handler._entityCollection;i.activate(),n.disable(n.CULL_FACE),n.uniform1f(a.depthOffset,o.polygonOffsetUnits),n.uniformMatrix4fv(a.proj,!1,t.activeCamera.getProjectionMatrix()),n.uniformMatrix4fv(a.view,!1,t.activeCamera.getViewMatrix()),n.uniform3fv(a.eyePositionHigh,t.activeCamera.eyeHigh),n.uniform3fv(a.eyePositionLow,t.activeCamera.eyeLow),n.uniform2fv(a.uFloatParams,[e._planetRadius2||0,t.activeCamera._tanViewAngle_hradOneByHeight]),n.uniform2fv(a.viewport,[t.handler.canvas.width,t.handler.canvas.height]),n.uniform1f(a.thickness,.5*this.thickness),n.uniform1f(a.opacity,this._opacity*o._fadingOpacity),n.bindBuffer(n.ARRAY_BUFFER,this._colorsBuffer),n.vertexAttribPointer(s.color,this._colorsBuffer.itemSize,n.FLOAT,!1,0,0);let l=this._verticesHighBuffer;n.bindBuffer(n.ARRAY_BUFFER,l),n.vertexAttribPointer(s.prevHigh,l.itemSize,n.FLOAT,!1,12,0),n.vertexAttribPointer(s.currentHigh,l.itemSize,n.FLOAT,!1,12,48),n.vertexAttribPointer(s.nextHigh,l.itemSize,n.FLOAT,!1,12,96),l=this._verticesLowBuffer,n.bindBuffer(n.ARRAY_BUFFER,l),n.vertexAttribPointer(s.prevLow,l.itemSize,n.FLOAT,!1,12,0),n.vertexAttribPointer(s.currentLow,l.itemSize,n.FLOAT,!1,12,48),n.vertexAttribPointer(s.nextLow,l.itemSize,n.FLOAT,!1,12,96),n.bindBuffer(n.ARRAY_BUFFER,this._ordersBuffer),n.vertexAttribPointer(s.order,this._ordersBuffer.itemSize,n.FLOAT,!1,4,0),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,this._indexesBuffer),n.drawElements(n.TRIANGLE_STRIP,this._indexesBuffer.numItems,n.UNSIGNED_INT,0),n.enable(n.CULL_FACE)}}drawPicking(){if(this.visibility&&this._path3v.length){let e=this._renderNode,t=e.renderer,i=t.handler.programs.polyline_picking,r=i._program,n=t.handler.gl,s=r.attributes,a=r.uniforms;i.activate(),n.disable(n.CULL_FACE),n.uniform1f(a.depthOffset,this._handler._entityCollection.polygonOffsetUnits),n.uniformMatrix4fv(a.proj,!1,t.activeCamera.getProjectionMatrix()),n.uniformMatrix4fv(a.view,!1,t.activeCamera.getViewMatrix()),n.uniform4fv(a.color,[this._pickingColor[0],this._pickingColor[1],this._pickingColor[2],1]),n.uniform3fv(a.eyePositionHigh,t.activeCamera.eyeHigh),n.uniform3fv(a.eyePositionLow,t.activeCamera.eyeLow),n.uniform2fv(a.uFloatParams,[e._planetRadius2||0,t.activeCamera._tanViewAngle_hradOneByHeight]),n.uniform2fv(a.viewport,[t.handler.canvas.width,t.handler.canvas.height]),n.uniform1f(a.thickness,.5*this.thickness);let o=this._verticesHighBuffer;n.bindBuffer(n.ARRAY_BUFFER,o),n.vertexAttribPointer(s.prevHigh,o.itemSize,n.FLOAT,!1,12,0),n.vertexAttribPointer(s.currentHigh,o.itemSize,n.FLOAT,!1,12,48),n.vertexAttribPointer(s.nextHigh,o.itemSize,n.FLOAT,!1,12,96),o=this._verticesLowBuffer,n.bindBuffer(n.ARRAY_BUFFER,o),n.vertexAttribPointer(s.prevLow,o.itemSize,n.FLOAT,!1,12,0),n.vertexAttribPointer(s.currentLow,o.itemSize,n.FLOAT,!1,12,48),n.vertexAttribPointer(s.nextLow,o.itemSize,n.FLOAT,!1,12,96),n.bindBuffer(n.ARRAY_BUFFER,this._ordersBuffer),n.vertexAttribPointer(s.order,this._ordersBuffer.itemSize,n.FLOAT,!1,4,0),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,this._indexesBuffer),n.drawElements(n.TRIANGLE_STRIP,this._indexesBuffer.numItems,n.UNSIGNED_INT,0),n.enable(n.CULL_FACE)}}_refresh(){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]=!0}_update(){if(this._renderNode){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]&&(this._buffersUpdateCallbacks[e].call(this),this._changedBuffers[e]=!1)}}_deleteBuffers(){if(this._renderNode){let e=this._renderNode.renderer.handler.gl;e.deleteBuffer(this._verticesHighBuffer),e.deleteBuffer(this._verticesLowBuffer),e.deleteBuffer(this._ordersBuffer),e.deleteBuffer(this._indexesBuffer),e.deleteBuffer(this._colorsBuffer),this._verticesHighBuffer=null,this._verticesLowBuffer=null,this._ordersBuffer=null,this._indexesBuffer=null,this._colorsBuffer=null}}_createVerticesBuffer(){let e=this._renderNode.renderer.handler,t=this._verticesHigh.length/3;this._verticesHighBuffer&&this._verticesHighBuffer.numItems===t||(e.gl.deleteBuffer(this._verticesHighBuffer),e.gl.deleteBuffer(this._verticesLowBuffer),this._verticesHighBuffer=e.createStreamArrayBuffer(3,t),this._verticesLowBuffer=e.createStreamArrayBuffer(3,t)),this._verticesHigh=De(this._verticesHigh),this._verticesLow=De(this._verticesLow),e.setStreamArrayBuffer(this._verticesHighBuffer,this._verticesHigh),e.setStreamArrayBuffer(this._verticesLowBuffer,this._verticesLow)}_createIndexBuffer(){let e=this._renderNode.renderer.handler;e.gl.deleteBuffer(this._ordersBuffer),e.gl.deleteBuffer(this._indexesBuffer),this._orders=De(this._orders),this._ordersBuffer=e.createArrayBuffer(this._orders,1,this._orders.length/2),this._indexes=De(this._indexes,Uint32Array),this._indexesBuffer=e.createElementArrayBuffer(this._indexes,1,this._indexes.length)}_createColorsBuffer(){let e=this._renderNode.renderer.handler;e.gl.deleteBuffer(this._colorsBuffer),this._colors=De(this._colors),this._colorsBuffer=e.createArrayBuffer(new Float32Array(this._colors),4,this._colors.length/4)}}ui.__counter__=0;class fi{constructor(e={}){this.__id=fi.__counter__++,this._thickness=e.thickness||2,this._startPosition=Te(e.startPosition),this._startPositionHigh=new oe,this._startPositionLow=new oe,oe.doubleToTwoFloats(this._startPosition,this._startPositionHigh,this._startPositionLow),this._endPosition=Te(e.endPosition),this._endPositionHigh=new oe,this._endPositionLow=new oe,oe.doubleToTwoFloats(this._endPosition,this._endPositionHigh,this._endPositionLow),this._startColor=Ce(e.startColor),this._endColor=Ce(e.endColor),this._visibility=null==e.visibility||e.visibility,this._entity=null,this._handler=null,this._handlerIndex=-1}setStartPosition(e,t,i){this._startPosition.x=e,this._startPosition.y=t,this._startPosition.z=i,oe.doubleToTwoFloats(this._startPosition,this._startPositionHigh,this._startPositionLow),this._handler&&this._handler.setStartPositionArr(this._handlerIndex,this._startPositionHigh,this._startPositionLow)}getLength(){return this._startPosition.distance(this._endPosition)}setStartPosition3v(e){this._startPosition.x=e.x,this._startPosition.y=e.y,this._startPosition.z=e.z,oe.doubleToTwoFloats(this._startPosition,this._startPositionHigh,this._startPositionLow),this._handler&&this._handler.setStartPositionArr(this._handlerIndex,this._startPositionHigh,this._startPositionLow)}setEndPosition(e,t,i){this._endPosition.x=e,this._endPosition.y=t,this._endPosition.z=i,oe.doubleToTwoFloats(this._endPosition,this._endPositionHigh,this._endPositionLow),this._handler&&this._handler.setEndPositionArr(this._handlerIndex,this._endPositionHigh,this._endPositionLow)}setEndPosition3v(e){this._endPosition.x=e.x,this._endPosition.y=e.y,this._endPosition.z=e.z,oe.doubleToTwoFloats(this._endPosition,this._endPositionHigh,this._endPositionLow),this._handler&&this._handler.setEndPositionArr(this._handlerIndex,this._endPositionHigh,this._endPositionLow)}setThickness(e){this._thickness=e,this._handler&&this._handler.setThicknessArr(this._handlerIndex,e)}setColors4v(e,t){e&&(this._startColor.x=e.x,this._startColor.y=e.y,this._startColor.z=e.z,this._startColor.w=e.w),t&&(this._endColor.x=t.x,this._endColor.y=t.y,this._endColor.z=t.z,this._endColor.w=t.w),this._handler&&this._handler.setRgbaArr(this._handlerIndex,this._startColor,this._endColor)}setColorsHTML(e,t){e&&(this._startColor=pe(e)),t&&(this._endColor=pe(t)),this._handler&&this._handler.setRgbaArr(this._handlerIndex,this._startColor,this._endColor)}getStartPosition(){return this._startPosition}getEndPosition(){return this._endPosition}setVisibility(e){this._visibility=e,this._handler&&this._handler.setVisibility(this._handlerIndex,e)}getVisibility(){return this._visibility}remove(){this._entity=null,this._handler&&this._handler.remove(this)}setPickingColor3v(e){this._handler&&this._handler.setPickingColorArr(this._handlerIndex,e)}}fi.__counter__=0;let gi=new oe,pi=new oe;class mi{constructor(e={}){if(this.__id=mi.__counter__++,this.visibility=null==e.visibility||e.visibility,this.color=new Float32Array([1,1,1,.5]),e.color){let t=Ce(e.color);this.setColor(t.x,t.y,t.z,t.w)}e.opacity&&this.setOpacity(e.opacity),this._renderNode=null,this._entity=null,this._verticesHighBuffer=null,this._verticesLowBuffer=null,this._indexBuffer=null,this._verticesHigh=[],this._verticesLow=[],this._indexes=[],this._path=[],this._pickingColor=new Float32Array(4),this._gridSize=1,this._handler=null,this._handlerIndex=-1,e.path&&this.setPath(e.path)}setPickingColor3v(e){this._pickingColor[0]=e.x/255,this._pickingColor[1]=e.y/255,this._pickingColor[2]=e.z/255,this._pickingColor[3]=1}clear(){this._path.length=0,this._path=[],this._verticesHigh.length=0,this._verticesHigh=[],this._verticesLow.length=0,this._verticesLow=[],this._indexes.length=0,this._indexes=[],this._deleteBuffers()}setColor(e,t,i,r){r=r||this.color[3],this.color[0]=e,this.color[1]=t,this.color[2]=i,this.color[3]=r}setOpacity(e){this.color[3]=e||0}setVisibility(e){this.visibility=e}getVisibility(){return this.visibility}setRenderNode(e){this._renderNode=e,this._createBuffers()}remove(){this._entity=null,this._handler&&this._handler.remove(this)}draw(){if(this.visibility&&this._verticesHigh.length){let e=this._renderNode.renderer,t=e.handler.gl,i=e.handler.programs.strip,r=i._program,n=r.attributes,s=r.uniforms;i.activate(),t.disable(t.CULL_FACE),t.uniformMatrix4fv(s.viewMatrix,!1,e.activeCamera.getViewMatrix()),t.uniformMatrix4fv(s.projectionMatrix,!1,e.activeCamera.getProjectionMatrix()),t.uniform3fv(s.eyePositionHigh,e.activeCamera.eyeHigh),t.uniform3fv(s.eyePositionLow,e.activeCamera.eyeLow),t.uniform4fv(s.uColor,this.color),t.uniform1f(s.uOpacity,this._entity._entityCollection._fadingOpacity),t.bindBuffer(t.ARRAY_BUFFER,this._verticesHighBuffer),t.vertexAttribPointer(n.aVertexPositionHigh,this._verticesHighBuffer.itemSize,t.FLOAT,!1,0,0),t.bindBuffer(t.ARRAY_BUFFER,this._verticesLowBuffer),t.vertexAttribPointer(n.aVertexPositionLow,this._verticesLowBuffer.itemSize,t.FLOAT,!1,0,0),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this._indexBuffer),t.drawElements(e.handler.gl.TRIANGLE_STRIP,this._indexBuffer.numItems,t.UNSIGNED_INT,0),t.enable(t.CULL_FACE)}}drawPicking(){if(this.visibility&&this._verticesHigh.length){let e=this._renderNode.renderer,t=e.handler.gl,i=e.handler.programs.strip,r=i._program,n=r.attributes,s=r.uniforms;i.activate(),t.disable(t.CULL_FACE),t.uniformMatrix4fv(s.viewMatrix,!1,e.activeCamera.getViewMatrix()),t.uniformMatrix4fv(s.projectionMatrix,!1,e.activeCamera.getProjectionMatrix()),t.uniform3fv(s.eyePositionHigh,e.activeCamera.eyeHigh),t.uniform3fv(s.eyePositionLow,e.activeCamera.eyeLow),t.uniform1f(s.uOpacity,0!=this._entity._entityCollection._fadingOpacity?1:0),t.uniform4fv(s.uColor,this._pickingColor),t.bindBuffer(t.ARRAY_BUFFER,this._verticesHighBuffer),t.vertexAttribPointer(n.aVertexPositionHigh,this._verticesHighBuffer.itemSize,t.FLOAT,!1,0,0),t.bindBuffer(t.ARRAY_BUFFER,this._verticesLowBuffer),t.vertexAttribPointer(n.aVertexPositionLow,this._verticesLowBuffer.itemSize,t.FLOAT,!1,0,0),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this._indexBuffer),t.drawElements(e.handler.gl.TRIANGLE_STRIP,this._indexBuffer.numItems,t.UNSIGNED_INT,0),t.enable(t.CULL_FACE)}}_deleteBuffers(){if(this._renderNode&&this._renderNode.renderer){let e=this._renderNode.renderer.handler.gl;e.deleteBuffer(this._indexBuffer),e.deleteBuffer(this._verticesHighBuffer),e.deleteBuffer(this._verticesLowBuffer)}this._verticesHighBuffer=null,this._verticesLowBuffer=null,this._indexBuffer=null}_createBuffers(){if(this._renderNode&&this._renderNode.renderer&&this._renderNode.renderer.isInitialized()){let e=this._renderNode.renderer.handler.gl;e.deleteBuffer(this._indexBuffer),e.deleteBuffer(this._verticesHighBuffer),e.deleteBuffer(this._verticesLowBuffer),this._verticesHighBuffer=this._renderNode.renderer.handler.createArrayBuffer(new Float32Array(this._verticesHigh),3,this._verticesHigh.length/3),this._verticesLowBuffer=this._renderNode.renderer.handler.createArrayBuffer(new Float32Array(this._verticesLow),3,this._verticesLow.length/3),this._indexBuffer=this._renderNode.renderer.handler.createElementArrayBuffer(new Uint32Array(this._indexes),1,this._indexes.length)}}addEdge3v(e,t){let i=this._path.length;if(0===i)this._path.push([e.clone(),t.clone()]);else{let r=this._path[i-1][0],n=this._path[i-1][1];this._path.push([e.clone(),t.clone()]);let s=this._verticesHigh,a=this._verticesLow,o=this._gridSize,l=o+1,h=new oe,c=this._verticesHigh.length/3,d=c,_=Math.abs(r.sub(n).normal().dot(e.sub(r).normal()));for(let i=0;i<l;i++){let u=i/o,f=r.lerp(e,u),g=n.lerp(t,u);for(let u=0;u<l;u++){let p=u/o,m=r.lerp(n,p),v=e.lerp(t,p);1!==_?new ni(f,g).intersects(new ni(m,v),h):h=v,d=c+i*l+u,oe.doubleToTwoFloats(h,gi,pi);let y=3*d;s[y]=gi.x,s[y+1]=gi.y,s[y+2]=gi.z,a[y]=pi.x,a[y+1]=pi.y,a[y+2]=pi.z,i<o&&this._indexes.push(d,d+l)}i<o&&this._indexes.push(d+l,d+1)}this._createBuffers()}}setEdge3v(e,t,i){if(i!==this._path.length)if(this._path[i]){if(this._path[i][0]=e,this._path[i][1]=t,this._path.length>1){let r=this._gridSize,n=r+1,s=n*n,a=new oe,o=this._verticesHigh,l=this._verticesLow;if(i===this._path.length-1){let h=this._path[i-1][0],c=this._path[i-1][1],d=this._verticesHigh.length/3-s,_=d,u=Math.abs(h.sub(c).normal().dot(e.sub(h).normal()));for(let i=0;i<n;i++){let s=i/r,f=h.lerp(e,s),g=c.lerp(t,s);for(let s=0;s<n;s++){let p=s/r,m=h.lerp(c,p),v=e.lerp(t,p);1!==u?new ni(f,g).intersects(new ni(m,v),a):a=v,_=d+i*n+s,oe.doubleToTwoFloats(a,gi,pi);let y=3*_;o[y]=gi.x,o[y+1]=gi.y,o[y+2]=gi.z,l[y]=pi.x,l[y+1]=pi.y,l[y+2]=pi.z}}}else if(0===i){let i=0,s=e,h=t;e=this._path[1][0],t=this._path[1][1];for(let c=0;c<n;c++){let d=c/r,_=s.lerp(e,d),u=h.lerp(t,d);for(let d=0;d<n;d++){let f=d/r,g=s.lerp(h,f),p=e.lerp(t,f);new ni(_,u).intersects(new ni(g,p),a),i=c*n+d,oe.doubleToTwoFloats(a,gi,pi);let m=3*i;o[m]=gi.x,o[m+1]=gi.y,o[m+2]=gi.z,l[m]=pi.x,l[m+1]=pi.y,l[m+2]=pi.z}}}else if(i>0&&i<this._path.length){let h=this._path[i-1][0],c=this._path[i-1][1],d=this._path[i+1][0],_=this._path[i+1][1],u=i*s,f=(i-1)*s,g=f;for(let i=0;i<n;i++){let s=i/r,p=h.lerp(e,s),m=t.lerp(_,s),v=e.lerp(d,s),y=c.lerp(t,s);for(let s=0;s<n;s++){let x=s/r,b=h.lerp(c,x),w=e.lerp(t,x);new ni(p,y).intersects(new ni(b,w),a);let T=i*n+s;g=f+T,oe.doubleToTwoFloats(a,gi,pi);let C=3*g;o[C]=gi.x,o[C+1]=gi.y,o[C+2]=gi.z,l[C]=pi.x,l[C+1]=pi.y,l[C+2]=pi.z;let L=d.lerp(_,x);w=e.lerp(t,x),new ni(v,m).intersects(new ni(w,L),a),g=u+T,oe.doubleToTwoFloats(a,gi,pi),C=3*g,o[C]=gi.x,o[C+1]=gi.y,o[C+2]=gi.z,l[C]=pi.x,l[C+1]=pi.y,l[C+2]=pi.z}}}this._createBuffers()}}else console.warn(`strip index ${i} is out of range`);else this.addEdge3v(e,t)}removeEdge(e){this._path.splice(e,1),this.setPath([].concat(this._path))}setGridSize(e){this._gridSize=e,this.setPath([].concat(this._path))}getPath(){return this._path}setPath(e){this._verticesHigh=[],this._verticesLow=[],this._indexes=[],this._path=[];for(let t=0;t<e.length;t++){let i=e[t][0],r=e[t][1];i instanceof Array&&(i=new oe(i[0],i[1],i[2])),r instanceof Array&&(r=new oe(r[0],r[1],r[2])),this.addEdge3v(i,r)}}insertEdge3v(e,t,i){if(i<this._path.length){let r=[].concat(this._path);r.splice(i,0,[e,t]),this.setPath(r)}else i===this._path.length&&this.addEdge3v(e,t)}}mi.__counter__=0;class vi{constructor(e={}){e.properties=e.properties||{},this.__id=vi.__counter__++,this.properties=e.properties||{},this.properties.name=null!=this.properties.name?this.properties.name:"",this.childrenNodes=[],this.parent=null,this._cartesian=Te(e.cartesian),this._lonLat=Ee(e.lonlat),this._lonLatMerc=new I,this._altitude=e.altitude||0,this._visibility=null==e.visibility||e.visibility,this._entityCollection=null,this._entityCollectionIndex=-1,this._layer=null,this._layerIndex=-1,this._pickingColor=new oe(0,0,0),this._featureConstructorArray={billboard:[ei,this.setBillboard],label:[di,this.setLabel],polyline:[ui,this.setPolyline],pointCloud:[_i,this.setPointCloud],geometry:[ii,this.setGeometry],geoObject:[oi,this.setGeoObject],strip:[mi,this.setStrip],ray:[fi,this.setRay]},this.billboard=this._createOptionFeature("billboard",e.billboard),this.label=this._createOptionFeature("label",e.label),this.polyline=this._createOptionFeature("polyline",e.polyline),this.ray=this._createOptionFeature("ray",e.ray),this.pointCloud=this._createOptionFeature("pointCloud",e.pointCloud),this.geometry=this._createOptionFeature("geometry",e.geometry),this.geoObject=this._createOptionFeature("geoObject",e.geoObject),this.strip=this._createOptionFeature("strip",e.strip)}get id(){return this.__id}isEqual(e){return this.__id===e.__id}get layerIndex(){return this._layerIndex}get instanceName(){return"Entity"}_createOptionFeature(e,t){if(t){let i=this._featureConstructorArray[e];return i[1].call(this,new i[0](t))}return null}getCollectionIndex(){return this._entityCollectionIndex}addTo(e,t=!1){return e.add(this,t),this}remove(){this._layer&&this._layer.removeEntity(this),this._entityCollection&&this._entityCollection.removeEntity(this)}setVisibility(e){this._visibility=e,this.billboard&&this.billboard.setVisibility(e),this.geoObject&&this.geoObject.setVisibility(e),this.label&&this.label.setVisibility(e),this.polyline&&this.polyline.setVisibility(e),this.ray&&this.ray.setVisibility(e),this.geometry&&this.geometry.setVisibility(e);for(let t=0;t<this.childrenNodes.length;t++)this.childrenNodes[t].setVisibility(e)}getVisibility(){return this._visibility}setCartesian3v(e){this.setCartesian(e.x,e.y,e.z)}setCartesian(e,t,i){let r=this._cartesian;r.x=e||0,r.y=t||0,r.z=i||0,this.billboard&&this.billboard.setPosition3v(r),this.geoObject&&this.geoObject.setPosition3v(r),this.label&&this.label.setPosition3v(r);for(let r=0;r<this.childrenNodes.length;r++)this.childrenNodes[r].setCartesian(e,t,i);let n=this._entityCollection;n&&n.renderNode&&n.renderNode.ellipsoid&&(this._lonLat=n.renderNode.ellipsoid.cartesianToLonLat(r),Math.abs(this._lonLat.lat)<J?this._lonLatMerc=this._lonLat.forwardMercator():this._lonLatMerc.lon=this._lonLatMerc.lat=this._lonLatMerc.height=0),n&&n.events.dispatch(n.events.entitymove,this)}_setCartesian3vSilent(e,t=!1){let i=this._cartesian;i.x=e.x||0,i.y=e.y||0,i.z=e.z||0,this.billboard&&this.billboard.setPosition3v(i),this.geoObject&&this.geoObject.setPosition3v(i),this.label&&this.label.setPosition3v(i);for(let e=0;e<this.childrenNodes.length;e++)this.childrenNodes[e].setCartesian(i.x,i.y,i.z);let r=this._entityCollection;!t&&r&&r.renderNode&&r.renderNode.ellipsoid&&(this._lonLat=r.renderNode.ellipsoid.cartesianToLonLat(i),Math.abs(this._lonLat.lat)<J&&(this._lonLatMerc=this._lonLat.forwardMercator()))}getLonLat(){return this._lonLat.clone()}setLonLat(e){let t=this._lonLat;t.lon=e.lon,t.lat=e.lat,t.height=e.height;let i=this._entityCollection;i&&i.renderNode&&i.renderNode.ellipsoid&&(Math.abs(t.lat)<J&&(this._lonLatMerc=t.forwardMercator()),i.renderNode.ellipsoid.lonLatToCartesianRes(t,this._cartesian),this.setCartesian3v(this._cartesian))}setLonLat2(e,t,i){let r=this._lonLat;r.lon=e,r.lat=t,r.height=null!=i?i:r.height;let n=this._entityCollection;n&&n.renderNode&&n.renderNode.ellipsoid&&(Math.abs(r.lat)<J?this._lonLatMerc=r.forwardMercator():this._lonLatMerc.lon=this._lonLatMerc.lat=this._lonLatMerc.height=0,n.renderNode.ellipsoid.lonLatToCartesianRes(r,this._cartesian),this.setCartesian3v(this._cartesian))}setAltitude(e){this._altitude=e}getAltitude(){return this._altitude}getCartesian(){return this._cartesian.clone()}setBillboard(e){return this.billboard&&this.billboard.remove(),this.billboard=e,this.billboard._entity=this,this.billboard.setPosition3v(this._cartesian),this.billboard.setVisibility(this._visibility),this._entityCollection&&this._entityCollection.billboardHandler.add(e),e}setLabel(e){return this.label&&this.label.remove(),this.label=e,this.label._entity=this,this.label.setPosition3v(this._cartesian),this.label.setVisibility(this._visibility),this._entityCollection&&this._entityCollection.labelHandler.add(e),e}setRay(e){return this.ray&&this.ray.remove(),this.ray=e,this.ray._entity=this,this.ray.setVisibility(this._visibility),this._entityCollection&&this._entityCollection.rayHandler.add(e),e}setPolyline(e){return this.polyline&&this.polyline.remove(),this.polyline=e,this.polyline._entity=this,this.polyline.setVisibility(this._visibility),this._entityCollection&&this._entityCollection.polylineHandler.add(e),e}setPointCloud(e){return this.pointCloud&&this.pointCloud.remove(),this.pointCloud=e,this.pointCloud._entity=this,this.pointCloud.setVisibility(this._visibility),this._entityCollection&&this._entityCollection.pointCloudHandler.add(e),e}setGeometry(e){return this.geometry&&this.geometry.remove(),this.geometry=e,this.geometry._entity=this,this.geometry.setVisibility(this._visibility),this._layer&&this._layer.add(this),e}setGeoObject(e){return this.geoObject&&this.geoObject.remove(),this.geoObject=e,this.geoObject._entity=this,this.geoObject.setPosition3v(this._cartesian),this.geoObject.setVisibility(this._visibility),this._entityCollection&&this._entityCollection.geoObjectHandler.add(e),e}setStrip(e){return this.strip&&this.strip.remove(),this.strip=e,this.strip._entity=this,this.strip.setVisibility(this._visibility),this._entityCollection&&this._entityCollection.stripHandler.add(e),e}get layer(){return this._layer}get rendererEvents(){return this._layer?this._layer.events:this._entityCollection?this._entityCollection.events:null}appendChild(e){e._entityCollection=this._entityCollection,e._pickingColor=this._pickingColor,e.parent=this,this.childrenNodes.push(e),this._entityCollection&&this._entityCollection.appendChildEntity(e)}setPickingColor(){let e=this._pickingColor;this.billboard&&this.billboard.setPickingColor3v(e),this.label&&this.label.setPickingColor3v(e),this.polyline&&this.polyline.setPickingColor3v(e),this.ray&&this.ray.setPickingColor3v(e),this.strip&&this.strip.setPickingColor3v(e),this.geoObject&&this.geoObject.setPickingColor3v(e);for(let e=0;e<this.childrenNodes.length;e++)this.childrenNodes[e].setPickingColor()}getExtent(){let e,t=this._lonLat;e=this.billboard||this.label?new ie(new I(t.lon,t.lat),new I(t.lon,t.lat)):new ie(new I(180,90),new I(-180,-90));let i=e.southWest,r=e.northEast;if(this.polyline){let e=this.polyline.getExtent();e.southWest.lon<i.lon&&(i.lon=e.southWest.lon),e.southWest.lat<i.lat&&(i.lat=e.southWest.lat),e.northEast.lon>r.lon&&(r.lon=e.northEast.lon),e.northEast.lat>r.lat&&(r.lat=e.northEast.lat)}if(this.geometry){let e=this.geometry.getExtent();e.southWest.lon<i.lon&&(i.lon=e.southWest.lon),e.southWest.lat<i.lat&&(i.lat=e.southWest.lat),e.northEast.lon>r.lon&&(r.lon=e.northEast.lon),e.northEast.lat>r.lat&&(r.lat=e.northEast.lat)}for(let e=0;e<this.childrenNodes.length;e++){let t=this.childrenNodes[e].getExtent();t.southWest.lon<i.lon&&(i.lon=t.southWest.lon),t.southWest.lat<i.lat&&(i.lat=t.southWest.lat),t.northEast.lon>r.lon&&(r.lon=t.northEast.lon),t.northEast.lat>r.lat&&(r.lat=t.northEast.lat)}return e}}function yi(e){const t=[[0,0,0]],i=[[0,0]],r=[[0,0,0]],n=[t,i,r];let s=[[],[],[]];const a=[],o=[];let l,h=["default"],c="default",d="default";function _(){l&&l.data.vertices.length&&(l=null)}function u(e){e.split("/").forEach(((e,t)=>{if(!e)return;const i=parseInt(e),r=i+(i>=0?0:n[t].length);s[t].push(...n[t][r])}))}const f={v(e){t.push(e.map(parseFloat))},vn(e){r.push(e.map(parseFloat))},vt(e){i.push(e.map(parseFloat))},f(e){!function(){if(!l){const e=[],t=[],i=[];s=[e,t,i],l={object:d,groups:h,material:c,data:{vertices:e,textures:t,normals:i}},o.push(l)}}();const t=e.length-2;for(let i=0;i<t;++i)u(e[0]),u(e[i+1]),u(e[i+2])},s:()=>{},mtllib(e,t){a.push(t)},usemtl(e,t){c=t,_()},g(e){h=e,_()},o(e,t){d=t,_()}},g=/(\w*)(?: )*(.*)/,p=e.split("\n");for(let e=0;e<p.length;++e){const t=p[e].trim();if(""===t||t.startsWith("#"))continue;const i=g.exec(t);if(!i)continue;const[,r,n]=i,s=t.split(/\s+/).slice(1),a=f[r];a?a(s,n):console.warn("unhandled keyword:",r)}for(const e of o)e.data=Object.fromEntries(Object.entries(e.data).filter((([e,t])=>t.length>0)));return{geometries:o,materialLibs:a}}function xi(e){const t=e.geometries.map((e=>{const t=e.data.vertices,i=e.data.normals,r=e.data.textures;!function(e,t){const i=Math.cos(t),r=Math.sin(t),n=e.vertices,s=e.normals;for(let e=0;e<n.length;e+=3){const t=n[e],a=n[e+1],o=n[e+2];n[e]=t*i+o*r,n[e+1]=a,n[e+2]=-t*r+o*i;const l=s[e],h=s[e+1],c=s[e+2];s[e]=l*i+c*r,s[e+1]=h,s[e+2]=-l*r+c*i}}(e.data,0);let n=[],s=[],a=[];for(let e=0;e<t.length;e+=3){const i=t[e],r=t[e+1],s=t[e+2];n.push(i,r,s)}for(let e=0;e<i.length;e+=3){const t=i[e],r=i[e+1],n=i[e+2];s.push(t,r,-n)}for(let e=0;e<r.length;e+=2){const t=r[e],i=1-r[e+1];a.push(t,i)}return{object:e.object,groups:e.groups,material:e.material,data:{vertices:n,normals:s,textures:a}}}));return{geometries:t,materialLibs:e.materialLibs}}vi.__counter__=0;class bi{constructor(e={}){var t;if(this._name=e.name||"noname",this._vertices=e.vertices||[],this._numVertices=this._vertices.length/3,this._texCoords=e.texCoords||new Array(2*this._numVertices),e.center&&bi.centering(this._vertices),this._src=e.src||null,this.color=(t=e.color)instanceof Array?new Float32Array(t):"string"==typeof t?me(t):new Float32Array([1,1,1,1]),e.scale&&bi.scale(this._vertices,e.scale),e.indices)this._indices=e.indices,this._normals=e.normals||[];else{this._normals=bi.getNormals(this._vertices),this._indices=new Array(this._vertices.length/3);for(let e=0,t=this._indices.length;e<t;e++)this._indices[e]=e}}static centering(e){let t=s,i=s,r=s,n=a,o=a,l=a;for(let s=0,a=e.length;s<a;s+=3){let a=e[s],h=e[s+1],c=e[s+2];a<t&&(t=a),h<i&&(i=h),c<r&&(r=c),a>n&&(n=a),h>o&&(o=h),c>l&&(l=c)}let h=t+.5*(n-t),c=i+.5*(o-i),d=r+.5*(l-r);for(let t=0,i=e.length;t<i;t+=3)e[t]-=h,e[t+1]-=c,e[t+2]-=d}get src(){return this._src}set src(e){this._src=e}get name(){return this._name}get vertices(){return this._vertices}get normals(){return this._normals}get indices(){return this._indices}get texCoords(){return this._texCoords}get numVertices(){return this._numVertices}static scale(e,t){for(let i=0;i<e.length;i++)e[i]*=t}static centroid(e){let t=1e3,i=1e3,r=1e3,n=-1e3,s=-1e3,a=-1e3;for(let o=0;o<e.length;o+=3){let l=e[o],h=e[o+1],c=e[o+2];l<t&&(t=l),h<i&&(i=h),c<r&&(r=c),l>n&&(n=l),h>s&&(s=h),c>a&&(a=c)}return[t+.5*(n-t),i+.5*(s-i),r+.5*(a-r)]}static translate(e,t){for(let i=0;i<e.length;i+=3)e[i]-=t[0],e[i+1]-=t[1],e[i+2]-=t[2]}static getNormals(e){let t=new Array(e.length);for(let i=0;i<e.length;i+=9){let r=i,n=i+3,s=i+6,a=e[r],o=e[r+1],l=e[r+2],h=e[n]-a,c=e[n+1]-o,d=e[n+2]-l,_=e[s]-a,u=e[s+1]-o,f=e[s+2]-l,g=c*f-d*u,p=d*_-h*f,m=h*u-c*_,v=Math.sqrt(g*g+p*p+m*m);g/=v,p/=v,m/=v,t[r]=g,t[r+1]=p,t[r+2]=m,t[n]=g,t[n+1]=p,t[n+2]=m,t[s]=g,t[s+1]=p,t[s+2]=m}return t}static createSphere(e=16,t=16,i=1,r=0,n=0,s=0){let a=[],o=[],l=[];for(let o=0;o<=t;o++){let h=o*Math.PI/t,c=Math.sin(h),d=Math.cos(h);for(let t=0;t<=e;t++){let o=2*t*Math.PI/e,h=Math.sin(o),_=Math.cos(o)*c+r,u=d+n,f=h*c+s;l.push(_),l.push(u),l.push(f),a.push(i*_),a.push(i*u),a.push(i*f)}}for(let i=0;i<t;i++)for(let t=0;t<e;t++){let r=i*(e+1)+t,n=r+e+1;o.push(r),o.push(r+1),o.push(n),o.push(n),o.push(r+1),o.push(n+1)}return new bi({vertices:a,normals:l,indices:o})}static createDisc(e=1,t=0,i=8,r=!0,n=0,s=0,a=0,o=0){let l=[],h=[],c=[],d=2*Math.PI,_=r?1:-1,u=n;for(let e=1;e<=i;e++)l.push(s,t*_+a,o),c.push(0,_,0),n++;let f=n;for(let r=0;r<=i;r++){let h=r/i*d+0,u=Math.cos(h),f=Math.sin(h);l.push(e*f+s,t*_+a,e*u+o),c.push(0,_,0),n++}for(let e=0;e<i;e++){let t=u+e,i=f+e;r?h.push(i,i+1,t):h.push(i+1,i,t)}return new bi({vertices:l,normals:c,indices:h})}static createCylinder(e=1,t=1,i=1,r=32,n=1,s=!0,a=!0,o=0,l=0,h=0){let c=[],d=[],_=[],u=2*Math.PI,f=0,g=[],p=new oe,m=(t-e)/i;for(let s=0;s<=n;s++){let a=[],d=s/n,v=d*(t-e)+e;for(let e=0;e<=r;e++){let t=e/r*u+0,n=Math.sin(t),s=Math.cos(t);c.push(v*n+o,-d*i+i+l,v*s+h),p.set(n,m,s).normalize(),_.push(p.x,p.y,p.z),a.push(f++)}g.push(a)}for(let e=0;e<r;e++)for(let t=0;t<n;t++){let i=g[t][e],r=g[t+1][e],n=g[t+1][e+1],s=g[t][e+1];d.push(i,r,s),d.push(r,n,s)}if(0!==e&&s){let t=bi.createDisc(e,i,r,!0,f,o,l,h);c.push(...t.vertices),_.push(...t.normals),d.push(...t.indices)}if(0!==t&&a){let e=bi.createDisc(t,0,r,!1,f+(s?1+2*r:0),o,l,h);c.push(...e.vertices),_.push(...e.normals),d.push(...e.indices)}return new bi({vertices:c,normals:_,indices:d})}static createCube(e=1,t=1,i=1,r=0,n=0,s=0){let a=.5*e+r,o=.5*t+n,l=.5*i+s;return new bi({vertices:[-a,-o,l,a,-o,-l,a,-o,l,-a,-o,l,-a,-o,-l,a,-o,-l,-a,o,l,a,o,l,a,o,-l,-a,o,l,a,o,-l,-a,o,-l,-a,-o,l,a,-o,l,-a,o,l,-a,o,l,a,-o,l,a,o,l,-a,-o,-l,-a,o,-l,a,-o,-l,-a,o,-l,a,o,-l,a,-o,-l,a,-o,l,a,-o,-l,a,o,l,a,o,l,a,-o,-l,a,o,-l,-a,-o,l,-a,o,l,-a,-o,-l,-a,o,l,-a,o,-l,-a,-o,-l]})}static createArrow(e=0,t=2.1,i=-15){return new bi({vertices:[0,t,0,7,0,6,0,0,i,0,0,e,7,0,6,0,t,0,-7,0,6,0,0,e,0,t,0,-7,0,6,0,t,0,0,0,i,-7,0,6,0,0,i,0,0,e,0,0,e,0,0,i,7,0,6]})}static async loadObj(e){return(await fetch(e,{mode:"cors"}).then((e=>e.text())).then((e=>xi(yi(e)))).catch((()=>[]))).geometries.map((({data:{vertices:e,normals:t,textures:i}})=>new bi({vertices:e,normals:t,texCoords:i})))}}class wi{constructor(e){this.__id=wi.__counter__++,this._name=e||`nonameNode:${this.__id}`,this.topNode=this,this._dictionary={},this._dictionary[this._name]=this,this.childNodes=[],this.parentNode=null}get name(){return this._name}addNode(e){null==this.parentNode?e.topNode=this:e.topNode=this.topNode,e.parentNode=this,e._dictionary=this.topNode._dictionary,this.childNodes.push(e),this.topNode._dictionary[e.name]=e}destroy(){for(let e=0;e<this.childNodes.length;e++)this.childNodes[e].destroy();this._clear()}getNodeByName(e){return this._dictionary[e]}_clear(){this.parentNode=null,this.topNode=this,this.childNodes.length=0}isEqual(e){return e.__id===this.__id}}wi.__counter__=0;class Ti extends wi{constructor(e){super(e),this.childNodes=[],this.renderer=null,this.drawMode=0,this.show=!0,this._isActive=!0,this.lightEnabled=!1,this._lights=[],this._lightsNames=[],this._lightsPositions=[],this._lightsParamsv=[],this._lightsParamsf=[],this.entityCollections=[],this._pickingId=-1}addNode(e){super.addNode(e),this.renderer&&e.assign(this.renderer)}assign(e){this.renderer=e,this._pickingId=e.addPickingCallback(this,this._entityCollectionPickingCallback),this.initialize()}initialize(){if(this.renderer&&this.renderer.isInitialized()){for(let e=0;e<this.entityCollections.length;e++)this.entityCollections[e].bindRenderNode(this);this.init()}}init(){}onremove(){}remove(){let e=this.renderer,t=this.name;if(e){e.renderNodes[t]&&e.renderNodes[t].isEqual(this)&&(e.renderNodes[t]=null,delete e.renderNodes[t]);for(let t=0;t<e._renderNodesArr.length;t++)if(e._renderNodesArr[t].isEqual(this)){e._renderNodesArr.splice(t,1);break}e.removePickingCallback(this._pickingId),this._pickingId=-1,this.onremove&&this.onremove()}}addEntityCollection(e,t){return e.addTo(this,t),this}removeEntityCollection(e){e.remove()}addLight(e){return e.addTo(this),this}getLightByName(e){let t=this._lightsNames.indexOf(e);return this._lights[t]}removeLight(e){e.remove()}preDrawNode(){this._isActive&&this._preDrawNodes()}drawNode(){this._isActive&&this._drawNodes()}isActive(){return this._isActive}setActive(e){this._isActive=e,this.renderer&&(this._isActive&&-1===this._pickingId?this._pickingId=this.renderer.addPickingCallback(this,this._entityCollectionPickingCallback):this._isActive||-1===this._pickingId||(this.renderer.removePickingCallback(this._pickingId),this._pickingId=-1));for(let t=0;t<this.childNodes.length;t++)this.childNodes[t].setActive(e)}setDrawMode(e){this.drawMode=e;for(let t=0;t<this.childNodes.length;t++)this.childNodes[t].setDrawMode(e)}transformLights(){for(let e=0;e<this._lights.length;e++){let t,i=3*e;t=this._lights[e]._position,this._lightsPositions[i]=t.x,this._lightsPositions[i+1]=t.y,this._lightsPositions[i+2]=t.z}}updateBillboardsTexCoords(){for(let e=0;e<this.entityCollections.length;e++)this.entityCollections[e].billboardHandler.refreshTexCoordsArr()}frame(){}preFrame(){}_preDrawNodes(){for(let e=0;e<this.childNodes.length;e++)this.childNodes[e]._isActive&&this.childNodes[e]._preDrawNodes();this.show&&(this.preFrame(),this.drawEntityCollections(this.entityCollections))}_drawNodes(){for(let e=0;e<this.childNodes.length;e++)this.childNodes[e]._isActive&&this.childNodes[e]._drawNodes();this.show&&this.frame()}drawEntityCollections(e){this.renderer.enqueueEntityCollectionsToDraw(e)}drawPickingEntityCollections(e){if(e.length){let t=e.length;for(;t--;)e[t]._fadingOpacity&&e[t].billboardHandler.drawPicking();for(t=e.length;t--;)e[t]._fadingOpacity&&e[t].geoObjectHandler.drawPicking();for(t=e.length;t--;)e[t]._fadingOpacity&&e[t].labelHandler.drawPicking();for(t=e.length;t--;)e[t]._fadingOpacity&&e[t].rayHandler.drawPicking();for(t=e.length;t--;)e[t]._visibility&&e[t].polylineHandler.drawPicking();for(t=e.length;t--;)e[t]._visibility&&e[t].stripHandler.drawPicking()}}_entityCollectionPickingCallback(){this.drawPickingEntityCollections(this.entityCollections)}}const Ci=new class{constructor(){this._container=document.createElement("div"),this._container.classList.add("ogConsole"),this._container.style.display="none",document.body&&document.body.appendChild(this._container),this._visibility=!1}getVisibility(){return this._visibility}setVisibility(e){this._visibility!=e&&(this._visibility=e,this._visibility?this.show():this.hide())}show(){this._container.parentNode||document.body&&document.body.appendChild(this._container),this._container.style.display="block",this._visibility=!0}hide(){this._container.style.display="none",this._visibility=!1}logErr(e){let t=document.createElement("div");t.classList.add("ogConsole-text"),t.classList.add("ogConsole-error"),t.innerHTML="error: "+e,console.trace(t.innerHTML),this._container.appendChild(t),this.show()}logWrn(e){let t=document.createElement("div");t.classList.add("ogConsole-text"),t.classList.add("ogConsole-warning"),t.innerHTML="warning: "+e,console.trace(t.innerHTML),this._container.appendChild(t),this.show()}log(e){let t=document.createElement("div");t.classList.add("ogConsole-text"),t.innerHTML=e,console.trace(e),this._container.appendChild(t),this.show()}};let Li=["FLOAT","DOUBLE","BOOL","INT","UINT","VEC2","VEC3","VEC4","DVEC2","DVEC3","DVEC4","BVEC2","BVEC3","BVEC4","IVEC2","IVEC3","IVEC4","UVEC2","UVEC3","UVEC4","MAT2","DMAT2","MAT3","DMAT3","MAT4","DMAT4","MAT2X3","MAT2X4","MAT3X2","MAT3X4","MAT4X2","MAT4X3","DMAT2X3","DMAT2X4","DMAT3X2","DMAT3X4","DMAT4X2","DMAT4X3","SAMPLER1D","SAMPLER2D","SAMPLER3D","SAMPLERCUBE","SAMPLER2DSHADOW","SAMPLER2DARRAY","INTXX","FLOATXX"];const Ai={};for(let e=0;e<Li.length;e++)Ai[Li[e]]=e;const Ei={};for(let e=0;e<Li.length;e++)Ei[Li[e].toLowerCase()]=Ai[Li[e]];const Pi={u:[],a:[]};Pi.u[Ai.MAT4]=function(e,t){e.gl.uniformMatrix4fv(t._pName,!1,t.value)},Pi.u[Ai.MAT3]=function(e,t){e.gl.uniformMatrix3fv(t._pName,!1,t.value)},Pi.u[Ai.FLOAT]=function(e,t){e.gl.uniform1f(t._pName,t.value)},Pi.u[Ai.INT]=function(e,t){e.gl.uniform1i(t._pName,t.value)},Pi.u[Ai.VEC2]=function(e,t){e.gl.uniform2fv(t._pName,t.value)},Pi.u[Ai.VEC3]=function(e,t){e.gl.uniform3fv(t._pName,t.value)},Pi.u[Ai.VEC4]=function(e,t){e.gl.uniform4fv(t._pName,t.value)},Pi.u[Ai.SAMPLER2D]=function(e,t){let i=e.gl;i.activeTexture(i.TEXTURE0+e._textureID),i.bindTexture(i.TEXTURE_2D,t.value),i.uniform1i(t._pName,e._textureID),e._textureID++},Pi.u[Ai.SAMPLERCUBE]=function(e,t){let i=e.gl;i.activeTexture(i.TEXTURE0+e._textureID),i.bindTexture(i.TEXTURE_CUBE_MAP,t.value),i.uniform1i(t._pName,e._textureID),e._textureID++},Pi.u[Ai.SAMPLER2DARRAY]=function(e,t){let i=t.value,r=e.gl,n=i.length,s=new Int32Array(n);for(let t=0;t<n;t++)r.activeTexture(r.TEXTURE0+e._textureID+t),r.bindTexture(r.TEXTURE_2D,i[t]),s[t]=t;r.uniform1iv(t._pName,s)},Pi.u[Ai.INTXX]=function(e,t){e.gl.uniform1iv(t._pName,t.value)},Pi.u[Ai.FLOATXX]=function(e,t){e.gl.uniform1fv(t._pName,t.value)},Pi.a[Ai.FLOAT]=function(e,t){e.gl.vertexAttrib1f(t._pName,t.value)},Pi.a[Ai.VEC2]=function(e,t){e.gl.vertexAttrib2fv(t._pName,t.value)},Pi.a[Ai.VEC3]=function(e,t){e.gl.vertexAttrib3fv(t._pName,t.value)};const Mi=["BYTE","SHORT","UNSIGNED_BYTE","UNSIGNED_SHORT","FLOAT","HALF_FLOAT"];class Si{constructor(e,t){this.name=e,this._attributes={};for(let e in t.attributes)"string"==typeof t.attributes[e]||"number"==typeof t.attributes[e]?this._attributes[e]={type:t.attributes[e]}:this._attributes[e]=t.attributes[e];this._uniforms={};for(let e in t.uniforms)"string"==typeof t.uniforms[e]||"number"==typeof t.uniforms[e]?this._uniforms[e]={type:t.uniforms[e]}:this._uniforms[e]=t.uniforms[e];this.vertexShader=t.vertexShader,this.fragmentShader=t.fragmentShader,this.gl=null,this._variables={},this._p=null,this._textureID=0,this._attribArrays=[],this._attribDivisor=[],this.attributes={},this.uniforms={},this.vertexAttribDivisor=null,this.drawElementsInstanced=null}static bindBuffer(e,t){let i=e.gl;i&&(i.bindBuffer(i.ARRAY_BUFFER,t.value),i.vertexAttribPointer(t._pName,t.value.itemSize,t.itemType,t.normalized,0,0))}use(){this.gl&&this.gl.useProgram(this._p)}set(e){this._textureID=0;for(let t in e)this._variables[t].value=e[t],this._variables[t].func(this,this._variables[t])}apply(){this._textureID=0;let e=this._variables;for(let t in e)e[t].func(this,e[t])}drawIndexBuffer(e,t){let i=this.gl;i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t),i.drawElements(e,t.numItems,i.UNSIGNED_SHORT,0)}drawArrays(e,t){this.gl.drawArrays(e,0,t)}_getShaderCompileStatus(e,t){return!!this.gl&&(this.gl.shaderSource(e,t),this.gl.compileShader(e),!!this.gl.getShaderParameter(e,this.gl.COMPILE_STATUS)||(Ci.logErr(`Shader program "${this.name}":${this.gl.getShaderInfoLog(e)}.`),!1))}_createVertexShader(e){if(!this.gl)return;let t=this.gl.createShader(this.gl.VERTEX_SHADER);return t&&this._getShaderCompileStatus(t,e)?t:void 0}_createFragmentShader(e){if(!this.gl)return;let t=this.gl.createShader(this.gl.FRAGMENT_SHADER);return t&&this._getShaderCompileStatus(t,e)?t:void 0}disableAttribArrays(){let e=this.gl,t=this._attribArrays;for(let i=0,r=t.length;i<r;i++)e.disableVertexAttribArray(t[i]),this.vertexAttribDivisor(t[i],0)}enableAttribArrays(){let e=this.gl,t=this._attribArrays,i=this._attribDivisor;for(let r=0,n=t.length;r<n;r++)e.enableVertexAttribArray(t[r]),this.vertexAttribDivisor(t[r],i[r])}delete(){this.gl&&this.gl.deleteProgram(this._p)}createProgram(e){if(this.gl=e,this._p=this.gl.createProgram(),!this._p)return;let t=this._createFragmentShader(this.fragmentShader),i=this._createVertexShader(this.vertexShader);if(t&&i){if(e.attachShader(this._p,t),e.attachShader(this._p,i),e.linkProgram(this._p),!this.drawElementsInstanced)if(e.drawElementsInstanced)this.drawElementsInstanced=e.drawElementsInstanced.bind(e);else{let t=e.getExtension("ANGLE_instanced_arrays");t&&(this.drawElementsInstanced=t.drawElementsInstancedANGLE.bind(t))}if(!this.vertexAttribDivisor)if(e.vertexAttribDivisor)this.vertexAttribDivisor=e.vertexAttribDivisor.bind(e);else{let t=e.getExtension("ANGLE_instanced_arrays");t&&(this.vertexAttribDivisor=t.vertexAttribDivisorANGLE.bind(t))}if(!e.getProgramParameter(this._p,e.LINK_STATUS))return Ci.logErr(`Shader program "${this.name}": initialization failed. ${e.getProgramInfoLog(this._p)}.`),void e.deleteProgram(this._p);this.use();for(let t in this._attributes){this._variables[t]=this._attributes[t],this._attributes[t].func=Si.bindBuffer;let i=this._attributes[t].itemType,r=i?i.trim().toUpperCase():"FLOAT";if(-1==Mi.indexOf(r)?(Ci.logErr(`Shader program "${this.name}": attribute '${t}', item type '${this._attributes[t].itemType}' not exists.`),this._attributes[t].itemType=e.FLOAT):this._attributes[t].itemType=e[r],this._attributes[t].normalized=this._attributes[t].normalized||!1,this._attributes[t].divisor=this._attributes[t].divisor||0,this._p[t]=e.getAttribLocation(this._p,t),null==this._p[t])return Ci.logErr(`Shader program "${this.name}": attribute '${t}' not exists.`),void e.deleteProgram(this._p);let n=this._attributes[t].type;"string"==typeof n&&(n=Ei[n.trim().toLowerCase()]);let s=this._attributes[t].divisor;if(n===Ai.MAT4){let e=this._p[t];this._attribArrays.push(e,e+1,e+2,e+3),this._attribDivisor.push(s,s,s,s)}else this._attribArrays.push(this._p[t]),this._attribDivisor.push(s);e.enableVertexAttribArray(this._p[t]),this._attributes[t]._pName=this._p[t],this.attributes[t]=this._p[t]}for(let t in this._uniforms){if("string"==typeof this._uniforms[t].type){let e=this._uniforms[t].type;this._uniforms[t].func=Pi.u[Ei[e.trim().toLowerCase()]]}else this._uniforms[t].func=Pi.u[this._uniforms[t].type];if(this._variables[t]=this._uniforms[t],this._p[t]=e.getUniformLocation(this._p,t),null==this._p[t])return Ci.logErr(`Shader program "${this.name}": uniform '${t}' not exists.`),void e.deleteProgram(this._p);this._uniforms[t]._pName=this._p[t],this.uniforms[t]=this._p[t]}e.detachShader(this._p,t),e.detachShader(this._p,i),e.deleteShader(t),e.deleteShader(i)}}}const Bi="vec2 project(vec4 p) {\n return (0.5 * p.xyz / p.w + 0.5).xy * viewport;\n }",ki="mat2 rotate2d(float angle) {\n return mat2(cos(angle), -sin(angle),\n sin(angle), cos(angle));\n }";class Ri{constructor(e){this.__id=Ri.__counter__++,this.pickingEnabled=!0,this._entityCollection=e,this._renderer=null,this._billboards=[],this._positionHighBuffer=null,this._positionLowBuffer=null,this._sizeBuffer=null,this._offsetBuffer=null,this._rgbaBuffer=null,this._rotationBuffer=null,this._texCoordBuffer=null,this._vertexBuffer=null,this._pickingColorBuffer=null,this._texCoordArr=new Float32Array([]),this._vertexArr=new Float32Array([]),this._positionHighArr=new Float32Array([]),this._positionLowArr=new Float32Array([]),this._sizeArr=new Float32Array([]),this._offsetArr=new Float32Array([]),this._rgbaArr=new Float32Array([]),this._rotationArr=new Float32Array([]),this._pickingColorArr=new Float32Array([]),this._buffersUpdateCallbacks=[],this._buffersUpdateCallbacks[0]=this.createPickingColorBuffer,this._buffersUpdateCallbacks[1]=this.createPositionBuffer,this._buffersUpdateCallbacks[2]=this.createSizeBuffer,this._buffersUpdateCallbacks[3]=this.createOffsetBuffer,this._buffersUpdateCallbacks[4]=this.createRgbaBuffer,this._buffersUpdateCallbacks[5]=this.createRotationBuffer,this._buffersUpdateCallbacks[6]=this.createTexCoordBuffer,this._buffersUpdateCallbacks[7]=this.createVertexBuffer,this._changedBuffers=new Array(this._buffersUpdateCallbacks.length)}isEqual(e){return e&&e.__id===this.__id}static concArr(e,t){for(let i=0;i<t.length;i++)e.push(t[i])}initProgram(){this._renderer&&this._renderer.handler&&(this._renderer.handler.programs.billboard||this._renderer.handler.addProgram(new Si("billboard",{uniforms:{viewport:"vec2",u_texture:"sampler2d",projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",planetRadius:"float",uScaleByDistance:"vec3",opacity:"float",depthOffset:"float"},attributes:{a_vertices:"vec2",a_texCoord:"vec2",a_positionsHigh:"vec3",a_positionsLow:"vec3",a_offset:"vec3",a_size:"vec2",a_rotation:"float",a_rgba:"vec4"},vertexShader:`precision highp float;\n attribute vec2 a_vertices;\n attribute vec2 a_texCoord;\n attribute vec3 a_positionsHigh;\n attribute vec3 a_positionsLow;\n attribute vec3 a_offset;\n attribute vec2 a_size;\n attribute float a_rotation;\n attribute vec4 a_rgba;\n\n varying vec2 v_texCoords;\n varying vec4 v_rgba;\n\n uniform mat4 viewMatrix;\n uniform mat4 projectionMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform vec3 uScaleByDistance;\n uniform float opacity;\n uniform float planetRadius;\n uniform vec2 viewport;\n uniform float depthOffset;\n\n const vec3 ZERO3 = vec3(0.0);\n\n ${Bi}\n\n ${ki}\n\n void main() {\n \n vec3 a_positions = a_positionsHigh + a_positionsLow;\n vec3 cameraPos = eyePositionHigh + eyePositionLow;\n\n v_texCoords = a_texCoord;\n vec3 look = a_positions - cameraPos;\n float lookDist = length(look);\n v_rgba = a_rgba;\n\n if(opacity * step(lookDist, sqrt(dot(cameraPos,cameraPos) - planetRadius) + sqrt(dot(a_positions,a_positions) - planetRadius)) == 0.0){\n return;\n }\n\n vec3 up = vec3( viewMatrix[0][1], viewMatrix[1][1], viewMatrix[2][1] );\n vec3 right = vec3( viewMatrix[0][0], viewMatrix[1][0], viewMatrix[2][0] );\n\n float scd = (1.0 - smoothstep(uScaleByDistance[0], uScaleByDistance[1], lookDist)) * (1.0 - step(uScaleByDistance[2], lookDist));\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n vec3 highDiff = a_positionsHigh - eyePositionHigh;\n vec3 lowDiff = a_positionsLow - eyePositionLow;\n vec4 posRTE = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n vec4 projPos = projectionMatrix * posRTE;\n \n float camSlope = dot(vec3(viewMatrix[0][2], viewMatrix[1][2], viewMatrix[2][2]), normalize(cameraPos)); \n if(camSlope > 0.5) {\n float dist = dot(look, normalize(cameraPos));\n projPos.z += dist * 0.02;\n }else{\n projPos.z += -(abs(projPos.z)) * 0.002; \n }\n \n projPos.z += depthOffset + a_offset.z;\n \n vec2 screenPos = project(projPos);\n\n vec2 v = screenPos + rotate2d(a_rotation) * (a_vertices * a_size * scd + a_offset.xy);\n\n gl_Position = vec4((2.0 * v / viewport - 1.0) * projPos.w, projPos.z, projPos.w);\n }`,fragmentShader:"precision highp float;\n uniform sampler2D u_texture;\n varying vec2 v_texCoords;\n varying vec4 v_rgba;\n void main () {\n vec4 color = texture2D(u_texture, v_texCoords);\n if(color.a < 0.1)\n discard;\n gl_FragColor = color * v_rgba;\n }"})),this._renderer.handler.programs.billboardPicking||this._renderer.handler.addProgram(new Si("billboardPicking",{uniforms:{viewport:"vec2",projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",planetRadius:"float",uScaleByDistance:"vec3",opacity:"float",depthOffset:"float"},attributes:{a_vertices:"vec2",a_positionsHigh:"vec3",a_positionsLow:"vec3",a_offset:"vec3",a_size:"vec2",a_rotation:"float",a_rgba:"vec4"},vertexShader:`precision highp float;\n attribute vec2 a_vertices;\n attribute vec3 a_positionsHigh;\n attribute vec3 a_positionsLow;\n attribute vec3 a_offset;\n attribute vec2 a_size;\n attribute float a_rotation;\n attribute vec4 a_rgba;\n\n varying vec3 v_rgb;\n\n uniform mat4 viewMatrix;\n uniform mat4 projectionMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform vec3 uScaleByDistance;\n uniform float opacity;\n uniform float planetRadius;\n uniform vec2 viewport;\n uniform float depthOffset;\n\n const vec3 ZERO3 = vec3(0.0);\n\n ${Bi}\n\n ${ki}\n\n void main() {\n\n vec3 a_positions = a_positionsHigh + a_positionsLow;\n vec3 cameraPos = eyePositionHigh + eyePositionLow;\n\n vec3 look = a_positions - cameraPos;\n float lookDist = length(look);\n v_rgb = a_rgba.rgb;\n\n if(opacity * step(lookDist, sqrt(dot(cameraPos,cameraPos) - planetRadius) + sqrt(dot(a_positions,a_positions) - planetRadius)) == 0.0){\n return;\n }\n\n vec3 up = vec3( viewMatrix[0][1], viewMatrix[1][1], viewMatrix[2][1] );\n vec3 right = vec3( viewMatrix[0][0], viewMatrix[1][0], viewMatrix[2][0] );\n\n float scd = (1.0 - smoothstep(uScaleByDistance[0], uScaleByDistance[1], lookDist)) * (1.0 - step(uScaleByDistance[2], lookDist));\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n vec3 highDiff = a_positionsHigh - eyePositionHigh;\n vec3 lowDiff = a_positionsLow - eyePositionLow;\n vec4 posRTE = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n vec4 projPos = projectionMatrix * posRTE;\n \n float camSlope = dot(vec3(viewMatrix[0][2], viewMatrix[1][2], viewMatrix[2][2]), normalize(cameraPos)); \n if(camSlope > 0.5) {\n float dist = dot(look, normalize(cameraPos));\n projPos.z += dist * 0.02;\n }else{\n projPos.z += -(abs(projPos.z)) * 0.002; \n }\n \n projPos.z += depthOffset + a_offset.z;\n \n vec2 screenPos = project(projPos);\n\n vec2 v = screenPos + rotate2d(a_rotation) * (a_vertices * a_size * scd + a_offset.xy);\n\n gl_Position = vec4((2.0 * v / viewport - 1.0) * projPos.w, projPos.z, projPos.w);\n }`,fragmentShader:"precision highp float;\n varying vec3 v_rgb;\n void main () {\n gl_FragColor = vec4(v_rgb, 1.0);\n }"})))}setRenderer(e){this._renderer=e,this.initProgram()}refresh(){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]=!0}_removeBillboards(){let e=this._billboards.length;for(;e--;){let t=this._billboards[e];t._handlerIndex=-1,t._handler=null,t._isReady=!1,t._lockId=$t}this._billboards.length=0,this._billboards=[]}clear(){this._texCoordArr=null,this._vertexArr=null,this._positionHighArr=null,this._positionLowArr=null,this._sizeArr=null,this._offsetArr=null,this._rgbaArr=null,this._rotationArr=null,this._pickingColorArr=null,this._texCoordArr=new Float32Array([]),this._vertexArr=new Float32Array([]),this._positionHighArr=new Float32Array([]),this._positionLowArr=new Float32Array([]),this._sizeArr=new Float32Array([]),this._offsetArr=new Float32Array([]),this._rgbaArr=new Float32Array([]),this._rotationArr=new Float32Array([]),this._pickingColorArr=new Float32Array([]),this._removeBillboards(),this._deleteBuffers(),this.refresh()}_deleteBuffers(){if(this._renderer){let e=this._renderer.handler.gl;e.deleteBuffer(this._positionHighBuffer),e.deleteBuffer(this._positionLowBuffer),e.deleteBuffer(this._sizeBuffer),e.deleteBuffer(this._offsetBuffer),e.deleteBuffer(this._rgbaBuffer),e.deleteBuffer(this._rotationBuffer),e.deleteBuffer(this._vertexBuffer),e.deleteBuffer(this._texCoordBuffer),e.deleteBuffer(this._pickingColorBuffer)}this._positionHighBuffer=null,this._positionLowBuffer=null,this._sizeBuffer=null,this._offsetBuffer=null,this._rgbaBuffer=null,this._rotationBuffer=null,this._vertexBuffer=null,this._texCoordBuffer=null,this._pickingColorBuffer=null}update(){if(this._renderer){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]&&(this._buffersUpdateCallbacks[e].call(this),this._changedBuffers[e]=!1)}}add(e){-1==e._handlerIndex&&(e._isReady=!0,e._handler=this,e._handlerIndex=this._billboards.length,this._billboards.push(e))}_displayPASS(){let e=this._renderer,t=e.handler;t.programs.billboard.activate();let i=t.programs.billboard._program,r=i.attributes,n=i.uniforms,s=t.gl,a=this._entityCollection;s.disable(s.CULL_FACE),s.uniform1f(n.depthOffset,a.polygonOffsetUnits),s.uniform1i(n.u_texture,0),s.uniformMatrix4fv(n.viewMatrix,!1,e.activeCamera.getViewMatrix()),s.uniformMatrix4fv(n.projectionMatrix,!1,e.activeCamera.getProjectionMatrix()),s.uniform3fv(n.eyePositionHigh,e.activeCamera.eyeHigh),s.uniform3fv(n.eyePositionLow,e.activeCamera.eyeLow),s.uniform3fv(n.uScaleByDistance,a.scaleByDistance),s.uniform1f(n.opacity,a._fadingOpacity),s.bindBuffer(s.ARRAY_BUFFER,this._texCoordBuffer),s.vertexAttribPointer(r.a_texCoord,this._texCoordBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._vertexBuffer),s.vertexAttribPointer(r.a_vertices,this._vertexBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._positionHighBuffer),s.vertexAttribPointer(r.a_positionsHigh,this._positionHighBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._positionLowBuffer),s.vertexAttribPointer(r.a_positionsLow,this._positionLowBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._rgbaBuffer),s.vertexAttribPointer(r.a_rgba,this._rgbaBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._sizeBuffer),s.vertexAttribPointer(r.a_size,this._sizeBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._offsetBuffer),s.vertexAttribPointer(r.a_offset,this._offsetBuffer.itemSize,s.FLOAT,!1,0,0),s.uniform1f(n.planetRadius,a.renderNode._planetRadius2||0),s.uniform2fv(n.viewport,[t.canvas.clientWidth,t.canvas.clientHeight]),s.bindBuffer(s.ARRAY_BUFFER,this._rotationBuffer),s.vertexAttribPointer(r.a_rotation,this._rotationBuffer.itemSize,s.FLOAT,!1,0,0),s.drawArrays(s.TRIANGLES,0,this._vertexBuffer.numItems),s.enable(s.CULL_FACE)}_pickingPASS(){let e=this._renderer,t=e.handler;t.programs.billboardPicking.activate();let i=t.programs.billboardPicking._program,r=i.attributes,n=i.uniforms,s=t.gl,a=this._entityCollection;s.disable(s.CULL_FACE),s.uniform1f(n.depthOffset,a.polygonOffsetUnits),s.uniformMatrix4fv(n.viewMatrix,!1,e.activeCamera.getViewMatrix()),s.uniformMatrix4fv(n.projectionMatrix,!1,e.activeCamera.getProjectionMatrix()),s.uniform3fv(n.eyePositionHigh,e.activeCamera.eyeHigh),s.uniform3fv(n.eyePositionLow,e.activeCamera.eyeLow),s.uniform3fv(n.uScaleByDistance,a.scaleByDistance),s.uniform1f(n.opacity,a._fadingOpacity),s.bindBuffer(s.ARRAY_BUFFER,this._vertexBuffer),s.vertexAttribPointer(r.a_vertices,this._vertexBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._positionHighBuffer),s.vertexAttribPointer(r.a_positionsHigh,this._positionHighBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._positionLowBuffer),s.vertexAttribPointer(r.a_positionsLow,this._positionLowBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._pickingColorBuffer),s.vertexAttribPointer(r.a_rgba,this._pickingColorBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._sizeBuffer),s.vertexAttribPointer(r.a_size,this._sizeBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._offsetBuffer),s.vertexAttribPointer(r.a_offset,this._offsetBuffer.itemSize,s.FLOAT,!1,0,0),s.uniform1f(n.planetRadius,a.renderNode._planetRadius2||0),s.uniform2fv(n.viewport,[t.canvas.clientWidth,t.canvas.clientHeight]),s.bindBuffer(s.ARRAY_BUFFER,this._rotationBuffer),s.vertexAttribPointer(r.a_rotation,this._rotationBuffer.itemSize,s.FLOAT,!1,0,0),s.drawArrays(s.TRIANGLES,0,this._vertexBuffer.numItems),s.enable(s.CULL_FACE)}draw(){this._billboards.length&&(this.update(),this._displayPASS())}drawPicking(){this._billboards.length&&this.pickingEnabled&&this._pickingPASS()}reindexBillboardsArray(e){let t=this._billboards;for(let i=e;i<t.length;i++)t[i]._handlerIndex=i}_removeBillboard(e){let t=e._handlerIndex;this._billboards.splice(t,1);let i=24*t;this._rgbaArr=Oe(this._rgbaArr,i,24),i=18*t,this._positionHighArr=Oe(this._positionHighArr,i,18),this._positionLowArr=Oe(this._positionLowArr,i,18),this._offsetArr=Oe(this._offsetArr,i,18),this._pickingColorArr=Oe(this._pickingColorArr,i,18),i=12*t,this._vertexArr=Oe(this._vertexArr,i,12),this._sizeArr=Oe(this._sizeArr,i,12),this._texCoordArr=Oe(this._texCoordArr,i,12),i=6*t,this._rotationArr=Oe(this._rotationArr,i,6),this.reindexBillboardsArray(t),this.refresh(),e._handlerIndex=-1,e._handler=null,e._isReady=!1,e._lockId=$t}setAlignedAxisArr(e,t){}remove(e){e._handler&&(e._isReady&&this.__id===e._handler.__id?this._removeBillboard(e):e._handler=null)}setPositionArr(e,t,i){let r=18*e,n=this._positionHighArr,s=t.x,a=t.y,o=t.z;n[r]=s,n[r+1]=a,n[r+2]=o,n[r+3]=s,n[r+4]=a,n[r+5]=o,n[r+6]=s,n[r+7]=a,n[r+8]=o,n[r+9]=s,n[r+10]=a,n[r+11]=o,n[r+12]=s,n[r+13]=a,n[r+14]=o,n[r+15]=s,n[r+16]=a,n[r+17]=o,n=this._positionLowArr,s=i.x,a=i.y,o=i.z,n[r]=s,n[r+1]=a,n[r+2]=o,n[r+3]=s,n[r+4]=a,n[r+5]=o,n[r+6]=s,n[r+7]=a,n[r+8]=o,n[r+9]=s,n[r+10]=a,n[r+11]=o,n[r+12]=s,n[r+13]=a,n[r+14]=o,n[r+15]=s,n[r+16]=a,n[r+17]=o,this._changedBuffers[1]=!0}setPickingColorArr(e,t){let i=18*e,r=this._pickingColorArr,n=t.x/255,s=t.y/255,a=t.z/255;r[i]=n,r[i+1]=s,r[i+2]=a,r[i+3]=n,r[i+4]=s,r[i+5]=a,r[i+6]=n,r[i+7]=s,r[i+8]=a,r[i+9]=n,r[i+10]=s,r[i+11]=a,r[i+12]=n,r[i+13]=s,r[i+14]=a,r[i+15]=n,r[i+16]=s,r[i+17]=a,this._changedBuffers[0]=!0}setSizeArr(e,t,i){let r=12*e,n=this._sizeArr,s=t,a=i;n[r]=s,n[r+1]=a,n[r+2]=s,n[r+3]=a,n[r+4]=s,n[r+5]=a,n[r+6]=s,n[r+7]=a,n[r+8]=s,n[r+9]=a,n[r+10]=s,n[r+11]=a,this._changedBuffers[2]=!0}setOffsetArr(e,t){let i=18*e,r=this._offsetArr,n=t.x,s=t.y,a=t.z;r[i]=n,r[i+1]=s,r[i+2]=a,r[i+3]=n,r[i+4]=s,r[i+5]=a,r[i+6]=n,r[i+7]=s,r[i+8]=a,r[i+9]=n,r[i+10]=s,r[i+11]=a,r[i+12]=n,r[i+13]=s,r[i+14]=a,r[i+15]=n,r[i+16]=s,r[i+17]=a,this._changedBuffers[3]=!0}setRgbaArr(e,t){let i=24*e,r=this._rgbaArr,n=t.x,s=t.y,a=t.z,o=t.w;r[i]=n,r[i+1]=s,r[i+2]=a,r[i+3]=o,r[i+4]=n,r[i+5]=s,r[i+6]=a,r[i+7]=o,r[i+8]=n,r[i+9]=s,r[i+10]=a,r[i+11]=o,r[i+12]=n,r[i+13]=s,r[i+14]=a,r[i+15]=o,r[i+16]=n,r[i+17]=s,r[i+18]=a,r[i+19]=o,r[i+20]=n,r[i+21]=s,r[i+22]=a,r[i+23]=o,this._changedBuffers[4]=!0}setRotationArr(e,t){let i=6*e,r=this._rotationArr;r[i]=t,r[i+1]=t,r[i+2]=t,r[i+3]=t,r[i+4]=t,r[i+5]=t,this._changedBuffers[5]=!0}setTexCoordArr(e,t){let i=12*e,r=this._texCoordArr;r[i]=t[0],r[i+1]=t[1],r[i+2]=t[2],r[i+3]=t[3],r[i+4]=t[4],r[i+5]=t[5],r[i+6]=t[6],r[i+7]=t[7],r[i+8]=t[8],r[i+9]=t[9],r[i+10]=t[10],r[i+11]=t[11],this._changedBuffers[6]=!0}setVisibility(e,t){let i;i=t?[-.5,.5,-.5,-.5,.5,-.5,.5,-.5,.5,.5,-.5,.5]:[0,0,0,0,0,0,0,0,0,0,0,0],this.setVertexArr(e,i)}setVertexArr(e,t){let i=12*e,r=this._vertexArr;r[i]=t[0],r[i+1]=t[1],r[i+2]=t[2],r[i+3]=t[3],r[i+4]=t[4],r[i+5]=t[5],r[i+6]=t[6],r[i+7]=t[7],r[i+8]=t[8],r[i+9]=t[9],r[i+10]=t[10],r[i+11]=t[11],this._changedBuffers[7]=!0}createPositionBuffer(){let e=this._renderer.handler,t=this._positionHighArr.length/3;this._positionHighBuffer&&this._positionHighBuffer.numItems===t||(e.gl.deleteBuffer(this._positionHighBuffer),e.gl.deleteBuffer(this._positionLowBuffer),this._positionHighBuffer=e.createStreamArrayBuffer(3,t),this._positionLowBuffer=e.createStreamArrayBuffer(3,t)),e.setStreamArrayBuffer(this._positionHighBuffer,this._positionHighArr),e.setStreamArrayBuffer(this._positionLowBuffer,this._positionLowArr)}createSizeBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._sizeBuffer),this._sizeBuffer=e.createArrayBuffer(this._sizeArr,2,this._sizeArr.length/2)}createOffsetBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._offsetBuffer),this._offsetBuffer=e.createArrayBuffer(this._offsetArr,3,this._offsetArr.length/3)}createRgbaBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._rgbaBuffer),this._rgbaBuffer=e.createArrayBuffer(this._rgbaArr,4,this._rgbaArr.length/4)}createRotationBuffer(){let e=this._renderer.handler;this._rotationBuffer&&this._rotationBuffer.numItems===this._rotationArr.length||(e.gl.deleteBuffer(this._rotationBuffer),this._rotationBuffer=e.createStreamArrayBuffer(1,this._rotationArr.length)),e.setStreamArrayBuffer(this._rotationBuffer,this._rotationArr)}createVertexBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._vertexBuffer),this._vertexBuffer=e.createArrayBuffer(this._vertexArr,2,this._vertexArr.length/2)}createTexCoordBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._texCoordBuffer),this._texCoordBuffer=e.createArrayBuffer(this._texCoordArr,2,this._texCoordArr.length/2)}createPickingColorBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._pickingColorBuffer),this._pickingColorBuffer=e.createArrayBuffer(this._pickingColorArr,3,this._pickingColorArr.length/3)}refreshTexCoordsArr(){}}Ri.__counter__=0;class zi extends Ri{constructor(e){super(e),this._billboards=[]}add(e){if(-1==e._handlerIndex){super.add(e),this._addBillboardToArrays(e),this.refresh();let t=e.getSrc()||e.getImage()&&e.getImage().src;t&&e.setSrc(t)}}_addBillboardToArrays(e){e.getVisibility()?this._vertexArr=Ie(this._vertexArr,[-.5,.5,-.5,-.5,.5,-.5,.5,-.5,.5,.5,-.5,.5]):this._vertexArr=Ie(this._vertexArr,[0,0,0,0,0,0,0,0,0,0,0,0]),this._texCoordArr=Ie(this._texCoordArr,[0,0,0,0,0,0,0,0,0,0,0,0]);let t,i=e._positionHigh.x,r=e._positionHigh.y,n=e._positionHigh.z;this._positionHighArr=Ie(this._positionHighArr,[i,r,n,i,r,n,i,r,n,i,r,n,i,r,n,i,r,n]),i=e._positionLow.x,r=e._positionLow.y,n=e._positionLow.z,this._positionLowArr=Ie(this._positionLowArr,[i,r,n,i,r,n,i,r,n,i,r,n,i,r,n,i,r,n]),i=e._width,r=e._height,this._sizeArr=Ie(this._sizeArr,[i,r,i,r,i,r,i,r,i,r,i,r]),i=e._offset.x,r=e._offset.y,n=e._offset.z,this._offsetArr=Ie(this._offsetArr,[i,r,n,i,r,n,i,r,n,i,r,n,i,r,n,i,r,n]),i=e._color.x,r=e._color.y,n=e._color.z,t=e._color.w,this._rgbaArr=Ie(this._rgbaArr,[i,r,n,t,i,r,n,t,i,r,n,t,i,r,n,t,i,r,n,t,i,r,n,t]),i=e._rotation,this._rotationArr=Ie(this._rotationArr,[i,i,i,i,i,i]),i=e._entity._pickingColor.x/255,r=e._entity._pickingColor.y/255,n=e._entity._pickingColor.z/255,this._pickingColorArr=Ie(this._pickingColorArr,[i,r,n,i,r,n,i,r,n,i,r,n,i,r,n,i,r,n])}get billboards(){return this._billboards}refreshTexCoordsArr(){if(this._entityCollection&&this._renderer){let e=this._renderer.billboardsTextureAtlas;for(let t=0;t<this._billboards.length;t++){let i=this._billboards[t],r=i.getImage();if(r){let t=e.get(r.__nodeIndex);t&&this.setTexCoordArr(i._handlerIndex,t.texCoords)}}}}}function Ii(e,t=0,i=0,r=1,...n){const s=t*i;for(let t=s,a=s+i;t<a;t++)e[t]=n[t%r];return e}class Fi{constructor(e){this.isFree=!0,this._geoObjectHandler=e,this.geoObjects=[],this.numInstances=0,this._texture=null,this._textureSrc=null,this._pitchRollArr=[],this._sizeArr=[],this._vertexArr=[],this._positionHighArr=[],this._positionLowArr=[],this._directionArr=[],this._rgbaArr=[],this._normalsArr=[],this._indicesArr=[],this._pickingColorArr=[],this._visibleArr=[],this._texCoordArr=[],this._pitchRollBuffer=null,this._sizeBuffer=null,this._vertexBuffer=null,this._positionHighBuffer=null,this._positionLowBuffer=null,this._directionBuffer=null,this._rgbaBuffer=null,this._normalsBuffer=null,this._indicesBuffer=null,this._pickingColorBuffer=null,this._visibleBuffer=null,this._texCoordBuffer=null,this._buffersUpdateCallbacks=[],this._buffersUpdateCallbacks[8]=this.createPickingColorBuffer,this._buffersUpdateCallbacks[1]=this.createPositionBuffer,this._buffersUpdateCallbacks[5]=this.createDirectionBuffer,this._buffersUpdateCallbacks[3]=this.createNormalsBuffer,this._buffersUpdateCallbacks[2]=this.createRgbaBuffer,this._buffersUpdateCallbacks[4]=this.createIndicesBuffer,this._buffersUpdateCallbacks[0]=this.createVertexBuffer,this._buffersUpdateCallbacks[7]=this.createSizeBuffer,this._buffersUpdateCallbacks[6]=this.createPitchRollBuffer,this._buffersUpdateCallbacks[9]=this.createVisibleBuffer,this._buffersUpdateCallbacks[10]=this.createTexCoordBuffer,this._changedBuffers=new Array(this._buffersUpdateCallbacks.length)}createTexture(e){this._geoObjectHandler&&this._geoObjectHandler._planet&&(this._texture=this._geoObjectHandler._planet.renderer.handler.createTextureDefault(e))}clear(){this.numInstances=0,this.geoObjects=[],this._pitchRollArr=[],this._sizeArr=[],this._vertexArr=[],this._positionHighArr=[],this._positionLowArr=[],this._directionArr=[],this._rgbaArr=[],this._normalsArr=[],this._indicesArr=[],this._pickingColorArr=[],this._visibleArr=[],this._texCoordArr=[],this._deleteBuffers(),this.isFree=!1}_deleteBuffers(){if(this._geoObjectHandler&&this._geoObjectHandler._planet&&this._geoObjectHandler._planet.renderer){let e=this._geoObjectHandler._planet.renderer.handler,t=e.gl;e.deleteTexture(this._texture),this._texture=null,t.deleteBuffer(this._pitchRollBuffer),t.deleteBuffer(this._sizeBuffer),t.deleteBuffer(this._vertexBuffer),t.deleteBuffer(this._positionHighBuffer),t.deleteBuffer(this._positionLowBuffer),t.deleteBuffer(this._directionBuffer),t.deleteBuffer(this._rgbaBuffer),t.deleteBuffer(this._normalsBuffer),t.deleteBuffer(this._indicesBuffer),t.deleteBuffer(this._pickingColorBuffer),t.deleteBuffer(this._visibleBuffer),t.deleteBuffer(this._texCoordBuffer)}this._pitchRollBuffer=null,this._sizeBuffer=null,this._vertexBuffer=null,this._positionHighBuffer=null,this._positionLowBuffer=null,this._directionBuffer=null,this._rgbaBuffer=null,this._normalsBuffer=null,this._indicesBuffer=null,this._pickingColorBuffer=null,this._visibleBuffer=null,this._texCoordBuffer=null}createVertexBuffer(){const e=this._geoObjectHandler._planet.renderer.handler;e.gl.deleteBuffer(this._vertexBuffer),this._vertexArr=De(this._vertexArr),this._vertexBuffer=e.createArrayBuffer(this._vertexArr,3,this._vertexArr.length/3)}createPitchRollBuffer(){let e=this._geoObjectHandler._planet.renderer.handler,t=this._pitchRollArr.length/2;this._pitchRollBuffer&&this._pitchRollBuffer.numItems===t||(e.gl.deleteBuffer(this._pitchRollBuffer),this._pitchRollBuffer=e.createStreamArrayBuffer(2,t)),this._pitchRollArr=De(this._pitchRollArr),e.setStreamArrayBuffer(this._pitchRollBuffer,this._pitchRollArr)}createVisibleBuffer(){const e=this._geoObjectHandler._planet.renderer.handler,t=this._visibleArr.length;this._visibleBuffer&&this._visibleBuffer.numItems===t||(e.gl.deleteBuffer(this._visibleBuffer),this._visibleBuffer=e.createStreamArrayBuffer(1,t)),this._visibleArr=De(this._visibleArr),e.setStreamArrayBuffer(this._visibleBuffer,this._visibleArr)}createSizeBuffer(){let e=this._geoObjectHandler._planet.renderer.handler,t=this._sizeArr.length;this._sizeBuffer&&this._sizeBuffer.numItems===t||(e.gl.deleteBuffer(this._sizeBuffer),this._sizeBuffer=e.createStreamArrayBuffer(1,t)),this._sizeArr=De(this._sizeArr),e.setStreamArrayBuffer(this._sizeBuffer,this._sizeArr)}createTexCoordBuffer(){const e=this._geoObjectHandler._planet.renderer.handler;e.gl.deleteBuffer(this._texCoordBuffer),this._texCoordArr=De(this._texCoordArr),this._texCoordBuffer=e.createArrayBuffer(this._texCoordArr,2,this._texCoordArr.length/2)}createPositionBuffer(){let e=this._geoObjectHandler._planet.renderer.handler,t=this._positionHighArr.length/3;this._positionHighBuffer&&this._positionHighBuffer.numItems===t||(e.gl.deleteBuffer(this._positionHighBuffer),e.gl.deleteBuffer(this._positionLowBuffer),this._positionHighBuffer=e.createStreamArrayBuffer(3,t),this._positionLowBuffer=e.createStreamArrayBuffer(3,t)),this._positionHighArr=De(this._positionHighArr),this._positionLowArr=De(this._positionLowArr),e.setStreamArrayBuffer(this._positionHighBuffer,this._positionHighArr),e.setStreamArrayBuffer(this._positionLowBuffer,this._positionLowArr)}createRgbaBuffer(){let e=this._geoObjectHandler._planet.renderer.handler,t=this._rgbaArr.length/4;this._rgbaBuffer&&this._rgbaBuffer.numItems===t||(e.gl.deleteBuffer(this._rgbaBuffer),this._rgbaBuffer=e.createStreamArrayBuffer(4,t)),this._rgbaArr=De(this._rgbaArr),e.setStreamArrayBuffer(this._rgbaBuffer,this._rgbaArr)}createDirectionBuffer(){let e=this._geoObjectHandler._planet.renderer.handler,t=this._directionArr.length/3;this._directionBuffer&&this._directionBuffer.numItems===t||(e.gl.deleteBuffer(this._directionBuffer),this._directionBuffer=e.createStreamArrayBuffer(3,t)),this._directionArr=De(this._directionArr),e.setStreamArrayBuffer(this._directionBuffer,this._directionArr)}createNormalsBuffer(){const e=this._geoObjectHandler._planet.renderer.handler;e.gl.deleteBuffer(this._normalsBuffer),this._normalsArr=De(this._normalsArr),this._normalsBuffer=e.createArrayBuffer(this._normalsArr,3,this._normalsArr.length/3)}createIndicesBuffer(){const e=this._geoObjectHandler._planet.renderer.handler;e.gl.deleteBuffer(this._indicesBuffer),this._indicesArr=De(this._indicesArr,Uint32Array),this._indicesBuffer=e.createElementArrayBuffer(this._indicesArr,1,this._indicesArr.length)}createPickingColorBuffer(){const e=this._geoObjectHandler._planet.renderer.handler;e.gl.deleteBuffer(this._pickingColorBuffer),this._pickingColorArr=De(this._pickingColorArr),this._pickingColorBuffer=e.createArrayBuffer(this._pickingColorArr,3,this._pickingColorArr.length/3)}refresh(){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]=!0}update(){if(this._geoObjectHandler._planet){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]&&(this._buffersUpdateCallbacks[e].call(this),this._changedBuffers[e]=!1);this.isFree=!0}}}class Di{constructor(e){this.__id=Di.__counter__++,this.pickingEnabled=!0,this._entityCollection=e,this._planet=null,this._geoObjects=[],this._instanceDataMap=new Map,this._instanceDataMapValues=[],this._dataTagUpdateQueue=[]}initProgram(){this._planet&&this._planet.renderer&&(this._planet.renderer.handler.programs.geo_object||this._planet.renderer.handler.addProgram(new Si("geo_object",{uniforms:{viewMatrix:"mat4",projectionMatrix:"mat4",uScaleByDistance:"vec3",eyePositionHigh:"vec3",eyePositionLow:"vec3",lightsPositions:"vec3",lightsParamsv:"vec3",lightsParamsf:"float",uTexture:"sampler2d",uUseTexture:"float"},attributes:{aVertexPosition:"vec3",aVertexNormal:"vec3",aTexCoord:"vec2",aPositionHigh:{type:"vec3",divisor:1},aPositionLow:{type:"vec3",divisor:1},aDirection:{type:"vec3",divisor:1},aPitchRoll:{type:"vec2",divisor:1},aColor:{type:"vec4",divisor:1},aScale:{type:"float",divisor:1},aDispose:{type:"float",divisor:1}},vertexShader:"precision highp float;\n \n attribute vec3 aVertexPosition;\n attribute vec3 aVertexNormal; \n attribute vec3 aPositionHigh;\n attribute vec3 aPositionLow; \n attribute vec3 aDirection;\n attribute vec2 aPitchRoll;\n attribute vec4 aColor;\n attribute float aScale;\n attribute float aDispose;\n attribute float aUseTexture;\n attribute vec2 aTexCoord;\n \n uniform float uUseTexture;\n uniform vec3 uScaleByDistance;\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n \n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n\n varying vec3 cameraPosition;\n varying vec3 vNormal;\n varying vec3 v_vertex; \n varying vec4 vColor;\n varying float vDispose;\n varying float vUseTexture;\n varying vec2 vTexCoords;\n \n const float PI = 3.141592653589793;\n \n const float RADIANS = PI / 180.0;\n \n void main(void) {\n \n if (aDispose == 0.0) {\n return;\n }\n \n vUseTexture = uUseTexture;\n vColor = aColor;\n vTexCoords = aTexCoord;\n \n float roll = aPitchRoll.y;\n mat3 rotZ = mat3(\n vec3(cos(roll), sin(roll), 0.0),\n vec3(-sin(roll), cos(roll), 0.0), \n vec3(0.0, 0.0, 1.0) \n );\n\n float pitch = aPitchRoll.x;\n mat3 rotX = mat3(\n vec3(1.0, 0.0, 0.0),\n vec3(0.0, cos(pitch), sin(pitch)), \n vec3(0.0, -sin(pitch), cos(pitch)) \n );\n\n vec3 position = aPositionHigh + aPositionLow;\n cameraPosition = eyePositionHigh + eyePositionLow;\n vec3 r = cross(normalize(-position), aDirection);\n mat3 modelMatrix = mat3(r, normalize(position), -aDirection) * rotX * rotZ;\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n vec3 highDiff = aPositionHigh - eyePositionHigh;\n vec3 lowDiff = aPositionLow - eyePositionLow;\n \n vec3 look = cameraPosition - position;\n float lookLength = length(look);\n vNormal = modelMatrix * aVertexNormal;\n \n // if(lookLength > uScaleByDistance[1])\n // {\n // scd = uScaleByDistance[1] / uScaleByDistance[0];\n // }\n // else if(lookLength > uScaleByDistance[0])\n // {\n // scd = lookLength / uScaleByDistance[0];\n // }\n // ... is the same math\n float scd = uScaleByDistance[2] * clamp(lookLength, uScaleByDistance[0], uScaleByDistance[1]) / uScaleByDistance[0];\n \n vec3 vert = modelMatrix * aVertexPosition * aScale * scd;\n v_vertex = position + vert;\n \n // @hack\n // Mac/Safari affects on lowDiff somehow. \n vert += lowDiff;\n \n gl_Position = projectionMatrix * viewMatrixRTE * vec4(highDiff + vert, 1.0);\n }",fragmentShader:"precision highp float;\n\n #define MAX_POINT_LIGHTS 1\n \n uniform vec3 lightsPositions[MAX_POINT_LIGHTS];\n uniform vec3 lightsParamsv[MAX_POINT_LIGHTS * 3];\n uniform float lightsParamsf[MAX_POINT_LIGHTS]; \n uniform sampler2D uTexture;\n \n varying vec3 cameraPosition;\n varying vec3 v_vertex; \n varying vec4 vColor;\n varying vec3 vNormal;\n varying vec2 vTexCoords;\n varying float vUseTexture;\n \n void main(void) { \n vec3 normal = normalize(vNormal);\n \n vec3 lightDir = normalize(lightsPositions[0]);\n vec3 viewDir = normalize(cameraPosition - v_vertex); \n vec3 reflectionDirection = reflect(-lightDir, normal);\n float reflection = max( dot(reflectionDirection, viewDir), 0.0);\n float specularLightWeighting = pow( reflection, lightsParamsf[0]); \n float diffuseLightWeighting = max(dot(normal, lightDir), 0.0);\n vec3 lightWeighting = lightsParamsv[0] + lightsParamsv[1] * diffuseLightWeighting + lightsParamsv[2] * specularLightWeighting;\n vec4 tColor = texture2D(uTexture, vTexCoords);\n if(vUseTexture > 0.0){\n gl_FragColor = vec4(tColor.rgb * lightWeighting, tColor.a);\n } else {\n gl_FragColor = vec4(vColor.rgb * lightWeighting, vColor.a);\n }\n }"})),this._planet.renderer.handler.programs.geo_object_picking||this._planet.renderer.handler.addProgram(new Si("geo_object_picking",{uniforms:{viewMatrix:"mat4",projectionMatrix:"mat4",uScaleByDistance:"vec3",eyePositionHigh:"vec3",eyePositionLow:"vec3",pickingScale:"float"},attributes:{aVertexPosition:"vec3",aPositionHigh:{type:"vec3",divisor:1},aPositionLow:{type:"vec3",divisor:1},aDirection:{type:"vec3",divisor:1},aPitchRoll:{type:"vec2",divisor:1},aPickingColor:{type:"vec3",divisor:1},aScale:{type:"float",divisor:1},aDispose:{type:"float",divisor:1}},vertexShader:"precision highp float;\n\n attribute vec3 aVertexPosition;\n attribute vec3 aPositionHigh;\n attribute vec3 aPositionLow; \n attribute vec3 aDirection;\n attribute vec3 aPickingColor;\n attribute vec2 aPitchRoll;\n attribute float aScale;\n attribute float aDispose;\n \n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform vec3 uScaleByDistance;\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n uniform float pickingScale;\n\n varying vec3 vColor;\n \n const float RADIANS = 3.141592653589793 / 180.0;\n\n void main(void) {\n\n if (aDispose == 0.0) {\n return;\n }\n \n vColor = aPickingColor;\n \n float roll = aPitchRoll.y;\n mat3 rotZ = mat3(\n vec3(cos(roll), sin(roll), 0.0),\n vec3(-sin(roll), cos(roll), 0.0), \n vec3(0.0, 0.0, 1.0) \n );\n \n float pitch = aPitchRoll.x;\n mat3 rotX = mat3(\n vec3(1.0, 0.0, 0.0),\n vec3(0.0, cos(pitch), sin(pitch)), \n vec3(0.0, -sin(pitch), cos(pitch)) \n );\n \n vec3 position = aPositionHigh + aPositionLow;\n vec3 cameraPosition = eyePositionHigh + eyePositionLow;\n vec3 r = cross(normalize(-position), aDirection);\n mat3 modelMatrix = mat3(r, normalize(position), -aDirection) * rotX * rotZ;\n \n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n \n vec3 highDiff = aPositionHigh - eyePositionHigh;\n vec3 lowDiff = aPositionLow - eyePositionLow;\n \n vec3 look = cameraPosition - position;\n float lookLength = length(look);\n \n // if(lookLength > uScaleByDistance[1])\n // {\n // scd = uScaleByDistance[1] / uScaleByDistance[0];\n // }\n // else if(lookLength > uScaleByDistance[0])\n // {\n // scd = lookLength / uScaleByDistance[0];\n // }\n // ... is the same math above\n // @hack\n // pickingScale replace to this line, because when it s\n // tays in the vert above it affects on Mac Safari jitter\n float scd = pickingScale * uScaleByDistance[2] * clamp(lookLength, uScaleByDistance[0], uScaleByDistance[1]) / uScaleByDistance[0];\n\n vec3 vert = modelMatrix * aVertexPosition * aScale * scd;\n \n vert += lowDiff;\n \n gl_Position = projectionMatrix * viewMatrixRTE * vec4(highDiff + vert, 1.0);\n }",fragmentShader:"precision highp float;\n varying vec3 vColor;\n void main () {\n gl_FragColor = vec4(vColor, 1.0);\n }"})))}setRenderNode(e){this._planet=e,this.initProgram();for(let e=0;e<this._instanceDataMapValues.length;e++)this._loadDataTagTexture(this._instanceDataMapValues[e]);for(let e=0;e<this._geoObjects.length;e++)this._geoObjects[e].updateDirection();this.update()}_addGeoObjectToArray(e){const t=e.tag;let i=this._instanceDataMap.get(t);i||(i=new Fi(this),this._instanceDataMap.set(t,i),this._instanceDataMapValues=Array.from(this._instanceDataMap.values()),i._vertexArr=e.vertices,i._normalsArr=e.normals,i._indicesArr=e.indices,i._texCoordArr=e.texCoords,i._textureSrc=e.object3d.src,this._loadDataTagTexture(i)),e._tagDataIndex=i.numInstances++,e._tagData=i,i.geoObjects.push(e);let r=3;i._visibleArr=Fe(i._visibleArr,Ii([],0,1,1,e.getVisibility()?1:0));let n,s=e._positionHigh.x,a=e._positionHigh.y,o=e._positionHigh.z;i._positionHighArr=Fe(i._positionHighArr,Ii([],0,r,r,s,a,o)),s=e._positionLow.x,a=e._positionLow.y,o=e._positionLow.z,i._positionLowArr=Fe(i._positionLowArr,Ii([],0,r,r,s,a,o)),s=e._entity._pickingColor.x/255,a=e._entity._pickingColor.y/255,o=e._entity._pickingColor.z/255,i._pickingColorArr=Fe(i._pickingColorArr,Ii([],0,r,r,s,a,o)),s=e._direction.x,a=e._direction.y,o=e._direction.z,i._directionArr=Fe(i._directionArr,Ii([],0,r,r,s,a,o)),r=4,s=e._color.x,a=e._color.y,o=e._color.z,n=e._color.w,i._rgbaArr=Fe(i._rgbaArr,Ii([],0,r,r,s,a,o,n)),r=2,s=e.getPitch(),a=e.getRoll(),i._pitchRollArr=Fe(i._pitchRollArr,Ii([],0,r,r,s,a)),r=1,i._sizeArr=Fe(i._sizeArr,Ii([],0,r,r,e.getScale()))}_displayPASS(){let e=this._planet.renderer,t=e.handler.programs.geo_object,i=t._program,r=i.uniforms,n=i.attributes,s=e.handler.gl,a=this._entityCollection;t.activate(),s.uniform3fv(r.uScaleByDistance,a.scaleByDistance),s.uniform3fv(r.eyePositionHigh,e.activeCamera.eyeHigh),s.uniform3fv(r.eyePositionLow,e.activeCamera.eyeLow),s.uniformMatrix4fv(r.projectionMatrix,!1,e.activeCamera.getProjectionMatrix()),s.uniformMatrix4fv(r.viewMatrix,!1,e.activeCamera.getViewMatrix()),s.uniform3fv(r.lightsPositions,this._planet._lightsPositions),s.uniform3fv(r.lightsParamsv,this._planet._lightsParamsv),s.uniform1fv(r.lightsParamsf,this._planet._lightsParamsf);for(let t=0;t<this._instanceDataMapValues.length;t++){let a=this._instanceDataMapValues[t];s.bindBuffer(s.ARRAY_BUFFER,a._directionBuffer),s.vertexAttribPointer(n.aDirection,a._directionBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,a._sizeBuffer),s.vertexAttribPointer(n.aScale,a._sizeBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,a._pitchRollBuffer),s.vertexAttribPointer(n.aPitchRoll,a._pitchRollBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,a._rgbaBuffer),s.vertexAttribPointer(n.aColor,a._rgbaBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,a._visibleBuffer),s.vertexAttribPointer(n.aDispose,a._visibleBuffer.itemSize,s.FLOAT,!1,0,0),s.uniform1f(r.uUseTexture,a._texture?1:0),s.bindBuffer(s.ARRAY_BUFFER,a._positionHighBuffer),s.vertexAttribPointer(n.aPositionHigh,a._positionHighBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,a._positionLowBuffer),s.vertexAttribPointer(n.aPositionLow,a._positionLowBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,a._normalsBuffer),s.vertexAttribPointer(n.aVertexNormal,a._normalsBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,a._vertexBuffer),s.vertexAttribPointer(n.aVertexPosition,a._vertexBuffer.itemSize,s.FLOAT,!1,0,0),s.activeTexture(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,a._texture||e.handler.defaultTexture),s.uniform1i(r.uTexture,0),s.bindBuffer(s.ARRAY_BUFFER,a._texCoordBuffer),s.vertexAttribPointer(n.aTexCoord,a._texCoordBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,a._indicesBuffer),i.drawElementsInstanced(s.TRIANGLES,a._indicesBuffer.numItems,s.UNSIGNED_INT,0,a.numInstances)}}drawPicking(){this._geoObjects.length&&this.pickingEnabled&&(this.update(),this._pickingPASS())}_pickingPASS(){let e=this._planet.renderer,t=e.handler.programs.geo_object_picking,i=t._program,r=i.uniforms,n=i.attributes,s=e.handler.gl,a=this._entityCollection;t.activate(),s.uniform3fv(r.uScaleByDistance,a.scaleByDistance),s.uniform1f(r.pickingScale,a.pickingScale),s.uniform3fv(r.eyePositionHigh,e.activeCamera.eyeHigh),s.uniform3fv(r.eyePositionLow,e.activeCamera.eyeLow),s.uniformMatrix4fv(r.projectionMatrix,!1,e.activeCamera.getProjectionMatrix()),s.uniformMatrix4fv(r.viewMatrix,!1,e.activeCamera.getViewMatrix());for(let e=0;e<this._instanceDataMapValues.length;e++){let t=this._instanceDataMapValues[e];s.bindBuffer(s.ARRAY_BUFFER,t._directionBuffer),s.vertexAttribPointer(n.aDirection,t._directionBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,t._sizeBuffer),s.vertexAttribPointer(n.aScale,t._sizeBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,t._pitchRollBuffer),s.vertexAttribPointer(n.aPitchRoll,t._pitchRollBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,t._pickingColorBuffer),s.vertexAttribPointer(n.aPickingColor,t._pickingColorBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,t._positionHighBuffer),s.vertexAttribPointer(n.aPositionHigh,t._positionHighBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,t._positionLowBuffer),s.vertexAttribPointer(n.aPositionLow,t._positionLowBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,t._visibleBuffer),s.vertexAttribPointer(n.aDispose,t._visibleBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,t._vertexBuffer),s.vertexAttribPointer(n.aVertexPosition,t._vertexBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,t._indicesBuffer),i.drawElementsInstanced(s.TRIANGLES,t._indicesBuffer.numItems,s.UNSIGNED_INT,0,t.numInstances)}}async _loadDataTagTexture(e){if(this._planet&&e._textureSrc){const t=await je(e._textureSrc);e.createTexture(t)}}setDirectionArr(e,t,i){Ii(e._directionArr,t,3,3,i.x,i.y,i.z),e._changedBuffers[5]=!0,this._updateTag(e)}setVisibility(e,t,i){Ii(e._visibleArr,t,1,1,i?1:0),e._changedBuffers[9]=!0,this._updateTag(e)}setPositionArr(e,t,i,r){Ii(e._positionHighArr,t,3,3,i.x,i.y,i.z),Ii(e._positionLowArr,t,3,3,r.x,r.y,r.z),e._changedBuffers[1]=!0,this._updateTag(e)}setRgbaArr(e,t,i){Ii(e._rgbaArr,t,4,4,i.x,i.y,i.z,i.w),e._changedBuffers[2]=!0,this._updateTag(e)}setPickingColorArr(e,t,i){Ii(e._pickingColorArr,t,3,3,i.x/255,i.y/255,i.z/255),e._changedBuffers[8]=!0,this._updateTag(e)}setPitchRollArr(e,t,i,r){Ii(e._pitchRollArr,t,2,2,i,r),e._changedBuffers[6]=!0,this._updateTag(e)}setScaleArr(e,t,i){Ii(e._sizeArr,t,1,1,i),e._changedBuffers[7]=!0,this._updateTag(e)}_updateTag(e){e.isFree&&(e.isFree=!1,this._dataTagUpdateQueue.push(e))}update(){for(let e=0,t=this._dataTagUpdateQueue.length;e<t;e++)this._dataTagUpdateQueue[e].update();this._dataTagUpdateQueue=[]}_removeAll(){let e=this._geoObjects.length;for(;e--;){const t=this._geoObjects[e];t._tagDataIndex=-1,t._tagData=null,t._handlerIndex=-1,t._handler=null}this._geoObjects.length=0,this._geoObjects=[];for(let e=0;e<this._instanceDataMapValues.length;e++)this._instanceDataMapValues[e].clear();this._instanceDataMap.clear(),this._instanceDataMapValues=[]}clear(){this._removeAll()}draw(){this._geoObjects.length&&(this.update(),this._displayPASS())}add(e){-1===e._handlerIndex&&(e._handler=this,e._handlerIndex=this._geoObjects.length,this._geoObjects.push(e),this._addGeoObjectToArray(e),e.updateDirection(),e._tagData.refresh(),this._updateTag(e._tagData))}remove(e){e._handler&&this.__id==e._handler.__id&&this._removeGeoObject(e)}_clearDataTagQueue(){this._dataTagUpdateQueue=[]}_removeGeoObject(e){let t=e._tagData,i=e.tag;t.numInstances--;let r=!1;0===t.numInstances&&(t.clear(),this._instanceDataMap.delete(i),this._instanceDataMapValues=[],this._clearDataTagQueue(),r=!0),this._geoObjects.splice(e._handlerIndex,1);for(let t=e._handlerIndex,i=this._geoObjects.length;t<i;t++){let e=this._geoObjects[t];e._handlerIndex=e._handlerIndex-1}let n=e._tagDataIndex;t.geoObjects.splice(n,1);for(let i=e._tagDataIndex,r=t.geoObjects.length;i<r;i++){let e=t.geoObjects[i];e._tagDataIndex=e._tagDataIndex-1}t._rgbaArr=He(t._rgbaArr,4*n,4),t._positionHighArr=He(t._positionHighArr,3*n,3),t._positionLowArr=He(t._positionLowArr,3*n,3),t._directionArr=He(t._directionArr,3*n,3),t._pickingColorArr=He(t._pickingColorArr,3*n,3),t._pitchRollArr=He(t._pitchRollArr,2*n,2),t._sizeArr=He(t._sizeArr,n,1),t._visibleArr=He(t._visibleArr,n,1),e._handlerIndex=-1,e._handler=null,e._tagDataIndex=-1,e._tagData=null,r||(t.refresh(),this._updateTag(t))}}Di.__counter__=0;const Ni="\n#define EMPTY -1.0\n#define RTL 1.0",Hi="vec2 project(vec4 p) {\n return (0.5 * p.xyz / p.w + 0.5).xy * viewport;\n }",Oi="mat2 rotate2d(float angle) {\n return mat2(cos(angle), -sin(angle),\n sin(angle), cos(angle));\n }";const Vi=-1;class Ui extends Ri{constructor(e,t=21){super(e),this._billboards=[],this._gliphParamBuffer=null,this._fontIndexBuffer=null,this._outlineBuffer=null,this._outlineColorBuffer=null,this._gliphParamArr=new Float32Array([]),this._fontIndexArr=new Float32Array([]),this._outlineArr=new Float32Array([]),this._outlineColorArr=new Float32Array([]),this._buffersUpdateCallbacks[8]=this.createFontIndexBuffer,this._buffersUpdateCallbacks[9]=this.createOutlineBuffer,this._buffersUpdateCallbacks[10]=this.createOutlineColorBuffer,this._changedBuffers=new Array(this._buffersUpdateCallbacks.length),this._maxLetters=t}initProgram(){this._renderer&&this._renderer.handler&&this._renderer.handler.gl&&(this._renderer.handler.programs.label||("webgl2"===this._renderer.handler.gl.type?this._renderer.handler.addProgram(new Si("label",{uniforms:{viewport:"vec2",fontTextureArr:"sampler2darray",sdfParamsArr:"vec4",projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",planetRadius:"float",scaleByDistance:"vec3",opacity:"float",isOutlinePass:"int",depthOffset:"float"},attributes:{a_outline:"float",a_gliphParam:"vec4",a_vertices:"vec2",a_texCoord:"vec4",a_positionsHigh:"vec3",a_positionsLow:"vec3",a_size:"float",a_rotation:"float",a_rgba:"vec4",a_offset:"vec3",a_fontIndex:"float"},vertexShader:`#version 300 es\n \n ${Ni}\n \n in float a_outline;\n in vec4 a_gliphParam;\n in vec2 a_vertices;\n in vec4 a_texCoord;\n in vec3 a_positionsHigh;\n in vec3 a_positionsLow;\n in vec3 a_offset;\n in float a_size;\n in float a_rotation;\n in vec4 a_rgba;\n in float a_fontIndex;\n\n out vec2 v_uv;\n out vec4 v_rgba;\n flat out int v_fontIndex; \n out vec4 v_outlineColor;\n flat out float v_outline;\n\n uniform vec2 viewport;\n uniform mat4 viewMatrix;\n uniform mat4 projectionMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float planetRadius;\n uniform vec3 scaleByDistance;\n uniform float opacity;\n uniform float depthOffset;\n\n const vec3 ZERO3 = vec3(0.0);\n \n ${Hi}\n\n ${Oi}\n\n void main() {\n\n if(a_texCoord.w == EMPTY) {\n gl_Position = vec4(0.0);\n v_fontIndex = -1;\n return;\n }\n \n vec3 a_positions = a_positionsHigh + a_positionsLow;\n vec3 cameraPos = eyePositionHigh + eyePositionLow;\n\n v_outline = a_outline;\n\n v_fontIndex = int(a_fontIndex);\n v_uv = a_texCoord.xy;\n vec3 look = a_positions - cameraPos;\n float lookDist = length(look);\n v_rgba = a_rgba;\n \n if(opacity * step(lookDist, sqrt(dot(cameraPos,cameraPos) - planetRadius) + sqrt(dot(a_positions,a_positions) - planetRadius)) == 0.0){\n return;\n }\n\n float scd = (1.0 - smoothstep(scaleByDistance[0], scaleByDistance[1], lookDist)) * (1.0 - step(scaleByDistance[2], lookDist));\n\n v_rgba.a *= opacity;\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n vec3 highDiff = a_positionsHigh - eyePositionHigh;\n vec3 lowDiff = a_positionsLow - eyePositionLow;\n vec4 posRTE = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n vec4 projPos = projectionMatrix * posRTE;\n \n float camSlope = dot(vec3(viewMatrix[0][2], viewMatrix[1][2], viewMatrix[2][2]), normalize(cameraPos)); \n if(camSlope > 0.5) {\n float dist = dot(look, normalize(cameraPos));\n projPos.z += dist * 0.02; \n }else{\n projPos.z += -(abs(projPos.z)) * 0.002; \n }\n \n projPos.z += depthOffset + a_offset.z;\n \n vec2 screenPos = project(projPos);\n \n vec2 vert = a_vertices; \n vec4 gp = a_gliphParam; \n if(a_texCoord.w == RTL){\n vert.x = step(vert.x * 0.5 + 1.0, 1.0);\n gp.x = -a_gliphParam.x;\n gp.z = -(a_gliphParam.z + a_texCoord.z);\n }else{\n gp.z = a_gliphParam.z + a_texCoord.z;\n }\n \n vec2 v = screenPos + rotate2d(a_rotation) * ((vert * gp.xy + gp.zw) * a_size * scd + a_offset.xy);\n\n gl_Position = vec4((2.0 * v / viewport - 1.0) * projPos.w, projPos.z, projPos.w);\n }`,fragmentShader:"#version 300 es\n\n uniform int isOutlinePass;\n \n precision highp float;\n\n const int MAX_SIZE = 11;\n\n // x - ATLAS_WIDTH = 512.0;\n // y - ATLAS_HEIGHT = 512.0;\n // z - ATLAS_GLYPH_SIZE = 32.0;\n // w - ATLAS_FIELD_RANGE = 8.0;\n\n uniform sampler2D fontTextureArr[MAX_SIZE];\n uniform vec4 sdfParamsArr[MAX_SIZE];\n\n flat in int v_fontIndex;\n in vec2 v_uv;\n in vec4 v_rgba; \n\n flat in float v_outline;\n\n in vec3 v_pickingColor;\n\n layout(location = 0) out vec4 outScreen;\n\n float median(float r, float g, float b) {\n return max(min(r, g), min(max(r, g), b));\n }\n\n float getDistance() {\n vec3 msdf;\n if(v_fontIndex == 0) {\n msdf = texture(fontTextureArr[0], v_uv).rgb;\n } else if(v_fontIndex == 1){\n msdf = texture(fontTextureArr[1], v_uv).rgb;\n } else if(v_fontIndex == 2){\n msdf = texture(fontTextureArr[2], v_uv).rgb;\n } else if(v_fontIndex == 3){\n msdf = texture(fontTextureArr[3], v_uv).rgb;\n } else if(v_fontIndex == 4){\n msdf = texture(fontTextureArr[4], v_uv).rgb;\n } else if(v_fontIndex == 5){\n msdf = texture(fontTextureArr[5], v_uv).rgb;\n } else if(v_fontIndex == 6){\n msdf = texture(fontTextureArr[6], v_uv).rgb;\n } else if(v_fontIndex == 7){\n msdf = texture(fontTextureArr[7], v_uv).rgb;\n } else if(v_fontIndex == 8){\n msdf = texture(fontTextureArr[8], v_uv).rgb;\n } else if(v_fontIndex == 9){\n msdf = texture(fontTextureArr[9], v_uv).rgb;\n } else if(v_fontIndex == 10){\n msdf = texture(fontTextureArr[10], v_uv).rgb;\n }\n return median(msdf.r, msdf.g, msdf.b);\n }\n \n void main () {\n \n if(v_fontIndex == -1) {\n return;\n }\n \n vec4 sdfParams = sdfParamsArr[v_fontIndex];\n float sd = getDistance(); \n vec2 dxdy = fwidth(v_uv) * sdfParams.xy;\n\n if(isOutlinePass == 0){ \n float dist = sd + min(0.001, 0.5 - 1.0 / sdfParams.w) - 0.5;\n float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);\n if(opacity <= 0.1){\n discard;\n }\n outScreen = vec4(v_rgba.rgb, opacity * v_rgba.a);\n } else { \n float dist = sd + min(v_outline, 0.5 - 1.0 / sdfParams.w) - 0.5;\n float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0); \n if(opacity <= 0.1){\n discard;\n }\n outScreen = vec4(v_rgba.rgb, opacity * v_rgba.a);\n //outScreen = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;\n } \n }"})):this._renderer.handler.addProgram(new Si("label",{uniforms:{viewport:"vec2",fontTextureArr:"sampler2darray",sdfParamsArr:"vec4",projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",planetRadius:"float",scaleByDistance:"vec3",opacity:"float",isOutlinePass:"int",depthOffset:"float"},attributes:{a_outline:"float",a_gliphParam:"vec4",a_vertices:"vec2",a_texCoord:"vec4",a_positionsHigh:"vec3",a_positionsLow:"vec3",a_size:"float",a_rotation:"float",a_rgba:"vec4",a_offset:"vec3",a_fontIndex:"float"},vertexShader:` \n ${Ni}\n \n attribute float a_outline;\n attribute vec4 a_gliphParam;\n attribute vec2 a_vertices;\n attribute vec4 a_texCoord;\n attribute vec3 a_positionsHigh;\n attribute vec3 a_positionsLow;\n attribute vec3 a_offset;\n attribute float a_size;\n attribute float a_rotation;\n attribute vec4 a_rgba;\n attribute float a_fontIndex;\n\n varying float v_outline;\n varying vec2 v_uv;\n varying vec4 v_rgba;\n varying float v_fontIndex; \n\n uniform vec2 viewport;\n uniform mat4 viewMatrix;\n uniform mat4 projectionMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float planetRadius;\n uniform vec3 scaleByDistance;\n uniform float opacity;\n uniform float depthOffset;\n\n const vec3 ZERO3 = vec3(0.0);\n\n ${Hi}\n\n ${Oi}\n\n void main() {\n\n if(a_texCoord.w == EMPTY) {\n gl_Position = vec4(0.0);\n v_fontIndex = -1.0;\n return;\n }\n \n vec3 a_positions = a_positionsHigh + a_positionsLow;\n vec3 cameraPos = eyePositionHigh + eyePositionLow;\n\n v_outline = a_outline;\n v_uv = vec2(a_texCoord.xy);\n v_rgba = a_rgba;\n v_fontIndex = a_fontIndex;\n \n vec3 look = a_positions - cameraPos;\n float lookDist = length(look);\n \n if(opacity * step(lookDist, sqrt(dot(cameraPos,cameraPos) - planetRadius) + sqrt(dot(a_positions,a_positions) - planetRadius)) == 0.0){\n return;\n }\n\n float scd = (1.0 - smoothstep(scaleByDistance[0], scaleByDistance[1], lookDist)) * (1.0 - step(scaleByDistance[2], lookDist));\n\n v_rgba.a *= opacity;\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n vec3 highDiff = a_positionsHigh - eyePositionHigh;\n vec3 lowDiff = a_positionsLow - eyePositionLow;\n vec4 posRTE = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n vec4 projPos = projectionMatrix * posRTE;\n \n float camSlope = dot(vec3(viewMatrix[0][2], viewMatrix[1][2], viewMatrix[2][2]), normalize(cameraPos)); \n if(camSlope > 0.5) {\n float dist = dot(look, normalize(cameraPos));\n projPos.z += dist * 0.02; \n }else{\n projPos.z += -(abs(projPos.z)) * 0.002; \n }\n \n projPos.z += depthOffset + a_offset.z;\n \n vec2 screenPos = project(projPos);\n \n vec2 vert = a_vertices; \n vec4 gp = a_gliphParam; \n if(a_texCoord.w == RTL){\n vert.x = step(vert.x * 0.5 + 1.0, 1.0);\n gp.x = -a_gliphParam.x;\n gp.z = -(a_gliphParam.z + a_texCoord.z);\n }else{\n gp.z = a_gliphParam.z + a_texCoord.z;\n }\n \n vec2 v = screenPos + rotate2d(a_rotation) * ((vert * gp.xy + gp.zw) * a_size * scd + a_offset.xy);\n \n gl_Position = vec4((2.0 * v / viewport - 1.0) * projPos.w, projPos.z, projPos.w);\n }`,fragmentShader:"#extension GL_OES_standard_derivatives : enable\n\n precision highp float;\n precision highp int;\n\n const int MAX_SIZE = 11;\n\n // x - ATLAS_WIDTH = 512.0;\n // y - ATLAS_HEIGHT = 512.0;\n // z - ATLAS_GLYPH_SIZE = 32.0;\n // w - ATLAS_FIELD_RANGE = 8.0;\n\n uniform sampler2D fontTextureArr[MAX_SIZE];\n uniform vec4 sdfParamsArr[MAX_SIZE];\n uniform int isOutlinePass;\n \n varying float v_outline;\n varying vec2 v_uv;\n varying vec4 v_rgba; \n varying float v_fontIndex;\n \n float fontIndex;\n\n float median(float r, float g, float b) {\n return max(min(r, g), min(max(r, g), b));\n }\n\n float getDistance() {\n vec3 msdf;\n if(fontIndex >= 0.0 && fontIndex < 1.0) {\n msdf = texture2D(fontTextureArr[0], v_uv).rgb;\n } else if(fontIndex >= 1.0 && fontIndex < 2.0){\n msdf = texture2D(fontTextureArr[1], v_uv).rgb;\n } else if(fontIndex >= 2.0 && fontIndex < 3.0){\n msdf = texture2D(fontTextureArr[2], v_uv).rgb;\n } else if(fontIndex >= 3.0 && fontIndex < 4.0){\n msdf = texture2D(fontTextureArr[3], v_uv).rgb;\n } else if(fontIndex >= 4.0 && fontIndex < 5.0){\n msdf = texture2D(fontTextureArr[4], v_uv).rgb;\n } else if(fontIndex >= 5.0 && fontIndex < 6.0){\n msdf = texture2D(fontTextureArr[5], v_uv).rgb;\n } else if(fontIndex >= 6.0 && fontIndex < 7.0){\n msdf = texture2D(fontTextureArr[6], v_uv).rgb;\n } else if(fontIndex >= 7.0 && fontIndex < 8.0){\n msdf = texture2D(fontTextureArr[7], v_uv).rgb;\n } else if(fontIndex >= 8.0 && fontIndex < 9.0){\n msdf = texture2D(fontTextureArr[8], v_uv).rgb;\n } else if(fontIndex >= 9.0 && fontIndex < 10.0){\n msdf = texture2D(fontTextureArr[9], v_uv).rgb;\n } else if(fontIndex >= 10.0 && fontIndex < 11.0){\n msdf = texture2D(fontTextureArr[10], v_uv).rgb;\n }\n return median(msdf.r, msdf.g, msdf.b);\n }\n\n\n vec4 getSDFParams() {\n if(fontIndex >= 0.0 && fontIndex < 1.0) {\n return sdfParamsArr[0];\n } else if(fontIndex >= 1.0 && fontIndex < 2.0){\n return sdfParamsArr[1];\n } else if(fontIndex >= 2.0 && fontIndex < 3.0){\n return sdfParamsArr[2];\n } else if(fontIndex >= 3.0 && fontIndex < 4.0){\n return sdfParamsArr[3];\n } else if(fontIndex >= 4.0 && fontIndex < 5.0){\n return sdfParamsArr[4];\n } else if(fontIndex >= 5.0 && fontIndex < 6.0){\n return sdfParamsArr[5];\n } else if(fontIndex >= 6.0 && fontIndex < 7.0){\n return sdfParamsArr[6];\n } else if(fontIndex >= 7.0 && fontIndex < 8.0){\n return sdfParamsArr[7];\n } else if(fontIndex >= 8.0 && fontIndex < 9.0){\n return sdfParamsArr[8];\n } else if(fontIndex >= 9.0 && fontIndex < 10.0){\n return sdfParamsArr[9];\n } else if(fontIndex >= 10.0 && fontIndex < 11.0){\n return sdfParamsArr[10];\n }\n }\n \n void main () {\n\n fontIndex = v_fontIndex + 0.1;\n \n if(v_fontIndex < 0.0){\n return;\n }\n \n vec4 sdfParams = getSDFParams();\n float sd = getDistance(); \n vec2 dxdy = fwidth(v_uv) * sdfParams.xy;\n float dist = sd + min(0.001, 0.5 - 1.0 / sdfParams.w) - 0.5;\n float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);\n\n if(isOutlinePass == 0){ \n //gl_FragColor = vec4(v_rgba.rgb, opacity * v_rgba.a);\n } else { \n float strokeDist = sd + min(v_outline, 0.5 - 1.0 / sdfParams.w) - 0.5;\n float strokeAlpha = v_rgba.a * clamp(strokeDist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0); \n if(strokeAlpha < 0.1){\n discard;\n }\n //gl_FragColor = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;\n }\n }"}))),this._renderer.handler.programs.labelPicking||this._renderer.handler.addProgram(new Si("labelPicking",{uniforms:{viewport:"vec2",projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",planetRadius:"float",scaleByDistance:"vec3",opacity:"float",depthOffset:"float"},attributes:{a_gliphParam:"vec4",a_vertices:"vec2",a_texCoord:"vec4",a_positionsHigh:"vec3",a_positionsLow:"vec3",a_offset:"vec3",a_size:"float",a_rotation:"float",a_rgba:"vec4"},vertexShader:`\n \n ${Ni}\n \n attribute vec4 a_gliphParam;\n attribute vec2 a_vertices;\n attribute vec4 a_texCoord;\n attribute vec3 a_positionsHigh;\n attribute vec3 a_positionsLow;\n attribute vec3 a_offset;\n attribute float a_size;\n attribute float a_rotation;\n attribute vec4 a_rgba;\n\n varying vec4 v_rgba;\n\n uniform vec2 viewport;\n uniform mat4 viewMatrix;\n uniform mat4 projectionMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float planetRadius;\n uniform vec3 scaleByDistance;\n uniform float opacity;\n uniform float depthOffset;\n\n const vec3 ZERO3 = vec3(0.0);\n\n ${Hi}\n\n ${Oi}\n\n void main() {\n vec3 a_positions = a_positionsHigh + a_positionsLow;\n vec3 cameraPos = eyePositionHigh + eyePositionLow;\n v_rgba = a_rgba;\n \n if(a_texCoord.w == EMPTY) {\n v_rgba.a = 0.0;\n gl_Position = vec4(0.0);\n return;\n }\n\n vec3 look = a_positions - cameraPos;\n float lookDist = length(look);\n if(opacity * step(lookDist, sqrt(dot(cameraPos,cameraPos) - planetRadius) + sqrt(dot(a_positions,a_positions) - planetRadius)) == 0.0){\n return;\n }\n\n float scd = (1.0 - smoothstep(scaleByDistance[0], scaleByDistance[1], lookDist)) * (1.0 - step(scaleByDistance[2], lookDist));\n\n v_rgba.a *= opacity;\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n vec3 highDiff = a_positionsHigh - eyePositionHigh;\n vec3 lowDiff = a_positionsLow - eyePositionLow;\n vec4 posRTE = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n vec4 projPos = projectionMatrix * posRTE;\n \n float camSlope = dot(vec3(viewMatrix[0][2], viewMatrix[1][2], viewMatrix[2][2]), normalize(cameraPos)); \n if(camSlope > 0.5) {\n float dist = dot(look, normalize(cameraPos));\n projPos.z += dist * 0.02; \n }else{\n projPos.z += -(abs(projPos.z)) * 0.002; \n }\n \n projPos.z += depthOffset + a_offset.z;\n \n vec2 screenPos = project(projPos);\n \n vec2 vert = a_vertices; \n vec4 gp = a_gliphParam; \n if(a_texCoord.w == RTL){\n vert.x = step(vert.x * 0.5 + 1.0, 1.0);\n gp.x = -a_gliphParam.x;\n gp.z = -(a_gliphParam.z + a_texCoord.z);\n }else{\n gp.z = a_gliphParam.z + a_texCoord.z;\n }\n \n vec2 v = screenPos + rotate2d(a_rotation) * ((vert * gp.xy + gp.zw) * a_size * scd + a_offset.xy);\n \n gl_Position = vec4((2.0 * v / viewport - 1.0) * projPos.w, projPos.z, projPos.w);\n }`,fragmentShader:"precision highp float;\n\n varying vec4 v_rgba;\n\n varying vec3 v_pickingColor;\n\n void main () {\n\n vec4 color = v_rgba;\n if (color.a < 0.05) {\n return;\n }\n\n gl_FragColor = vec4(v_rgba.rgb, v_rgba.a);\n }"})))}get labels(){return this._billboards}add(e){e._handler||(e._handler=this,this.assignFontAtlas(e),this.refresh())}updateFonts(){let e=[...this._billboards];this._billboards=[];for(let t=0;t<e.length;t++)this.assignFontAtlas(e[t])}_addLabelToArrays(e){this._renderer&&this._renderer.labelWorker.make({handler:this,label:e})}assignFontAtlas(e){this._entityCollection&&this._renderer?(e.assignFontAtlas(this._renderer.fontAtlas),this._addLabelToArrays(e)):this._billboards.push(e)}workerCallback(e,t){t._lockId!==$t&&t._handler&&this.isEqual(t._handler)&&(t._isReady=!0,t._lockId=$t,t._handlerIndex=this._billboards.length,this._billboards.push(t),this._vertexArr=Ie(this._vertexArr,e.vertexArr),this._texCoordArr=Ie(this._texCoordArr,e.texCoordArr),this._gliphParamArr=Ie(this._gliphParamArr,e.gliphParamArr),this._positionHighArr=Ie(this._positionHighArr,e.positionHighArr),this._positionLowArr=Ie(this._positionLowArr,e.positionLowArr),this._sizeArr=Ie(this._sizeArr,e.sizeArr),this._offsetArr=Ie(this._offsetArr,e.offsetArr),this._rgbaArr=Ie(this._rgbaArr,e.rgbaArr),this._rotationArr=Ie(this._rotationArr,e.rotationArr),this._fontIndexArr=Ie(this._fontIndexArr,e.fontIndexArr),this._outlineArr=Ie(this._outlineArr,e.outlineArr),this._outlineColorArr=Ie(this._outlineColorArr,e.outlineColorArr),this._pickingColorArr=Ie(this._pickingColorArr,e.pickingColorArr),t.update(),this.refresh())}clear(){this._texCoordArr=null,this._gliphParamArr=null,this._vertexArr=null,this._positionHighArr=null,this._positionLowArr=null,this._sizeArr=null,this._offsetArr=null,this._rgbaArr=null,this._rotationArr=null,this._fontIndexArr=null,this._outlineArr=null,this._outlineColorArr=null,this._texCoordArr=new Float32Array([]),this._gliphParamArr=new Float32Array([]),this._vertexArr=new Float32Array([]),this._positionHighArr=new Float32Array([]),this._positionLowArr=new Float32Array([]),this._sizeArr=new Float32Array([]),this._offsetArr=new Float32Array([]),this._rgbaArr=new Float32Array([]),this._rotationArr=new Float32Array([]),this._fontIndexArr=new Float32Array([]),this._outlineArr=new Float32Array([]),this._outlineColorArr=new Float32Array([]),this._removeBillboards(),this._deleteBuffers(),this.refresh()}_deleteBuffers(){if(this._renderer){let e=this._renderer.handler.gl;e.deleteBuffer(this._gliphParamBuffer),e.deleteBuffer(this._sizeBuffer),e.deleteBuffer(this._fontIndexBuffer),e.deleteBuffer(this._texCoordBuffer),e.deleteBuffer(this._outlineBuffer),e.deleteBuffer(this._outlineColorBuffer),e.deleteBuffer(this._positionHighBuffer),e.deleteBuffer(this._positionLowBuffer),e.deleteBuffer(this._sizeBuffer),e.deleteBuffer(this._offsetBuffer),e.deleteBuffer(this._rgbaBuffer),e.deleteBuffer(this._rotationBuffer),e.deleteBuffer(this._vertexBuffer),e.deleteBuffer(this._texCoordBuffer),e.deleteBuffer(this._pickingColorBuffer),this._gliphParamBuffer=null,this._sizeBuffer=null,this._fontIndexBuffer=null,this._texCoordBuffer=null,this._outlineBuffer=null,this._outlineColorBuffer=null,this._positionHighBuffer=null,this._positionLowBuffer=null,this._sizeBuffer=null,this._offsetBuffer=null,this._rgbaBuffer=null,this._rotationBuffer=null,this._vertexBuffer=null,this._texCoordBuffer=null,this._pickingColorBuffer=null}}_displayPASS(){let e=this._renderer,t=e.handler;t.programs.label.activate();let i=t.programs.label._program,r=i.attributes,n=i.uniforms,s=t.gl,a=this._entityCollection;s.disable(s.CULL_FACE),s.uniform1iv(n.fontTextureArr,e.fontAtlas.samplerArr),s.uniform4fv(n.sdfParamsArr,e.fontAtlas.sdfParamsArr),s.uniformMatrix4fv(n.viewMatrix,!1,e.activeCamera.getViewMatrix()),s.uniformMatrix4fv(n.projectionMatrix,!1,e.activeCamera.getProjectionMatrix()),s.uniform3fv(n.eyePositionHigh,e.activeCamera.eyeHigh),s.uniform3fv(n.eyePositionLow,e.activeCamera.eyeLow),s.uniform3fv(n.scaleByDistance,a.scaleByDistance),s.uniform1f(n.opacity,a._fadingOpacity),s.uniform1f(n.planetRadius,a.renderNode._planetRadius2||0),s.uniform2fv(n.viewport,[t.canvas.clientWidth,t.canvas.clientHeight]),s.bindBuffer(s.ARRAY_BUFFER,this._texCoordBuffer),s.vertexAttribPointer(r.a_texCoord,this._texCoordBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._gliphParamBuffer),s.vertexAttribPointer(r.a_gliphParam,this._gliphParamBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._vertexBuffer),s.vertexAttribPointer(r.a_vertices,this._vertexBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._positionHighBuffer),s.vertexAttribPointer(r.a_positionsHigh,this._positionHighBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._positionLowBuffer),s.vertexAttribPointer(r.a_positionsLow,this._positionLowBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._sizeBuffer),s.vertexAttribPointer(r.a_size,this._sizeBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._rotationBuffer),s.vertexAttribPointer(r.a_rotation,this._rotationBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._offsetBuffer),s.vertexAttribPointer(r.a_offset,this._offsetBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._fontIndexBuffer),s.vertexAttribPointer(r.a_fontIndex,this._fontIndexBuffer.itemSize,s.FLOAT,!1,0,0),s.uniform1i(n.isOutlinePass,1),s.uniform1f(n.depthOffset,a.polygonOffsetUnits),s.bindBuffer(s.ARRAY_BUFFER,this._outlineColorBuffer),s.vertexAttribPointer(r.a_rgba,this._outlineColorBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._outlineBuffer),s.vertexAttribPointer(r.a_outline,this._outlineBuffer.itemSize,s.FLOAT,!1,0,0),s.drawArrays(s.TRIANGLES,0,this._vertexBuffer.numItems),s.depthFunc(s.EQUAL),s.uniform1i(n.isOutlinePass,0),s.uniform1f(n.depthOffset,a.polygonOffsetUnits),s.bindBuffer(s.ARRAY_BUFFER,this._rgbaBuffer),s.vertexAttribPointer(r.a_rgba,this._rgbaBuffer.itemSize,s.FLOAT,!1,0,0),s.drawArrays(s.TRIANGLES,0,this._vertexBuffer.numItems),s.depthFunc(s.LESS),s.enable(s.CULL_FACE)}_pickingPASS(){let e=this._renderer,t=e.handler;t.programs.labelPicking.activate();let i=t.programs.labelPicking._program,r=i.attributes,n=i.uniforms,s=t.gl,a=this._entityCollection,o=a.renderNode;s.disable(s.CULL_FACE),s.uniformMatrix4fv(n.viewMatrix,!1,e.activeCamera.getViewMatrix()),s.uniformMatrix4fv(n.projectionMatrix,!1,e.activeCamera.getProjectionMatrix()),s.uniform3fv(n.eyePositionHigh,e.activeCamera.eyeHigh),s.uniform3fv(n.eyePositionLow,e.activeCamera.eyeLow),s.uniform3fv(n.scaleByDistance,a.scaleByDistance),s.uniform1f(n.opacity,a._fadingOpacity),s.uniform1f(n.planetRadius,o._planetRadius2||0),s.uniform2fv(n.viewport,[t.canvas.clientWidth,t.canvas.clientHeight]),s.bindBuffer(s.ARRAY_BUFFER,this._texCoordBuffer),s.vertexAttribPointer(r.a_texCoord,this._texCoordBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._gliphParamBuffer),s.vertexAttribPointer(r.a_gliphParam,this._gliphParamBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._vertexBuffer),s.vertexAttribPointer(r.a_vertices,this._vertexBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._positionHighBuffer),s.vertexAttribPointer(r.a_positionsHigh,this._positionHighBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._positionLowBuffer),s.vertexAttribPointer(r.a_positionsLow,this._positionLowBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._sizeBuffer),s.vertexAttribPointer(r.a_size,this._sizeBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._rotationBuffer),s.vertexAttribPointer(r.a_rotation,this._rotationBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._offsetBuffer),s.vertexAttribPointer(r.a_offset,this._offsetBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._pickingColorBuffer),s.vertexAttribPointer(r.a_rgba,this._pickingColorBuffer.itemSize,s.FLOAT,!1,0,0),s.uniform1f(n.depthOffset,a.polygonOffsetUnits),s.drawArrays(s.TRIANGLES,0,this._vertexBuffer.numItems),s.enable(s.CULL_FACE)}_removeBillboard(e){let t=e._handlerIndex;this._billboards.splice(t,1);let i=24*this._maxLetters,r=t*i;this._rgbaArr=Oe(this._rgbaArr,r,i),this._outlineColorArr=Oe(this._outlineColorArr,r,i),this._texCoordArr=Oe(this._texCoordArr,r,i),this._gliphParamArr=Oe(this._gliphParamArr,r,i),i=18*this._maxLetters,r=t*i,this._positionHighArr=Oe(this._positionHighArr,r,i),this._positionLowArr=Oe(this._positionLowArr,r,i),this._offsetArr=Oe(this._offsetArr,r,i),this._pickingColorArr=Oe(this._pickingColorArr,r,i),i=12*this._maxLetters,r=t*i,this._vertexArr=Oe(this._vertexArr,r,i),i=6*this._maxLetters,r=t*i,this._sizeArr=Oe(this._sizeArr,r,i),this._rotationArr=Oe(this._rotationArr,r,i),this._fontIndexArr=Oe(this._fontIndexArr,r,i),this._outlineArr=Oe(this._outlineArr,r,i),this.reindexBillboardsArray(t),this.refresh(),e._handlerIndex=-1,e._handler=null,e._isReady=!1}setText(e,t,i,r,n=!1){t=t.normalize("NFKC");let s=this._renderer.fontAtlas.atlasesArr[i];if(!s)return;let a=24*e*this._maxLetters,o=this._texCoordArr,l=this._gliphParamArr,h=0,c=Math.min(this._maxLetters,t.length),d=0;n&&(d=1);let _=0,u=s.kernings;for(h=0;h<c;h++){let e=a+24*h,i=t[h],r=s.get(i.charCodeAt(0))||s.get(" ".charCodeAt(0));if(!r)continue;let n=r.texCoords,c=r.metrics;o[e]=n[0],o[e+1]=n[1],o[e+2]=_,o[e+3]=d,o[e+4]=n[2],o[e+5]=n[3],o[e+6]=_,o[e+7]=d,o[e+8]=n[4],o[e+9]=n[5],o[e+10]=_,o[e+11]=d,o[e+12]=n[6],o[e+13]=n[7],o[e+14]=_,o[e+15]=d,o[e+16]=n[8],o[e+17]=n[9],o[e+18]=_,o[e+19]=d,o[e+20]=n[10],o[e+21]=n[11],o[e+22]=_,o[e+23]=d,l[e]=c.nWidth,l[e+1]=c.nHeight,l[e+2]=c.nXOffset,l[e+3]=c.nYOffset,l[e+4]=c.nWidth,l[e+5]=c.nHeight,l[e+6]=c.nXOffset,l[e+7]=c.nYOffset,l[e+8]=c.nWidth,l[e+9]=c.nHeight,l[e+10]=c.nXOffset,l[e+11]=c.nYOffset,l[e+12]=c.nWidth,l[e+13]=c.nHeight,l[e+14]=c.nXOffset,l[e+15]=c.nYOffset,l[e+16]=c.nWidth,l[e+17]=c.nHeight,l[e+18]=c.nXOffset,l[e+19]=c.nYOffset,l[e+20]=c.nWidth,l[e+21]=c.nHeight,l[e+22]=c.nXOffset,l[e+23]=c.nYOffset;let f=u[i.charCodeAt(0)];if(f&&t[h+1]){let e=f[t[h+1].charCodeAt(0)];_+=e?c.nAdvance+e:c.nAdvance}else _+=c.nAdvance}if(r===hi)for(_*=-.5,h=0;h<c;h++){let e=a+24*h;o[e+2]+=_,o[e+6]+=_,o[e+10]+=_,o[e+14]+=_,o[e+18]+=_,o[e+22]+=_}for(;h<this._maxLetters;h++){let e=a+24*h;o[e+3]=Vi,o[e+7]=Vi,o[e+11]=Vi,o[e+15]=Vi,o[e+19]=Vi,o[e+23]=Vi}this._changedBuffers[6]=!0}setPositionArr(e,t,i){let r=18*e*this._maxLetters,n=this._positionHighArr,s=t.x,a=t.y,o=t.z,l=this._positionLowArr,h=i.x,c=i.y,d=i.z;for(let e=0;e<this._maxLetters;e++){let t=r+18*e;n[t]=s,n[t+1]=a,n[t+2]=o,n[t+3]=s,n[t+4]=a,n[t+5]=o,n[t+6]=s,n[t+7]=a,n[t+8]=o,n[t+9]=s,n[t+10]=a,n[t+11]=o,n[t+12]=s,n[t+13]=a,n[t+14]=o,n[t+15]=s,n[t+16]=a,n[t+17]=o,l[t]=h,l[t+1]=c,l[t+2]=d,l[t+3]=h,l[t+4]=c,l[t+5]=d,l[t+6]=h,l[t+7]=c,l[t+8]=d,l[t+9]=h,l[t+10]=c,l[t+11]=d,l[t+12]=h,l[t+13]=c,l[t+14]=d,l[t+15]=h,l[t+16]=c,l[t+17]=d}this._changedBuffers[1]=!0}setPickingColorArr(e,t){let i=18*e*this._maxLetters,r=this._pickingColorArr,n=t.x/255,s=t.y/255,a=t.z/255;for(let e=0;e<this._maxLetters;e++){let t=i+18*e;r[t]=n,r[t+1]=s,r[t+2]=a,r[t+3]=n,r[t+4]=s,r[t+5]=a,r[t+6]=n,r[t+7]=s,r[t+8]=a,r[t+9]=n,r[t+10]=s,r[t+11]=a,r[t+12]=n,r[t+13]=s,r[t+14]=a,r[t+15]=n,r[t+16]=s,r[t+17]=a}this._changedBuffers[0]=!0}setSizeArr(e,t){let i=6*e*this._maxLetters,r=this._sizeArr;for(let e=0;e<this._maxLetters;e++){let n=i+6*e;r[n]=t,r[n+1]=t,r[n+2]=t,r[n+3]=t,r[n+4]=t,r[n+5]=t}this._changedBuffers[2]=!0}setOffsetArr(e,t){let i=18*e*this._maxLetters,r=this._offsetArr,n=t.x,s=t.y,a=t.z;for(let e=0;e<this._maxLetters;e++){let t=i+18*e;r[t]=n,r[t+1]=s,r[t+2]=a,r[t+3]=n,r[t+4]=s,r[t+5]=a,r[t+6]=n,r[t+7]=s,r[t+8]=a,r[t+9]=n,r[t+10]=s,r[t+11]=a,r[t+12]=n,r[t+13]=s,r[t+14]=a,r[t+15]=n,r[t+16]=s,r[t+17]=a}this._changedBuffers[3]=!0}setRgbaArr(e,t){let i=24*e*this._maxLetters,r=this._rgbaArr,n=t.x,s=t.y,a=t.z,o=t.w;for(let e=0;e<this._maxLetters;e++){let t=i+24*e;r[t]=n,r[t+1]=s,r[t+2]=a,r[t+3]=o,r[t+4]=n,r[t+5]=s,r[t+6]=a,r[t+7]=o,r[t+8]=n,r[t+9]=s,r[t+10]=a,r[t+11]=o,r[t+12]=n,r[t+13]=s,r[t+14]=a,r[t+15]=o,r[t+16]=n,r[t+17]=s,r[t+18]=a,r[t+19]=o,r[t+20]=n,r[t+21]=s,r[t+22]=a,r[t+23]=o}this._changedBuffers[4]=!0}setOutlineColorArr(e,t){let i=24*e*this._maxLetters,r=this._outlineColorArr,n=t.x,s=t.y,a=t.z,o=t.w;for(let e=0;e<this._maxLetters;e++){let t=i+24*e;r[t]=n,r[t+1]=s,r[t+2]=a,r[t+3]=o,r[t+4]=n,r[t+5]=s,r[t+6]=a,r[t+7]=o,r[t+8]=n,r[t+9]=s,r[t+10]=a,r[t+11]=o,r[t+12]=n,r[t+13]=s,r[t+14]=a,r[t+15]=o,r[t+16]=n,r[t+17]=s,r[t+18]=a,r[t+19]=o,r[t+20]=n,r[t+21]=s,r[t+22]=a,r[t+23]=o}this._changedBuffers[10]=!0}setOutlineArr(e,t){let i=6*e*this._maxLetters,r=this._outlineArr;for(let e=0;e<this._maxLetters;e++){let n=i+6*e;r[n]=t,r[n+1]=t,r[n+2]=t,r[n+3]=t,r[n+4]=t,r[n+5]=t}this._changedBuffers[9]=!0}setRotationArr(e,t){let i=6*e*this._maxLetters,r=this._rotationArr;for(let e=0;e<this._maxLetters;e++){let n=i+6*e;r[n]=t,r[n+1]=t,r[n+2]=t,r[n+3]=t,r[n+4]=t,r[n+5]=t}this._changedBuffers[5]=!0}setVisibility(e,t){let i;i=t?[0,0,0,-1,1,-1,1,-1,1,0,0,0]:[0,0,0,0,0,0,0,0,0,0,0,0],this.setVertexArr(e,i)}setVertexArr(e,t){let i=12*e*this._maxLetters,r=this._vertexArr;for(let e=0;e<this._maxLetters;e++){let n=i+12*e;r[n]=t[0],r[n+1]=t[1],r[n+2]=t[2],r[n+3]=t[3],r[n+4]=t[4],r[n+5]=t[5],r[n+6]=t[6],r[n+7]=t[7],r[n+8]=t[8],r[n+9]=t[9],r[n+10]=t[10],r[n+11]=t[11]}this._changedBuffers[7]=!0}setFontIndexArr(e,t){let i=6*e*this._maxLetters,r=this._fontIndexArr;for(let e=0;e<this._maxLetters;e++){let n=i+6*e;r[n]=t,r[n+1]=t,r[n+2]=t,r[n+3]=t,r[n+4]=t,r[n+5]=t}this._changedBuffers[8]=!0}createSizeBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._sizeBuffer),this._sizeBuffer=e.createArrayBuffer(this._sizeArr,1,this._sizeArr.length)}createFontIndexBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._fontIndexBuffer),this._fontIndexBuffer=e.createArrayBuffer(this._fontIndexArr,1,this._fontIndexArr.length)}createTexCoordBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._texCoordBuffer),this._texCoordBuffer=e.createArrayBuffer(this._texCoordArr,4,this._texCoordArr.length/4),e.gl.deleteBuffer(this._gliphParamBuffer),this._gliphParamBuffer=e.createArrayBuffer(this._gliphParamArr,4,this._gliphParamArr.length/4)}createOutlineBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._outlineBuffer),this._outlineBuffer=e.createArrayBuffer(this._outlineArr,1,this._outlineArr.length)}createOutlineColorBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._outlineColorBuffer),this._outlineColorBuffer=e.createArrayBuffer(this._outlineColorArr,4,this._outlineColorArr.length/4)}setMaxLetters(e){this._maxLetters=e}}class Gi{constructor(e){this.pickingEnabled=!0,this.__id=Gi.__counter__++,this.pickingEnabled=!0,this._entityCollection=e,this._renderer=null,this._pointClouds=[]}_initProgram(){this._renderer&&this._renderer.handler&&(this._renderer.handler.programs.pointCloud||this._renderer.handler.addProgram(new Si("pointCloud",{uniforms:{projectionViewMatrix:"mat4",opacity:"float",pointSize:"float"},attributes:{coordinates:"vec3",colors:"vec3"},vertexShader:"attribute vec3 coordinates;\n attribute vec4 colors;\n uniform mat4 projectionViewMatrix;\n uniform float opacity;\n uniform float pointSize;\n varying vec4 color;\n void main() {\n color = colors;\n color.a *= opacity;\n gl_Position = projectionViewMatrix * vec4(coordinates, 1.0);\n gl_PointSize = pointSize;\n }",fragmentShader:"precision highp float;\n varying vec4 color;\n void main(void) {\n gl_FragColor = color;\n }"})))}setRenderNode(e){this._renderer=e.renderer,this._initProgram();for(let t=0;t<this._pointClouds.length;t++)this._pointClouds[t].setRenderNode(e)}add(e){-1===e._handlerIndex&&(e._handler=this,e._handlerIndex=this._pointClouds.length,this._pointClouds.push(e),this._entityCollection&&this._entityCollection.renderNode&&e.setRenderNode(this._entityCollection.renderNode))}remove(e){let t=e._handlerIndex;-1!==t&&(e._deleteBuffers(),e._handlerIndex=-1,e._handler=null,this._pointClouds.splice(t,1),this._reindexPointCloudArray(t))}_reindexPointCloudArray(e){let t=this._pointClouds;for(let i=e;i<t.length;i++)t[i]._handlerIndex=i}draw(){let e=this._pointClouds.length;for(;e--;)this._pointClouds[e].draw()}drawPicking(){if(this.pickingEnabled){let e=this._pointClouds.length;for(;e--;)this._pointClouds[e].drawPicking()}}clear(){let e=this._pointClouds.length;for(;e--;)this._pointClouds[e]._deleteBuffers(),this._pointClouds[e]._handler=null,this._pointClouds[e]._handlerIndex=-1;this._pointClouds.length=0,this._pointClouds=[]}}Gi.__counter__=0;class Wi{constructor(e){this.__id=Wi.__counter__++,this._entityCollection=e,this._renderer=null,this._polylines=[],this.pickingEnabled=!0}_initProgram(){this._renderer&&this._renderer.handler&&(this._renderer.handler.programs.polyline_screen||this._renderer.handler.addProgram(new Si("polyline_screen",{uniforms:{viewport:"vec2",proj:"mat4",view:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",uFloatParams:"vec2",thickness:"float",opacity:"float",depthOffset:"float"},attributes:{prevHigh:"vec3",currentHigh:"vec3",nextHigh:"vec3",prevLow:"vec3",currentLow:"vec3",nextLow:"vec3",order:"float",color:"vec4"},vertexShader:"precision highp float;\n\n attribute vec3 prevHigh;\n attribute vec3 currentHigh;\n attribute vec3 nextHigh;\n\n attribute vec3 prevLow;\n attribute vec3 currentLow;\n attribute vec3 nextLow;\n\n attribute float order;\n\n attribute vec4 color;\n\n uniform float thickness;\n uniform mat4 proj;\n uniform mat4 view;\n uniform vec2 viewport;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float opacity;\n uniform float depthOffset;\n\n varying vec4 vColor;\n varying vec3 vPos;\n varying vec3 uCamPos;\n\n const float NEAR = -1.0;\n\n vec2 getIntersection(vec2 start1, vec2 end1, vec2 start2, vec2 end2){\n vec2 dir = end2 - start2;\n vec2 perp = vec2(-dir.y, dir.x);\n float d2 = dot(perp, start2);\n float seg = dot(perp, start1) - d2;\n float prl = seg - dot(perp, end1) + d2;\n if(prl > -1.0 && prl < 1.0){\n return start1;\n }\n float u = seg / prl;\n return start1 + u * (end1 - start1);\n }\n\n vec2 project(vec4 p){\n return (0.5 * p.xyz / p.w + 0.5).xy * viewport;\n }\n\n void main(){\n\n uCamPos = eyePositionHigh + eyePositionLow;\n\n vColor = vec4(color.rgb, color.a * opacity);\n\n vec3 current = currentHigh + currentLow;\n\n vPos = current;\n\n mat4 viewMatrixRTE = view;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n vec3 highDiff, lowDiff;\n\n highDiff = currentHigh - eyePositionHigh;\n lowDiff = currentLow - eyePositionLow;\n vec4 vCurrent = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n\n highDiff = prevHigh - eyePositionHigh;\n lowDiff = prevLow - eyePositionLow;\n vec4 vPrev = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n\n highDiff = nextHigh - eyePositionHigh;\n lowDiff = nextLow - eyePositionLow;\n vec4 vNext = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n\n /*Clip near plane, the point behind view plane*/\n if(vCurrent.z > NEAR) {\n if(vPrev.z < NEAR && abs(order) == 1.0){\n vCurrent = vPrev + (vCurrent - vPrev) * (NEAR - vPrev.z) / (vCurrent.z - vPrev.z);\n } else if(vNext.z < NEAR && abs(order) == 2.0){\n vCurrent = vNext + (vCurrent - vNext) * (NEAR - vNext.z) / (vCurrent.z - vNext.z);\n }\n }\n\n vec4 dCurrent = proj * vCurrent;\n vec2 _next = project(proj * vNext);\n vec2 _prev = project(proj * vPrev);\n vec2 _current = project(dCurrent);\n\n if(_prev == _current){\n if(_next == _current){\n _next = _current + vec2(1.0, 0.0);\n _prev = _current - _next;\n }else{\n _prev = _current + normalize(_current - _next);\n }\n }\n\n if(_next == _current){\n _next = _current + normalize(_current - _prev);\n }\n\n vec2 sNext = _next,\n sCurrent = _current,\n sPrev = _prev;\n\n vec2 dirNext = normalize(sNext - sCurrent);\n vec2 dirPrev = normalize(sPrev - sCurrent);\n float dotNP = dot(dirNext, dirPrev);\n\n vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));\n vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));\n\n float d = thickness * sign(order);\n\n vec2 m;\n if(dotNP >= 0.99991){\n m = sCurrent - normalPrev * d;\n }else{\n m = getIntersection( sCurrent + normalPrev * d, sPrev + normalPrev * d,\n sCurrent + normalNext * d, sNext + normalNext * d );\n\n if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){\n float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);\n if(occw == -1.0){\n m = sCurrent + normalPrev * d;\n }else if(occw == 1.0){\n m = sCurrent + normalNext * d;\n }else if(occw == -2.0){\n m = sCurrent + normalNext * d;\n }else if(occw == 2.0){\n m = sCurrent + normalPrev * d;\n }\n }else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){\n m = sCurrent + normalNext * d;\n }\n }\n\n gl_Position = vec4((2.0 * m / viewport - 1.0) * dCurrent.w, dCurrent.z + depthOffset, dCurrent.w);\n }",fragmentShader:"precision highp float;\n uniform vec2 uFloatParams;\n varying vec3 uCamPos;\n varying vec4 vColor;\n varying vec3 vPos;\n void main() {\n vec3 look = vPos - uCamPos;\n float lookLength = length(look);\n float a = vColor.a * step(lookLength, sqrt(dot(uCamPos,uCamPos) - uFloatParams[0]) + sqrt(dot(vPos,vPos) - uFloatParams[0]));\n gl_FragColor = vec4(vColor.rgb, a);\n }"})),this._renderer.handler.programs.polyline_picking||this._renderer.handler.addProgram(new Si("polyline_picking",{uniforms:{viewport:"vec2",proj:"mat4",view:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",uFloatParams:"vec2",color:"vec4",thickness:"float",depthOffset:"float"},attributes:{prevHigh:"vec3",currentHigh:"vec3",nextHigh:"vec3",prevLow:"vec3",currentLow:"vec3",nextLow:"vec3",order:"float"},vertexShader:"precision highp float;\n \n attribute vec3 prevHigh;\n attribute vec3 currentHigh;\n attribute vec3 nextHigh;\n \n attribute vec3 prevLow;\n attribute vec3 currentLow;\n attribute vec3 nextLow;\n\n attribute float order;\n\n uniform float thickness;\n uniform vec4 color;\n uniform mat4 proj;\n uniform mat4 view;\n uniform vec2 viewport;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float depthOffset;\n\n varying vec4 vColor;\n varying vec3 vPos;\n varying vec3 uCamPos;\n \n \n const float NEAR = -1.0;\n \n vec2 getIntersection(vec2 start1, vec2 end1, vec2 start2, vec2 end2){\n vec2 dir = end2 - start2;\n vec2 perp = vec2(-dir.y, dir.x);\n float d2 = dot(perp, start2);\n float seg = dot(perp, start1) - d2;\n float prl = seg - dot(perp, end1) + d2;\n if(prl > -1.0 && prl < 1.0){\n return start1;\n }\n float u = seg / prl;\n return start1 + u * (end1 - start1);\n }\n \n vec2 project(vec4 p){\n return (0.5 * p.xyz / p.w + 0.5).xy * viewport;\n }\n \n void main(){\n\n uCamPos = eyePositionHigh + eyePositionLow;\n\n vColor = color;\n\n vec3 current = currentHigh + currentLow;\n\n vPos = current; \n\n vec3 highDiff, lowDiff;\n\n mat4 viewMatrixRTE = view;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n highDiff = currentHigh - eyePositionHigh;\n lowDiff = currentLow - eyePositionLow;\n vec4 vCurrent = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n\n highDiff = prevHigh - eyePositionHigh;\n lowDiff = prevLow - eyePositionLow; \n vec4 vPrev = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n\n highDiff = nextHigh - eyePositionHigh;\n lowDiff = nextLow - eyePositionLow; \n vec4 vNext = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n\n /*Clip near plane*/\n if(vCurrent.z > NEAR) {\n if(vPrev.z < NEAR && abs(order) == 1.0){\n vCurrent = vPrev + (vCurrent - vPrev) * (NEAR - vPrev.z) / (vCurrent.z - vPrev.z);\n } else if(vNext.z < NEAR && abs(order) == 2.0){\n vCurrent = vNext + (vCurrent - vNext) * (NEAR - vNext.z) / (vCurrent.z - vNext.z);\n }\n }\n \n vec4 dCurrent = proj * vCurrent;\n vec2 _next = project(proj * vNext);\n vec2 _prev = project(proj * vPrev);\n vec2 _current = project(dCurrent);\n if(_prev == _current){\n if(_next == _current){\n _next = _current + vec2(1.0, 0.0);\n _prev = _current - _next;\n }else{\n _prev = _current + normalize(_current - _next);\n }\n }\n if(_next == _current){\n _next = _current + normalize(_current - _prev);\n }\n \n vec2 sNext = _next,\n sCurrent = _current,\n sPrev = _prev;\n\n vec2 dirNext = normalize(sNext - sCurrent);\n vec2 dirPrev = normalize(sPrev - sCurrent);\n float dotNP = dot(dirNext, dirPrev);\n \n vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));\n vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));\n \n float d = thickness * sign(order);\n \n vec2 m;\n if(dotNP >= 0.99991){\n m = sCurrent - normalPrev * d;\n }else{\n m = getIntersection( sCurrent + normalPrev * d, sPrev + normalPrev * d,\n sCurrent + normalNext * d, sNext + normalNext * d );\n \n if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){\n float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);\n if(occw == -1.0){\n m = sCurrent + normalPrev * d;\n }else if(occw == 1.0){\n m = sCurrent + normalNext * d;\n }else if(occw == -2.0){\n m = sCurrent + normalNext * d;\n }else if(occw == 2.0){\n m = sCurrent + normalPrev * d;\n }\n }\n else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){\n m = sCurrent + normalNext * d;\n }\n }\n gl_Position = vec4((2.0 * m / viewport - 1.0) * dCurrent.w, dCurrent.z + depthOffset, dCurrent.w);\n }",fragmentShader:"precision highp float;\n uniform vec2 uFloatParams;\n varying vec3 uCamPos;\n varying vec4 vColor;\n varying vec3 vPos;\n void main() {\n vec3 look = vPos - uCamPos;\n float lookLength = length(look);\n float a = vColor.a * step(lookLength, sqrt(dot(uCamPos,uCamPos) - uFloatParams[0]) + sqrt(dot(vPos,vPos) - uFloatParams[0])); \n gl_FragColor = vec4(vColor.rgb, a);\n }"})))}setRenderNode(e){this._renderer=e.renderer,this._initProgram();for(let t=0;t<this._polylines.length;t++)this._polylines[t].setRenderNode(e)}add(e){-1===e._handlerIndex&&(e._handler=this,e._handlerIndex=this._polylines.length,this._polylines.push(e),this._entityCollection&&this._entityCollection.renderNode&&e.setRenderNode(this._entityCollection.renderNode))}remove(e){let t=e._handlerIndex;-1!==t&&(e._deleteBuffers(),e._handlerIndex=-1,e._handler=null,this._polylines.splice(t,1),this.reindexPolylineArray(t))}reindexPolylineArray(e){let t=this._polylines;for(let i=e;i<t.length;i++)t[i]._handlerIndex=i}draw(){let e=this._polylines.length;for(;e--;)this._polylines[e].draw()}drawPicking(){if(this.pickingEnabled){let e=this._polylines.length;for(;e--;)this._polylines[e].drawPicking()}}clear(){let e=this._polylines.length;for(;e--;)this._polylines[e]._deleteBuffers(),this._polylines[e]._handler=null,this._polylines[e]._handlerIndex=-1;this._polylines.length=0,this._polylines=[]}}Wi.__counter__=0;class ji{constructor(e){this.__id=ji.__counter__++,this.pickingEnabled=!0,this._entityCollection=e,this._renderer=null,this._rays=[],this._vertexBuffer=null,this._startPositionHighBuffer=null,this._startPositionLowBuffer=null,this._endPositionHighBuffer=null,this._endPositionLowBuffer=null,this._thicknessBuffer=null,this._rgbaBuffer=null,this._pickingColorBuffer=null,this._vertexArr=[],this._startPositionHighArr=[],this._startPositionLowArr=[],this._endPositionHighArr=[],this._endPositionLowArr=[],this._thicknessArr=[],this._rgbaArr=[],this._pickingColorArr=[],this._buffersUpdateCallbacks=[],this._buffersUpdateCallbacks[5]=this.createVertexBuffer,this._buffersUpdateCallbacks[1]=this.createStartPositionBuffer,this._buffersUpdateCallbacks[2]=this.createEndPositionBuffer,this._buffersUpdateCallbacks[4]=this.createThicknessBuffer,this._buffersUpdateCallbacks[3]=this.createRgbaBuffer,this._buffersUpdateCallbacks[0]=this.createPickingColorBuffer,this._changedBuffers=new Array(this._buffersUpdateCallbacks.length)}static concArr(e,t){for(let i=0;i<t.length;i++)e.push(t[i])}initProgram(){this._renderer&&this._renderer.handler&&(this._renderer.handler.programs.rayScreen||this._renderer.handler.addProgram(new Si("rayScreen",{uniforms:{projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",resolution:"float",uOpacity:"float"},attributes:{a_vertices:"vec2",a_startPosHigh:"vec3",a_startPosLow:"vec3",a_endPosHigh:"vec3",a_endPosLow:"vec3",a_thickness:"float",a_rgba:"vec4"},vertexShader:"precision highp float;\n\n attribute vec4 a_rgba;\n attribute vec3 a_startPosHigh;\n attribute vec3 a_startPosLow;\n attribute vec3 a_endPosHigh;\n attribute vec3 a_endPosLow;\n attribute vec2 a_vertices;\n attribute float a_thickness;\n\n varying vec4 v_rgba;\n\n uniform mat4 viewMatrix;\n uniform mat4 projectionMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float resolution;\n uniform float uOpacity;\n\n void main() {\n\n v_rgba = vec4(a_rgba.rgb, a_rgba.a * uOpacity);\n\n vec3 v = (a_endPosHigh - a_startPosHigh) + (a_endPosLow - a_startPosLow);\n\n vec3 look = (a_startPosHigh - eyePositionHigh) + (a_startPosLow - eyePositionLow) + v * a_vertices.y;\n vec3 up = normalize(normalize(v));\n vec3 right = normalize(cross(look,up));\n \n float dist = dot(look, vec3(viewMatrix[0][2], viewMatrix[1][2], viewMatrix[2][2]));\n float focalSize = 2.0 * dist * resolution;\n vec3 vert = right * a_thickness * focalSize * a_vertices.x;\n\n vec3 highDiff;\n vec3 lowDiff;\n\n if(a_vertices.y == 0.0){\n highDiff = a_startPosHigh - eyePositionHigh;\n vert += a_startPosLow - eyePositionLow;\n }else{\n highDiff = a_endPosHigh - eyePositionHigh;\n vert += a_endPosLow - eyePositionLow;\n }\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n \n gl_Position = projectionMatrix * viewMatrixRTE * vec4(highDiff + vert, 1.0);\n }",fragmentShader:"precision highp float;\n varying vec4 v_rgba;\n void main () {\n gl_FragColor = v_rgba;\n }"})))}setRenderer(e){this._renderer=e,this.initProgram()}refresh(){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]=!0}_removeRays(){let e=this._rays.length;for(;e--;){let t=this._rays[e];t._handlerIndex=-1,t._handler=null}this._rays.length=0,this._rays=[]}clear(){this._vertexArr=null,this._startPositionHighArr=null,this._startPositionLowArr=null,this._endPositionHighArr=null,this._endPositionLowArr=null,this._thicknessArr=null,this._rgbaArr=null,this._vertexArr=new Float32Array([]),this._startPositionHighArr=new Float32Array([]),this._startPositionLowArr=new Float32Array([]),this._endPositionHighArr=new Float32Array([]),this._endPositionLowArr=new Float32Array([]),this._thicknessArr=new Float32Array([]),this._rgbaArr=new Float32Array([]),this._removeRays(),this._deleteBuffers(),this.refresh()}_deleteBuffers(){if(this._renderer){let e=this._renderer.handler.gl;e&&(e.deleteBuffer(this._startPositionHighBuffer),e.deleteBuffer(this._startPositionLowBuffer),e.deleteBuffer(this._endPositionHighBuffer),e.deleteBuffer(this._endPositionLowBuffer),e.deleteBuffer(this._thicknessBuffer),e.deleteBuffer(this._rgbaBuffer),e.deleteBuffer(this._vertexBuffer)),this._startPositionHighBuffer=null,this._startPositionLowBuffer=null,this._endPositionHighBuffer=null,this._endPositionLowBuffer=null,this._thicknessBuffer=null,this._rgbaBuffer=null,this._vertexBuffer=null}}update(){if(this._renderer){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]&&(this._buffersUpdateCallbacks[e].call(this),this._changedBuffers[e]=!1)}}add(e){-1==e._handlerIndex&&(e._handler=this,e._handlerIndex=this._rays.length,this._rays.push(e),this._addRayToArrays(e),this.refresh())}_addRayToArrays(e){e.getVisibility()?this._vertexArr=Fe(this._vertexArr,[-.5,1,-.5,0,.5,0,.5,0,.5,1,-.5,1]):this._vertexArr=Fe(this._vertexArr,[0,0,0,0,0,0,0,0,0,0,0,0]);let t=e._startPositionHigh.x,i=e._startPositionHigh.y,r=e._startPositionHigh.z;this._startPositionHighArr=Fe(this._startPositionHighArr,[t,i,r,t,i,r,t,i,r,t,i,r,t,i,r,t,i,r]),t=e._startPositionLow.x,i=e._startPositionLow.y,r=e._startPositionLow.z,this._startPositionLowArr=Fe(this._startPositionLowArr,[t,i,r,t,i,r,t,i,r,t,i,r,t,i,r,t,i,r]),t=e._endPositionHigh.x,i=e._endPositionHigh.y,r=e._endPositionHigh.z,this._endPositionHighArr=Fe(this._endPositionHighArr,[t,i,r,t,i,r,t,i,r,t,i,r,t,i,r,t,i,r]),t=e._endPositionLow.x,i=e._endPositionLow.y,r=e._endPositionLow.z,this._endPositionLowArr=Fe(this._endPositionLowArr,[t,i,r,t,i,r,t,i,r,t,i,r,t,i,r,t,i,r]),t=e._thickness,this._thicknessArr=Fe(this._thicknessArr,[t,t,t,t,t,t]);let n=e._startColor.x,s=e._startColor.y,a=e._startColor.z,o=e._startColor.w,l=e._endColor.x,h=e._endColor.y,c=e._endColor.z,d=e._endColor.w;this._rgbaArr=Fe(this._rgbaArr,[l,h,c,d,n,s,a,o,n,s,a,o,n,s,a,o,l,h,c,d,l,h,c,d]),t=e._entity._pickingColor.x/255,i=e._entity._pickingColor.y/255,r=e._entity._pickingColor.z/255,this._pickingColorArr=Fe(this._pickingColorArr,[t,i,r,t,i,r,t,i,r,t,i,r,t,i,r,t,i,r])}_displayPASS(){let e=this._renderer,t=e.handler;t.programs.rayScreen.activate();let i=t.programs.rayScreen._program,r=i.attributes,n=i.uniforms,s=t.gl,a=this._entityCollection;s.disable(s.CULL_FACE),s.uniform1f(n.uOpacity,a._fadingOpacity),s.uniformMatrix4fv(n.viewMatrix,!1,e.activeCamera.getViewMatrix()),s.uniformMatrix4fv(n.projectionMatrix,!1,e.activeCamera.getProjectionMatrix()),s.uniform3fv(n.eyePositionHigh,e.activeCamera.eyeHigh),s.uniform3fv(n.eyePositionLow,e.activeCamera.eyeLow),s.uniform1f(n.resolution,e.activeCamera._tanViewAngle_hradOneByHeight),s.bindBuffer(s.ARRAY_BUFFER,this._startPositionHighBuffer),s.vertexAttribPointer(r.a_startPosHigh,this._startPositionHighBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._startPositionLowBuffer),s.vertexAttribPointer(r.a_startPosLow,this._startPositionLowBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._endPositionHighBuffer),s.vertexAttribPointer(r.a_endPosHigh,this._endPositionHighBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._endPositionLowBuffer),s.vertexAttribPointer(r.a_endPosLow,this._endPositionLowBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._rgbaBuffer),s.vertexAttribPointer(r.a_rgba,this._rgbaBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._thicknessBuffer),s.vertexAttribPointer(r.a_thickness,this._thicknessBuffer.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this._vertexBuffer),s.vertexAttribPointer(r.a_vertices,this._vertexBuffer.itemSize,s.FLOAT,!1,0,0),s.drawArrays(s.TRIANGLES,0,this._vertexBuffer.numItems),s.enable(s.CULL_FACE)}_pickingPASS(){}draw(){this._rays.length&&(this.update(),this._displayPASS())}drawPicking(){this._rays.length&&this.pickingEnabled&&this._pickingPASS()}reindexRaysArray(e){let t=this._rays;for(let i=e;i<t.length;i++)t[i]._handlerIndex=i}_removeRay(e){let t=e._handlerIndex;this._rays.splice(t,1);let i=24*t;this._rgbaArr=He(this._rgbaArr,i,24),i=18*t,this._startPositionHighArr=He(this._startPositionHighArr,i,18),this._startPositionLowArr=He(this._startPositionLowArr,i,18),this._endPositionHighArr=He(this._endPositionHighArr,i,18),this._endPositionLowArr=He(this._endPositionLowArr,i,18),this._pickingColorArr=He(this._pickingColorArr,i,18),i=12*t,this._vertexArr=He(this._vertexArr,i,12),i=6*t,this._thicknessArr=He(this._thicknessArr,i,6),this.reindexRaysArray(t),this.refresh(),e._handlerIndex=-1,e._handler=null}remove(e){e._handler&&this.__id===e._handler.__id&&this._removeRay(e)}setStartPositionArr(e,t,i){let r=18*e,n=this._startPositionHighArr,s=t.x,a=t.y,o=t.z;n[r]=s,n[r+1]=a,n[r+2]=o,n[r+3]=s,n[r+4]=a,n[r+5]=o,n[r+6]=s,n[r+7]=a,n[r+8]=o,n[r+9]=s,n[r+10]=a,n[r+11]=o,n[r+12]=s,n[r+13]=a,n[r+14]=o,n[r+15]=s,n[r+16]=a,n[r+17]=o,n=this._startPositionLowArr,s=i.x,a=i.y,o=i.z,n[r]=s,n[r+1]=a,n[r+2]=o,n[r+3]=s,n[r+4]=a,n[r+5]=o,n[r+6]=s,n[r+7]=a,n[r+8]=o,n[r+9]=s,n[r+10]=a,n[r+11]=o,n[r+12]=s,n[r+13]=a,n[r+14]=o,n[r+15]=s,n[r+16]=a,n[r+17]=o,this._changedBuffers[1]=!0}setEndPositionArr(e,t,i){let r=18*e,n=this._endPositionHighArr,s=t.x,a=t.y,o=t.z;n[r]=s,n[r+1]=a,n[r+2]=o,n[r+3]=s,n[r+4]=a,n[r+5]=o,n[r+6]=s,n[r+7]=a,n[r+8]=o,n[r+9]=s,n[r+10]=a,n[r+11]=o,n[r+12]=s,n[r+13]=a,n[r+14]=o,n[r+15]=s,n[r+16]=a,n[r+17]=o,n=this._endPositionLowArr,s=i.x,a=i.y,o=i.z,n[r]=s,n[r+1]=a,n[r+2]=o,n[r+3]=s,n[r+4]=a,n[r+5]=o,n[r+6]=s,n[r+7]=a,n[r+8]=o,n[r+9]=s,n[r+10]=a,n[r+11]=o,n[r+12]=s,n[r+13]=a,n[r+14]=o,n[r+15]=s,n[r+16]=a,n[r+17]=o,this._changedBuffers[2]=!0}setPickingColorArr(e,t){let i=18*e,r=this._pickingColorArr,n=t.x/255,s=t.y/255,a=t.z/255;r[i]=n,r[i+1]=s,r[i+2]=a,r[i+3]=n,r[i+4]=s,r[i+5]=a,r[i+6]=n,r[i+7]=s,r[i+8]=a,r[i+9]=n,r[i+10]=s,r[i+11]=a,r[i+12]=n,r[i+13]=s,r[i+14]=a,r[i+15]=n,r[i+16]=s,r[i+17]=a,this._changedBuffers[0]=!0}setRgbaArr(e,t,i){let r=24*e,n=this._rgbaArr,s=t.x,a=t.y,o=t.z,l=t.w,h=i.x,c=i.y,d=i.z,_=i.w;n[r]=h,n[r+1]=c,n[r+2]=d,n[r+3]=_,n[r+4]=s,n[r+5]=a,n[r+6]=o,n[r+7]=l,n[r+8]=s,n[r+9]=a,n[r+10]=o,n[r+11]=l,n[r+12]=s,n[r+13]=a,n[r+14]=o,n[r+15]=l,n[r+16]=h,n[r+17]=c,n[r+18]=d,n[r+19]=_,n[r+20]=h,n[r+21]=c,n[r+22]=d,n[r+23]=_,this._changedBuffers[3]=!0}setThicknessArr(e,t){let i=6*e,r=this._thicknessArr;r[i]=t,r[i+1]=t,r[i+2]=t,r[i+3]=t,r[i+4]=t,r[i+5]=t,this._changedBuffers[4]=!0}setVisibility(e,t){let i;i=t?[-.5,1,-.5,0,.5,0,.5,0,.5,1,-.5,1]:[0,0,0,0,0,0,0,0,0,0,0,0],this.setVertexArr(e,i)}setVertexArr(e,t){let i=12*e,r=this._vertexArr;r[i]=t[0],r[i+1]=t[1],r[i+2]=t[2],r[i+3]=t[3],r[i+4]=t[4],r[i+5]=t[5],r[i+6]=t[6],r[i+7]=t[7],r[i+8]=t[8],r[i+9]=t[9],r[i+10]=t[10],r[i+11]=t[11],this._changedBuffers[5]=!0}createStartPositionBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._startPositionHighBuffer),this._startPositionHighArr=De(this._startPositionHighArr),this._startPositionHighBuffer=e.createArrayBuffer(this._startPositionHighArr,3,this._startPositionHighArr.length/3,e.gl.DYNAMIC_DRAW),e.gl.deleteBuffer(this._startPositionLowBuffer),this._startPositionLowArr=De(this._startPositionLowArr),this._startPositionLowBuffer=e.createArrayBuffer(this._startPositionLowArr,3,this._startPositionLowArr.length/3,e.gl.DYNAMIC_DRAW)}createEndPositionBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._endPositionHighBuffer),this._endPositionHighArr=De(this._endPositionHighArr),this._endPositionHighBuffer=e.createArrayBuffer(this._endPositionHighArr,3,this._endPositionHighArr.length/3,e.gl.DYNAMIC_DRAW),e.gl.deleteBuffer(this._endPositionLowBuffer),this._endPositionLowArr=De(this._endPositionLowArr),this._endPositionLowBuffer=e.createArrayBuffer(this._endPositionLowArr,3,this._endPositionLowArr.length/3,e.gl.DYNAMIC_DRAW)}createRgbaBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._rgbaBuffer),this._rgbaArr=De(this._rgbaArr),this._rgbaBuffer=e.createArrayBuffer(this._rgbaArr,4,this._rgbaArr.length/4)}createThicknessBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._thicknessBuffer),this._thicknessArr=De(this._thicknessArr),this._thicknessBuffer=e.createArrayBuffer(this._thicknessArr,1,this._thicknessArr.length,e.gl.DYNAMIC_DRAW)}createVertexBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._vertexBuffer),this._vertexArr=De(this._vertexArr),this._vertexBuffer=e.createArrayBuffer(this._vertexArr,2,this._vertexArr.length/2,e.gl.DYNAMIC_DRAW)}createPickingColorBuffer(){let e=this._renderer.handler;e.gl.deleteBuffer(this._pickingColorBuffer),this._pickingColorArr=De(this._pickingColorArr),this._pickingColorBuffer=e.createArrayBuffer(this._pickingColorArr,3,this._pickingColorArr.length/3)}}ji.__counter__=0;class Yi{constructor(e){this.__id=Yi.__counter__++,this.pickingEnabled=!0,this._entityCollection=e,this._renderer=null,this._strips=[]}_initProgram(){this._renderer&&this._renderer.handler&&!this._renderer.handler.programs.strip&&this._renderer.handler.addProgram(new Si("strip",{uniforms:{projectionMatrix:{type:"mat4"},viewMatrix:{type:"mat4"},eyePositionHigh:"vec3",eyePositionLow:"vec3",uColor:{type:"vec4"},uOpacity:{type:"float"}},attributes:{aVertexPositionHigh:{type:"vec3"},aVertexPositionLow:{type:"vec3"}},vertexShader:"attribute vec3 aVertexPositionHigh;\n attribute vec3 aVertexPositionLow;\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n void main(void) {\n\n vec3 highDiff = aVertexPositionHigh - eyePositionHigh;\n vec3 lowDiff = aVertexPositionLow - eyePositionLow;\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n gl_Position = projectionMatrix * viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n }",fragmentShader:"precision highp float;\n uniform vec4 uColor;\n uniform float uOpacity;\n void main(void) {\n gl_FragColor = vec4(uColor.rgb, uColor.a * uOpacity);\n }"}))}setRenderNode(e){this._renderer=e.renderer,this._initProgram();for(let t=0;t<this._strips.length;t++)this._strips[t].setRenderNode(e)}add(e){-1===e._handlerIndex&&(e._handler=this,e._handlerIndex=this._strips.length,this._strips.push(e),this._entityCollection&&this._entityCollection.renderNode&&e.setRenderNode(this._entityCollection.renderNode))}remove(e){let t=e._handlerIndex;-1!==t&&(e._deleteBuffers(),e._handlerIndex=-1,e._handler=null,this._strips.splice(t,1),this.reindexStripArray(t))}reindexStripArray(e){let t=this._strips;for(let i=e;i<t.length;i++)t[i]._handlerIndex=i}draw(){let e=this._strips.length;for(;e--;)this._strips[e].draw()}drawPicking(){if(this.pickingEnabled){let e=this._strips.length;for(;e--;)this._strips[e].drawPicking()}}clear(){let e=this._strips.length;for(;e--;)this._strips[e]._deleteBuffers(),this._strips[e]._handler=null,this._strips[e]._handlerIndex=-1;this._strips.length=0,this._strips=[]}}Yi.__counter__=0;class qi{constructor(e={}){this.__id=qi.__counter__++,this._renderNodeIndex=-1,this.renderNode=null,this._visibility=null==e.visibility||e.visibility,this.polygonOffsetUnits=null!=e.polygonOffsetUnits?e.polygonOffsetUnits:0,this.billboardHandler=new zi(this),this.labelHandler=new Ui(this,e.labelMaxLetters),this.polylineHandler=new Wi(this),this.rayHandler=new ji(this),this.pointCloudHandler=new Gi(this),this.stripHandler=new Yi(this),this.geoObjectHandler=new Di(this),null!=e.pickingEnabled&&this.setPickingEnabled(e.pickingEnabled),this._entities=[],this.scaleByDistance=e.scaleByDistance||[n,n,n],this.pickingScale=e.pickingScale||1,this._opacity=null==e.opacity?1:e.opacity,this._fadingOpacity=this._opacity,this.events=this.rendererEvents=Tt(Zi,this),e.entities&&this.addEntities(e.entities)}get id(){return this.__id}isEqual(e){return this.__id===e.__id}setVisibility(e){this._visibility=e,this._fadingOpacity=this._opacity*(e?1:0),this.events.dispatch(this.events.visibilitychange,this)}getVisibility(){return this._visibility}setOpacity(e){this._opacity=e}setPickingEnabled(e){this.billboardHandler.pickingEnabled=e,this.labelHandler.pickingEnabled=e,this.polylineHandler.pickingEnabled=e,this.rayHandler.pickingEnabled=e,this.pointCloudHandler.pickingEnabled=e,this.stripHandler.pickingEnabled=e,this.geoObjectHandler.pickingEnabled=e}getOpacity(){return this._opacity}setScaleByDistance(e,t,i){this.scaleByDistance[0]=e,this.scaleByDistance[1]=t,this.scaleByDistance[2]=i||n}appendChildEntity(e){this._addRecursively(e)}_addRecursively(e){e.billboard&&this.billboardHandler.add(e.billboard),e.label&&this.labelHandler.add(e.label),e.polyline&&this.polylineHandler.add(e.polyline),e.ray&&this.rayHandler.add(e.ray),e.pointCloud&&this.pointCloudHandler.add(e.pointCloud),e.strip&&this.stripHandler.add(e.strip),e.geoObject&&this.geoObjectHandler.add(e.geoObject),this.events.dispatch(this.events.entityadd,e);for(let t=0;t<e.childrenNodes.length;t++)e.childrenNodes[t]._entityCollection=this,e.childrenNodes[t]._entityCollectionIndex=e._entityCollectionIndex,e.childrenNodes[t]._pickingColor=e._pickingColor,this._addRecursively(e.childrenNodes[t])}add(e){if(!e._entityCollection){e._entityCollection=this,e._entityCollectionIndex=this._entities.length,this._entities.push(e);let t=this.renderNode;t&&(t.renderer&&t.renderer.assignPickingColor(e),t.ellipsoid&&e._cartesian.isZero()&&e.setCartesian3v(t.ellipsoid.lonLatToCartesian(e._lonLat))),this._addRecursively(e),e.setPickingColor()}return this}addEntities(e){for(let t=0,i=e.length;t<i;t++)this.add(e[t]);return this}belongs(e){return e._entityCollection&&this._renderNodeIndex===e._entityCollection._renderNodeIndex}_removeRecursively(e){e._entityCollection=null,e._entityCollectionIndex=-1,e.billboard&&this.billboardHandler.remove(e.billboard),e.label&&this.labelHandler.remove(e.label),e.polyline&&this.polylineHandler.remove(e.polyline),e.ray&&this.rayHandler.remove(e.ray),e.pointCloud&&this.pointCloudHandler.remove(e.pointCloud),e.strip&&this.stripHandler.remove(e.strip),e.geoObject&&this.geoObjectHandler.remove(e.geoObject);for(let t=0;t<e.childrenNodes.length;t++)this._removeRecursively(e.childrenNodes[t])}removeEntity(e){this._entities.splice(e._entityCollectionIndex,1),this.reindexEntitiesArray(e._entityCollectionIndex),this.renderNode&&this.renderNode.renderer&&(this.renderNode.renderer.clearPickingColor(e),e._pickingColor.clear()),this.belongs(e)&&this._removeRecursively(e),this.events.dispatch(this.events.entityremove,e)}_removeEntitySilent(e){this._entities.splice(e._entityCollectionIndex,1),this.reindexEntitiesArray(e._entityCollectionIndex),this.renderNode&&this.renderNode.renderer&&(this.renderNode.renderer.clearPickingColor(e),e._pickingColor.clear()),this.belongs(e)&&this._removeRecursively(e)}createPickingColors(){if(!this.renderNode||!this.renderNode.renderer)return;let e=this._entities;for(let t=0;t<e.length;t++)e[t].parent||(this.renderNode.renderer.assignPickingColor(e[t]),e[t].setPickingColor())}reindexEntitiesArray(e){let t=this._entities;for(let i=e;i<t.length;i++)t[i]._entityCollectionIndex=i}addTo(e,t=!1){return this.renderNode||(this.renderNode=e,t||(this._renderNodeIndex=e.entityCollections.length,e.entityCollections.push(this)),e.ellipsoid&&this._updateGeodeticCoordinates(e.ellipsoid),this.bindRenderNode(e),this.events.dispatch(this.events.add,this)),this}bindRenderNode(e){e.renderer&&e.renderer.isInitialized()&&(this.billboardHandler.setRenderer(e.renderer),this.labelHandler.setRenderer(e.renderer),this.rayHandler.setRenderer(e.renderer),this.geoObjectHandler.setRenderNode(e),this.polylineHandler.setRenderNode(e),this.pointCloudHandler.setRenderNode(e),this.stripHandler.setRenderNode(e),this.updateBillboardsTextureAtlas(),this.updateLabelsFontAtlas(),this.createPickingColors())}_updateGeodeticCoordinates(e){let t=this._entities,i=t.length;for(;i--;){let r=t[i];r._lonLat&&r.setCartesian3v(e.lonLatToCartesian(r._lonLat))}}updateBillboardsTextureAtlas(){let e=this.billboardHandler.billboards;for(let t=0;t<e.length;t++)e[t].setSrc(e[t].getSrc())}updateLabelsFontAtlas(){this.renderNode&&this.labelHandler.updateFonts()}remove(){if(this.renderNode){if(-1!==this._renderNodeIndex){this.renderNode.entityCollections.splice(this._renderNodeIndex,1);for(let e=this._renderNodeIndex;e<this.renderNode.entityCollections.length;e++)this.renderNode.entityCollections[e]._renderNodeIndex=e}this.renderNode=null,this._renderNodeIndex=-1,this.events.dispatch(this.events.remove,this)}}getEntities(){return[].concat(this._entities)}each(e){let t=this._entities.length;for(;t--;){let i=this._entities[t];i&&e(i)}}clear(){this.billboardHandler.clear(),this.labelHandler.clear(),this.polylineHandler.clear(),this.rayHandler.clear(),this.pointCloudHandler.clear(),this.stripHandler.clear(),this.geoObjectHandler.clear();let e=this._entities.length;for(;e--;){let t=this._entities[e];this.renderNode&&this.renderNode.renderer&&(this.renderNode.renderer.clearPickingColor(t),t._pickingColor.clear()),this._clearEntity(t)}this._entities.length=0,this._entities=[]}_clearEntity(e){e._entityCollection=null,e._entityCollectionIndex=-1;for(let t=0;t<e.childrenNodes.length;t++)this._clearEntity(e.childrenNodes[t])}}qi.__counter__=0;const Zi=["entitymove","draw","drawend","add","remove","entityadd","entityremove","visibilitychange","mousemove","mouseenter","mouseleave","lclick","rclick","mclick","ldblclick","rdblclick","mdblclick","lup","rup","mup","ldown","rdown","mdown","lhold","rhold","mhold","mousewheel","touchmove","touchstart","touchend","doubletouch","touchleave","touchenter"];class Xi{constructor(e,t,i,r,n,s,a){this.layer=e,this.parentNode=i,this.childrenNodes=[],this.partId=t,this.nodeId=t+r,this.state=null,this.extent=n,this.count=0,this.deferredEntities=[],this.entityCollection=null,this.zoom=a,this._inTheQueue=!1,this.bsphere=new bt,s&&this._setExtentBounds()}insertEntity(e,t=!1){this.buildTree([e],t)}_addEntitiesToCollection(e,t=!1){if(e.length){const i=this.layer,r=i._planet;let n=this.entityCollection;n||(n=new qi({pickingEnabled:i._pickingEnabled,labelMaxLetters:i.labelMaxLetters}),n._layer=this.layer,n.addTo(r,!0),n._quadNode=this,i._bindEventsDefault(n),this.entityCollection=n),t||!i.async?this.entityCollection.addEntities(e):this.deferredEntities.push.apply(this.deferredEntities,e)}}_setExtentBounds(){this.nodeId?this.bsphere.setFromExtent(this.layer._planet.ellipsoid,this.extent.inverseMercator()):(this.bsphere.radius=this.layer._planet.ellipsoid.equatorialSize,this.bsphere.center=new oe)}__setLonLat__(e){return e._lonLat.isZero()&&!e._cartesian.isZero()&&(e._lonLat=this.layer._planet.ellipsoid.cartesianToLonLat(e._cartesian)),Math.abs(e._lonLat.lat)<J?e._lonLatMerc=e._lonLat.forwardMercator():e._lonLatMerc=new I,e._lonLatMerc}buildTree(e,t=!1){if(this.count+=e.length,e.length>this.layer._nodeCapacity){const i=this.childrenNodes;i.length||this.createChildrenNodes();let r=[],n=[],s=[],a=[],o=e.length;for(;o--;){const t=e[o];i[0].isInside(t)?(t._nodePtr=i[0],r.push(t)):i[1].isInside(t)?(t._nodePtr=i[1],n.push(t)):i[2].isInside(t)?(t._nodePtr=i[2],s.push(t)):i[3].isInside(t)&&(t._nodePtr=i[3],a.push(t))}r.length&&i[0].buildTree(r,t),n.length&&i[1].buildTree(n,t),s.length&&i[2].buildTree(s,t),a.length&&i[3].buildTree(a,t)}else this._addEntitiesToCollection(e,t)}isInside(e){return!!e._lonLatMerc&&this.extent.isInside(e._lonLatMerc)}createChildrenNodes(){const e=this.layer,t=this.extent,i=.5*t.getWidth(),r=.5*t.getHeight(),n=t.northEast,s=t.southWest,a=4*this.nodeId+1,o=new I(s.lon+i,s.lat+r),l=this.childrenNodes,h=this.layer._planet,c=this.zoom+1;l[0]=new Xi(e,0,this,a,new ie(new I(s.lon,s.lat+r),new I(s.lon+i,n.lat)),h,c),l[1]=new Xi(e,1,this,a,new ie(o,new I(n.lon,n.lat)),h,c),l[2]=new Xi(e,2,this,a,new ie(new I(s.lon,s.lat),o),h,c),l[3]=new Xi(e,3,this,a,new ie(new I(s.lon+i,s.lat),new I(n.lon,s.lat+r)),h,c)}collectRenderCollectionsPASS1(e,t){const i=e[this.nodeId];if(i){const r=this.childrenNodes;this.entityCollection?this.renderCollection(t,e):r.length&&(1===i.state?this.layer._secondPASS.push(this):(r[0].collectRenderCollectionsPASS1(e,t),r[1].collectRenderCollectionsPASS1(e,t),r[2].collectRenderCollectionsPASS1(e,t),r[3].collectRenderCollectionsPASS1(e,t)))}}collectRenderCollectionsPASS2(e,t,i){const r=this.layer._planet.camera,n=r.eye.distance(this.bsphere.center)-this.bsphere.radius<3570*Math.sqrt(r._lonLat.height)||r._lonLat.height>1e4;if(this.count>0&&n&&r.frustum.containsSphere(this.bsphere)){const r=this.childrenNodes;this.entityCollection?this.renderCollection(t,e,i):r.length&&(r[0].collectRenderCollectionsPASS2(e,t,i),r[1].collectRenderCollectionsPASS2(e,t,i),r[2].collectRenderCollectionsPASS2(e,t,i),r[3].collectRenderCollectionsPASS2(e,t,i))}}applyCollection(){this.entityCollection.addEntities(this.deferredEntities),this.deferredEntities.length=0,this.deferredEntities=[],this._inTheQueue=!1}traverseTree(e){const t=this.childrenNodes;this.entityCollection?e(this):t.length&&(t[0].traverseTree(e),t[1].traverseTree(e),t[2].traverseTree(e),t[3].traverseTree(e))}renderCollection(e,t,i){const r=this.layer;r._renderingNodes[this.nodeId]=!0,this.deferredEntities.length&&!this._inTheQueue&&(r.async?r._queueDeferredNode(this):this.applyCollection());const n=this.entityCollection;if(n._fadingOpacity=r._fadingOpacity,n.scaleByDistance=r.scaleByDistance,n.pickingScale=r.pickingScale,n.polygonOffsetUnits=r.polygonOffsetUnits,e.push(n),r.clampToGround||r.relativeToGround){const e=n._entities;let s=e.length;if(t[this.nodeId]&&1===t[this.nodeId].state)for(;s--;){let i=e[s];this.alignEntityToTheGround(i,t[this.nodeId].segment)}else if(i)for(;s--;){let r=e[s];this.alignEntityToTheGround(r,t[i].segment)}else{const t=r._planet._renderedNodes;for(;s--;){let i=e[s],r=t.length;for(;r--;)if(t[r].segment.isEntityInside(i)){this.alignEntityToTheGround(i,t[r].segment);break}}}}}alignEntityToTheGround(e,t){let i=new oe;t.getEntityTerrainPoint(e,i);let r=Number(this.layer.relativeToGround)&&e._altitude||0;if(r){let t=this.layer._planet.ellipsoid.getSurfaceNormal3v(i);e._setCartesian3vSilent(i.addA(t.scale(r)))}else e._setCartesian3vSilent(i)}isVisible(){return!!this.layer._renderingNodes[this.nodeId]}}class $i extends Xi{constructor(e,t,i,r,n,s,a){super(e,t,i,r,n,s,a),this.isNorth=!1}createChildrenNodes(){const e=this.layer,t=this.extent,i=.5*t.getWidth(),r=.5*t.getHeight(),n=t.northEast,s=t.southWest,a=4*this.nodeId+1,o=new I(s.lon+i,s.lat+r),l=this.childrenNodes,h=this.layer._planet,c=this.zoom+1;l[0]=new $i(e,0,this,a,new ie(new I(s.lon,s.lat+r),new I(s.lon+i,n.lat)),h,c),l[1]=new $i(e,1,this,a,new ie(o,new I(n.lon,n.lat)),h,c),l[2]=new $i(e,2,this,a,new ie(new I(s.lon,s.lat),o),h,c),l[3]=new $i(e,3,this,a,new ie(new I(s.lon+i,s.lat),new I(n.lon,s.lat+r)),h,c)}_setExtentBounds(){this.extent.northEast.lat>0&&(this.isNorth=!0),this.bsphere.setFromExtent(this.layer._planet.ellipsoid,this.extent)}__setLonLat__(e){return e._lonLat.isZero()&&(e._lonLat=this.layer._planet.ellipsoid.cartesianToLonLat(e._cartesian)),e._lonLat}isVisible(){return!(!this.isNorth||!this.layer._renderingNodesNorth[this.nodeId])||!!this.layer._renderingNodesSouth[this.nodeId]}isInside(e){return this.extent.isInside(e._lonLat)}renderCollection(e,t,i){this.isNorth?this.layer._renderingNodesNorth[this.nodeId]=!0:this.layer._renderingNodesSouth[this.nodeId]=!0,this.deferredEntities.length&&!this._inTheQueue&&(this.layer.async?this.layer._queueDeferredNode(this):this.applyCollection());const r=this.entityCollection;r._fadingOpacity=this.layer._fadingOpacity,r.scaleByDistance=this.layer.scaleByDistance,r.pickingScale=this.layer.pickingScale,e.push(r)}}function Ki(e,t){if(e>=0){let i=65536*Math.floor(e/65536);t[0]=Math.fround(i),t[1]=Math.fround(e-i)}else{let i=65536*Math.floor(-e/65536);t[0]=Math.fround(-i),t[1]=Math.fround(e+i)}return t}function Qi(e,t){if(e>=0){let i=65536*Math.floor(e/65536);t.x=Math.fround(i),t.y=Math.fround(e-i)}else{let i=65536*Math.floor(-e/65536);t.x=Math.fround(-i),t.y=Math.fround(e+i)}return t}function Ji(e,t,i){i=i||2;var r,n,s,a,o,l,h,c=t&&t.length,d=c?t[0]*i:e.length,_=er(e,0,d,i,!0),u=[];if(!_)return u;if(c&&(_=function(e,t,i,r){var n,s,a,o=[];for(n=0,s=t.length;n<s;n++)(a=er(e,t[n]*r,n<s-1?t[n+1]*r:e.length,r,!1))===a.next&&(a.steiner=!0),o.push(cr(a));for(o.sort(or),n=0;n<o.length;n++)lr(o[n],i),i=tr(i,i.next);return i}(e,t,_,i)),e.length>80*i){r=s=e[0],n=a=e[1];for(let t=i;t<d;t+=i)(o=e[t])<r&&(r=o),(l=e[t+1])<n&&(n=l),o>s&&(s=o),l>a&&(a=l);h=Math.max(s-r,a-n)}return ir(_,u,i,r,n,h),u}function er(e,t,i,r,n){var s,a;if(n===function(e,t,i,r){var n=0;for(let s=t,a=i-r;s<i;s+=r)n+=(e[a]-e[s])*(e[s+1]+e[a+1]),a=s;return n}(e,t,i,r)>0)for(s=t;s<i;s+=r)a=vr(s,e[s],e[s+1],a);else for(s=i-r;s>=t;s-=r)a=vr(s,e[s],e[s+1],a);return a&&fr(a,a.next)&&(yr(a),a=a.next),a}function tr(e,t){if(!e)return e;t||(t=e);var i,r=e;do{if(i=!1,r.steiner||!fr(r,r.next)&&0!==ur(r.prev,r,r.next))r=r.next;else{if(yr(r),(r=t=r.prev)===r.next)return null;i=!0}}while(i||r!==t);return t}function ir(e,t,i,r,n,s,a){if(e){!a&&s&&function(e,t,i,r){var n=e;do{null===n.z&&(n.z=hr(n.x,n.y,t,i,r)),n.prevZ=n.prev,n.nextZ=n.next,n=n.next}while(n!==e);n.prevZ.nextZ=null,n.prevZ=null,function(e){var t,i,r,n,s,a,o,l,h=1;do{for(i=e,e=null,s=null,a=0;i;){for(a++,r=i,o=0,t=0;t<h&&(o++,r=r.nextZ);t++);for(l=h;o>0||l>0&&r;)0!==o&&(0===l||!r||i.z<=r.z)?(n=i,i=i.nextZ,o--):(n=r,r=r.nextZ,l--),s?s.nextZ=n:e=n,n.prevZ=s,s=n;i=r}s.nextZ=null,h*=2}while(a>1)}(n)}(e,r,n,s);for(var o,l,h=e;e.prev!==e.next;)if(o=e.prev,l=e.next,s?nr(e,r,n,s):rr(e))t.push(o.i/i),t.push(e.i/i),t.push(l.i/i),yr(e),e=l.next,h=l.next;else if((e=l)===h){a?1===a?ir(e=sr(e,t,i),t,i,r,n,s,2):2===a&&ar(e,t,i,r,n,s):ir(tr(e),t,i,r,n,s,1);break}}}function rr(e){var t=e.prev,i=e,r=e.next;if(ur(t,i,r)>=0)return!1;for(var n=e.next.next;n!==e.prev;){if(dr(t.x,t.y,i.x,i.y,r.x,r.y,n.x,n.y)&&ur(n.prev,n,n.next)>=0)return!1;n=n.next}return!0}function nr(e,t,i,r){var n=e.prev,s=e,a=e.next;if(ur(n,s,a)>=0)return!1;for(var o=n.x<s.x?n.x<a.x?n.x:a.x:s.x<a.x?s.x:a.x,l=n.y<s.y?n.y<a.y?n.y:a.y:s.y<a.y?s.y:a.y,h=n.x>s.x?n.x>a.x?n.x:a.x:s.x>a.x?s.x:a.x,c=n.y>s.y?n.y>a.y?n.y:a.y:s.y>a.y?s.y:a.y,d=hr(o,l,t,i,r),_=hr(h,c,t,i,r),u=e.nextZ;u&&u.z<=_;){if(u!==e.prev&&u!==e.next&&dr(n.x,n.y,s.x,s.y,a.x,a.y,u.x,u.y)&&ur(u.prev,u,u.next)>=0)return!1;u=u.nextZ}for(u=e.prevZ;u&&u.z>=d;){if(u!==e.prev&&u!==e.next&&dr(n.x,n.y,s.x,s.y,a.x,a.y,u.x,u.y)&&ur(u.prev,u,u.next)>=0)return!1;u=u.prevZ}return!0}function sr(e,t,i){var r=e;do{var n=r.prev,s=r.next.next;!fr(n,s)&&gr(n,r,r.next,s)&&pr(n,s)&&pr(s,n)&&(t.push(n.i/i),t.push(r.i/i),t.push(s.i/i),yr(r),yr(r.next),r=e=s),r=r.next}while(r!==e);return r}function ar(e,t,i,r,n,s){var a=e;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&_r(a,o)){var l=mr(a,o);return a=tr(a,a.next),l=tr(l,l.next),ir(a,t,i,r,n,s),void ir(l,t,i,r,n,s)}o=o.next}a=a.next}while(a!==e)}function or(e,t){return e.x-t.x}function lr(e,t){if(t=function(e,t){var i,r=t,n=e.x,s=e.y,a=-1/0;do{if(s<=r.y&&s>=r.next.y&&r.next.y!==r.y){var o=r.x+(s-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(o<=n&&o>a){if(a=o,o===n){if(s===r.y)return r;if(s===r.next.y)return r.next}i=r.x<r.next.x?r:r.next}}r=r.next}while(r!==t);if(!i)return null;if(n===a)return i.prev;var l,h=i,c=i.x,d=i.y,_=1/0;r=i.next;for(;r!==h;)n>=r.x&&r.x>=c&&n!==r.x&&dr(s<d?n:a,s,c,d,s<d?a:n,s,r.x,r.y)&&((l=Math.abs(s-r.y)/(n-r.x))<_||l===_&&r.x>i.x)&&pr(r,e)&&(i=r,_=l),r=r.next;return i}(e,t),t){var i=mr(t,e);tr(i,i.next)}}function hr(e,t,i,r,n){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)/n)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)/n)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function cr(e){var t=e,i=e;do{t.x<i.x&&(i=t),t=t.next}while(t!==e);return i}function dr(e,t,i,r,n,s,a,o){return(n-a)*(t-o)-(e-a)*(s-o)>=0&&(e-a)*(r-o)-(i-a)*(t-o)>=0&&(i-a)*(s-o)-(n-a)*(r-o)>=0}function _r(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var i=e;do{if(i.i!==e.i&&i.next.i!==e.i&&i.i!==t.i&&i.next.i!==t.i&&gr(i,i.next,e,t))return!0;i=i.next}while(i!==e);return!1}(e,t)&&pr(e,t)&&pr(t,e)&&function(e,t){var i=e,r=!1,n=(e.x+t.x)/2,s=(e.y+t.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&n<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(r=!r),i=i.next}while(i!==e);return r}(e,t)}function ur(e,t,i){return(t.y-e.y)*(i.x-t.x)-(t.x-e.x)*(i.y-t.y)}function fr(e,t){return e.x===t.x&&e.y===t.y}function gr(e,t,i,r){return!!(fr(e,t)&&fr(i,r)||fr(e,r)&&fr(i,t))||ur(e,t,i)>0!=ur(e,t,r)>0&&ur(i,r,e)>0!=ur(i,r,t)>0}function pr(e,t){return ur(e.prev,e,e.next)<0?ur(e,t,e.next)>=0&&ur(e,e.prev,t)>=0:ur(e,t,e.prev)<0||ur(e,e.next,t)<0}function mr(e,t){var i=new xr(e.i,e.x,e.y),r=new xr(t.i,t.x,t.y),n=e.next,s=t.prev;return e.next=t,t.prev=e,i.next=n,n.prev=i,r.next=i,i.prev=r,s.next=r,r.prev=s,r}function vr(e,t,i,r){var n=new xr(e,t,i);return r?(n.next=r.next,n.prev=r,r.next.prev=n,r.next=n):(n.prev=n,n.next=n),n}function yr(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function xr(e,t,i){this.i=e,this.x=t,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function br(e){var t=e[0][0].length,i={vertices:[],holes:[],dimensions:t},r=0;for(let n=0;n<e.length;n++){for(let r=0;r<e[n].length;r++)for(let s=0;s<t;s++)i.vertices.push(e[n][r][s]);n>0&&(r+=e[n-1].length,i.holes.push(r))}return i}function wr(e,t,i){let r=e[0],n=e[1];if(r>=0){let e=65536*Math.floor(r/65536);t.x=Math.fround(e),i.x=Math.fround(r-e)}else{let e=65536*Math.floor(-r/65536);t.x=Math.fround(-e),i.x=Math.fround(r+e)}if(n>=0){let e=65536*Math.floor(n/65536);t.y=Math.fround(e),i.y=Math.fround(n-e)}else{let e=65536*Math.floor(-n/65536);t.y=Math.fround(-e),i.y=Math.fround(n+e)}}let Tr=new le,Cr=new le,Lr=new le;class Ar{constructor(e){this.__id=Ar.__counter__++,this._layer=e,this._handler=null,this._geometries=[],this._updatedGeometryArr=[],this._updatedGeometry={},this._removeGeometryExtentArr=[],this._removeGeometryExtents={},this._polyVerticesHighMerc=[],this._polyVerticesLowMerc=[],this._polyColors=[],this._polyPickingColors=[],this._polyIndexes=[],this._lineVerticesHighMerc=[],this._lineVerticesLowMerc=[],this._lineOrders=[],this._lineIndexes=[],this._lineColors=[],this._linePickingColors=[],this._lineThickness=[],this._lineStrokes=[],this._lineStrokeColors=[],this._polyVerticesHighBufferMerc=null,this._polyVerticesLowBufferMerc=null,this._polyColorsBuffer=null,this._polyPickingColorsBuffer=null,this._polyIndexesBuffer=null,this._lineVerticesHighBufferMerc=null,this._lineVerticesLowBufferMerc=null,this._lineColorsBuffer=null,this._linePickingColorsBuffer=null,this._lineThicknessBuffer=null,this._lineStrokesBuffer=null,this._lineStrokeColorsBuffer=null,this._lineOrdersBuffer=null,this._lineIndexesBuffer=null,this._buffersUpdateCallbacks=[],this._buffersUpdateCallbacks[0]=this.createPolyVerticesBuffer,this._buffersUpdateCallbacks[1]=this.createPolyIndexesBuffer,this._buffersUpdateCallbacks[2]=this.createPolyColorsBuffer,this._buffersUpdateCallbacks[3]=this.createLineVerticesBuffer,this._buffersUpdateCallbacks[4]=this.createLineIndexesBuffer,this._buffersUpdateCallbacks[5]=this.createLineOrdersBuffer,this._buffersUpdateCallbacks[6]=this.createLineColorsBuffer,this._buffersUpdateCallbacks[7]=this.createLineThicknessBuffer,this._buffersUpdateCallbacks[8]=this.createLineStrokesBuffer,this._buffersUpdateCallbacks[9]=this.createLineStrokeColorsBuffer,this._buffersUpdateCallbacks[10]=this.createPolyPickingColorsBuffer,this._buffersUpdateCallbacks[11]=this.createLinePickingColorsBuffer,this._changedBuffers=new Array(this._buffersUpdateCallbacks.length)}static appendLineData(e,t,i,r,n,s,a,o,l,h,c,d,_,u,f,g,p,m){var v=0;c.length>0?(v=c[c.length-5]+9,c.push(v,v)):c.push(0,0);var y=n,x=[i.x,i.y,i.z,i.w],b=a,w=[s.x,s.y,s.z,s.w],T=[r.x,r.y,r.z,1];for(let i=0;i<e.length;i++){var C=e[i];if(0===C.length)continue;let r,n,s=v;if(t)r=C[C.length-1];else{let e=C[0],t=C[1];t||(t=e),r=[e[0]+e[0]-t[0],e[1]+e[1]-t[1]]}wr(r,Tr,Cr),o.push(Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y),l.push(Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y),p.push(Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y),m.push(Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y),h.push(1,-1,2,-2),u.push(y,y,y,y),g.push(b,b,b,b),d.push(x[0],x[1],x[2],x[3],x[0],x[1],x[2],x[3],x[0],x[1],x[2],x[3],x[0],x[1],x[2],x[3]),f.push(w[0],w[1],w[2],w[3],w[0],w[1],w[2],w[3],w[0],w[1],w[2],w[3],w[0],w[1],w[2],w[3]),_.push(T[0],T[1],T[2],T[3],T[0],T[1],T[2],T[3],T[0],T[1],T[2],T[3],T[0],T[1],T[2],T[3]);for(let e=0;e<C.length;e++){wr(C[e],Tr,Cr),o.push(Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y),l.push(Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y),p.push(Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y),m.push(Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y),h.push(1,-1,2,-2),u.push(y,y,y,y),g.push(b,b,b,b),d.push(x[0],x[1],x[2],x[3],x[0],x[1],x[2],x[3],x[0],x[1],x[2],x[3],x[0],x[1],x[2],x[3]),f.push(w[0],w[1],w[2],w[3],w[0],w[1],w[2],w[3],w[0],w[1],w[2],w[3],w[0],w[1],w[2],w[3]),_.push(T[0],T[1],T[2],T[3],T[0],T[1],T[2],T[3],T[0],T[1],T[2],T[3],T[0],T[1],T[2],T[3]),c.push(v++,v++,v++,v++)}if(t)n=C[0],c.push(s,s+1,s+1,s+1);else{let e=C[C.length-1],t=C[C.length-2];t||(t=e),n=[e[0]+e[0]-t[0],e[1]+e[1]-t[1]],c.push(v-1,v-1,v-1,v-1)}wr(n,Tr,Cr),o.push(Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y),l.push(Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y),p.push(Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y,Tr.x,Tr.y),m.push(Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y,Cr.x,Cr.y),h.push(1,-1,2,-2),u.push(y,y,y,y),g.push(b,b,b,b),d.push(x[0],x[1],x[2],x[3],x[0],x[1],x[2],x[3],x[0],x[1],x[2],x[3],x[0],x[1],x[2],x[3]),f.push(w[0],w[1],w[2],w[3],w[0],w[1],w[2],w[3],w[0],w[1],w[2],w[3],w[0],w[1],w[2],w[3]),_.push(T[0],T[1],T[2],T[3],T[0],T[1],T[2],T[3],T[0],T[1],T[2],T[3],T[0],T[1],T[2],T[3]),i<e.length-1&&(v+=8,c.push(v,v))}}assignHandler(e){this._handler=e,this.refresh(),e.isInitialized()&&this.update()}add(e){if(-1===e._handlerIndex){e._handler=this,e._handlerIndex=this._geometries.length,this._geometries.push(e);let t=e._entity._pickingColor.scaleTo(1/255);if(e._polyVerticesHighMerc=[],e._polyVerticesLowMerc=[],e._lineVerticesHighMerc=[],e._lineVerticesLowMerc=[],e._coordinates[0].length)if(e.type===ti.POLYGON){let i=e._coordinates,r=[];for(let e=0;e<i.length;e++){r[e]=[];for(let t=0;t<i[e].length;t++)r[e][t]=[X(i[e][t][0]),$(i[e][t][1])]}let n=br(r),s=Ji(n.vertices,n.holes,2);e._polyVerticesHandlerIndex=this._polyVerticesHighMerc.length,e._polyIndexesHandlerIndex=this._polyIndexes.length;for(let t=0;t<s.length;t++)this._polyIndexes.push(s[t]+.5*e._polyVerticesHandlerIndex);let a=e._style.fillColor,o=[],l=[];for(let e=0;e<.5*n.vertices.length;e++)this._polyColors.push(a.x,a.y,a.z,a.w),this._polyPickingColors.push(t.x,t.y,t.z,1);for(let e=0;e<n.vertices.length;e++)Qi(n.vertices[e],Lr),o[e]=Lr.x,l[e]=Lr.y;e._polyVerticesHighMerc=o,e._polyVerticesLowMerc=l,this._polyVerticesHighMerc.push.apply(this._polyVerticesHighMerc,o),this._polyVerticesLowMerc.push.apply(this._polyVerticesLowMerc,l),e._polyVerticesLength=n.vertices.length,e._polyIndexesLength=s.length,e._lineVerticesHandlerIndex=this._lineVerticesHighMerc.length,e._lineOrdersHandlerIndex=this._lineOrders.length,e._lineIndexesHandlerIndex=this._lineIndexes.length,e._lineColorsHandlerIndex=this._lineColors.length,e._lineThicknessHandlerIndex=this._lineThickness.length,Ar.appendLineData(r,!0,e._style.lineColor,t,e._style.lineWidth,e._style.strokeColor,e._style.strokeWidth,this._lineVerticesHighMerc,this._lineVerticesLowMerc,this._lineOrders,this._lineIndexes,this._lineColors,this._linePickingColors,this._lineThickness,this._lineStrokeColors,this._lineStrokes,e._lineVerticesHighMerc,e._lineVerticesLowMerc),e._lineVerticesLength=this._lineVerticesHighMerc.length-e._lineVerticesHandlerIndex,e._lineOrdersLength=this._lineOrders.length-e._lineOrdersHandlerIndex,e._lineIndexesLength=this._lineIndexes.length-e._lineIndexesHandlerIndex,e._lineColorsLength=this._lineColors.length-e._lineColorsHandlerIndex,e._lineThicknessLength=this._lineThickness.length-e._lineThicknessHandlerIndex}else if(e.type===ti.MULTIPOLYGON){let i=e._coordinates,r=[],n=[];e._lineVerticesHandlerIndex=this._lineVerticesHighMerc.length,e._lineOrdersHandlerIndex=this._lineOrders.length,e._lineIndexesHandlerIndex=this._lineIndexes.length,e._lineColorsHandlerIndex=this._lineColors.length,e._lineThicknessHandlerIndex=this._lineThickness.length;for(let s=0;s<i.length;s++){let a=i[s],o=[];for(let e=0;e<a.length;e++){o[e]=[];for(let t=0;t<i[s][e].length;t++)o[e][t]=[X(a[e][t][0]),$(a[e][t][1])]}let l=br(o),h=Ji(l.vertices,l.holes,2);for(let e=0;e<h.length;e++)n.push(h[e]+.5*r.length);r.push.apply(r,l.vertices),Ar.appendLineData(o,!0,e._style.lineColor,t,e._style.lineWidth,e._style.strokeColor,e._style.strokeWidth,this._lineVerticesHighMerc,this._lineVerticesLowMerc,this._lineOrders,this._lineIndexes,this._lineColors,this._linePickingColors,this._lineThickness,this._lineStrokeColors,this._lineStrokes,e._lineVerticesHighMerc,e._lineVerticesLowMerc)}e._polyVerticesHandlerIndex=this._polyVerticesHighMerc.length,e._polyIndexesHandlerIndex=this._polyIndexes.length;for(let t=0;t<n.length;t++)this._polyIndexes.push(n[t]+.5*e._polyVerticesHandlerIndex);let s=e._style.fillColor,a=[],o=[];for(let e=0;e<.5*r.length;e++)this._polyColors.push(s.x,s.y,s.z,s.w),this._polyPickingColors.push(t.x,t.y,t.z,1);for(let e=0;e<r.length;e++)Qi(r[e],Lr),a[e]=Lr.x,o[e]=Lr.y;e._polyVerticesHighMerc=a,e._polyVerticesLowMerc=o,this._polyVerticesHighMerc.push.apply(this._polyVerticesHighMerc,a),this._polyVerticesLowMerc.push.apply(this._polyVerticesLowMerc,o),e._polyVerticesLength=r.length,e._polyIndexesLength=n.length,e._lineVerticesLength=this._lineVerticesHighMerc.length-e._lineVerticesHandlerIndex,e._lineOrdersLength=this._lineOrders.length-e._lineOrdersHandlerIndex,e._lineIndexesLength=this._lineIndexes.length-e._lineIndexesHandlerIndex,e._lineColorsLength=this._lineColors.length-e._lineColorsHandlerIndex,e._lineThicknessLength=this._lineThickness.length-e._lineThicknessHandlerIndex}else if(e.type===ti.LINESTRING){let i=e._coordinates,r=new Array(i.length);for(let e=0;e<i.length;e++)r[e]=[X(i[e][0]),$(i[e][1])];e._lineVerticesHandlerIndex=this._lineVerticesHighMerc.length,e._lineOrdersHandlerIndex=this._lineOrders.length,e._lineIndexesHandlerIndex=this._lineIndexes.length,e._lineColorsHandlerIndex=this._lineColors.length,e._lineThicknessHandlerIndex=this._lineThickness.length,Ar.appendLineData([r],!1,e._style.lineColor,t,e._style.lineWidth,e._style.strokeColor,e._style.strokeWidth,this._lineVerticesHighMerc,this._lineVerticesLowMerc,this._lineOrders,this._lineIndexes,this._lineColors,this._linePickingColors,this._lineThickness,this._lineStrokeColors,this._lineStrokes,e._lineVerticesHighMerc,e._lineVerticesLowMerc),e._lineVerticesLength=this._lineVerticesHighMerc.length-e._lineVerticesHandlerIndex,e._lineOrdersLength=this._lineOrders.length-e._lineOrdersHandlerIndex,e._lineIndexesLength=this._lineIndexes.length-e._lineIndexesHandlerIndex,e._lineColorsLength=this._lineColors.length-e._lineColorsHandlerIndex,e._lineThicknessLength=this._lineThickness.length-e._lineThicknessHandlerIndex}else if(e.type===ti.MULTILINESTRING){let i=e._coordinates,r=[];for(let e=0;e<i.length;e++){r[e]=[];for(let t=0;t<i[e].length;t++)r[e][t]=[X(i[e][t][0]),$(i[e][t][1])]}e._lineVerticesHandlerIndex=this._lineVerticesHighMerc.length,e._lineOrdersHandlerIndex=this._lineOrders.length,e._lineIndexesHandlerIndex=this._lineIndexes.length,e._lineColorsHandlerIndex=this._lineColors.length,e._lineThicknessHandlerIndex=this._lineThickness.length,Ar.appendLineData(r,!1,e._style.lineColor,t,e._style.lineWidth,e._style.strokeColor,e._style.strokeWidth,this._lineVerticesHighMerc,this._lineVerticesLowMerc,this._lineOrders,this._lineIndexes,this._lineColors,this._linePickingColors,this._lineThickness,this._lineStrokeColors,this._lineStrokes,e._lineVerticesHighMerc,e._lineVerticesLowMerc),e._lineVerticesLength=this._lineVerticesHighMerc.length-e._lineVerticesHandlerIndex,e._lineOrdersLength=this._lineOrders.length-e._lineOrdersHandlerIndex,e._lineIndexesLength=this._lineIndexes.length-e._lineIndexesHandlerIndex,e._lineColorsLength=this._lineColors.length-e._lineColorsHandlerIndex,e._lineThicknessLength=this._lineThickness.length-e._lineThicknessHandlerIndex}this.setGeometryVisibility(e),!this._updatedGeometry[e.__id]&&this._updatedGeometryArr.push(e),this._updatedGeometry[e.__id]=!0,this.refresh()}}remove(e){const t=e._handlerIndex;if(-1!==t){this._geometries.splice(t,1),this._polyVerticesHighMerc.splice(e._polyVerticesHandlerIndex,e._polyVerticesLength),this._polyVerticesLowMerc.splice(e._polyVerticesHandlerIndex,e._polyVerticesLength),this._polyColors.splice(2*e._polyVerticesHandlerIndex,2*e._polyVerticesLength),this._polyPickingColors.splice(2*e._polyVerticesHandlerIndex,2*e._polyVerticesLength),this._polyIndexes.splice(e._polyIndexesHandlerIndex,e._polyIndexesLength);let i=.5*e._polyVerticesLength;for(let t=e._polyIndexesHandlerIndex;t<this._polyIndexes.length;t++)this._polyIndexes[t]-=i;this._lineVerticesHighMerc.splice(e._lineVerticesHandlerIndex,e._lineVerticesLength),this._lineVerticesLowMerc.splice(e._lineVerticesHandlerIndex,e._lineVerticesLength),this._lineOrders.splice(e._lineOrdersHandlerIndex,e._lineOrdersLength),this._lineColors.splice(e._lineColorsHandlerIndex,e._lineColorsLength),this._linePickingColors.splice(e._lineColorsHandlerIndex,e._lineColorsLength),this._lineStrokeColors.splice(e._lineColorsHandlerIndex,e._lineColorsLength),this._lineThickness.splice(e._lineThicknessHandlerIndex,e._lineThicknessLength),this._lineStrokes.splice(e._lineThicknessHandlerIndex,e._lineThicknessLength),this._lineIndexes.splice(e._lineIndexesHandlerIndex,e._lineIndexesLength),i=.5*e._lineVerticesLength;for(let t=e._lineIndexesHandlerIndex;t<this._lineIndexes.length;t++)this._lineIndexes[t]-=i;let r=this._geometries;for(let i=t;i<r.length;i++){let t=r[i];t._handlerIndex=i,t._polyVerticesHandlerIndex-=e._polyVerticesLength,t._polyIndexesHandlerIndex-=e._polyIndexesLength,t._lineVerticesHandlerIndex-=e._lineVerticesLength,t._lineOrdersHandlerIndex-=e._lineOrdersLength,t._lineColorsHandlerIndex-=e._lineColorsLength,t._lineThicknessHandlerIndex-=e._lineThicknessLength,t._lineIndexesHandlerIndex-=e._lineIndexesLength}e._pickingReady=!1,e._handler=null,e._handlerIndex=-1,e._polyVerticesHighMerc=[],e._polyVerticesLowMerc=[],e._polyVerticesLength=-1,e._polyIndexesLength=-1,e._polyVerticesHandlerIndex=-1,e._polyIndexesHandlerIndex=-1,e._lineVerticesHighMerc=[],e._lineVerticesLowMerc=[],e._lineVerticesLength=-1,e._lineOrdersLength=-1,e._lineIndexesLength=-1,e._lineColorsLength=-1,e._lineThicknessLength=-1,e._lineVerticesHandlerIndex=-1,e._lineOrdersHandlerIndex=-1,e._lineIndexesHandlerIndex=-1,e._lineThicknessHandlerIndex=-1,e._lineColorsHandlerIndex=-1,!this._removeGeometryExtents[e.__id]&&this._removeGeometryExtentArr.push(e.getExtent()),this._removeGeometryExtents[e.__id]=!0,this.refresh()}}_refreshRecursevely(e,t){if(t.ready){let i=this._layer._id;for(let r=0;r<t.nodes.length;r++){let n=t.nodes[r];if(e.overlaps(n.segment.getExtentLonLat())){this._refreshRecursevely(e,n);let t=n.segment.materials[i];t&&t.isReady&&(1!==t.segment.node.getState()?t.layer.clearMaterial(t):(t.pickingReady=t.pickingReady&&e._pickingReady,t.isReady=!1,t._updateTexture=t.texture,t._updatePickingMask=t.pickingMask),e._pickingReady=!0)}}}}_refreshRecursevelyExt(e,t){if(t.ready){let i=this._layer.__id;for(let r=0;r<t.nodes.length;r++){let n=t.nodes[r];if(e.overlaps(n.segment.getExtentLonLat())){this._refreshRecursevelyExt(e,n);let t=n.segment.materials[i];t&&t.isReady&&t.layer.clearMaterial(t)}}}}_refreshPlanetNode(e){let t,i=this._removeGeometryExtentArr;for(t=0;t<i.length;t++)this._refreshRecursevelyExt(i[t],e);let r=this._updatedGeometryArr;for(t=0;t<r.length;t++)this._refreshRecursevely(r[t],e)}_updatePlanet(){let e=this._layer._planet;if(e){let t=e.quadTreeStrategy.quadTreeList;for(let e=0;e<t.length;e++)this._refreshPlanetNode(t[e])}this._updatedGeometryArr.length=0,this._updatedGeometryArr=[],this._updatedGeometry={},this._removeGeometryExtentArr.length=0,this._removeGeometryExtentArr=[],this._removeGeometryExtents={}}refresh(){let e=this._changedBuffers.length;for(;e--;)this._changedBuffers[e]=!0}update(){if(this._handler){let e=!1,t=this._changedBuffers.length;for(;t--;)this._changedBuffers[t]&&(e=!0,this._buffersUpdateCallbacks[t].call(this),this._changedBuffers[t]=!1);e&&this._updatePlanet()}}setGeometryVisibility(e){let t=e.getVisibility()?1:0,i=this._polyVerticesHighMerc,r=this._polyVerticesLowMerc,n=e._polyVerticesLength,s=e._polyVerticesHandlerIndex;for(let a=0;a<n;a++)i[s+a]=e._polyVerticesHighMerc[a]*t,r[s+a]=e._polyVerticesLowMerc[a]*t;i=this._lineVerticesHighMerc,r=this._lineVerticesLowMerc,n=e._lineVerticesLength,s=e._lineVerticesHandlerIndex;for(let a=0;a<n;a++)i[s+a]=e._lineVerticesHighMerc[a]*t,r[s+a]=e._lineVerticesLowMerc[a]*t;this._changedBuffers[0]=!0,this._changedBuffers[3]=!0,!this._updatedGeometry[e.__id]&&this._updatedGeometryArr.push(e),this._updatedGeometry[e.__id]=!0}setPolyColorArr(e,t){let i=2*e._polyVerticesHandlerIndex,r=i+2*e._polyVerticesLength,n=this._polyColors;for(let e=i;e<r;e+=4)n[e]=t.x,n[e+1]=t.y,n[e+2]=t.z,n[e+3]=t.w;this._changedBuffers[2]=!0,!this._updatedGeometry[e.__id]&&this._updatedGeometryArr.push(e),this._updatedGeometry[e.__id]=!0}setLineStrokeColorArr(e,t){let i=e._lineColorsHandlerIndex,r=i+e._lineColorsLength,n=this._lineStrokeColors;for(let e=i;e<r;e+=4)n[e]=t.x,n[e+1]=t.y,n[e+2]=t.z,n[e+3]=t.w;this._changedBuffers[9]=!0,!this._updatedGeometry[e.__id]&&this._updatedGeometryArr.push(e),this._updatedGeometry[e.__id]=!0}setLineColorArr(e,t){let i=e._lineColorsHandlerIndex,r=i+e._lineColorsLength,n=this._lineColors;for(let e=i;e<r;e+=4)n[e]=t.x,n[e+1]=t.y,n[e+2]=t.z,n[e+3]=t.w;this._changedBuffers[6]=!0,!this._updatedGeometry[e.__id]&&this._updatedGeometryArr.push(e),this._updatedGeometry[e.__id]=!0}setLineStrokeArr(e,t){}setLineThicknessArr(e,t){let i=e._lineThicknessHandlerIndex,r=i+e._lineThicknessLength,n=this._lineThickness;for(let e=i;e<r;e++)n[e]=t;this._changedBuffers[7]=!0,!this._updatedGeometry[e.__id]&&this._updatedGeometryArr.push(e),this._updatedGeometry[e.__id]=!0}bringToFront(e){let t=this._polyIndexes.splice(e._polyIndexesHandlerIndex,e._polyIndexesLength),i=this._lineIndexes.splice(e._lineIndexesHandlerIndex,e._lineIndexesLength);this._geometries.splice(e._handlerIndex,1);let r=this._geometries;for(let t=e._handlerIndex;t<r.length;t++){let i=r[t];i._handlerIndex=t,i._polyIndexesHandlerIndex-=e._polyIndexesLength,i._lineIndexesHandlerIndex-=e._lineIndexesLength}e._polyIndexesHandlerIndex=this._polyIndexes.length,e._lineIndexesHandlerIndex=this._lineIndexes.length,e._handlerIndex=this._geometries.length,this._geometries.push(e),this._polyIndexes.push.apply(this._polyIndexes,t),this._lineIndexes.push.apply(this._lineIndexes,i),this._changedBuffers[1]=!0,this._changedBuffers[4]=!0,!this._updatedGeometry[e.__id]&&this._updatedGeometryArr.push(e),this._updatedGeometry[e.__id]=!0}createPolyVerticesBuffer(){let e=this._handler;e.gl.deleteBuffer(this._polyVerticesHighBufferMerc),this._polyVerticesHighBufferMerc=e.createArrayBuffer(new Float32Array(this._polyVerticesHighMerc),2,this._polyVerticesHighMerc.length/2),e.gl.deleteBuffer(this._polyVerticesLowBufferMerc),this._polyVerticesLowBufferMerc=e.createArrayBuffer(new Float32Array(this._polyVerticesLowMerc),2,this._polyVerticesLowMerc.length/2)}createPolyIndexesBuffer(){let e=this._handler;e.gl.deleteBuffer(this._polyIndexesBuffer),this._polyIndexesBuffer=e.createElementArrayBuffer(new Uint32Array(this._polyIndexes),1,this._polyIndexes.length)}createPolyColorsBuffer(){let e=this._handler;e.gl.deleteBuffer(this._polyColorsBuffer),this._polyColorsBuffer=e.createArrayBuffer(new Float32Array(this._polyColors),4,this._polyColors.length/4)}createPolyPickingColorsBuffer(){let e=this._handler;e.gl.deleteBuffer(this._polyPickingColorsBuffer),this._polyPickingColorsBuffer=e.createArrayBuffer(new Float32Array(this._polyPickingColors),4,this._polyPickingColors.length/4)}createLineVerticesBuffer(){let e=this._handler;e.gl.deleteBuffer(this._lineVerticesHighBufferMerc),this._lineVerticesHighBufferMerc=e.createArrayBuffer(new Float32Array(this._lineVerticesHighMerc),2,this._lineVerticesHighMerc.length/2),e.gl.deleteBuffer(this._lineVerticesLowBufferMerc),this._lineVerticesLowBufferMerc=e.createArrayBuffer(new Float32Array(this._lineVerticesLowMerc),2,this._lineVerticesLowMerc.length/2)}createLineIndexesBuffer(){let e=this._handler;e.gl.deleteBuffer(this._lineIndexesBuffer),this._lineIndexesBuffer=e.createElementArrayBuffer(new Uint32Array(this._lineIndexes),1,this._lineIndexes.length)}createLineOrdersBuffer(){let e=this._handler;e.gl.deleteBuffer(this._lineOrdersBuffer),this._lineOrdersBuffer=e.createArrayBuffer(new Float32Array(this._lineOrders),1,this._lineOrders.length/2)}createLineColorsBuffer(){let e=this._handler;e.gl.deleteBuffer(this._lineColorsBuffer),this._lineColorsBuffer=e.createArrayBuffer(new Float32Array(this._lineColors),4,this._lineColors.length/4)}createLinePickingColorsBuffer(){let e=this._handler;e.gl.deleteBuffer(this._linePickingColorsBuffer),this._linePickingColorsBuffer=e.createArrayBuffer(new Float32Array(this._linePickingColors),4,this._linePickingColors.length/4)}createLineThicknessBuffer(){let e=this._handler;e.gl.deleteBuffer(this._lineThicknessBuffer),this._lineThicknessBuffer=e.createArrayBuffer(new Float32Array(this._lineThickness),1,this._lineThickness.length)}createLineStrokesBuffer(){let e=this._handler;e.gl.deleteBuffer(this._lineStrokesBuffer),this._lineStrokesBuffer=e.createArrayBuffer(new Float32Array(this._lineStrokes),1,this._lineStrokes.length)}createLineStrokeColorsBuffer(){let e=this._handler;e.gl.deleteBuffer(this._lineStrokeColorsBuffer),this._lineStrokeColorsBuffer=e.createArrayBuffer(new Float32Array(this._lineStrokeColors),4,this._lineStrokeColors.length/4)}}Ar.__counter__=0;class Er{constructor(e=2048){this._size=e,this._array=new Array(this._size),this._popIndex=Math.floor(.5*this._size),this._shiftIndex=this._popIndex,this.length=0}reset(){this._popIndex=Math.floor(.5*this._size),this._shiftIndex=this._popIndex,this.length=0}clear(){this._array.length=0,this._array=new Array(this._size),this._popIndex=Math.floor(.5*this._size),this._shiftIndex=this._popIndex,this.length=0}push(e){this.length++,this._array[this._popIndex++]=e}pop(){if(this.length){this.length--;let e=this._array[--this._popIndex];return this._array[this._popIndex]=null,this._array[this._popIndex-1]||(this._popIndex=Math.floor(.5*this._size),this._shiftIndex=this._popIndex),e}}unshift(e){this.length++,this._array[--this._shiftIndex]=e}shift(){if(this.length){this.length--;let e=this._array[this._shiftIndex];return this._array[this._shiftIndex++]=null,this._array[this._shiftIndex]||(this._popIndex=Math.floor(.5*this._size),this._shiftIndex=this._popIndex),e}}forEach(e){for(let t=this._shiftIndex;t<this._popIndex;t++)e(this._array[t])}}class Pr extends Ut{constructor(e,t={}){super(e,t),this.events=this.events.registerNames(Mr),this.isVector=!0,this._hasImageryTiles=!1,this.scaleByDistance=t.scaleByDistance||[n,n,n],this.pickingScale=t.pickingScale||1,this.async=void 0===t.async||t.async,this.clampToGround=t.clampToGround||!1,this.relativeToGround=t.relativeToGround||!1,this._nodeCapacity=t.nodeCapacity||30,this._entities=function(e){let t=[];for(let i=0;i<e.length;i++){let r=e[i];"Entity"===r.instanceName?t.push(r):t.push(new vi(r))}return t}(t.entities||[]),this._labelMaxLetters=t.labelMaxLetters||24,this._stripEntityCollection=new qi({pickingEnabled:this.pickingEnabled}),this._bindEventsDefault(this._stripEntityCollection),this._polylineEntityCollection=new qi({pickingEnabled:this.pickingEnabled}),this._bindEventsDefault(this._polylineEntityCollection),this._geoObjectEntityCollection=new qi({pickingEnabled:this.pickingEnabled}),this._bindEventsDefault(this._geoObjectEntityCollection),this._geometryHandler=new Ar(this),this._entityCollectionsTree=null,this._entityCollectionsTreeNorth=null,this._entityCollectionsTreeSouth=null,this._renderingNodes={},this._renderingNodesNorth={},this._renderingNodesSouth={},this._counter=0,this._deferredEntitiesPendingQueue=new Er,this._pendingsQueue=[],this.setEntities(this._entities),this.polygonOffsetUnits=null!=t.polygonOffsetUnits?t.polygonOffsetUnits:0,this.pickingEnabled=this._pickingEnabled,this._secondPASS=[]}get labelMaxLetters(){return this._labelMaxLetters}get instanceName(){return"Vector"}_bindPicking(){this._pickingColor.clear()}addTo(e){this._planet||(this._assignPlanet(e),this._geometryHandler.assignHandler(e.renderer.handler),this._polylineEntityCollection.addTo(e,!0),this._stripEntityCollection.addTo(e,!0),this._geoObjectEntityCollection.addTo(e,!0),this.setEntities(this._entities))}remove(){return super.remove(),this._polylineEntityCollection.remove(),this._stripEntityCollection.remove(),this._geoObjectEntityCollection.remove(),this}getEntities(){return[].concat(this._entities)}add(e,t=!1){return e._layer||e._entityCollection||(e._layer=this,e._layerIndex=this._entities.length,this._entities.push(e),this._proceedEntity(e,t)),this}insert(e,t,i=!1){if(!e._layer&&!e._entityCollection){e._layer=this,e._layerIndex=t,this._entities.splice(t,0,e);for(let e=t+1,i=this._entities.length;e<i;e++)this._entities[e]._layerIndex=e;this._proceedEntity(e,i)}return this}_proceedEntity(e,t=!1){let i=this._hasImageryTiles;e.strip&&this._stripEntityCollection.add(e),(e.polyline||e.ray)&&this._polylineEntityCollection.add(e),e.geoObject&&this._geoObjectEntityCollection.add(e),e.geometry&&(this._hasImageryTiles=!0,this._planet&&(this._planet.renderer.assignPickingColor(e),this._geometryHandler.add(e.geometry))),(e.billboard||e.label||e.geoObject)&&this._planet&&(e._cartesian.isZero()&&!e._lonLat.isZero()?e._setCartesian3vSilent(this._planet.ellipsoid.lonLatToCartesian(e._lonLat)):e._lonLat=this._planet.ellipsoid.cartesianToLonLat(e._cartesian),e._lonLat.lat>J?(this._entityCollectionsTreeNorth.__setLonLat__(e),this._entityCollectionsTreeNorth.insertEntity(e,t)):e._lonLat.lat<ee?(this._entityCollectionsTreeSouth.__setLonLat__(e),this._entityCollectionsTreeSouth.insertEntity(e,t)):(this._entityCollectionsTree.__setLonLat__(e),this._entityCollectionsTree.insertEntity(e,t))),this._planet&&this._hasImageryTiles!==i&&this._planet.updateVisibleLayers(),this.events.dispatch(this.events.entityadd,e)}addEntities(e,t=!1){let i=e.length;for(;i--;)this.add(e[i],t);return this}removeEntity(e){if(e._layer&&this.isEqual(e._layer)){if(this._entities.splice(e._layerIndex,1),this._reindexEntitiesArray(e._layerIndex),e._layer=null,e._layerIndex=-1,e._entityCollection){e._entityCollection._removeEntitySilent(e);let t=e._nodePtr;for(;t;)t.count--,t=t.parentNode;e._nodePtr&&0===e._nodePtr.count&&0===e._nodePtr.deferredEntities.length&&(e._nodePtr.entityCollection=null)}else if(e._nodePtr&&e._nodePtr.deferredEntities.length){let t=e._nodePtr.deferredEntities,i=t.length;for(;i--;)if(t[i].id===e.id){t.splice(i,1);let r=e._nodePtr;for(;r;)r.count--,r=r.parentNode;break}}e.geometry&&this._planet&&(this._geometryHandler.remove(e.geometry),this._planet.renderer.clearPickingColor(e)),e._nodePtr=void 0,this.events.dispatch(this.events.entityremove,e)}return this}set pickingEnabled(e){this._pickingEnabled=e,this._stripEntityCollection.setPickingEnabled(e),this._polylineEntityCollection.setPickingEnabled(e),this._geoObjectEntityCollection.setPickingEnabled(e),this._entityCollectionsTree&&this._entityCollectionsTree.traverseTree((t=>{t.entityCollection.setPickingEnabled(e)})),this._entityCollectionsTreeNorth&&this._entityCollectionsTreeNorth.traverseTree((t=>{t.entityCollection.setPickingEnabled(e)})),this._entityCollectionsTreeSouth&&this._entityCollectionsTreeSouth.traverseTree((t=>{t.entityCollection.setPickingEnabled(e)}))}_reindexEntitiesArray(e){const t=this._entities;for(let i=e;i<t.length;i++)t[i]._layerIndex=i}removeEntities(e){let t=e.length;for(;t--;)this.removeEntity(e[t]);return this}clear(){let e=new Array(this._entities.length);for(let t=0;t<e.length;t++)e[t]=this._entities[t];let t=this._entities.length;for(;t--;)this._entities[t].remove();this._entities.length=0,this._entities=[];for(let t=0;t<e.length;t++)this._entities[t]=e[t];this._entityCollectionsTree=null,this._entityCollectionsTreeNorth=null,this._entityCollectionsTreeSouth=null}each(e){let t=this._entities,i=t.length;for(;i--;)e(t[i],i)}setEntities(e){let t=new Array(e.length);for(let i=0,r=e.length;i<r;i++)t[i]=e[i];this.clear(),this._entities=new Array(t.length);let i=[];for(let e=0;e<t.length;e++){let r=t[e];r._layer=this,r._layerIndex=e,r.strip?this._stripEntityCollection.add(r):r.polyline||r.ray?this._polylineEntityCollection.add(r):r.geoObject?this._geoObjectEntityCollection.add(r):(r.billboard||r.label)&&i.push(r),r.geometry&&(this._hasImageryTiles=!0,this._planet&&(this._planet.renderer.assignPickingColor(r),this._geometryHandler.add(r.geometry))),this._entities[e]=r}return this._createEntityCollectionsTree(i),this}_createEntityCollectionsTree(e){if(this._planet){this._entityCollectionsTree=new Xi(this,0,null,0,ie.createFromArray([-20037508.34,-20037508.34,20037508.34,20037508.34]),this._planet,0),this._entityCollectionsTreeNorth=new $i(this,0,null,0,ie.createFromArray([-180,J,180,90]),this._planet,0),this._entityCollectionsTreeSouth=new $i(this,0,null,0,ie.createFromArray([-180,-90,180,ee]),this._planet,0);for(let t=0,i=e.length;t<i;t++){let i=e[t];i._lonLat.lat>J?this._entityCollectionsTreeNorth.__setLonLat__(i):i._lonLat.lat<ee?this._entityCollectionsTreeSouth.__setLonLat__(i):this._entityCollectionsTree.__setLonLat__(i)}this._entityCollectionsTree.buildTree(e),this._entityCollectionsTreeNorth.buildTree(e),this._entityCollectionsTreeSouth.buildTree(e)}}_bindEventsDefault(e){let t=this.events;e.events.on("entitymove",(function(e){t.dispatch(t.entitymove,e)})),e.events.on("mousemove",(function(e){t.dispatch(t.mousemove,e)})),e.events.on("mouseenter",(function(e){t.dispatch(t.mouseenter,e)})),e.events.on("mouseleave",(function(e){t.dispatch(t.mouseleave,e)})),e.events.on("lclick",(function(e){t.dispatch(t.lclick,e)})),e.events.on("rclick",(function(e){t.dispatch(t.rclick,e)})),e.events.on("mclick",(function(e){t.dispatch(t.mclick,e)})),e.events.on("ldblclick",(function(e){t.dispatch(t.ldblclick,e)})),e.events.on("rdblclick",(function(e){t.dispatch(t.rdblclick,e)})),e.events.on("mdblclick",(function(e){t.dispatch(t.mdblclick,e)})),e.events.on("lup",(function(e){t.dispatch(t.lup,e)})),e.events.on("rup",(function(e){t.dispatch(t.rup,e)})),e.events.on("mup",(function(e){t.dispatch(t.mup,e)})),e.events.on("ldown",(function(e){t.dispatch(t.ldown,e)})),e.events.on("rdown",(function(e){t.dispatch(t.rdown,e)})),e.events.on("mdown",(function(e){t.dispatch(t.mdown,e)})),e.events.on("lhold",(function(e){t.dispatch(t.lhold,e)})),e.events.on("rhold",(function(e){t.dispatch(t.rhold,e)})),e.events.on("mhold",(function(e){t.dispatch(t.mhold,e)})),e.events.on("mousewheel",(function(e){t.dispatch(t.mousewheel,e)})),e.events.on("touchmove",(function(e){t.dispatch(t.touchmove,e)})),e.events.on("touchstart",(function(e){t.dispatch(t.touchstart,e)})),e.events.on("touchend",(function(e){t.dispatch(t.touchend,e)})),e.events.on("doubletouch",(function(e){t.dispatch(t.doubletouch,e)})),e.events.on("touchleave",(function(e){t.dispatch(t.touchleave,e)})),e.events.on("touchenter",(function(e){t.dispatch(t.touchenter,e)}))}_collectStripCollectionPASS(e){let t=this._stripEntityCollection;t._fadingOpacity=this._fadingOpacity,t.scaleByDistance=this.scaleByDistance,t.pickingScale=this.pickingScale,t.polygonOffsetUnits=this.polygonOffsetUnits,e.push(t)}_collectPolylineCollectionPASS(e){let t=this._polylineEntityCollection;if(t._fadingOpacity=this._fadingOpacity,t.scaleByDistance=this.scaleByDistance,t.pickingScale=this.pickingScale,t.polygonOffsetUnits=this.polygonOffsetUnits,e.push(t),this.clampToGround||this.relativeToGround){let e=Number(this.relativeToGround);const i=this._planet._renderedNodes,r=this._planet.getViewExtent();let n=t._entities,s=n.length,a=new oe;for(;s--;){let t=n[s].polyline;if(t&&r.overlaps(t._extent)){let r=t._pathLonLatMerc,n=r.length;for(;n--;){let s=r[n].length;for(;s--;){let o=r[n][s],l=i.length;for(;l--;){let r=i[l].segment;if(r._extent.isInside(o)){let i=t._path3v[n][s];r.getTerrainPoint(i,o,a);let l=e&&t.altitude||0;if(l){let e=this._planet.ellipsoid.getSurfaceNormal3v(a);t.setPoint3v(a.addA(e.scale(l)),s,n,!0)}else t.setPoint3v(a,s,n,!0);break}}}}}}}}_collectGeoObjectCollectionPASS(e){let t=this._geoObjectEntityCollection;t._fadingOpacity=this._fadingOpacity,t.scaleByDistance=this.scaleByDistance,t.pickingScale=this.pickingScale,t.polygonOffsetUnits=this.polygonOffsetUnits,e.push(t)}collectVisibleCollections(e){let t=this._planet;if(this._fading&&this._fadingOpacity>0||this.minZoom<=t.maxCurrZoom&&this.maxZoom>=t.maxCurrZoom){this._renderingNodes={},this._renderingNodesNorth={},this._renderingNodesSouth={},this._collectStripCollectionPASS(e),this._collectPolylineCollectionPASS(e),this._collectGeoObjectCollectionPASS(e),this._secondPASS=[],this._entityCollectionsTree&&this._entityCollectionsTree.collectRenderCollectionsPASS1(t._visibleNodes,e);let i=this._secondPASS.length;for(;i--;)this._secondPASS[i].collectRenderCollectionsPASS2(t._visibleNodes,e,this._secondPASS[i].nodeId);for(this._secondPASS=[],this._entityCollectionsTreeNorth&&this._entityCollectionsTreeNorth.collectRenderCollectionsPASS1(t._visibleNodesNorth,e),i=this._secondPASS.length;i--;)this._secondPASS[i].collectRenderCollectionsPASS2(t._visibleNodesNorth,e,this._secondPASS[i].nodeId);for(this._secondPASS=[],this._entityCollectionsTreeSouth&&this._entityCollectionsTreeSouth.collectRenderCollectionsPASS1(t._visibleNodesSouth,e),i=this._secondPASS.length;i--;)this._secondPASS[i].collectRenderCollectionsPASS2(t._visibleNodesSouth,e,this._secondPASS[i].nodeId)}}_queueDeferredNode(e){this._visibility&&(e._inTheQueue=!0,this._counter>=1?this._deferredEntitiesPendingQueue.push(e):this._execDeferredNode(e))}_execDeferredNode(e){this._counter++,setTimeout((()=>{if(e.applyCollection(),this._counter--,this._deferredEntitiesPendingQueue.length&&this._counter<1)for(;this._deferredEntitiesPendingQueue.length;){let e=this._deferredEntitiesPendingQueue.pop();if(e._inTheQueue=!1,e.isVisible())return void this._execDeferredNode(e)}}),0)}loadMaterial(e){const t=e.segment;this._isBaseLayer?e.texture=t._isNorth?t.planet.solidTextureOne:t.planet.solidTextureTwo:e.texture=t.planet.transparentTexture,this._planet.layerLock.isFree()&&(e.isReady=!1,e.isLoading=!0,this._planet._vectorTileCreator.add(e))}abortMaterialLoading(e){e.isLoading=!1,e.isReady=!1}applyMaterial(e,t=!1){if(e.isReady)return[0,0,1,1];{!e.isLoading&&this.loadMaterial(e);const t=e.segment;let i=t.node,r=!1,n=this.__id,s=e;for(;i.parentNode;){if(s&&s.isReady){r=!0;break}i=i.parentNode,s=i.segment.materials[n]}if(r){e.appliedNodeId=i.nodeId,e.texture=s.texture,e.pickingMask=s.pickingMask;const r=1/(2<<t.tileZoom-i.segment.tileZoom-1);return[t.tileX*r-i.segment.tileX,t.tileY*r-i.segment.tileY,r,r]}return e.textureExists&&e._updateTexture?(e.texture=e._updateTexture,e.pickingMask=e._updatePickingMask):(e.texture=t.planet.transparentTexture,e.pickingMask=t.planet.transparentTexture),e.pickingReady=!0,[0,0,1,1]}}clearMaterial(e){if(e.isReady){const t=e.segment.handler.gl;e.isReady=!1,e.pickingReady=!1;let i=e.texture;e.texture=null,i&&!i.default&&t.deleteTexture(i),i=e.pickingMask,e.pickingMask=null,i&&!i.default&&t.deleteTexture(i),i=e._updateTexture,e._updateTexture=null,i&&!i.default&&t.deleteTexture(i),i=e._updatePickingMask,e._updatePickingMask=null,i&&!i.default&&t.deleteTexture(i)}this.abortMaterialLoading(e),e.isLoading=!1,e.textureExists=!1}update(){this._geometryHandler.update(),this.events.dispatch(this.events.draw,this)}}const Mr=["entitymove","draw","entityadd","entityremove"],Sr=["change","startpoint"],Br=bi.createCylinder(1,1,2,20,1,!0,!1,0,-.5,0),kr=200,Rr=.3,zr={scale:.5,instanced:!0,tag:"corners",color:"rgb(350, 350, 0)",object3d:Br},Ir={scale:.4,instanced:!0,tag:"centers",color:"rgb(0, 350, 50)",object3d:Br},Fr={thickness:3.5,color:"rgb(0, 350, 50)"};class Dr extends Ti{constructor(e){super(e.name),this._cornerDblClick=!1,this._onChange=e=>{if("Polygon"===e.geometryType){let t=this.getCoordinates(),i=new vi({geometry:{type:e.geometryType,coordinates:[t],style:{fillColor:"rgba(0,146,247,0.2)"}}});this._geometryLayer.clear(),this._geometryLayer.add(i)}},this._onCornerMouseEnter=e=>{e.renderer.handler.canvas.style.cursor="pointer",this.hideGhostPointer()},this._onCornerMouseLeave=e=>{e.renderer.handler.canvas.style.cursor="default",this.showGhostPointer()},this._onCenterMouseEnter=e=>{e.renderer.handler.canvas.style.cursor="pointer",this.hideGhostPointer()},this._onCenterMouseLeave=e=>{e.renderer.handler.canvas.style.cursor="default",this._pickedCenter||this._pickedCorner||this.showGhostPointer()},this._onLup=e=>{this._planet.renderer.controls.mouseNavigation.activate(),(this._pickedCorner||this._pickedCenter)&&(this.events.dispatch(this.events.change,this),this.setGhostPointerPosition(this._planet.getCartesianFromPixelTerrain(e)),this.showGhostPointer(),this._pickedCorner=null,this._pickedCenter=null)},this._onCornerLdown=e=>{this._pickedCorner=this._getLdown(e)},this._onCenterLdown=e=>{this._pickedCenter=this._getLdown(e)},this._onMouseMove=e=>{this._pickedCenter?this._moveCenterPoint():this._pickedCorner?this._moveCornerPoint(e.pos):this.setGhostPointerPosition(this._planet.getCartesianFromPixelTerrain(e.pos))},this._onCornerLdblclick=e=>{this._cornerDblClick=!0;let t=this.getCoordinates();t.splice(e.pickingObject.layerIndex,1),this.setCoordinates(t)},this._onMouseDblClick=e=>{if(this._cornerDblClick)return void(this._cornerDblClick=!1);if(!this._showGhostPointer)return;let t=this._planet.getCartesianFromPixelTerrain(e);t&&(this._addNew(t),!this._isStartPoint&&this._cornerLayer.getEntities().length>2&&(this._isStartPoint=!0,this.events.dispatch(this.events.startpoint,this)),this.events.dispatch(this.events.change,this))},this.events=Tt(Sr),this._planet=null,this._initCoordinates=e.coordinates||[],this._pickedCorner=null,this._pickedCenter=null,this._startPos=null,this._startClick=new le,this._geometryLayer=new Pr,this._cornerLayer=new Pr("corners",{pickingScale:3,pickingEnabled:!0,polygonOffsetUnits:-5,relativeToGround:!0,scaleByDistance:[100,4e6,1]}),this._centerLayer=new Pr("centers",{pickingScale:3,pickingEnabled:!0,polygonOffsetUnits:-5,relativeToGround:!0,scaleByDistance:[100,4e6,1]}),this._outlineLayer=new Pr("outline",{entities:[new vi({polyline:{path3v:[],isClosed:!1,...Fr}})],pickingEnabled:!1,polygonOffsetUnits:-5,relativeToGround:!0}),this._outlineLayer.getEntities()[0].polyline.altitude=Rr,this._ghostCorner=new vi({geoObject:zr}),this._ghostOutlineLayer=new Pr("ghost-pointer",{pickingEnabled:!1,polygonOffsetUnits:-5,relativeToGround:!0,scaleByDistance:[100,4e6,1],opacity:.5}),this._showGhostPointer=!1,this._isStartPoint=!1,this._insertCornerIndex=-1}get geometryType(){return"Polygon"}getCoordinates(){let e=this._cornerLayer.getEntities();return e.length>0?e.map((e=>{let t=e.getLonLat();return[t.lon,t.lat,t.height]})):this._initCoordinates}bindPlanet(e){this._planet=e}init(){this._initEvents(),this._initGhostLayerPointer(),this._initCoordinates.length&&this.setCoordinates(this._initCoordinates),this._planet.addLayer(this._outlineLayer),this._planet.addLayer(this._cornerLayer),this._planet.addLayer(this._centerLayer),this.showGhostPointer(),this.startNewPoint(),this._planet.renderer.controls.mouseNavigation.deactivateDoubleClickZoom(),this._geometryLayer.addTo(this._planet),this.events.on("change",this._onChange,this)}onremove(){this._clearEvents(),this.hideGhostPointer(),this.stopNewPoint(),this.clear(),this._geometryLayer.remove()}clear(){this._geometryLayer.clear();let e=this._cornerLayer.getEntities(),t=e.length;for(;t--;)e[t].remove();let i=this._centerLayer.getEntities();for(t=i.length;t--;)i[t].remove();let r=this._outlineLayer.getEntities();for(t=r.length;t--;)r[t].polyline.clear(),t>0&&r[t].remove();this._clearGhostPointer()}setCoordinates(e){this.clear();for(let t=0;t<e.length;t++){let i=e[t],r=this._planet.ellipsoid.lonLatToCartesian(new I(i[0],i[1],i[2]));this._appendCart(r)}this.events.dispatch(this.events.change,this)}stopNewPoint(){this.renderer&&this.renderer.events.off("ldblclick",this._onMouseDblClick)}startNewPoint(){this.renderer.events.on("ldblclick",this._onMouseDblClick,this)}showGhostPointer(){this._showGhostPointer=!0,this._planet.addLayer(this._ghostOutlineLayer),this._insertCornerIndex=this._cornerLayer.getEntities().length}hideGhostPointer(){this._showGhostPointer=!1,this._ghostOutlineLayer.remove(),this._insertCornerIndex=-1}setGhostPointerPosition(e){e&&(this._ghostCorner.setCartesian3v(e),this._updateGhostOutlinePointer(e))}_getLdown(e){this._planet.renderer.controls.mouseNavigation.deactivate(),this._startClick.set(e.x,e.y);let t=e.pickingObject.getCartesian();return this._startPos=this._planet.getPixelFromCartesian(t),e.pickingObject}_initEvents(){this._cornerLayer.events.on("ldblclick",this._onCornerLdblclick,this),this._cornerLayer.events.on("ldown",this._onCornerLdown,this),this._centerLayer.events.on("ldown",this._onCenterLdown,this),this.renderer.events.on("lup",this._onLup,this),this.renderer.events.on("mousemove",this._onMouseMove,this),this._cornerLayer.events.on("mouseenter",this._onCornerMouseEnter,this),this._cornerLayer.events.on("mouseleave",this._onCornerMouseLeave,this),this._centerLayer.events.on("mouseenter",this._onCenterMouseEnter,this),this._centerLayer.events.on("mouseleave",this._onCenterMouseLeave,this)}_clearEvents(){this._cornerLayer.events.off("ldblclick",this._onCornerLdblclick),this._cornerLayer.events.off("ldown",this._onCornerLdown),this._centerLayer.events.off("ldown",this._onCenterLdown),this.renderer.events.off("lup",this._onLup),this.renderer.events.off("mousemove",this._onMouseMove),this._cornerLayer.events.off("mouseenter",this._onCornerMouseEnter),this._cornerLayer.events.off("mouseleave",this._onCornerMouseLeave),this._centerLayer.events.off("mouseenter",this._onCenterMouseEnter),this._centerLayer.events.off("mouseleave",this._onCenterMouseLeave)}_drawCorners(){let e=this._cornerLayer.getEntities();for(let t=0;t<e.length;t++){let i=e[t];this._checkTerrainCollision(i)}}_drawCenters(){let e=this._centerLayer.getEntities();for(let t=0;t<e.length;t++){let i=e[t];this._checkTerrainCollision(i)}}_drawGhostCorner(){this._showGhostPointer&&this._checkTerrainCollision(this._ghostCorner)}frame(){this._drawCorners(),this._drawCenters(),this._drawGhostCorner()}_checkTerrainCollision(e){let t=new oe,i=this._planet._renderedNodes;for(let r=0;r<i.length;r++){let n=i[r].segment;if(n&&n._extentLonLat.isInside(e.getLonLat())){n.getEntityTerrainPoint(e,t),e.setCartesian3v(t);break}}}_moveCenterPoint(){let e=this.getCoordinates(),t=this._pickedCenter.layerIndex+1,i=this._pickedCenter.getLonLat(),r=[i.lon,i.lat,i.height];e.splice(t,0,r),this.setCoordinates(e),this._pickedCenter=null,this._pickedCorner=this._cornerLayer.getEntities()[t]}_addNew(e){if(-1===this._insertCornerIndex||this._cornerLayer.getEntities().length<2)this._appendCart(e);else{let t=this.getCoordinates(),i=this._insertCornerIndex,r=this._planet.ellipsoid.cartesianToLonLat(e),n=[r.lon,r.lat,r.height];t.splice(i,0,n),this.clear(),this.setCoordinates(t)}}_appendCart(e){let t=this._cornerLayer.getEntities(),i=t[t.length-1],r=new vi({geoObject:zr});if(r.setCartesian3v(e),r.addTo(this._cornerLayer),this._checkTerrainCollision(r),i){let e=t[0].getCartesian(),n=i.getCartesian(),s=r.getCartesian().sub(n),a=r.getCartesian().sub(e),o=s.length(),l=a.length();s.normalize(),a.normalize();let h=[],c=[];for(let t=0;t<=kr;t++){let i=s.scaleTo(t*o/kr).addA(n);h.push(i);let r=a.scaleTo(t*l/kr).addA(e);c.push(r)}this._outlineLayer.getEntities()[0].polyline.setPath3v([c]);let d=new vi({polyline:{path3v:[h],isClosed:!1,...Fr}});d.polyline.altitude=Rr,this._outlineLayer.add(d);let _=this._centerLayer.getEntities(),u=_[_.length-1],f=s.scaleTo(.5*o).addA(n),g=a.scaleTo(.5*l).addA(e),p=new vi({geoObject:Ir});p.setCartesian3v(f),p.addTo(this._centerLayer),this._checkTerrainCollision(p),u.remove(),u.addTo(this._centerLayer),u.setCartesian3v(g)}else{new vi({geoObject:Ir}).addTo(this._centerLayer)}}_clearGhostPointer(){const e=this._ghostOutlineLayer;e.getEntities()[0].polyline.clear(),e.getEntities()[1].polyline.clear()}_moveCornerPoint(e){let t=new le(e.x,e.y).sub(this._startClick),i=this._startPos.add(t),r=this._planet.getCartesianFromPixelTerrain(i);if(r){this._pickedCorner.setCartesian3v(r);let e=this._cornerLayer.getEntities();if(e.length){let t=this._pickedCorner.layerIndex,i=e.length,r=e[0===t?i-1:t-1].getCartesian(),n=e[(t+1)%i].getCartesian(),s=this._pickedCorner.getCartesian().sub(r),a=this._pickedCorner.getCartesian().sub(n),o=s.length(),l=a.length();s.normalize(),a.normalize();let h=[],c=[];for(let e=0;e<=kr;e++){let t=s.scaleTo(e*o/kr).addA(r);h.push(t);let i=a.scaleTo(e*l/kr).addA(n);c.push(i)}let d=this._outlineLayer.getEntities(),_=d[t].polyline,u=d[(t+1)%i].polyline;_?.setPath3v([h]),u?.setPath3v([c]);let f=this._centerLayer.getEntities(),g=f[0===t?i-1:t-1],p=f[t],m=s.scaleTo(.5*o).addA(r),v=a.scaleTo(.5*l).addA(n);g.setCartesian3v(m),this._checkTerrainCollision(g),p.setCartesian3v(v),this._checkTerrainCollision(p)}}}_updateGhostOutlinePointer(e){let t=this._cornerLayer.getEntities(),i=t.length;if(i>0){let r=0,n=s;for(let s=0;s<i;s++){let i=t[s].getCartesian().distance(e);i<n&&(n=i,r=s)}let a=t[r].getCartesian(),o=t[(r+1)%i].getCartesian(),l=t[0===r?i-1:r-1].getCartesian().sub(a).normalize(),h=o.sub(a).normalize(),c=e.sub(a).normalize(),d=l.add(h).normalize(),_=c.cross(d),u=l.cross(h);_.dot(u)>0&&(r--,r<0&&(r=i-1));let f=new oe;for(let s=0;s<i;s++){if(new ni(t[s].getCartesian(),t[(s+1)%i].getCartesian()).getNearestDistancePoint(e,f)){let t=f.distance(e);t<n&&(n=t,r=s)}}this._insertCornerIndex=(r+1)%i;let g=t[r%i].getCartesian(),p=t[(r+1)%i].getCartesian(),m=this._ghostCorner.getCartesian().sub(g),v=this._ghostCorner.getCartesian().sub(p),y=m.length(),x=v.length();m.normalize(),v.normalize();let b=[],w=[];for(let e=0;e<=kr;e++){let t=m.scaleTo(e*y/kr).addA(g);b.push(t);let i=v.scaleTo(e*x/kr).addA(p);w.push(i)}let T=this._ghostOutlineLayer.getEntities(),C=T[0].polyline,L=T[1].polyline;C?.setPath3v([b]),L?.setPath3v([w])}}_initGhostLayerPointer(){this._ghostOutlineLayer.setEntities([new vi({polyline:{path3v:[],isClosed:!1,...Fr}}),new vi({polyline:{path3v:[],isClosed:!1,...Fr}}),this._ghostCorner]);const e=this._ghostOutlineLayer;e.getEntities()[0].polyline.altitude=e.getEntities()[1].polyline.altitude=Rr}}class Nr extends Dr{constructor(e){super(e)}get geometryType(){return"LineString"}_addNew(e){this._appendCart(e)}_appendCart(e){let t=this._cornerLayer.getEntities(),i=t[t.length-1],r=new vi({geoObject:zr});if(r.setCartesian3v(e),r.addTo(this._cornerLayer),this._checkTerrainCollision(r),i){let e=i.getCartesian(),t=r.getCartesian().sub(e),n=t.length();t.normalize();let s=[];for(let i=0;i<=kr;i++){let r=t.scaleTo(i*n/kr).addA(e);s.push(r)}let a=new vi({polyline:{path3v:[s],isClosed:!1,...Fr}});a.polyline.altitude=Rr,this._outlineLayer.add(a);let o=t.scaleTo(.5*n).addA(e),l=new vi({geoObject:Ir});l.setCartesian3v(o),l.addTo(this._centerLayer),this._checkTerrainCollision(l)}}_clearGhostPointer(){this._ghostOutlineLayer.getEntities()[0].polyline.clear()}_moveCorner(e,t,i){let r=this._cornerLayer.getEntities();if(0==r.length)return;1==r.length&&(e=t=i=0);let n=r[e].getCartesian(),s=this._pickedCorner.getCartesian().sub(n),a=s.length();s.normalize();let o=[];for(let e=0;e<=kr;e++){let t=s.scaleTo(e*a/kr).addA(n);o.push(t)}let l=this._outlineLayer.getEntities()[t].polyline;l?.setPath3v([o]);let h=this._centerLayer.getEntities()[i];if(h){let e=s.scaleTo(.5*a).addA(n);h.setCartesian3v(e),this._checkTerrainCollision(h)}}_moveCornerPoint(e){let t=new le(e.x,e.y).sub(this._startClick),i=this._startPos.add(t),r=this._planet.getCartesianFromPixelTerrain(i);if(r){this._pickedCorner.setCartesian3v(r);let e=this._cornerLayer.getEntities();if(e.length){let t=this._pickedCorner.layerIndex;0===t?this._moveCorner(t+1,t+1,t):(t===e.length-1||this._moveCorner(t+1,t+1,t),this._moveCorner(t-1,t,t-1))}}}_updateGhostOutlinePointer(e){let t=this._cornerLayer.getEntities(),i=t.length;if(i>0){let e=i-1;this._insertCornerIndex=e;let r=t[e].getCartesian(),n=this._ghostCorner.getCartesian().sub(r),s=n.length();n.normalize();let a=[];for(let e=0;e<=kr;e++){let t=n.scaleTo(e*s/kr).addA(r);a.push(t)}this._ghostOutlineLayer.getEntities()[0].polyline.setPath3v([a])}}_initGhostLayerPointer(){this._ghostOutlineLayer.setEntities([new vi({polyline:{path3v:[],isClosed:!1,...Fr}}),this._ghostCorner]),this._ghostOutlineLayer.getEntities()[0].polyline.altitude=Rr}}class Hr extends Mt{constructor(e={}){super(e),this._drawingScene=new Nr({name:`drawingScene:${this.__id}`})}activatePolygonDrawing(){this.deactivate(),this._drawingScene=new Dr({name:`polygonDrawingScene:${this.__id}`}),this.activate()}activateLineStringDrawing(){this.deactivate(),this._drawingScene=new Nr({name:`linestringDrawingScene:${this.__id}`}),this.activate()}oninit(){}onactivate(){this.planet&&this._drawingScene.bindPlanet(this.planet),this.renderer&&this.renderer.addNode(this._drawingScene)}ondeactivate(){this.renderer&&this.renderer.removeNode(this._drawingScene)}}const Or={ell:0,msl:1,gnd:2},Vr=.3048,Ur=.001*Vr,Gr=["m","km","ft","s","h","m/s","km/h","ft/s"],Wr=[0,2,0,0,0,0,0,0];let jr=[];function Yr(e,t,i){return jr[e][t](i)}function qr(e,t,i,r,n){return e?Yr(t,i,r).toFixed(n||Wr[i]):"--"}function Zr(e){return Gr[e]}jr[0]=[],jr[0][0]=e=>e,jr[0][1]=e=>.001*e,jr[0][2]=e=>3.280839895013123*e,jr[2]=[],jr[2][0]=e=>e*Vr,jr[2][1]=e=>e*Ur,jr[2][2]=e=>e,jr[1]=[],jr[1][0]=e=>1e3*e,jr[1][1]=e=>e,jr[1][2]=e=>3280.839895013123*e,jr[5]=[],jr[5][5]=e=>e,jr[5][6]=e=>3.6*e,jr[5][7]=e=>3.28084*e,jr[6]=[],jr[6][5]=e=>.2777777777777778*e,jr[6][6]=e=>e;var Xr=Object.freeze({__proto__:null,ELL:0,GND:2,MSL:1,_tenth:Wr,convert:Yr,convertExt:qr,ft:2,fts:7,h:4,heightMode:Or,km:1,kmh:6,m:0,ms:5,s:3,toString:Zr});const $r=['<div class="og-lat-side"></div><div class="og-lat-val"></div>\n <div class="og-lon-side"></div><div class="og-lon-val"></div>\n <div class="og-height"></div>\n <div class="og-units-height"></div>','<div class="og-lat-side"></div><div class="og-lat-val"></div>\n <div class="og-lon-side"></div><div class="og-lon-val"></div>\n <div class="og-height"></div>\n <div class="og-units-height"></div>'];class Kr extends Mt{constructor(e={}){super(e),this._type=e.type||0,this._TYPE_FUNC=[this._SHOW_DECIMAL,this._SHOW_DEGREE],this._showFn=null,this._el=null,this._latSideEl=null,this._lonSideEl=null,this._latValEl=null,this._lonValEl=null,this._heightEl=null,this._altUnitVal=e.altitudeUnit||"m",this._heightModeVal=e.heightMode||"ell",this._altUnit=Xr[this._altUnitVal],this._heightMode=Or[this._heightModeVal],this._lonLat=null,this._centerMode=null==e.centerMode||e.centerMode}_SHOW_DECIMAL(e){if(e){let t=e.lat,i=e.lon;this._latSideEl.innerHTML=t>=0?"N":"S",this._lonSideEl.innerHTML=i>=0?"E":"W",this._latValEl.innerHTML=Math.abs(t).toFixed(5)+"°",this._lonValEl.innerHTML=Math.abs(i).toFixed(5)+"°"}}_SHOW_DEGREE(e){if(e){let t=e.lat,i=e.lon;this._latSideEl.innerHTML=t>=0?"N":"S",this._lonSideEl.innerHTML=i>=0?"E":"W";let r=0,n=t<0?Math.ceil(t):Math.floor(t),s=Math.floor(r=60*Math.abs(t-n)),a=Math.floor(6e3*(r-s))/100;this._latValEl.innerHTML=Math.abs(n)+"°"+s+"'"+a.toFixed(0)+'"',n=i<0?Math.ceil(i):Math.floor(i),s=Math.floor(r=60*Math.abs(i-n)),a=Math.floor(6e3*(r-s))/100,this._lonValEl.innerHTML=Math.abs(n)+"°"+s+"'"+a.toFixed(0)+'"'}}_createCenterEl(){let e=document.createElement("div");return e.className="og-center-icon",e.innerHTML='<svg width="12" height="12"><g><path stroke-width="1" stroke-opacity="1" d="M6 0L6 12M0 6L12 6" stroke="#337ab7"></path></g></svg>',e}_updateUnits(){this._heightMode=Or[this._heightModeVal],this._altUnit=Xr[this._altUnitVal],this._el.querySelector(".og-units-height").innerHTML=Zr(this._altUnit),this._showHeight()}_refreshCoordinates(){this._type>=this._TYPE_FUNC.length&&(this._type=0);let e=this._el;e.innerHTML=$r[this._type],this._latSideEl=e.querySelector(".og-lat-side"),this._lonSideEl=e.querySelector(".og-lon-side"),this._latValEl=e.querySelector(".og-lat-val"),this._lonValEl=e.querySelector(".og-lon-val"),this._heightEl=e.querySelector(".og-height"),this._showFn=this._TYPE_FUNC[this._type],this._showFn(this._lonLat)}oninit(){this._el=document.createElement("div"),this._el.classList.add("og-coordinates"),this.renderer.div.appendChild(this._el),this._el.addEventListener("click",(()=>{this._type++,this._refreshCoordinates(),this._updateUnits(),this._showHeight()})),this._centerMode?(this.renderer.div.appendChild(this._createCenterEl()),this.planet.camera.events.on("moveend",this._grabCoordinates,this),this.planet.camera.events.on("moveend",ze((()=>this._showHeight()),400,!0),this)):(this.renderer.events.on("mousemove",this._grabCoordinates,this),this.renderer.events.on("mousestop",ze((()=>this._showHeight()),400,!0),this)),this._refreshCoordinates(),this._updateUnits()}_grabCoordinates(e){let t,i=e.pos,r=this.renderer;t=this._centerMode?r.handler.getCenter():i,this._lonLat=this.planet.getLonLatFromPixelTerrain(t)||null,this._showFn(this._lonLat)}async _showHeight(){if(this._lonLat&&this.planet){let e=0;this._heightEl.style.opacity="0.7",this._heightMode===Or.ell?(e=await this.planet.getHeightAboveELL(this._lonLat),e=Number(qr(!0,0,this._altUnit,e))):this._heightMode===Or.msl&&(e=await this.planet.getHeightDefault(this._lonLat),e=Number(qr(!0,0,this._altUnit,e))),this._heightEl.style.opacity="1.0",this._heightEl.innerHTML=e.toString()}}}let Qr=class{constructor(){this.x=0,this.y=0,this.prev_x=0,this.prev_y=0,this.grabbedPoint=new oe,this.grabbedSpheroid=new bt}dX(){return this.x-this.prev_x}dY(){return this.y-this.prev_y}};class Jr extends Mt{constructor(e={}){super(e),this.grabbedPoint=new oe,this.grabbedDir=new oe,this.inertia=.007,this.grabbedSpheroid=new bt,this.planet=null,this._vRot=new ae,this._hRot=new ae,this._a=0,this.scaleRot=0,this.currState=0,this.positionState=[{h:17119745.303455353,max:.98,min:-.98},{h:6866011,max:.98,min:-.98},{h:3e6,max:.98,min:-.98},{h:1e6,max:.98,min:-.98},{h:5e5,max:.98,min:-.98}],this.touches=[new Qr,new Qr]}switchZoomState(e){this.stopRotation(),e>0?this.currState++:this.currState--,this.currState<=0&&(this.currState=0),this.currState>=this.positionState.length&&(this.currState=this.positionState.length-1),this.planet.stopFlying();const t=this.planet.camera._lonLat;this.planet.flyLonLat(new I(t.lon,t.lat,this.positionState[this.currState].h))}onMouseWheel(e){this.switchZoomState(e.wheelDelta)}oninit(){this.activate()}onactivate(){let e=this.renderer;e.events.on("mousewheel",this.onMouseWheel,this),e.events.on("lhold",this.onMouseLeftButtonDown,this),e.events.on("ldown",this.onMouseLeftButtonClick,this),e.events.on("lup",this.onMouseLeftButtonUp,this),e.events.on("touchstart",this.onTouchStart,this),e.events.on("touchend",this.onTouchEnd,this),e.events.on("touchmove",this.onTouchMove,this),e.events.on("draw",this.onDraw,this)}onTouchStart(e){if(1==e.sys.touches.length){const t=this.touches[0];t.x=e.sys.touches.item(0).pageX-e.sys.offsetLeft,t.y=e.sys.touches.item(0).pageY-e.sys.offsetTop,t.prev_x=e.sys.touches.item(0).pageX-e.sys.offsetLeft,t.prev_y=e.sys.touches.item(0).pageY-e.sys.offsetTop,t.grabbedPoint=this.planet.getCartesianFromPixelTerrain(new le(t.x,t.y))||null,t.grabbedPoint&&(t.grabbedSpheroid.radius=t.grabbedPoint.length(),this.stopRotation())}}onTouchEnd(e){0==e.sys.touches.length&&(this.scaleRot=1,Math.abs(this.touches[0].x-this.touches[0].prev_x)<3&&Math.abs(this.touches[0].y-this.touches[0].prev_y)<3&&this.stopRotation())}onTouchMove(e){if(1==e.sys.touches.length){let t=this.planet.camera,i=this.touches[0];if(i.prev_x=i.x,i.prev_y=i.y,i.x=e.sys.touches.item(0).pageX-e.sys.offsetLeft,i.y=e.sys.touches.item(0).pageY-e.sys.offsetTop,!i.grabbedPoint)return;let r=t.unproject(i.x,i.y),n=new ai(t.eye,r).hitSphere(i.grabbedSpheroid);if(n){this._a=Math.acos(i.grabbedPoint.y/i.grabbedSpheroid.radius)-Math.acos(n.y/i.grabbedSpheroid.radius),this._vRot=ae.axisAngleToQuat(t._u,this._a),this._hRot=ae.getRotationBetweenVectors(new oe(n.x,0,n.z).normal(),new oe(i.grabbedPoint.x,0,i.grabbedPoint.z).normal());let e=this._hRot.mul(this._vRot),r=this.positionState[this.currState],s=e.mulVec3(t.eye).normal().dot(oe.NORTH);(s>r.max||s<r.min)&&(e=ae.yRotation(e.getYaw())),t.set(e.mulVec3(t.eye),oe.ZERO,oe.NORTH),t.update()}}}onMouseLeftButtonClick(e){this.renderer.handler.canvas.classList.add("ogGrabbingPoiner"),this.grabbedPoint=this.planet.getCartesianFromMouseTerrain()||null,this.grabbedDir.copy(e.direction),this.grabbedPoint&&(this.grabbedSpheroid.radius=this.grabbedPoint.length(),this.stopRotation())}stopRotation(){this.scaleRot=0,this._a=0,this._vRot.clear(),this._hRot.clear()}onMouseLeftButtonUp(e){this.scaleRot=1,this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner"),Math.abs(e.x-e.prev_x)<3&&Math.abs(e.y-e.prev_y)<3&&this.stopRotation()}onMouseLeftButtonDown(e){let t=this.planet.camera;if(this.grabbedPoint&&!t.isFlying())if(this.renderer.events.mouseState.moving){let i=new ai(t.eye,e.direction).hitSphere(this.grabbedSpheroid);if(i){this._a=Math.acos(this.grabbedPoint.y/this.grabbedSpheroid.radius)-Math.acos(i.y/this.grabbedSpheroid.radius);let e=this._vRot=ae.axisAngleToQuat(t._u,this._a);t.set(e.mulVec3(t.eye),oe.ZERO,e.mulVec3(t.getUp())),this._hRot=ae.getRotationBetweenVectors(new oe(i.x,0,i.z).normal(),new oe(this.grabbedPoint.x,0,this.grabbedPoint.z).normal()),e=this._hRot,t.set(e.mulVec3(t.eye),oe.ZERO,e.mulVec3(t.getUp())),t.update()}}else this.scaleRot=0}onDraw(){let e=this.renderer,t=this.planet.camera;if(!e.events.mouseState.leftButtonDown&&this.scaleRot&&!t.isFlying())if(this.scaleRot-=this.inertia,this.scaleRot<=0)this.scaleRot=0;else{this._vRot=ae.axisAngleToQuat(t._u,this._a);let i=this._vRot.mul(this._hRot),r=i.mulVec3(t.eye).normal().dot(oe.NORTH),n=this.positionState[this.currState];(r>n.max||r<n.min)&&(i=ae.yRotation(i.getYaw())),e.controlsBag.scaleRot=this.scaleRot,i=i.slerp(ae.IDENTITY,1-this.scaleRot*this.scaleRot*this.scaleRot).normalize(),i.x||i.y||i.z||(this.scaleRot=0),t.set(i.mulVec3(t.eye),oe.ZERO,oe.NORTH),t.update()}}}const en=["loadend"];class tn extends Ut{constructor(e,t={}){super(e,t),this.events=this.events.registerNames(en),this._projType=0,this._frameWidth=256,this._frameHeight=256,this._sourceReady=!1,this._sourceTexture=null,this._materialTexture=null,this._gridBufferLow=null,this._gridBufferHigh=null,this._extentWgs84ParamsHigh=new Float32Array(4),this._extentWgs84ParamsLow=new Float32Array(4),this._extentMercParamsHigh=new Float32Array(4),this._extentMercParamsLow=new Float32Array(4),this._refreshFrame=!0,this._frameCreated=!1,this._sourceCreated=!1,this._animate=!1,this._ready=!1,this._creationProceeding=!1,this._isRendering=!1,this._extentWgs84=new ie,this._cornersWgs84=[],this._cornersMerc=[],this._isFullExtent=t.fullExtent?1:0,this.rendering=this._renderingProjType0.bind(this),this._onLoadend_=null,t.corners&&this.setCorners(t.corners)}get isIdle(){return super.isIdle&&this._ready}addTo(e){return this._onLoadend_=this._onLoadend.bind(this),this.events.on("loadend",this._onLoadend_,this),super.addTo(e)}_onLoadend(){this._planet&&this._planet.events.dispatch(this._planet.events.layerloadend,this)}remove(){return this.events.off("loadend",this._onLoadend_),this._onLoadend_=null,super.remove()}get instanceName(){return"BaseGeoImage"}getCornersLonLat(){let e=this._cornersWgs84;return[new I(e[0].lon,e[0].lat),new I(e[1].lon,e[1].lat),new I(e[2].lon,e[2].lat),new I(e[3].lon,e[3].lat)]}getCorners(){let e=this._cornersWgs84;return[[e[0].lon,e[0].lat],[e[1].lon,e[1].lat],[e[2].lon,e[2].lat],[e[3].lon,e[3].lat]]}setCorners(e){this.setCornersLonLat(I.join(e))}setCornersLonLat(e){this._refreshFrame=!0,this._cornersWgs84=[e[0].clone(),e[1].clone(),e[2].clone(),e[3].clone()];for(let e=0;e<this._cornersWgs84.length;e++)this._cornersWgs84[e].lat>=89.9&&(this._cornersWgs84[e].lat=89.9),this._cornersWgs84[e].lat<=-89.9&&(this._cornersWgs84[e].lat=-89.9);this._extent.setByCoordinates(this._cornersWgs84);let t=this._extent;t.southWest.lat>J||t.northEast.lat<ee?(this._projType=0,this.rendering=this._renderingProjType0):(this._projType=1,this.rendering=this._renderingProjType1),this._ready&&!this._creationProceeding&&this._planet._geoImageCreator.add(this)}_createFrame(){this._extentWgs84=this._extent.clone(),this._cornersMerc=[this._cornersWgs84[0].forwardMercatorEPS01(),this._cornersWgs84[1].forwardMercatorEPS01(),this._cornersWgs84[2].forwardMercatorEPS01(),this._cornersWgs84[3].forwardMercatorEPS01()],this._extentMerc=new ie(this._extentWgs84.southWest.forwardMercatorEPS01(),this._extentWgs84.northEast.forwardMercatorEPS01());let e=new Float32Array(2);if(0===this._projType?(Ki(this._extentWgs84.southWest.lon,e),this._extentWgs84ParamsHigh[0]=e[0],this._extentWgs84ParamsLow[0]=e[1],Ki(this._extentWgs84.southWest.lat,e),this._extentWgs84ParamsHigh[1]=e[0],this._extentWgs84ParamsLow[1]=e[1],this._extentWgs84ParamsHigh[2]=2/this._extentWgs84.getWidth(),this._extentWgs84ParamsHigh[3]=2/this._extentWgs84.getHeight()):(Ki(this._extentMerc.southWest.lon,e),this._extentMercParamsHigh[0]=e[0],this._extentMercParamsLow[0]=e[1],Ki(this._extentMerc.southWest.lat,e),this._extentMercParamsHigh[1]=e[0],this._extentMercParamsLow[1]=e[1],this._extentMercParamsHigh[2]=2/this._extentMerc.getWidth(),this._extentMercParamsHigh[3]=2/this._extentMerc.getHeight()),this._planet){let e=this._planet.renderer.handler;e.gl.deleteTexture(this._materialTexture),this._materialTexture=e.createEmptyTexture_l(this._frameWidth,this._frameHeight);let t=this._planet._geoImageCreator.createGridBuffer(this._cornersWgs84,1===this._projType);this._gridBufferHigh=t[0],this._gridBufferLow=t[1],this._refreshFrame=!1}}abortMaterialLoading(e){this._creationProceeding=!1,e.isLoading=!1,e.isReady=!1}clear(){let e=this._planet;if(e){let t=e.renderer.handler.gl;this._creationProceeding&&e._geoImageCreator.remove(this),e._clearLayerMaterial(this),t&&(t.deleteBuffer(this._gridBufferHigh),t.deleteBuffer(this._gridBufferLow),t.deleteTexture(this._sourceTexture),this._materialTexture&&!this._materialTexture.default&&t.deleteTexture(this._materialTexture))}this._sourceTexture=null,this._materialTexture=null,this._gridBufferHigh=null,this._gridBufferLow=null,this._refreshFrame=!0,this._sourceCreated=!1,this._ready=!1,this._creationProceeding=!1}setVisibility(e){e!==this._visibility&&(super.setVisibility(e),this._planet&&this._sourceReady&&(e?this._planet._geoImageCreator.add(this):this._planet._geoImageCreator.remove(this)))}clearMaterial(e){e.texture=null,e.isLoading=!1,e.isReady=!1}applyMaterial(e){let t,i,r=e.segment;this._ready?e.applyTexture(this._materialTexture):(e.texture=this._planet.transparentTexture,!this._creationProceeding&&this.loadMaterial(e)),0===this._projType?(t=this._extentWgs84,i=r._extent):(t=this._extentMerc,i=r.getExtentMerc());let n=t.northEast.lon-t.southWest.lon,s=t.northEast.lat-t.southWest.lat;return[(i.southWest.lon-t.southWest.lon)/n,(t.northEast.lat-i.northEast.lat)/s,(i.northEast.lon-i.southWest.lon)/n,(i.northEast.lat-i.southWest.lat)/s]}get getFrameWidth(){return this._frameWidth}get getFrameHeight(){return this._frameHeight}_createSourceTexture(){}_renderingProjType1(){let e=this._planet,t=e.renderer.handler,i=t.gl,r=e._geoImageCreator;this._refreshFrame&&this._createFrame(),this._createSourceTexture();let n=r._framebuffer;n.setSize(this._frameWidth,this._frameHeight),n.activate(),t.programs.geoImageTransform.activate();let s=t.programs.geoImageTransform._program,a=s.attributes,o=s.uniforms;i.disable(i.CULL_FACE),n.bindOutputTexture(this._materialTexture),i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT),i.uniform1i(o.isFullExtent,this._isFullExtent),i.bindBuffer(i.ARRAY_BUFFER,r._texCoordsBuffer),i.vertexAttribPointer(a.texCoords,2,i.UNSIGNED_SHORT,!0,0,0),i.bindBuffer(i.ARRAY_BUFFER,this._gridBufferHigh),i.vertexAttribPointer(a.cornersHigh,this._gridBufferHigh.itemSize,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,this._gridBufferLow),i.vertexAttribPointer(a.cornersLow,this._gridBufferLow.itemSize,i.FLOAT,!1,0,0),i.uniform4fv(o.extentParamsHigh,this._extentMercParamsHigh),i.uniform4fv(o.extentParamsLow,this._extentMercParamsLow),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,this._sourceTexture),i.uniform1i(o.sourceTexture,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,r._indexBuffer),i.drawElements(i.TRIANGLE_STRIP,r._indexBuffer.numItems,i.UNSIGNED_INT,0),n.deactivate(),i.enable(i.CULL_FACE),this._ready=!0,this._creationProceeding=!1}_renderingProjType0(){let e=this._planet,t=e.renderer.handler,i=t.gl,r=e._geoImageCreator;this._refreshFrame&&this._createFrame(),this._createSourceTexture();let n=r._framebuffer;n.setSize(this._frameWidth,this._frameHeight),n.activate(),t.programs.geoImageTransform.activate();let s=t.programs.geoImageTransform._program,a=s.attributes,o=s.uniforms;i.disable(i.CULL_FACE),n.bindOutputTexture(this._materialTexture),i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT),i.bindBuffer(i.ARRAY_BUFFER,r._texCoordsBuffer),i.vertexAttribPointer(a.texCoords,2,i.UNSIGNED_SHORT,!0,0,0),i.bindBuffer(i.ARRAY_BUFFER,this._gridBufferHigh),i.vertexAttribPointer(a.cornersHigh,this._gridBufferHigh.itemSize,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,this._gridBufferLow),i.vertexAttribPointer(a.cornersLow,this._gridBufferLow.itemSize,i.FLOAT,!1,0,0),i.uniform4fv(o.extentParamsHigh,this._extentWgs84ParamsHigh),i.uniform4fv(o.extentParamsLow,this._extentWgs84ParamsLow),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,this._sourceTexture),i.uniform1i(o.sourceTexture,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,r._indexBuffer),i.drawElements(i.TRIANGLE_STRIP,r._indexBuffer.numItems,i.UNSIGNED_INT,0),n.deactivate(),i.enable(i.CULL_FACE),this._ready=!0,this._creationProceeding=!1}}const rn={KEY_CTRL:17,KEY_ALT:18,KEY_SHIFT:16,KEY_SPACE:32,KEY_PGUP:33,KEY_PGDN:34,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_PRINTSCREEN:44,KEY_EQUALS:61,KEY_A:65,KEY_C:67,KEY_D:68,KEY_E:69,KEY_F:70,KEY_H:72,KEY_I:73,KEY_K:75,KEY_L:76,KEY_N:78,KEY_O:79,KEY_P:80,KEY_Q:81,KEY_R:82,KEY_S:83,KEY_V:86,KEY_W:87,KEY_X:88,KEY_Z:90,KEY_PLUS:107,KEY_F1:112,KEY_MINUS:173,KEY_APOSTROPHE:192,MB_LEFT:0,MB_RIGHT:2,MB_MIDDLE:1,KEY_BACK_SLASH:220,KEY_SINGLE_QUOTE:222};const nn=["change","idle","play","pause","stop"];const sn=["change"];class an extends At{constructor(e={}){super({template:ye('<div class="og-slider">\n <div class="og-slider-label">{label}</div>\n <div class="og-slider-panel">\n <div class="og-slider-progress"></div> \n <div class="og-slider-pointer"></div>\n </div>\n <input type="number"/>\n </div>',{label:e.label||""})}),this._onResize=()=>{this._setOffset(this._value*this.$panel.clientWidth/(this._max-this._min))},this._onMouseWheel=e=>{(e=e||window.event).preventDefault(),e.stopPropagation(),this.value=this._value+Math.sign(e.wheelDelta)*(this._max-this._min)/100},this._onMouseWheelFF=e=>{this._onMouseWheel(e)},this._onInput=e=>{(e=e||window.event).preventDefault(),e.stopPropagation(),this.value=parseFloat(e.target.value)},this._onMouseDown=e=>{(e=e||window.event).preventDefault(),this._startPosX=e.clientX,this.value=this._min+(this._max-this._min)*(e.offsetX/this.$panel.clientWidth),document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp)},this._onMouseMove=e=>{(e=e||window.event).preventDefault(),e.stopPropagation();let t=this.$panel.getBoundingClientRect(),i=p(e.clientX,t.left,t.right),r=this._startPosX-i;this._startPosX=i,this.value=(this.$pointer.offsetLeft-r)*(this._max-this._min)/this.$panel.clientWidth},this._onMouseUp=()=>{document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("mousemove",this._onMouseMove)},this.events=this.events.registerNames(sn),this._value=e.value||0,this._min=e.min||0,this._max=e.max||1,this._resizeObserver=new ResizeObserver(this._onResize),this._startPosX=0,this.$label=null,this.$pointer=null,this.$progress=null,this.$input=null,this.$panel=null}render(e){return super.render(e),this.$label=this.select(".og-slider-label"),""===this.$label.innerHTML&&(this.$label.style.display="none"),this.$pointer=this.select(".og-slider-pointer"),this.$progress=this.select(".og-slider-progress"),this.$panel=this.select(".og-slider-panel"),this.$input=this.select("input"),this._resizeObserver.observe(this.el),this._initEvents(),this}set value(e){e!==this._value&&(this._value=p(e,this._min,this._max),this.$input.value=this._value.toString(),this._setOffset(this._value*this.$panel.clientWidth/(this._max-this._min)),this.events.dispatch(this.events.change,this._value,this))}get value(){return this._value}_initEvents(){this.$panel.addEventListener("mousedown",this._onMouseDown),this.$panel.addEventListener("mousewheel",this._onMouseWheel),this.$panel.addEventListener("wheel",this._onMouseWheelFF),this.$input.addEventListener("input",this._onInput)}_clearEvents(){this.$panel.removeEventListener("mousedown",this._onMouseDown),this.$panel.removeEventListener("mousewheel",this._onMouseWheel),this.$panel.removeEventListener("wheel",this._onMouseWheelFF),this.$input.removeEventListener("input",this._onInput)}_setOffset(e){e>=0&&e<=this.$panel.clientWidth&&(this.$pointer.style.left=this.$progress.style.width=100*e/this.$panel.clientWidth+"%")}remove(){this._clearEvents(),super.remove()}}class on{constructor(){this._lock=0}lock(e){this._lock|=1<<e.id}free(e){this._lock&=~(1<<e.id)}isFree(){return 0===this._lock}isLocked(){return 0!==this._lock}}class ln{constructor(){this.__id=ln.__counter__++}get id(){return this.__id}}ln.__counter__=0;class hn extends Mt{constructor(e={}){super(e),this._deactivate=!1,this._shiftBusy=!1,this._name="mouseNavigation",this.grabbedPoint=new oe,this._eye0=new oe,this.pointOnEarth=new oe,this.earthUp=new oe,this.inertia=.007,this.grabbedSpheroid=new bt,this.qRot=new ae,this.scaleRot=0,this.distDiff=.3,this.stepsCount=8,this.stepsForward=null,this.stepIndex=0,this._lmbDoubleClickActive=!0,this.minSlope=e.minSlope||.1,this._wheelDirection=1,this._keyLock=new ln}static getMovePointsFromPixelTerrain(e,t,i,r,n,s,a){const o=[];let l=e.eye.clone(),h=e._b.clone(),c=e._r.clone(),d=e._u.clone(),_=t.getCartesianFromPixelTerrain(n);if(_||(_=t.getCartesianFromPixelTerrain(t.renderer.handler.getCenter())),_){a||(a=oe.sub(_,e.eye).normalize());let t=r*e.eye.distance(_)/i;t*=s?-1.25:2;const n=h.scaleTo(t);if(a.dot(e.eye.normal().negate())>=.1){const t=new bt;t.radius=_.length();let r=[],s=[],u=!1;for(let e=0;e<i;e++){l.addA(n);const i=new ai(l,a).hitSphere(t);if(s[e]=l.clone(),!i){u=!0;break}r[e]=(new se).rotateBetweenVectors(_.normal(),i.normal())}if(u){l=e.eye.clone();for(let e=0;e<i;e++)o[e]={eye:l.addA(n).clone(),v:d,u:c,n:h}}else for(let e=0;e<i;e++){let t=r[e];o[e]={eye:t.mulVec3(s[e]),v:t.mulVec3(d),u:t.mulVec3(c),n:t.mulVec3(h)}}}else for(let e=0;e<i;e++)o[e]={eye:l.addA(a.scaleTo(-t)).clone(),v:d,u:c,n:h};return o}}onactivate(){this.renderer&&(this.renderer.events.on("mousewheel",this.onMouseWheel,this),this.renderer.events.on("lhold",this.onMouseLeftButtonDown,this),this.renderer.events.on("rhold",this.onMouseRightButtonDown,this),this.renderer.events.on("ldown",this.onMouseLeftButtonClick,this),this.renderer.events.on("lup",this.onMouseLeftButtonUp,this),this.renderer.events.on("rdown",this.onMouseRightButtonClick,this),this.renderer.events.on("draw",this.onDraw,this,-1e3),this.renderer.events.on("mousemove",this.onMouseMove,this),this.renderer.events.on("mouseleave",this.onMouseLeave,this),this.renderer.events.on("mouseenter",this.onMouseEnter,this),this._lmbDoubleClickActive&&this.renderer.events.on("ldblclick",this.onMouseLeftButtonDoubleClick,this))}ondeactivate(){this.renderer&&(this.renderer.events.off("mousewheel",this.onMouseWheel),this.renderer.events.off("lhold",this.onMouseLeftButtonDown),this.renderer.events.off("rhold",this.onMouseRightButtonDown),this.renderer.events.off("ldown",this.onMouseLeftButtonClick),this.renderer.events.off("lup",this.onMouseLeftButtonUp),this.renderer.events.off("rdown",this.onMouseRightButtonClick),this.renderer.events.off("draw",this.onDraw),this.renderer.events.off("ldblclick",this.onMouseLeftButtonDoubleClick),this.renderer.events.off("mouseleave",this.onMouseLeave),this.renderer.events.off("mouseenter",this.onMouseEnter))}activateDoubleClickZoom(){this._lmbDoubleClickActive||(this._lmbDoubleClickActive=!0,this.renderer&&this.renderer.events.on("ldblclick",this.onMouseLeftButtonDoubleClick,this))}deactivateDoubleClickZoom(){this._lmbDoubleClickActive&&(this._lmbDoubleClickActive=!1,this.renderer&&this.renderer.events.off("ldblclick",this.onMouseLeftButtonDoubleClick))}onMouseEnter(e){const t=this.renderer.events;t.isKeyPressed(rn.KEY_ALT)&&t.releaseKeys(),t.updateButtonsStates(e.sys.buttons),t.mouseState.leftButtonDown?this.renderer.handler.canvas.classList.add("ogGrabbingPoiner"):this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner")}onMouseLeave(){this.renderer.events.mouseState.leftButtonDown&&(this.scaleRot=0),this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner")}onMouseWheel(e){this.stepIndex||(this.planet.stopFlying(),this.stopRotation(),this._deactivate=!0,this.planet.layerLock.lock(this._keyLock),this.planet._normalMapCreator.lock(this._keyLock),this.stepsForward=hn.getMovePointsFromPixelTerrain(this.planet.camera,this.planet,this.stepsCount,this.distDiff,e.pos,e.wheelDelta>0,e.direction)||null,this._wheelDirection=e.wheelDelta,this.stepsForward&&(this.stepIndex=this.stepsCount))}oninit(){this.activate(),this.renderer&&(this.renderer.events.on("keyfree",rn.KEY_ALT,this.onShiftFree,this),this.renderer.events.on("keyfree",rn.KEY_PRINTSCREEN,this.onShiftFree,this))}onMouseLeftButtonDoubleClick(e){this.planet.stopFlying(),this.stopRotation();const t=this.planet.getCartesianFromPixelTerrain(e.pos);if(t){const e=this.planet.camera;let i=e.maxAltitude+this.planet.ellipsoid.polarSize,r=e.minAltitude+this.planet.ellipsoid.polarSize;const n=e.eye.length(),s=this.planet.ellipsoid.cartesianToLonLat(t);if(n>i||n<r)return void this.planet.flyLonLat(new I(s.lon,s.lat));this.renderer.events.isKeyPressed(rn.KEY_ALT)?this.planet.flyLonLat(new I(s.lon,s.lat,2*e.eye.distance(t))):this.planet.flyLonLat(new I(s.lon,s.lat,.57*e.eye.distance(t)))}}onMouseLeftButtonClick(){this._active&&(this.renderer.handler.canvas.classList.add("ogGrabbingPoiner"),this.grabbedPoint=this.planet.getCartesianFromMouseTerrain(),this.grabbedPoint&&(this._eye0.copy(this.planet.camera.eye),this.grabbedSpheroid.radius=this.grabbedPoint.length(),this.stopRotation()))}stopRotation(){this.qRot.clear(),this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock)}onMouseLeftButtonUp(e){this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner"),e.x===e.prev_x&&e.y===e.prev_y&&(this.scaleRot=0)}onMouseLeftButtonDown(e){if(this._active){if(!this.grabbedPoint)return;if(this.planet.stopFlying(),e.moving){let t=this.planet.camera;if(t.slope>.2){const i=new ai(t.eye,e.direction).hitSphere(this.grabbedSpheroid);if(i){this.scaleRot=1,this.qRot=ae.getRotationBetweenVectors(i.normal(),this.grabbedPoint.normal());let e=this.qRot;t.eye=e.mulVec3(t.eye),t._u=e.mulVec3(t._u),t._r=e.mulVec3(t._r),t._b=e.mulVec3(t._b)}}else{let i=this.grabbedPoint,r=oe.add(i,t._r),n=oe.add(i,i.normal()),s=new oe;new ai(t.eye,e.direction).hitPlane(i,r,n,s)===ai.INSIDE&&(t.eye=this._eye0.addA(s.subA(i).negate()))}}}}onMouseRightButtonClick(e){this.stopRotation(),this.planet.stopFlying(),this.pointOnEarth=this.planet.getCartesianFromPixelTerrain(e.pos),this.pointOnEarth&&(this.earthUp=this.pointOnEarth.normal())}onMouseRightButtonDown(e){const t=this.planet.camera;if(this.pointOnEarth&&e.moving){this.renderer.controlsBag.scaleRot=1;let i=.5/t.eye.distance(this.pointOnEarth)*(t._lonLat.height<5?5:t._lonLat.height)*o;i>.007&&(i=.007),t.rotateHorizontal(i*(e.x-e.prev_x),!1,this.pointOnEarth,this.earthUp),t.rotateVertical(i*(e.y-e.prev_y),this.pointOnEarth,this.minSlope)}}onShiftFree(){this._shiftBusy=!1}onMouseMove(e){this._active&&this.renderer.events.isKeyPressed(rn.KEY_ALT)&&(this._shiftBusy||(this._shiftBusy=!0,this.onMouseRightButtonClick(e)),this.onMouseRightButtonDown(e))}onDraw(){if(this._active){const e=this.renderer,t=this.planet.camera;let i=t.eye.clone();if(this.stepIndex){e.controlsBag.scaleRot=1;const i=this.stepsForward[this.stepsCount-this.stepIndex--];let r=t.maxAltitude+this.planet.ellipsoid.polarSize,n=t.minAltitude+this.planet.ellipsoid.polarSize;const s=i.eye.length();if(s>r||s<n&&this._wheelDirection>0)return void(this._wheelDirection=1);t.eye=i.eye,t._u=i.v,t._r=i.u,t._b=i.n}else this._deactivate&&(this._deactivate=!1,this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock));if(e.events.mouseState.leftButtonDown||!this.scaleRot)return;if(this.scaleRot-=this.inertia,this.scaleRot<=0)this.scaleRot=0;else{e.controlsBag.scaleRot=this.scaleRot;let i=this.qRot.slerp(ae.IDENTITY,1-this.scaleRot*this.scaleRot*this.scaleRot).normalize();i.x||i.y||i.z||(this.scaleRot=0),t.eye=i.mulVec3(t.eye),t._u=i.mulVec3(t._u),t._r=i.mulVec3(t._r),t._b=i.mulVec3(t._b)}t.eye.distance(i)/t.getAltitude()>.01?(this.planet.layerLock.lock(this._keyLock),this.planet.terrainLock.lock(this._keyLock),this.planet._normalMapCreator.lock(this._keyLock)):(this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock))}}}const cn=e=>e>1e3?`${(e/1e3).toFixed(1)} km`:e>9?`${Math.round(e)} m`:`${e.toFixed(1)} m`;let dn=bi.createCylinder(1.1,0,2.7,20,1,!0,!1,0,0,0);const _n={text:"",size:11,color:"rgba(455,455,455,1.0)",outlineColor:"rgba(0,0,0,0.34)",outline:.23,align:"center",offset:[0,20,0]},un={scale:1,instanced:!0,tag:"ruler",color:"rgb(0,305,0)",object3d:dn};class fn extends Ti{constructor(e={}){super(e.name),this._onCornerLdown=e=>{if(!this._startLonLat){this.renderer?.controls.mouseNavigation?.deactivate(),this._startClick.set(e.x,e.y);let t=e.pickingObject.getCartesian();this._startPos=this._planet.getPixelFromCartesian(t),this._pickedCorner=e.pickingObject,"start"==e.pickingObject.properties.name?this._anchorLonLat=this._cornerEntity[1].getLonLat().clone():this._anchorLonLat=this._cornerEntity[0].getLonLat().clone()}},this._onLUp=()=>{this._pickedCorner&&(this.renderer.controls.mouseNavigation?.activate(),this._pickedCorner=null,this._anchorLonLat=null)},this._onCornerLup=()=>{this._onLUp()},this._onCornerEnter=e=>{e.renderer.handler.canvas.style.cursor="pointer"},this._onCornerLeave=e=>{e.renderer.handler.canvas.style.cursor="default"},this._onLdblclick=()=>{this._preventClick=!0},this._onLclick=e=>{let t=this._planet.getLonLatFromPixelTerrain(e.pos);t&&(this._timeout=setTimeout((()=>{this._preventClick||(this._startLonLat?this._startLonLat=null:(this.setVisibility(!0),this._stopDrawing=!1,this._startLonLat=t)),this._preventClick=!1,this._stopDrawing=!1,clearTimeout(this._timeout)}),200),this._startLonLat&&(this._stopDrawing=!0))},this._onMouseMove=e=>{if(this._startLonLat&&!this._stopDrawing){this._propsLabel.label.setVisibility(!0);let t=this._planet.getLonLatFromPixelTerrain(e.pos);if(!t)return;this._drawLine(this._startLonLat,t)}else if(this._pickedCorner){let t=this._planet.getLonLatFromPixelTerrain(e.pos);t&&("start"===this._pickedCorner.properties.name?this._drawLine(t,this._anchorLonLat):this._drawLine(this._anchorLonLat,t))}},this.events=Tt(gn),this._ignoreTerrain=null==e.ignoreTerrain||e.ignoreTerrain,this._planet=e.planet||null,this._startLonLat=null,this._preventClick=!1,this._stopDrawing=!1,this._pickedCorner=null,this._startPos=null,this._startClick=new le,this._anchorLonLat=null,this._heading=0,this._trackLayer=new Pr("track",{entities:[],pickingEnabled:!1,polygonOffsetUnits:-1,relativeToGround:!0,displayInLayerSwitcher:!1}),this._labelLayer=new Pr("ruler-label",{entities:[],pickingEnabled:!1,polygonOffsetUnits:-100,relativeToGround:!0,displayInLayerSwitcher:!1}),this._cornersLayer=new Pr("corners",{entities:[],pickingEnabled:!0,displayInLayerSwitcher:!1,scaleByDistance:[100,4e6,1],pickingScale:2}),this._propsLabel=new vi({name:"propsLabel",label:_n}),this._trackEntity=new vi({polyline:{path3v:[],thickness:4.8,color:"rgb(255,131,0)",isClosed:!1}}),this._trackEntity.polyline.altitude=.01,this._cornerEntity=[new vi({geoObject:un,properties:{name:"start"}}),new vi({geoObject:un,properties:{name:"end"}})]}set ignoreTerrain(e){this._ignoreTerrain=e}bindPlanet(e){this._planet=e}_createCorners(){this._cornersLayer.addEntities(this._cornerEntity)}init(){this._createCorners(),this._trackLayer.addEntities([this._trackEntity]),this._labelLayer.addEntities([this._propsLabel]),this._planet.addLayer(this._labelLayer),this._planet.addLayer(this._trackLayer),this._planet.addLayer(this._cornersLayer),this._activate()}onremove(){this._deactivate()}_activate(){this._propsLabel.label.setVisibility(!1),this.setVisibility(!1),this.renderer.events.on("lclick",this._onLclick,this),this.renderer.events.on("mousemove",this._onMouseMove,this),this.renderer.events.on("ldblclick",this._onLdblclick,this),this.renderer.events.on("lup",this._onLUp,this),this._cornersLayer.events.on("mouseenter",this._onCornerEnter,this),this._cornersLayer.events.on("mouseleave",this._onCornerLeave,this),this._cornersLayer.events.on("ldown",this._onCornerLdown,this),this._cornersLayer.events.on("lup",this._onCornerLup,this)}_deactivate(){this._startLonLat=null,this._preventClick=!1,this._stopDrawing=!1,this._pickedCorner=null,this.renderer.events.off("lclick",this._onLclick),this.renderer.events.off("mousemove",this._onMouseMove),this.renderer.events.off("lup",this._onLUp),this._cornersLayer.events.off("mouseenter",this._onCornerEnter),this._cornersLayer.events.off("mouseleave",this._onCornerLeave),this._cornersLayer.events.off("ldown",this._onCornerLdown),this._cornersLayer.events.off("lup",this._onCornerLup),this.clear()}setVisibility(e){this._cornersLayer.setVisibility(e),this._trackLayer.setVisibility(e),this._labelLayer.setVisibility(e)}_drawLine(e,t,i){i||(i=this._planet.ellipsoid.lonLatToCartesian(e));let r=this._planet.ellipsoid.lonLatToCartesian(t),n=this._planet.ellipsoid.inverse(e,t),s=n.distance;this._heading=n.initialAzimuth;let a=[],o=r.sub(i),l=o.length();o.normalize();for(let e=0;e<120;e++){let t=o.scaleTo(e*l/120).addA(i);a.push(t)}a.push(r),this._trackEntity.polyline.setPath3v([a]),this._ignoreTerrain&&(this._propsLabel.setCartesian3v(a[Math.floor(a.length/2)]),this._propsLabel.label.setText(`${cn(s)}, ${Math.round(this._heading)} deg`))}clear(){this._trackEntity.remove(),this._cornerEntity[0].remove(),this._cornerEntity[1].remove(),this._propsLabel.remove(),this._planet.removeLayer(this._trackLayer),this._planet.removeLayer(this._cornersLayer)}isCornersPositionChanged(){let e=this._trackEntity.polyline.getPath3v()[0];if(e){const t=e[0].clone(),i=e[e.length-1].clone();return this._cornerEntity[0].getCartesian().equal(t)&&this._cornerEntity[1].getCartesian().equal(i)}return!1}frame(){let e=this._trackEntity.polyline.getPath3v()[0];if(e){const t=e[0].clone(),i=e[e.length-1].clone();if(!this.isCornersPositionChanged()&&(this._cornerEntity[0].setCartesian3v(t),this._cornerEntity[1].setCartesian3v(i),!this._ignoreTerrain)){let t=0;for(let i=0,r=e.length-1;i<r;i++)t+=e[i+1].distance(e[i]);this._propsLabel.setCartesian3v(e[Math.floor(e.length/2)]),this._propsLabel.label.setText(`${cn(t)}, ${Math.round(this._heading)} deg`)}}}get ellipsoid(){return this._planet?this._planet.ellipsoid:null}}const gn=["add","remove","mousemove","mouseenter","mouseleave","lclick","rclick","mclick","ldblclick","rdblclick","mdblclick","lup","rup","mup","ldown","rdown","mdown","lhold","rhold","mhold","mousewheel","touchmove","touchstart","touchend","doubletouch","touchleave","touchenter"];class pn extends Mt{constructor(e={}){super(e),this._rulerScene=new fn({name:`rulerScene:${this.__id}`,ignoreTerrain:e.ignoreTerrain})}set ignoreTerrain(e){this._rulerScene.ignoreTerrain=e}oninit(){this._rulerScene.bindPlanet(this.planet)}onactivate(){this.renderer&&this.renderer.addNode(this._rulerScene)}ondeactivate(){this.renderer&&this.renderer.removeNode(this._rulerScene)}}let mn=bi.createCylinder(1.1,0,2,6,1,!0,!0,0,0,0);const vn={startColor:"rgb(255,131,0)",endColor:"rgb(255,131,0)",thickness:5},yn={text:"",size:11,color:"rgba(455,455,455,1.0)",outlineColor:"rgba(0,0,0,0.34)",outline:.23,align:"center",offset:[0,18,0]},xn={scale:1,instanced:!0,tag:"height-ruler",color:"rgb(255,131,0)",object3d:mn};class bn extends fn{constructor(e={}){super(e),this._geoRulerLayer=new Pr("rayHeightRuler",{entities:[],pickingEnabled:!1,polygonOffsetUnits:-2,relativeToGround:!1,displayInLayerSwitcher:!1}),this._rayV=new vi({name:"verticalRay",ray:vn}),this._rayH=new vi({name:"heightRay",ray:vn}),this._heightLabels=[new vi({name:"startCornerLabel",label:{...yn}}),new vi({name:"endCornerLabel",label:{...yn}}),new vi({name:"deltaLabel",label:{...yn}})]}setVisibility(e){super.setVisibility(e),this._geoRulerLayer.setVisibility(e)}get deltaLabel(){return this._heightLabels[2]}get startLabel(){return this._heightLabels[0]}get endLabel(){return this._heightLabels[1]}get corners(){return this._cornerEntity}get startCorner(){return this.corners[0]}get endCorner(){return this.corners[1]}get startCornerLonLat(){return this.startCorner.getLonLat()}get startCornerHeight(){return this.startCornerLonLat.height}get endCornerLonLat(){return this.endCorner.getLonLat()}get endCornerHeight(){return this.endCornerLonLat.height}get maxHeightCornerLonLat(){return this.startCornerHeight<=this.endCornerHeight?this.endCornerLonLat:this.startCornerLonLat}get minHeightCornerLonLat(){return this.startCornerHeight>this.endCornerHeight?this.endCornerLonLat:this.startCornerLonLat}get deltaHeight(){return Math.abs(this.startCornerHeight-this.endCornerHeight)}_drawLine(e,t,i){super._drawLine(e,t,i),this._updateHeightRaysAndLabels()}async _updateHeightRaysAndLabels(){const e=this.minHeightCornerLonLat.clone();e.height=this.maxHeightCornerLonLat.height,this._rayH.ray.setStartPosition3v(this._planet.ellipsoid.lonLatToCartesian(this.maxHeightCornerLonLat)),this._rayH.ray.setEndPosition3v(this._planet.ellipsoid.lonLatToCartesian(e)),this._rayV.ray.setStartPosition3v(this._planet.ellipsoid.lonLatToCartesian(this.minHeightCornerLonLat)),this._rayV.ray.setEndPosition3v(this._planet.ellipsoid.lonLatToCartesian(e)),e.height=this.minHeightCornerLonLat.height+this.deltaHeight/2,this.deltaLabel.setLonLat(e),this.startLabel.setLonLat(this.startCornerLonLat),this.endLabel.setLonLat(this.endCornerLonLat);const t=await this._planet.getHeightDefault(this.startCornerLonLat),i=await this._planet.getHeightDefault(this.endCornerLonLat);this.deltaLabel.label.setText(`Δ ${Math.abs(t-i).toFixed(1)} m`),this.startLabel.label.setText(`P1 ${t.toFixed(1)} m`),this.endLabel.label.setText(`P2 ${i.toFixed(1)} m`)}clear(){this._rayH.remove(),this._rayV.remove(),this.startCorner.remove(),this.endCorner.remove(),this.startLabel.remove(),this.endLabel.remove(),this.deltaLabel.remove(),super.clear(),this._planet.removeLayer(this._geoRulerLayer)}_createCorners(){this._cornerEntity=[new vi({geoObject:xn,properties:{name:"start"}}),new vi({geoObject:xn,properties:{name:"end"}})],this._cornersLayer.setEntities(this._cornerEntity)}init(){super.init(),this._createCorners(),this._labelLayer.addEntities(this._heightLabels),this._geoRulerLayer.addEntities([this._rayH,this._rayV]),this._planet.addLayer(this._geoRulerLayer)}frame(){super.frame(),this._updateHeightRaysAndLabels()}}class wn extends pn{constructor(e={}){super(e),this._rulerScene=new bn({name:`heightRulerScene:${this.__id}`,ignoreTerrain:!1})}}const Tn=[1,2,3,5,10,20,30,50,100,200,300,500,1e3,2e3,3e3,5e3,1e4,2e4,3e4,5e4,1e5,2e5,3e5,5e5,1e6,2e6,3e6,5e6,1e7];class Cn extends Mt{constructor(e={}){e.name&&""!==e.name||(e.name="scaleControl"),super(e),this._template='<div class="og-scale-container">\n <div class="og-scale-label"></div>\n <div class="og-scale-ruler"></div>\n </div>',this._minWidth=100,this._maxWidth=150,this._isCenter=null==e.isCenter||e.isCenter,this._mPx=0,this.currWidth=0,this._metersInMinSize=0,this.el=null,this._scaleLabelEl=null}_renderTemplate(){return xe(this._template)[0]}oninit(){this.el=this._renderTemplate(),this._scaleLabelEl=this.el.querySelector(".og-scale-label"),this.renderer.div.appendChild(this.el),this._isCenter?(this.planet.camera.events.on("moveend",(()=>{this._drawScreen(this.planet.renderer.handler.getCenter())})),!this.planet.terrain.isEmpty&&this.planet.terrain.events.on("loadend",(()=>{this._drawScreen(this.planet.renderer.handler.getCenter())}))):(this.renderer.events.on("mousemove",(e=>{e.leftButtonHold||e.rightButtonHold||this._drawScreen(e.pos)})),this.planet.camera.events.on("moveend",(()=>{let e=this.renderer.events.mouseState;e.leftButtonHold||e.rightButtonHold||this._drawScreen(e.pos)})))}_drawScreen(e){let t=this.planet.camera,i=e,r=this.planet.getDistanceFromPixel(i)||0;0===r&&(i=t.project(oe.ZERO),r=this.planet.getDistanceFromPixel(i)||0);let n=t.getForward().scaleTo(r).addA(t.eye),s=r*Math.tan(t.viewAngle*o),a=n.add(t.getRight().scaleTo(s)),l=t.project(a);this._mPx=s/l.distance(i);let h=this._mPx*this._minWidth,c=Me(Tn,h,((e,t)=>e-t));c<0&&(c=~c);let d=Tn[c],_=(d-h)/(Tn[c+1]-d);this.currWidth=this._minWidth+_*(this._maxWidth-this._minWidth),this._scaleLabelEl.innerText=d>1e3?d/1e3+" km":`${d} m`,this._metersInMinSize=h,this.el.style.width=this.currWidth+"px"}}class Ln extends Mt{constructor(e={}){super({name:"SimpleSkyBackground",...e}),this._colorOne=new Float32Array([1,1,1]),this._colorTwo=new Float32Array([0,.6,221/255])}set colorOne(e){let t=ve(e);this._colorOne[0]=t.x,this._colorOne[1]=t.y,this._colorOne[2]=t.z}set colorTwo(e){let t=ve(e);this._colorTwo[0]=t.x,this._colorTwo[1]=t.y,this._colorTwo[2]=t.z}oninit(){this.renderer.handler.addProgram(new Si("simpleSkyBackground",{uniforms:{iResolution:"vec2",fov:"float",camPos:"vec3",earthRadius:"float",viewMatrix:"mat4",colorOne:"vec3",colorTwo:"vec3"},attributes:{corners:"vec3"},vertexShader:"attribute vec2 corners;\n \n varying vec2 tc;\n \n void main(void) {\n gl_Position = vec4(corners, 0.0, 1.0);\n tc = corners * 0.5 + 0.5;\n }",fragmentShader:"precision highp float;\n \n #define MAX 10e10\n #define PI 3.14159265359\n #define rad(x) x * PI / 180.\n #define ZERO vec3(0.0) \n \n #define RED vec4(1.0, 0.0, 0.0, 1.0)\n #define GREEN vec4(0.0, 1.0, 0.0, 1.0) \n \n uniform vec3 camPos; \n uniform vec2 iResolution;\n uniform float fov;\n uniform float earthRadius;\n uniform mat4 viewMatrix;\n \n uniform vec3 colorOne;\n uniform vec3 colorTwo;\n \n varying vec2 tc;\n \n // compute the view ray in the camera coordinate\n vec3 computeView(vec2 uv){\n float w_h_ratio = iResolution.x / iResolution.y; \n float h = tan(rad(fov/2.));\n return normalize(vec3(-w_h_ratio * h, -h, -1.) + vec3(uv.x * 2. * h * w_h_ratio, uv.y*2.*h, 0.));\n }\n\n // sphere of size ra centered at point ce\n vec2 sphIntersect( in vec3 ro, in vec3 rd, in vec3 ce, float ra )\n {\n vec3 oc = ro - ce;\n float b = dot( oc, rd );\n float c = dot( oc, oc ) - ra * ra;\n float h = b * b - c;\n if( h < 0.0 ) return vec2(MAX); // no intersection\n h = sqrt( h );\n return vec2( -b-h, -b+h );\n }\n \n mat3 transpose(mat3 matrix) {\n vec3 row0 = matrix[0];\n vec3 row1 = matrix[1];\n vec3 row2 = matrix[2];\n mat3 result = mat3(\n vec3(row0.x, row1.x, row2.x),\n vec3(row0.y, row1.y, row2.y),\n vec3(row0.z, row1.z, row2.z)\n );\n return result;\n }\n \n float det(mat2 matrix) {\n return matrix[0].x * matrix[1].y - matrix[0].y * matrix[1].x;\n }\n \n mat3 inverse(mat3 matrix) {\n vec3 row0 = matrix[0];\n vec3 row1 = matrix[1];\n vec3 row2 = matrix[2];\n \n vec3 minors0 = vec3(\n det(mat2(row1.y, row1.z, row2.y, row2.z)),\n det(mat2(row1.z, row1.x, row2.z, row2.x)),\n det(mat2(row1.x, row1.y, row2.x, row2.y))\n );\n vec3 minors1 = vec3(\n det(mat2(row2.y, row2.z, row0.y, row0.z)),\n det(mat2(row2.z, row2.x, row0.z, row0.x)),\n det(mat2(row2.x, row2.y, row0.x, row0.y))\n );\n vec3 minors2 = vec3(\n det(mat2(row0.y, row0.z, row1.y, row1.z)),\n det(mat2(row0.z, row0.x, row1.z, row1.x)),\n det(mat2(row0.x, row0.y, row1.x, row1.y))\n );\n \n mat3 adj = transpose(mat3(minors0, minors1, minors2));\n \n return (1.0 / dot(row0, minors0)) * adj;\n }\n \n void main(void) {\n \n vec3 dir = computeView(tc);\n dir = inverse(mat3(viewMatrix)) * dir;\n \n vec2 ER = sphIntersect(camPos, dir, vec3(0.0), earthRadius);\n \n float bigRadius = earthRadius * 2.5;\n vec3 bigCenter = normalize(camPos) * bigRadius * 1.3; \n \n vec2 BIG = sphIntersect(camPos, dir, bigCenter, bigRadius);\n \n float Ix = distance(camPos + dir * BIG.y, ZERO); \n \n float maxI = sqrt(bigRadius * bigRadius + bigRadius * bigRadius);\n \n gl_FragColor = vec4(mix(colorOne, colorTwo, Ix / maxI), 1.0);\n }"})),this.activate()}onactivate(){super.onactivate(),this.planet.events.on("draw",this._drawBackground,this)}ondeactivate(){super.ondeactivate(),this.planet.events.off("draw",this._drawBackground)}_drawBackground(){let e=this.renderer.handler,t=e.programs.simpleSkyBackground,i=t._program,r=i.uniforms,n=e.gl,s=this.planet.camera;n.disable(n.DEPTH_TEST),t.activate(),n.bindBuffer(n.ARRAY_BUFFER,this.renderer.screenFramePositionBuffer),n.vertexAttribPointer(i.attributes.corners,2,n.FLOAT,!1,0,0),n.uniform3fv(r.camPos,[s.eye.x,s.eye.y,s.eye.z]),n.uniform2fv(r.iResolution,[e.getWidth(),e.getHeight()]),n.uniform1f(r.fov,s.getViewAngle()),n.uniform1f(r.earthRadius,this.planet.ellipsoid.getPolarSize()+1),n.uniform3fv(r.colorOne,this._colorOne),n.uniform3fv(r.colorTwo,this._colorTwo),n.uniformMatrix4fv(r.viewMatrix,!1,s.getViewMatrix()),n.drawArrays(n.TRIANGLE_STRIP,0,4),n.enable(n.DEPTH_TEST)}}const An=14959787e4;function En(t){var i=t-lt,r=282.9404+470935e-10*i,n=.016709-1.151e-9*i,s=P(356.047+.9856002585*i),a=23.4392911-3.563e-7*i,h=s+l*n*Math.sin(s*o)*(1+n*Math.cos(s*o)),c=Math.cos(h*o)-n,d=Math.sin(h*o)*Math.sqrt(1-n*n),_=Math.sqrt(c*c+d*d),u=P(Math.atan2(d,c)*l+r),f=c=_*Math.cos(u*o),g=(d=_*Math.sin(u*o))*Math.cos(a*o),p=d*Math.sin(a*o),m=e*(24*i/23.9344694-259.853/360);return ae.zRotation(-m).mulVec3(new oe(-f*An,-g*An,p*An))}class Pn{constructor(e,t){this._name=e||"light_"+Pn.__counter__++,this._renderNode=null,this._position=t.position||new oe,this.directional=null==t.directional||t.directional,this._ambient=t.ambient||new oe,this._diffuse=t.diffuse||new oe(.8,.8,.8),this._specular=t.specular||new oe(.18,.18,.18),this._shininess=null!=t.shininess?t.shininess:3.3,this._active=!0,this._tempAmbient=this._ambient.clone(),this._tempDiffuse=this._diffuse.clone(),this._tempSpecular=this._specular.clone(),this._tempShininess=this._shininess}clone(){}setActive(e){if(e&&!this._active){const e=this._renderNode;if(e){let t=e._lightsNames.indexOf(this._name);this._shininess=e._lightsParamsf[t]=this._tempShininess,-1!=t&&(t*=9,this._ambient.x=e._lightsParamsv[t]=this._tempAmbient.x,this._ambient.y=e._lightsParamsv[t+1]=this._tempAmbient.y,this._ambient.z=e._lightsParamsv[t+2]=this._tempAmbient.z,this._diffuse.x=e._lightsParamsv[t+3]=this._tempDiffuse.x,this._diffuse.y=e._lightsParamsv[t+4]=this._tempDiffuse.y,this._diffuse.z=e._lightsParamsv[t+5]=this._tempDiffuse.z,this._specular.x=e._lightsParamsv[t+6]=this._tempSpecular.x,this._specular.y=e._lightsParamsv[t+7]=this._tempSpecular.y,this._specular.z=e._lightsParamsv[t+8]=this._tempSpecular.z)}this._active=!0}else!e&&this._active&&(this._tempAmbient=this._ambient.clone(),this._tempDiffuse=this._diffuse.clone(),this._tempSpecular=this._specular.clone(),this._tempShininess=this._shininess,this.setBlack(),this._active=!1)}isActive(){return this._active}setPosition3v(e){this._position.x=e.x,this._position.y=e.y,this._position.z=e.z}setPosition(e,t,i){this._position.x=e,this._position.y=t,this._position.z=i}getPosition(){return this._position.clone()}setAmbient3v(e){this.setAmbient(e.x,e.y,e.z)}setDiffuse3v(e){this.setDiffuse(e.x,e.y,e.z)}setSpecular3v(e){this.setSpecular(e.x,e.y,e.z)}setAmbient(e,t,i){this._ambient.set(e,t,i);const r=this._renderNode;if(r){let n=9*r._lightsNames.indexOf(this._name);-1!=n&&(r._lightsParamsv[n]=e,r._lightsParamsv[n+1]=t,r._lightsParamsv[n+2]=i)}}setDiffuse(e,t,i){this._diffuse.set(e,t,i);const r=this._renderNode;if(r){let n=9*r._lightsNames.indexOf(this._name);-1!=n&&(r._lightsParamsv[n+3]=e,r._lightsParamsv[n+4]=t,r._lightsParamsv[n+5]=i)}}setSpecular(e,t,i){this._specular.set(e,t,i);const r=this._renderNode;if(r){let n=9*r._lightsNames.indexOf(this._name);-1!=n&&(r._lightsParamsv[n+6]=e,r._lightsParamsv[n+7]=t,r._lightsParamsv[n+8]=i)}}setShininess(e){this._shininess=e;const t=this._renderNode;if(t){let i=t._lightsNames.indexOf(this._name);-1!=i&&(t._lightsParamsf[i]=e)}}setBlack(){this._ambient.clear(),this._diffuse.clear(),this._specular.clear(),this._shininess=0;const e=this._renderNode;if(e){let t=9*e._lightsNames.indexOf(this._name);-1!==t&&(e._lightsParamsv[t]=e._lightsParamsv[t+1]=e._lightsParamsv[t+2]=e._lightsParamsv[t+3]=e._lightsParamsv[t+4]=e._lightsParamsv[t+5]=e._lightsParamsv[t+6]=e._lightsParamsv[t+7]=e._lightsParamsv[t+8]=0)}}addTo(e){this._renderNode=e,e._lights.push(this),e._lightsNames.push(this._name),e._lightsParamsf.push(this._shininess),e._lightsParamsv.push.apply(e._lightsParamsv,this._ambient.toArray()),e._lightsParamsv.push.apply(e._lightsParamsv,this._diffuse.toArray()),e._lightsParamsv.push.apply(e._lightsParamsv,this._specular.toArray()),e.transformLights()}remove(){this._renderNode,this._renderNode=null}}Pn.__counter__=0;class Mn extends Mt{constructor(e={}){super({autoActivate:!0,...e}),this._name="sun",this.activationHeight=e.activationHeight||12079e3,this.offsetVertical=e.offsetVertical||-5e6,this.offsetHorizontal=e.offsetHorizontal||5e6,this.sunlight=new Pn("Sun",{ambient:new oe(.15,.15,.25),diffuse:new oe(.9,.9,.8),specular:new oe(.1,.1,.06),shininess:110}),this._currDate=0,this._prevDate=0,this._clockPtr=null,this._lightOn=!1,this._f=0,this._k=0,this._stopped=e.stopped||!1}oninit(){this.planet.lightEnabled=!0,this.sunlight.addTo(this.planet),this.renderer.events.on("draw",this._draw,this),this._clockPtr||(this._clockPtr=this.renderer.handler.defaultClock)}stop(){this._stopped=!0,this.deactivate()}start(){this._stopped=!1,this.activate()}onactivate(){super.onactivate(),this._stopped=!1}bindClock(e){this._clockPtr=e}_draw(){if(this._clockPtr)if(this._currDate=this._clockPtr.currentDate,this._stopped)this.sunlight.setPosition3v(En(this._currDate));else{let e=this.planet.camera;if(e.getHeight()<this.activationHeight||!this._active){this._lightOn=!0,this._f=1;let t=e.eye.normal(),i=e.getForward();i.scale(Math.sign(e._u.dot(t))),e.slope>.99&&(i=e._u);let r=oe.proj_b_to_plane(i,t,i).normalize().scale(this.offsetVertical),n=oe.proj_b_to_plane(e._r,t,e._r).normalize().scale(this.offsetHorizontal),s=r.add(n),a=e.eye.add(s);if(this._k>0){this._k-=.01;let e=ae.getRotationBetweenVectors(this.sunlight._position.normal(),a.normal()).slerp(ae.IDENTITY,this._k).normalize();this.sunlight.setPosition3v(e.mulVec3(this.sunlight._position))}else this.sunlight.setPosition3v(a)}else if(this._k=1,this._f>0){this._f-=.01;let e=ae.getRotationBetweenVectors(this.sunlight._position.normal(),En(this._currDate).normal()).slerp(ae.IDENTITY,this._f).normalize();this.sunlight.setPosition3v(e.mulVec3(this.sunlight._position))}else(Math.abs(this._currDate-this._prevDate)>34e-5&&this._active||this._lightOn)&&(this._lightOn=!1,this._prevDate=this._currDate,this.sunlight.setPosition3v(En(this._currDate)),this._f=0)}}}class Sn{constructor(){this.x=0,this.y=0,this.prev_x=0,this.prev_y=0,this.grabbedPoint=null,this.grabbedSpheroid=new bt,this._vec=new le,this._vecPrev=new le}get dY(){return this.y-this.prev_y}get dX(){return this.x-this.prev_x}get vec(){return this._vec.set(this.x,this.y)}get vecPrev(){return this._vecPrev.set(this.prev_x,this.prev_y)}}class Bn extends Mt{constructor(e={}){super(e),this._name="touchNavigation",this.grabbedPoint=new oe,this.inertia=.007,this.grabbedSpheroid=new bt,this.planet=null,this.qRot=new ae,this.scaleRot=0,this.rot=1,this._eye0=new oe,this.pointOnEarth=null,this.earthUp=null,this.touches=[new Sn,new Sn],this._keyLock=new ln,this._touching=!1}oninit(){this.renderer&&(this.renderer.events.on("touchstart",this.onTouchStart,this),this.renderer.events.on("touchend",this.onTouchEnd,this),this.renderer.events.on("doubletouch",this.onDoubleTouch,this),this.renderer.events.on("touchcancel",this.onTouchCancel,this),this.renderer.events.on("touchmove",this.onTouchMove,this),this.renderer.events.on("draw",this.onDraw,this))}onTouchStart(e){const t=this.renderer.handler;if(this._touching=!0,2===e.sys.touches.length){const i=this.touches[0],r=this.touches[1];i.x=(e.sys.touches.item(0).clientX-e.sys.offsetLeft)*t.pixelRatio,i.y=(e.sys.touches.item(0).clientY-e.sys.offsetTop)*t.pixelRatio,i.prev_x=i.x,i.prev_y=i.y,i.grabbedPoint=this.planet.getCartesianFromPixelTerrain(new le(i.x,i.y))||null,r.x=(e.sys.touches.item(1).clientX-e.sys.offsetLeft)*t.pixelRatio,r.y=(e.sys.touches.item(1).clientY-e.sys.offsetTop)*t.pixelRatio,r.prev_x=r.x,r.prev_y=r.y,r.grabbedPoint=this.planet.getCartesianFromPixelTerrain(new le(r.x,r.y))||null,this.pointOnEarth=this.planet.getCartesianFromPixelTerrain(this.renderer.handler.getCenter())||null,this.pointOnEarth&&(this.earthUp=this.pointOnEarth.normal()),i.grabbedPoint&&r.grabbedPoint&&(i.grabbedSpheroid.radius=i.grabbedPoint.length(),r.grabbedSpheroid.radius=r.grabbedPoint.length(),this.stopRotation())}else 1===e.sys.touches.length&&this._startTouchOne(e)}_startTouchOne(e){const t=this.touches[0],i=this.renderer.handler;t.x=(e.sys.touches.item(0).clientX-e.sys.offsetLeft)*i.pixelRatio,t.y=(e.sys.touches.item(0).clientY-e.sys.offsetTop)*i.pixelRatio,t.prev_x=t.x,t.prev_y=t.y,t.grabbedPoint=this.planet.getCartesianFromPixelTerrain(e)||null,this._eye0.copy(this.planet.camera.eye),t.grabbedPoint&&(t.grabbedSpheroid.radius=t.grabbedPoint.length(),this.stopRotation())}stopRotation(){this.qRot.clear(),this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock)}onDoubleTouch(e){this.planet.stopFlying(),this.stopRotation();const t=this.planet.getCartesianFromPixelTerrain(e);if(t){const e=this.planet.ellipsoid.cartesianToLonLat(t);this.planet.flyLonLat(new I(e.lon,e.lat,.57*this.planet.camera.eye.distance(t)))}}onTouchEnd(e){0===e.sys.touches.length&&(this._touching=!1),1===e.sys.touches.length&&this._startTouchOne(e),Math.abs(this.touches[0].x-this.touches[0].prev_x)<3&&Math.abs(this.touches[0].y-this.touches[0].prev_y)<3&&(this.scaleRot=0)}onTouchCancel(e){}onTouchMove(e){let t=this.planet.camera;const i=this.renderer.handler;if(2===e.sys.touches.length){this.renderer.controlsBag.scaleRot=1;let n=this.touches[0],s=this.touches[1];if(!n.grabbedPoint||!s.grabbedPoint)return;this.planet.stopFlying(),n.prev_x=n.x,n.prev_y=n.y,n.x=(e.sys.touches.item(0).clientX-e.sys.offsetLeft)*i.pixelRatio,n.y=(e.sys.touches.item(0).clientY-e.sys.offsetTop)*i.pixelRatio,s.prev_x=s.x,s.prev_y=s.y,s.x=(e.sys.touches.item(1).clientX-e.sys.offsetLeft)*i.pixelRatio,s.y=(e.sys.touches.item(1).clientY-e.sys.offsetTop)*i.pixelRatio;const a=n.vec.add(s.vec).scale(.5),l=this.planet.getCartesianFromPixelTerrain(a);if(l){this.pointOnEarth=l;const e=Math.atan2(n.prev_y-s.prev_y,n.prev_x-s.prev_x),i=Math.atan2(n.y-s.y,n.x-s.x)-e,a=t.eye.distance(this.pointOnEarth),h=n.vec.sub(s.vec),c=n.vecPrev.sub(s.vecPrev);let d=a*-(1-h.length()/c.length());t.eye.addA(t.getForward().scale(d)),t.rotateAround(-i,!1,this.pointOnEarth,this.earthUp);const _=n.vec.add(s.vec).scale(.5),u=n.vecPrev.add(s.vecPrev).scale(.5),f=_.sub(u).scale(-1);var r=.5/a*t._lonLat.height*o;r>.003&&(r=.003),t.rotateHorizontal(r*-f.x,!1,this.pointOnEarth,this.earthUp),t.rotateVertical(r*-f.y,this.pointOnEarth),t.checkTerrainCollision(),t.update()}this.scaleRot=0}else if(1===e.sys.touches.length){let r=this.touches[0];if(r.prev_x=r.x,r.prev_y=r.y,r.x=(e.sys.touches.item(0).clientX-e.sys.offsetLeft)*i.pixelRatio,r.y=(e.sys.touches.item(0).clientY-e.sys.offsetTop)*i.pixelRatio,!r.grabbedPoint)return;this.planet.stopFlying();let n=e.direction,s=new ai(t.eye,n).hitSphere(r.grabbedSpheroid);if(s)if(t.slope>.2){this.qRot=ae.getRotationBetweenVectors(s.normal(),r.grabbedPoint.normal());let e=this.qRot;t.eye=e.mulVec3(t.eye),t._r=e.mulVec3(t._r),t._u=e.mulVec3(t._u),t._b=e.mulVec3(t._b),t.checkTerrainCollision(),t.update(),this.scaleRot=1}else{let e=r.grabbedPoint,i=oe.add(e,t._u),n=oe.add(e,e.normal()),s=t.unproject(r.x,r.y),a=new oe;new ai(t.eye,s).hitPlane(e,i,n,a)===ai.INSIDE&&(t.eye=this._eye0.addA(a.subA(e).negate()),t.checkTerrainCollision(),t.update(),this.scaleRot=0)}}}onDraw(){const e=this.renderer;if(e.controlsBag.scaleRot=this.scaleRot,this._touching)return;let t=this.planet.camera,i=t.eye.clone();if(!e.events.mouseState.leftButtonDown&&this.scaleRot){if(this.scaleRot-=this.inertia,this.scaleRot<=0)this.scaleRot=0;else{e.controlsBag.scaleRot=this.scaleRot;let i=this.qRot.slerp(ae.IDENTITY,1-this.scaleRot*this.scaleRot*this.scaleRot).normalize();i.x||i.y||i.z||(this.scaleRot=0),t.eye=i.mulVec3(t.eye),t._r=i.mulVec3(t._r),t._u=i.mulVec3(t._u),t._b=i.mulVec3(t._b),t.checkTerrainCollision(),t.update()}t.eye.distance(i)/t.getAltitude()>.01?(this.planet.layerLock.lock(this._keyLock),this.planet.terrainLock.lock(this._keyLock),this.planet._normalMapCreator.lock(this._keyLock)):(this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock))}}}class kn extends Mt{constructor(e={}){super(e),this._keyLock=new ln,this._move=0,this._targetPoint=null}oninit(){let e=new Pt({classList:["og-map-button","og-zoomin-button"],icon:'<?xml version="1.0"?><svg width=24 height=24 xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M 11 5 L 11 11 L 5 11 L 5 13 L 11 13 L 11 19 L 13 19 L 13 13 L 19 13 L 19 11 L 13 11 L 13 5 L 11 5 z"/></svg>'});e.appendTo(this.renderer.div);let t=new Pt({classList:["og-map-button","og-zoomout-button"],icon:'<?xml version="1.0"?><svg width=24 height=24 xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M 5 11 L 5 13 L 19 13 L 19 11 L 5 11 z"/></svg>'});t.appendTo(this.renderer.div),e.events.on("mousedown",(()=>this.zoomIn())),e.events.on("mouseup",(()=>this.stopZoom())),t.events.on("mousedown",(()=>this.zoomOut())),t.events.on("mouseup",(()=>this.stopZoom())),e.events.on("touchstart",(()=>this.zoomIn())),e.events.on("touchend",(()=>this.stopZoom())),e.events.on("touchcancel",(()=>this.stopZoom())),t.events.on("touchstart",(()=>this.zoomOut())),t.events.on("touchend",(()=>this.stopZoom())),t.events.on("touchcancel",(()=>this.stopZoom())),this.renderer.events.on("draw",this._draw,this)}zoomIn(){this.planet.layerLock.lock(this._keyLock),this.planet.terrainLock.lock(this._keyLock),this.planet._normalMapCreator.lock(this._keyLock),this._targetPoint=this.renderer.getCenter(),this._move=1}zoomOut(){this.planet.layerLock.lock(this._keyLock),this.planet.terrainLock.lock(this._keyLock),this.planet._normalMapCreator.lock(this._keyLock),this._targetPoint=this.renderer.getCenter(),this._move=-1}stopZoom(){this._move=0,this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock)}_draw(e){const t=this.planet.camera;if(0!==this._move){const i=this.planet.getCartesianFromPixelTerrain(e.getCenter());if(i){let e=.035*t.eye.distance(i);t.eye.addA(t.getForward().scale(this._move*e)),t.checkTerrainCollision(),t.update()}}}}class Rn extends Ti{constructor(e={}){super(e.name),this._ignoreTerrain=!1,this.events=new Ct(zn),this._ignoreTerrain=null==e.ignoreTerrain||e.ignoreTerrain,this._onSelect=e.onSelect||null,this._autoSelectionHide=e.autoSelectionHide||!1,this._planet=e.planet||null,this._startLonLat=null,this._heading=0,this._propsLabel=new vi({name:"propsLabel",label:{text:"",size:11,color:"rgba(455,455,455,1.0)",outlineColor:"rgba(0,0,0,0.34)",outline:.23,align:"center",offset:[0,18]}}),this._propsLabel?.label?.setVisibility(!1),this._trackEntity=new vi({polyline:{path3v:[],thickness:3.8,color:"rgb(455,455,455)",isClosed:!1}}),this._trackEntity.polyline.altitude=.01;let t=bi.createCylinder(1.1,0,2.7,20,1,!0,!1,0,0,0);this._cornerEntity=[new vi({geoObject:{scale:1,instanced:!0,tag:"selection",color:"rgb(0,305,0)",object3d:t},properties:{name:"start"}}),new vi({geoObject:{scale:1,instanced:!0,tag:"selection",color:"rgb(455,0,0)",object3d:t},properties:{name:"end"}})],this._trackLayer=new Pr("track",{entities:[this._trackEntity,this._propsLabel],pickingEnabled:!1,polygonOffsetUnits:-1,relativeToGround:!0,displayInLayerSwitcher:!1}),this._cornersLayer=new Pr("corners",{entities:[this._cornerEntity[0],this._cornerEntity[1]],pickingEnabled:!0,displayInLayerSwitcher:!1,scaleByDistance:[1,4e6,.01],pickingScale:2})}set ignoreTerrain(e){this._ignoreTerrain=e}bindPlanet(e){this._planet=e}init(){this._activate()}onremove(){this._deactivate()}_activate(){this._propsLabel?.label?.setVisibility(!1),this._onMouseMove_=this._onMouseMove.bind(this),this.renderer?.events.on("mousemove",this._onMouseMove_,this),this._onMouseLdown_=this._onMouseLdown.bind(this),this.renderer?.events.on("ldown",this._onMouseLdown_,this),this._onMouseLup_=this._onMouseLup.bind(this),this.renderer?.events.on("lup",this._onMouseLup_,this),this._planet.addLayer(this._trackLayer),this._planet.addLayer(this._cornersLayer)}_deactivate(){this._startLonLat=null,this._trackLayer.remove(),this._cornersLayer.remove(),this.renderer?.events.off("mousemove",this._onMouseMove_),this.renderer?.events.off("ldown",this._onMouseLdown_),this.renderer?.events.off("lup",this._onMouseLup_),this.clear(),this._onMouseMove_=null,this._onMouseLdown_=null,this._onMouseLup_=null}_onMouseLdown(e){if(e.renderer.handler.canvas.classList.remove("ogGrabbingPoiner"),e.renderer.handler.canvas.style.cursor="pointer",!this._startLonLat){this._propsLabel.label?.setVisibility(!1),this._trackEntity.polyline?.setPath3v([]),this._cornerEntity[0].geoObject?.setVisibility(!0),this._cornerEntity[1].geoObject?.setVisibility(!0),this.renderer?.controls.mouseNavigation?.deactivate(),this._startLonLat=this._planet.getLonLatFromPixelTerrain(e);let t=this._planet.ellipsoid.lonLatToCartesian(this._startLonLat);this._cornerEntity[0].setCartesian3v(t),this._cornerEntity[1].setCartesian3v(t)}}_onMouseLup(e){if(this._startLonLat){if(this._pickedCorner=null,this._anchorLonLat=null,this._propsLabel.label?.setVisibility(!0),this._onSelect&&"function"==typeof this._onSelect){let e=this._cornerEntity[0].getLonLat(),t=this._cornerEntity[1].getLonLat(),i=[Math.min(e.lon,t.lon),Math.min(e.lat,t.lat),Math.max(e.lon,t.lon),Math.max(e.lat,t.lat)];this._onSelect(i)}this._autoSelectionHide&&this.clear(),this._startLonLat=null}e.renderer.handler.canvas.style.cursor="default",this.renderer?.controls.mouseNavigation?.activate()}_drawLine(e,t,i){i||(i=this._planet.ellipsoid.lonLatToCartesian(e));let r=this._planet.ellipsoid.lonLatToCartesian(t),n=this._planet.ellipsoid.direct(e,t);this._heading=n.initialAzimuth;let s=[];this._cornerEntity[0].setCartesian3v(i),this._cornerEntity[1].setCartesian3v(r);let a=[i,this._planet.ellipsoid.lonLatToCartesian(new I(t.lon,e.lat,e.height)),r,this._planet.ellipsoid.lonLatToCartesian(new I(e.lon,t.lat,e.height)),i];s.push(i);let o=(e,t)=>{let i=t.sub(e),r=i.length();i.normalize();for(let t=0;t<120;t++){let n=i.scaleTo(t*r/120).addA(e);s.push(n)}};for(let e=0;e<a.length-1;e++)o(a[e],a[e+1]);this._trackEntity.polyline?.setPath3v([s]),this._ignoreTerrain}_onMouseMove(e){if(this._startLonLat){this._propsLabel.label?.setVisibility(!0);let t=this._planet.getLonLatFromPixelTerrain(e);if(!t)return;this._drawLine(this._startLonLat,t)}}clear(){this._trackEntity.polyline?.clear(),this._cornerEntity[0].geoObject?.setVisibility(!1),this._cornerEntity[1].geoObject?.setVisibility(!1)}frame(){let e=this._trackEntity.polyline?.getPath3v()[0];if(e&&!this._ignoreTerrain){let i=0;for(let t=0,r=e.length-1;t<r;t++)i+=e[t+1].distance(e[t]);this._propsLabel.setCartesian3v(e[Math.floor(e.length/2)]),this._propsLabel.label?.setText(`${t=i,t>1e3?`${(t/1e3).toFixed(1)} km`:t>9?`${Math.round(t)} m`:`${t.toFixed(1)} m`}, ${Math.round(this._heading)} deg`)}var t}get ellipsoid(){return this._planet?this._planet.ellipsoid:null}}const zn=["add","remove","mousemove","mouseenter","mouseleave","lclick","rclick","mclick","ldblclick","rdblclick","mdblclick","lup","rup","mup","ldown","rdown","mdown","lhold","rhold","mhold","mousewheel","touchmove","touchstart","touchend","doubletouch","touchleave","touchenter"];function In(e,t){return new Date(+e+1e3*t)}function Fn(e,t=!0,i=!1){let r=On[e.getMonth()],n=e.getUTCDate(),s=e.getUTCFullYear();if(t){let t=e.getUTCHours().toString().padStart(2,"0"),a=e.getUTCMinutes().toString().padStart(2,"0"),o=e.getUTCSeconds().toString().padStart(2,"0");if(i){return`${r} ${n} ${s} ${t}:${a}:${o}.${e.getUTCMilliseconds().toString().padStart(3,"0")}`}return`${r} ${n} ${s} ${t}:${a}:${o}`}return`${r} ${n} ${s}`}function Dn(e,t=0,i=10,r=2,n="white"){e.lineWidth=r,e.strokeStyle=n,e.beginPath(),e.moveTo(t,0),e.lineTo(t,i),e.stroke()}function Nn(e,t,i,r,n="12px Arial",s="black",a="left",l="bottom",h=0){e.save(),e.translate(i,r),e.rotate(h*o),e.fillStyle=s,e.textBaseline=l,e.font=n,e.textAlign=a,e.fillText(t,0,0),e.restore()}const Hn=[[.001,10],[.002,10],[.005,10],[.01,10],[.02,10],[.05,10],[.1,10],[.25,10],[.5,5],[1,10],[2,10],[5,5],[10,10],[15,15],[30,6],[60,12],[120,12],[300,5],[600,10],[900,15],[1800,6],[3600,12],[7200,10],[14400,4],[21600,6],[43200,12],[86400,24],[172800,2],[345600,4],[604800,7],[1296e3,15],[2592e3,5],[5184e3,6],[7776e3,9],[15552e3,18],[31536e3,12],[63072e3,2],[126144e3,4],[15768e4,5],[31536e4,10],[63072e4,2],[126144e4,4],[15768e5,5],[31536e5,10],[63072e5,2],[126144e5,4],[15768e6,5],[31536e6,10]];const On=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Vn=["change","current"];class Un{constructor(e={}){this.events=Tt(Vn),this._current=e.current||new Date,this._rangeStart=e.rangeStart||new Date,this._rangeEnd=e.rangeEnd||In(this._rangeStart,3600),this._range=this._rangeEnd.getTime()-this._rangeStart.getTime(),this._minDate=e.minDate||null,this._maxDate=e.maxDate||null,this.multiplier=null!=e.multiplier?e.multiplier:1,this._requestAnimationFrameId=0,this._prevNow=0,this.dt=0}play(){this._requestAnimationFrameId||(this._prevNow=window.performance.now(),this._animationFrameCallback())}stop(){this._requestAnimationFrameId&&(window.cancelAnimationFrame(this._requestAnimationFrameId),this._requestAnimationFrameId=0)}stopped(){return 0==this._requestAnimationFrameId}_animationFrameCallback(){this._requestAnimationFrameId=window.requestAnimationFrame((()=>{this._frame(),this._animationFrameCallback()}))}_frame(){let e=window.performance.now();this.dt=e-this._prevNow,this._prevNow=e,this.current=new Date(this.currentTime+this.dt*this.multiplier)}get range(){return this._range}set(e,t){e===this._rangeStart&&t===this._rangeEnd||(this._rangeStart=e,this._rangeEnd=t,this._range=this._rangeEnd.getTime()-this._rangeStart.getTime(),this.events.dispatch(this.events.change,e,t))}get current(){return this._current}get rangeStart(){return this._rangeStart}get rangeEnd(){return this._rangeEnd}get rangeStartTime(){return this._rangeStart.getTime()}get rangeEndTime(){return this._rangeEnd.getTime()}get currentTime(){return this._current.getTime()}set current(e){e!==this._current&&(this._maxDate&&e>this._maxDate?this._current=this._maxDate:this._minDate&&e<this._minDate?this._current=this._minDate:this._current=e,this.events.dispatch(this.events.current,this._current))}set rangeStart(e){e!==this._rangeStart&&(this._rangeStart=e,this._range=this._rangeEnd.getTime()-this._rangeStart.getTime(),this.events.dispatch(this.events.change,e))}set rangeEnd(e){e!==this._rangeEnd&&(this._rangeEnd=e,this._range=this._rangeEnd.getTime()-this._rangeStart.getTime(),this.events.dispatch(this.events.change,e))}}const Gn=.001,Wn=["startdrag","stopdrag","startdragcurrent","stopdragcurrent","setcurrent","reset","play","playback","pause","visibility"],jn="#bfbfbf";class Yn extends At{constructor(e={}){super({template:'<div class="og-timeline">\n\n <div class="og-timeline-top">\n </div>\n\n <div class="og-timeline-frame">\n <div class="og-timeline-current">\n <div class="og-timeline-current-spin">\n <div class="og-timeline-current-arrow"></div>\n </div>\n </div>\n <div class="og-timeline-scale"></div>\n </div>\n\n <div class="og-timeline-bottom">\n <div class="og-timeline-controls">\n </div>\n </div>\n\n</div>',model:new Un({rangeStart:e.rangeStart,rangeEnd:e.rangeEnd,current:e.currentDate,minDate:e.minDate,maxDate:e.maxDate})}),this._onMouseWheel=e=>{if(this._isMouseOver){let t=this._canvasEl.getBoundingClientRect(),i=e.clientX-t.left,r=-(i-.5*this.clientWidth),n=this.model.rangeStartTime+this._millisecondsInPixel*i;this._zoom(n,r,Math.sign(e.wheelDelta))}else if(this._isCurrentMouseOver){let t=-((this.model.currentTime-this.model.rangeStartTime)/this._millisecondsInPixel-.5*this.clientWidth);this._zoom(this.model.currentTime,t,Math.sign(e.wheelDelta))}},this._onMouseWheelFF=e=>{this._onMouseWheel(e)},this._onMouseDown=e=>{this._isMouseOver?(this._isDragging=!0,document.body.classList.add("og-timeline-unselectable"),this._clickPosX=e.clientX,this._clickTime=Date.now(),this._clickRangeStart=this.model.rangeStart,this._clickRangeEnd=this.model.rangeEnd,this.events.dispatch(this.events.startdrag,e)):this._isCurrentMouseOver&&(this._isCurrentDragging=!0,document.body.classList.add("og-timeline-unselectable"),this._clickPosX=e.clientX,this._clickCurrentDate=this.model.current,this.events.dispatch(this.events.startdragcurrent,e))},this._onMouseUp=e=>{if(this._isDragging)if(this._isDragging=!1,document.body.classList.remove("og-timeline-unselectable"),this._clickPosX===e.clientX&&Date.now()-this._clickTime<this._clickDelay){let t=this._canvasEl.getBoundingClientRect(),i=new Date(this.model.rangeStartTime+(e.clientX-t.left)*this._millisecondsInPixel);this.model.current=i,this.events.dispatch(this.events.stopdrag,i),this.events.dispatch(this.events.setcurrent,i)}else this.events.dispatch(this.events.stopdrag,this.model.current);else this._isCurrentDragging&&(this._isCurrentDragging=!1,document.body.classList.remove("og-timeline-unselectable"),this.events.dispatch(this.events.stopdragcurrent,this.model.current))},this._onMouseEnter=()=>{this._isMouseOver=!0},this._onMouseOut=()=>{this._isMouseOver=!1},this._onCurrentMouseEnter=()=>{this._isCurrentMouseOver=!0},this._onCurrentMouseOut=()=>{this._isCurrentMouseOver=!1},this._onMouseMove=e=>{if(this._isDragging){let t=(this._clickPosX-e.clientX)*this._millisecondsInPixel*Gn;this.model.set(In(this._clickRangeStart,t),In(this._clickRangeEnd,t))}else if(this._isCurrentDragging){let t=(this._clickPosX-e.clientX)*this._millisecondsInPixel*Gn,i=In(this._clickCurrentDate,-t);i>=this.model.rangeStart&&i<=this.model.rangeEnd&&(this.model.current=In(this._clickCurrentDate,-t))}},this.events=this.events.registerNames(Wn),this.fillStyle=e.fillStyle||"rgba(64, 59, 59, 1.0)",this.$controls=null,this._frameEl=null,this._currentEl=null,this._canvasEl=document.createElement("canvas"),this._ctx=this._canvasEl.getContext("2d"),this._isMouseOver=!1,this._isDragging=!1,this._isCurrentDragging=!1,this._isCurrentMouseOver=!1,this._minWidth=330,this._canvasScale=2,this._millisecondsInPixel=0,this._clickPosX=0,this._clickRangeStart=new Date,this._clickRangeEnd=new Date,this._clickCurrentDate=new Date,this._clickTime=0,this._clickDelay=450,this._onResizeObserver_=this._onResizeObserver.bind(this),this._resizeObserver=new ResizeObserver(this._onResizeObserver_),this._pauseBtn=new It({classList:["og-timeline-control_button"],icon:'<?xml version="1.0" ?><!DOCTYPE svg PUBLIC \'-//W3C//DTD SVG 1.1//EN\' \'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\'><svg enable-background="new 0 0 512 512" height="512px" version="1.1" viewBox="0 0 512 512" width="512px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Layer_6"><rect fill="#252525" height="320" width="60" x="153" y="96"/><rect fill="#252525" height="320" width="60" x="299" y="96"/></g></svg>',name:"pause"}),this._playBtn=new It({classList:["og-timeline-control_button"],icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M8 5v14l11-7z" style="fill: black;"/></svg>',name:"play"}),this._buttons=new qt({buttons:[this._pauseBtn,this._playBtn]}),this._visibility=!1}_onResizeObserver(){this.resize()}get canvasScale(){return this._canvasScale}set canvasScale(e){e!==this._canvasScale&&(this._canvasScale=e,this.resize())}resize(){this._resize(),this.draw()}afterRender(e){this.resize()}render(){return super.render(),this.$controls=this.select(".og-timeline-controls"),this._frameEl=this.select(".og-timeline-frame"),this._currentEl=this.select(".og-timeline-current"),this.select(".og-timeline-frame .og-timeline-scale").appendChild(this._canvasEl),this._resizeObserver.observe(this.el),this.model.events.on("change",(()=>{this.draw()})),this.model.events.on("current",(e=>{this._drawCurrent(),this.events.dispatch(this.events.setcurrent,e)})),this._canvasEl.addEventListener("mouseenter",this._onMouseEnter),this._canvasEl.addEventListener("mouseout",this._onMouseOut),this._currentEl.addEventListener("mouseenter",this._onCurrentMouseEnter),this._currentEl.addEventListener("mouseout",this._onCurrentMouseOut),document.body.addEventListener("mousemove",this._onMouseMove),document.body.addEventListener("mousedown",this._onMouseDown),document.body.addEventListener("mouseup",this._onMouseUp),document.body.addEventListener("wheel",this._onMouseWheelFF),this._playBtn.appendTo(this.$controls),this._pauseBtn.appendTo(this.$controls),this.model.stopped()?(this._pauseBtn.setActive(!0,!0),this._pauseBtn.preventClick=!0):(this._playBtn.setActive(!0,!0),this._playBtn.preventClick=!0),this._buttons.events.on("change",(e=>{switch(e.name){case"play":this.play();break;case"pause":this.pause()}})),this.setVisibility(!0),this}setVisibility(e){e!==this._visibility&&(this._visibility=e,this.el&&(this.el.style.display=e?"block":"none"),this.events.dispatch(this.events.visibility,e))}reset(){this.model.stop(),this.events.dispatch(this.events.reset,this.model)}play(){this.model.multiplier=Math.abs(this.model.multiplier),this.model.play(),this.events.dispatch(this.events.play,this.model)}pause(){this.model.stop(),this.events.dispatch(this.events.pause,this.model)}playBack(){this.model.multiplier=-1*Math.abs(this.model.multiplier),this.model.play(),this.events.dispatch(this.events.playback,this.model)}_zoom(e,t,i){let r=(e-(this.model.rangeStartTime+.5*this.model.range))*Gn,n=In(this.model.rangeStart,r),s=In(this.model.rangeEnd,r),a=(s.getTime()-n.getTime())/20*Gn,o=In(n,a*i),l=In(s,-a*i),h=(l.getTime()-o.getTime())/this.clientWidth;if(h<31536e6&&h>.1){let e=h*t*Gn;this.model.set(In(o,e),In(l,e))}}get clientWidth(){return this._canvasEl?this._canvasEl.width/this._canvasScale:0}get clientHeight(){return this._canvasEl?this._canvasEl.height/this._canvasScale:0}_resize(){this._frameEl&&(this._canvasEl.width=this._frameEl.clientWidth*this._canvasScale,this._canvasEl.height=this._frameEl.clientHeight*this._canvasScale,this._canvasEl.style.width=`${this._frameEl.clientWidth}px`,this._canvasEl.style.height=`${this._frameEl.clientHeight}px`)}getOffsetByTime(e){return(e-this.model.rangeStartTime)/this._millisecondsInPixel}remove(){super.remove(),this.model.stop()}_clearCanvas(){this._ctx.fillStyle=this.fillStyle,this._ctx.fillRect(0,0,this.clientWidth*this._canvasScale,this.clientHeight*this._canvasScale)}_drawCurrent(){let e=(this.model.currentTime-this.model.rangeStartTime)/this._millisecondsInPixel;this.model.current<this.model.rangeStart||this.model.current>this.model.rangeEnd?this._currentEl.style.display="none":(this._currentEl.style.display="block",this._currentEl.style.transform=`translateX(${e}px)`)}draw(){this._millisecondsInPixel=this.model.range/this.clientWidth;let e=function(e){for(let t=0,i=Hn.length;t<i;t++)if(Hn[t][0]>e)return Hn[t-1]}(this._minWidth*this._millisecondsInPixel*Gn);if(e){this._clearCanvas();let i=1e3*e[0],r=i/this._millisecondsInPixel,n=e[1],s=(t=this.model.rangeStartTime)-t%i,a=e[0]<1,o=e[0]<86400;for(let e=s,t=this.model.rangeEndTime+i;e<t;e+=i){let t=this.getOffsetByTime(e);t>=0&&t<=this.clientWidth*this._canvasScale&&Dn(this._ctx,t*this._canvasScale,10*this._canvasScale,2*this._canvasScale,jn);for(let e=1;e<n;e++){let i=t+e*(r/n);i>=0&&i<=this.clientWidth*this._canvasScale&&Dn(this._ctx,i*this._canvasScale,5*this._canvasScale,1*this._canvasScale,jn)}Nn(this._ctx,Fn(new Date(e),o,a),t*this._canvasScale,26*this._canvasScale,"24px monospace","#bfbfbf","center")}this._drawCurrent()}var t}}function qn(e,t){const i=new Date(e);return i.setHours(i.getHours()+t),i}var Zn=Object.freeze({__proto__:null,CompassButton:St,Control:Mt,DebugInfo:class extends Mt{constructor(e={}){e.name&&""!==e.name||(e.name="DebugInfo"),super(e),this.el=null,this._watch=e.watch||[],this._toggleBtn=new It({classList:["og-map-button","og-debuginfo_button"],icon:'<?xml version="1.0" encoding="iso-8859-1"?>\n\x3c!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --\x3e\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n<svg fill="#000000" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" \n\t width="800px" height="800px" viewBox="0 0 932.179 932.179"\n\t xml:space="preserve">\n<g>\n\t<path d="M61.2,341.538c4.9,16.8,11.7,33,20.3,48.2l-24.5,30.9c-8,10.1-7.1,24.5,1.9,33.6l42.2,42.2c9.1,9.1,23.5,9.899,33.6,1.899\n\t\tl30.7-24.3c15.8,9.101,32.6,16.2,50.1,21.2l4.6,39.5c1.5,12.8,12.3,22.4,25.1,22.4h59.7c12.8,0,23.6-9.601,25.1-22.4l4.4-38.1\n\t\tc18.8-4.9,36.8-12.2,53.7-21.7l29.7,23.5c10.1,8,24.5,7.1,33.6-1.9l42.2-42.2c9.1-9.1,9.9-23.5,1.9-33.6l-23.1-29.3\n\t\tc9.6-16.601,17.1-34.3,22.1-52.8l35.6-4.1c12.801-1.5,22.4-12.3,22.4-25.1v-59.7c0-12.8-9.6-23.6-22.4-25.1l-35.1-4.1\n\t\tc-4.801-18.3-12-35.8-21.199-52.2l21.6-27.3c8-10.1,7.1-24.5-1.9-33.6l-42.1-42.1c-9.1-9.1-23.5-9.9-33.6-1.9l-26.5,21\n\t\tc-17.2-10.1-35.601-17.8-54.9-23l-4-34.3c-1.5-12.8-12.3-22.4-25.1-22.4h-59.7c-12.8,0-23.6,9.6-25.1,22.4l-4,34.3\n\t\tc-19.8,5.3-38.7,13.3-56.3,23.8l-27.5-21.8c-10.1-8-24.5-7.1-33.6,1.9l-42.2,42.2c-9.1,9.1-9.9,23.5-1.9,33.6l23,29.1\n\t\tc-9.2,16.6-16.2,34.3-20.8,52.7l-36.8,4.2c-12.8,1.5-22.4,12.3-22.4,25.1v59.7c0,12.8,9.6,23.6,22.4,25.1L61.2,341.538z\n\t\t M277.5,180.038c54.4,0,98.7,44.3,98.7,98.7s-44.3,98.7-98.7,98.7c-54.399,0-98.7-44.3-98.7-98.7S223.1,180.038,277.5,180.038z"/>\n\t<path d="M867.699,356.238l-31.5-26.6c-9.699-8.2-24-7.8-33.199,0.9l-17.4,16.3c-14.699-7.1-30.299-12.1-46.4-15l-4.898-24\n\t\tc-2.5-12.4-14-21-26.602-20l-41.1,3.5c-12.6,1.1-22.5,11.4-22.9,24.1l-0.799,24.4c-15.801,5.7-30.701,13.5-44.301,23.3\n\t\tl-20.799-13.8c-10.602-7-24.701-5-32.9,4.7l-26.6,31.7c-8.201,9.7-7.801,24,0.898,33.2l18.201,19.399\n\t\tc-6.301,14.2-10.801,29.101-13.4,44.4l-26,5.3c-12.4,2.5-21,14-20,26.601l3.5,41.1c1.1,12.6,11.4,22.5,24.1,22.9l28.1,0.899\n\t\tc5.102,13.4,11.801,26.101,19.9,38l-15.699,23.7c-7,10.6-5,24.7,4.699,32.9l31.5,26.6c9.701,8.2,24,7.8,33.201-0.9l20.6-19.3\n\t\tc13.5,6.3,27.699,11,42.299,13.8l5.701,28.2c2.5,12.4,14,21,26.6,20l41.1-3.5c12.6-1.1,22.5-11.399,22.9-24.1l0.9-27.601\n\t\tc15-5.3,29.199-12.5,42.299-21.399l22.701,15c10.6,7,24.699,5,32.9-4.7l26.6-31.5c8.199-9.7,7.799-24-0.9-33.2l-18.301-19.399\n\t\tc6.701-14.2,11.602-29.2,14.4-44.601l25-5.1c12.4-2.5,21-14,20-26.601l-3.5-41.1c-1.1-12.6-11.4-22.5-24.1-22.9l-25.1-0.8\n\t\tc-5.201-14.6-12.201-28.399-20.9-41.2l13.699-20.6C879.4,378.638,877.4,364.438,867.699,356.238z M712.801,593.837\n\t\tc-44.4,3.801-83.602-29.3-87.301-73.699c-3.801-44.4,29.301-83.601,73.699-87.301c44.4-3.8,83.602,29.301,87.301,73.7\n\t\tC790.301,550.938,757.199,590.138,712.801,593.837z"/>\n\t<path d="M205,704.438c-12.6,1.3-22.3,11.899-22.4,24.6l-0.3,25.3c-0.2,12.7,9.2,23.5,21.8,25.101l18.6,2.399\n\t\tc3.1,11.301,7.5,22.101,13.2,32.301l-12,14.8c-8,9.899-7.4,24.1,1.5,33.2l17.7,18.1c8.9,9.1,23.1,10.1,33.2,2.3l14.899-11.5\n\t\tc10.5,6.2,21.601,11.101,33.2,14.5l2,19.2c1.3,12.6,11.9,22.3,24.6,22.4l25.301,0.3c12.699,0.2,23.5-9.2,25.1-21.8l2.3-18.2\n\t\tc12.601-3.101,24.601-7.8,36-14l14,11.3c9.9,8,24.101,7.4,33.201-1.5l18.1-17.7c9.1-8.899,10.1-23.1,2.301-33.2L496.6,818.438\n\t\tc6.6-11,11.701-22.7,15.201-35l16.6-1.7c12.6-1.3,22.299-11.9,22.4-24.6l0.299-25.301c0.201-12.699-9.199-23.5-21.799-25.1\n\t\tl-16.201-2.1c-3.1-12.2-7.699-24-13.699-35l10.1-12.4c8-9.9,7.4-24.1-1.5-33.2l-17.699-18.1c-8.9-9.101-23.102-10.101-33.201-2.3\n\t\tl-12.101,9.3c-11.399-6.9-23.6-12.2-36.399-15.8l-1.601-15.7c-1.3-12.601-11.899-22.3-24.6-22.4l-25.3-0.3\n\t\tc-12.7-0.2-23.5,9.2-25.101,21.8l-2,15.601c-13.199,3.399-25.899,8.6-37.699,15.399l-12.5-10.2c-9.9-8-24.101-7.399-33.201,1.5\n\t\tl-18.2,17.801c-9.1,8.899-10.1,23.1-2.3,33.199l10.7,13.801c-6.2,11-11.1,22.699-14.3,35L205,704.438z M368.3,675.837\n\t\tc36.3,0.4,65.399,30.301,65,66.601c-0.4,36.3-30.301,65.399-66.601,65c-36.3-0.4-65.399-30.3-65-66.601\n\t\tC302.1,704.538,332,675.438,368.3,675.837z"/>\n</g>\n</svg>'}),this._dialog=new Rt({title:"Debug Info",visible:!1,useHide:!0,top:120,left:60,width:480}),this._dialog.events.on("visibility",(e=>{this._toggleBtn.setActive(e)})),this._canvasTiles=new jt("Tile grid",{visibility:!0,isBaseLayer:!1,drawTile:function(e,t){let i,r=document.createElement("canvas"),n=r.getContext("2d");if(r.width=256,r.height=256,n.clearRect(0,0,r.width,r.height),n.beginPath(),n.rect(0,0,r.width,r.height),n.lineWidth=2,n.strokeStyle="black",n.stroke(),e.segment.isPole){let t=e.segment.getExtentLonLat();n.fillStyle="black",n.font="normal 29px Verdana",n.textAlign="center",n.fillText(`${t.northEast.lon.toFixed(3)} ${t.northEast.lat.toFixed(3)}`,r.width/2,r.height/2+20),n.fillText(`${t.southWest.lon.toFixed(3)} ${t.southWest.lat.toFixed(3)}`,r.width/2,r.height/2-20)}else i=e.segment.tileZoom>14?"26":"32",n.fillStyle="black",n.font="normal "+i+"px Verdana",n.textAlign="center",n.fillText(e.segment.tileX+","+e.segment.tileY+","+e.segment.tileZoom,r.width/2,r.height/2);t(r)}})}addWatches(e){for(let t=0;t<e.length;t++)this.addWatch(e[t])}addWatch(e){this._watch.push(e);let t=document.createElement("div");t.classList.add("og-watch-line"),t.innerHTML=`<div class="og-watch-label">${e.label}</div><div class="og-watch-value"></div>`,e.valEl=t.querySelector(".og-watch-value"),this.el.appendChild(t)}oninit(){this._toggleBtn.appendTo(this.renderer.div),this._dialog.appendTo(this.renderer.div),this._toggleBtn.events.on("change",(e=>{this._dialog.setVisibility(e)})),this.el=document.createElement("div"),this.el.className="og-debug-info";let e=document.createElement("div");e.classList.add("og-debuginfo_controls"),this.el.appendChild(e);let t=this._watch;this._watch=[];for(let e=0;e<t.length;e++)this.addWatch(t[e]);this._dialog.container?.appendChild(this.el),this.renderer.events.on("draw",this._frame,this);let i=this.planet;i&&this.addWatches([{label:"Nodes count",frame:()=>i._renderedNodes.length},{label:"createdNodes",frame:()=>i._createdNodesCount},{label:"indexesCache",frame:()=>i._indexesCacheToRemoveCounter},{label:"distBeforeMemClear",frame:()=>Math.round(i._distBeforeMemClear)},{label:"maxZoom/minZoom",frame:()=>i.maxCurrZoom+" / "+i?.minCurrZoom},{label:"viewExtent",frame:()=>i.getViewExtent().toString()},{label:"height/alt (km)",frame:()=>`<div style="width:190px">${(i.camera._lonLat.height/1e3).toFixed(2)+" / "+(i.camera.getAltitude()/1e3).toFixed(2)}</div>`},{label:"cam.slope",frame:()=>i.camera.slope.toFixed(3)},{label:"lodSize",frame:()=>Math.round(i.lodSize)},{label:"deltaTime/FPS",frame:()=>`<div style="width:70px"><div style="width:20px; float: left;">\n ${Math.round(i.renderer.handler.deltaTime)}\n </div> <div style="float: left">\n ${Math.round(1e3/i.renderer.handler.deltaTime)}\n </div></div>`},{label:"-------------------------"},{label:"_renderCompleted / renderCompletedActivated",frame:()=>`${i._renderCompleted} / ${i._renderCompletedActivated}`},{label:"_terrainCompleted / terrainCompletedActivated",frame:()=>`${i._terrainCompleted} / ${i._terrainCompletedActivated}`},{label:"PlainWorker",frame:()=>i._plainSegmentWorker.pendingQueue.length},{label:"TileLoader",frame:()=>`${i._tileLoader.loading} ${i._tileLoader.queue.length}`},{label:"TerrainLoader",frame:()=>i.terrain&&!i.terrain.isEmpty?`${i.terrain.loader.loading} ${i.terrain.loader.queue.length}`:""},{label:"TerrainWorker",frame:()=>i._terrainWorker.pendingQueue.length},{label:"NormalMapCreator",frame:()=>i._normalMapCreator.queueSize},{label:"VectorTileCreator",frame:()=>i._vectorTileCreator.queueSize}]);let r=new It({classList:["og-debuginfo_controls-button"],icon:'<?xml version="1.0" encoding="utf-8"?>\n\x3c!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --\x3e\n<svg fill="#000000" width="800px" height="800px" viewBox="-7.5 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg">\n<title>lock</title>\n<path d="M14.625 15.156h2.094c0.281 0 0.5 0.25 0.5 0.531v11c0 0.281-0.219 0.5-0.5 0.5h-16.219c-0.281 0-0.5-0.219-0.5-0.5v-11c0-0.281 0.219-0.531 0.5-0.531h2.031v-5.125c0-2.875 1.844-5.25 4.688-5.25h2.688c2.875 0 4.719 2.375 4.719 5.25v5.125zM5.188 15.156h6.813v-4.875c0-1.594-1.313-2.938-2.938-2.938h-0.969c-1.594 0-2.906 1.344-2.906 2.938v4.875zM7.156 24h2.906l-0.719-3.156c0.5-0.25 0.844-0.781 0.844-1.375 0-0.906-0.719-1.594-1.594-1.594s-1.563 0.688-1.563 1.594c0 0.594 0.344 1.125 0.844 1.375z"></path>\n</svg>',title:"Lock/Unlock quad tree"});r.appendTo(e),r.events.on("change",(e=>{e?i.lockQuadTree():i.unlockQuadTree()}));let n=new It({classList:["og-debuginfo_controls-button"],icon:'<?xml version="1.0"?>\n<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">\n <path d="M 4 4 L 4 8 L 8 8 L 8 4 L 4 4 z M 10 4 L 10 8 L 14 8 L 14 4 L 10 4 z M 16 4 L 16 8 L 20 8 L 20 4 L 16 4 z M 4 10 L 4 14 L 8 14 L 8 10 L 4 10 z M 10 10 L 10 14 L 14 14 L 14 10 L 10 10 z M 16 10 L 16 14 L 20 14 L 20 10 L 16 10 z M 4 16 L 4 20 L 8 20 L 8 16 L 4 16 z M 10 16 L 10 20 L 14 20 L 14 16 L 10 16 z M 16 16 L 16 20 L 20 20 L 20 16 L 16 16 z"/>\n</svg>',title:"Show/Hide grid"});n.appendTo(e),n.events.on("change",(e=>{e?this.planet.addLayer(this._canvasTiles):this._canvasTiles.remove()}))}_frame(){for(let e=0;e<this._watch.length;e++){let t=this._watch[e];t.valEl.innerHTML=t.frame?String(t.frame()):""}}},DrawingControl:Hr,DrawingSwitcher:class extends Mt{constructor(e={}){super({name:"DrawingSwitcher",...e}),this.drawingControl=new Hr}oninit(){this.planet.addControl(this.drawingControl),this._createMenu()}onactivate(){this.drawingControl.activate()}ondeactivate(){this.drawingControl.deactivate()}_createMenu(){let e=new It({classList:["og-map-button","og-drawing-default_button"],icon:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M4 0l16 12.279-6.951 1.17 4.325 8.817-3.596 1.734-4.35-8.879-5.428 4.702z"/></svg>',name:"default",isActive:!0}),t=new It({classList:["og-map-button","og-drawing-polygon_button"],icon:'<?xml version="1.0" encoding="utf-8"?>\n\x3c!-- Generator: Adobe Illustrator 24.1.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) --\x3e\n<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\n\t viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">\n<g>\n\t<path d="M926.03,321.16c-16.02,0-31.11,3.94-44.48,10.79l-263.43-191.4c2.69-8.94,4.18-18.4,4.18-28.2\n\t\tc0-54.02-43.95-97.97-97.97-97.97c-54.03,0-97.98,43.95-97.98,97.97c0,9.81,1.49,19.27,4.18,28.21L155.75,340.18\n\t\tc-16.22-11.91-36.16-19.03-57.78-19.03C43.95,321.16,0,365.11,0,419.13c0,52.58,41.67,95.5,93.71,97.75l102.63,315.86\n\t\tc-24.28,17.85-40.13,46.52-40.13,78.9c0,54.02,43.95,97.98,97.98,97.98c37.54,0,70.18-21.25,86.62-52.34h367.26\n\t\tc16.44,31.08,49.08,52.34,86.63,52.34c54.03,0,97.98-43.95,97.98-97.98c0-32.46-15.94-61.21-40.33-79.05l104.11-320.4\n\t\tc39.15-12.84,67.54-49.68,67.54-93.07C1024,365.11,980.05,321.16,926.03,321.16z M828.05,911.65c0,8.5-3.3,16.19-8.55,22.09\n\t\tc-6.11,6.85-14.9,11.26-24.79,11.26c-13.65,0-25.37-8.26-30.52-20.02c-1.79-4.09-2.82-8.58-2.82-13.33\n\t\tc0-18.39,14.95-33.35,33.34-33.35c2.93,0,5.72,0.5,8.43,1.21c13.27,3.49,23.21,14.91,24.59,28.9\n\t\tC827.83,909.5,828.05,910.54,828.05,911.65z M790.48,813.89c-45.63,1.96-83.27,35.16-91.87,78.77H350.28\n\t\tc-8.62-43.69-46.38-76.93-92.11-78.79L155.59,498.19c24.41-17.84,40.36-46.59,40.36-79.06c0-8.9-1.3-17.49-3.53-25.7L468.57,192.8\n\t\tc15.84,11.01,35.05,17.52,55.76,17.52c20.71,0,39.92-6.5,55.76-17.52l256.56,186.4c-5.48,12.21-8.59,25.7-8.59,39.93\n\t\tc0,41.02,25.36,76.17,61.21,90.75L790.48,813.89z M254.19,945c-10.11,0-19.07-4.62-25.19-11.75c-5.01-5.84-8.15-13.32-8.15-21.6\n\t\tc0-0.91,0.2-1.76,0.27-2.66c1.14-14.18,11.08-25.8,24.43-29.41c2.78-0.75,5.64-1.28,8.65-1.28c18.38,0,33.33,14.96,33.33,33.35\n\t\tc0,4.74-1.03,9.24-2.82,13.33C279.55,936.74,267.83,945,254.19,945z M64.88,421.49c-0.06-0.79-0.24-1.55-0.24-2.35\n\t\tc0-16.41,11.93-30.01,27.55-32.76c1.89-0.33,3.8-0.58,5.78-0.58c11.94,0,22.35,6.36,28.24,15.81c3.18,5.11,5.11,11.09,5.11,17.53\n\t\tc0,15.47-10.63,28.39-24.94,32.14c-2.7,0.71-5.48,1.2-8.4,1.2C80.4,452.47,66.11,438.76,64.88,421.49z M549.41,90.62\n\t\tc5.07,5.85,8.25,13.39,8.25,21.72c0,7.32-2.44,14.03-6.45,19.54c-6.07,8.33-15.82,13.81-26.88,13.81\n\t\tc-11.07,0-20.83-5.48-26.89-13.81c-4.01-5.51-6.45-12.22-6.45-19.54c0-8.33,3.17-15.86,8.24-21.71\n\t\tc6.12-7.07,15.04-11.64,25.1-11.64C534.38,79,543.29,83.57,549.41,90.62z M959.36,419.13c0,11.94-6.36,22.35-15.82,28.24\n\t\tc-5.1,3.18-11.07,5.1-17.52,5.1c-6.08,0-11.71-1.76-16.62-4.61c-9.71-5.64-16.33-15.94-16.64-27.89c-0.01-0.29-0.09-0.56-0.09-0.85\n\t\tc0-11.75,6.14-22.05,15.36-28c5.2-3.35,11.35-5.35,17.99-5.35C944.41,385.78,959.36,400.75,959.36,419.13z"/>\n</g>\n</svg>',name:"polygon"}),i=new It({classList:["og-map-button","og-drawing-linestring_button"],icon:'<?xml version="1.0" encoding="utf-8"?>\x3c!-- License: MIT. Made by Esri: https://github.com/Esri/calcite-ui-icons --\x3e\n <svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M21 6h.046l-5.25 9h-.944L10 9.455V7H7v2.926L1.862 18H0v3h3v-2.926L8.138 10h1.01L14 15.545V18h3v-3h-.046l5.25-9H24V3h-3zM8 8h1v1H8zM2 20H1v-1h1zm14-3h-1v-1h1zm7-13v1h-1V4z"/></svg>',name:"linestring"});new qt({buttons:[e,t,i]}).events.on("change",(e=>{switch(this.drawingControl.deactivate(),e.name){case"polygon":this.drawingControl.activatePolygonDrawing();break;case"linestring":this.drawingControl.activateLineStringDrawing()}})),e.appendTo(this.renderer.div),t.appendTo(this.renderer.div),i.appendTo(this.renderer.div)}},EarthCoordinates:Kr,EarthNavigation:Jr,GeoImageDragControl:class extends Mt{constructor(e={}){super(e),this._cornerIndex=-1,this._catchCorner=!1,this._toggleBtn=new It({classList:["og-map-button","og-geoimagegrag_button"],icon:'<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M16 13l6.964 4.062-2.973.85 2.125 3.681-1.732 1-2.125-3.68-2.223 2.15L16 13zm-2-7h2v2h5a1 1 0 0 1 1 1v4h-2v-3H10v10h4v2H9a1 1 0 0 1-1-1v-5H6v-2h2V9a1 1 0 0 1 1-1h5V6zM4 14v2H2v-2h2zm0-4v2H2v-2h2zm0-4v2H2V6h2zm0-4v2H2V2h2zm4 0v2H6V2h2zm4 0v2h-2V2h2zm4 0v2h-2V2h2z" fill="#000"/></svg>'})}oninit(){this._toggleBtn.appendTo(this.renderer.div),this.planet.events.on("layeradd",(e=>{this.isActive()&&this._bindLayer(e)}),this),this._toggleBtn.events.on("change",(e=>{e?this.activate():this.deactivate()}))}onactivate(){super.onactivate();const e=this.planet;for(let t=0;t<e.layers.length;t++)this._bindLayer(e.layers[t])}ondeactivate(){super.ondeactivate();const e=this.planet;for(let t=0;t<e.layers.length;t++)this._unbindLayer(e.layers[t])}_bindLayer(e){e instanceof tn&&(e.events.on("mousemove",this._onMouseMove,this),e.events.on("mouseleave",this._onMouseLeave,this),e.events.on("ldown",this._onLDown,this),e.events.on("lup",this._onLUp,this))}_unbindLayer(e){e instanceof tn&&(e.events.off("mousemove",this._onMouseMove),e.events.off("mouseleave",this._onMouseLeave),e.events.off("ldown",this._onLDown),e.events.off("lup",this._onLUp))}_onLUp(e){this._catchCorner=!1,e.renderer.controls.mouseNavigation.activate()}_onLDown(e){-1!==this._cornerIndex&&(this._catchCorner=!0,e.renderer.controls.mouseNavigation.deactivate())}_onMouseLeave(){document.body.style.cursor="auto"}_onMouseMove(e){let t=e.pickingObject;const i=this.planet;if(this._catchCorner){let r=t.getCornersLonLat();r[this._cornerIndex]=i.getLonLatFromPixelTerrain(e),t.setCornersLonLat(r)}else{this._cornerIndex=-1;for(let r=0;r<t._cornersWgs84.length;r++){let n=i.getLonLatFromPixelTerrain(e);if(n&&i.ellipsoid.getGreatCircleDistance(t._cornersWgs84[r],n)/i.getDistanceFromPixel(e)<=.05){this._cornerIndex=r,document.body.style.cursor="move";break}document.body.style.cursor="auto"}}}},HeightRuler:wn,KeyboardNavigation:class extends Mt{constructor(e={}){e=e||{},super({name:"KeyboardNavigation",...e}),this.step=e.step||250}onactivate(){let e=this.renderer;e.events.on("keypress",rn.KEY_PGUP,this.onCameraMoveForward,this),e.events.on("keypress",rn.KEY_PGDN,this.onCameraMoveBackward,this),e.events.on("keypress",rn.KEY_PLUS,this.onCameraMoveForward,this),e.events.on("keypress",rn.KEY_EQUALS,this.onCameraMoveForward,this),e.events.on("keypress",rn.KEY_MINUS,this.onCameraMoveBackward,this),e.events.on("keypress",rn.KEY_W,this.onCameraMoveForward,this),e.events.on("keypress",rn.KEY_S,this.onCameraMoveBackward,this),e.events.on("keypress",rn.KEY_A,this.onCameraStrifeLeft,this),e.events.on("keypress",rn.KEY_D,this.onCameraStrifeRight,this),e.events.on("keypress",rn.KEY_UP,this.onCameraLookUp,this),e.events.on("keypress",rn.KEY_DOWN,this.onCameraLookDown,this),e.events.on("keypress",rn.KEY_LEFT,this.onCameraLookLeft,this),e.events.on("keypress",rn.KEY_RIGHT,this.onCameraLookRight,this),e.events.on("keypress",rn.KEY_Q,this.onCameraRollLeft,this),e.events.on("keypress",rn.KEY_E,this.onCameraRollRight,this),e.events.on("keypress",rn.KEY_N,this.onCameraRollNorth,this)}ondeactivate(){let e=this.renderer;e.events.off("keypress",rn.KEY_PGUP,this.onCameraMoveForward),e.events.off("keypress",rn.KEY_PGDN,this.onCameraMoveBackward),e.events.off("keypress",rn.KEY_PLUS,this.onCameraMoveForward),e.events.off("keypress",rn.KEY_EQUALS,this.onCameraMoveForward),e.events.off("keypress",rn.KEY_MINUS,this.onCameraMoveBackward),e.events.off("keypress",rn.KEY_W,this.onCameraMoveForward),e.events.off("keypress",rn.KEY_S,this.onCameraMoveBackward),e.events.off("keypress",rn.KEY_A,this.onCameraStrifeLeft),e.events.off("keypress",rn.KEY_D,this.onCameraStrifeRight),e.events.off("keypress",rn.KEY_UP,this.onCameraLookUp),e.events.off("keypress",rn.KEY_DOWN,this.onCameraLookDown),e.events.off("keypress",rn.KEY_LEFT,this.onCameraLookLeft),e.events.off("keypress",rn.KEY_RIGHT,this.onCameraLookRight),e.events.off("keypress",rn.KEY_Q,this.onCameraRollLeft),e.events.off("keypress",rn.KEY_E,this.onCameraRollRight),e.events.off("keypress",rn.KEY_N,this.onCameraRollNorth)}oninit(){this.activate()}onCameraMoveForward(){let e=this.planet.camera;e.slide(0,0,-e._lonLat.height/this.step)}onCameraMoveBackward(){let e=this.planet.camera;e.slide(0,0,e._lonLat.height/this.step)}onCameraStrifeLeft(){let e=this.planet.camera;e.slide(-e._lonLat.height/this.step,0,0)}onCameraStrifeRight(){let e=this.planet.camera;e.slide(e._lonLat.height/this.step,0,0)}onCameraLookUp(){let e=this.planet.camera;this.renderer.events.isKeyPressed(rn.KEY_SHIFT)?e.pitch(15/this.renderer.handler.deltaTime):e.rotateVertical(e._lonLat.height/3e6*o,oe.ZERO)}onCameraLookDown(){let e=this.planet.camera;this.renderer.events.isKeyPressed(rn.KEY_SHIFT)?e.pitch(-15/this.renderer.handler.deltaTime):e.rotateVertical(-e._lonLat.height/3e6*o,oe.ZERO)}onCameraLookLeft(){let e=this.planet.camera;this.renderer.events.isKeyPressed(rn.KEY_SHIFT)?e.roll(15/this.renderer.handler.deltaTime):e.rotateHorizontal(e._lonLat.height/3e6*o)}onCameraLookRight(){let e=this.planet.camera;this.renderer.events.isKeyPressed(rn.KEY_SHIFT)?e.roll(-15/this.renderer.handler.deltaTime):e.rotateHorizontal(-e._lonLat.height/3e6*o)}onCameraTurnLeft(){let e=this.planet.camera;this.renderer.events.isKeyPressed(rn.KEY_SHIFT)?e.yaw(15/this.renderer.handler.deltaTime):e.rotateHorizontal(e._lonLat.height/3e6*o)}onCameraTurnRight(){let e=this.planet.camera;this.renderer.events.isKeyPressed(rn.KEY_SHIFT)?e.yaw(-15/this.renderer.handler.deltaTime):e.rotateHorizontal(-e._lonLat.height/3e6*o,!1,oe.ZERO)}onCameraRollNorth(){let e=this.planet.getCartesianFromPixelTerrain(this.renderer.handler.getCenter());e?this.planet.flyCartesian(e.normal().scaleTo(e.length()+e.distance(this.planet.camera.eye)),null,null,0,null,null,(()=>{this.planet.camera.look})):this.planet.flyCartesian(this.planet.camera.eye)}onCameraRollLeft(){this.planet.camera.roll(-15/this.renderer.handler.deltaTime)}onCameraRollRight(){this.planet.camera.roll(15/this.renderer.handler.deltaTime)}},LayerAnimation:class extends Mt{constructor(e={}){super(e),this._currVisibleIndex=0,this._onViewchange=()=>{this._timeoutStart=performance.now()},this._onVisibilityChange=e=>{e||this.pause()},this._onLayerLoadend=e=>{let t=this._layersArr[this._currentIndex];if(t&&t.isEqual(e)){let e=this._getFrameIndex(this._currentIndex)*this._frameSize,i=this._currentIndex;for(let t=e;t<i;t++){let e=this._layersArr[t];e.opacity=0,e.setVisibility(!1)}t.opacity=1;let r=this._layersArr[this._currVisibleIndex];if(r){r.opacity=0,r.setVisibility(!1);let e=this._getFrameIndex(this._currVisibleIndex);this._getFrameIndex(this._currentIndex)!==e&&this._removeFrameFromPlanet(e)}this.events.dispatch(this.events.idle,t)}},this.events=Tt(nn),this._name=e.name||`layerAnimation-${this.__id}`,this._layersArr=e.layers?[].concat(e.layers):[],this._currentIndex=-1,this._playInterval=e.playInterval||120,this._playIntervalHandler=-1,this._playIndex=0,this._frameSize=e.frameSize||50,this.repeat=null==e.repeat||e.repeat,this.skipTimeout=e.skipTimeout||5e3,this._timeoutStart=0}_getFramesNum(){return Math.ceil(this._layersArr.length/this._frameSize)}_setFrame(e){for(let t=0,i=this._getFramesNum();t<i;t++)t!==e?this._removeFrameFromPlanet(t):this._appendFrameToPlanet(t)}_getFrameIndex(e){return Math.floor(e/this._frameSize)}_appendFrameToPlanet(e){if(this.planet){let t=e*this._frameSize,i=t+this._frameSize;for(let e=t,r=i>this._layersArr.length?this._layersArr.length:i;e<r;e++)this.planet.addLayer(this._layersArr[e])}}_removeFrameFromPlanet(e){if(this.planet){let t=e*this._frameSize,i=t+this._frameSize;for(let e=t,r=i>this._layersArr.length?this._layersArr.length:i;e<r;e++)this._layersArr[e].abortLoading(),this._layersArr[e].remove(),this._layersArr[e].setVisibility(!1)}}oninit(){super.oninit(),this.onactivate(),this._initLayers(),this.planet.events.on("layerloadend",this._onLayerLoadend),this._setCurrentIndexAsync(0,!1,!0)}onactivate(){super.onactivate(),this.planet.camera.events.on("viewchange",this._onViewchange),this.planet.renderer.handler.events.on("visibilitychange",this._onVisibilityChange)}ondeactivate(){super.ondeactivate(),this.planet.camera.events.off("viewchange",this._onViewchange);for(let e=0;e<this._layersArr.length;e++)this._layersArr[e].setVisibility(!1);this.planet.events.off("layerloadend",this._onLayerLoadend),this.planet.renderer.handler.events.off("visibilitychange",this._onVisibilityChange)}clear(){this.stop(),this._currentIndex=-1,this._currVisibleIndex=-1;let e=this._layersArr;this._layersArr=[];for(let t=0;t<e.length;t++)e[t].remove()}_initLayers(){if(this.planet){for(let e=0,t=this._layersArr.length;e<t;e++){let t=this._layersArr[e];t.setVisibility(!1),t.setBaseLayer(!1),t.opacity=0}this._appendFrameToPlanet(0)}}setLayers(e){this.clear(),this._layersArr=[].concat(e),this._initLayers()}appendLayer(e){this._layersArr.push(e),e.setVisibility(!1),e.setBaseLayer(!1),e.opacity=0,this.planet?.addLayer(e)}get isIdle(){let e=this._layersArr[this._currentIndex];return e&&e.isIdle||!e}get playInterval(){return this._playInterval}set playInterval(e){e!==this._playInterval&&(this._playInterval=e,this.isPlaying&&(this.pause(),this.play()))}get isPlaying(){return-1!==this._playIntervalHandler}get layers(){return this._layersArr}_checkEnd(){this._playIndex>this._layersArr.length&&(this.repeat?this._playIndex=0:this.pause())}play(){this.isPlaying||(this._currentIndex>=this._layersArr.length-1&&this.stop(),this._timeoutStart=performance.now(),this._playIntervalHandler=setInterval((()=>{this._checkEnd(),this._setCurrentIndexAsync(this._playIndex,!1,!1),requestAnimationFrame((()=>{(this.isIdle||performance.now()-this._timeoutStart>this.skipTimeout)&&(this._playIndex++,this._timeoutStart=performance.now())}))}),this._playInterval),this.events.dispatch(this.events.play))}stop(){this._playIndex>0&&(this._clearInterval(),this._playIndex=0,this.setCurrentIndex(0),this.events.dispatch(this.events.stop))}pause(){this.isPlaying&&(this._clearInterval(),this.events.dispatch(this.events.pause))}_clearInterval(){clearInterval(this._playIntervalHandler),this._playIntervalHandler=-1}setCurrentIndex(e,t=!1){this._setCurrentIndexAsync(e,!0,t)}_setCurrentIndexAsync(e,t=!1,i=!1){if(e!=this._currentIndex&&e>=0&&e<this._layersArr.length){let r=this._currentIndex;this._currentIndex=e,this._playIndex=e;let n=this._getFrameIndex(r),s=this._getFrameIndex(this._currentIndex),a=this._layersArr[r],o=this._layersArr[e],l=s!=n;l&&this._appendFrameToPlanet(s),a&&(a.isIdle?this._currVisibleIndex=r:(a.opacity=0,a.setVisibility(!1))),o&&(o.opacity=0,o.setVisibility(!0),requestAnimationFrame((()=>{if(o.isIdle||t){o.opacity=1,l&&this._removeFrameFromPlanet(n),a&&(a.opacity=0,a.setVisibility(!1));let e=this._layersArr[this._currVisibleIndex];e&&(e.opacity=0,e.setVisibility(!1))}})),i||this.events.dispatch(this.events.change,this._currentIndex,r))}}},LayerSwitcher:class extends Mt{constructor(e={}){super({name:"LayerSwitcher",...e}),this.addNewLayer=e=>{},this.removeLayer=e=>{},this.dialog=new Rt({title:"Layer Switcher",top:15,useHide:!0,visible:!1,width:200}),this._menuBtn=new It({classList:["og-map-button","og-layerswitcher_button"],icon:'<?xml version="1.0" encoding="utf-8"?>\n\x3c!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon --\x3e\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">\n<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>\n<g><path d="M500,573.5c-3.2,0-6.5-0.6-9.5-1.9L25,375.6c-9.1-3.8-15-12.7-15-22.6s5.9-18.8,15-22.6l465.5-196c6.1-2.5,12.9-2.5,19,0l465.5,196c9.1,3.8,15,12.7,15,22.6s-5.9,18.8-15,22.6l-465.5,196C506.5,572.9,503.2,573.5,500,573.5L500,573.5z M97.6,353L500,522.4L902.4,353L500,183.6L97.6,353L97.6,353z"/><path d="M500,720.5c-3.2,0-6.5-0.6-9.5-1.9L25,522.6c-12.4-5.2-18.3-19.6-13.1-32.1c5.2-12.5,19.6-18.3,32.1-13.1l456,192l456-192c12.4-5.2,26.9,0.6,32.1,13.1s-0.6,26.9-13.1,32.1l-465.5,196C506.5,719.9,503.2,720.5,500,720.5L500,720.5z"/><path d="M500,867.5c-3.2,0-6.5-0.6-9.5-1.9L25,669.6c-12.4-5.2-18.3-19.6-13.1-32.1c5.2-12.5,19.6-18.3,32.1-13.1l456,192l456-192c12.4-5.2,26.9,0.6,32.1,13.1c5.2,12.5-0.6,26.8-13.1,32.1l-465.5,196C506.5,866.9,503.2,867.5,500,867.5L500,867.5z"/></g>\n</svg>'})}oninit(){this.dialog.appendTo(this.planet.renderer.div),this.dialog.setPosition(this.planet.renderer.div.clientWidth-this.dialog.width-67),this.dialog.events.on("visibility",(e=>{this._menuBtn.setActive(e)})),this.planet.events.on("layeradd",this.addNewLayer,this),this.planet.events.on("layerremove",this.removeLayer,this)}onactivate(){}ondeactivate(){this.dialog.hide()}},Lighting:class extends Mt{constructor(e={}){super(e),this._selectedLayer=null,this._toggleBtn=new It({classList:["og-map-button","og-lighting_button"],icon:'<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="256" height="256" viewBox="0 0 256 256" xml:space="preserve">\n\n<defs>\n</defs>\n<g style="stroke: none; stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; opacity: 1;" transform="translate(1.4065934065934016 1.4065934065934016) scale(2.81 2.81)" >\n\t<path d="M 45 68 c -12.682 0 -23 -10.317 -23 -23 c 0 -12.682 10.318 -23 23 -23 c 12.683 0 23 10.318 23 23 C 68 57.683 57.683 68 45 68 z" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill-rule: nonzero; opacity: 1;" transform=" matrix(1 0 0 1 0 0) " stroke-linecap="round" />\n\t<path d="M 45 17.556 c -1.657 0 -3 -1.343 -3 -3 V 3 c 0 -1.657 1.343 -3 3 -3 c 1.657 0 3 1.343 3 3 v 11.556 C 48 16.212 46.657 17.556 45 17.556 z" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill-rule: nonzero; opacity: 1;" transform=" matrix(1 0 0 1 0 0) " stroke-linecap="round" />\n\t<path d="M 45 90 c -1.657 0 -3 -1.343 -3 -3 V 75.444 c 0 -1.657 1.343 -3 3 -3 c 1.657 0 3 1.343 3 3 V 87 C 48 88.657 46.657 90 45 90 z" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill-rule: nonzero; opacity: 1;" transform=" matrix(1 0 0 1 0 0) " stroke-linecap="round" />\n\t<path d="M 14.556 48 H 3 c -1.657 0 -3 -1.343 -3 -3 c 0 -1.657 1.343 -3 3 -3 h 11.556 c 1.657 0 3 1.343 3 3 C 17.556 46.657 16.212 48 14.556 48 z" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill-rule: nonzero; opacity: 1;" transform=" matrix(1 0 0 1 0 0) " stroke-linecap="round" />\n\t<path d="M 87 48 H 75.444 c -1.657 0 -3 -1.343 -3 -3 c 0 -1.657 1.343 -3 3 -3 H 87 c 1.657 0 3 1.343 3 3 C 90 46.657 88.657 48 87 48 z" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill-rule: nonzero; opacity: 1;" transform=" matrix(1 0 0 1 0 0) " stroke-linecap="round" />\n\t<path d="M 66.527 26.473 c -0.768 0 -1.535 -0.293 -2.121 -0.878 c -1.172 -1.172 -1.172 -3.071 0 -4.243 l 8.171 -8.171 c 1.172 -1.172 3.07 -1.171 4.242 0 c 1.172 1.172 1.172 3.071 0 4.243 l -8.171 8.171 C 68.063 26.18 67.295 26.473 66.527 26.473 z" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill-rule: nonzero; opacity: 1;" transform=" matrix(1 0 0 1 0 0) " stroke-linecap="round" />\n\t<path d="M 15.302 77.698 c -0.768 0 -1.536 -0.293 -2.121 -0.879 c -1.172 -1.171 -1.172 -3.071 0 -4.242 l 8.171 -8.171 c 1.171 -1.172 3.071 -1.172 4.242 0 c 1.172 1.171 1.172 3.071 0 4.242 l -8.171 8.171 C 16.837 77.405 16.069 77.698 15.302 77.698 z" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill-rule: nonzero; opacity: 1;" transform=" matrix(1 0 0 1 0 0) " stroke-linecap="round" />\n\t<path d="M 23.473 26.473 c -0.768 0 -1.536 -0.293 -2.121 -0.878 l -8.171 -8.171 c -1.172 -1.172 -1.172 -3.071 0 -4.243 c 1.172 -1.172 3.072 -1.171 4.243 0 l 8.171 8.171 c 1.172 1.172 1.172 3.071 0 4.243 C 25.008 26.18 24.24 26.473 23.473 26.473 z" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill-rule: nonzero; opacity: 1;" transform=" matrix(1 0 0 1 0 0) " stroke-linecap="round" />\n\t<path d="M 74.698 77.698 c -0.768 0 -1.535 -0.293 -2.121 -0.879 l -8.171 -8.171 c -1.172 -1.171 -1.172 -3.071 0 -4.242 c 1.172 -1.172 3.07 -1.172 4.242 0 l 8.171 8.171 c 1.172 1.171 1.172 3.071 0 4.242 C 76.233 77.405 75.466 77.698 74.698 77.698 z" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill-rule: nonzero; opacity: 1;" transform=" matrix(1 0 0 1 0 0) " stroke-linecap="round" />\n</g>\n</svg>'}),this._dialog=new Rt({title:"Lighting Parameters",visible:!1,useHide:!0,top:60,left:60,width:600}),this._dialog.events.on("visibility",(e=>{this._toggleBtn.setActive(e)})),this._panel=new At({template:'<div class="og-lighing">\n\n <div class="og-option">\n <div class="og-suncontrol"></div>\n </div> \n \n <div class="og-option og-atmosphere-opacity">\n </div>\n \n <div class="og-lighting-emptyline"></div>\n\n <div class="og-option og-gamma"></div> \n <div class="og-option og-exposure"></div>\n \n <div class="og-lighting-emptyline"></div>\n\n <div class="og-option">\n <div class="og-layers">\n <div class="og-caption">Select layer:</div>\n <select id="layers"></select>\n </div>\n </div>\n\n <div class="og-option og-opacity">\n </div>\n \n <div class="og-option og-night">\n </div>\n \n <div class="og-lighting-emptyline"></div>\n\n <div class="og-option og-diffuse">\n </div>\n \n <div class="og-option og-ambient">\n </div>\n\n <div class="og-option og-specular">\n </div> \n\n </div>'}),this.$gamma=null,this.$exposure=null,this.$night=null,this.$opacity=null,this.$diffuse=null,this.$ambient=null,this.$specular=null,this.$atmosphereOpacity=null,this._atmosphereMaxOpacity=new an({label:"Max.opacity",max:5}),this._atmosphereMinOpacity=new an({label:"Min.opacity",max:5}),this._gamma=new an({label:"Gamma",max:5}),this._exposure=new an({label:"Exposure",max:5}),this._night=new an({label:"Nightlight",max:5}),this._opacity=new an({label:"Opacity",max:1}),this._diffuse_r=new an({label:"Diffuse R",max:5}),this._diffuse_g=new an({label:"Diffuse G",max:5}),this._diffuse_b=new an({label:"Diffuse B",max:5}),this._ambient_r=new an({label:"Ambient R",max:5}),this._ambient_g=new an({label:"Ambient G",max:5}),this._ambient_b=new an({label:"Ambient B",max:5}),this._specular_r=new an({label:"Specular R",max:.2}),this._specular_g=new an({label:"Specular G",max:.2}),this._specular_b=new an({label:"Specular B",max:.2}),this._shininess=new an({label:"Shininess",max:100})}bindLayer(e){this._selectedLayer=e,this._opacity.value=e.opacity,this._update()}oninit(){this._toggleBtn.appendTo(this.renderer.div),this._dialog.appendTo(this.renderer.div),this._panel.appendTo(this._dialog.container),this._panel.el&&(this.$atmosphereOpacity=this._panel.el.querySelector(".og-atmosphere-opacity"),this.$gamma=this._panel.el.querySelector(".og-option.og-gamma"),this.$exposure=this._panel.el.querySelector(".og-option.og-exposure"),this.$opacity=this._panel.el.querySelector(".og-option.og-opacity"),this.$diffuse=this._panel.el.querySelector(".og-option.og-diffuse"),this.$ambient=this._panel.el.querySelector(".og-option.og-ambient"),this.$specular=this._panel.el.querySelector(".og-option.og-specular"),this.$night=this._panel.el.querySelector(".og-option.og-night")),this._toggleBtn.events.on("change",(e=>{this._dialog.setVisibility(e)}));let e=this._dialog.select(".og-suncontrol"),t=new It({classList:["og-suncontrol-button"],isActive:!0,icon:'<?xml version="1.0" encoding="utf-8"?><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 122.88 70.41" style="enable-background:new 0 0 122.88 70.41" xml:space="preserve"><g><path d="M60.91,19.12c6.95,0,13.24,2.95,17.8,7.72c4.55,4.77,7.37,11.37,7.37,18.64c0,1.94-0.2,3.83-0.58,5.65h31.61 c2.1,0,2.62,1.16,2.62,2.59c0,1.43-0.52,2.59-2.62,2.59H7.09c-2.1,0-2.62-1.16-2.62-2.59c0-1.43,0.52-2.59,2.62-2.59h29.23 c-0.38-1.82-0.58-3.71-0.58-5.65c0-7.28,2.82-13.87,7.37-18.64C47.67,22.08,53.96,19.12,60.91,19.12L60.91,19.12L60.91,19.12z M63.4,70.41c-2.1,0-2.62-1.16-2.62-2.59s0.52-2.59,2.62-2.59h56.86c2.1,0,2.62,1.16,2.62,2.59s-0.52,2.59-2.62,2.59H63.4 L63.4,70.41z M2.62,70.41c-2.1,0-2.62-1.16-2.62-2.59s0.52-2.59,2.62-2.59h29.51c2.1,0,2.62,1.16,2.62,2.59s-0.52,2.59-2.62,2.59 H2.62L2.62,70.41z M38.39,9.46c-0.78-1.35-0.32-3.07,1.03-3.85c1.35-0.78,3.07-0.32,3.85,1.03l3.62,6.27 c0.78,1.35,0.32,3.07-1.03,3.85c-1.35,0.78-3.07,0.32-3.85-1.03L38.39,9.46L38.39,9.46L38.39,9.46z M58.67,2.83 c0-1.56,1.27-2.83,2.83-2.83c1.56,0,2.83,1.27,2.83,2.83v7.24c0,1.56-1.27,2.83-2.83,2.83c-1.56,0-2.83-1.26-2.83-2.83V2.83 L58.67,2.83L58.67,2.83z M79.56,7.23c0.77-1.35,2.49-1.81,3.84-1.04c1.35,0.77,1.81,2.49,1.04,3.84l-3.62,6.27 c-0.77,1.35-2.49,1.81-3.84,1.04c-1.35-0.77-1.81-2.49-1.04-3.84L79.56,7.23L79.56,7.23L79.56,7.23z M95.45,21.48 c1.35-0.78,3.07-0.32,3.85,1.03c0.78,1.35,0.32,3.07-1.03,3.85L92,29.98c-1.35,0.78-3.07,0.32-3.85-1.03 c-0.78-1.35-0.32-3.07,1.03-3.85L95.45,21.48L95.45,21.48L95.45,21.48z M102.08,41.76c1.56,0,2.83,1.27,2.83,2.83 c0,1.56-1.27,2.83-2.83,2.83h-7.24c-1.56,0-2.83-1.26-2.83-2.83s1.26-2.83,2.83-2.83H102.08L102.08,41.76L102.08,41.76z M19.74,46.25c-1.56,0-2.83-1.27-2.83-2.83c0-1.56,1.27-2.83,2.83-2.83h7.24c1.56,0,2.83,1.26,2.83,2.83s-1.27,2.83-2.83,2.83 H19.74L19.74,46.25L19.74,46.25z M24.14,25.35c-1.35-0.77-1.81-2.49-1.04-3.84c0.77-1.35,2.49-1.81,3.84-1.04l6.27,3.62 c1.35,0.77,1.81,2.49,1.04,3.84c-0.77,1.35-2.49,1.81-3.84,1.04L24.14,25.35L24.14,25.35L24.14,25.35z"/></g></svg>',title:"Star/stop the Sun from following the camera"});t.appendTo(e);let i=new It({classList:["og-suncontrol-button"],isActive:!0,icon:'<?xml version="1.0"?>\n<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">\n <path style="text-indent:0;text-align:start;line-height:normal;text-transform:none;block-progression:tb;-inkscape-font-specification:Sans" d="M 16 4 C 9.3844277 4 4 9.3844277 4 16 C 4 22.615572 9.3844277 28 16 28 C 22.615572 28 28 22.615572 28 16 C 28 9.3844277 22.615572 4 16 4 z M 16 6 C 16.389823 6 16.778223 6.0506339 17.15625 6.09375 C 18.631659 7.6568432 21 10.9245 21 16 C 21 21.0755 18.631659 24.343157 17.15625 25.90625 C 16.778223 25.949366 16.389823 26 16 26 C 10.465308 26 6 21.534692 6 16 C 6 10.465308 10.465308 6 16 6 z" overflow="visible" font-family="Sans"/>\n</svg>\n',title:"Activate/deactivate the Sun current time positioning"});i.appendTo(e),t.events.on("change",(e=>{const t=this.planet.renderer.controls.sun;e?t.start():t.stop()})),i.events.on("change",(e=>{const t=this.planet.renderer.controls.sun;e?t.activate():t.deactivate()}));let r=new It({classList:["og-suncontrol-button"],isActive:this.planet.lightEnabled,icon:'<?xml version="1.0" encoding="utf-8"?>\n\x3c!-- Generated by IcoMoon.io --\x3e\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" viewBox="0 0 512 512">\n<g>\n</g>\n\t<path d="M257.894 156.948c-53.258 0-96.42 43.561-96.42 97.26 0 53.719 43.161 97.249 96.42 97.249 53.197 0 96.379-43.53 96.379-97.25 0-53.698-43.182-97.26-96.379-97.26zM257.894 309.873c-30.464 0-55.163-24.945-55.163-55.665s24.699-55.624 55.163-55.624c30.423 0 55.101 24.904 55.101 55.624s-24.688 55.665-55.101 55.665z" fill="#000000" />\n\t<path d="M241.808 43.499h32.144v79.575h-32.144v-79.575z" fill="#000000" />\n\t<path d="M417.209 115.897l-22.723-22.917-55.757 56.279 22.723 22.907z" fill="#000000" />\n\t<path d="M389.468 238.407h78.899v32.389h-78.899v-32.389z" fill="#000000" />\n\t<path d="M396.012 416.86l22.723-22.917-55.767-56.259-22.712 22.897z" fill="#000000" />\n\t<path d="M242.473 388.915h32.144v79.575h-32.144v-79.575z" fill="#000000" />\n\t<path d="M96.266 396.073l22.722 22.938 55.778-56.289-22.692-22.928z" fill="#000000" />\n\t<path d="M43.633 240.537h78.879v32.43h-78.879v-32.43z" fill="#000000" />\n\t<path d="M115.394 93.051l-22.681 22.907 55.757 56.258 22.702-22.917z" fill="#000000" />\n</svg>',title:"Enable/disable planet lighting"});r.appendTo(e),r.events.on("change",(e=>{this.planet.lightEnabled=e}));let n=new It({classList:["og-suncontrol-button"],isActive:this.planet.atmosphereEnabled,icon:'<?xml version="1.0" encoding="utf-8"?>\x3c!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --\x3e\n<svg width="800px" height="800px" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path fill="#000000" d="M135.688 18.5c-6.798 74.842-23.842 85.39-107.907 59.656 84.85 52.022 73.57 64.954-6.843 96.938 87.743-10.27 103.29 4.89 70.75 87.594 17.805-27.56 32.5-44.498 46.282-54.47-11.813 28.26-18.345 59.274-18.345 91.813 0 84.184 43.71 157.96 109.656 200.376-41.624-43.834-67.686-102.7-67.686-167.875 0-134.923 109.45-244.405 244.375-244.405 30.92 0 60.76 5.762 88 16.25-38.584-26.87-85.517-42.625-136.064-42.625-55.257 0-106.14 18.802-146.562 50.375 4.627-18.783 17.39-38.073 41.03-60.906C190.18 90.942 153.53 95.634 135.69 18.5zm10.03 77.188c5.67.002 11.428 1.247 16.876 3.874 14.506 6.998 22.72 21.81 22 36.938-10.26 10.87-19.507 22.696-27.594 35.344-9.035 2.753-19.075 2.27-28.25-2.156-19.37-9.343-27.5-32.6-18.156-51.97 6.715-13.92 20.638-22.036 35.125-22.03z"/></svg>',title:"Enable/disable atmosphere scattering"});n.appendTo(e),this.planet.atmosphereEnabled?this.$atmosphereOpacity.style.display="block":this.$atmosphereOpacity.style.display="none",n.events.on("change",(e=>{this.planet.atmosphereEnabled=e,this.planet.atmosphereEnabled?this.$atmosphereOpacity.style.display="block":this.$atmosphereOpacity.style.display="none"})),this._atmosphereMaxOpacity.appendTo(this.$atmosphereOpacity),this._atmosphereMinOpacity.appendTo(this.$atmosphereOpacity),this._gamma.appendTo(this.$gamma),this._exposure.appendTo(this.$exposure),this._night.appendTo(this.$night),this._opacity.appendTo(this.$opacity),this._diffuse_r.appendTo(this.$diffuse),this._diffuse_g.appendTo(this.$diffuse),this._diffuse_b.appendTo(this.$diffuse),this._ambient_r.appendTo(this.$ambient),this._ambient_g.appendTo(this.$ambient),this._ambient_b.appendTo(this.$ambient),this._specular_r.appendTo(this.$specular),this._specular_g.appendTo(this.$specular),this._specular_b.appendTo(this.$specular),this._shininess.appendTo(this.$specular),this._atmosphereMinOpacity.value=this.planet.atmosphereMinOpacity,this._atmosphereMinOpacity.events.on("change",(e=>{this.planet.atmosphereMinOpacity=e})),this._gamma.value=this.planet.renderer.gamma,this._gamma.events.on("change",(e=>{this.planet.renderer.gamma=e})),this._panel.el.querySelector("#layers").addEventListener("change",(e=>{const t=this.planet.getLayerByName(e.target.value);t&&this.bindLayer(t)})),this._atmosphereMaxOpacity.value=this.planet.atmosphereMaxOpacity,this._atmosphereMaxOpacity.events.on("change",(e=>{this.planet.atmosphereMaxOpacity=e,this.planet.renderer.controls.Atmosphere.opacity=e})),this._exposure.value=this.planet.renderer.exposure,this._exposure.events.on("change",(e=>{this.planet.renderer.exposure=e})),this._night.events.on("change",(e=>{this._selectedLayer&&(this._selectedLayer.nightTextureCoefficient=e)})),this._opacity.events.on("change",(e=>{this._selectedLayer&&(this._selectedLayer.opacity=e)})),this._ambient_r.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._ambient&&(this._selectedLayer._ambient[0]=e)})),this._ambient_g.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._ambient&&(this._selectedLayer._ambient[1]=e)})),this._ambient_b.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._ambient&&(this._selectedLayer._ambient[2]=e)})),this._diffuse_r.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._diffuse&&(this._selectedLayer._diffuse[0]=e)})),this._diffuse_g.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._diffuse&&(this._selectedLayer._diffuse[1]=e)})),this._diffuse_b.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._diffuse&&(this._selectedLayer._diffuse[2]=e)})),this._specular_r.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._specular&&(this._selectedLayer._specular[0]=e)})),this._specular_g.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._specular&&(this._selectedLayer._specular[1]=e)})),this._specular_b.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._specular&&(this._selectedLayer._specular[2]=e)})),this._shininess.events.on("change",(e=>{this._selectedLayer&&this._selectedLayer._specular&&(this._selectedLayer._specular[3]=e)})),this.planet&&(this.planet.events.on("layeradd",this._onLayerAdd,this),this.planet.events.on("layerremove",this._onLayerRemove,this)),this._fetchLayers()}_update(){let e=this._selectedLayer;this._opacity.value=e&&e.opacity?e.opacity:0,this._night.value=e&&e.nightTextureCoefficient?e.nightTextureCoefficient:this.planet.nightTextureCoefficient;let t=e&&e._ambient?e._ambient:this.planet._ambient;this._ambient_r.value=t[0],this._ambient_g.value=t[1],this._ambient_b.value=t[2];let i=e&&e._diffuse?e._diffuse:this.planet._diffuse;this._diffuse_r.value=i[0],this._diffuse_g.value=i[1],this._diffuse_b.value=i[2];let r=e&&e._specular?e._specular:this.planet._specular;this._specular_r.value=r[0],this._specular_g.value=r[1],this._specular_b.value=r[2],this._shininess.value=r[3]}_fetchLayers(){if(this.planet)for(let e=0;e<this.planet.layers.length;e++)this._onLayerAdd(this.planet.layers[e])}_onLayerAdd(e){this.bindLayer(e);let t=document.createElement("option");t.value=e.name,t.innerText=e.name,this._panel.el.querySelector("#layers").appendChild(t),this._panel.el.querySelector("#layers").value=e.name}_onLayerRemove(e){}},MouseNavigation:hn,MouseWheelZoomControl:class extends Mt{constructor(e={}){super(e),this._name="MouseWheelZoomControl",this.grabbedPoint=new oe,this._eye0=new oe,this.pointOnEarth=new oe,this.earthUp=new oe,this.inertia=.007,this.grabbedSpheroid=new bt,this.planet=null,this.qRot=new ae,this.scaleRot=0,this.distDiff=.3,this.stepsCount=8,this.stepsForward=null,this.stepIndex=0,this._lmbDoubleClickActive=!0,this.minSlope=e.minSlope||.1,this._keyLock=new ln,this._deactivate=!1,this._move=0}oninit(){let e=document.createElement("div"),t=document.createElement("button"),i=document.createElement("button");e.className="ogZoomControl",t.className="ogZoomButton ogZoomIn",i.className="ogZoomButton ogZoomOut",e.appendChild(t),e.appendChild(i),this.renderer.div.appendChild(e),t.addEventListener("mousedown",(()=>this.zoomIn())),t.addEventListener("mouseup",(()=>this.stopZoom())),i.addEventListener("mousedown",(()=>this.zoomOut())),i.addEventListener("mouseup",(()=>this.stopZoom())),t.addEventListener("touchstart",(e=>{e.preventDefault(),this.zoomIn()})),t.addEventListener("touchend",(e=>{e.preventDefault(),this.stopZoom()})),t.addEventListener("touchcancel",(e=>{e.preventDefault(),this.stopZoom()})),i.addEventListener("touchstart",(e=>{e.preventDefault(),this.zoomOut()})),i.addEventListener("touchend",(e=>{e.preventDefault(),this.stopZoom()})),i.addEventListener("touchcancel",(e=>{e.preventDefault(),this.stopZoom()})),this.renderer.events.on("draw",this._draw,this)}zoomIn(){this.stepIndex||(this.planet.stopFlying(),this.stopRotation(),this._deactivate=!0,this.planet.layerLock.lock(this._keyLock),this.planet.terrainLock.lock(this._keyLock),this.planet._normalMapCreator.lock(this._keyLock),this.stepsForward=hn.getMovePointsFromPixelTerrain(this.planet.camera,this.planet,this.stepsCount,this.distDiff,this.renderer.handler.getCenter(),!0,null)||null,this.stepsForward&&(this.stepIndex=this.stepsCount))}zoomOut(){this.stepIndex||(this.planet.stopFlying(),this.stopRotation(),this._deactivate=!0,this.planet.layerLock.lock(this._keyLock),this.planet.terrainLock.lock(this._keyLock),this.planet._normalMapCreator.lock(this._keyLock),this.stepsForward=hn.getMovePointsFromPixelTerrain(this.planet.camera,this.planet,this.stepsCount,this.distDiff,this.renderer.handler.getCenter(),!1,null)||null,this.stepsForward&&(this.stepIndex=this.stepsCount))}stopRotation(){this.qRot.clear(),this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock)}stopZoom(){this._move=0,this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock)}_draw(){if(this._active){let e=this.renderer,t=this.planet.camera,i=t.eye.clone();if(this.stepIndex){e.controlsBag.scaleRot=1;let i=this.stepsForward[this.stepsCount-this.stepIndex--],r=t.maxAltitude+this.planet.ellipsoid.equatorialSize,n=t.minAltitude+this.planet.ellipsoid.equatorialSize;const s=i.eye.length();if(s>r||s<n)return;t.eye=i.eye,t._u=i.v,t._r=i.u,t._b=i.n,t.checkTerrainCollision(),t.update()}else this._deactivate&&(this._deactivate=!1,this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock));if(e.events.mouseState.leftButtonDown||!this.scaleRot)return;if(this.scaleRot-=this.inertia,this.scaleRot<=0)this.scaleRot=0;else{e.controlsBag.scaleRot=this.scaleRot;let i=this.qRot.slerp(ae.IDENTITY,1-this.scaleRot*this.scaleRot*this.scaleRot).normalize();i.x||i.y||i.z||(this.scaleRot=0),t.eye=i.mulVec3(t.eye),t._u=i.mulVec3(t._u),t._r=i.mulVec3(t._r),t._b=i.mulVec3(t._b),t.checkTerrainCollision(),t.update()}t.eye.distance(i)/t.getAltitude()>.01?(this.planet.layerLock.lock(this._keyLock),this.planet.terrainLock.lock(this._keyLock),this.planet._normalMapCreator.lock(this._keyLock)):(this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet._normalMapCreator.free(this._keyLock))}}},Ruler:pn,RulerSwitcher:class extends Mt{constructor(e={}){super({name:"RulerSwitcher",...e}),this.ruler=new wn({ignoreTerrain:e.ignoreTerrain})}oninit(){this.planet.addControl(this.ruler),this._createMenuBtn()}onactivate(){this.ruler.activate()}ondeactivate(){this.ruler.deactivate()}_createMenuBtn(){let e=new It({classList:["og-map-button","og-ruler_button"],icon:'<?xml version="1.0" encoding="iso-8859-1"?>\n\x3c!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --\x3e\n<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" \n\t viewBox="0 0 512 512" xml:space="preserve">\n<g>\n\t<g>\n\t\t<path d="M369.151,0L0.001,369.15L142.85,512l369.149-369.15L369.151,0z M47.286,369.15l10.908-10.908l47.782,47.782l23.642-23.642\n\t\t\tL81.837,334.6l10.909-10.909l23.711,23.711L140.1,323.76l-23.711-23.711l10.909-10.909l23.711,23.711l23.642-23.642\n\t\t\tl-23.711-23.711l10.909-10.909l47.782,47.782l23.642-23.642l-47.782-47.782l10.908-10.908l23.71,23.71l23.642-23.642l-23.71-23.71\n\t\t\tl10.908-10.908l23.711,23.711l23.642-23.642l-23.711-23.711l10.909-10.909l47.782,47.782l23.642-23.642l-47.782-47.782\n\t\t\tl10.908-10.908l23.71,23.711l23.642-23.642l-23.711-23.71L334.6,81.837l23.711,23.71l23.642-23.642l-23.711-23.712l10.908-10.908\n\t\t\tl95.564,95.564L142.85,464.714L47.286,369.15z"/>\n\t</g>\n</g>\n</svg>'});e.appendTo(this.renderer.div),e.events.on("change",(e=>{e?this.onactivate():this.ondeactivate()}))}},ScaleControl:Cn,Selection:class extends Mt{constructor(e={}){super(e),this._selectorScene=new Rn({name:`selectionScene:${this.__id}`,ignoreTerrain:e.ignoreTerrain,onSelect:e.onSelect,autoSelectionHide:e.autoSelectionHide}),this._toggleBtn=new It({classList:["og-map-button","og-selection_button"],icon:'<?xml version="1.0" encoding="utf-8"?>\x3c!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --\x3e\n<svg width="800px" height="800px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--gis" preserveAspectRatio="xMidYMid meet"><path d="M2.1 0v1.914H0v6h3V3h5.1V0h-6zm9 0v3h6V0h-6zm9 0v3h6V0h-6zm9 0v3h6V0h-6zm9 0v3h6V0h-6zm9 0v3h6V0h-6zm9 0v3h6V0h-6zm9 0v3h1.8v1.2h3V0h-4.8zm1.8 7.2v6h3v-6h-3zM0 10.913v6h3v-6H0zM66.9 16.2v6h3v-6h-3zM0 19.914v6h3v-6H0zM66.9 25.2v6h3v-6h-3zM0 28.914v6h3v-6H0zM66.9 34.2v6h3v-6h-3zM0 37.914v6h3v-6H0zM66.9 43.2v6h3v-6h-3zM0 46.914v6h3v-6H0zM66.9 52.2v6h3v-6h-3zM0 55.914v5.191h3.809v-3H3v-2.19H0zm6.809 2.191v3h6v-3h-6zm9 0v3h6v-3h-6zm9 0v3h6v-3h-6zm9 0v3h6v-3h-6zm9 0v3h6v-3h-6zm9 0v3h6v-3h-6zm9 0v3h6v-3h-6zm9.648 1.899a2.076 2.076 0 0 0-2.19 2.324l3.137 33.676c.2 1.635 2.135 2.399 3.397 1.34l6.623-5.371l2.969 5.142c1.707 2.958 4.417 3.684 7.375 1.977c2.957-1.708 3.684-4.417 1.976-7.375l-2.959-5.125l7.848-3.008c1.548-.564 1.855-2.62.539-3.611L71.576 60.416a2.073 2.073 0 0 0-1.119-.412z" fill="#000000"></path></svg>'})}set ignoreTerrain(e){this._selectorScene.ignoreTerrain=e}oninit(){this._toggleBtn.appendTo(this.renderer.div),this._toggleBtn.events.on("change",(e=>{e?this.activate():this.deactivate()})),this._selectorScene.bindPlanet(this.planet)}onactivate(){this.renderer.addNode(this._selectorScene)}ondeactivate(){this.renderer.removeNode(this._selectorScene)}},ShowFps:class extends Mt{constructor(e){super(e)}oninit(){let e=document.createElement("div");e.className="defaultText ",e.id="ogShowFpsControl",document.body.appendChild(e),this.renderer.events.on("draw",this._draw,this)}_draw(){be("ogShowFpsControl",(1e3/this.renderer.handler.deltaTime).toFixed(1),this.renderer.handler.canvas.clientWidth-60,0)}},SimpleNavigation:class extends Mt{constructor(e={}){super({name:"SimpleNavigation",autoActivate:!0,...e}),this.speed=e.speed||1}oninit(){}onactivate(){super.onactivate();let e=this.renderer;e.events.on("keypress",rn.KEY_W,this.onCameraMoveForward,this),e.events.on("keypress",rn.KEY_S,this.onCameraMoveBackward,this),e.events.on("keypress",rn.KEY_A,this.onCameraStrifeLeft,this),e.events.on("keypress",rn.KEY_D,this.onCameraStrifeRight,this),e.events.on("keypress",rn.KEY_UP,this.onCameraLookUp,this),e.events.on("keypress",rn.KEY_DOWN,this.onCameraLookDown,this),e.events.on("keypress",rn.KEY_LEFT,this.onCameraTurnLeft,this),e.events.on("keypress",rn.KEY_RIGHT,this.onCameraTurnRight,this),e.events.on("keypress",rn.KEY_Q,this.onCameraRollLeft,this),e.events.on("keypress",rn.KEY_E,this.onCameraRollRight,this)}ondeactivate(){super.ondeactivate();let e=this.renderer;e.events.off("keypress",rn.KEY_W,this.onCameraMoveForward),e.events.off("keypress",rn.KEY_S,this.onCameraMoveBackward),e.events.off("keypress",rn.KEY_A,this.onCameraStrifeLeft),e.events.off("keypress",rn.KEY_D,this.onCameraStrifeRight),e.events.off("keypress",rn.KEY_UP,this.onCameraLookUp),e.events.off("keypress",rn.KEY_DOWN,this.onCameraLookDown),e.events.off("keypress",rn.KEY_LEFT,this.onCameraTurnLeft),e.events.off("keypress",rn.KEY_RIGHT,this.onCameraTurnRight),e.events.off("keypress",rn.KEY_Q,this.onCameraRollLeft),e.events.off("keypress",rn.KEY_E,this.onCameraRollRight)}onCameraMoveForward(){if(this._active){let e=this.renderer.activeCamera;e.slide(0,0,-this.speed),e.update()}}onCameraMoveBackward(){let e=this.renderer.activeCamera;e.slide(0,0,this.speed),e.update()}onCameraStrifeLeft(){let e=this.renderer.activeCamera;e.slide(-this.speed,0,0),e.update()}onCameraStrifeRight(){let e=this.renderer.activeCamera;e.slide(this.speed,0,0),e.update()}onCameraLookUp(){let e=this.renderer.activeCamera;e.pitch(.5),e.update()}onCameraLookDown(){let e=this.renderer.activeCamera;e.pitch(-.5),e.update()}onCameraTurnLeft(){let e=this.renderer.activeCamera;e.yaw(.5),e.update()}onCameraTurnRight(){let e=this.renderer.activeCamera;e.yaw(-.5),e.update()}onCameraRollLeft(){let e=this.renderer.activeCamera;e.roll(-.5),e.update()}onCameraRollRight(){let e=this.renderer.activeCamera;e.roll(.5),e.update()}},SimpleSkyBackground:Ln,Sun:Mn,TimelineControl:class extends Mt{constructor(e={}){super({name:"timeline",...e});let t=e.current||new Date,i=e.rangeStart||qn(t,-12),r=e.rangeEnd||qn(t,12);this._timelineView=new Yn({rangeStart:i,rangeEnd:r,currentDate:t}),this._toggleBtn=new It({classList:["og-map-button","og-timeline_button"],icon:'<?xml version="1.0" encoding="utf-8"?>\n\x3c!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon --\x3e\n <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">\n <metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>\n <g><path d="M500,10C229.4,10,10,229.4,10,500s219.4,490,490,490s490-219.4,490-490S770.6,10,500,10z M800.3,800.3c-39,39-84.5,69.7-135,91C613,913.5,557.4,924.7,500,924.7s-112.9-11.2-165.3-33.3c-50.5-21.3-95.9-52-135-91c-39-39-69.7-84.5-91-135C86.5,612.9,75.3,557.4,75.3,500s11.2-112.9,33.3-165.3c21.3-50.5,52-95.9,91-135c39-39,84.5-69.7,135-91C387.1,86.5,442.6,75.3,500,75.3s112.9,11.2,165.3,33.3c50.5,21.3,95.9,52,135,91c39,39,69.7,84.5,91,135c22.1,52.3,33.3,107.9,33.3,165.3s-11.2,112.9-33.3,165.3C869.9,715.8,839.3,761.2,800.3,800.3z"/><path d="M761.3,532.7H532.7V304c0-18.1-14.6-32.7-32.7-32.7s-32.7,14.6-32.7,32.7v261.3l0,0c0,18.1,14.6,32.7,32.7,32.7h261.3c18.1,0,32.7-14.6,32.7-32.7l0,0C794,547.3,779.4,532.7,761.3,532.7z"/></g>\n</svg>'}),this._dialog=new Rt({title:"Timeline",visible:!1,resizable:!0,useHide:!0,top:10,left:60,width:600,height:115,minHeight:115,maxHeight:110}),this._dialog.events.on("visibility",(e=>{this._toggleBtn.setActive(e)}))}oninit(){let e=this.renderer.div;this._toggleBtn.appendTo(e),this._dialog.appendTo(e),this._toggleBtn.events.on("change",(e=>{this._dialog.setVisibility(e),e&&this._timelineView.resize()})),this._timelineView.appendTo(this._dialog.container),this._timelineView.events.on("setcurrent",(e=>{this.renderer&&this.renderer.handler.defaultClock.setDate(e)})),this._timelineView.events.on("startdrag",(()=>{this.renderer&&this.renderer.controls.mouseNavigation.deactivate()})),this._timelineView.events.on("stopdrag",(()=>{this.renderer&&this.renderer.controls.mouseNavigation.activate()})),this._timelineView.events.on("startdragcurrent",(()=>{this.renderer&&this.renderer.controls.mouseNavigation.deactivate()})),this._timelineView.events.on("stopdragcurrent",(()=>{this.renderer&&this.renderer.controls.mouseNavigation.activate()}))}},ToggleWireframe:class extends Mt{constructor(e={}){super(e),this._isActive=!1,this.toogleWireframe=()=>{this.renderer&&this.renderer.handler.gl&&(this.planet.drawMode===this.renderer.handler.gl.LINE_STRIP?this.planet.setDrawMode(this.renderer.handler.gl.TRIANGLE_STRIP):this.planet.setDrawMode(this.renderer.handler.gl.LINE_STRIP))},this._isActive=e.isActive||!1}oninit(){this.renderer.events.on("charkeypress",rn.KEY_X,this.toogleWireframe,this),this._isActive&&this.planet.setDrawMode(this.renderer.handler.gl.LINE_STRIP)}},TouchNavigation:Bn,ZoomControl:kn});function Xn(e){return new Uint32Array(e)}function $n(e){let t=[],i=0,r=0,n=0;for(let s=1;s<e-1-1;s++){for(let a=1;a<e-1;a++)i=s*e+a,n=(s+1)*e,r=n+a,t.push(i,r);t.push(r,n+1)}return t.push(t[t.length-1],e*e-e),Xn(t)}function Kn(e,t){let i=[];const r=(e-1)/t,n=e*e-e;let s=0;for(let t=0;t<e-2;t++){t%r==0&&(s=t);let a=n-e*t-e+1,o=n-e*s;i.push(o,a)}return t===e-1&&(i.push(e),i.push(0)),Xn(i)}function Qn(e,t){let i=[];const r=(e-1)/t;let n=0;for(let t=0;t<e-2;t++){t%r==0&&(n=t);let s=e+t+1,a=n;i.push(a,s)}return t===e-1&&(i.push(e-2),i.push(e-1)),Xn(i)}function Jn(e,t){let i=[];const r=(e-1)/t;let n=0;for(let t=0;t<e-2;t++){t%r==0&&(n=t);let s=e*(t+1)+e-2,a=e+e*n-1;i.push(a,s)}return t===e-1&&(i.push(e*(e-1)-1),i.push(e*e-1)),Xn(i)}function es(e,t){let i=[];const r=(e-1)/t;let n=0;const s=e*(e-1)-2,a=e*e-1;for(let t=0;t<e-2;t++){t%r==0&&(n=t);let e=s-t,o=a-n;i.push(o,e)}return t===e-1&&i.push(e*e-e+1),i.push(e*e-e),Xn(i)}function ts(e){let t=[[],[],[],[]];for(let i=0;i<=e;i++){let r=Math.pow(2,i)+1;t[0][i]=[],t[3][i]=[],t[2][i]=[],t[1][i]=[];for(let n=0;n<=e;n++){let e=Math.pow(2,n);t[3][i][n]=Kn(r,e),t[0][i][n]=Qn(r,e),t[1][i][n]=Jn(r,e),t[2][i][n]=es(r,e)}}return t}function is(e){let t=[];for(let i=0;i<=e;i++){const e=Math.pow(2,i);t[i]=$n(e+1)}return t}function rs(e){let t=new Uint16Array((e+1)*(e+1)*2),i=0;for(let r=0;r<=e;r++)for(let n=0;n<=e;n++)t[i++]=n/e*65535,t[i++]=r/e*65535;return t}let ns=new class{constructor(e=0){this._maxGridSize=e,this.centerIndexesTable=is(this._maxGridSize),this.skirtsIndexesTable=ts(this._maxGridSize)}get maxGridSize(){return this._maxGridSize}init(){this.centerIndexesTable=is(this._maxGridSize),this.skirtsIndexesTable=ts(this._maxGridSize)}setMaxGridSize(e){this._maxGridSize=e,this.init()}createSegmentIndexes(e,t){if(e){let i=this.centerIndexesTable[e],r=this.skirtsIndexesTable[3][e][t[3]],n=this.skirtsIndexesTable[0][e][t[0]],s=this.skirtsIndexesTable[1][e][t[1]],a=this.skirtsIndexesTable[2][e][t[2]],o=function(e){return new Uint32Array(e)}(i.length+r.length+n.length+s.length+a.length);return o.set(i,0),o.set(r,i.length),o.set(n,i.length+r.length),o.set(s,i.length+r.length+n.length),o.set(a,i.length+r.length+n.length+s.length),o}return Xn([0,2,1,3])}initTextureCoordsTable(e){let t=[];for(let i=0;i<=e;i++){const e=Math.pow(2,i);t[i]=rs(e)}return t}};function ss(){return ns}const as="\n float getLerpValue(in float min, in float max, in float between)\n {\n return (clamp(between, min, max) - min) / (max - min);\n }\n \n vec3 aces(vec3 color) \n {\n float a = 2.51;\n float b = 0.03;\n float c = 2.43;\n float d = 0.59;\n float e = 0.14;\n return clamp((color * (a * color + b)) / (color * (c * color + d ) + e), 0.0, 1.0);\n }\n \n bool intersectSphere(vec3 rayOrigin, vec3 rayDirection, float radius, inout float t1, inout float t2) \n {\n float b = dot(rayDirection, rayOrigin);\n float c = dot(rayOrigin, rayOrigin) - radius * radius;\n float d = b * b - c;\n if (d < 0.0) {\n return false;\n }\n t1 = -b - sqrt(d);\n t2 = -b + sqrt(d);\n return true;\n }\n \n bool intersectSphere(vec3 rayOrigin, vec3 rayDirection, float radius, inout float t) \n {\n float b = dot(rayDirection, rayOrigin);\n float c = dot(rayOrigin, rayOrigin) - radius * radius;\n float d = b * b - c;\n if (d < 0.0) {\n return false;\n }\n t = -b - sqrt(d);\n return true;\n }\n \n bool intersectEllipsoid( in vec3 ro, in vec3 rd, in vec3 ra, inout float t )\n {\n vec3 ocn = ro/ra;\n vec3 rdn = rd/ra;\n float a = dot( rdn, rdn );\n float b = dot( ocn, rdn );\n float c = dot( ocn, ocn );\n float h = b*b - a*(c-1.0);\n \n if (h < 0.0) \n { \n return false; \n }\n \n t = (-b-sqrt(h))/a;\n \n return true;\n }\n \n bool intersectEllipsoid( in vec3 ro, in vec3 rd, in vec3 ra, inout float t1, inout float t2)\n {\n vec3 ocn = ro/ra;\n vec3 rdn = rd/ra;\n float a = dot( rdn, rdn );\n float b = dot( ocn, rdn );\n float c = dot( ocn, ocn );\n float h = b*b - a*(c-1.0);\n \n if (h < 0.0) \n { \n return false; \n }\n \n h = sqrt(h);\n t1 = (-b-h)/a;\n t2 = (-b+h)/a;\n \n return true;\n }\n \n vec3 normalEllipsoid( in vec3 pos, in vec3 ra )\n {\n return normalize( pos/(ra*ra) );\n }\n",os=`\n \n ${as}\n \n #define PI 3.1415926538\n #define ATMOS_HEIGHT 100000.0\n #define RAYLEIGH_SCALE 0.08\n #define MIE_SCALE 0.012\n \n #define SAMPLE_COUNT 16\n #define SQRT_SAMPLE_COUNT 4\n \n const float GROUND_ALBEDO = 0.05 / PI;\n\n // Sphere\n const float BOTTOM_RADIUS = 6356752.3142451793;\n const float TOP_RADIUS = 6356752.3142451793 + ATMOS_HEIGHT;\n \n // Ellipsoid\n const vec3 bottomRadii = vec3(6378137.0, 6378137.0, 6356752.3142451793); \n const vec3 topRadii = bottomRadii + ATMOS_HEIGHT;\n \n const vec3 SPHERE_TO_ELLIPSOID_SCALE = vec3(BOTTOM_RADIUS) / bottomRadii; \n \n const vec2 rayleighMieHeights = vec2(RAYLEIGH_SCALE, MIE_SCALE) * ATMOS_HEIGHT;\n \n const vec3 rayleighScatteringCoefficient = vec3(5.802, 13.558, 33.100) * 1e-6;\n \n const float mieScatteringCoefficient = 3.996e-06;\n const float mieExtinctionCoefficient = 4.440e-06;\n const vec3 ozoneAbsorptionCoefficient = vec3(0.650, 1.881, 0.085) * 1e-6;\n \n const float SUN_ANGULAR_RADIUS = 0.004685;\n const float SUN_INTENSITY = 1.0; \n \n vec3 sunWithBloom(vec3 rayDir, vec3 sunDir) \n {\n float minSunCosTheta = cos(SUN_ANGULAR_RADIUS); \n float cosTheta = dot(rayDir, sunDir);\n if (cosTheta >= minSunCosTheta) return vec3(1.0); \n float offset = minSunCosTheta - cosTheta;\n float gaussianBloom = exp(-offset*15000.0)*0.7;\n float invBloom = 1.0/(0.09 + offset*200.0)*0.01;\n return vec3(gaussianBloom + invBloom);\n }\n \n float rayleighPhase(float angle) \n {\n return 3.0 / (16.0 * PI) * (1.0 + (angle * angle));\n }\n \n float miePhase(float angle) \n {\n float g = 0.8;\n return 3.0 / (8.0 * PI) * ((1.0 - g * g) * (1.0 + angle * angle)) / ((2.0 + g * g) * pow(1.0 + g * g - 2.0 * g * angle, 1.5));\n }\n \n vec3 opticalDepth(float height, float angle) \n {\n vec3 rayOrigin = vec3(0.0, BOTTOM_RADIUS + height, 0.0);\n vec3 rayDirection = vec3(sqrt(1.0 - angle * angle), angle, 0.0);\n float t1, t2;\n intersectSphere(rayOrigin, rayDirection, TOP_RADIUS, t1, t2);\n float segmentLength = t2 / float(SAMPLE_COUNT);\n \n float t = segmentLength * 0.5;\n vec3 opticalDepth = vec3(0.0);\n \n for (int i = 0; i < SAMPLE_COUNT; i++) \n {\n vec3 position = rayOrigin + t * rayDirection;\n float height = length(position) - BOTTOM_RADIUS;\n opticalDepth.xy += exp(-height / rayleighMieHeights) * segmentLength;\n \n // density of the ozone layer is modeled as a triangular \n // function that is 30 km wide and centered at 25 km altitude\n opticalDepth.z += (1.0 - min(abs(height - 25e3) / 15e3, 1.0)) * segmentLength; \n t += segmentLength;\n }\n \n return opticalDepth;\n }\n \n vec3 transmittance(float height, float angle) \n {\n vec3 opticalDepth = opticalDepth(height, angle);\n return exp(-(rayleighScatteringCoefficient * opticalDepth.x + mieExtinctionCoefficient * opticalDepth.y + ozoneAbsorptionCoefficient * opticalDepth.z));\n }`;const ls="const vec3 nightStep = 10.0 * vec3(0.58, 0.48, 0.25);",hs="#define blend(DEST, SAMPLER, OFFSET, OPACITY) src = texture( SAMPLER, OFFSET.xy + vTextureCoord.xy * OFFSET.zw ); DEST = DEST * (1.0 - src.a * OPACITY) + src * OPACITY;",cs="#define blend(DEST, SAMPLER, OFFSET, OPACITY) src = texture2D( SAMPLER, OFFSET.xy + vTextureCoord.xy * OFFSET.zw ); DEST = DEST * (1.0 - src.a * OPACITY) + src * OPACITY;";function ds(){return new Si("drawnode_screen_wl",{uniforms:{projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",height:"float",uGlobalTextureCoord:"vec4",uNormalMapBias:"vec3",samplerCount:"int",tileOffsetArr:"vec4",layerOpacityArr:"float",samplerArr:"sampler2darray",defaultTexture:"sampler2d",uNormalMap:"sampler2d",nightTexture:"sampler2d",specularTexture:"sampler2d",lightsPositions:"vec3",diffuse:"vec3",ambient:"vec3",specular:"vec4",camHeight:"float",nightTextureCoefficient:"float"},attributes:{aVertexPositionHigh:"vec3",aVertexPositionLow:"vec3",aTextureCoord:"vec2"},vertexShader:"\n attribute vec3 aVertexPositionHigh;\n attribute vec3 aVertexPositionLow;\n attribute vec2 aTextureCoord;\n\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n uniform vec4 uGlobalTextureCoord;\n uniform vec3 uNormalMapBias;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float height;\n\n varying vec4 vTextureCoord;\n varying vec3 v_vertex;\n varying vec3 cameraPosition;\n varying vec2 vGlobalTextureCoord;\n varying float v_height;\n\n void main(void) {\n\n // I replace it here (from the bottom) because it \n // somehow affects on float precision on MacPC Chrome\n vTextureCoord.xy = aTextureCoord;\n vGlobalTextureCoord = uGlobalTextureCoord.xy + (uGlobalTextureCoord.zw - uGlobalTextureCoord.xy) * aTextureCoord;\n vTextureCoord.zw = uNormalMapBias.z * ( aTextureCoord + uNormalMapBias.xy );\n\n vec3 aVertexPosition = aVertexPositionHigh + aVertexPositionLow; \n vec3 nh = height * normalize(aVertexPosition);\n cameraPosition = eyePositionHigh + eyePositionLow;\n \n vec3 highDiff = aVertexPositionHigh - eyePositionHigh;\n vec3 lowDiff = aVertexPositionLow - eyePositionLow + nh;\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n v_height = height;\n v_vertex = aVertexPosition + nh;\n \n gl_Position = projectionMatrix * viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n }",fragmentShader:`\n precision highp float;\n \n #define MAX_POINT_LIGHTS 1\n #define SLICE_SIZE 5\n\n uniform vec4 specular;\n uniform vec3 diffuse;\n uniform vec3 ambient;\n\n uniform sampler2D uNormalMap;\n uniform sampler2D nightTexture;\n uniform sampler2D specularTexture;\n uniform sampler2D defaultTexture;\n uniform sampler2D samplerArr[SLICE_SIZE];\n\n uniform vec4 tileOffsetArr[SLICE_SIZE];\n uniform vec3 lightsPositions[MAX_POINT_LIGHTS];\n uniform float layerOpacityArr[SLICE_SIZE];\n\n uniform int samplerCount;\n uniform float nightTextureCoefficient; \n uniform float camHeight;\n\n varying vec4 vTextureCoord;\n varying vec3 v_vertex;\n varying vec3 cameraPosition;\n varying vec2 vGlobalTextureCoord;\n varying float v_height;\n\n vec3 sunPos;\n\n ${ls}\n\n ${cs}\n \n ${as}\n \n void main(void) {\n \n sunPos = lightsPositions[0];\n \n vec3 texNormal = texture2D(uNormalMap, vTextureCoord.zw).rgb;\n vec3 normal = normalize((texNormal - 0.5) * 2.0);\n \n float minH = 1200000.0;\n float maxH = minH * 3.0;\n float nightCoef = getLerpValue(minH, maxH, camHeight) * nightTextureCoefficient;\n \n if(camHeight > 6000000.0)\n {\n normal = normalize(v_vertex);\n }\n \n vec3 lightDir = normalize(sunPos);\n vec3 viewDir = normalize(cameraPosition - v_vertex);\n \n float overGround = 1.0 - step(0.1, v_height);\n\n float shininess = texture2D( specularTexture, vGlobalTextureCoord.st ).r * 255.0 * overGround;\n vec3 reflectionDirection = reflect(-lightDir, normal);\n float reflection = max( dot(reflectionDirection, viewDir), 0.0);\n vec3 spec = specular.rgb * pow( reflection, specular.w) * shininess; \n float diffuseLightWeighting = max(dot(normal, lightDir), 0.0); \n vec4 nightImageColor = texture2D( nightTexture, vGlobalTextureCoord.st );\n vec3 night = nightStep * (.18 - diffuseLightWeighting * 3.0) * nightImageColor.rgb * nightCoef;\n night *= overGround * step(0.0, night); \n vec4 lightWeighting = vec4(ambient + diffuse * diffuseLightWeighting + night, 1.0);\n \n gl_FragColor = texture2D( defaultTexture, vTextureCoord.xy );\n if( samplerCount == 0 ) {\n gl_FragColor = gl_FragColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n vec4 src;\n\n blend(gl_FragColor, samplerArr[0], tileOffsetArr[0], layerOpacityArr[0]);\n if( samplerCount == 1 ) { \n gl_FragColor = gl_FragColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n blend(gl_FragColor, samplerArr[1], tileOffsetArr[1], layerOpacityArr[1]);\n if( samplerCount == 2 ) {\n gl_FragColor = gl_FragColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n blend(gl_FragColor, samplerArr[2], tileOffsetArr[2], layerOpacityArr[2]);\n if( samplerCount == 3 ) {\n gl_FragColor = gl_FragColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n blend(gl_FragColor, samplerArr[3], tileOffsetArr[3], layerOpacityArr[3]);\n if( samplerCount == 4 ) {\n gl_FragColor = gl_FragColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n blend(gl_FragColor, samplerArr[4], tileOffsetArr[4], layerOpacityArr[4]);\n gl_FragColor = gl_FragColor * lightWeighting + vec4(spec, 0.0);\n }`})}class _s{constructor(e,t={}){this.handler=e,this._fbo=null,this._width=t.width||e.canvas.width,this._height=t.height||e.canvas.height,this._depthComponent=null!=t.depthComponent?t.depthComponent:"DEPTH_COMPONENT16",this._useDepth=null==t.useDepth||t.useDepth,this._active=!1,this._size=t.size||1,this._depthRenderbuffer=null,this._filter=t.filter||"NEAREST"}get width(){return this._width}get height(){return this._height}setSize(e,t,i=!1){this._width=e,this._height=t,this._active&&this.handler.gl.viewport(0,0,this._width,this._height),(this._useDepth||i)&&(this.destroy(),this.init())}init(){}destroy(){}isComplete(){let e=this.handler.gl;return e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE}checkStatus(){let e=this.handler.gl;return e.checkFramebufferStatus(e.FRAMEBUFFER)}activate(){let e=this.handler.gl;e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,this._fbo),e.viewport(0,0,this._width,this._height),this._active=!0;let t=this.handler.framebufferStack.current().data;return t&&(t._active=!1),this.handler.framebufferStack.push(this),this}deactivate(){let e=this.handler,t=e.gl;t.bindFramebuffer(t.FRAMEBUFFER,null),this._active=!1;let i=this.handler.framebufferStack.popPrev();i?(t.bindFramebuffer(t.FRAMEBUFFER,i._fbo),t.viewport(0,0,i._width,i._height)):t.viewport(0,0,e.canvas.width,e.canvas.height)}}class us{constructor(e=256,t=256){this._canvas=document.createElement("canvas"),this._canvas.width=e,this._canvas.height=t,this._context=this._canvas.getContext("2d",{willReadFrequently:!0})}getCanvas(){return this._canvas}getContext(){return this._context}fillEmpty(){let e=this._context.getImageData(0,0,this._canvas.width,this._canvas.height),t=e.data;for(let e=0,i=t.length;e<i;e+=4)t[e]=t[e+1]=t[e+2]=t[e+3]=0;this._context.putImageData(e,0,0)}fill(e){this._context.fillStyle=e,this._context.fill()}getData(){return this._context.getImageData(0,0,this._canvas.width,this._canvas.height).data}fillColor(e){this._context.fillStyle=e,this._context.fillRect(0,0,this._canvas.width,this._canvas.height)}setData(e){let t=this._context.createImageData(this._canvas.width,this._canvas.height);t.data.set(e),this._context.putImageData(t,0,0)}resize(e,t){this._canvas.width=e,this._canvas.height=t,this._context=this._canvas.getContext("2d")}drawImage(e,t,i,r,n){this._context.drawImage(e,t||0,i||0,r||e.width,n||e.height)}getImage(){let e=new Image;return e.width=this.getWidth(),e.height=this.getHeight(),e.src=this._canvas.toDataURL("image/png"),e}getTextWidth(e){let t=this._context.measureText(e);return Math.round(t.width)}drawText(e,t=0,i=14,r="normal 14px Verdana",n="black"){this._context.fillStyle=n,this._context.font=r,this._context.fillText(e,t,i)}getWidth(){return this._canvas.width}getHeight(){return this._canvas.height}load(e,t){let i=new Image,r=this;i.onload=function(){r.resize(i.width,i.height),r._context.drawImage(i,0,0,i.width,i.height),t&&t(i)},i.src=e}openImage(){let e=this.getImage(),t="<!DOCTYPE html>";t+="<html>",t+="<head><title>Print</title></head>",t+="<body>",t+='<img src="'+e.src+'">',t+="</body>",t+="</html>";let i=window.open("","","width="+e.width+"px ,height="+e.height+"px");i&&(i.document.open(),i.document.write(t),i.document.close(),i.focus())}destroy(){this._canvas.width=1,this._canvas.height=1,this._canvas=null,this._context=null}}class fs extends _s{constructor(e,t={}){super(e,t),this._isBare=t.isBare||!1,this._internalFormatArr=t.internalFormat instanceof Array?t.internalFormat:[t.internalFormat||"RGBA"],this._formatArr=t.format instanceof Array?t.format:[t.format||"RGBA"],this._typeArr=t.type instanceof Array?t.type:[t.type||"UNSIGNED_BYTE"],t.attachment instanceof Array?this._attachmentArr=t.attachment.map(((e,t)=>{let i=e.toUpperCase();return"COLOR_ATTACHMENT"===i?`${i}${t.toString()}`:i})):this._attachmentArr=[t.attachment||"COLOR_ATTACHMENT0"],this._renderbufferTarget=null!=t.renderbufferTarget?t.renderbufferTarget:"DEPTH_ATTACHMENT",this.textures=t.textures||new Array(this._size)}destroy(){let e=this.handler.gl;if(e){for(let t=0;t<this.textures.length;t++)e.deleteTexture(this.textures[t]);this.textures=new Array(this._size),e.deleteFramebuffer(this._fbo),e.deleteRenderbuffer(this._depthRenderbuffer),this._depthRenderbuffer=null,this._fbo=null,this._active=!1}}init(){let e=this.handler.gl;if(e){if(this._fbo=e.createFramebuffer(),e.bindFramebuffer(e.FRAMEBUFFER,this._fbo),!this._isBare){let t=[];for(let i=0;i<this.textures.length;i++){let r=this.textures[i]||this.handler.createEmptyTexture2DExt(this._width,this._height,this._filter,this._internalFormatArr[i],this._formatArr[i],this._typeArr[i]),n=e[this._attachmentArr[i]];r&&(this.bindOutputTexture(r,n),this.textures[i]=r),"DEPTH_ATTACHMENT"!=this._attachmentArr[i]&&t.push(n)}e.drawBuffers&&e.drawBuffers(t)}this._useDepth&&(this._depthRenderbuffer=e.createRenderbuffer(),e.bindRenderbuffer(e.RENDERBUFFER,this._depthRenderbuffer),e.renderbufferStorage(e.RENDERBUFFER,e[this._depthComponent],this._width,this._height),e.framebufferRenderbuffer(e.FRAMEBUFFER,e[this._renderbufferTarget],e.RENDERBUFFER,this._depthRenderbuffer),e.bindRenderbuffer(e.RENDERBUFFER,null)),e.bindFramebuffer(e.FRAMEBUFFER,null)}}bindOutputTexture(e,t){let i=this.handler.gl;i.bindTexture(i.TEXTURE_2D,e),i.framebufferTexture2D(i.FRAMEBUFFER,t||i.COLOR_ATTACHMENT0,i.TEXTURE_2D,e,0),i.bindTexture(i.TEXTURE_2D,null)}readPixels(e,t,i,r=0,n=1,s=1){let a=this.handler.gl;a.bindFramebuffer(a.FRAMEBUFFER,this._fbo),a.readBuffer&&a.readBuffer(a.COLOR_ATTACHMENT0+r||0),a.readPixels(t*this._width,i*this._height,n,s,a.RGBA,a[this._typeArr[r]],e),a.bindFramebuffer(a.FRAMEBUFFER,null)}readAllPixels(e,t=0){let i=this.handler.gl;i.bindFramebuffer(i.FRAMEBUFFER,this._fbo),i.readBuffer&&i.readBuffer(i.COLOR_ATTACHMENT0+t),i.readPixels(0,0,this._width,this._height,i.RGBA,i[this._typeArr[t]],e),i.bindFramebuffer(i.FRAMEBUFFER,null)}getImage(){let e=new Uint8Array(4*this._width*this._height);this.readAllPixels(e);let t=new us(this._width,this._height);return t.setData(e),t.getImage()}}class gs extends Mt{constructor(e={}){super({name:"Atmosphere",...e}),this._transmittanceBuffer=null,this._scatteringBuffer=null,this.opacity=1}oninit(){this.renderer&&(this.renderer.handler.addProgram(new Si("transmittance",{uniforms:{iResolution:"vec2"},attributes:{a_position:"vec2"},vertexShader:"\n attribute vec2 a_position;\n \n void main(void) \n {\n gl_Position = vec4(a_position, 0.0, 1.0);\n }",fragmentShader:`\n precision highp float;\n \n ${os}\n \n uniform vec2 iResolution;\n \n void main(void) \n {\n vec2 uv = gl_FragCoord.xy / iResolution.xy;\n float height = uv.y * ATMOS_HEIGHT;\n float angle = uv.x * 2.0 - 1.0;\n gl_FragColor = vec4(transmittance(height, angle), 1.0);\n }`}),!0),this.renderer.handler.addProgram(new Si("scattering",{uniforms:{iResolution:"vec2",transmittanceTexture:"sampler2d"},attributes:{a_position:"vec2"},vertexShader:" \n attribute vec2 a_position; \n \n void main(void) \n {\n gl_Position = vec4(a_position, 0.0, 1.0);\n }",fragmentShader:` \n precision highp float;\n \n uniform sampler2D transmittanceTexture;\n uniform vec2 iResolution;\n \n ${os}\n \n vec3 transmittanceFromTexture(float height, float angle) \n {\n float u = (angle + 1.0) * 0.5;\n float v = height / ATMOS_HEIGHT;\n return texture2D(transmittanceTexture, vec2(u, v)).xyz;\n }\n \n void main(void) \n {\n vec2 uv = gl_FragCoord.xy / iResolution.xy;\n \n float height = uv.y * ATMOS_HEIGHT;\n float angle = uv.x * 2.0 - 1.0;\n \n vec3 rayOrigin = vec3(0.0, BOTTOM_RADIUS + height, 0.0);\n vec3 up = rayOrigin / length(rayOrigin);\n vec3 lightDirection = vec3(sqrt(1.0 - angle * angle), angle, 0.0);\n \n const float isotropicPhase = 1.0 / (4.0 * PI);\n \n vec3 light = vec3(0.0);\n vec3 lightTransferFactor = vec3(0.0);\n \n for (int i = 0; i < SQRT_SAMPLE_COUNT; i++)\n {\n for (int j = 0; j < SQRT_SAMPLE_COUNT; j++)\n {\n float u = ((0.5 + float(i)) / float(SQRT_SAMPLE_COUNT)) * 2.0 - 1.0;\n float v = (0.5 + float(j)) / float(SQRT_SAMPLE_COUNT);\n float r = sqrt(1.0 - u * u);\n float theta = 2.0 * PI * v;\n vec3 rayDirection = vec3(cos(theta) * r, sin(theta) * r, u);\n \n float rayAngle = dot(up, rayDirection);\n bool cameraBelow = rayAngle < 0.0;\n \n vec3 transmittanceFromCameraToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);\n \n float offset = 0.0;\n float distanceToSpace = 0.0;\n \n intersectSphere(rayOrigin, rayDirection, TOP_RADIUS, offset, distanceToSpace);\n \n float distanceToGround = 0.0;\n bool hitGround = intersectSphere(rayOrigin, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0; \n float segmentLength = (hitGround ? distanceToGround : distanceToSpace) / float(SAMPLE_COUNT);\n float t = segmentLength * 0.5;\n \n vec3 transmittanceCamera;\n vec3 transmittanceLight;\n \n for (int k = 0; k < SAMPLE_COUNT; k++) \n {\n vec3 position = rayOrigin + t * rayDirection;\n float height = length(position) - BOTTOM_RADIUS;\n vec3 up = position / length(position);\n float rayAngle = dot(up, rayDirection);\n float lightAngle = dot(up, lightDirection);\n \n float distanceToGround;\n float shadow = intersectSphere(position, lightDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround >= 0.0 ? 0.0 : 1.0;\n vec3 transmittanceToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);\n \n transmittanceCamera = cameraBelow ? (transmittanceToSpace / transmittanceFromCameraToSpace) : (transmittanceFromCameraToSpace / transmittanceToSpace);\n transmittanceLight = transmittanceFromTexture(height, lightAngle);\n \n vec2 opticalDensity = exp(-height / rayleighMieHeights); \n vec3 scatteredLight = transmittanceLight * (rayleighScatteringCoefficient * opticalDensity.x + mieScatteringCoefficient * opticalDensity.y) * isotropicPhase;\n \n light += shadow * transmittanceCamera * scatteredLight * segmentLength;\n lightTransferFactor += transmittanceCamera * (rayleighScatteringCoefficient * opticalDensity.x + mieScatteringCoefficient * opticalDensity.y) * segmentLength;\n \n t += segmentLength;\n }\n \n if (hitGround) \n {\n vec3 hitPoint = rayOrigin + rayDirection * distanceToGround;\n vec3 normal = normalize(hitPoint);\n float diffuseAngle = max(dot(normal, lightDirection), 0.0); \n float earthAlbedo = 0.05;\n light += transmittanceCamera * transmittanceLight * (earthAlbedo / PI) * diffuseAngle;\n }\n }\n }\n \n light /= float(SAMPLE_COUNT);\n lightTransferFactor /= float(SAMPLE_COUNT);\n vec3 color = light / (1.0 - lightTransferFactor); \n gl_FragColor = vec4(color, 1.0);\n }`}),!0),this.renderer.handler.addProgram(new Si("atmosphereBackground",{uniforms:{iResolution:"vec2",fov:"float",camPos:"vec3",viewMatrix:"mat4",transmittanceTexture:"sampler2D",scatteringTexture:"sampler2D",sunPos:"vec3",opacity:"float"},attributes:{corners:"vec3"},vertexShader:" \n attribute vec2 corners;\n \n void main(void) {\n gl_Position = vec4(corners, 0.0, 1.0);\n }",fragmentShader:` \n precision highp float;\n \n ${os}\n \n uniform mat4 viewMatrix;\n uniform vec3 sunPos;\n uniform vec3 camPos; \n uniform vec2 iResolution;\n uniform float fov;\n uniform float opacity;\n \n uniform sampler2D transmittanceTexture;\n uniform sampler2D scatteringTexture;\n \n vec3 transmittanceFromTexture(float height, float angle) \n {\n float u = (angle + 1.0) * 0.5;\n float v = height / ATMOS_HEIGHT;\n return texture2D(transmittanceTexture, vec2(u, v)).xyz;\n }\n \n vec3 multipleScatteringContributionFromTexture(float height, float angle) \n {\n float u = (angle + 1.0) * 0.5;\n float v = height / ATMOS_HEIGHT;\n return texture2D(scatteringTexture, vec2(u, v)).xyz; \n }\n\n bool intersectEllipsoidToSphere(in vec3 ro, in vec3 rd, in vec3 ellRadii, in float sphereRadius, out float t1, out float t2) \n {\n float offset = 0.0,\n distanceToSpace = 0.0;\n \n if(intersectEllipsoid(ro, rd, ellRadii, offset, distanceToSpace)){\n vec3 hitEll = ro + rd * offset;\n vec3 nEll = normalEllipsoid(hitEll, ellRadii);\n float t = 0.0;\n bool intersectsSphere = intersectSphere(hitEll, nEll, sphereRadius, t);\n vec3 hitSphere = hitEll + nEll * t;\n t1 = length(hitSphere - ro);\n \n hitEll = ro + rd * distanceToSpace;\n nEll = normalEllipsoid(hitEll, ellRadii);\n t = 0.0;\n intersectsSphere = intersectSphere(hitEll, nEll, sphereRadius, t);\n hitSphere = hitEll + nEll * t;\n t2 = length(hitSphere - ro);\n \n return true; \n }\n return false; \n }\n \n mat4 transpose(in mat4 m) \n {\n vec4 i0 = m[0];\n vec4 i1 = m[1];\n vec4 i2 = m[2];\n vec4 i3 = m[3];\n \n mat4 outMatrix = mat4(\n vec4(i0.x, i1.x, i2.x, i3.x),\n vec4(i0.y, i1.y, i2.y, i3.y),\n vec4(i0.z, i1.z, i2.z, i3.z),\n vec4(i0.w, i1.w, i2.w, i3.w)\n );\n \n return outMatrix;\n }\n \n void mainImage(out vec4 fragColor) \n { \n vec3 cameraPosition = camPos;\n \n vec3 lightDirection = normalize(sunPos); \n \n vec2 uv = (2.0 * gl_FragCoord.xy - iResolution.xy) / iResolution.y;\n float fieldOfView = fov;\n float z = 1.0 / tan(fieldOfView * 0.5 * PI / 180.0);\n vec3 rayDirection = normalize(vec3(uv, -z));\n vec4 rd = transpose(viewMatrix) * vec4(rayDirection, 1.0);\n rayDirection = rd.xyz; \n \n vec3 light = vec3(0.0);\n vec3 transmittanceFromCameraToSpace = vec3(1.0);\n float offset = 0.0;\n float distanceToSpace = 0.0;\n \n rayDirection = normalize(rayDirection * SPHERE_TO_ELLIPSOID_SCALE);\n cameraPosition *= SPHERE_TO_ELLIPSOID_SCALE;\n lightDirection = normalize(lightDirection * SPHERE_TO_ELLIPSOID_SCALE);\n \n if (intersectSphere(cameraPosition, rayDirection, TOP_RADIUS, offset, distanceToSpace)) \n { \n vec3 rayOrigin = cameraPosition;\n \n // above atmosphere \n if (offset > 0.0) {\n // intersection of camera ray with atmosphere\n rayOrigin = cameraPosition + rayDirection * offset;\n }\n \n float height = length(rayOrigin) - BOTTOM_RADIUS;\n float rayAngle = dot(rayOrigin, rayDirection) / length(rayOrigin);\n bool cameraBelow = rayAngle < 0.0;\n \n transmittanceFromCameraToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);\n \n float phaseAngle = dot(lightDirection, rayDirection);\n float rayleighPhase = rayleighPhase(phaseAngle);\n float miePhase = miePhase(phaseAngle);\n \n float distanceToGround = 0.0;\n \n bool hitGround = intersectSphere(cameraPosition, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0;\n \n if(intersectSphere(cameraPosition, rayDirection, BOTTOM_RADIUS - 15000.0, distanceToGround) && hitGround){\n discard;\n }\n \n float segmentLength = ((hitGround ? distanceToGround : distanceToSpace) - max(offset, 0.0)) / float(SAMPLE_COUNT);\n \n float t = segmentLength * 0.5;\n \n vec3 transmittanceCamera; \n vec3 transmittanceLight; \n \n for (int i = 0; i < SAMPLE_COUNT; i++) \n {\n vec3 position = rayOrigin + t * rayDirection;\n float height = length(position) - BOTTOM_RADIUS; \n vec3 up = position / length(position);\n float rayAngle = dot(up, rayDirection);\n float lightAngle = dot(up, lightDirection);\n // shadow is ommitted because it can create banding artifacts with low sample counts\n // float distanceToGround;\n // float shadow = intersectSphere(position, lightDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround >= 0.0 ? 0.0 : 1.0; \n float shadow = 1.0;\n vec3 transmittanceToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);\n transmittanceCamera = cameraBelow ? (transmittanceToSpace / transmittanceFromCameraToSpace) : (transmittanceFromCameraToSpace / transmittanceToSpace);\n transmittanceLight = transmittanceFromTexture(height, lightAngle);\n vec2 opticalDensity = exp(-height / rayleighMieHeights);\n vec3 scatteredLight = transmittanceLight * (rayleighScatteringCoefficient * opticalDensity.x * rayleighPhase + mieScatteringCoefficient * opticalDensity.y * miePhase);\n scatteredLight += multipleScatteringContributionFromTexture(height, lightAngle) * (rayleighScatteringCoefficient * opticalDensity.x + mieScatteringCoefficient * opticalDensity.y); \n light += shadow * transmittanceCamera * scatteredLight * segmentLength;\n t += segmentLength;\n }\n \n light *= SUN_INTENSITY;\n \n if (hitGround) \n {\n vec3 hitPoint = cameraPosition + rayDirection * distanceToGround;\n vec3 up = hitPoint / length(hitPoint);\n float diffuseAngle = max(dot(up, lightDirection), 0.0);\n float lightAngle = dot(up, lightDirection);\n light += transmittanceCamera * GROUND_ALBEDO * multipleScatteringContributionFromTexture(height, lightAngle) * SUN_INTENSITY;\n light += transmittanceCamera * transmittanceLight * GROUND_ALBEDO * diffuseAngle * SUN_INTENSITY;\n }\n }\n \n // sun disk\n // float distanceToGround;\n // bool hitGround = intersectSphere(cameraPosition, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0;\n // if (!hitGround) {\n // float angle = dot(rayDirection, lightDirection);\n // if (angle > cos(SUN_ANGULAR_RADIUS)) {\n // light = SUN_INTENSITY * transmittanceFromCameraToSpace;\n // }\n // }\n \n float distanceToGround = 0.0;\n bool hitGround = intersectSphere(cameraPosition, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0;\n if(!hitGround)\n {\n vec3 sunLum = sunWithBloom(rayDirection, lightDirection) * vec3(1.0,1.0,0.8);\n // limit the bloom effect\n sunLum = smoothstep(0.002, 1.0, sunLum);\n light += sunLum * SUN_INTENSITY * transmittanceFromCameraToSpace;\n }\n \n fragColor = vec4(pow(light * 8.0, vec3(1.0 / 2.2)), clamp(opacity, 0.0, 1.0)); \n }\n \n void main(void) \n { \n mainImage(gl_FragColor); \n }`}),!0),this._drawAtmosphereTextures(),this.activate())}onactivate(){super.onactivate(),this.planet&&this.planet.events.on("draw",this._drawBackground,this)}ondeactivate(){super.ondeactivate(),this.planet&&this.planet.events.off("draw",this._drawBackground)}_drawAtmosphereTextures(){this._transmittanceBuffer=new fs(this.renderer.handler,{width:256,height:128,useDepth:!1,filter:"LINEAR",type:"FLOAT",internalFormat:"RGBA16F"}),this._transmittanceBuffer.init(),this._scatteringBuffer=new fs(this.renderer.handler,{width:256,height:128,useDepth:!1,filter:"LINEAR",type:"FLOAT",internalFormat:"RGBA16F"}),this._scatteringBuffer.init();let e=this.renderer.screenFramePositionBuffer,t=this.renderer.handler,i=t.gl;this._transmittanceBuffer.activate();let r=t.programs.transmittance,n=r._program.attributes,s=r._program.uniforms;r.activate(),i.clearColor(0,0,0,1),i.clear(i.COLOR_BUFFER_BIT|i.DEPTH_BUFFER_BIT),i.uniform2fv(s.iResolution,[this._transmittanceBuffer.width,this._transmittanceBuffer.height]),i.bindBuffer(i.ARRAY_BUFFER,e),i.vertexAttribPointer(n.a_position,e.itemSize,i.FLOAT,!1,0,0),i.drawArrays(i.TRIANGLE_STRIP,0,e.numItems),this._transmittanceBuffer.deactivate(),this._scatteringBuffer.activate(),r=t.programs.scattering,n=r._program.attributes,s=r._program.uniforms,r.activate(),i.clearColor(0,0,0,1),i.clear(i.COLOR_BUFFER_BIT|i.DEPTH_BUFFER_BIT),i.uniform2fv(s.iResolution,[this._scatteringBuffer.width,this._scatteringBuffer.height]),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,this._transmittanceBuffer.textures[0]),i.uniform1i(s.transmittanceTexture,0),i.bindBuffer(i.ARRAY_BUFFER,e),i.vertexAttribPointer(n.a_position,e.itemSize,i.FLOAT,!1,0,0),i.drawArrays(i.TRIANGLE_STRIP,0,e.numItems),this._scatteringBuffer.deactivate(),this._scatteringBuffer.isComplete()&&t.removeProgram("scattering"),this._transmittanceBuffer.isComplete()&&t.removeProgram("transmittance")}_drawBackground(){let e=this.renderer.handler,t=e.programs.atmosphereBackground,i=t._program,r=i.uniforms,n=e.gl,s=this.renderer,a=this.planet.camera;n.disable(n.DEPTH_TEST),t.activate(),n.bindBuffer(n.ARRAY_BUFFER,s.screenFramePositionBuffer),n.vertexAttribPointer(i.attributes.corners,2,n.FLOAT,!1,0,0),n.activeTexture(n.TEXTURE0),n.bindTexture(n.TEXTURE_2D,this._transmittanceBuffer.textures[0]),n.uniform1i(r.transmittanceTexture,0),n.activeTexture(n.TEXTURE1),n.bindTexture(n.TEXTURE_2D,this._scatteringBuffer.textures[0]),n.uniform1i(r.scatteringTexture,1),n.uniformMatrix4fv(r.viewMatrix,!1,a.getViewMatrix());let o=this.planet.sunPos;n.uniform3fv(r.sunPos,[o.x,o.y,o.z]),n.uniform3fv(r.camPos,[a.eye.x,a.eye.y,a.eye.z]),n.uniform2fv(r.iResolution,[s.sceneFramebuffer.width,s.sceneFramebuffer.height]),n.uniform1f(r.fov,a.getViewAngle()),n.uniform1f(r.opacity,this.opacity),n.drawArrays(n.TRIANGLE_STRIP,0,4),n.enable(n.DEPTH_TEST)}}const ps="degrees",ms="m";let vs=0;class ys{constructor(e){this.id=vs++,this.code=e.code,this.units=e.units}equal(e){return e.id===this.id}}const xs=new ys({code:"epsg:3857",units:ms}),bs=new ys({code:"epsg:4326",units:ps});class ws{constructor(e){this.segment=e,this.layers=[],this.tileOffsetArr=new Float32Array(e.planet.SLICE_SIZE_4),this.layerOpacityArr=new Float32Array(e.planet.SLICE_SIZE)}clear(){this.layers=null,this.tileOffsetArr=null,this.layerOpacityArr=null}append(e,t){let i=this.layers.length;this.layers.push(e),this.layerOpacityArr[i]=e.screenOpacity;let r=4*i,n=e.applyMaterial(t);this.tileOffsetArr[r]=n[0],this.tileOffsetArr[r+1]=n[1],this.tileOffsetArr[r+2]=n[2],this.tileOffsetArr[r+3]=n[3]}}let Ts=new oe,Cs=new oe,Ls=new oe,As=new oe,Es=new oe,Ps=new oe,Ms=new ai,Ss=new ai;const Bs=new Array(4);Bs[0]=0,Bs[1]=1,Bs[2]=1,Bs[3]=0;const ks=new Array(4);ks[0]=!1,ks[1]=!0,ks[2]=!1,ks[3]=!0;class Rs{constructor(e,t,i,r){this.isPole=!1,this._tileGroup=0,this._projection=xs,this.node=e,this.planet=t,this.handler=t.renderer.handler,this.bsphere=new bt,this._plainRadius=0,this.bbox=new xt,this._sw=new oe,this._nw=new oe,this._se=new oe,this._ne=new oe,this.centerNormal=new oe,this._extent=this._extentMerc=r,this._extentLonLat=new ie,this.gridSize=t.terrain.gridSizeByZoom[i],this.fileGridSize=0,this.tileZoom=i,this.tileX=0,this.tileXE=0,this.tileXW=0,this.tileYN=0,this.tileYS=0,this.tileY=0,this.tileIndex="",this._assignTileIndexes(),this.materials=[],this.plainReady=!1,this.initialized=!1,this.normalMapReady=!1,this.terrainReady=!1,this.terrainIsLoading=!1,this.terrainExists=!1,this.passReady=!1,this.plainVertices=null,this.plainVerticesHigh=null,this.plainVerticesLow=null,this.plainNormals=null,this.terrainVertices=null,this.terrainVerticesHigh=null,this.terrainVerticesLow=null,this.noDataVertices=null,this.tempVertices=null,this.tempVerticesHigh=null,this.tempVerticesLow=null,this.normalMapTexture=null,this.normalMapTextureBias=new Float32Array(3),this.normalMapVertices=null,this.normalMapVerticesHigh=null,this.normalMapVerticesLow=null,this.normalMapNormals=null,this.vertexNormalBuffer=null,this.vertexPositionBuffer=null,this.vertexPositionBufferHigh=null,this.vertexPositionBufferLow=null,this.vertexTextureCoordBuffer=null,this._globalTextureCoordinates=new Float32Array(4),this._inTheQueue=!1,this._appliedNeighborsZoom=[0,0,0,0],this._slices=[],this._indexBuffer=null,this.readyToEngage=!1,this.plainProcessing=!1,this.normalMapTexturePtr=null}checkZoom(){return this.tileZoom<this.planet.terrain._maxNodeZoom}getEntityTerrainPoint(e,t){return this.getTerrainPoint(e._cartesian,this.getInsideLonLat(e),t)}getInsideLonLat(e){return e._lonLatMerc}isEntityInside(e){return this._extentLonLat.isInside(e._lonLat)}getTerrainPoint(e,t,i){let r=this.tempVertices;if(r&&r.length){let n=this.planet.ellipsoid.getSurfaceNormal3v(e);Ms.set(e,n.negateTo());let s=this._extent.northEast,a=this._extent.southWest,o=Math.sqrt(r.length/3)-1,l=s.lon,h=s.lat,c=a.lon,d=a.lat,_=(l-c)/o,u=(h-d)/o,f=t.lon-c,g=t.lat-d,p=Math.floor(f/_),m=Math.floor(o-g/u),v=3*((o+1)*m+p),y=3*((o+1)*(m+1)+p);Ls.set(r[v],r[v+1],r[v+2]),As.set(r[v+3],r[v+4],r[v+5]),Es.set(r[y],r[y+1],r[y+2]);let x=Ms.hitTriangle(Ls,As,Es,i);if(x===ai.INSIDE)return e.distance(i);if(x===ai.AWAY){if(Ss.set(e,n),Ss.hitTriangle(Ls,As,Es,i)===ai.INSIDE)return-e.distance(i)}if(Ps.set(r[y+3],r[y+4],r[y+5]),x=Ms.hitTriangle(As,Ps,Es,i),x===ai.INSIDE)return e.distance(i);if(x===ai.AWAY){if(Ss.set(e,n),Ss.hitTriangle(As,Ps,Es,i)===ai.INSIDE)return-e.distance(i)}return x===ai.AWAY?-e.distance(i):e.distance(i)}return e.distance(this.planet.ellipsoid.hitRay(Ms.origin,Ms.direction))}projectNative(e){return e.forwardMercator()}loadTerrain(e=!1){this.tileZoom<this.planet.terrain.minZoom||this.planet.terrain.isEmpty?(this.terrainIsLoading=!0,this.elevationsNotExists(),this._inTheQueue||this.planet._normalMapCreator.queue(this)):this.tileZoom>this.planet.terrain.maxZoom?this.elevationsNotExists():this.terrainIsLoading||this.terrainReady||this.planet.terrain.loadTerrain(this,e)}elevationsExists(e){if(this.plainReady&&this.terrainIsLoading){let t=new Float32Array(e.length);t.set(e),this.planet._terrainWorker.make({segment:this,elevations:t}),this.plainVerticesHigh=null,this.plainVerticesLow=null,this.normalMapVerticesHigh=null,this.normalMapVerticesLow=null,this.planet.terrain.equalizeVertices||(this.tempVerticesHigh=null,this.tempVerticesLow=null)}}elevationsNotExists(){if(this.planet&&this.tileZoom<=this.planet.terrain.maxNativeZoom){if(this.plainReady&&this.terrainIsLoading){this.terrainIsLoading=!1;let e=this.node;e.appliedTerrainNodeId=this.node.nodeId,e.equalizedSideWithNodeId[0]=e.equalizedSideWithNodeId[1]=e.equalizedSideWithNodeId[2]=e.equalizedSideWithNodeId[3]=e.appliedTerrainNodeId,this.planet.lightEnabled&&!this._inTheQueue&&this.planet._normalMapCreator.queue(this),this.readyToEngage=!0}this.terrainVertices=this.plainVertices,this.terrainVerticesHigh=this.plainVerticesHigh,this.terrainVerticesLow=this.plainVerticesLow,this.tempVertices=this.terrainVertices,this.tempVerticesHigh=this.terrainVerticesHigh,this.tempVerticesLow=this.terrainVerticesLow,this.noDataVertices=null,this.fileGridSize=Math.sqrt(this.terrainVertices.length/3)-1,this.gridSize=this.fileGridSize,this.terrainReady=!0,this.terrainExists=!1}else if(this.plainReady&&this.terrainIsLoading){this.terrainIsLoading=!1;let e=this.node;e.appliedTerrainNodeId=this.node.nodeId,e.equalizedSideWithNodeId[0]=e.equalizedSideWithNodeId[1]=e.equalizedSideWithNodeId[2]=e.equalizedSideWithNodeId[3]=e.appliedTerrainNodeId,this.readyToEngage=!0,this.terrainReady=!0,this.passReady=!0,this.terrainExists=!1}}_checkEqualization(e,t){return t&&this.tileZoom>=t.segment.tileZoom&&this.node.equalizedSideWithNodeId[e]!==t.equalizedSideWithNodeId[Ft[e]]}equalize(){if(this.tileZoom<8||this.gridSize<2)return;this.readyToEngage=!0;let e=this.node.neighbors,t=this.tempVertices,i=this.tempVerticesHigh,r=this.tempVerticesLow,n=this.gridSize,s=n+1,a=e[0][0];if(this._checkEqualization(0,a)){this.node.equalizedSideWithNodeId[0]=a.equalizedSideWithNodeId[2],this.readyToEngage=!0;let e=this.node.getOffsetOppositeNeighbourSide(a,0),o=a.segment.tempVertices,l=a.segment.tempVerticesHigh,h=a.segment.tempVerticesLow,c=a.segment.gridSize,d=c+1,_=1/(1<<this.tileZoom-a.segment.tileZoom),u=Math.max(n/(c*_),1),f=Math.max(c*_/n,1);for(let n=0,a=e*c;n<s;n+=u,a+=f){const e=3*n,s=3*(d*c+a);t[e]=o[s],t[e+1]=o[s+1],t[e+2]=o[s+2],i[e]=l[s],i[e+1]=l[s+1],i[e+2]=l[s+2],r[e]=h[s],r[e+1]=h[s+1],r[e+2]=h[s+2]}}if(a=e[1][0],this._checkEqualization(1,a)){this.node.equalizedSideWithNodeId[1]=a.equalizedSideWithNodeId[3],this.readyToEngage=!0;let e=this.node.getOffsetOppositeNeighbourSide(a,1),o=a.segment.tempVertices,l=a.segment.tempVerticesHigh,h=a.segment.tempVerticesLow,c=a.segment.gridSize,d=c+1,_=1/(1<<this.tileZoom-a.segment.tileZoom),u=Math.max(n/(c*_),1),f=Math.max(c*_/n,1);for(let a=0,_=e*c;a<s;a+=u,_+=f){const e=3*(s*a+n),c=d*_*3;t[e]=o[c],t[e+1]=o[c+1],t[e+2]=o[c+2],i[e]=l[c],i[e+1]=l[c+1],i[e+2]=l[c+2],r[e]=h[c],r[e+1]=h[c+1],r[e+2]=h[c+2]}}if(a=e[2][0],this._checkEqualization(2,a)){this.node.equalizedSideWithNodeId[2]=a.equalizedSideWithNodeId[0],this.readyToEngage=!0;let e=this.node.getOffsetOppositeNeighbourSide(a,2),o=a.segment.tempVertices,l=a.segment.tempVerticesHigh,h=a.segment.tempVerticesLow,c=a.segment.gridSize,d=1/(1<<this.tileZoom-a.segment.tileZoom),_=Math.max(n/(c*d),1),u=Math.max(c*d/n,1);for(let a=0,d=e*c;a<s;a+=_,d+=u){const e=3*(s*n+a),c=3*d;t[e]=o[c],t[e+1]=o[c+1],t[e+2]=o[c+2],i[e]=l[c],i[e+1]=l[c+1],i[e+2]=l[c+2],r[e]=h[c],r[e+1]=h[c+1],r[e+2]=h[c+2]}}if(a=e[3][0],this._checkEqualization(3,a)){this.node.equalizedSideWithNodeId[3]=a.equalizedSideWithNodeId[1],this.readyToEngage=!0;let e=this.node.getOffsetOppositeNeighbourSide(a,3),o=a.segment.tempVertices,l=a.segment.tempVerticesHigh,h=a.segment.tempVerticesLow,c=a.segment.gridSize,d=c+1,_=1/(1<<this.tileZoom-a.segment.tileZoom),u=Math.max(n/(c*_),1),f=Math.max(c*_/n,1);for(let n=0,a=e*c;n<s;n+=u,a+=f){const e=s*n*3,_=3*(d*a+c);t[e]=o[_],t[e+1]=o[_+1],t[e+2]=o[_+2],i[e]=l[_],i[e+1]=l[_+1],i[e+2]=l[_+2],r[e]=h[_],r[e+1]=h[_+1],r[e+2]=h[_+2]}}}engage(){this.readyToEngage=!1,this.createCoordsBuffers(this.tempVerticesHigh,this.tempVerticesLow,this.gridSize)}_terrainWorkerCallback(e){if(this.plainReady){this.readyToEngage=!0,this.normalMapNormals=null,this.normalMapVertices=null,this.normalMapVerticesHigh=null,this.normalMapVerticesLow=null,this.terrainVertices=null,this.terrainVerticesHigh=null,this.terrainVerticesLow=null,this.noDataVertices=null,this.tempVertices=null,this.tempVerticesHigh=null,this.tempVerticesLow=null,this.normalMapNormals=e.normalMapNormals,this.normalMapVertices=e.normalMapVertices,this.normalMapVerticesHigh=e.normalMapVerticesHigh,this.normalMapVerticesLow=e.normalMapVerticesLow,this.terrainVertices=e.terrainVertices,this.terrainVerticesHigh=e.terrainVerticesHigh,this.terrainVerticesLow=e.terrainVerticesLow,this.noDataVertices=e.noDataVertices,this.tempVertices=this.terrainVertices,this.tempVerticesHigh=this.terrainVerticesHigh,this.tempVerticesLow=this.terrainVerticesLow,this.setBoundingVolumeArr(e.bounds),this.gridSize=Math.sqrt(this.terrainVertices.length/3)-1;let t=this.node;if(t.appliedTerrainNodeId=t.nodeId,t.equalizedSideWithNodeId[0]=t.equalizedSideWithNodeId[1]=t.equalizedSideWithNodeId[2]=t.equalizedSideWithNodeId[3]=t.appliedTerrainNodeId,this.terrainReady=!0,this.terrainIsLoading=!1,this.terrainExists=!0,!this.normalMapTexturePtr){const e=this.planet._normalMapCreator;this.normalMapTexturePtr=this.planet.renderer.handler.createEmptyTexture_l(e.width,e.height)}this.planet.lightEnabled&&this.planet._normalMapCreator.queue(this)}}_normalMapEdgeEqualize(e){let t=this.node.neighbors,i=t[e][0],r=this.planet.terrain.maxZoom;this.tileZoom===r&&(t[0].length||t[1].length||t[2].length||t[3].length||(i=this.node.getEqualNeighbor(e)));let n=i&&i.segment,s=this;if(i&&n&&n.terrainReady&&n.terrainExists&&n.tileZoom<=r&&s._appliedNeighborsZoom[e]!==n.tileZoom){s._appliedNeighborsZoom[e]=n.tileZoom;let t=s.normalMapNormals,i=n.normalMapNormals;if(!t||!i)return;let r=s.normalMapNormals,a=n.normalMapNormals,o=Math.sqrt(t.length/3),l=o-1;const h=l*Bs[e];let c,d,_,u;if(s.tileZoom===n.tileZoom){const f=l-h;if(ks[e])for(let e=0;e<o;e++){let n=3*(e*o+h),s=3*(e*o+f);c=r[n]+a[s],d=r[n+1]+a[s+1],_=r[n+2]+a[s+2],u=1/Math.sqrt(c*c+d*d+_*_),i[s]=t[n]=c*u,i[s+1]=t[n+1]=d*u,i[s+2]=t[n+2]=_*u}else for(let e=0;e<o;e++){let n=3*(h*o+e),s=3*(f*o+e);c=r[n]+a[s],d=r[n+1]+a[s+1],_=r[n+2]+a[s+2],u=1/Math.sqrt(c*c+d*d+_*_),i[s]=t[n]=c*u,i[s+1]=t[n+1]=d*u,i[s+2]=t[n+2]=_*u}n._inTheQueue||n._appliedNeighborsZoom[Ft[e]]===s.tileZoom||(n._appliedNeighborsZoom[Ft[e]]=s.tileZoom,s.planet._normalMapCreator.queue(n))}}}applyTerrain(e){e?this.elevationsExists(e):this.elevationsNotExists()}deleteBuffers(){const e=this.handler.gl;e.deleteBuffer(this.vertexNormalBuffer),e.deleteBuffer(this.vertexPositionBuffer),e.deleteBuffer(this.vertexPositionBufferHigh),e.deleteBuffer(this.vertexPositionBufferLow),this.vertexNormalBuffer=null,this.vertexPositionBuffer=null,this.vertexPositionBufferHigh=null,this.vertexPositionBufferLow=null,this.vertexTextureCoordBuffer=null}deleteMaterials(){let e=this.materials;for(let t=0;t<e.length;t++){let i=e[t];i&&i.clear()}this.materials.length=0}deleteElevations(){this.terrainExists=!1,this.terrainReady=!1,this.terrainIsLoading=!1,this.normalMapVertices=null,this.normalMapVerticesHigh=null,this.normalMapVerticesLow=null,this.normalMapNormals=null,this.tempVertices=null,this.tempVerticesHigh=null,this.tempVerticesLow=null,this.terrainVertices=null,this.terrainVerticesHigh=null,this.terrainVerticesLow=null,this.noDataVertices=null,this.plainVertices=null,this.plainVerticesHigh=null,this.plainVerticesLow=null,this.plainNormals=null,this.normalMapReady&&(this.handler.gl.deleteTexture(this.normalMapTexture),this.normalMapReady=!1),this._appliedNeighborsZoom=[0,0,0,0],this.normalMapTextureBias[0]=0,this.normalMapTextureBias[1]=0,this.normalMapTextureBias[2]=1,this._inTheQueue=!1}clearSegment(){this.plainReady=!1,this.initialized=!1,this.deleteBuffers(),this.deleteMaterials(),this.deleteElevations()}destroySegment(){this.clearSegment();let e=this._slices.length;for(;e--;)this._slices[e].clear();this._slices=null,this.node=null,this.planet=null,this.handler=null,this.bbox=null,this.bsphere=null,this._extent=null,this.materials=null,this.plainVertices=null,this.plainVerticesHigh=null,this.plainVerticesLow=null,this.plainNormals=null,this.terrainVertices=null,this.terrainVerticesHigh=null,this.terrainVerticesLow=null,this.noDataVertices=null,this.tempVertices=null,this.tempVerticesHigh=null,this.tempVerticesLow=null,this.normalMapTextureBias=null,this.normalMapTexture=null,this.normalMapVertices=null,this.normalMapVerticesHigh=null,this.normalMapVerticesLow=null,this.normalMapNormals=null,this.vertexNormalBuffer=null,this.vertexPositionBuffer=null,this.vertexPositionBufferHigh=null,this.vertexPositionBufferLow=null,this.vertexTextureCoordBuffer=null,this._projection=null,this._appliedNeighborsZoom=null,this._globalTextureCoordinates=null}_setExtentLonLat(){this._extentLonLat=this._extent.inverseMercator()}createBoundsByExtent(){const e=this.planet.ellipsoid,t=this._extentLonLat,i=e.geodeticToCartesian(t.southWest.lon,t.southWest.lat),r=e.geodeticToCartesian(t.northEast.lon,t.northEast.lat),n=e.geodeticToCartesian(t.southWest.lon,t.northEast.lat),s=e.geodeticToCartesian(t.northEast.lon,t.southWest.lat);this._sw.copy(i),this._nw.copy(n),this._ne.copy(r),this._se.copy(s),this.setBoundingVolume3v(i,r)}createBoundsByParent(){let e=this.node;for(;e.parentNode&&!e.segment.terrainReady;)e=e.parentNode;let t=1<<this.tileZoom-e.segment.tileZoom,i=this.tileX-e.segment.tileX*t,r=this.tileY-e.segment.tileY*t;if(e.segment.terrainReady&&e.segment.tileZoom>=this.planet.terrain.minZoom){let n=e.segment.gridSize/t;if(n>=1){this.bsphere.center.x=e.segment.bsphere.center.x,this.bsphere.center.y=e.segment.bsphere.center.y,this.bsphere.center.z=e.segment.bsphere.center.z,this.bsphere.radius=e.segment.bsphere.radius;let t=n*r,s=n*i,a=e.segment.gridSize+1,o=3*((t+n)*a+s),l=3*(t*a+s),h=3*(t*a+s+n),c=3*((t+n)*a+s+n),d=e.segment.tempVertices,_=new oe(d[o],d[o+1],d[o+2]),u=new oe(d[h],d[h+1],d[h+2]),f=new oe(d[l],d[l+1],d[l+2]),g=new oe(d[c],d[c+1],d[c+2]);this._sw.copy(_),this._nw.copy(f),this._ne.copy(u),this._se.copy(g)}else{let t,s=e.segment,a=Math.floor(n*r),o=Math.floor(n*i),l=1/n,h=r-l*a,c=i-l*o;t=1===s.gridSize?s.tempVertices:Ve(s.tempVertices,s.gridSize,a,o,1);let d,_,u=new oe(t[0],t[1],t[2]),f=new oe(t[9],t[10],t[11]),g=new oe(t[3]-t[0],t[4]-t[1],t[5]-t[2]),p=new oe(t[6]-t[0],t[7]-t[1],t[8]-t[2]),m=new oe(t[3]-t[9],t[4]-t[10],t[5]-t[11]),v=new oe(t[6]-t[9],t[7]-t[10],t[8]-t[11]),y=h,x=c;d=y+x<l?oe.add(g.scaleTo(x/l),p.scaleTo(y/l)).addA(u):oe.add(v.scaleTo(1-x/l),m.scaleTo(1-y/l)).addA(f),y=h+1,x=c+1,_=y+x<l?oe.add(g.scaleTo(x/l),p.scaleTo(y/l)).addA(u):oe.add(v.scaleTo(1-x/l),m.scaleTo(1-y/l)).addA(f),this.setBoundingVolume3v(d,_)}}else this.createBoundsByExtent()}setBoundingSphere(e,t,i,r){this.bsphere.center.x=e,this.bsphere.center.y=t,this.bsphere.center.z=i,this.bsphere.radius=this.bsphere.center.distance(r)}setBoundingVolume(e,t,i,r,n,s){this.bbox.setFromBoundsArr([e,t,i,r,n,s]);let a=e+.5*(r-e),o=t+.5*(n-t),l=i+.5*(s-i);this.bsphere.center.set(a,o,l),this.bsphere.radius=this.bsphere.center.distance(new oe(e,t,i))}setBoundingVolume3v(e,t){this.bbox.setFromBoundsArr([e.x,e.y,e.z,t.x,t.y,t.z]);let i=e.x+.5*(t.x-e.x),r=e.y+.5*(t.y-e.y),n=e.z+.5*(t.z-e.z);this.bsphere.center.set(i,r,n),this.bsphere.radius=this.bsphere.center.distance(new oe(e.x,e.y,e.z))}setBoundingVolumeArr(e){this.bbox.setFromBoundsArr(e);let t=e[0]+.5*(e[3]-e[0]),i=e[1]+.5*(e[4]-e[1]),r=e[2]+.5*(e[5]-e[2]);this.bsphere.center.set(t,i,r),this.bsphere.radius=this.bsphere.center.distance(new oe(e[0],e[1],e[2]))}createCoordsBuffers(e,t,i){const r=(i+1)*(i+1),n=this.handler;this.vertexPositionBufferHigh&&this.vertexPositionBufferHigh.numItems===r?(n.setStreamArrayBuffer(this.vertexPositionBufferHigh,e),n.setStreamArrayBuffer(this.vertexPositionBufferLow,t)):(n.gl.deleteBuffer(this.vertexPositionBufferHigh),n.gl.deleteBuffer(this.vertexPositionBufferLow),this.vertexTextureCoordBuffer=this.planet._textureCoordsBufferCache[Math.log2(i)],this.vertexPositionBufferHigh=n.createArrayBuffer(e,3,r),this.vertexPositionBufferLow=n.createArrayBuffer(t,3,r))}_addViewExtent(){const e=this._extentLonLat;let t=this.planet._viewExtent;e.southWest.lon<t.southWest.lon&&(t.southWest.lon=e.southWest.lon),e.northEast.lon>t.northEast.lon&&(t.northEast.lon=e.northEast.lon),e.southWest.lat<t.southWest.lat&&(t.southWest.lat=e.southWest.lat),e.northEast.lat>t.northEast.lat&&(t.northEast.lat=e.northEast.lat)}_assignTileIndexes(){this._tileGroup=0;const e=this.tileZoom,t=this._extent,i=F;this.tileX=Math.round(Math.abs(-i-t.southWest.lon)/(t.northEast.lon-t.southWest.lon)),this.tileY=Math.round(Math.abs(i-t.northEast.lat)/(t.northEast.lat-t.southWest.lat));const r=Math.pow(2,e);this.tileXE=(this.tileX+1)%r,this.tileXW=(r+this.tileX-1)%r,this.tileYN=this.tileY-1,this.tileYS=this.tileY+1,this.tileIndex=Ut.getTileIndex(this.tileX,this.tileY,e)}initialize(){const e=this.planet,t=this.node;if(this.gridSize=e.terrain.gridSizeByZoom[this.tileZoom]||e.terrain.plainGridSize,t.sideSizeLog2[0]=t.sideSizeLog2[1]=t.sideSizeLog2[2]=t.sideSizeLog2[3]=Math.log2(this.gridSize),this.tileZoom<=e.terrain.maxZoom){const t=this.planet._normalMapCreator;this.normalMapTexturePtr=e.renderer.handler.createEmptyTexture_l(t.width,t.height)}this.normalMapTexture=this.planet.transparentTexture,this._assignGlobalTextureCoordinates(),this.initialized=!0}_assignGlobalTextureCoordinates(){const e=this._extent;this._globalTextureCoordinates[0]=(e.southWest.lon+F)*q,this._globalTextureCoordinates[1]=(F-e.northEast.lat)*q,this._globalTextureCoordinates[2]=(e.northEast.lon+F)*q,this._globalTextureCoordinates[3]=(F-e.southWest.lat)*q}createPlainSegmentAsync(){let e=this.planet,t=e.terrain;t.isReady()&&!this.plainReady&&this.tileZoom<=t.maxZoom&&(this.plainProcessing=!0,e._plainSegmentWorker.make(this))}_plainSegmentWorkerCallback(e){this.plainProcessing=!1,this.initialized&&!this.terrainReady&&(this.plainReady=!0,this.plainVertices=e.plainVertices,this.plainVerticesHigh=e.plainVerticesHigh,this.plainVerticesLow=e.plainVerticesLow,this.plainNormals=e.plainNormals,this._plainRadius=e.plainRadius,this.normalMapNormals=e.normalMapNormals,this.normalMapVertices=e.normalMapVertices,this.normalMapVerticesHigh=e.normalMapVerticesHigh,this.normalMapVerticesLow=e.normalMapVerticesLow,this.fileGridSize=Math.sqrt(e.normalMapVertices.length/3)-1)}createPlainSegment(){this.initialize(),this._createPlainVertices(),this.readyToEngage=!0}_createPlainVertices(){const e=this.planet.terrain.gridSizeByZoom[this.tileZoom],t=this._extent,i=this.planet.terrain.plainGridSize,r=t.getWidth()/Math.max(i,e),n=t.southWest.lon,s=t.northEast.lat,a=Math.max(i/e,1),o=Math.max(i,e)+1,l=this.planet.ellipsoid._invRadii2,h=o*o,c=(e+1)*(e+1)*3;let d=0,_=0;this.plainNormals=new Float32Array(c),this.plainVertices=new Float64Array(c),this.plainVerticesHigh=new Float32Array(c),this.plainVerticesLow=new Float32Array(c),this.normalMapNormals=new Float32Array(3*h),this.normalMapVertices=new Float64Array(3*h),this.normalMapVerticesHigh=new Float32Array(3*h),this.normalMapVerticesLow=new Float32Array(3*h);let u=this.plainVertices,f=this.plainVerticesHigh,g=this.plainVerticesLow,p=this.plainNormals,m=this.normalMapVertices,v=this.normalMapVerticesHigh,y=this.normalMapVerticesLow,x=this.normalMapNormals;for(let e=0;e<h;e++){let t=e%o,i=~~(e/o),h=this.planet.ellipsoid.lonLatToCartesian(I.inverseMercator(n+t*r,s-i*r)),c=h.x*l.x,b=h.y*l.y,w=h.z*l.z,T=1/Math.sqrt(c*c+b*b+w*w),C=c*T,L=b*T,A=w*T;oe.doubleToTwoFloats(h,Ts,Cs),m[_]=h.x,v[_]=Ts.x,y[_]=Cs.x,x[_++]=C,m[_]=h.y,v[_]=Ts.y,y[_]=Cs.y,x[_++]=L,m[_]=h.z,v[_]=Ts.z,y[_]=Cs.z,x[_++]=A,i%a==0&&t%a==0&&(u[d]=h.x,f[d]=Ts.x,g[d]=Cs.x,p[d++]=C,u[d]=h.y,f[d]=Ts.y,g[d]=Cs.y,p[d++]=L,u[d]=h.z,f[d]=Ts.z,g[d]=Cs.z,p[d++]=A)}this.terrainVertices=u,this.terrainVerticesHigh=f,this.terrainVerticesLow=g,this.plainReady=!0}getMaterialByLayer(e){return this.materials[e.__id]}_getLayerExtentOffset(e){const t=e._extentMerc,i=this._extent,r=t.northEast.lon-t.southWest.lon,n=t.northEast.lat-t.southWest.lat;return[(i.southWest.lon-t.southWest.lon)/r,(t.northEast.lat-i.northEast.lat)/n,(i.northEast.lon-i.southWest.lon)/r,(i.northEast.lat-i.southWest.lat)/n]}screenRendering(e,t,i,r,n=!1){const s=this.handler.gl,a=e.attributes,o=e.uniforms,l=this.materials,h=this.planet;let c,d;t&&t.length?(d=t[0],c=d._height):c=0,s.activeTexture(s.TEXTURE0+h.SLICE_SIZE+2),s.bindTexture(s.TEXTURE_2D,r||this.getDefaultTexture()),s.uniform1i(o.defaultTexture,h.SLICE_SIZE+2);let _=0,u=0,f=!1,g=this._slices[i];for(g?g.layers=[]:g=this._slices[i]=new ws(this),this._indexBuffer=this._getIndexBuffer();d;){if(this.layerOverlap(d)&&(d._fading&&d._fadingOpacity>0||(d.minZoom>=h.minCurrZoom||d.maxZoom>=h.minCurrZoom)&&(d.minZoom<=h.maxCurrZoom||d.maxZoom<=h.maxCurrZoom))){f=!0;let e=l[d.__id];e||(e=l[d.__id]=d.createMaterial(this)),e.isReady||(this.planet._renderCompleted=!1),g.append(d,e),h._samplerArr[_]=_,s.activeTexture(s.TEXTURE0+_),s.bindTexture(s.TEXTURE_2D,e.texture||h.transparentTexture),_++}u++,d=t[u]}!f&&n||(s.uniform1i(o.samplerCount,_),s.uniform1f(o.height,c),s.uniform1iv(o.samplerArr,h._samplerArr),s.uniform4fv(o.tileOffsetArr,g.tileOffsetArr),s.uniform1fv(o.layerOpacityArr,g.layerOpacityArr),h.lightEnabled&&(s.activeTexture(s.TEXTURE0+h.SLICE_SIZE+3),s.bindTexture(s.TEXTURE_2D,this.normalMapTexture||h.transparentTexture),s.uniform1i(o.uNormalMap,h.SLICE_SIZE+3),s.uniform3fv(o.uNormalMapBias,this.normalMapTextureBias),s.uniform4fv(o.uGlobalTextureCoord,this._globalTextureCoordinates)),s.bindBuffer(s.ARRAY_BUFFER,this.vertexPositionBufferHigh),s.vertexAttribPointer(a.aVertexPositionHigh,this.vertexPositionBufferHigh.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this.vertexPositionBufferLow),s.vertexAttribPointer(a.aVertexPositionLow,this.vertexPositionBufferLow.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this.vertexTextureCoordBuffer),s.vertexAttribPointer(a.aTextureCoord,2,s.UNSIGNED_SHORT,!0,0,0),s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,this._indexBuffer),s.drawElements(h.drawMode,this._indexBuffer.numItems,s.UNSIGNED_INT,0))}heightPickingRendering(e,t){const i=this.handler.gl,r=e.attributes,n=e.uniforms;let s;s=t&&t.length?t[0]._height:0,i.uniform1f(n.height,s),i.bindBuffer(i.ARRAY_BUFFER,this.vertexPositionBufferHigh),i.vertexAttribPointer(r.aVertexPositionHigh,this.vertexPositionBufferHigh.itemSize,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,this.vertexPositionBufferLow),i.vertexAttribPointer(r.aVertexPositionLow,this.vertexPositionBufferLow.itemSize,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,this._indexBuffer),i.drawElements(i.TRIANGLE_STRIP,this._indexBuffer.numItems,i.UNSIGNED_INT,0)}colorPickingRendering(e,t,i,r,n=!1){const s=this.handler.gl,a=e.attributes,o=e.uniforms;let l,h=this.materials,c=this.planet;l=t&&t.length?t[0]._height:0;let d=!1,_=this._slices[i],u=_.layers.length;for(let e=0;e<u;e++){d=!0;let t=_.layers[e],i=4*e;c._pickingColorArr[i]=t._pickingColor.x/255,c._pickingColorArr[i+1]=t._pickingColor.y/255,c._pickingColorArr[i+2]=t._pickingColor.z/255,c._pickingColorArr[i+3]=Number(t._pickingEnabled),c._samplerArr[e]=e,s.activeTexture(s.TEXTURE0+e),s.bindTexture(s.TEXTURE_2D,h[t.__id].texture||this.planet.transparentTexture),c._pickingMaskArr[e]=e+c.SLICE_SIZE,s.activeTexture(s.TEXTURE0+e+c.SLICE_SIZE),s.bindTexture(s.TEXTURE_2D,h[t.__id].pickingMask||this.planet.transparentTexture)}!d&&n||(s.uniform1i(o.samplerCount,u),s.uniform1f(o.height,l),s.uniform1iv(o.samplerArr,c._samplerArr),s.uniform1iv(o.pickingMaskArr,c._pickingMaskArr),s.uniform4fv(o.pickingColorArr,c._pickingColorArr),s.uniform4fv(o.tileOffsetArr,_.tileOffsetArr),s.uniform1fv(o.layerOpacityArr,_.layerOpacityArr),s.bindBuffer(s.ARRAY_BUFFER,this.vertexPositionBufferHigh),s.vertexAttribPointer(a.aVertexPositionHigh,this.vertexPositionBufferHigh.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this.vertexPositionBufferLow),s.vertexAttribPointer(a.aVertexPositionLow,this.vertexPositionBufferLow.itemSize,s.FLOAT,!1,0,0),s.bindBuffer(s.ARRAY_BUFFER,this.vertexTextureCoordBuffer),s.vertexAttribPointer(a.aTextureCoord,2,s.UNSIGNED_SHORT,!0,0,0),s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,this._indexBuffer),s.drawElements(s.TRIANGLE_STRIP,this._indexBuffer.numItems,s.UNSIGNED_INT,0))}depthRendering(e,t){const i=this.handler.gl,r=e.attributes,n=e.uniforms;var s;s=t&&t.length?t[0]._height:0,i.uniform1f(n.height,s),i.bindBuffer(i.ARRAY_BUFFER,this.vertexPositionBufferHigh),i.vertexAttribPointer(r.aVertexPositionHigh,this.vertexPositionBufferHigh.itemSize,i.FLOAT,!1,0,0),i.bindBuffer(i.ARRAY_BUFFER,this.vertexPositionBufferLow),i.vertexAttribPointer(r.aVertexPositionLow,this.vertexPositionBufferLow.itemSize,i.FLOAT,!1,0,0),i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,this._indexBuffer),i.drawElements(i.TRIANGLE_STRIP,this._indexBuffer.numItems,i.UNSIGNED_INT,0)}_getIndexBuffer(){const e=this.node.sideSizeLog2;let t=this.planet._indexesCache[Math.log2(this.gridSize)][e[0]][e[1]][e[2]][e[3]];if(!t.buffer){let i=ss().createSegmentIndexes(Math.log2(this.gridSize),[e[0],e[1],e[2],e[3]]);t.buffer=this.planet.renderer.handler.createElementArrayBuffer(i,1),this.planet._indexesCacheToRemoveCounter++}return t.buffer}_collectVisibleNodes(){this.planet._visibleNodes[this.node.nodeId]=this.node}layerOverlap(e){return this._extent.overlaps(e._extentMerc)}getDefaultTexture(){return this.planet.solidTextureOne}getExtentLonLat(){return this._extentLonLat}getExtentMerc(){return this._extentMerc}getExtent(){return this._extent}getNodeState(){let e=this.planet._visibleNodes[this.node.nodeId];return e&&e.state||0}getNeighborSide(e){if(this.tileY===e.tileY){if(this.tileX===e.tileXE)return 3;if(this.tileX===e.tileXW)return 1}else if(this.tileX===e.tileX){if(this.tileY===e.tileYS)return 0;if(this.tileY===e.tileYN)return 2}return-1}}let zs=new oe,Is=new oe;const Fs=[new le(0,0),new le(1,0),new le(0,1),new le(1,1)],Ds=Math.sqrt(Fs.length)-1;let Ns={xmin:0,ymin:0,zmin:0,xmax:0,ymax:0,zmax:0},Hs=class e{constructor(e,t,i,r,n,s,a){t._createdNodesCount++,this.SegmentPrototype=e,this.planet=t,this.parentNode=r,this.partId=i,this.nodeId=i+n,this.state=null,this.appliedTerrainNodeId=-1,this.sideSizeLog2=[0,0,0,0],this.ready=!1,this.neighbors=[[],[],[],[]],this.equalizedSideWithNodeId=[this.nodeId,this.nodeId,this.nodeId,this.nodeId],this.nodes=[],this.segment=new e(this,t,s,a),this._cameraInside=!1,this.inFrustum=0,this.createBounds()}createChildrenNodes(){this.ready=!0;const t=this.planet,i=this.segment,r=i._extent,n=i.tileZoom+1,s=.5*r.getWidth(),a=.5*r.getHeight(),o=r.northEast,l=r.southWest,h=4*this.nodeId+1,c=new I(l.lon+s,l.lat+a),d=this.nodes;d[0]=new e(this.SegmentPrototype,t,0,this,h,n,new ie(new I(l.lon,l.lat+a),new I(l.lon+s,o.lat))),d[1]=new e(this.SegmentPrototype,t,1,this,h,n,new ie(c,new I(o.lon,o.lat))),d[2]=new e(this.SegmentPrototype,t,2,this,h,n,new ie(new I(l.lon,l.lat),c)),d[3]=new e(this.SegmentPrototype,t,3,this,h,n,new ie(new I(l.lon+s,l.lat),new I(o.lon,l.lat+a)))}createBounds(){let e=this.segment;e._setExtentLonLat(),0===e.tileZoom?e.setBoundingSphere(0,0,0,new oe(0,0,e.planet.ellipsoid.equatorialSize)):e.tileZoom<e.planet.terrain.minZoom?e.createBoundsByExtent():e.createBoundsByParent();let t=e.bsphere.center.x,i=e.bsphere.center.y,r=e.bsphere.center.z,n=1/Math.sqrt(t*t+i*i+r*r);e.centerNormal.x=t*n,e.centerNormal.y=i*n,e.centerNormal.z=r*n}getState(){if(-1===this.state)return this.state;let e=this.parentNode;for(;e;){if(2!==e.state)return 0;e=e.parentNode}return this.state}getEqualNeighbor(e){let t=this,i=Dt[e][t.partId];if(-1!==i)return t.parentNode.nodes[i];{let r=[];for(;t.parentNode;)if(r.push(t.partId),i=Dt[e][t.partId],t=t.parentNode,-1!==i){let n=r.length;for(e=Ft[e];t&&n--;)i=Nt[e][r[n]],t=t.nodes[i];return t}}}renderTree(e,t,i,r){if(this.planet._renderedNodes.length>=1e3)return;this.state=2,this.neighbors[0]=null,this.neighbors[1]=null,this.neighbors[2]=null,this.neighbors[3]=null,this.neighbors[0]=[],this.neighbors[1]=[],this.neighbors[2]=[],this.neighbors[3]=[];let n=this.segment,s=this.planet;if(this._cameraInside=!1,!this.parentNode||this.parentNode._cameraInside){let t;Math.abs(e._lonLat.lat)<=J&&n._projection.id===xs.id?t=n._extent.isInside(e._lonLatMerc):n._projection.id===bs.id&&(t=n._extent.isInside(e._lonLat)),t&&(e._insideSegment=n,this._cameraInside=!0)}this.inFrustum=0;let a=e.frustums,o=a.length;if(n.tileZoom<6)for(let e=0;e<o;e++)a[e].containsSphere(n.bsphere)&&(this.inFrustum|=1<<e);else{let e=1<<o-1-1;for(let t=0;e&&t<o;t++)n.terrainReady?a[t].containsBox(n.bbox)&&(e>>=1,this.inFrustum|=1<<t):a[t].containsSphere(n.bsphere)&&(e>>=1,this.inFrustum|=1<<t)}if(this.inFrustum||this._cameraInside||n.tileZoom<3){let a=Math.abs(e._lonLat.height),o=e.eye,l=o.length2()-this.planet.ellipsoid.polarSizeSqr,h=n.tileZoom>19||n.tileZoom<5&&!n.terrainReady||n.tileZoom<2;h=a>21e3?h||o.distance2(n._sw)<l||o.distance2(n._nw)<l||o.distance2(n._ne)<l||o.distance2(n._se)<l:h||e.eye.distance(n.bsphere.center)-n.bsphere.radius<3570*Math.sqrt(a),(this.inFrustum&&(h||a>1e4)||this._cameraInside)&&n._collectVisibleNodes(),n.tileZoom<2?this.traverseNodes(e,t,i,r):n.terrainReady&&(!t&&e.projectedSize(n.bsphere.center,n._plainRadius)<s.lodSize||t&&(n.tileZoom===t||!h))?h?(n.passReady=!0,this.renderNode(this.inFrustum,!this.inFrustum,i,r)):this.state=0:n.terrainReady&&n.checkZoom()&&(!t||e.projectedSize(n.bsphere.center,n.bsphere.radius)>this.planet._maxLodSize)?this.traverseNodes(e,t,n,r):h?(n.passReady=!!t&&n.terrainReady,this.renderNode(this.inFrustum,!this.inFrustum,i,r)):this.state=0}else this.state=0}traverseNodes(e,t,i,r){this.ready||this.createChildrenNodes();let n=this.nodes;n[0].renderTree(e,t,i,r),n[1].renderTree(e,t,i,r),n[2].renderTree(e,t,i,r),n[3].renderTree(e,t,i,r)}renderNode(e,t,i,r){let n=this.segment;n.terrainReady||(n.initialized||n.initialize(),this.whileTerrainLoading(i),n.plainProcessing||n.createPlainSegmentAsync(),n.plainReady&&!r&&n.loadTerrain()),n.planet.lightEnabled&&!n.normalMapReady&&this.whileNormalMapCreating(),t?this.state=-1:(!this._cameraInside&&n.tileZoom>this.planet.maxCurrZoom&&(this.planet.maxCurrZoom=n.tileZoom),n.tileZoom<this.planet.minCurrZoom&&(this.planet.minCurrZoom=n.tileZoom),n._addViewExtent(),this.addToRender(e))}addToRender(e){this.state=1;let t=this.planet._renderedNodes;for(let e=t.length-1;e>=0;--e){const i=t[e],r=this.getCommonSide(i);if(-1!==r){const e=Ft[r];if(0===this.neighbors[r].length||0===i.neighbors[e].length){const t=this.segment,n=i.segment,s=t.gridSize/(n.gridSize*Math.pow(2,n.tileZoom-t.tileZoom));let a=t.gridSize,o=n.gridSize;s>1?(a=Math.ceil(t.gridSize/s),o=n.gridSize):s<1&&(a=t.gridSize,o=Math.ceil(n.gridSize*s)),this.sideSizeLog2[r]=Math.log2(a),i.sideSizeLog2[e]=Math.log2(o)}this.neighbors[r].push(i),i.neighbors[e].push(this)}}t.push(this),this.segment.terrainReady||(this.planet._renderCompleted=!1,this.planet._terrainCompleted=!1);let i=0,r=this.planet._renderedNodesInFrustum;for(;e;)1&e&&r[i].push(this),i++,e>>=1}getCommonSide(e){const t=this.segment,i=e.segment;if(t.tileZoom===i.tileZoom&&t._tileGroup===i._tileGroup)return t.getNeighborSide(i);{const e=t._extentLonLat,r=i._extentLonLat;let n=e.northEast,s=e.southWest,a=r.northEast,o=r.southWest,l=n.lon,h=n.lat,c=s.lon,d=s.lat,_=a.lon,u=a.lat,f=o.lon,g=o.lat;if(t._tileGroup===i._tileGroup){if(l===f&&(h<=u&&d>=g||h>=u&&d<=g))return 1;if(c===_&&(h<=u&&d>=g||h>=u&&d<=g))return 3;if(h===g&&(c>=f&&l<=_||c<=f&&l>=_))return 0;if(d===u&&(c>=f&&l<=_||c<=f&&l>=_))return 2;if(0===i.tileX&&t.tileX===Math.pow(2,t.tileZoom)-1&&(h<=u&&d>=g||h>=u&&d<=g))return 1;if(0===t.tileX&&i.tileX===Math.pow(2,i.tileZoom)-1&&(h<=u&&d>=g||h>=u&&d<=g))return 3}if(0===t._tileGroup&&1===i._tileGroup&&0===t.tileY&&i.tileY===Math.pow(2,i.tileZoom)-1&&(c>=f&&l<=_||c<=f&&l>=_))return 0;if(2===t._tileGroup&&0===i._tileGroup&&0===t.tileY&&i.tileY===Math.pow(2,i.tileZoom)-1&&(c>=f&&l<=_||c<=f&&l>=_))return 0;if(1===i._tileGroup&&0===t._tileGroup&&t.tileY===Math.pow(2,t.tileZoom)-1&&0===i.tileY&&(c>=f&&l<=_||c<=f&&l>=_))return 2;if(1===t._tileGroup&&0===i._tileGroup&&t.tileY===Math.pow(2,t.tileZoom)-1&&0===i.tileY&&(c>=f&&l<=_||c<=f&&l>=_))return 2}return-1}whileNormalMapCreating(){const e=this.segment;e.terrainIsLoading||!e.terrainExists||e._inTheQueue||e.planet._normalMapCreator.queue(e);let t=this;for(;t.parentNode&&!t.segment.normalMapReady;)t=t.parentNode;const i=2<<e.tileZoom-t.segment.tileZoom-1;e.normalMapTexture=t.segment.normalMapTexture,e.normalMapTextureBias[0]=e.tileX-t.segment.tileX*i,e.normalMapTextureBias[1]=e.tileY-t.segment.tileY*i,e.normalMapTextureBias[2]=1/i}whileTerrainLoading(e){const t=this.segment;let i=this;if(e&&e.terrainReady)i=e.node;else for(;i.parentNode&&!i.segment.terrainReady;)i=i.parentNode;if(i.segment.terrainReady&&this.appliedTerrainNodeId!==i.nodeId){let e=2<<t.tileZoom-i.segment.tileZoom-1,r=t.tileX-i.segment.tileX*e,n=t.tileY-i.segment.tileY*e;const o=i.segment;let l,h,c,d;this.appliedTerrainNodeId=i.nodeId,this.equalizedSideWithNodeId[0]=this.equalizedSideWithNodeId[1]=this.equalizedSideWithNodeId[2]=this.equalizedSideWithNodeId[3]=this.appliedTerrainNodeId;let _=i.segment.gridSize/e,u=i.segment.fileGridSize/e;if(Ns.xmin=s,Ns.xmax=a,Ns.ymin=s,Ns.ymax=a,Ns.zmin=s,Ns.zmax=a,_>=1){t.gridSize=_;let e=(_+1)*(_+1)*3;l=new Float64Array(e),h=new Float32Array(e),c=new Float32Array(e),o.noDataVertices&&(d=new Uint8Array(e/3)),Ge(o.terrainVertices,o.terrainVerticesHigh,o.terrainVerticesLow,o.noDataVertices,o.gridSize,_*n,_*r,_,l,h,c,Ns,d)}else if(u>=1&&i.segment.terrainExists){t.gridSize=u;let e=(u+1)*(u+1)*3;l=new Float64Array(e),h=new Float32Array(e),c=new Float32Array(e),o.noDataVertices&&(d=new Uint8Array(e/3)),Ge(o.normalMapVertices,o.normalMapVerticesHigh,o.normalMapVerticesLow,o.noDataVertices,i.segment.fileGridSize,u*n,u*r,u,l,h,c,Ns,d)}else{t.gridSize=Ds;let e,i=Math.floor(_*n),s=Math.floor(_*r);e=1===o.gridSize?o.terrainVertices:Ve(o.terrainVertices,o.gridSize,i,s,1);let a=1/_,d=n-a*i,u=r-a*s,f=new oe(e[0],e[1],e[2]),g=new oe(e[9],e[10],e[11]),p=new oe(e[3]-e[0],e[4]-e[1],e[5]-e[2]),m=new oe(e[6]-e[0],e[7]-e[1],e[8]-e[2]),v=new oe(e[3]-e[9],e[4]-e[10],e[5]-e[11]),y=new oe(e[6]-e[9],e[7]-e[10],e[8]-e[11]),x=new oe;l=new Float64Array(3*Fs.length),h=new Float32Array(3*Fs.length),c=new Float32Array(3*Fs.length);for(let e=0;e<Fs.length;e++){let t=Fs[e].y+d,i=Fs[e].x+u,r=i*_,n=t*_;x=t+i<a?p.scaleTo(r).addA(m.scaleTo(n)).addA(f):y.scaleTo(1-r).addA(v.scaleTo(1-n)).addA(g),oe.doubleToTwoFloats(x,zs,Is);let s=3*e;l[s]=x.x,l[s+1]=x.y,l[s+2]=x.z,h[s]=zs.x,h[s+1]=zs.y,h[s+2]=zs.z,c[s]=Is.x,c[s+1]=Is.y,c[s+2]=Is.z,x.x<Ns.xmin&&(Ns.xmin=x.x),x.x>Ns.xmax&&(Ns.xmax=x.x),x.y<Ns.ymin&&(Ns.ymin=x.y),x.y>Ns.ymax&&(Ns.ymax=x.y),x.z<Ns.zmin&&(Ns.zmin=x.z),x.z>Ns.zmax&&(Ns.zmax=x.z)}}if(t.readyToEngage=!0,t.terrainVertices=l,t.terrainVerticesHigh=h,t.terrainVerticesLow=c,t.tempVertices=l,t.tempVerticesHigh=h,t.tempVerticesLow=c,t.noDataVertices=d,t.setBoundingVolume(Ns.xmin,Ns.ymin,Ns.zmin,Ns.xmax,Ns.ymax,Ns.zmax),t.tileZoom>t.planet.terrain.maxZoom&&i.segment.tileZoom>=t.planet.terrain.maxZoom&&(t._plainRadius=i.segment._plainRadius/e,t.terrainReady=!0,t.terrainIsLoading=!1,t.terrainVertices=l,t.terrainVerticesHigh=h,t.terrainVerticesLow=c,t.passReady=!0,this.appliedTerrainNodeId=this.nodeId,this.equalizedSideWithNodeId[0]=this.equalizedSideWithNodeId[1]=this.equalizedSideWithNodeId[2]=this.equalizedSideWithNodeId[3]=this.appliedTerrainNodeId,i.segment.terrainExists)){t.normalMapVertices=l,t.fileGridSize=Math.sqrt(l.length/3)-1;let i=Math.sqrt(o.normalMapNormals.length/3)-1,s=i/e;t.normalMapNormals=i>1?Ue(o.normalMapNormals,i,s*n,s*r,s):o.normalMapNormals}}}destroy(){this.state=0,this.segment.destroySegment();let e=this.neighbors;for(let t=0;t<e.length;t++){let i=e[t];if(i)for(let e=0;e<i.length;e++){let t=i[e];t&&t.neighbors&&(t.neighbors[0]=null,t.neighbors[1]=null,t.neighbors[2]=null,t.neighbors[3]=null)}}this.neighbors=null,this.parentNode=null,this.sideSizeLog2=null,this.segment=null}clearTree(){const e=this.getState();if(0===e||1===e)this.destroyBranches();else for(let e=0;e<this.nodes.length;e++)this.nodes[e]&&this.nodes[e].clearTree()}clearBranches(){for(let e=0;e<this.nodes.length;e++)this.nodes[e].clearBranches(),this.nodes[e].segment.deleteMaterials()}destroyBranches(){if(this.ready){let e,t=[];for(e=0;e<this.nodes.length;e++)t[e]=this.nodes[e];for(this.ready=!1,this.nodes=[],e=0;e<t.length;e++)t[e].destroyBranches(),t[e].destroy(),t[e]=null;t.length=0,t=null}}traverseTree(e){if(e(this),this.ready)for(let t=0;t<this.nodes.length;t++)this.nodes[t].traverseTree(e)}getOffsetOppositeNeighbourSide(e,t){let i=this,r=e.segment.tileZoom,n=0;for(;i.segment.tileZoom>r;)n+=Ht[i.partId][t]/(1<<i.segment.tileZoom-r),i=i.parentNode;return n}};class Os{constructor(e,t="",i=xs){this.name=t,this.projection=i,this._planet=e,this._quadTreeList=[]}destroyBranches(){for(let e=0,t=this._quadTreeList.length;e<t;e++)this._quadTreeList[e].destroyBranches()}clearLayerMaterial(e){let t=e.__id;for(let e=0,i=this._quadTreeList.length;e<i;e++)this._quadTreeList[e].traverseTree((function(e){let i=e.segment.materials;i[t]&&(i[t].clear(),i[t]=null)}))}get planet(){return this._planet}init(){}preRender(){for(let e=0;e<this._quadTreeList.length;e++){let t=this._quadTreeList[e];t.createChildrenNodes(),t.segment.createPlainSegment();for(let e=0;e<t.nodes.length;e++)t.nodes[e].segment.createPlainSegment()}}preLoad(){for(let e=0;e<this._quadTreeList.length;e++){let t=this._quadTreeList[e];t.segment.passReady=!0,t.renderNode(1),this._planet.normalMapCreator.drawSingle(t.segment);for(let e=0;e<t.nodes.length;e++)t.nodes[e].segment.passReady=!0,t.nodes[e].renderNode(1),this._planet._normalMapCreator.drawSingle(t.nodes[e].segment)}}collectRenderNodes(){for(let e=0;e<this._quadTreeList.length;e++)this._quadTreeList[e].renderTree(this._planet.camera,0,null)}clear(){for(let e=0;e<this._quadTreeList.length;e++)this._quadTreeList[e].clearTree()}get quadTreeList(){return this._quadTreeList}}const Vs=(90-J)/Math.pow(2,7);let Us=new oe,Gs=new oe;class Ws extends Rs{constructor(e,t,i,r){super(e,t,i,r),this._projection=bs,this._extentLonLat=this._extent,this._extentMerc=new ie(r.southWest.forwardMercatorEPS01(),r.northEast.forwardMercatorEPS01()),this._isNorth=this._extent.northEast.lat>0,this.isPole=!0}_setExtentLonLat(){this._extentLonLat=this._extent}projectNative(e){return e}getInsideLonLat(e){return e._lonLat}_getMaxZoom(){let e=0;if(this._isNorth){let t=Math.floor((90-this._extent.northEast.lat)/Vs);e=Math.floor(t/16)+7}else{let t=Math.floor((ee-this._extent.northEast.lat)/Vs);e=12-Math.floor(t/16)}return e}checkZoom(){return super.checkZoom()&&this.tileZoom<=this._getMaxZoom()}_assignTileIndexes(){this._assignTileXIndexes(this._extent),this._assignTileYIndexes(this._extent),this.tileIndex=Ut.getTileIndex(this.tileX,this.tileY,this.tileZoom)}_assignTileXIndexes(e){this.tileX=Math.round(Math.abs(-180-e.southWest.lon)/(e.northEast.lon-e.southWest.lon));let t=1<<this.tileZoom;this.tileXE=(this.tileX+1)%t,this.tileXW=(t+this.tileX-1)%t}_assignTileYIndexes(e){const t=e.northEast.lat;t>0?(this._tileGroup=1,this.tileY=Math.round((90-t)/(e.northEast.lat-e.southWest.lat))):(this._tileGroup=2,this.tileY=Math.round((ee-t)/(e.northEast.lat-e.southWest.lat))),this.tileYN=this.tileY-1,this.tileYS=this.tileY+1}_createPlainVertices(){const e=this.planet.terrain.gridSizeByZoom[this.tileZoom],t=this._extent,i=this.planet.terrain.plainGridSize,r=t.getWidth(),n=t.getHeight(),s=r/Math.max(i,e),a=n/e,o=t.southWest.lon,l=t.northEast.lat,h=Math.max(i/e,1),c=Math.max(i,e)+1,d=this.planet.ellipsoid._invRadii2;let _=0,u=0;const f=c*c,g=(e+1)*(e+1)*3;this.plainNormals=new Float32Array(g),this.plainVertices=new Float64Array(g),this.plainVerticesHigh=new Float32Array(g),this.plainVerticesLow=new Float32Array(g),this.normalMapNormals=new Float32Array(3*f),this.normalMapVertices=new Float64Array(3*f),this.normalMapVerticesHigh=new Float32Array(3*f),this.normalMapVerticesLow=new Float32Array(3*f);let p=549755748352,m=-549755748352,v=549755748352,y=-549755748352,x=549755748352,b=-549755748352,w=this.plainVertices,T=this.plainVerticesHigh,C=this.plainVerticesLow,L=this.plainNormals,A=this.normalMapVertices,E=this.normalMapVerticesHigh,P=this.normalMapVerticesLow,M=this.normalMapNormals;for(let e=0;e<f;e++){let t=e%c,i=~~(e/c);const r=this.planet.ellipsoid.lonLatToCartesian(new I(o+t*s,l-i*a));let n=r.x*d.x,f=r.y*d.y,g=r.z*d.z,S=1/Math.sqrt(n*n+f*f+g*g),B=n*S,k=f*S,R=g*S;oe.doubleToTwoFloats(r,Us,Gs),A[u]=r.x,E[u]=Us.x,P[u]=Gs.x,M[u++]=B,A[u]=r.y,E[u]=Us.y,P[u]=Gs.y,M[u++]=k,A[u]=r.z,E[u]=Us.z,P[u]=Gs.z,M[u++]=R,i%h==0&&t%h==0&&(w[_]=r.x,T[_]=Us.x,C[_]=Gs.x,L[_++]=B,w[_]=r.y,T[_]=Us.y,C[_]=Gs.y,L[_++]=k,w[_]=r.z,T[_]=Us.z,C[_]=Gs.z,L[_++]=R,r.x<p&&(p=r.x),r.x>m&&(m=r.x),r.y<v&&(v=r.y),r.y>y&&(y=r.y),r.z<x&&(x=r.z),r.z>b&&(b=r.z))}this.terrainVertices=w,this.terrainVerticesHigh=T,this.terrainVerticesLow=C;let S=.5*(m-p),B=.5*(y-v),k=.5*(b-x);this._plainRadius=Math.sqrt(S*S+B*B+k*k),this.plainReady=!0}_assignGlobalTextureCoordinates(){const e=this._extent;this._globalTextureCoordinates[0]=(e.southWest.lon+180)/360,this._globalTextureCoordinates[1]=(90-e.northEast.lat)/180,this._globalTextureCoordinates[2]=(e.northEast.lon+180)/360,this._globalTextureCoordinates[3]=(90-e.southWest.lat)/180}_collectVisibleNodes(){this._isNorth?this.planet._visibleNodesNorth[this.node.nodeId]=this.node:this.planet._visibleNodesSouth[this.node.nodeId]=this.node}_getLayerExtentOffset(e){const t=e._extent,i=this._extent,r=t.northEast.lon-t.southWest.lon,n=t.northEast.lat-t.southWest.lat;return[(i.southWest.lon-t.southWest.lon)/r,(t.northEast.lat-i.northEast.lat)/n,(i.northEast.lon-i.southWest.lon)/r,(i.northEast.lat-i.southWest.lat)/n]}layerOverlap(e){return this._extent.overlaps(e._extent)}getDefaultTexture(){return this._isNorth?this.planet.solidTextureOne:this.planet.solidTextureTwo}getExtentLonLat(){return this._extent}getNodeState(){let e;return e=this._isNorth?this.planet._visibleNodesNorth[this.node.nodeId]:this.planet._visibleNodesSouth[this.node.nodeId],e&&e.state||0}}class js extends Os{constructor(e){super(e,"Earth")}init(){this._quadTreeList=[new Hs(Rs,this.planet,0,null,0,0,ie.createFromArray([-20037508.34,-20037508.34,20037508.34,20037508.34])),new Hs(Ws,this.planet,0,null,0,0,ie.createFromArray([-180,J,180,90])),new Hs(Ws,this.planet,0,null,0,0,ie.createFromArray([-180,-90,180,ee]))]}}class Ys{constructor(e={}){this.model=e.model||null,this.src=e.src||null,this._cached_ix=0,this._cached_iy=0,this._v00=0,this._v01=0,this._v10=0,this._v11=0,this._t=0}static loadModel(e){return e?fetch(e,{}).then((e=>{if(!e.ok)throw Error("Geoid model file: HTTP error "+e.status);return e.arrayBuffer()})).then((t=>{if(t)return new Uint8Array(t);throw Error("Geoid model file: no data from "+e)})).then((function(e){if(80!==e[0]||53!==e[1]||(13!==e[2]||10!==e[3])&&10!==e[2])throw new Error("Geoid model file: no PGM header");var t,i,r=13===e[2]?4:3,n=null,s=null;function a(){let t=r;for(var i=r;;i++){if(i>=e.length)throw new Error("Geoid model file: missing newline in header");if(10===e[i]){r=i+1;break}}return i>t&&13===e[i-1]&&i--,String.fromCharCode.apply(null,e.slice(t,i))}for(;"#"===(i=a())[0];)if(t=i.match(/^# Offset (.*)$/)){if(n=parseInt(t[1],10),!isFinite(n))throw new Error("Geoid model file: bad offset "+t[1])}else if((t=i.match(/^# Scale (.*)$/))&&(s=parseFloat(t[1]),!isFinite(s)))throw new Error("Geoid model file: bad scale "+t[1]);let o=0,l=0;if((t=i.match(/^\s*(\d+)\s+(\d+)\s*$/))&&(o=parseInt(t[1],10),l=parseInt(t[2],10)),!(t&&o>=0&&l>=0))throw new Error("Geoid model file: bad PGM width&height line");if(65535!=parseInt(a()))throw new Error("Geoid model file: PGM file must have 65535 gray levels");if(null===n)throw new Error("Geoid model file: PGM file does not contain offset");if(null===s)throw new Error("Geoid model file: PGM file does not contain scale");if(o<2||l<2)throw new Error("Geoid model file: Raster size too small");if(e.length-r!==o*l*2)throw new Error("Geoid model file: File has the wrong length");return{scale:s,offset:n,width:o,height:l,rlonres:o/360,rlatres:(l-1)/180,i:r,rawfile:e}})):new Promise((e=>{e(null)}))}setModel(e){this.model=e}_rawval(e,t){let i=this.model;t<0?(t=-t,e+=i.width/2):t>=i.height&&(t=2*(i.height-1)-t,e+=i.width/2),e<0?e+=i.width:e>=i.width&&(e-=i.width);let r=2*(t*i.width+e)+i.i;return i.rawfile[r]<<8|i.rawfile[r+1]}getHeightLonLat(e){return this.getHeight(e.lon,e.lat)}getHeight(e,t){if(!this.model)return 0;let i=this.model;e<0&&(e+=360);let r=(90-t)*i.rlatres,n=e*i.rlonres,s=Math.floor(r),a=Math.floor(n);n-=a,r-=s,s===i.height-1&&s--,this._cached_ix===a&&this._cached_iy===s||(this._cached_ix=a,this._cached_iy=s,this._v00=this._rawval(a,s),this._v01=this._rawval(a+1,s),this._v10=this._rawval(a,s+1),this._v11=this._rawval(a+1,s+1));let o=(1-r)*((1-n)*this._v00+n*this._v01)+r*((1-n)*this._v10+n*this._v11);return i.offset+i.scale*o}}class qs{constructor(e,t=5){this.MAX_FRAMES=t,this._gridSize=64,this._planet=e,this._framebuffer=null,this._framebufferMercProj=null,this._texCoordsBuffer=null,this._indexBuffer=null,this._currentFrame=0,this._queue=[],this._animate=[],this._quadTexCoordsBuffer=null,this._quadVertexBuffer=null}init(){this._initShaders(),this._initBuffers()}createGridBuffer(e,t=!1){let i=this._gridSize,r=new I((e[3].lon-e[0].lon)/i,(e[3].lat-e[0].lat)/i),n=new I((e[2].lon-e[1].lon)/i,(e[2].lat-e[1].lat)/i),s=new I((e[1].lon-e[0].lon)/i,(e[1].lat-e[0].lat)/i),a=new I((e[2].lon-e[3].lon)/i,(e[2].lat-e[3].lat)/i);const o=(i+1)*(i+1)*2,l=o/2;let h=new Float32Array(o),c=new Float32Array(o),d=new Array(l),_=0,u=0,f=0,g=new Float32Array(2);for(let t=0;t<=i;t++){let o=new I(e[0].lon+t*r.lon,e[0].lat+t*r.lat),l=new I(e[1].lon+t*n.lon,e[1].lat+t*n.lat);for(let t=0;t<=i;t++){let i=Be(o,l,new I(e[0].lon+t*s.lon,e[0].lat+t*s.lat),new I(e[3].lon+t*a.lon,e[3].lat+t*a.lat));Ki(i.lon,g),h[_++]=g[0],c[u++]=g[1],Ki(i.lat,g),h[_++]=g[0],c[u++]=g[1],d[f++]=i}}if(t)for(let e=0;e<l;e++){let t=d[e].forwardMercator();Ki(t.lon,g),h[2*e]=g[0],c[2*e]=g[1],Ki(t.lat,g),h[2*e+1]=g[0],c[2*e+1]=g[1]}return[this._planet.renderer.handler.createArrayBuffer(h,2,l),this._planet.renderer.handler.createArrayBuffer(c,2,l)]}frame(){let e=this.MAX_FRAMES;for(;e--&&this._queue.length;){const e=this._queue.shift();e._isRendering=!1,e.rendering(),e.events.dispatch(e.events.loadend)}for(e=this._animate.length;e--;)this._animate[e].rendering()}add(e){e._isRendering||(e._isRendering=!0,e._animate?this._animate.push(e):this._queue.push(e))}remove(e){if(e._isRendering){let t;e._creationProceeding=!1,e._isRendering=!1,t=e._animate?this._animate:this._queue;for(let i=0;i<t.length;i++)if(t[i].isEqual(e))return void t.splice(i,1)}}_initBuffers(){let e=this._planet.renderer.handler;this._framebuffer=new fs(e,{width:2,height:2,useDepth:!1}),this._framebuffer.init(),this._framebufferMercProj=new fs(e,{width:2,height:2,useDepth:!1}),this._framebufferMercProj.init();let t=Math.log2(this._gridSize);this._texCoordsBuffer=this._planet._textureCoordsBufferCache[t],this._indexBuffer=this._planet._indexesCache[t][t][t][t][t].buffer,this._quadTexCoordsBuffer=e.createArrayBuffer(new Float32Array([0,1,1,1,0,0,1,0]),2,4),this._quadVertexBuffer=e.createArrayBuffer(new Float32Array([-1,1,1,1,-1,-1,1,-1]),2,4)}_initShaders(){this._planet.renderer.handler.addProgram(new Si("geoImageTransform",{uniforms:{sourceTexture:"sampler2d",extentParamsHigh:"vec4",extentParamsLow:"vec4",isFullExtent:"bool"},attributes:{cornersHigh:"vec2",cornersLow:"vec2",texCoords:"vec2"},vertexShader:"attribute vec2 cornersHigh; \n attribute vec2 cornersLow;\n attribute vec2 texCoords; \n uniform vec4 extentParamsHigh; \n uniform vec4 extentParamsLow; \n varying vec2 v_texCoords;\n void main() { \n v_texCoords = texCoords; \n vec2 highDiff = cornersHigh - extentParamsHigh.xy;\n vec2 lowDiff = cornersLow - extentParamsLow.xy; \n gl_Position = vec4((-1.0 + (highDiff + lowDiff) * extentParamsHigh.zw) * vec2(1.0, -1.0), 0.0, 1.0); \n }",fragmentShader:"precision highp float;\n uniform sampler2D sourceTexture;\n uniform bool isFullExtent;\n varying vec2 v_texCoords;\n void main () {\n if(!isFullExtent && (v_texCoords.x <= 0.001 || v_texCoords.x >= 0.999 ||\n v_texCoords.y <= 0.001 || v_texCoords.y >= 0.999)) {\n discard;\n }\n gl_FragColor = texture2D(sourceTexture, v_texCoords);\n }"}))}}const Zs=["loadend","layerloadend"];class Xs{constructor(e=24){this.MAX_REQUESTS=e,this.events=Tt(Zs),this._loading=0,this._queue=[],this._senderRequestCounter=[],this._promises={json:e=>e.json(),blob:e=>e.blob(),arrayBuffer:e=>e.arrayBuffer(),imageBitmap:e=>e.blob().then((e=>createImageBitmap(e,{premultiplyAlpha:"premultiply"}))),text:e=>e.text()}}load(e,t){e.sender&&(this._senderRequestCounter[e.sender.__id]||(this._senderRequestCounter[e.sender.__id]={sender:e.sender,counter:0,__requestCounterFrame__:0}),this._senderRequestCounter[e.sender.__id].counter++),this._queue.push({params:e,callback:t}),this._exec()}fetch(e){return fetch(e.src,e.options||{}).then((t=>{if(!t.ok)throw Error(`Unable to load '${e.src}'`);return this._promises[e.type||"blob"](t)})).then((e=>({status:"ready",data:e}))).catch((e=>({status:"error",msg:e.toString()})))}getRequestCounter(e){if(e){let t=this._senderRequestCounter[e.__id];if(t)return t.counter}return 0}isIdle(e){return e.isIdle}_checkLoadend(e,t){0!==e.counter||t._planet&&!t._planet._terrainCompletedActivated?e.__requestCounterFrame__=requestAnimationFrame((()=>{this._checkLoadend(e,t)})):(t.events.dispatch(t.events.loadend,t),this.events.dispatch(this.events.layerloadend,t),e.__requestCounterFrame__=0)}_handleResponse(e,t){e.callback(t);let i=e.params.sender;if(i&&(i.events.loadend.handlers.length||this.events.layerloadend.handlers.length)){let e=this._senderRequestCounter[i.__id];e&&e.counter>0&&(e.counter--,cancelAnimationFrame(e.__requestCounterFrame__),e.__requestCounterFrame__=requestAnimationFrame((()=>{this._checkLoadend(e,i)})))}this._exec()}_exec(){if(this._queue.length>0&&this._loading<this.MAX_REQUESTS){let e=this._queue.pop();if(!e)return;let t=e.params;if(!t.filter||t.filter(t))return this._loading++,fetch(t.src,t.options||{}).then((e=>{if(!e.ok)throw Error(`Unable to load '${t.src}'`);return this._promises[t.type||"blob"](e)})).then((t=>{this._loading--,this._handleResponse(e,{status:"ready",data:t})})).catch((t=>{this._loading--,this._handleResponse(e,{status:"error",msg:t.toString()})}));this._handleResponse(e,{status:"abort"})}else 0===this._loading&&this.events.dispatch(this.events.loadend)}abort(e){this._senderRequestCounter[e.__id]&&(this._senderRequestCounter[e.__id].counter=0,cancelAnimationFrame(this._senderRequestCounter[e.__id].__requestCounterFrame__),this._senderRequestCounter[e.__id].__requestCounterFrame__=0);for(let t=0,i=this._queue.length;t<i;t++){let i=this._queue[t];i&&i.params.sender&&e.isEqual(i.params.sender)&&(i.callback({status:"abort"}),this._queue[t]=null)}}abortAll(){for(let e=0,t=this._queue.length;e<t;e++){let t=this._queue[e];if(t){let i=t.params.sender;i&&this._senderRequestCounter[i.__id]&&(this._senderRequestCounter[i.__id].counter=0,cancelAnimationFrame(this._senderRequestCounter[i.__id].__requestCounterFrame__),this._senderRequestCounter[i.__id].__requestCounterFrame__=0),t.callback({status:"abort"}),this._queue[e]=null}}this._queue=[]}get loading(){return this._loading}get queue(){return this._queue}}class $s{constructor(e,t={}){this._minTabelSize=t.minTableSize||1,this._maxTableSize=t.maxTableSize||8,this._planet=e,this._handler=null,this._verticesBufferArray=[],this._indexBufferArray=[],this._positionBuffer=null,this._framebuffer=null,this._normalMapVerticesTexture=null,this._width=t.width||128,this._height=t.height||128,this._queue=new Er(1024),this._lock=new on}get width(){return this._width}get height(){return this._height}init(){this._maxTableSize=this._planet.maxGridSize||8,this._handler=this._planet.renderer.handler;const e=new Si("normalMapBlur",{attributes:{a_position:"vec2"},uniforms:{s_texture:"sampler2d"},vertexShader:`attribute vec2 a_position;\n attribute vec2 a_texCoord;\n\n varying vec2 blurCoordinates[5];\n\n void main() {\n vec2 vt = a_position * 0.5 + 0.5; \n \n gl_Position = vec4(a_position, 0.0, 1.0);\n blurCoordinates[0] = vt;\n blurCoordinates[1] = vt + ${1/this._width*1.407333};\n blurCoordinates[2] = vt - ${1/this._height*1.407333};\n blurCoordinates[3] = vt + ${1/this._width*3.294215};\n blurCoordinates[4] = vt - ${1/this._height*3.294215};\n }`,fragmentShader:"precision lowp float;\n uniform sampler2D s_texture; \n varying vec2 blurCoordinates[5]; \n\n void main() {\n lowp vec4 sum = vec4(0.0);\n //if(blurCoordinates[0].x <= 0.01 || blurCoordinates[0].x >= 0.99 ||\n // blurCoordinates[0].y <= 0.01 || blurCoordinates[0].y >= 0.99){\n // sum = texture2D(s_texture, blurCoordinates[0]);\n //} else {\n sum += texture2D(s_texture, blurCoordinates[0]) * 0.204164;\n sum += texture2D(s_texture, blurCoordinates[1]) * 0.304005;\n sum += texture2D(s_texture, blurCoordinates[2]) * 0.304005;\n sum += texture2D(s_texture, blurCoordinates[3]) * 0.093913;\n sum += texture2D(s_texture, blurCoordinates[4]) * 0.093913;\n //}\n gl_FragColor = sum;\n }"}),t=new Si("normalMap",{attributes:{a_position:"vec2",a_normal:"vec3"},uniforms:{},vertexShader:"attribute vec2 a_position;\n attribute vec3 a_normal;\n \n varying vec3 v_color;\n \n void main() {\n gl_Position = vec4(a_position, 0, 1);\n v_color = normalize(a_normal) * 0.5 + 0.5;\n }",fragmentShader:"precision highp float;\n \n varying vec3 v_color;\n \n void main () {\n gl_FragColor = vec4(v_color, 1.0);\n }"});this._handler.addProgram(e),this._handler.addProgram(t),this._framebuffer=new fs(this._handler,{width:this._width,height:this._height,useDepth:!1}),this._framebuffer.init(),this._normalMapVerticesTexture=this._handler.createEmptyTexture_l(this._width,this._height);for(let e=this._minTabelSize;e<=this._maxTableSize;e++){const t=Math.pow(2,e),i=t/2;let r=new Float32Array((t+1)*(t+1)*2);for(let e=0;e<=t;e++)for(let n=0;n<=t;n++){let s=2*(e*(t+1)+n);r[s]=n/i-1,r[s+1]=e/i-1}this._verticesBufferArray[t]=this._handler.createArrayBuffer(r,2,r.length/2),this._indexBufferArray[t]=this._planet._indexesCache[Math.log2(t)][Math.log2(t)][Math.log2(t)][Math.log2(t)][Math.log2(t)].buffer}const i=new Float32Array([-1,-1,1,-1,-1,1,1,1]);this._positionBuffer=this._handler.createArrayBuffer(i,2,i.length/2)}_drawNormalMapBlur(e){let t=e.normalMapNormals;if(e.node&&0!==e.node.getState()&&t&&t.length){const i=t.length/3,r=Math.sqrt(i)-1;let n=this._verticesBufferArray[r];if(n){e.planet.terrain.equalizeNormals&&(e._normalMapEdgeEqualize(0),e._normalMapEdgeEqualize(2),e._normalMapEdgeEqualize(3),e._normalMapEdgeEqualize(1));let s=e.normalMapTexturePtr;const a=this._handler,o=a.gl;let l=a.createArrayBuffer(t,3,i,o.DYNAMIC_DRAW);const h=this._framebuffer;let c=a.programs.normalMap,d=c._program.attributes;return h.bindOutputTexture(this._normalMapVerticesTexture),c.activate(),o.bindBuffer(o.ARRAY_BUFFER,n),o.vertexAttribPointer(d.a_position,n.itemSize,o.FLOAT,!1,0,0),o.bindBuffer(o.ARRAY_BUFFER,l),o.vertexAttribPointer(d.a_normal,l.itemSize,o.FLOAT,!1,0,0),o.bindBuffer(o.ELEMENT_ARRAY_BUFFER,this._indexBufferArray[r]),o.drawElements(o.TRIANGLE_STRIP,this._indexBufferArray[r].numItems,o.UNSIGNED_INT,0),o.deleteBuffer(l),h.bindOutputTexture(s),c=a.programs.normalMapBlur,c.activate(),o.bindBuffer(o.ARRAY_BUFFER,this._positionBuffer),o.vertexAttribPointer(c._program.attributes.a_position,this._positionBuffer.itemSize,o.FLOAT,!1,0,0),o.activeTexture(o.TEXTURE0),o.bindTexture(o.TEXTURE_2D,this._normalMapVerticesTexture),o.uniform1i(c._program.uniforms.s_texture,0),o.drawArrays(o.TRIANGLE_STRIP,0,this._positionBuffer.numItems),!0}return!0}return!1}_drawNormalMapNoBlur(e){let t=e.normalMapNormals;if(e.node&&0!==e.node.getState()&&t&&t.length){const i=t.length/3,r=Math.sqrt(i)-1;let n=this._verticesBufferArray[r];if(n){e.planet.terrain.equalizeNormals&&(e._normalMapEdgeEqualize(0),e._normalMapEdgeEqualize(2),e._normalMapEdgeEqualize(3),e._normalMapEdgeEqualize(1));let s=e.normalMapTexturePtr;const a=this._handler,o=a.gl;let l=a.createArrayBuffer(t,3,i,o.DYNAMIC_DRAW);const h=this._framebuffer,c=a.programs.normalMap,d=c._program.attributes;return h.bindOutputTexture(s),c.activate(),o.bindBuffer(o.ARRAY_BUFFER,n),o.vertexAttribPointer(d.a_position,n.itemSize,o.FLOAT,!1,0,0),o.bindBuffer(o.ARRAY_BUFFER,l),o.vertexAttribPointer(d.a_normal,l.itemSize,o.FLOAT,!1,0,0),o.bindBuffer(o.ELEMENT_ARRAY_BUFFER,this._indexBufferArray[r]),o.drawElements(o.TRIANGLE_STRIP,this._indexBufferArray[r].numItems,o.UNSIGNED_INT,0),o.deleteBuffer(l),!0}return!0}return!1}_drawNormalMap(e){return e.planet.terrain.isBlur(e)?this._drawNormalMapBlur(e):this._drawNormalMapNoBlur(e)}drawSingle(e){const t=this._handler.gl;this._framebuffer.activate(),t.disable(t.CULL_FACE),t.disable(t.DEPTH_TEST),t.disable(t.BLEND),e.terrainReady&&this._drawNormalMap(e)&&(e.normalMapReady=!0,e.normalMapTexture=e.normalMapTexturePtr,e.normalMapTextureBias[0]=0,e.normalMapTextureBias[1]=0,e.normalMapTextureBias[2]=1),e._inTheQueue=!1,t.enable(t.DEPTH_TEST),t.enable(t.CULL_FACE),t.enable(t.BLEND),this._framebuffer.deactivate()}frame(){if(this._queue.length){const e=this._handler.gl;this._framebuffer.activate(),e.disable(e.CULL_FACE),e.disable(e.DEPTH_TEST),e.disable(e.BLEND);let t=0,i=window.performance.now();for(;this._lock.isFree()&&this._queue.length&&t<.25;){const e=this._queue.shift();e.terrainReady&&this._drawNormalMap(e)&&(e.normalMapReady=!0,e.normalMapTexture=e.normalMapTexturePtr,e.normalMapTextureBias[0]=0,e.normalMapTextureBias[1]=0,e.normalMapTextureBias[2]=1),e._inTheQueue=!1,t=window.performance.now()-i}e.enable(e.BLEND),e.enable(e.DEPTH_TEST),e.enable(e.CULL_FACE),this._framebuffer.deactivate()}}get queueSize(){return this._queue.length}queue(e){e._inTheQueue=!0,this._queue.push(e)}unshift(e){e._inTheQueue=!0,this._queue.unshift(e)}remove(e){}clear(){for(;this._queue.length;){this._queue.pop()._inTheQueue=!1}}lock(e){this._lock.lock(e)}free(e){this._lock.free(e)}}class Ks extends Zt{constructor(e=2){super(e,Qs)}_onMessage(e){this._source.get(e.data.id)._plainSegmentWorkerCallback(e.data),e.data.plainVertices=null,e.data.plainVerticesHigh=null,e.data.plainVerticesLow=null,e.data.plainNormals=null,e.data.normalMapNormals=null,e.data.normalMapVertices=null,e.data.normalMapVerticesHigh=null,e.data.normalMapVerticesLow=null,this._source.delete(e.data.id)}setGeoid(e){if(e.model){let t=e.model,i={scale:t.scale,offset:t.offset,width:t.width,height:t.height,rlonres:t.rlonres,rlatres:t.rlatres,i:t.i};this._workerQueue.forEach((e=>{let r=new Uint8Array(t.rawfile.length);r.set(t.rawfile),e.postMessage({model:i,rawfile:r},[r.buffer])}))}else this._workerQueue.forEach((e=>{e.postMessage({model:null})}))}make(e){if(e.initialized)if(this._workerQueue.length){let t=this._workerQueue.pop();this._source.set(this._sourceId,e);let i=new Float64Array([this._sourceId,e._projection.id===bs.id?1:0,e.planet.terrain.gridSizeByZoom[e.tileZoom],e.planet.terrain.plainGridSize,e._extent.southWest.lon,e._extent.southWest.lat,e._extent.northEast.lon,e._extent.northEast.lat,e.planet.ellipsoid._e2,e.planet.ellipsoid.equatorialSize,e.planet.ellipsoid._invRadii2.x,e.planet.ellipsoid._invRadii2.y,e.planet.ellipsoid._invRadii2.z,e.planet._heightFactor]);this._sourceId++,t.postMessage({params:i},[i.buffer])}else this._pendingQueue.push(e);else this.check()}}const Qs="\n 'use strict';\n \n let model = null;\n\n let cached_ix = null;\n let cached_iy = null;\n let v00 = null;\n let v01 = null;\n let v10 = null;\n let v11 = null;\n let t = null;\n\n function rawval(ix, iy) {\n\n if (iy < 0) {\n iy = -iy;\n ix += model.width / 2;\n } else if (iy >= model.height) {\n iy = 2 * (model.height - 1) - iy;\n ix += model.width / 2;\n }\n\n if (ix < 0) {\n ix += model.width;\n } else if (ix >= model.width) {\n ix -= model.width;\n }\n\n var k = (iy * model.width + ix) * 2 + model.i;\n\n return (model.rawfile[k] << 8) | model.rawfile[k + 1];\n };\n\n function getHeightMSL(lon, lat) {\n\n if (!model) return 0;\n\n if (lon < 0) lon += 360.0;\n\n var fy = (90 - lat) * model.rlatres;\n var fx = lon * model.rlonres;\n var iy = Math.floor(fy);\n var ix = Math.floor(fx);\n\n fx -= ix;\n fy -= iy;\n\n if (iy === (model.height - 1)) {\n iy--;\n }\n\n if ((cached_ix !== ix) || (cached_iy !== iy)) {\n\n cached_ix = ix;\n cached_iy = iy;\n\n v00 = rawval(ix, iy);\n v01 = rawval(ix + 1, iy);\n v10 = rawval(ix, iy + 1);\n v11 = rawval(ix + 1, iy + 1);\n }\n\n let h = null;\n\n var a = (1 - fx) * v00 + fx * v01;\n var b = (1 - fx) * v10 + fx * v11;\n\n h = (1 - fy) * a + fy * b;\n\n return model.offset + model.scale * h;\n };\n\n const HALF_PI = Math.PI * 0.5;\n const POLE = 20037508.34;\n const PI_BY_POLE = Math.PI / POLE;\n const INV_POLE_BY_180 = 180.0 / POLE;\n const INV_PI_BY_180 = 180.0 / Math.PI;\n const INV_PI_BY_180_HALF_PI = INV_PI_BY_180 * HALF_PI;\n const RADIANS = Math.PI / 180.0;\n const INV_PI_BY_360 = INV_PI_BY_180 * 2.0;\n\n let E2 = 0.0,\n A = 0.0;\n\n let _projFunc = null;\n\n const Vec3 = function (x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n };\n\n var geodeticToCartesian = function (lon, lat, heightFactor, res) {\n\n let h = getHeightMSL(lon, lat) * heightFactor;\n\n let latrad = RADIANS * lat,\n lonrad = RADIANS * lon;\n\n let slt = Math.sin(latrad);\n\n let N = A / Math.sqrt(1.0 - E2 * slt * slt);\n let nc = (N + h) * Math.cos(latrad); \n \n res.x = nc * Math.cos(lonrad);\n res.y = nc * Math.sin(lonrad);\n res.z = (N * (1 - E2) + h) * slt;\n };\n\n var geodeticToCartesianInverse = function (lon, lat, heightFactor, res){\n geodeticToCartesian(\n lon * INV_POLE_BY_180,\n INV_PI_BY_360 * Math.atan(Math.exp(lat * PI_BY_POLE)) - INV_PI_BY_180_HALF_PI,\n heightFactor,\n res);\n };\n\n var v = new Vec3(0.0, 0.0, 0.0);\n var _tempHigh = new Vec3(0.0, 0.0, 0.0);\n var _tempLow = new Vec3(0.0, 0.0, 0.0);\n\n var doubleToTwoFloats = function(v, high, low) {\n\n let x = v.x, y = v.y, z = v.z;\n \n if (x >= 0.0) {\n var doubleHigh = Math.floor(x / 65536.0) * 65536.0;\n high.x = Math.fround(doubleHigh);\n low.x = Math.fround(x - doubleHigh);\n } else {\n var doubleHigh = Math.floor(-x / 65536.0) * 65536.0;\n high.x = Math.fround(-doubleHigh);\n low.x = Math.fround(x + doubleHigh);\n }\n\n if (y >= 0.0) {\n var doubleHigh = Math.floor(y / 65536.0) * 65536.0;\n high.y = Math.fround(doubleHigh);\n low.y = Math.fround(y - doubleHigh);\n } else {\n var doubleHigh = Math.floor(-y / 65536.0) * 65536.0;\n high.y = Math.fround(-doubleHigh);\n low.y = Math.fround(y + doubleHigh);\n }\n\n if (z >= 0.0) {\n var doubleHigh = Math.floor(z / 65536.0) * 65536.0;\n high.z = Math.fround(doubleHigh);\n low.z = Math.fround(z - doubleHigh);\n } else {\n var doubleHigh = Math.floor(-z / 65536.0) * 65536.0;\n high.z = Math.fround(-doubleHigh);\n low.z = Math.fround(z + doubleHigh);\n }\n };\n\n self.onmessage = function (msg) {\n if(msg.data.model) {\n model = msg.data.model;\n model.rawfile = msg.data.rawfile;\n } else if(msg.data.params) {\n\n let xmin = 549755748352.0, xmax = -549755748352.0, \n ymin = 549755748352.0, ymax = -549755748352.0, \n zmin = 549755748352.0, zmax = -549755748352.0;\n\n E2 = msg.data.params[8];\n A = msg.data.params[9];\n\n let gridSize = msg.data.params[2],\n fgs = msg.data.params[3],\n r2_x = msg.data.params[10],\n r2_y = msg.data.params[11],\n r2_z = msg.data.params[12];\n\n let heightFactor = msg.data.params[13];\n \n if(msg.data.params[1] === 0.0){\n _projFunc = geodeticToCartesianInverse;\n }else{\n _projFunc = geodeticToCartesian;\n }\n\n let maxFgs = Math.max(fgs, gridSize);\n let llStep = (msg.data.params[6] - msg.data.params[4]) / maxFgs;\n let ltStep = (msg.data.params[7] - msg.data.params[5]) / maxFgs;\n\n let esw_lon = msg.data.params[4],\n ene_lat = msg.data.params[7];\n\n let dg = Math.max(fgs / gridSize, 1.0),\n gs = maxFgs + 1;\n \n const gsgs = gs * gs;\n\n const gridSize3 = (gridSize + 1) * (gridSize + 1) * 3;\n\n let plainNormals = new Float32Array(gridSize3);\n\n let plainVertices = new Float64Array(gridSize3);\n let plainVerticesHigh = new Float32Array(gridSize3);\n let plainVerticesLow = new Float32Array(gridSize3);\n\n let normalMapNormals = new Float32Array(gsgs * 3);\n\n let normalMapVertices = new Float64Array(gsgs * 3);\n let normalMapVerticesHigh = new Float32Array(gsgs * 3);\n let normalMapVerticesLow = new Float32Array(gsgs * 3);\n\n let ind = 0,\n nmInd = 0;\n\n for (let k = 0; k < gsgs; k++) {\n\n let j = k % gs,\n i = ~~(k / gs);\n\n _projFunc(esw_lon + j * llStep, ene_lat - i * ltStep, heightFactor, v);\n\n let nx = v.x * r2_x, ny = v.y * r2_y, nz = v.z * r2_z;\n let l = 1.0 / Math.sqrt(nx * nx + ny * ny + nz * nz); \n let nxl = nx * l,\n nyl = ny * l,\n nzl = nz * l;\n\n doubleToTwoFloats(v, _tempHigh, _tempLow);\n\n normalMapVertices[nmInd] = v.x;\n normalMapVerticesHigh[nmInd] = _tempHigh.x;\n normalMapVerticesLow[nmInd] = _tempLow.x;\n normalMapNormals[nmInd++] = nxl;\n\n normalMapVertices[nmInd] = v.y;\n normalMapVerticesHigh[nmInd] = _tempHigh.y;\n normalMapVerticesLow[nmInd] = _tempLow.y;\n normalMapNormals[nmInd++] = nyl;\n\n normalMapVertices[nmInd] = v.z;\n normalMapVerticesHigh[nmInd] = _tempHigh.z;\n normalMapVerticesLow[nmInd] = _tempLow.z;\n normalMapNormals[nmInd++] = nzl;\n\n if (i % dg === 0 && j % dg === 0) {\n plainVertices[ind] = v.x;\n plainVerticesHigh[ind] = _tempHigh.x;\n plainVerticesLow[ind] = _tempLow.x;\n plainNormals[ind++] = nxl;\n\n plainVertices[ind] = v.y;\n plainVerticesHigh[ind] = _tempHigh.y;\n plainVerticesLow[ind] = _tempLow.y;\n plainNormals[ind++] = nyl;\n\n plainVertices[ind] = v.z;\n plainVerticesHigh[ind] = _tempHigh.z;\n plainVerticesLow[ind] = _tempLow.z;\n plainNormals[ind++] = nzl;\n\n if (v.x < xmin) xmin = v.x; if (v.x > xmax) xmax = v.x;\n if (v.y < ymin) ymin = v.y; if (v.y > ymax) ymax = v.y;\n if (v.z < zmin) zmin = v.z; if (v.z > zmax) zmax = v.z;\n }\n }\n\n let x = (xmax - xmin) * 0.5,\n y = (ymax - ymin) * 0.5,\n z = (zmax - zmin) * 0.5;\n\n let plainRadius = Math.sqrt(x * x + y * y + z * z);\n\n self.postMessage({\n id: msg.data.params[0],\n plainVertices: plainVertices,\n plainVerticesHigh: plainVerticesHigh,\n plainVerticesLow: plainVerticesLow,\n plainNormals: plainNormals,\n normalMapNormals: normalMapNormals,\n normalMapVertices: normalMapVertices,\n normalMapVerticesHigh: normalMapVerticesHigh,\n normalMapVerticesLow: normalMapVerticesLow,\n plainRadius: plainRadius\n }, [\n plainVertices.buffer,\n plainVerticesHigh.buffer,\n plainVerticesLow.buffer,\n plainNormals.buffer,\n normalMapNormals.buffer,\n normalMapVertices.buffer,\n normalMapVerticesHigh.buffer,\n normalMapVerticesLow.buffer\n ]);\n }\n }";function Js(e){let t=1/Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]);e[0]*=t,e[1]*=t,e[2]*=t,e[3]*=t}class ea{constructor(e={}){this._pickingColorU=new Float32Array([0,0,0]),this._f=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],this.projectionMatrix=new se,this.inverseProjectionMatrix=new se,this.projectionViewMatrix=new se,this.inverseProjectionViewMatrix=new se,this.left=0,this.right=0,this.bottom=0,this.top=0,this.near=0,this.far=0,this.cameraFrustumIndex=null!=e.cameraFrustumIndex?e.cameraFrustumIndex:-1,this.setProjectionMatrix(e.fov||30,e.aspect||1,e.near||1,e.far||1e3)}getRightPlane(){return this._f[0]}getLeftPlane(){return this._f[1]}getBottomPlane(){return this._f[2]}getTopPlane(){return this._f[3]}getBackwardPlane(){return this._f[4]}getForwardPlane(){return this._f[5]}getProjectionViewMatrix(){return this.projectionViewMatrix._m}getProjectionMatrix(){return this.projectionMatrix._m}getInverseProjectionMatrix(){return this.inverseProjectionMatrix._m}setProjectionMatrix(e,t,i,r){this.top=i*Math.tan(e*Math.PI/360),this.bottom=-this.top,this.right=this.top*t,this.left=-this.right,this.near=i,this.far=r,this.projectionMatrix.setPerspective(this.left,this.right,this.bottom,this.top,i,r),this.projectionMatrix.inverseTo(this.inverseProjectionMatrix)}setViewMatrix(e){this.projectionViewMatrix=this.projectionMatrix.mul(e),this.projectionViewMatrix.inverseTo(this.inverseProjectionViewMatrix);let t=this.projectionViewMatrix._m;this._f[0][0]=t[3]-t[0],this._f[0][1]=t[7]-t[4],this._f[0][2]=t[11]-t[8],this._f[0][3]=t[15]-t[12],Js(this._f[0]),this._f[1][0]=t[3]+t[0],this._f[1][1]=t[7]+t[4],this._f[1][2]=t[11]+t[8],this._f[1][3]=t[15]+t[12],Js(this._f[1]),this._f[2][0]=t[3]+t[1],this._f[2][1]=t[7]+t[5],this._f[2][2]=t[11]+t[9],this._f[2][3]=t[15]+t[13],Js(this._f[2]),this._f[3][0]=t[3]-t[1],this._f[3][1]=t[7]-t[5],this._f[3][2]=t[11]-t[9],this._f[3][3]=t[15]-t[13],Js(this._f[3]),this._f[4][0]=t[3]-t[2],this._f[4][1]=t[7]-t[6],this._f[4][2]=t[11]-t[10],this._f[4][3]=t[15]-t[14],Js(this._f[4]),this._f[5][0]=t[3]+t[2],this._f[5][1]=t[7]+t[6],this._f[5][2]=t[11]+t[10],this._f[5][3]=t[15]+t[14],Js(this._f[5])}containsPoint(e){for(let t=0;t<6;t++){if(e.dotArr(this._f[t])+this._f[t][3]<=0)return!1}return!0}containsSphereBottomExc(e){let t=-e.radius,i=this._f;return!(e.center.dotArr(i[0])+i[0][3]<=t)&&(!(e.center.dotArr(i[1])+i[1][3]<=t)&&(!(e.center.dotArr(i[3])+i[3][3]<=t)&&(!(e.center.dotArr(i[4])+i[4][3]<=t)&&!(e.center.dotArr(i[5])+i[5][3]<=t))))}containsSphereButtom(e){let t=-e.radius,i=this._f;return!(e.center.dotArr(i[2])+i[2][3]<=t)}containsSphere(e){let t=-e.radius,i=this._f;return!(e.center.dotArr(i[0])+i[0][3]<=t)&&(!(e.center.dotArr(i[1])+i[1][3]<=t)&&(!(e.center.dotArr(i[2])+i[2][3]<=t)&&(!(e.center.dotArr(i[3])+i[3][3]<=t)&&(!(e.center.dotArr(i[4])+i[4][3]<=t)&&!(e.center.dotArr(i[5])+i[5][3]<=t)))))}containsSphere2(e,t){let i=-t;return!(e.dotArr(this._f[0])+this._f[0][3]<=i)&&(!(e.dotArr(this._f[1])+this._f[1][3]<=i)&&(!(e.dotArr(this._f[2])+this._f[2][3]<=i)&&(!(e.dotArr(this._f[3])+this._f[3][3]<=i)&&(!(e.dotArr(this._f[4])+this._f[4][3]<=i)&&!(e.dotArr(this._f[5])+this._f[5][3]<=i)))))}containsBox(e){let t,i,r=!0;for(let n=0;n<6;n++){t=0,i=0;for(let r=0;r<8&&(0===i||0===t);r++){e.vertices[r].dotArr(this._f[n])+this._f[n][3]<0?t++:i++}if(0===i)return!1;t>0&&(r=!0)}return r}}const ta=["viewchange","moveend"];class ia{constructor(e,t={}){if(this.renderer=e,this.events=Tt(ta,this),this.eye=t.eye||new oe,this.eyeHigh=new Float32Array(3),this.eyeLow=new Float32Array(3),this._aspect=t.aspect||1,this._viewAngle=t.viewAngle||47,this._viewMatrix=new se,this._normalMatrix=new re,this._r=new oe(1,0,0),this._u=new oe(0,1,0),this._b=new oe(0,0,1),this._pr=this._r.clone(),this._pu=this._u.clone(),this._pb=this._b.clone(),this._peye=this.eye.clone(),this.isMoving=!1,this._tanViewAngle_hrad=0,this._tanViewAngle_hradOneByHeight=0,this.frustums=[],this.frustumColors=[],t.frustums)for(let e=0,i=t.frustums.length;e<i;e++){let i=t.frustums[e],r=new ea({fov:this._viewAngle,aspect:this._aspect,near:i[0],far:i[1]});r.cameraFrustumIndex=this.frustums.length,this.frustums.push(r),this.frustumColors.push(r._pickingColorU[0],r._pickingColorU[1],r._pickingColorU[2])}else{let e=1,t=1e4,i=new ea({fov:this._viewAngle,aspect:this._aspect,near:e,far:t});i.cameraFrustumIndex=this.frustums.length,this.frustums.push(i),this.frustumColors.push(i._pickingColorU[0],i._pickingColorU[1],i._pickingColorU[2])}this.FARTHEST_FRUSTUM_INDEX=this.frustums.length-1,this.currentFrustumIndex=0,this.isFirstPass=!1,this._projSizeConst=0,this.set(t.eye||new oe(0,0,1),t.look||new oe,t.up||new oe(0,1,0))}checkMoveEnd(){let e=this._r,t=this._u,i=this._b,r=this.eye;this._peye.equal(r)&&this._pr.equal(e)&&this._pu.equal(t)&&this._pb.equal(i)?(this.isMoving&&this.events.dispatch(this.events.moveend,this),this.isMoving=!1):this.isMoving=!0,this._pr.copy(e),this._pu.copy(t),this._pb.copy(i),this._peye.copy(r)}bindRenderer(e){this.renderer=e;for(let e=0;e<this.frustums.length;e++)this.renderer.assignPickingColor(this.frustums[e]);this._aspect=this.renderer.handler.getClientAspect(),this._setProj(this._viewAngle,this._aspect)}_init(e){this._setProj(this._viewAngle,this._aspect),this.set(e.eye||new oe(0,0,1),e.look||new oe,e.up||new oe(0,1,0))}getUp(){return this._u.clone()}getDown(){return this._u.negateTo()}getRight(){return this._r.clone()}getLeft(){return this._r.negateTo()}getForward(){return this._b.negateTo()}getBackward(){return this._b.clone()}update(){let e=this._r,t=this._u,i=this._b,r=this.eye;oe.doubleToTwoFloat32Array(r,this.eyeHigh,this.eyeLow),this._viewMatrix.set([e.x,t.x,i.x,0,e.y,t.y,i.y,0,e.z,t.z,i.z,0,-r.dot(e),-r.dot(t),-r.dot(i),1]);for(let e=0,t=this.frustums.length;e<t;e++)this.frustums[e].setViewMatrix(this._viewMatrix);this.events.dispatch(this.events.viewchange,this)}refresh(){this._setProj(this._viewAngle,this._aspect),this.update()}setAspectRatio(e){this._aspect=e,this.refresh()}getAspectRatio(){return this._aspect}_setProj(e,t){this._viewAngle=e,this._aspect=t,this._tanViewAngle_hrad=Math.tan(e*c),this._tanViewAngle_hradOneByHeight=this._tanViewAngle_hrad*this.renderer.handler._oneByHeight;let i=this.renderer.handler.canvas;this._projSizeConst=Math.min(i.clientWidth<512?512:i.clientWidth,i.clientHeight<512?512:i.clientHeight)/(e*o);for(let i=0,r=this.frustums.length;i<r;i++)this.frustums[i].setProjectionMatrix(e,t,this.frustums[i].near,this.frustums[i].far)}setViewAngle(e){this._viewAngle=e,this.refresh()}getViewAngle(){return this._viewAngle}get viewAngle(){return this._viewAngle}set(e,t,i){return this.eye.x=e.x,this.eye.y=e.y,this.eye.z=e.z,t=t||this._b,i=i||this._u,this._b.x=e.x-t.x,this._b.y=e.y-t.y,this._b.z=e.z-t.z,this._r.copy(i.cross(this._b)),this._b.normalize(),this._r.normalize(),this._u.copy(this._b.cross(this._r)),this}look(e,t){this._b.set(this.eye.x-e.x,this.eye.y-e.y,this.eye.z-e.z),this._r.copy((t||this._u).cross(this._b)),this._b.normalize(),this._r.normalize(),this._u.copy(this._b.cross(this._r))}slide(e,t,i){this.eye.x+=e*this._r.x+t*this._u.x+i*this._b.x,this.eye.y+=e*this._r.y+t*this._u.y+i*this._b.y,this.eye.z+=e*this._r.z+t*this._u.z+i*this._b.z}roll(e){let t=Math.cos(o*e),i=Math.sin(o*e),r=this._r.clone();this._r.set(t*r.x-i*this._u.x,t*r.y-i*this._u.y,t*r.z-i*this._u.z),this._u.set(i*r.x+t*this._u.x,i*r.y+t*this._u.y,i*r.z+t*this._u.z)}pitch(e){let t=Math.cos(o*e),i=Math.sin(o*e),r=this._b.clone();this._b.set(t*r.x-i*this._u.x,t*r.y-i*this._u.y,t*r.z-i*this._u.z),this._u.set(i*r.x+t*this._u.x,i*r.y+t*this._u.y,i*r.z+t*this._u.z)}yaw(e){let t=Math.cos(o*e),i=Math.sin(o*e),r=this._r.clone();this._r.set(t*r.x-i*this._b.x,t*r.y-i*this._b.y,t*r.z-i*this._b.z),this._b.set(i*r.x+t*this._b.x,i*r.y+t*this._b.y,i*r.z+t*this._b.z)}unproject(e,t){let i=this.renderer.handler.canvas,r=.5*i.width,n=.5*i.height,s=(e-r)/r,a=-(t-n)/n,o=this.frustums[0].inverseProjectionViewMatrix.mulVec4(new ne(s,a,-1,1)).affinity();return this.frustums[0].inverseProjectionViewMatrix.mulVec4(new ne(s,a,0,1)).affinity().subA(o).toVec3().normalize()}project(e){let t=this.frustums[0].projectionViewMatrix.mulVec4(e.toVec4()),i=this.renderer.handler.canvas;return new le((1+t.x/t.w)*i.width*.5,(1-t.y/t.w)*i.height*.5)}rotateAround(e,t,i,r){i=i||oe.ZERO,r=r||oe.UP;let n=(new se).setRotation(t?this._u:r,e),s=(new se).setIdentity().translate(i),a=(new se).setIdentity().translate(i.negateTo()),o=s.mul(n).mul(a);this.eye=o.mulVec3(this.eye),this._u=n.mulVec3(this._u).normalize(),this._r=n.mulVec3(this._r).normalize(),this._b=n.mulVec3(this._b).normalize()}rotateHorizontal(e,t,i,r){this.rotateAround(e,t,i,r)}rotateVertical(e,t){this.rotateAround(e,!1,t,this._r)}projectedSize(e,t){return Math.atan(t/this.eye.distance(e))*this._projSizeConst}getViewMatrix(){return this._viewMatrix._m}getNormalMatrix(){return this._normalMatrix._m}setCurrentFrustum(e){this.currentFrustumIndex=e,this.isFirstPass=e===this.FARTHEST_FRUSTUM_INDEX}getCurrentFrustum(){return this.currentFrustumIndex}get frustum(){return this.frustums[this.currentFrustumIndex]}getProjectionMatrix(){return this.frustum.projectionMatrix._m}getProjectionViewMatrix(){return this.frustum.projectionViewMatrix._m}getInverseProjectionViewMatrix(){return this.frustum.inverseProjectionViewMatrix._m}getInverseProjectionMatrix(){return this.frustum.inverseProjectionMatrix._m}}class ra extends ia{constructor(e,t={}){super(e.renderer,{...t,frustums:t.frustums||[[1,100.075],[100,1000.075],[1e3,101e4],[1e6,1e9]]}),this.planet=e,this.minAltitude=t.minAltitude||1,this.maxAltitude=t.maxAltitude||2e7,this._lonLat=this.planet.ellipsoid.cartesianToLonLat(this.eye),this._lonLatMerc=this._lonLat.forwardMercator(),this._terrainAltitude=this._lonLat.height,this._terrainPoint=new oe,this._insideSegment=null,this.slope=0,this._keyLock=new ln,this._framesArr=[],this._framesCounter=0,this._numFrames=50,this._completeCallback=null,this._frameCallback=null,this._flying=!1,this._checkTerrainCollision=!0,this.eyeNorm=this.eye.getNormal()}setTerrainCollisionActivity(e){this._checkTerrainCollision=e}update(){this.events.stopPropagation();let e=this.maxAltitude+this.planet.ellipsoid.getEquatorialSize();this.eye.length()>e&&this.eye.copy(this.eye.getNormal().scale(e)),super.update(),this.updateGeodeticPosition(),this.eyeNorm=this.eye.getNormal(),this.slope=this._b.dot(this.eyeNorm),this.events.dispatch(this.events.viewchange,this)}updateGeodeticPosition(){this.planet.ellipsoid.cartesianToLonLatRes(this.eye,this._lonLat),Math.abs(this._lonLat.lat)<=J&&I.forwardMercatorRes(this._lonLat,this._lonLatMerc)}setAltitude(e){let t=this._terrainPoint,i=this.planet.ellipsoid.getSurfaceNormal3v(this.eye);this.eye.x=i.x*e+t.x,this.eye.y=i.y*e+t.y,this.eye.z=i.z*e+t.z,this._terrainAltitude=e}getAltitude(){return this._terrainAltitude}setLonLat(e,t,i){this.stopFlying(),this._lonLat.set(e.lon,e.lat,e.height||this._lonLat.height);let r=this.planet.ellipsoid,n=r.lonLatToCartesian(this._lonLat),s=t?r.lonLatToCartesian(t):oe.ZERO;this.set(n,s,i||oe.NORTH),this.update()}getLonLat(){return this._lonLat}getHeight(){return this._lonLat.height}getExtentPosition(e,t=0){let i=e.getNorth(),r=e.getSouth(),n=e.getEast(),s=e.getWest();s>n&&(n+=360);let a=this.planet.ellipsoid,l=new I(n,i),h=a.lonLatToCartesian(l);l.lat=r;let c=a.lonLatToCartesian(l);l.lon=s;let d=a.lonLatToCartesian(l);l.lat=i;let _=a.lonLatToCartesian(l),u=oe.sub(h,d).scale(.5).addA(d),f=u.length();f<1e-6&&(l.lon=.5*(n+s),l.lat=.5*(i+r),u=a.lonLatToCartesian(l)),_.subA(u),c.subA(u),h.subA(u),d.subA(u);let g=u.getNormal(),p=g.cross(oe.NORTH).normalize(),m=p.cross(g).normalize(),v=Math.max(Math.abs(m.dot(_)),Math.abs(m.dot(c)),Math.abs(m.dot(h)),Math.abs(m.dot(d))),y=Math.max(Math.abs(p.dot(_)),Math.abs(p.dot(c)),Math.abs(p.dot(h)),Math.abs(p.dot(d))),x=Math.tan(this._viewAngle*o*.5),b=this._aspect*x,w=Math.max(y/b,v/x);return u.normalize(),u.scale(f+w+t),u}viewExtent(e,t){this.stopFlying(),this.set(this.getExtentPosition(e,t),oe.ZERO,oe.NORTH),this.update()}flyExtent(e,t,i,r,n,s,a){this.flyCartesian(this.getExtentPosition(e,t),oe.ZERO,i,r,n,s,a)}viewDistance(e,t=1e4){let i=this.eye.add(this.getForward().scaleTo(t)),r=ae.getRotationBetweenVectors(i.getNormal(),e.getNormal());if(r.isZero()){let i=e.add(this.getBackward().scaleTo(t));this.set(i,e)}else{let i=e.add(r.mulVec3(this.getBackward()).scale(t)),n=r.mulVec3(this.getUp());this.set(i,e,n)}this.update()}flyDistance(e,t=1e4,i=0,r,n,s){let a=this.eye.add(this.getForward().scaleTo(t)),o=ae.getRotationBetweenVectors(a.getNormal(),e.getNormal());if(o.isZero()){let i=e.add(this.getBackward().scaleTo(t));this.set(i,e)}else{let a=e.add(o.mulVec3(this.getBackward()).scale(t)),l=o.mulVec3(this.getUp());this.flyCartesian(a,e,l,i,r,n,s)}}flyCartesian(e,t=oe.ZERO,i=oe.NORTH,r=1,n=(()=>{}),s=(()=>{}),a=(()=>{})){this.stopFlying(),t=t||oe.ZERO,i=i||oe.NORTH,this._completeCallback=n,this._frameCallback=a,s&&s.call(this),t instanceof I&&(t=this.planet.ellipsoid.lonLatToCartesian(t));let o=this.planet.ellipsoid.lonLatToCartesian(new I(this._lonLat.lon,this._lonLat.lat)),l=this._u,h=this._b,c=this.planet.ellipsoid.cartesianToLonLat(e),_=i,u=this.planet.ellipsoid.lonLatToCartesian(new I(c.lon,c.lat,0)),f=oe.sub(e,t),g=_.cross(f);f.normalize(),g.normalize();let p=f.cross(g),m=o.getNormal(),v=u.getNormal(),y=1-m.dot(v),x=r*d*Math.sqrt(y>0?y:0),b=6639613,w=Math.max(this._lonLat.height,c.height);w>b&&(b=w);let T=w+2.5*x*(b-w),C=oe.ZERO;for(let e=0;e<=this._numFrames;e++){let t=1-e/this._numFrames;t=t*t*(3-2*t),t*=t;let i=o.smerp(u,t).normalize(),r=this.planet.getRayIntersectionEllipsoid(new ai(C,i)),n=1-t,s=this._lonLat.height*t*t*t+3*T*t*t*n+3*T*t*n*n+c.height*n*n*n,a=r.addA(i.scale(s)),d=l.smerp(p,t),_=oe.add(a,h.smerp(f,t).negateTo()),g=new oe(a.x-_.x,a.y-_.y,a.z-_.z),m=d.cross(g);g.normalize(),m.normalize();let v=g.cross(m);this._framesArr[e]={eye:a,n:g,u:m,v:v}}this._framesCounter=this._numFrames,this._flying=!0}flyLonLat(e,t,i,r,n,s,a){let o=new I(e.lon,e.lat,e.height||this._lonLat.height);this.flyCartesian(this.planet.ellipsoid.lonLatToCartesian(o),t,i,r,n,s,a)}stopFlying(){this.planet.layerLock.free(this._keyLock),this.planet.terrainLock.free(this._keyLock),this.planet.normalMapCreator.free(this._keyLock),this._flying=!1,this._framesArr.length=0,this._framesArr=[],this._framesCounter=-1,this._frameCallback=null}isFlying(){return this._flying}rotateLeft(e,t){this.rotateHorizontal(e*o,!0!==t,oe.ZERO),this.update()}rotateRight(e,t){this.rotateHorizontal(-e*o,!0!==t,oe.ZERO),this.update()}rotateUp(e){this.rotateVertical(e*o,oe.ZERO),this.update()}rotateDown(e){this.rotateVertical(-e*o,oe.ZERO),this.update()}rotateVertical(e,t,i=0){let r=(new se).setRotation(this._r,e),n=(new se).setIdentity().translate(t),s=(new se).setIdentity().translate(t.negateTo()),a=n.mul(r).mul(s).mulVec3(this.eye),o=r.mulVec3(this._u).normalize(),l=r.mulVec3(this._r).normalize(),h=r.mulVec3(this._b).normalize(),c=a.getNormal(),d=h.dot(c);if(i){let e=d-this.slope;if(d<i&&e<0)return;(d>.1&&o.dot(c)>0||this.slope<=.1||this._u.dot(this.eye.getNormal())<=0)&&(this.eye=a,this._u=o,this._r=l,this._b=h)}else this.eye=a,this._u=o,this._r=l,this._b=h}checkFly(){if(this._flying){let e=this._numFrames-this._framesCounter;this.planet.layerLock.lock(this._keyLock),this.planet.terrainLock.lock(this._keyLock),this.planet.normalMapCreator.lock(this._keyLock),this.eye=this._framesArr[e].eye,this._r=this._framesArr[e].u,this._u=this._framesArr[e].v,this._b=this._framesArr[e].n,this._frameCallback&&this._frameCallback(),this.update(),this._framesCounter--,this._framesCounter<0&&(this.stopFlying(),this._completeCallback&&(this._completeCallback(),this._completeCallback=null))}}checkTerrainCollision(){if(this._terrainAltitude=this._lonLat.height,this._insideSegment&&this._insideSegment.planet)return this._terrainAltitude=this._insideSegment.getTerrainPoint(this.eye,this._insideSegment.getInsideLonLat(this),this._terrainPoint),this._terrainAltitude<this.minAltitude&&this._checkTerrainCollision&&this.setAltitude(this.minAltitude),this._terrainPoint}getSurfaceVisibleDistance(e){let t=this.planet.ellipsoid.equatorialSize;return t*Math.acos(t/(t+this._lonLat.height+e))}getHeading(){let e=this.eye.getNormal(),t=oe.proj_b_to_plane(this.slope>=.97?this.getUp():this.getForward(),e).normalize(),i=oe.proj_b_to_plane(oe.NORTH,e).normalize(),r=Math.sign(e.dot(t.cross(i)))*Math.acos(t.dot(i))*l;return r<0?360+r:r}isVisible(e){let t=this.eye.length();return this.eye.distance(e)<Math.sqrt(t*t-this.planet.ellipsoid.equatorialSizeSqr)}}class na extends Zt{constructor(e=2){super(e,sa)}_onMessage(e){this._source.get(e.data.id).segment._terrainWorkerCallback(e.data),this._source.delete(e.data.id),e.data.normalMapNormals=null,e.data.normalMapVertices=null,e.data.normalMapVerticesHigh=null,e.data.normalMapVerticesLow=null,e.data.terrainVertices=null,e.data.terrainVerticesHigh=null,e.data.terrainVerticesLow=null}make(e){if(e.segment.plainReady&&e.segment.terrainIsLoading)if(this._workerQueue.length){const t=this._workerQueue.pop();this._source.set(this._sourceId,e);let i=e.segment;t.postMessage({elevations:e.elevations,this_plainVertices:i.plainVertices,this_plainNormals:i.plainNormals,this_normalMapVertices:i.normalMapVertices,this_normalMapNormals:i.normalMapNormals,heightFactor:i.planet._heightFactor,gridSize:i.planet.terrain.gridSizeByZoom[i.tileZoom],noDataValues:i.planet.terrain.noDataValues,id:this._sourceId},[e.elevations.buffer,i.plainVertices.buffer,i.plainNormals.buffer,i.normalMapVertices.buffer,i.normalMapNormals.buffer]),this._sourceId++}else this._pendingQueue.push(e);else this.check()}}const sa="'use strict';\n //\n //Terrain worker\n //\n\n function binarySearchFast(arr, x) {\n let start = 0,\n end = arr.length - 1;\n while (start <= end) {\n let k = Math.floor((start + end) * 0.5); \n if (arr[k] === x)\n return k;\n else if (arr[k] < x)\n start = k + 1;\n else\n end = k - 1;\n }\n return -1;\n };\n\n function checkNoDataValue(noDataValues, value) {\n return binarySearchFast(noDataValues, value) !== -1;\n };\n\n\n var Vec3 = function(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n };\n\n var doubleToTwoFloats = function(v, high, low) {\n\n let x = v.x, y = v.y, z = v.z;\n \n if (x >= 0.0) {\n var doubleHigh = Math.floor(x / 65536.0) * 65536.0;\n high.x = Math.fround(doubleHigh);\n low.x = Math.fround(x - doubleHigh);\n } else {\n var doubleHigh = Math.floor(-x / 65536.0) * 65536.0;\n high.x = Math.fround(-doubleHigh);\n low.x = Math.fround(x + doubleHigh);\n }\n\n if (y >= 0.0) {\n var doubleHigh = Math.floor(y / 65536.0) * 65536.0;\n high.y = Math.fround(doubleHigh);\n low.y = Math.fround(y - doubleHigh);\n } else {\n var doubleHigh = Math.floor(-y / 65536.0) * 65536.0;\n high.y = Math.fround(-doubleHigh);\n low.y = Math.fround(y + doubleHigh);\n }\n\n if (z >= 0.0) {\n var doubleHigh = Math.floor(z / 65536.0) * 65536.0;\n high.z = Math.fround(doubleHigh);\n low.z = Math.fround(z - doubleHigh);\n } else {\n var doubleHigh = Math.floor(-z / 65536.0) * 65536.0;\n high.z = Math.fround(-doubleHigh);\n low.z = Math.fround(z + doubleHigh);\n }\n };\n\n Vec3.prototype.sub = function(v) {\n return new Vec3(this.x - v.x, this.y - v.y, this.z - v.z);\n };\n\n Vec3.prototype.add = function(v) {\n return new Vec3(this.x + v.x, this.y + v.y, this.z + v.z);\n };\n\n Vec3.prototype.cross = function(v) {\n return new Vec3(\n this.y * v.z - this.z * v.y,\n this.z * v.x - this.x * v.z,\n this.x * v.y - this.y * v.x\n );\n };\n\n Vec3.prototype.normalize = function(v) {\n var x = this.x, y = this.y, z = this.z;\n var length = 1.0 / Math.sqrt(x * x + y * y + z * z);\n this.x = x * length;\n this.y = y * length;\n this.z = z * length;\n return this;\n };\n\n Vec3.prototype.distance = function(v) {\n return this.sub(v).length();\n };\n\n Vec3.prototype.length = function () {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n };\n\n var blerp = function(x, y, fQ11, fQ21, fQ12, fQ22) {\n return (fQ11 * (1.0 - x) * (1.0 - y) + fQ21 * x * (1.0 - y) + fQ12 * (1.0 - x) * y + fQ22 * x * y);\n };\n \n var slice = function (t, h1, h0) {\n return t * (h1 - h0);\n };\n\n var _tempVec = new Vec3(0.0, 0.0, 0.0);\n\n var _tempHigh = new Vec3(0.0, 0.0, 0.0),\n _tempLow = new Vec3(0.0, 0.0, 0.0);\n\n self.onmessage = function (e) {\n var elevations = e.data.elevations,\n this_plainVertices = e.data.this_plainVertices,\n this_plainNormals = e.data.this_plainNormals,\n this_normalMapVertices = e.data.this_normalMapVertices,\n this_normalMapNormals = e.data.this_normalMapNormals,\n heightFactor = e.data.heightFactor,\n gridSize = e.data.gridSize,\n noDataValues = e.data.noDataValues,\n id = e.data.id;\n \n var xmin = 549755748352.0, xmax = -549755748352.0, \n ymin = 549755748352.0, ymax = -549755748352.0, \n zmin = 549755748352.0, zmax = -549755748352.0;\n\n const fileGridSize = Math.sqrt(elevations.length) - 1;\n\n const fileGridSize_one = fileGridSize + 1;\n const fileGridSize_one_x2 = fileGridSize_one * fileGridSize_one;\n const tgs = gridSize;\n const dg = fileGridSize / tgs;\n const gs = tgs + 1;\n const hf = heightFactor;\n\n var nmvInd = 0,\n vInd = 0,\n noDataInd = 0;\n\n var gsgs3 = gs * gs * 3;\n\n var terrainVertices = new Float64Array(gsgs3),\n terrainVerticesHigh = new Float32Array(gsgs3),\n terrainVerticesLow = new Float32Array(gsgs3),\n noDataVertices = new Uint8Array(gs * gs);\n\n var normalMapNormals,\n normalMapVertices,\n normalMapVerticesHigh,\n normalMapVerticesLow;\n\n var nv = this_normalMapVertices,\n nn = this_normalMapNormals;\n\n if (fileGridSize >= tgs) {\n\n normalMapNormals = new Float32Array(fileGridSize_one_x2 * 3);\n normalMapVertices = new Float64Array(fileGridSize_one_x2 * 3);\n normalMapVerticesHigh = new Float32Array(fileGridSize_one_x2 * 3);\n normalMapVerticesLow = new Float32Array(fileGridSize_one_x2 * 3);\n\n for (let k = 0; k < fileGridSize_one_x2; k++) {\n\n var j = k % fileGridSize_one,\n i = ~~(k / fileGridSize_one);\n\n //\n // V0\n //\n var hInd0 = k;\n var vInd0 = hInd0 * 3;\n var currElv = elevations[hInd0];\n if(checkNoDataValue(noDataValues, currElv)) {\n currElv = 0.0;\n }\n var h0 = hf * currElv;\n var v0 = new Vec3(nv[vInd0] + h0 * nn[vInd0], nv[vInd0 + 1] + h0 * nn[vInd0 + 1], nv[vInd0 + 2] + h0 * nn[vInd0 + 2]);\n \n doubleToTwoFloats(v0, _tempHigh, _tempLow);\n\n normalMapVertices[vInd0] = v0.x;\n normalMapVertices[vInd0 + 1] = v0.y;\n normalMapVertices[vInd0 + 2] = v0.z;\n\n normalMapVerticesHigh[vInd0] = _tempHigh.x;\n normalMapVerticesHigh[vInd0 + 1] = _tempHigh.y;\n normalMapVerticesHigh[vInd0 + 2] = _tempHigh.z;\n\n normalMapVerticesLow[vInd0] = _tempLow.x;\n normalMapVerticesLow[vInd0 + 1] = _tempLow.y;\n normalMapVerticesLow[vInd0 + 2] = _tempLow.z;\n\n //\n // The vertex goes into screen buffer\n if (i % dg === 0 && j % dg === 0) {\n\n let currVert = new Vec3(nv[vInd0], nv[vInd0 + 1], nv[vInd0 + 2]);\n let nextVert = new Vec3(nv[vInd0 + 3], nv[vInd0 + 4], nv[vInd0 + 5]);\n\n let nextElv = elevations[hInd0 + 1];\n if(checkNoDataValue(noDataValues, nextElv)) {\n nextElv = 0.0;\n }\n \n let eps = false;\n if(noDataValues.length === 0){\n let step = currVert.distance(nextVert);\n let deltaElv = Math.abs(currElv - nextElv);\n eps = ((deltaElv / step) > 10.0) || (currElv < -5000);\n }\n\n if(eps){\n noDataVertices[noDataInd] = 1;\n } else {\n noDataVertices[noDataInd] = 0;\n if (v0.x < xmin) xmin = v0.x; if (v0.x > xmax) xmax = v0.x;\n if (v0.y < ymin) ymin = v0.y; if (v0.y > ymax) ymax = v0.y;\n if (v0.z < zmin) zmin = v0.z; if (v0.z > zmax) zmax = v0.z;\n }\n\n terrainVerticesHigh[vInd] = _tempHigh.x;\n terrainVerticesLow[vInd] = _tempLow.x;\n terrainVertices[vInd++] = v0.x;\n\n terrainVerticesHigh[vInd] = _tempHigh.y;\n terrainVerticesLow[vInd] = _tempLow.y;\n terrainVertices[vInd++] = v0.y;\n\n terrainVerticesHigh[vInd] = _tempHigh.z;\n terrainVerticesLow[vInd] = _tempLow.z;\n terrainVertices[vInd++] = v0.z;\n\n noDataInd++;\n }\n\n if (i !== fileGridSize && j !== fileGridSize) {\n\n //\n // V1\n //\n var hInd1 = k + 1;\n var vInd1 = hInd1 * 3;\n var elv = elevations[hInd1];\n if(checkNoDataValue(noDataValues, elv)) {\n elv = 0.0;\n }\n var h1 = hf * elv;\n var v1 = new Vec3(nv[vInd1] + h1 * nn[vInd1], nv[vInd1 + 1] + h1 * nn[vInd1 + 1], nv[vInd1 + 2] + h1 * nn[vInd1 + 2]);\n\n doubleToTwoFloats(v1, _tempHigh, _tempLow);\n\n normalMapVertices[vInd1] = v1.x;\n normalMapVertices[vInd1 + 1] = v1.y;\n normalMapVertices[vInd1 + 2] = v1.z;\n\n normalMapVerticesHigh[vInd1] = _tempHigh.x;\n normalMapVerticesHigh[vInd1 + 1] = _tempHigh.y;\n normalMapVerticesHigh[vInd1 + 2] = _tempHigh.z;\n\n normalMapVerticesLow[vInd1] = _tempLow.x;\n normalMapVerticesLow[vInd1 + 1] = _tempLow.y;\n normalMapVerticesLow[vInd1 + 2] = _tempLow.z;\n\n //\n // V2\n //\n var hInd2 = k + fileGridSize_one;\n var vInd2 = hInd2 * 3;\n var elv = elevations[hInd2];\n if(checkNoDataValue(noDataValues, elv)) {\n elv = 0.0;\n }\n var h2 = hf * elv;\n var v2 = new Vec3(nv[vInd2] + h2 * nn[vInd2], nv[vInd2 + 1] + h2 * nn[vInd2 + 1], nv[vInd2 + 2] + h2 * nn[vInd2 + 2]);\n\n doubleToTwoFloats(v2, _tempHigh, _tempLow);\n\n normalMapVertices[vInd2] = v2.x;\n normalMapVertices[vInd2 + 1] = v2.y;\n normalMapVertices[vInd2 + 2] = v2.z;\n\n normalMapVerticesHigh[vInd2] = _tempHigh.x;\n normalMapVerticesHigh[vInd2 + 1] = _tempHigh.y;\n normalMapVerticesHigh[vInd2 + 2] = _tempHigh.z;\n\n normalMapVerticesLow[vInd2] = _tempLow.x;\n normalMapVerticesLow[vInd2 + 1] = _tempLow.y;\n normalMapVerticesLow[vInd2 + 2] = _tempLow.z;\n\n //\n // V3\n //\n var hInd3 = k + fileGridSize_one + 1;\n var vInd3 = hInd3 * 3;\n var elv = elevations[hInd3];\n if(checkNoDataValue(noDataValues, elv)) {\n elv = 0.0;\n }\n var h3 = hf * elv;\n var v3 = new Vec3(nv[vInd3] + h3 * nn[vInd3], nv[vInd3 + 1] + h3 * nn[vInd3 + 1], nv[vInd3 + 2] + h3 * nn[vInd3 + 2]);\n\n doubleToTwoFloats(v3, _tempHigh, _tempLow);\n\n normalMapVertices[vInd3] = v3.x;\n normalMapVertices[vInd3 + 1] = v3.y;\n normalMapVertices[vInd3 + 2] = v3.z;\n\n normalMapVerticesHigh[vInd3] = _tempHigh.x;\n normalMapVerticesHigh[vInd3 + 1] = _tempHigh.y;\n normalMapVerticesHigh[vInd3 + 2] = _tempHigh.z;\n\n normalMapVerticesLow[vInd3] = _tempLow.x;\n normalMapVerticesLow[vInd3 + 1] = _tempLow.y;\n normalMapVerticesLow[vInd3 + 2] = _tempLow.z;\n\n //\n // Normal\n //\n var e10 = v1.sub(v0),\n e20 = v2.sub(v0),\n e30 = v3.sub(v0);\n var sw = e20.cross(e30).normalize();\n var ne = e30.cross(e10).normalize();\n var n0 = ne.add(sw).normalize();\n\n normalMapNormals[vInd0] += n0.x;\n normalMapNormals[vInd0 + 1] += n0.y;\n normalMapNormals[vInd0 + 2] += n0.z;\n\n normalMapNormals[vInd1] += ne.x;\n normalMapNormals[vInd1 + 1] += ne.y;\n normalMapNormals[vInd1 + 2] += ne.z;\n\n normalMapNormals[vInd2] += sw.x;\n normalMapNormals[vInd2 + 1] += sw.y;\n normalMapNormals[vInd2 + 2] += sw.z;\n\n normalMapNormals[vInd3] += n0.x;\n normalMapNormals[vInd3 + 1] += n0.y;\n normalMapNormals[vInd3 + 2] += n0.z;\n }\n }\n\n } else {\n\n normalMapNormals = new Float32Array(gsgs3);\n normalMapVertices = new Float64Array(gsgs3);\n normalMapVerticesHigh = new Float32Array(gsgs3);\n normalMapVerticesLow = new Float32Array(gsgs3);\n normalMapNormals = new Float32Array(gsgs3);\n\n var oneSize = tgs / fileGridSize;\n var h, inside_i, inside_j, v_i, v_j;\n var gsgs = gsgs3 / 3;\n var fgsOne = fileGridSize + 1;\n\n for(let i = 0; i < gsgs; i++) {\n let ii = Math.floor(i / gs),\n ij = i % gs;\n \n let qii = ii % oneSize,\n qij = ij % oneSize;\n\n let hlt_ind = Math.floor(ii / oneSize) * fgsOne + Math.floor(ij / oneSize);\n\n if (ij === tgs) {\n hlt_ind -= 1;\n qij = oneSize;\n }\n\n if (ii === tgs) {\n hlt_ind -= fgsOne;\n qii = oneSize;\n }\n\n let hrt_ind = hlt_ind + 1,\n hlb_ind = hlt_ind + fgsOne,\n hrb_ind = hlb_ind + 1;\n\n let h_lt = elevations[hlt_ind],\n h_rt = elevations[hrt_ind],\n h_lb = elevations[hlb_ind],\n h_rb = elevations[hrb_ind];\n\n if(checkNoDataValue(noDataValues, h_lt)) {\n h_lt = 0.0;\n }\n\n if(checkNoDataValue(noDataValues, h_rt)) {\n h_rt = 0.0;\n }\n\n if(checkNoDataValue(noDataValues, h_lb)) {\n h_lb = 0.0;\n }\n\n if(checkNoDataValue(noDataValues, h_rb)) {\n h_rb = 0.0;\n }\n\n let hi = blerp(qij / oneSize, qii / oneSize, h_lt, h_rt, h_lb, h_rb);\n\n let i3 = i * 3;\n\n _tempVec.x = this_plainVertices[i3] + hi * this_plainNormals[i3],\n _tempVec.y = this_plainVertices[i3 + 1] + hi * this_plainNormals[i3 + 1],\n _tempVec.z = this_plainVertices[i3 + 2] + hi * this_plainNormals[i3 + 2];\n\n doubleToTwoFloats(_tempVec, _tempHigh, _tempLow);\n\n terrainVertices[i3] = _tempVec.x;\n terrainVertices[i3 + 1] = _tempVec.y;\n terrainVertices[i3 + 2] = _tempVec.z;\n\n terrainVerticesHigh[i3] = _tempHigh.x;\n terrainVerticesHigh[i3 + 1] = _tempHigh.y;\n terrainVerticesHigh[i3 + 2] = _tempHigh.z;\n\n terrainVerticesLow[i3] = _tempLow.x;\n terrainVerticesLow[i3 + 1] = _tempLow.y;\n terrainVerticesLow[i3 + 2] = _tempLow.z;\n\n if (_tempVec.x < xmin) xmin = _tempVec.x; if (_tempVec.x > xmax) xmax = _tempVec.x;\n if (_tempVec.y < ymin) ymin = _tempVec.y; if (_tempVec.y > ymax) ymax = _tempVec.y;\n if (_tempVec.z < zmin) zmin = _tempVec.z; if (_tempVec.z > zmax) zmax = _tempVec.z;\n }\n\n normalMapVertices.set(terrainVertices);\n normalMapVerticesHigh.set(terrainVerticesHigh);\n normalMapVerticesLow.set(terrainVerticesLow);\n\n for (let k = 0; k < gsgs; k++) {\n\n var j = k % gs,\n i = ~~(k / gs);\n\n if (i !== tgs && j !== tgs) {\n var v0ind = k * 3,\n v1ind = v0ind + 3,\n v2ind = v0ind + gs * 3,\n v3ind = v2ind + 3;\n\n\n var v0 = new Vec3(terrainVertices[v0ind], terrainVertices[v0ind + 1], terrainVertices[v0ind + 2]),\n v1 = new Vec3(terrainVertices[v1ind], terrainVertices[v1ind + 1], terrainVertices[v1ind + 2]),\n v2 = new Vec3(terrainVertices[v2ind], terrainVertices[v2ind + 1], terrainVertices[v2ind + 2]),\n v3 = new Vec3(terrainVertices[v3ind], terrainVertices[v3ind + 1], terrainVertices[v3ind + 2]);\n\n var e10 = v1.sub(v0).normalize(),\n e20 = v2.sub(v0).normalize(),\n e30 = v3.sub(v0).normalize();\n\n var sw = e20.cross(e30).normalize();\n var ne = e30.cross(e10).normalize();\n var n0 = ne.add(sw).normalize();\n\n normalMapNormals[v0ind] += n0.x;\n normalMapNormals[v0ind + 1] += n0.y;\n normalMapNormals[v0ind + 2] += n0.z;\n\n normalMapNormals[v1ind] += ne.x;\n normalMapNormals[v1ind + 1] += ne.y;\n normalMapNormals[v1ind + 2] += ne.z;\n\n normalMapNormals[v2ind] += sw.x;\n normalMapNormals[v2ind + 1] += sw.y;\n normalMapNormals[v2ind + 2] += sw.z;\n\n normalMapNormals[v3ind] += n0.x;\n normalMapNormals[v3ind + 1] += n0.y;\n normalMapNormals[v3ind + 2] += n0.z;\n }\n }\n }\n\n self.postMessage({\n id: id,\n normalMapNormals: normalMapNormals,\n normalMapVertices: normalMapVertices,\n normalMapVerticesHigh: normalMapVerticesHigh,\n normalMapVerticesLow: normalMapVerticesLow,\n terrainVertices: terrainVertices,\n terrainVerticesHigh: terrainVerticesHigh,\n terrainVerticesLow: terrainVerticesLow,\n noDataVertices: noDataVertices,\n //bounds: [xmin, xmax, ymin, ymax, zmin, zmax]\n bounds: [xmin, ymin, zmin, xmax, ymax, zmax]\n }, [\n normalMapNormals.buffer, \n normalMapVertices.buffer, \n normalMapVerticesHigh.buffer, \n normalMapVerticesLow.buffer, \n terrainVertices.buffer,\n terrainVerticesHigh.buffer,\n terrainVerticesLow.buffer,\n noDataVertices.buffer\n ]);\n }";let aa=new Float32Array(2);class oa{constructor(e,t=512,i=512){this._width=t,this._height=i,this._planet=e,this._framebuffer=null,this._queue=[],this._handler=null}init(){this._handler=this._planet.renderer.handler,this._handler.programs.vectorTileLineRasterization||this._handler.addProgram(new Si("vectorTileLineRasterization",{uniforms:{viewport:"vec2",thicknessOutline:"float",alpha:"float",extentParamsHigh:"vec4",extentParamsLow:"vec4"},attributes:{prevHigh:"vec2",currentHigh:"vec2",nextHigh:"vec2",prevLow:"vec2",currentLow:"vec2",nextLow:"vec2",order:"float",color:"vec4",thickness:"float"},vertexShader:"attribute vec2 prevHigh;\n attribute vec2 currentHigh;\n attribute vec2 nextHigh;\n\n attribute vec2 prevLow;\n attribute vec2 currentLow;\n attribute vec2 nextLow;\n\n attribute float order;\n attribute float thickness;\n attribute vec4 color;\n uniform float thicknessOutline;\n uniform vec2 viewport;\n uniform vec4 extentParamsHigh;\n uniform vec4 extentParamsLow;\n varying vec4 vColor;\n \n vec2 proj(vec2 coordHigh, vec2 coordLow) {\n vec2 highDiff = coordHigh - extentParamsHigh.xy;\n vec2 lowDiff = coordLow - extentParamsLow.xy;\n return vec2(-1.0 + (highDiff + lowDiff) * extentParamsHigh.zw) * vec2(1.0, -1.0);\n }\n \n void main(){\n vColor = color;\n\n vec2 vNext = proj(nextHigh, nextLow),\n vCurrent = proj(currentHigh, currentLow),\n vPrev = proj(prevHigh, prevLow);\n\n vec2 _next = vNext;\n vec2 _prev = vPrev;\n vec2 _current = vCurrent;\n\n if(_prev == _current){\n if(_next == _current){\n _next = _current + vec2(1.0, 0.0);\n _prev = _current - _next;\n }else{\n _prev = _current + normalize(_current - _next);\n }\n }\n\n if(_next == _current){\n _next = _current + normalize(_current - _prev);\n }\n\n vec2 sNext = _next;\n vec2 sCurrent = _current;\n vec2 sPrev = _prev;\n \n vec2 dirNext = normalize(sNext - sCurrent);\n vec2 dirPrev = normalize(sPrev - sCurrent);\n float dotNP = dot(dirNext, dirPrev);\n \n vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));\n vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));\n vec2 d = (thickness + thicknessOutline) * 0.5 * sign(order) / viewport;\n \n vec2 m;\n if(dotNP >= 0.99991){\n m = sCurrent - normalPrev * d;\n }else{\n vec2 dir = normalPrev + normalNext;\n m = sCurrent + dir * d / (dirNext.x * dir.y - dirNext.y * dir.x);\n \n if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){\n float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);\n if(occw == -1.0){\n m = sCurrent + normalPrev * d;\n }else if(occw == 1.0){\n m = sCurrent + normalNext * d;\n }else if(occw == -2.0){\n m = sCurrent + normalNext * d;\n }else if(occw == 2.0){\n m = sCurrent + normalPrev * d;\n }\n }else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){\n m = sCurrent + normalNext * d;\n }\n }\n gl_Position = vec4(m.x, m.y, 0.0, 1.0);\n }",fragmentShader:"precision highp float;\n uniform float alpha;\n varying vec4 vColor;\n void main() {\n gl_FragColor = vec4(vColor.rgb, alpha * vColor.a);\n }"})),this._handler.programs.vectorTilePolygonRasterization||this._handler.addProgram(new Si("vectorTilePolygonRasterization",{uniforms:{extentParamsHigh:"vec4",extentParamsLow:"vec4"},attributes:{coordinatesHigh:"vec2",coordinatesLow:"vec2",colors:"vec4"},vertexShader:"attribute vec2 coordinatesHigh;\n attribute vec2 coordinatesLow; \n attribute vec4 colors; \n uniform vec4 extentParamsHigh; \n uniform vec4 extentParamsLow; \n varying vec4 color;\n\n vec2 proj(vec2 coordHigh, vec2 coordLow) {\n vec2 highDiff = coordHigh - extentParamsHigh.xy;\n vec2 lowDiff = coordLow - extentParamsLow.xy;\n return vec2(-1.0 + (highDiff + lowDiff) * extentParamsHigh.zw) * vec2(1.0, -1.0);\n }\n\n void main() { \n color = colors;\n gl_Position = vec4(proj(coordinatesHigh, coordinatesLow), 0.0, 1.0); \n }",fragmentShader:"precision highp float;\n varying vec4 color;\n void main () { \n gl_FragColor = color; \n }"})),this._framebuffer=new fs(this._handler,{width:this._width,height:this._height,useDepth:!1}),this._framebuffer.init()}frame(){if(this._planet.layerLock.isFree()&&this._queue.length){let e=this._handler,t=e.gl;t.disable(t.CULL_FACE),t.disable(t.DEPTH_TEST);let i=e.programs.vectorTileLineRasterization,r=e.programs.vectorTilePolygonRasterization,n=this._width,s=this._height,a=n,o=s,l=a<<1,h=o<<1,c=new Float32Array(4),d=new Float32Array(4),_=this._framebuffer.activate(),u=0,f=window.performance.now();for(;this._queue.length&&u<25;){let g=this._queue.shift();if(g.isLoading&&1===g.segment.node.getState()){let u=g.layer._pickingEnabled;g.segment.tileZoom<4?(a=l,o=h):(a=n,o=s);let f=g._updateTexture||e.createEmptyTexture_l(a,o),p=u?g._updatePickingMask||e.createEmptyTexture_n(a,o):null;g.applyTexture(f,p),_.setSize(a,o),_.bindOutputTexture(f),t.clearColor(0,0,0,0),t.clear(t.COLOR_BUFFER_BIT);let m=g.segment.getExtentMerc();Ki(m.southWest.lon,aa),c[0]=aa[0],d[0]=aa[1],Ki(m.southWest.lat,aa),c[1]=aa[0],d[1]=aa[1],c[2]=2/m.getWidth(),c[3]=2/m.getHeight(),r.activate();let v=r._program,y=v.attributes,x=v.uniforms,b=g.layer._geometryHandler;t.uniform4fv(x.extentParamsHigh,c),t.uniform4fv(x.extentParamsLow,d),t.bindBuffer(t.ARRAY_BUFFER,b._polyVerticesHighBufferMerc),t.vertexAttribPointer(y.coordinatesHigh,b._polyVerticesHighBufferMerc.itemSize,t.FLOAT,!1,0,0),t.bindBuffer(t.ARRAY_BUFFER,b._polyVerticesLowBufferMerc),t.vertexAttribPointer(y.coordinatesLow,b._polyVerticesLowBufferMerc.itemSize,t.FLOAT,!1,0,0),t.bindBuffer(t.ARRAY_BUFFER,b._polyColorsBuffer),t.vertexAttribPointer(y.colors,b._polyColorsBuffer.itemSize,t.FLOAT,!1,0,0),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,b._polyIndexesBuffer),t.drawElements(t.TRIANGLES,b._polyIndexesBuffer.numItems,t.UNSIGNED_INT,0),u&&(_.bindOutputTexture(p),t.clearColor(0,0,0,0),t.clear(t.COLOR_BUFFER_BIT),t.bindBuffer(t.ARRAY_BUFFER,b._polyPickingColorsBuffer),t.vertexAttribPointer(y.colors,b._polyPickingColorsBuffer.itemSize,t.FLOAT,!1,0,0),t.drawElements(t.TRIANGLES,b._polyIndexesBuffer.numItems,t.UNSIGNED_INT,0)),_.bindOutputTexture(f),i.activate(),v=i._program,y=v.attributes,x=v.uniforms,t.uniform2fv(x.viewport,[a,o]),t.uniform4fv(x.extentParamsHigh,c),t.uniform4fv(x.extentParamsLow,d);let w=b._lineVerticesHighBufferMerc;t.bindBuffer(t.ARRAY_BUFFER,w),t.vertexAttribPointer(y.prevHigh,w.itemSize,t.FLOAT,!1,8,0),t.vertexAttribPointer(y.currentHigh,w.itemSize,t.FLOAT,!1,8,32),t.vertexAttribPointer(y.nextHigh,w.itemSize,t.FLOAT,!1,8,64),w=b._lineVerticesLowBufferMerc,t.bindBuffer(t.ARRAY_BUFFER,w),t.vertexAttribPointer(y.prevLow,w.itemSize,t.FLOAT,!1,8,0),t.vertexAttribPointer(y.currentLow,w.itemSize,t.FLOAT,!1,8,32),t.vertexAttribPointer(y.nextLow,w.itemSize,t.FLOAT,!1,8,64),t.bindBuffer(t.ARRAY_BUFFER,b._lineOrdersBuffer),t.vertexAttribPointer(y.order,b._lineOrdersBuffer.itemSize,t.FLOAT,!1,4,0),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,b._lineIndexesBuffer),t.bindBuffer(t.ARRAY_BUFFER,b._lineStrokesBuffer),t.vertexAttribPointer(y.thickness,b._lineStrokesBuffer.itemSize,t.FLOAT,!1,0,0),t.bindBuffer(t.ARRAY_BUFFER,b._lineStrokeColorsBuffer),t.vertexAttribPointer(y.color,b._lineStrokeColorsBuffer.itemSize,t.FLOAT,!1,0,0),t.uniform1f(x.thicknessOutline,2),t.uniform1f(x.alpha,.54),t.drawElements(t.TRIANGLE_STRIP,b._lineIndexesBuffer.numItems,t.UNSIGNED_INT,0),t.uniform1f(x.thicknessOutline,1),t.uniform1f(x.alpha,1),t.drawElements(t.TRIANGLE_STRIP,b._lineIndexesBuffer.numItems,t.UNSIGNED_INT,0),t.bindBuffer(t.ARRAY_BUFFER,b._lineThicknessBuffer),t.vertexAttribPointer(y.thickness,b._lineThicknessBuffer.itemSize,t.FLOAT,!1,0,0),t.bindBuffer(t.ARRAY_BUFFER,b._lineColorsBuffer),t.vertexAttribPointer(y.color,b._lineColorsBuffer.itemSize,t.FLOAT,!1,0,0),t.uniform1f(x.thicknessOutline,2),t.uniform1f(x.alpha,.54),t.drawElements(t.TRIANGLE_STRIP,b._lineIndexesBuffer.numItems,t.UNSIGNED_INT,0),t.uniform1f(x.thicknessOutline,1),t.uniform1f(x.alpha,1),t.drawElements(t.TRIANGLE_STRIP,b._lineIndexesBuffer.numItems,t.UNSIGNED_INT,0),u&&(_.bindOutputTexture(p),t.uniform1f(x.thicknessOutline,8),t.bindBuffer(t.ARRAY_BUFFER,b._linePickingColorsBuffer),t.vertexAttribPointer(y.color,b._linePickingColorsBuffer.itemSize,t.FLOAT,!1,0,0),t.drawElements(t.TRIANGLE_STRIP,b._lineIndexesBuffer.numItems,t.UNSIGNED_INT,0))}else g.isLoading=!1;u=window.performance.now()-f}t.enable(t.DEPTH_TEST),t.enable(t.CULL_FACE),_.deactivate()}}add(e){this._queue.push(e)}remove(e){}get queueSize(){return this._queue.length}}class la{constructor(e=1,t=1){this._a=e,this._b=t,this._flattening=(e-t)/e,this._f=1/this._flattening,this._a2=e*e,this._b2=t*t;const i=Math.sqrt(this._a2-this._b2);this._e=i/e,this._e2=this._e*this._e,this._e22=this._e2*this._e2,this._k=i/t,this._k2=this._k*this._k,this._radii=new oe(e,e,t),this._radii2=new oe(this._a2,this._a2,this._b2),this._invRadii=new oe(1/e,1/e,1/t),this._invRadii2=new oe(1/this._a2,1/this._a2,1/this._b2)}rhumbDistanceTo(e,t){const i=e.lat*o,r=t.lat*o,n=r-i;let s=Math.abs(t.lon-e.lon)*o;Math.abs(s)>Math.PI&&(s=s>0?-(2*Math.PI-s):2*Math.PI+s);const a=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),l=Math.abs(a)>1e-11?n/a:Math.cos(i);return Math.sqrt(n*n+l*l*s*s)*this._a}getIntermediatePointOnGreatCircle(e,t,i){if(0==i)return e.clone();if(1==i)return t.clone();const r=this.inverse(e,t),n=r.distance,s=r.initialAzimuth;return isNaN(s)?e:this.getGreatCircleDestination(e,s,n*i)}static getBearing(e,t){let i=e.lat*o,r=e.lon*o,n=t.lat*o,s=t.lon*o,a=Math.sin(s-r)*Math.cos(n),h=Math.cos(i)*Math.sin(n)-Math.sin(i)*Math.cos(n)*Math.cos(s-r);return Math.atan2(a,h)*l}getFlattening(){return this._flattening}getEquatorialSize(){return this._a}get equatorialSize(){return this._a}get equatorialSizeSqr(){return this._a2}getPolarSize(){return this._b}get polarSize(){return this._b}get polarSizeSqr(){return this._b2}lonLatToCartesian(e){return this.geodeticToCartesian(e.lon,e.lat,e.height)}lonLatToCartesianRes(e,t){return this.geodeticToCartesian(e.lon,e.lat,e.height,t)}geodeticToCartesian(e,t,i=0,r=new oe){let n=o*t,s=o*e,a=Math.sin(n),l=this._a/Math.sqrt(1-this._e2*a*a),h=(l+i)*Math.cos(n);return r.x=h*Math.cos(s),r.y=h*Math.sin(s),r.z=(l*(1-this._e2)+i)*a,r}projToSurface(e){let t=e.x||0,i=e.y||0,r=e.z||0,n=Math.sqrt(t*t+i*i+r*r),s=this._invRadii2.x,a=this._invRadii2.y,o=this._invRadii2.z,l=t*t*s,h=i*i*a,c=r*r*o,d=l+h+c,_=Math.sqrt(1/d),u=e.scaleTo(_);if(d<.1)return Number.isFinite(_)?u:new oe;let g=(1-_)*n/u.mulA(this._invRadii2).length(),p=0,m=0,v=0;for(;;){p=1/(1+g*s),m=1/(1+g*a),v=1/(1+g*o);let e=p*p,t=m*m,i=v*v,r=l*e+h*t+c*i-1;if(Math.abs(r)<f)break;g+=.5*r/(l*(e*p)*s+h*(t*m)*a+c*(i*v)*o)}return new oe(t*p,i*m,r*v)}cartesianToLonLat(e){return this.cartesianToLonLatRes(e)}cartesianToLonLatRes(e,t=new I){let i=this.projToSurface(e),r=this.getSurfaceNormal3v(i),n=e.sub(i);return t.lon=Math.atan2(r.y,r.x)*l,t.lat=Math.asin(r.z)*l,t.height=Math.sign(n.dot(e))*n.length(),t}getSurfaceNormal3v(e){let t=this._invRadii2,i=e.x*t.x,r=e.y*t.y,n=e.z*t.z,s=1/Math.sqrt(i*i+r*r+n*n);return new oe(i*s,r*s,n*s)}getGreatCircleDistance(e,t){return this.inverse(e,t).distance}getGreatCircleDestination(e,t,i){return this.direct(e,t,i).destination}inverse(e,t){let i=this._a,r=this._b,n=this._flattening;const s=e.lat*o,a=e.lon*o,h=t.lat*o,c=t.lon*o-a,d=(1-n)*Math.tan(s),_=1/Math.sqrt(1+d*d),u=d*_,g=(1-n)*Math.tan(h),p=1/Math.sqrt(1+g*g),m=g*p,v=Math.abs(c)>Math.PI/2||Math.abs(h-s)>Math.PI/2;let y=c,x=null,w=null,T=v?Math.PI:0,C=0,L=v?-1:1,A=null,E=1,P=1,M=null,S=0;do{if(x=Math.sin(y),w=Math.cos(y),A=(p*x)**2+(_*m-u*p*w)**2,Math.abs(A)<1e-24)break;C=Math.sqrt(A),L=u*m+_*p*w,T=Math.atan2(C,L);const e=_*p*x/C;P=1-e*e,E=0!=P?L-2*u*m/P:0;const t=n/16*P*(4+n*(4-3*P));M=y,y=c+(1-t)*n*e*(T+t*C*(E+t*L*(2*E*E-1)))}while(Math.abs(y-M)>f&&++S<1e3);const B=P*(i*i-r*r)/(r*r),k=B/1024*(256+B*(B*(74-47*B)-128)),R=r*(1+B/16384*(4096+B*(B*(320-175*B)-768)))*(T-k*C*(E+k/4*(L*(2*E*E-1)-k/6*E*(4*C*C-3)*(4*E*E-3)))),z=Math.abs(A)<Number.EPSILON?0:Math.atan2(p*x,_*m-u*p*w),I=Math.abs(A)<Number.EPSILON?Math.PI:Math.atan2(_*x,-u*p+_*m*w);return{distance:R,initialAzimuth:Math.abs(R)<Number.EPSILON?NaN:b(z)*l,finalAzimuth:Math.abs(R)<Number.EPSILON?NaN:b(I)*l}}direct(e,t,i){let r=e.lon,n=e.lat,s=this._a,a=this._b,h=this._flattening,c=i,d=t*o,_=Math.sin(d),u=Math.cos(d),f=(1-h)*Math.tan(n*o),g=1/Math.sqrt(1+f*f),p=f*g,m=Math.atan2(f,u),v=g*_,y=1-v*v,x=y*(s*s-a*a)/(a*a),b=1+x/16384*(4096+x*(x*(320-175*x)-768)),w=x/1024*(256+x*(x*(74-47*x)-128)),T=c/(a*b),C=2*Math.PI,L=0,A=0,E=0,P=0;for(;Math.abs(T-C)>1e-12;)L=Math.cos(2*m+T),A=Math.sin(T),E=Math.cos(T),P=w*A*(L+w/4*(E*(2*L*L-1)-w/6*L*(4*A*A-3)*(4*L*L-3))),C=T,T=c/(a*b)+P;let M=p*A-g*E*u,S=Math.atan2(p*E+g*A*u,(1-h)*Math.sqrt(v*v+M*M)),B=h/16*y*(4+h*(4-3*y)),k=Math.atan2(A*_,g*E-p*A*u)-(1-B)*h*v*(T+B*A*(L+B*E*(2*L*L-1))),R=Math.atan2(v,-M);return{destination:new I(r+k*l,S*l),finalAzimuth:R*l}}hitRay(e,t){let i,r,n,s,a,o=this._invRadii.mul(e),l=this._invRadii.mul(t),h=o.dot(o),c=o.dot(l);if(h>1){if(c>=0)return;var d=c*c;if(i=h-1,r=l.dot(l),n=r*i,Math.abs(d-n)>1e-15&&d<n)return;if(d>n){s=c*c-n,a=-c+Math.sqrt(s);var _=a/r,u=i/a;return _<u?e.add(t.scaleTo(_)):e.add(t.scaleTo(u))}var f=Math.sqrt(i/r);return e.add(t.scaleTo(f))}return h<1?(i=h-1,r=l.dot(l),n=r*i,s=c*c-n,a=-c+Math.sqrt(s),e.add(t.scaleTo(a/r))):c<0?(r=l.dot(l),e.add(t.scaleTo(-c/r))):void 0}getNorthFrameRotation(e){let t=this.getSurfaceNormal3v(e),i=oe.proj_b_to_plane(oe.NORTH,t);return ae.getLookRotation(i,t)}getBearingDestination(e,t=0,i=0){t*=o;var r=(e.lon+540)%360-180,n=e.lat*o,s=r*o,a=i/this._a,h=Math.asin(Math.sin(n)*Math.cos(a)+Math.cos(n)*Math.sin(a)*Math.cos(t));return new I((s+Math.atan2(Math.sin(t)*Math.sin(a)*Math.cos(n),Math.cos(a)-Math.sin(n)*Math.sin(h)))*l,h*l)}static getIntermediatePointOnGreatCircle(e,t,i){var r=e.lat*o,n=e.lon*o,s=t.lat*o,a=t.lon*o,h=Math.sin(r),c=Math.cos(r),d=Math.sin(n),_=Math.cos(n),u=Math.sin(s),f=Math.cos(s),g=Math.sin(a),p=Math.cos(a),m=s-r,v=a-n,y=Math.sin(m/2)*Math.sin(m/2)+Math.cos(r)*Math.cos(s)*Math.sin(v/2)*Math.sin(v/2),x=2*Math.atan2(Math.sqrt(y),Math.sqrt(1-y)),b=Math.sin((1-i)*x)/Math.sin(x),w=Math.sin(i*x)/Math.sin(x),T=b*c*_+w*f*p,C=b*c*d+w*f*g,L=b*h+w*u,A=Math.atan2(L,Math.sqrt(T*T+C*C)),E=Math.atan2(C,T);return new I((E*l+540)%360-180,A*l)}static getRhumbBearing(e,t){var i=(t.lon-e.lon)*o,r=Math.log(Math.tan(t.lat*o/2+Math.PI/4)/Math.tan(e.lat*o/2+Math.PI/4));return Math.abs(i)>Math.PI&&(i=i>0?-1*(2*Math.PI-i):2*Math.PI+i),(Math.atan2(i,r)*l+360)%360}}const ha=new la(6378137,6356752.314245179);let ca=new Uint8Array(4),da=new Uint8Array(4);class _a extends Ti{constructor(e={}){super(e.name),this.ellipsoid=e.ellipsoid||ha,this.lightEnabled=!0,this._planetRadius2=this.ellipsoid.getPolarSize()*this.ellipsoid.getPolarSize(),this._layers=[],this._updateLayer=!1,this.visibleTileLayers=[],this.visibleVectorLayers=[],this._visibleTileLayerSlices=[],this._frustumEntityCollections=[],this.baseLayer=null,this.terrain=null,this.camera=new ra(this,{frustums:e.frustums,eye:new oe(25e6,0,0),look:oe.ZERO,up:oe.NORTH,minAltitude:e.minAltitude,maxAltitude:e.maxAltitude}),this.maxEqualZoomAltitude=e.maxEqualZoomAltitude||15e6,this.minEqualZoomAltitude=e.minEqualZoomAltitude||1e4,this.minEqualZoomCameraSlope=e.minEqualZoomCameraSlope||.8,this.mousePositionOnEarth=new oe,this.emptyTexture=null,this.transparentTexture=null,this.defaultTexture=null,this.minCurrZoom=s,this.maxCurrZoom=a,this._viewExtent=new ie(new I(180,180),new I(-180,-180)),this._skipPreRender=!1,this._initialViewExtent=null,this._createdNodesCount=0,this._renderedNodes=[],this._renderedNodesInFrustum=[],this._visibleNodes={},this._visibleNodesNorth={},this._visibleNodesSouth={},this.layerLock=new on,this.terrainLock=new on,this._heightFactor=1,this._indexesCache=[],this._indexesCacheToRemove=[],this._indexesCacheToRemoveCounter=0,this._textureCoordsBufferCache=[],this.quadTreeStrategy=e.quadTreeStrategyPrototype?new e.quadTreeStrategyPrototype(this):new js(this),this._nightTexture=null,this._specularTexture=null;let t=Le(e.ambient,new oe(.2,.2,.3)),i=Le(e.diffuse,new oe(1,1,1)),r=Le(e.specular,new oe(63e-5,55e-5,32e-5)),n=e.shininess||18;this._ambient=new Float32Array([t.x,t.y,t.z]),this._diffuse=new Float32Array([i.x,i.y,i.z]),this._specular=new Float32Array([r.x,r.y,r.z,n]),this._maxGridSize=Math.log2(e.maxGridSize||128),this.SLICE_SIZE=4,this.SLICE_SIZE_4=4*this.SLICE_SIZE,this.SLICE_SIZE_3=3*this.SLICE_SIZE,this._lodSize=250,this._curLodSize=250,this._minLodSize=312,this._maxLodSize=190,this._pickingColorArr=new Float32Array(this.SLICE_SIZE_4),this._samplerArr=new Int32Array(this.SLICE_SIZE),this._pickingMaskArr=new Int32Array(this.SLICE_SIZE),this._geoImageCreator=new qs(this),this._vectorTileCreator=new oa(this),this._normalMapCreator=new $s(this),this._terrainWorker=new na(3),this._plainSegmentWorker=new Ks(3),this._tileLoader=new Xs(e.maxLoadingRequests||12),this._memKey=new ln,this.events=Tt(ua),this._distBeforeMemClear=0,this._prevCamEye=new oe,this._initialized=!1,this.always=[],this._renderCompleted=!1,this._renderCompletedActivated=!1,this._terrainCompleted=!1,this._terrainCompletedActivated=!1,this._collectRenderNodesIsActive=!0,this.nightTextureCoefficient=2,this._renderScreenNodesPASS=this._renderScreenNodesPASSNoAtmos,this._atmosphereEnabled=e.atmosphereEnabled||!1,this._atmosphereMaxMinOpacity=new Float32Array([1,.41]),this.solidTextureOne=null,this.solidTextureTwo=null,this._nightTextureSrc=e.nightTextureSrc||null,this._specularTextureSrc=e.specularTextureSrc||null}get maxGridSize(){return this._maxGridSize}getNorthFrameRotation(e){return this.ellipsoid.getNorthFrameRotation(e)}set atmosphereMaxOpacity(e){this._atmosphereMaxMinOpacity[0]=e}get atmosphereMaxOpacity(){return this._atmosphereMaxMinOpacity[0]}set atmosphereMinOpacity(e){this._atmosphereMaxMinOpacity[1]=e}get atmosphereMinOpacity(){return this._atmosphereMaxMinOpacity[1]}set atmosphereEnabled(e){e!=this._atmosphereEnabled&&(this._atmosphereEnabled=e,this._initializeAtmosphere())}get atmosphereEnabled(){return this._atmosphereEnabled}set diffuse(e){let t=Le(e);this._diffuse=new Float32Array(t.toArray())}set ambient(e){let t=Le(e);this._ambient=new Float32Array(t.toArray())}set specular(e){let t=Le(e);this._specular=new Float32Array([t.x,t.y,t.y,this._specular[3]])}set shininess(e){this._specular[3]=e}get normalMapCreator(){return this._normalMapCreator}get layers(){return[...this._layers]}getLayers(){return this.layers}get sunPos(){return this.renderer.controls.sun.sunlight.getPosition()}addControl(e){e.planet=this,e.addTo(this.renderer)}get lodSize(){return this._lodSize}setLodSize(e,t,i){this._maxLodSize=i||this._maxLodSize,this._minLodSize=t||this._minLodSize,this._curLodSize=e,this._renderCompletedActivated=!1,this._terrainCompletedActivated=!1}addControls(e){for(let t=0;t<e.length;t++)this.addControl(e[t])}getLayerByName(e){for(let t=0,i=this._layers.length;t<i;t++)if(e===this._layers[t].name)return this._layers[t]}addLayer(e){e.addTo(this)}_onLayerVisibilityChanged(e){this.events.dispatch(this.events.layervisibilitychange,e)}addLayers(e){for(let t=0,i=e.length;t<i;t++)this.addLayer(e[t])}removeLayer(e){e.remove()}_clearLayerMaterial(e){this.quadTreeStrategy.clearLayerMaterial(e)}setBaseLayer(e){this.baseLayer?this.baseLayer.isEqual(e)||(this.baseLayer.setVisibility(!1),this.baseLayer=e,e.setVisibility(!0),this.events.dispatch(this.events.baselayerchange,e)):(this.baseLayer=e,this.baseLayer.setVisibility(!0),this.events.dispatch(this.events.baselayerchange,e))}setHeightFactor(e){this._renderCompletedActivated=!1,this._terrainCompletedActivated=!1,this._heightFactor!==e&&(this._heightFactor=e,this.quadTreeStrategy.destroyBranches(),this._clearRenderedNodeList(),this._clearRenderNodesInFrustum())}getHeightFactor(){return this._heightFactor}setTerrain(e){this._renderCompletedActivated=!1,this._terrainCompletedActivated=!1,this._initialized&&this.memClear(),this.terrain&&(this.terrain.abortLoading(),this.terrain.clearCache(),this.terrain._planet=null),this.terrain=e,this.terrain._planet=this,this.quadTreeStrategy.destroyBranches(),e._geoid.model?(this._plainSegmentWorker.setGeoid(e.getGeoid()),e._isReady=!0):Ys.loadModel(e.geoid.src).then((t=>{e.geoid.setModel(t),this._plainSegmentWorker.setGeoid(e.getGeoid()),e._isReady=!0})).catch((e=>{console.warn(e)}))}_initializeAtmosphere(){let e=this.renderer.handler;e.removeProgram("drawnode_screen_wl"),this._atmosphereEnabled?(this._renderScreenNodesPASS=this._renderScreenNodesPASSAtmos,e.isWebGl2()?e.addProgram(new Si("drawnode_screen_wl",{uniforms:{projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",height:"float",uGlobalTextureCoord:"vec4",uNormalMapBias:"vec3",samplerCount:"int",tileOffsetArr:"vec4",layerOpacityArr:"float",samplerArr:"sampler2darray",defaultTexture:"sampler2d",uNormalMap:"sampler2d",nightTexture:"sampler2d",specularTexture:"sampler2d",lightsPositions:"vec3",diffuse:"vec3",ambient:"vec3",specular:"vec4",transmittanceTexture:"sampler2D",scatteringTexture:"sampler2D",camHeight:"float",nightTextureCoefficient:"float",maxMinOpacity:"vec2"},attributes:{aVertexPositionHigh:"vec3",aVertexPositionLow:"vec3",aTextureCoord:"vec2"},vertexShader:"#version 300 es\n\n precision highp float;\n\n in vec3 aVertexPositionHigh;\n in vec3 aVertexPositionLow;\n in vec2 aTextureCoord;\n\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n uniform vec4 uGlobalTextureCoord;\n uniform vec3 uNormalMapBias;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float height;\n\n out vec4 vTextureCoord;\n out vec3 v_vertex;\n out vec3 cameraPosition;\n out vec2 vGlobalTextureCoord;\n out float v_height;\n\n void main(void) {\n\n // I replace it here (from the bottom) because it \n // somehow affects on float precision on MacPC Chrome\n vTextureCoord.xy = aTextureCoord;\n vGlobalTextureCoord = uGlobalTextureCoord.xy + (uGlobalTextureCoord.zw - uGlobalTextureCoord.xy) * aTextureCoord;\n vTextureCoord.zw = uNormalMapBias.z * ( aTextureCoord + uNormalMapBias.xy );\n\n vec3 aVertexPosition = aVertexPositionHigh + aVertexPositionLow; \n vec3 nh = height * normalize(aVertexPosition);\n cameraPosition = eyePositionHigh + eyePositionLow;\n \n vec3 highDiff = aVertexPositionHigh - eyePositionHigh;\n vec3 lowDiff = aVertexPositionLow - eyePositionLow + nh;\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n v_height = height;\n v_vertex = aVertexPosition + nh;\n \n gl_Position = projectionMatrix * viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n }",fragmentShader:`#version 300 es\n\n precision highp float;\n \n #define MAX_POINT_LIGHTS 1\n #define SLICE_SIZE 5\n\n uniform vec4 specular;\n uniform vec3 diffuse;\n uniform vec3 ambient;\n\n uniform vec3 lightsPositions[MAX_POINT_LIGHTS];\n\n uniform sampler2D uNormalMap;\n uniform sampler2D nightTexture;\n uniform sampler2D specularTexture;\n uniform sampler2D transmittanceTexture;\n uniform sampler2D scatteringTexture;\n uniform sampler2D defaultTexture;\n uniform sampler2D samplerArr[SLICE_SIZE];\n\n uniform vec4 tileOffsetArr[SLICE_SIZE];\n uniform float layerOpacityArr[SLICE_SIZE];\n\n uniform int samplerCount;\n uniform float nightTextureCoefficient;\n \n uniform vec2 maxMinOpacity; \n uniform float camHeight;\n\n in vec4 vTextureCoord;\n in vec3 v_vertex;\n in vec3 cameraPosition;\n in vec2 vGlobalTextureCoord;\n in float v_height;\n\n vec3 sunPos;\n\n layout(location = 0) out vec4 diffuseColor;\n\n ${ls}\n\n ${hs}\n \n ${os} \n \n vec3 transmittanceFromTexture(float height, float angle) \n {\n float u = (angle + 1.0) * 0.5;\n float v = height / ATMOS_HEIGHT;\n return texture(transmittanceTexture, vec2(u, v)).xyz;\n }\n\n vec3 multipleScatteringContributionFromTexture(float height, float angle) \n {\n float u = (angle + 1.0) * 0.5;\n float v = height / ATMOS_HEIGHT;\n return texture(scatteringTexture, vec2(u, v)).xyz;\n }\n \n void getSunIlluminance(in vec3 point, in vec3 lightDir, out vec3 sunIlluminance)\n {\n // float r = length(point);\n // float mu_s = dot(point, sun_direction) / r;\n // float height = r - BOTTOM_RADIUS;\n \n float mu_s = dot(normalize(point), lightDir);\n float height = length(point) - BOTTOM_RADIUS;\n sunIlluminance = SUN_INTENSITY * transmittanceFromTexture(height, mu_s);\n }\n \n void atmosGroundColor(out vec4 fragColor, in vec3 normal)\n { \n vec3 rayDirection = normalize(v_vertex - cameraPosition);\n vec3 lightDir = normalize(sunPos);\n \n rayDirection = normalize(rayDirection * SPHERE_TO_ELLIPSOID_SCALE);\n vec3 camPos = cameraPosition * SPHERE_TO_ELLIPSOID_SCALE;\n lightDir = normalize(lightDir * SPHERE_TO_ELLIPSOID_SCALE);\n \n vec3 light = vec3(0.0);\n vec3 transmittanceFromCameraToSpace = vec3(1.0);\n float offset = 0.0;\n float distanceToSpace = 0.0;\n \n intersectSphere(camPos, rayDirection, TOP_RADIUS, offset, distanceToSpace);\n \n vec3 rayOrigin = camPos;\n \n // above atmosphere\n if (offset > 0.0) \n {\n // intersection of camera ray with atmosphere\n rayOrigin += rayDirection * offset;\n }\n \n float height = length(rayOrigin) - BOTTOM_RADIUS;\n float rayAngle = dot(rayOrigin, rayDirection) / length(rayOrigin);\n bool cameraBelow = rayAngle < 0.0;\n \n transmittanceFromCameraToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);\n \n float phaseAngle = dot(lightDir, rayDirection);\n float rayleighPhase = rayleighPhase(phaseAngle);\n float miePhase = miePhase(phaseAngle);\n \n float distanceToGround = 0.0;\n \n bool hitGround = intersectSphere(camPos, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0; \n \n // Fix black dots on the edge of atmosphere \n if(camHeight < 700000.0 || !hitGround)\n { \n distanceToGround = distance(camPos, v_vertex * SPHERE_TO_ELLIPSOID_SCALE);\n }\n \n float segmentLength = (distanceToGround - max(offset, 0.0)) / float(SAMPLE_COUNT);\n \n float t = segmentLength * 0.5;\n \n vec3 transmittanceCamera; \n vec3 transmittanceLight; \n \n for (int i = 0; i < SAMPLE_COUNT; i++) \n {\n vec3 position = rayOrigin + t * rayDirection;\n float height = length(position) - BOTTOM_RADIUS;\n vec3 up = position / length(position);\n float rayAngle = dot(up, rayDirection);\n float lightAngle = dot(up, lightDir); \n vec3 transmittanceToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);\n transmittanceCamera = cameraBelow ? (transmittanceToSpace / transmittanceFromCameraToSpace) : (transmittanceFromCameraToSpace / transmittanceToSpace);\n transmittanceLight = transmittanceFromTexture(height, lightAngle);\n vec2 opticalDensity = exp(-height / rayleighMieHeights);\n vec3 scatteredLight = transmittanceLight * (rayleighScatteringCoefficient * opticalDensity.x * rayleighPhase + mieScatteringCoefficient * opticalDensity.y * miePhase);\n scatteredLight += multipleScatteringContributionFromTexture(height, lightAngle) * (rayleighScatteringCoefficient * opticalDensity.x + mieScatteringCoefficient * opticalDensity.y); \n light += transmittanceCamera * scatteredLight * segmentLength;\n t += segmentLength;\n }\n \n light *= SUN_INTENSITY;\n \n vec3 hitPoint = camPos + rayDirection * distanceToGround;\n vec3 up = normalize(hitPoint);\n float diffuseAngle = max(dot(up, lightDir), 0.0); \n \n float lightAngle = dot(normal, lightDir);\n vec3 tA = transmittanceCamera * GROUND_ALBEDO * SUN_INTENSITY; \n vec3 scatteringLight = multipleScatteringContributionFromTexture(height, lightAngle);\n vec3 diffuseTransmittanceLight = transmittanceLight * diffuseAngle; \n light += tA * (scatteringLight + diffuseTransmittanceLight);\n \n fragColor = vec4(pow(light * 8.0, vec3(1.0 / 2.2)), 1.0);\n }\n\n void getAtmosFadingOpacity(out float opacity)\n { \n float c = length(cameraPosition);\n float maxDist = sqrt(c * c - BOTTOM_RADIUS * BOTTOM_RADIUS);\n float minDist = c - BOTTOM_RADIUS;\n float vertDist = distance(cameraPosition, v_vertex); \n opacity = clamp(maxMinOpacity.y + ( maxMinOpacity.x - maxMinOpacity.y) * getLerpValue(minDist, maxDist, vertDist), 0.0, 1.0);\n }\n\n void main(void) {\n \n sunPos = lightsPositions[0];\n \n vec3 texNormal = texture(uNormalMap, vTextureCoord.zw).rgb;\n vec3 normal = normalize((texNormal - 0.5) * 2.0);\n \n float minH = 1200000.0;\n float maxH = minH * 3.0;\n float nightCoef = getLerpValue(minH, maxH, camHeight) * nightTextureCoefficient;\n \n if(camHeight > 6000000.0)\n {\n normal = normalize(v_vertex);\n }\n \n vec3 lightDir = normalize(sunPos);\n vec3 viewDir = normalize(cameraPosition - v_vertex);\n \n vec4 atmosColor;\n atmosGroundColor(atmosColor, normal);\n \n vec3 sunIlluminance; \n getSunIlluminance(v_vertex * SPHERE_TO_ELLIPSOID_SCALE, lightDir * SPHERE_TO_ELLIPSOID_SCALE, sunIlluminance);\n \n float overGround = 1.0 - step(0.1, v_height);\n\n float shininess = texture( specularTexture, vGlobalTextureCoord.st ).r * 255.0 * overGround;\n vec3 reflectionDirection = reflect(-lightDir, normal);\n float reflection = max( dot(reflectionDirection, viewDir), 0.0);\n vec3 spec = sunIlluminance * specular.rgb * pow( reflection, specular.w) * shininess; \n float diffuseLightWeighting = max(dot(normal, lightDir), 0.0);\n \n vec4 nightImageColor = texture( nightTexture, vGlobalTextureCoord.st );\n vec3 night = nightStep * (.18 - diffuseLightWeighting * 3.0) * nightImageColor.rgb * nightCoef;\n night *= overGround * step(0.0, night); \n vec4 lightWeighting = vec4(ambient + sunIlluminance * diffuse * diffuseLightWeighting + night, 1.0);\n \n float fadingOpacity;\n getAtmosFadingOpacity(fadingOpacity);\n \n getSunIlluminance(cameraPosition, viewDir * SPHERE_TO_ELLIPSOID_SCALE, sunIlluminance);\n \n spec *= sunIlluminance;\n\n diffuseColor = texture( defaultTexture, vTextureCoord.xy );\n if( samplerCount == 0 ) {\n diffuseColor = mix(diffuseColor * lightWeighting, atmosColor, fadingOpacity) + vec4(spec, 0.0);\n return;\n }\n\n vec4 src;\n\n blend(diffuseColor, samplerArr[0], tileOffsetArr[0], layerOpacityArr[0]);\n if( samplerCount == 1 ) { \n diffuseColor = mix(diffuseColor * lightWeighting, atmosColor * diffuseColor.a, fadingOpacity) + vec4(spec, 0.0);\n return;\n }\n\n blend(diffuseColor, samplerArr[1], tileOffsetArr[1], layerOpacityArr[1]);\n if( samplerCount == 2 ) {\n diffuseColor = mix(diffuseColor * lightWeighting, atmosColor * diffuseColor.a, fadingOpacity) + vec4(spec, 0.0);\n return;\n }\n\n blend(diffuseColor, samplerArr[2], tileOffsetArr[2], layerOpacityArr[2]);\n if( samplerCount == 3 ) {\n diffuseColor = mix(diffuseColor * lightWeighting, atmosColor * diffuseColor.a, fadingOpacity) + vec4(spec, 0.0);\n return;\n }\n\n blend(diffuseColor, samplerArr[3], tileOffsetArr[3], layerOpacityArr[3]);\n if( samplerCount == 4 ) {\n diffuseColor = mix(diffuseColor * lightWeighting, atmosColor * diffuseColor.a, fadingOpacity) + vec4(spec, 0.0);\n return;\n }\n\n blend(diffuseColor, samplerArr[4], tileOffsetArr[4], layerOpacityArr[4]);\n diffuseColor = mix(diffuseColor * lightWeighting, atmosColor * diffuseColor.a, fadingOpacity) + vec4(spec, 0.0);\n }`}),!0):e.addProgram(ds(),!0),this.renderer.controls.Atmosphere?this.renderer.controls.Atmosphere.activate():this.addControl(new gs),this.renderer.controls.SimpleSkyBackground&&this.renderer.controls.SimpleSkyBackground.deactivate()):(this._renderScreenNodesPASS=this._renderScreenNodesPASSNoAtmos,this.renderer.controls.Atmosphere&&this.renderer.controls.Atmosphere.deactivate(),this.renderer.controls.SimpleSkyBackground?this.renderer.controls.SimpleSkyBackground.activate():this.addControl(new Ln),e.isWebGl2()?e.addProgram(new Si("drawnode_screen_wl",{uniforms:{projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",height:"float",uGlobalTextureCoord:"vec4",uNormalMapBias:"vec3",samplerCount:"int",tileOffsetArr:"vec4",layerOpacityArr:"float",samplerArr:"sampler2darray",defaultTexture:"sampler2d",uNormalMap:"sampler2d",nightTexture:"sampler2d",specularTexture:"sampler2d",lightsPositions:"vec3",diffuse:"vec3",ambient:"vec3",specular:"vec4",camHeight:"float",nightTextureCoefficient:"float"},attributes:{aVertexPositionHigh:"vec3",aVertexPositionLow:"vec3",aTextureCoord:"vec2"},vertexShader:"#version 300 es\n\n precision highp float;\n\n in vec3 aVertexPositionHigh;\n in vec3 aVertexPositionLow;\n in vec2 aTextureCoord;\n\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n uniform vec4 uGlobalTextureCoord;\n uniform vec3 uNormalMapBias;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float height;\n\n out vec4 vTextureCoord;\n out vec3 v_vertex;\n out vec3 cameraPosition;\n out vec2 vGlobalTextureCoord;\n out float v_height;\n\n void main(void) {\n\n // I replace it here (from the bottom) because it \n // somehow affects on float precision on MacPC Chrome\n vTextureCoord.xy = aTextureCoord;\n vGlobalTextureCoord = uGlobalTextureCoord.xy + (uGlobalTextureCoord.zw - uGlobalTextureCoord.xy) * aTextureCoord;\n vTextureCoord.zw = uNormalMapBias.z * ( aTextureCoord + uNormalMapBias.xy );\n\n vec3 aVertexPosition = aVertexPositionHigh + aVertexPositionLow; \n vec3 nh = height * normalize(aVertexPosition);\n cameraPosition = eyePositionHigh + eyePositionLow;\n \n vec3 highDiff = aVertexPositionHigh - eyePositionHigh;\n vec3 lowDiff = aVertexPositionLow - eyePositionLow + nh;\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n v_height = height;\n v_vertex = aVertexPosition + nh;\n \n gl_Position = projectionMatrix * viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);\n }",fragmentShader:`#version 300 es\n\n precision highp float;\n \n #define MAX_POINT_LIGHTS 1\n #define SLICE_SIZE 5\n\n uniform vec4 specular;\n uniform vec3 diffuse;\n uniform vec3 ambient; \n\n uniform sampler2D uNormalMap;\n uniform sampler2D nightTexture;\n uniform sampler2D specularTexture;\n uniform sampler2D defaultTexture;\n uniform sampler2D samplerArr[SLICE_SIZE];\n\n uniform vec4 tileOffsetArr[SLICE_SIZE];\n uniform vec3 lightsPositions[MAX_POINT_LIGHTS];\n uniform float layerOpacityArr[SLICE_SIZE];\n\n uniform int samplerCount;\n uniform float nightTextureCoefficient;\n \n uniform float camHeight;\n\n in vec4 vTextureCoord;\n in vec3 v_vertex;\n in vec3 cameraPosition;\n in vec2 vGlobalTextureCoord;\n in float v_height;\n\n vec3 sunPos;\n\n layout(location = 0) out vec4 diffuseColor;\n\n ${ls}\n\n ${hs}\n \n ${as}\n \n void main(void) {\n \n sunPos = lightsPositions[0];\n \n vec3 texNormal = texture(uNormalMap, vTextureCoord.zw).rgb;\n vec3 normal = normalize((texNormal - 0.5) * 2.0);\n \n float minH = 1200000.0;\n float maxH = minH * 3.0;\n float nightCoef = getLerpValue(minH, maxH, camHeight) * nightTextureCoefficient;\n \n if(camHeight > 6000000.0)\n {\n normal = normalize(v_vertex);\n }\n \n vec3 lightDir = normalize(sunPos);\n vec3 viewDir = normalize(cameraPosition - v_vertex);\n \n float overGround = 1.0 - step(0.1, v_height);\n\n float shininess = texture( specularTexture, vGlobalTextureCoord.st ).r * 255.0 * overGround;\n vec3 reflectionDirection = reflect(-lightDir, normal);\n float reflection = max( dot(reflectionDirection, viewDir), 0.0);\n vec3 spec = specular.rgb * pow( reflection, specular.w) * shininess; \n float diffuseLightWeighting = max(dot(normal, lightDir), 0.0); \n vec4 nightImageColor = texture( nightTexture, vGlobalTextureCoord.st );\n vec3 night = nightStep * (.18 - diffuseLightWeighting * 3.0) * nightImageColor.rgb * nightCoef;\n night *= overGround * step(0.0, night); \n vec4 lightWeighting = vec4(ambient + diffuse * diffuseLightWeighting + night, 1.0);\n \n diffuseColor = texture( defaultTexture, vTextureCoord.xy );\n if( samplerCount == 0 ) {\n diffuseColor = diffuseColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n vec4 src;\n\n blend(diffuseColor, samplerArr[0], tileOffsetArr[0], layerOpacityArr[0]);\n if( samplerCount == 1 ) { \n diffuseColor = diffuseColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n blend(diffuseColor, samplerArr[1], tileOffsetArr[1], layerOpacityArr[1]);\n if( samplerCount == 2 ) {\n diffuseColor = diffuseColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n blend(diffuseColor, samplerArr[2], tileOffsetArr[2], layerOpacityArr[2]);\n if( samplerCount == 3 ) {\n diffuseColor = diffuseColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n blend(diffuseColor, samplerArr[3], tileOffsetArr[3], layerOpacityArr[3]);\n if( samplerCount == 4 ) {\n diffuseColor = diffuseColor * lightWeighting + vec4(spec, 0.0);\n return;\n }\n\n blend(diffuseColor, samplerArr[4], tileOffsetArr[4], layerOpacityArr[4]);\n diffuseColor = diffuseColor * lightWeighting + vec4(spec, 0.0);\n }`}),!0):e.addProgram(ds(),!0))}_initializeShaders(){let e=this.renderer.handler;e.addProgram(new Si("drawnode_screen_nl",{uniforms:{projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",samplerCount:"int",tileOffsetArr:"vec4",layerOpacityArr:"float",samplerArr:"sampler2darray",defaultTexture:"sampler2d",height:"float"},attributes:{aVertexPositionHigh:"vec3",aVertexPositionLow:"vec3",aTextureCoord:"vec2"},vertexShader:"precision highp float;\n \n attribute vec3 aVertexPositionHigh;\n attribute vec3 aVertexPositionLow;\n attribute vec2 aTextureCoord;\n\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float height;\n\n varying vec2 vTextureCoord;\n\n void main(void) {\n\n vTextureCoord = aTextureCoord;\n vec3 nh = height * normalize(aVertexPositionHigh + aVertexPositionLow);\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n mat4 m = projectionMatrix * viewMatrixRTE;\n \n vec3 highDiff = aVertexPositionHigh - eyePositionHigh;\n vec3 lowDiff = aVertexPositionLow - eyePositionLow + nh;\n \n // This is works for Mac Chrome, prevent some weird optimization I suppose\n gl_Position = m * vec4(highDiff + lowDiff, 1.0);\n }",fragmentShader:`precision highp float;\n #define SLICE_SIZE 5\n uniform vec4 tileOffsetArr[SLICE_SIZE];\n uniform float layerOpacityArr[SLICE_SIZE];\n uniform sampler2D defaultTexture;\n uniform sampler2D samplerArr[SLICE_SIZE];\n uniform int samplerCount;\n varying vec2 vTextureCoord;\n\n ${cs}\n\n void main(void) {\n gl_FragColor = texture2D( defaultTexture, vTextureCoord );\n if( samplerCount == 0 ) return;\n\n vec4 src;\n\n blend(gl_FragColor, samplerArr[0], tileOffsetArr[0], layerOpacityArr[0]);\n if( samplerCount == 1 ) return;\n\n blend(gl_FragColor, samplerArr[1], tileOffsetArr[1], layerOpacityArr[1]);\n if( samplerCount == 2 ) return;\n\n blend(gl_FragColor, samplerArr[2], tileOffsetArr[2], layerOpacityArr[2]);\n if( samplerCount == 3 ) return;\n\n blend(gl_FragColor, samplerArr[3], tileOffsetArr[3], layerOpacityArr[3]);\n if( samplerCount == 4 ) return;\n\n blend(gl_FragColor, samplerArr[4], tileOffsetArr[4], layerOpacityArr[4]);\n }`}),!0),e.addProgram(new Si("drawnode_colorPicking",{uniforms:{projectionMatrix:"mat4",viewMatrix:"mat4",eyePositionHigh:"vec3",eyePositionLow:"vec3",samplerCount:"int",tileOffsetArr:"vec4",samplerArr:"sampler2darray",pickingMaskArr:"sampler2darray",pickingColorArr:"vec4",height:"float"},attributes:{aVertexPositionHigh:"vec3",aVertexPositionLow:"vec3",aTextureCoord:"vec2"},vertexShader:"precision highp float;\n \n attribute vec3 aVertexPositionHigh;\n attribute vec3 aVertexPositionLow;\n attribute vec2 aTextureCoord;\n\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float height;\n\n varying vec2 vTextureCoord;\n\n void main(void) {\n\n vTextureCoord = aTextureCoord;\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n mat4 m = projectionMatrix * viewMatrixRTE;\n\n vec3 nh = height * normalize(aVertexPositionHigh + aVertexPositionLow);\n\n vec3 highDiff = aVertexPositionHigh - eyePositionHigh;\n vec3 lowDiff = aVertexPositionLow - eyePositionLow + nh;\n\n gl_Position = m * vec4(highDiff + lowDiff, 1.0);\n }",fragmentShader:"precision highp float;\n #define SLICE_SIZE 5\n uniform vec4 tileOffsetArr[SLICE_SIZE];\n uniform vec4 pickingColorArr[SLICE_SIZE];\n uniform sampler2D samplerArr[SLICE_SIZE];\n uniform sampler2D pickingMaskArr[SLICE_SIZE];\n uniform int samplerCount;\n varying vec2 vTextureCoord;\n\n #define blendPicking(DEST, OFFSET, SAMPLER, MASK, COLOR, OPACITY) tc = OFFSET.xy + vTextureCoord.xy * OFFSET.zw; t = texture2D(SAMPLER, tc); p = texture2D(MASK, tc); DEST = mix(DEST, vec4(max(COLOR.rgb, p.rgb), OPACITY), (t.a == 0.0 ? 0.0 : 1.0) * COLOR.a);\n\n void main(void) {\n gl_FragColor = vec4(0.0);\n if( samplerCount == 0 ) return;\n\n vec2 tc;\n vec4 t;\n vec4 p;\n\n blendPicking(gl_FragColor, tileOffsetArr[0], samplerArr[0], pickingMaskArr[0], pickingColorArr[0], 1.0);\n if( samplerCount == 1 ) return;\n\n blendPicking(gl_FragColor, tileOffsetArr[1], samplerArr[1], pickingMaskArr[1], pickingColorArr[1], 1.0);\n if( samplerCount == 2 ) return;\n\n blendPicking(gl_FragColor, tileOffsetArr[2], samplerArr[2], pickingMaskArr[2], pickingColorArr[2], 1.0);\n if( samplerCount == 3 ) return;\n\n blendPicking(gl_FragColor, tileOffsetArr[3], samplerArr[3], pickingMaskArr[3], pickingColorArr[3], 1.0);\n if( samplerCount == 4 ) return;\n\n blendPicking(gl_FragColor, tileOffsetArr[4], samplerArr[4], pickingMaskArr[4], pickingColorArr[4], 1.0);\n }"}),!0),e.addProgram(new Si("drawnode_depth",{uniforms:{projectionMatrix:"mat4",viewMatrix:"mat4",height:"float",eyePositionHigh:"vec3",eyePositionLow:"vec3",frustumPickingColor:"vec3"},attributes:{aVertexPositionHigh:"vec3",aVertexPositionLow:"vec3"},vertexShader:"precision highp float;\n\n attribute vec3 aVertexPositionHigh;\n attribute vec3 aVertexPositionLow;\n\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float height;\n\n void main(void) {\n\n // @hack\n // This code is works for Mac Chrome and Safari\n // any other code probably will produce jittering\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n mat4 m = projectionMatrix * viewMatrixRTE;\n\n vec3 nh = height * normalize(aVertexPositionHigh + aVertexPositionLow);\n\n vec3 eyePosition = eyePositionHigh + eyePositionLow;\n vec3 vertexPosition = aVertexPositionHigh + aVertexPositionLow;\n\n vec3 highDiff = aVertexPositionHigh - eyePositionHigh;\n vec3 lowDiff = aVertexPositionLow - eyePositionLow + nh;\n \n gl_Position = m * vec4(highDiff + lowDiff, 1.0); \n }",fragmentShader:"precision highp float;\n uniform vec3 frustumPickingColor;\n\n void main(void) {\n gl_FragColor = vec4(frustumPickingColor, 1.0);\n } "}),!0),e.addProgram(new Si("drawnode_heightPicking",{uniforms:{projectionMatrix:"mat4",viewMatrix:"mat4",height:"float",eyePositionHigh:"vec3",eyePositionLow:"vec3"},attributes:{aVertexPositionHigh:"vec3",aVertexPositionLow:"vec3"},vertexShader:"precision highp float;\n\n attribute vec3 aVertexPositionHigh;\n attribute vec3 aVertexPositionLow;\n\n uniform mat4 projectionMatrix;\n uniform mat4 viewMatrix;\n uniform vec3 eyePositionHigh;\n uniform vec3 eyePositionLow;\n uniform float height;\n\n varying vec3 eyePosition;\n varying vec3 vertexPosition;\n\n void main(void) {\n\n // This code is works for Mac Chrome and Safari\n // any other code probably will produce jittering\n\n mat4 viewMatrixRTE = viewMatrix;\n viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);\n\n mat4 m = projectionMatrix * viewMatrixRTE;\n\n vec3 nh = height * normalize(aVertexPositionHigh + aVertexPositionLow);\n\n eyePosition = eyePositionHigh + eyePositionLow;\n vertexPosition = aVertexPositionHigh + aVertexPositionLow;\n\n vec3 highDiff = aVertexPositionHigh - eyePositionHigh;\n vec3 lowDiff = aVertexPositionLow - eyePositionLow + nh;\n \n gl_Position = m * vec4(highDiff + lowDiff, 1.0); \n }",fragmentShader:"precision highp float;\n\n varying vec3 eyePosition;\n varying vec3 vertexPosition;\n\n vec3 encode24(highp float f) {\n float F = abs(f);\n float s = step( 0.0, -f );\n float e = floor( log2(F) );\n float m = exp2(- e) * F;\n e = floor( log2(F) + 127.0 ) + floor( log2(m) );\n return vec3(\n ( 128.0 * s + floor( e * exp2(-1.0) ) ) / 255.0,\n ( 128.0 * mod( e, 2.0 ) + mod( floor( m * 128.0 ), 128.0 ) ) / 255.0,\n floor( mod( floor( m * exp2( 23.0 - 8.0) ), exp2(8.0) ) ) / 255.0);\n }\n\n void main(void) {\n float range = distance(eyePosition, vertexPosition);\n gl_FragColor = vec4(encode24(range), 1.0);\n }"}),!0),this.renderer.addPickingCallback(this,this._renderColorPickingFramebufferPASS),this.renderer.addDepthCallback(this,this._renderDepthFramebufferPASS),this.renderer.addDistanceCallback(this,this._renderDistanceFramebufferPASS)}_onLayerLoadend(e){this.events.dispatch(this.events.layerloadend,e)}init(){this._tileLoader.events.on("layerloadend",this._onLayerLoadend,this),ss().setMaxGridSize(this._maxGridSize);const e=this._maxGridSize;let t=0;for(let i=0;i<=e;i++){!this._indexesCache[i]&&(this._indexesCache[i]=new Array(e));for(let r=0;r<=e;r++){!this._indexesCache[i][r]&&(this._indexesCache[i][r]=new Array(e));for(let n=0;n<=e;n++){!this._indexesCache[i][r][n]&&(this._indexesCache[i][r][n]=new Array(e));for(let s=0;s<=e;s++){!this._indexesCache[i][r][n][s]&&(this._indexesCache[i][r][n][s]=new Array(e));for(let a=0;a<=e;a++){let e={buffer:null};if(i>=1&&i===r&&i===n&&i===s&&i===a){let t=ss().createSegmentIndexes(i,[r,n,s,a]);e.buffer=this.renderer.handler.createElementArrayBuffer(t,1)}else this._indexesCacheToRemove[t++]=e;this._indexesCache[i][r][n][s][a]=e}}}}}this.renderer.events.on("resize",(()=>{this._renderCompletedActivated=!1,this._terrainCompletedActivated=!1})),this._textureCoordsBufferCache=[];let i=ss().initTextureCoordsTable(e+1);for(let t=0;t<=e;t++)this._textureCoordsBufferCache[t]=this.renderer.handler.createArrayBuffer(i[t],2,(1+(1<<t))*(1+(1<<t)));this.renderer.handler.createDefaultTexture(null,(e=>{this.solidTextureOne=e,this.solidTextureTwo=e})),this.transparentTexture=this.renderer.handler.transparentTexture,this._renderedNodesInFrustum=new Array(this.camera.frustums.length);for(let e=0,t=this._renderedNodesInFrustum.length;e<t;e++)this._renderedNodesInFrustum[e]=[];if(this.quadTreeStrategy.init(),this.drawMode=this.renderer.handler.gl.TRIANGLE_STRIP,this._initializeShaders(),this._initializeAtmosphere(),this._updateVisibleLayers(),this.renderer.addPickingCallback(this,this._frustumEntityCollectionPickingCallback),this._nightTextureSrc){let e=new Image;e.onload=()=>{this._nightTexture=this.renderer.handler.createTextureDefault(e),this._nightTexture.default=!0},e.src=this._nightTextureSrc}if(this._specularTextureSrc){let e=new Image;e.onload=()=>{this._specularTexture=this.renderer.handler.createTextureDefault(e),this._specularTexture.default=!0},e.src=this._specularTextureSrc}this._geoImageCreator.init(),this._vectorTileCreator.init(),this._normalMapCreator.init(),this.renderer.events.on("draw",this._globalPreDraw,this,-100),this._preRender(),this.renderer.events.on("postdraw",(()=>{this._checkRendercompleted()})),this.initLayers(),this._initialized=!0,this._initialViewExtent&&this.viewExtent(this._initialViewExtent),this.renderer.activeCamera=this.camera,this.camera.bindRenderer(this.renderer),this.camera.update()}initLayers(){let e=[...this._layers];for(let t=0;t<e.length;t++)this.removeLayer(e[t]),this.addLayer(e[t])}_clearIndexesCache(){this._indexesCacheToRemoveCounter=0;let e=this._indexesCacheToRemove,t=this.renderer.handler.gl;for(let i=0,r=e.length;i<r;i++){let r=e[i];t.deleteBuffer(r.buffer),r.buffer=null}}_preRender(){this.quadTreeStrategy.preRender(),this._preLoad()}_preLoad(){this._clearRenderedNodeList(),this._skipPreRender=!1,this.quadTreeStrategy.preLoad()}createDefaultTextures(e,t){this.renderer.handler.gl.deleteTexture(this.solidTextureOne),this.renderer.handler.gl.deleteTexture(this.solidTextureTwo),this.renderer.handler.createDefaultTexture(e,(e=>{this.solidTextureOne=e})),this.renderer.handler.createDefaultTexture(t,(e=>{this.solidTextureTwo=e}))}_getLayerAttributionHTML(e){return`<div class="og-attribution__layer">${e.getAttribution()}</div>`}updateAttributionsList(){let e="";for(let t=0,i=this._layers.length;t<i;t++){let i=this._layers[t];i.getVisibility()&&i.getAttribution().length&&(e+=this._getLayerAttributionHTML(i))}this._applyAttribution(e)}updateVisibleLayers(){this._updateLayer=!0}_updateVisibleLayers(){this.visibleTileLayers=[],this.visibleTileLayers.length=0,this.visibleVectorLayers=[],this.visibleVectorLayers.length=0;let e="";for(let t=0,i=this._layers.length;t<i;t++){let i=this._layers[t];i.getVisibility()?(i.isBaseLayer()&&(this.createDefaultTextures(i._defaultTextures[0],i._defaultTextures[1]),this.baseLayer=i),i.hasImageryTiles()&&this.visibleTileLayers.push(i),i.isVector&&this.visibleVectorLayers.push(i),i.getAttribution().length&&(e+=this._getLayerAttributionHTML(i))):i._fading&&i._fadingOpacity>0&&(i.hasImageryTiles()&&this.visibleTileLayers.push(i),i.isVector&&this.visibleVectorLayers.push(i))}this._applyAttribution(e),this._sortLayers()}_applyAttribution(e){this.renderer&&this.renderer.div&&(e.length?this.renderer.div.attributions.innerHTML!==e&&(this.renderer.div.attributions.innerHTML=e):this.renderer.div.attributions.innerHTML="")}_sortLayers(){if(this.visibleVectorLayers.sort(((e,t)=>e.getZIndex()-t.getZIndex()||e.getHeight()-t.getHeight())),this._visibleTileLayerSlices=[],this._visibleTileLayerSlices.length=0,this.visibleTileLayers.length){this.visibleTileLayers.sort(((e,t)=>e.getHeight()-t.getHeight()||e.getZIndex()-t.getZIndex()));let e=-1,t=this.visibleTileLayers[0].getHeight();for(let i=0,r=this.visibleTileLayers.length;i<r;i++)i%this.SLICE_SIZE!=0&&this.visibleTileLayers[i].getHeight()===t||(e++,this._visibleTileLayerSlices[e]=[],t=this.visibleTileLayers[i].getHeight()),this._visibleTileLayerSlices[e].push(this.visibleTileLayers[i])}}_clearRenderedNodeList(){this._renderedNodes.length=0,this._renderedNodes=[]}_clearRenderNodesInFrustum(){for(let e=0,t=this._renderedNodesInFrustum.length;e<t;e++)this._renderedNodesInFrustum[e].length=0,this._renderedNodesInFrustum[e]=[]}_collectRenderNodes(){let e=this.camera;if(this._lodSize=L(e.slope<0?0:e.slope,this._curLodSize,this._minLodSize),e._insideSegment=null,this._clearRenderedNodeList(),this._clearRenderNodesInFrustum(),this._viewExtent.southWest.set(180,180),this._viewExtent.northEast.set(-180,-180),this._visibleNodes={},this._visibleNodesNorth={},this._visibleNodesSouth={},this.minCurrZoom=s,this.maxCurrZoom=a,this.quadTreeStrategy.collectRenderNodes(),e.slope>this.minEqualZoomCameraSlope&&e._lonLat.height<this.maxEqualZoomAltitude&&e._lonLat.height>this.minEqualZoomAltitude){this.minCurrZoom=this.maxCurrZoom;let t=this._renderedNodes,i=this._renderedNodesInFrustum,r=[];this._clearRenderNodesInFrustum(),this._renderedNodes=[];for(let n=0,s=t.length;n<s;n++){let s=t[n],a=s.segment.centerNormal.dot(e._b);if(s.segment.tileZoom===this.maxCurrZoom||a<.81){this._renderedNodes.push(s);let e=0,t=s.inFrustum;for(;t;)1&t&&i[e].push(s),e++,t>>=1}else r.push(s)}for(let t=0,i=r.length;t<i;t++)r[t].renderTree(e,this.maxCurrZoom,null)}}_globalPreDraw(){let e=this.camera;this.renderer.__useDistanceFramebuffer__=!this.terrain.isEmpty,this._distBeforeMemClear+=this._prevCamEye.distance(e.eye),this._prevCamEye.copy(e.eye),e.checkFly(),this._createdNodesCount>200&&this._distBeforeMemClear>1e3&&(this.terrain.clearCache(),this.memClear()),this._indexesCacheToRemoveCounter>600&&this._clearIndexesCache()}preFrame(){this._updateLayer&&(this._updateLayer=!1,this._updateVisibleLayers()),this.camera.isFirstPass&&(this.camera.update(),this._skipPreRender&&this._collectRenderNodesIsActive&&this._collectRenderNodes(),this._skipPreRender=!0,this.transformLights(),this._normalMapCreator.frame(),this._geoImageCreator.frame(),this._vectorTileCreator.frame(),this.camera.checkTerrainCollision(),this.camera.update(),this.events.dispatch(this.events.draw,this),this._collectVectorLayerCollections()),this.drawEntityCollections(this._frustumEntityCollections)}frame(){this._renderScreenNodesPASS()}_checkRendercompleted(){this._renderCompleted?this._renderCompletedActivated||(this._renderCompletedActivated=!0,this.events.dispatch(this.events.rendercompleted,!0)):this._renderCompletedActivated=!1,this._renderCompleted=!0,this._terrainCompleted?this._terrainCompletedActivated||(this._terrainCompletedActivated=!0,this.events.dispatch(this.events.terraincompleted,!0)):this._terrainCompletedActivated=!1,this._terrainCompleted=!0}lockQuadTree(){this._collectRenderNodesIsActive=!1,this.camera.setTerrainCollisionActivity(!1)}unlockQuadTree(){this._collectRenderNodesIsActive=!0,this.camera.setTerrainCollisionActivity(!0)}_renderScreenNodesPASSNoAtmos(){let e,t,i=this.renderer,r=i.handler,n=r.gl,s=i.activeCamera,a=s.isFirstPass,o=s.currentFrustumIndex;n.enable(n.CULL_FACE),i.enableBlendOneSrcAlpha(),this.lightEnabled?(r.programs.drawnode_screen_wl.activate(),e=r.programs.drawnode_screen_wl._program,t=e.uniforms,n.uniform3fv(t.lightsPositions,this._lightsPositions),n.uniformMatrix4fv(t.viewMatrix,!1,s.getViewMatrix()),n.uniformMatrix4fv(t.projectionMatrix,!1,s.getProjectionMatrix()),this.baseLayer?(n.uniform3fv(t.diffuse,this.baseLayer._diffuse||this._diffuse),n.uniform3fv(t.ambient,this.baseLayer._ambient||this._ambient),n.uniform4fv(t.specular,this.baseLayer._specular||this._specular),n.uniform1f(t.nightTextureCoefficient,this.baseLayer.nightTextureCoefficient||this.nightTextureCoefficient)):(n.uniform3fv(t.diffuse,this._diffuse),n.uniform3fv(t.ambient,this._ambient),n.uniform4fv(t.specular,this._specular),n.uniform1f(t.nightTextureCoefficient,this.nightTextureCoefficient)),n.activeTexture(n.TEXTURE0+this.SLICE_SIZE),n.bindTexture(n.TEXTURE_2D,this._nightTexture||this.transparentTexture),n.uniform1i(t.nightTexture,this.SLICE_SIZE),n.activeTexture(n.TEXTURE0+this.SLICE_SIZE+1),n.bindTexture(n.TEXTURE_2D,this._specularTexture||this.transparentTexture),n.uniform1i(t.specularTexture,this.SLICE_SIZE+1),n.uniform1f(t.camHeight,s.getHeight())):(r.programs.drawnode_screen_nl.activate(),e=r.programs.drawnode_screen_nl._program,t=e.uniforms,n.uniformMatrix4fv(t.viewMatrix,!1,s.getViewMatrix()),n.uniformMatrix4fv(t.projectionMatrix,!1,s.getProjectionMatrix())),n.uniform3fv(t.eyePositionHigh,s.eyeHigh),n.uniform3fv(t.eyePositionLow,s.eyeLow);let l=this._renderedNodesInFrustum[o],h=this._visibleTileLayerSlices;if(h.length){let e=h[0];for(let t=e.length-1;t>=0;--t){let i=e[t];i._fading&&a&&i._refreshFadingOpacity()&&e.splice(t,1)}}let c=this.terrain.equalizeVertices,d=l.length;for(;d--;){let t=l[d].segment;c&&t.equalize(),t.readyToEngage&&t.engage(),t.screenRendering(e,h[0],0)}n.enable(n.POLYGON_OFFSET_FILL);for(let t=1,i=h.length;t<i;t++){let i=h[t];for(d=i.length-1;d>=0;--d){let e=i[d];e._fading&&a&&e._refreshFadingOpacity()&&i.splice(d,1)}for(n.polygonOffset(0,-t),d=l.length;d--;)l[d].segment.screenRendering(e,h[t],t,this.transparentTexture,!0)}n.disable(n.POLYGON_OFFSET_FILL)}_renderScreenNodesPASSAtmos(){let e,t,i=this.renderer,r=i.handler,n=r.gl,s=i.activeCamera,a=s.isFirstPass,o=s.currentFrustumIndex;n.enable(n.CULL_FACE),i.enableBlendOneSrcAlpha(),this.lightEnabled?(r.programs.drawnode_screen_wl.activate(),e=r.programs.drawnode_screen_wl._program,t=e.uniforms,n.uniform3fv(t.lightsPositions,this._lightsPositions),n.uniformMatrix4fv(t.viewMatrix,!1,s.getViewMatrix()),n.uniformMatrix4fv(t.projectionMatrix,!1,s.getProjectionMatrix()),this.baseLayer?(n.uniform3fv(t.diffuse,this.baseLayer._diffuse||this._diffuse),n.uniform3fv(t.ambient,this.baseLayer._ambient||this._ambient),n.uniform4fv(t.specular,this.baseLayer._specular||this._specular),n.uniform1f(t.nightTextureCoefficient,this.baseLayer.nightTextureCoefficient||this.nightTextureCoefficient)):(n.uniform3fv(t.diffuse,this._diffuse),n.uniform3fv(t.ambient,this._ambient),n.uniform4fv(t.specular,this._specular),n.uniform1f(t.nightTextureCoefficient,this.nightTextureCoefficient)),n.uniform2fv(t.maxMinOpacity,this._atmosphereMaxMinOpacity),n.activeTexture(n.TEXTURE0+this.SLICE_SIZE),n.bindTexture(n.TEXTURE_2D,this._nightTexture||this.transparentTexture),n.uniform1i(t.nightTexture,this.SLICE_SIZE),n.activeTexture(n.TEXTURE0+this.SLICE_SIZE+1),n.bindTexture(n.TEXTURE_2D,this._specularTexture||this.transparentTexture),n.uniform1i(t.specularTexture,this.SLICE_SIZE+1),n.activeTexture(n.TEXTURE0+this.SLICE_SIZE+4),n.bindTexture(n.TEXTURE_2D,i.controls.Atmosphere._transmittanceBuffer.textures[0]),n.uniform1i(t.transmittanceTexture,this.SLICE_SIZE+4),n.activeTexture(n.TEXTURE0+this.SLICE_SIZE+5),n.bindTexture(n.TEXTURE_2D,i.controls.Atmosphere._scatteringBuffer.textures[0]),n.uniform1i(t.scatteringTexture,this.SLICE_SIZE+5),n.uniform1f(t.camHeight,s.getHeight())):(r.programs.drawnode_screen_nl.activate(),e=r.programs.drawnode_screen_nl._program,t=e.uniforms,n.uniformMatrix4fv(t.viewMatrix,!1,s.getViewMatrix()),n.uniformMatrix4fv(t.projectionMatrix,!1,s.getProjectionMatrix())),n.uniform3fv(t.eyePositionHigh,s.eyeHigh),n.uniform3fv(t.eyePositionLow,s.eyeLow);let l=this._renderedNodesInFrustum[o],h=this._visibleTileLayerSlices;if(h.length){let e=h[0];for(let t=e.length-1;t>=0;--t){let i=e[t];i._fading&&a&&i._refreshFadingOpacity()&&e.splice(t,1)}}let c=this.terrain.equalizeVertices,d=l.length;for(;d--;){let t=l[d].segment;c&&t.equalize(),t.readyToEngage&&t.engage(),t.screenRendering(e,h[0],0)}n.enable(n.POLYGON_OFFSET_FILL);for(let t=1,i=h.length;t<i;t++){let i=h[t];for(d=i.length-1;d>=0;--d){let e=i[d];e._fading&&a&&e._refreshFadingOpacity()&&i.splice(d,1)}for(n.polygonOffset(0,-t),d=l.length;d--;)l[d].segment.screenRendering(e,h[t],t,this.transparentTexture,!0)}n.disable(n.POLYGON_OFFSET_FILL)}_renderDistanceFramebufferPASS(){if(!this.terrain.isEmpty){let e,t=this.renderer,i=t.handler,r=i.gl,n=t.activeCamera;i.programs.drawnode_heightPicking.activate(),e=i.programs.drawnode_heightPicking._program;let s=e.uniforms;r.uniformMatrix4fv(s.viewMatrix,!1,n.getViewMatrix()),r.uniformMatrix4fv(s.projectionMatrix,!1,n.getProjectionMatrix()),r.uniform3fv(s.eyePositionHigh,n.eyeHigh),r.uniform3fv(s.eyePositionLow,n.eyeLow);let a=this._renderedNodesInFrustum[n.currentFrustumIndex],o=this._visibleTileLayerSlices,l=a.length;for(;l--;)a[l].segment.heightPickingRendering(e,o[0])}}_renderColorPickingFramebufferPASS(){let e,t=this.renderer,i=t.handler,r=i.gl;i.programs.drawnode_colorPicking.activate(),e=i.programs.drawnode_colorPicking._program;let n=e.uniforms,s=t.activeCamera;r.enable(r.CULL_FACE),r.uniformMatrix4fv(n.viewMatrix,!1,s.getViewMatrix()),r.uniformMatrix4fv(n.projectionMatrix,!1,s.getProjectionMatrix()),r.uniform3fv(n.eyePositionHigh,s.eyeHigh),r.uniform3fv(n.eyePositionLow,s.eyeLow);let a=this._renderedNodesInFrustum[s.getCurrentFrustum()],o=this._visibleTileLayerSlices,l=a.length;for(;l--;)a[l].segment.colorPickingRendering(e,o[0],0);r.enable(r.POLYGON_OFFSET_FILL);for(let t=1,i=o.length;t<i;t++)for(l=a.length,r.polygonOffset(0,-t);l--;)a[l].segment.colorPickingRendering(e,o[t],t,this.transparentTexture,!0);r.disable(r.POLYGON_OFFSET_FILL)}_renderDepthFramebufferPASS(){let e,t=this.renderer,i=t.handler,r=i.gl;i.programs.drawnode_depth.activate(),e=i.programs.drawnode_depth._program;let n=e.uniforms,s=t.activeCamera;r.disable(r.BLEND),r.disable(r.POLYGON_OFFSET_FILL),r.uniformMatrix4fv(n.viewMatrix,!1,s.getViewMatrix()),r.uniformMatrix4fv(n.projectionMatrix,!1,s.getProjectionMatrix()),r.uniform3fv(n.eyePositionHigh,s.eyeHigh),r.uniform3fv(n.eyePositionLow,s.eyeLow),r.uniform3fv(n.frustumPickingColor,s.frustum._pickingColorU);let a=this._renderedNodesInFrustum[s.getCurrentFrustum()],o=this._visibleTileLayerSlices,l=a.length;for(;l--;)a[l].segment.depthRendering(e,o[0]);r.enable(r.BLEND)}_collectVectorLayerCollections(){this._frustumEntityCollections.length=0,this._frustumEntityCollections=[];let e=this.visibleVectorLayers.length;for(;e--;){let t=this.visibleVectorLayers[e];t._fading&&t._refreshFadingOpacity()&&this.visibleVectorLayers.splice(e,1),t.collectVisibleCollections(this._frustumEntityCollections),t.update()}}_frustumEntityCollectionPickingCallback(){this.drawPickingEntityCollections(this._frustumEntityCollections)}memClear(){this._distBeforeMemClear=0,this.camera._insideSegment=null,this.layerLock.lock(this._memKey),this.terrainLock.lock(this._memKey),this._normalMapCreator.lock(this._memKey),this._normalMapCreator.clear(),this.terrain.abortLoading(),this._tileLoader.abortAll(),this.quadTreeStrategy.clear(),this.layerLock.free(this._memKey),this.terrainLock.free(this._memKey),this._normalMapCreator.free(this._memKey),this._createdNodesCount=0}getRayIntersectionEllipsoid(e){return this.ellipsoid.hitRay(e.origin,e.direction)}getCartesianFromPixelEllipsoid(e){let t=this.renderer.activeCamera;return this.ellipsoid.hitRay(t.eye,t.unproject(e.x,e.y))}getLonLatFromPixelEllipsoid(e){let t=this.getCartesianFromPixelEllipsoid(e);if(t)return this.ellipsoid.cartesianToLonLat(t)}getCartesianFromMouseTerrain(){let e=this.renderer.events.mouseState,t=this.getDistanceFromPixel(e);if(t)return e.direction.scaleTo(t).addA(this.renderer.activeCamera.eye)}getCartesianFromPixelTerrain(e){let t=this.getDistanceFromPixel(e);if(t){return(e.direction||this.renderer.activeCamera.unproject(e.x,e.y)).scaleTo(t).addA(this.renderer.activeCamera.eye)}}getLonLatFromPixelTerrain(e){let t=this.getCartesianFromPixelTerrain(e);if(t)return this.ellipsoid.cartesianToLonLat(t)}getPixelFromCartesian(e){return this.renderer.activeCamera.project(e)}getPixelFromLonLat(e){let t=this.ellipsoid.lonLatToCartesian(e);if(t)return this.renderer.activeCamera.project(t)}getDistanceFromPixelEllipsoid(e){let t=this.getCartesianFromPixelEllipsoid(e);if(t)return t.distance(this.renderer.activeCamera.eye)}getDistanceFromPixel(e){if(this.terrain.isEmpty)return this.getDistanceFromPixelEllipsoid(e)||0;{let t=this.renderer,i=t.handler.canvas,r=e.x/i.width,n=(i.height-e.y)/i.height;ca[0]=ca[1]=ca[2]=0;let s=0;if(t.readDistanceColor(r,n,ca),s=function(e,t=!1){let i=1-2*w(128,e[0]),r=2*x(e[0],128)+w(128,e[1])-127,n=65536*x(e[1],128)+256*e[2]+(t&&e[3]||0)+8388608;return i*C(r)*(1.1920928955078125e-7*n)}(ca),ca[0]||ca[1]||ca[2]){if(s<11){t.screenDepthFramebuffer.activate(),t.screenDepthFramebuffer.readPixels(da,r,n);let i=new ne(2*r-1,2*n-1,da[0]/255*2-1,1),a=this.camera.frustums[0].inverseProjectionMatrix.mulVec4(i),o=e.direction||t.activeCamera.unproject(e.x,e.y);s=-a.z/a.w/o.dot(t.activeCamera.getForward()),t.screenDepthFramebuffer.deactivate()}}else s=this.getDistanceFromPixelEllipsoid(e)||0;return s}}viewExtent(e){this.camera?this.camera.viewExtent(e):this._initialViewExtent=e}viewExtentArr(e){this.viewExtent(new ie(new I(e[0],e[1]),new I(e[2],e[3])))}getViewExtent(){return this._viewExtent}viewLonLat(e,t,i){this.camera.setLonLat(e,t,i)}flyExtent(e,t,i,r,n,s){this.camera.flyExtent(e,t,i,r,n,s)}flyCartesian(e,t,i,r,n,s,a){this.camera.flyCartesian(e,t,i,r,n,s,a)}flyLonLat(e,t,i,r,n,s,a){this.camera.flyLonLat(e,t,i,r,n,s,a)}stopFlying(){this.camera.stopFlying()}updateBillboardsTexCoords(){for(let e=0;e<this.entityCollections.length;e++)this.entityCollections[e].billboardHandler.refreshTexCoordsArr();let e={};for(let t=0;t<this._layers.length;t++){let i=this._layers[t];i instanceof Pr&&i.each((function(t){t._entityCollection&&!e[t._entityCollection.id]&&(t._entityCollection.billboardHandler.refreshTexCoordsArr(),e[t._entityCollection.id]=!0)}))}}getEntityTerrainPoint(e,t){let i=this._renderedNodes,r=i.length;for(;r--;)if(i[r].segment.isEntityInside(e))return i[r].segment.getEntityTerrainPoint(e,t)}async getHeightDefault(e){return new Promise((t=>{this.terrain&&this.terrain.getHeightAsync(e.clone(),(e=>{t(e)})),t(0)}))}async getHeightAboveELL(e){return new Promise((t=>{this.terrain&&this.terrain.getHeightAsync(e.clone(),(i=>{t(i+this.terrain.geoid.getHeightLonLat(e))})),t(0)}))}onremove(){this.memClear(),this.quadTreeStrategy.destroyBranches(),this._renderedNodes=[]}}const ua=["draw","layeradd","baselayerchange","layerremove","layervisibilitychange","rendercompleted","terraincompleted","layerloadend"];class fa extends Ti{constructor(e){super("skybox"),this.params=e,this.vertexPositionBuffer=null,this.texture=null}static createDefault(e){return new fa({nx:e+"skybox/gal/_nx.jpg",px:e+"skybox/gal/_px.jpg",py:e+"skybox/gal/_py.jpg",ny:e+"skybox/gal/_ny.jpg",pz:e+"skybox/gal/_pz.jpg",nz:e+"skybox/gal/_nz.jpg"})}init(){this.renderer.handler.addProgram(new Si("skybox",{uniforms:{projectionViewMatrix:{type:Ai.MAT4},uSampler:{type:Ai.SAMPLERCUBE},pos:{type:Ai.VEC3}},attributes:{aVertexPosition:{type:Ai.VEC3,enableArray:!0}},vertexShader:"attribute vec3 aVertexPosition;\n uniform mat4 projectionViewMatrix;\n uniform vec3 pos;\n varying vec3 vTextureCoord;\n void main(void) {\n vTextureCoord = aVertexPosition;\n gl_Position = projectionViewMatrix * vec4(aVertexPosition + pos, 1.0);\n }",fragmentShader:"precision lowp float;\n varying vec3 vTextureCoord;\n uniform samplerCube uSampler;\n void main(void) {\n gl_FragColor = textureCube(uSampler, vTextureCoord);\n }"}),!0),this.texture=this.renderer.handler.loadCubeMapTexture(this.params),this._createBuffers(),this.drawMode=this.renderer.handler.gl.TRIANGLES}frame(){let e=this.renderer.handler,t=e.gl,i=this.renderer.activeCamera;t.disable(t.DEPTH_TEST),e.programs.skybox.activate();let r=e.programs.skybox._program,n=r.uniforms;t.uniformMatrix4fv(n.projectionViewMatrix,!1,i.getProjectionViewMatrix()),t.uniform3fv(n.pos,i.eye.toArray()),t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_CUBE_MAP,this.texture),t.uniform1i(n.uSampler,0);let s=this.vertexPositionBuffer;t.bindBuffer(t.ARRAY_BUFFER,s),t.vertexAttribPointer(r.attributes.aVertexPosition,s.itemSize,t.FLOAT,!1,0,0),t.drawArrays(this.drawMode,0,s.numItems),t.enable(t.DEPTH_TEST)}_createBuffers(){const e=new Float32Array([-1e8,1e8,-1e8,-1e8,-1e8,-1e8,1e8,-1e8,-1e8,1e8,-1e8,-1e8,1e8,1e8,-1e8,-1e8,1e8,-1e8,-1e8,-1e8,1e8,-1e8,-1e8,-1e8,-1e8,1e8,-1e8,-1e8,1e8,-1e8,-1e8,1e8,1e8,-1e8,-1e8,1e8,1e8,-1e8,-1e8,1e8,-1e8,1e8,1e8,1e8,1e8,1e8,1e8,1e8,1e8,1e8,-1e8,1e8,-1e8,-1e8,-1e8,-1e8,1e8,-1e8,1e8,1e8,1e8,1e8,1e8,1e8,1e8,1e8,1e8,-1e8,1e8,-1e8,-1e8,1e8,-1e8,1e8,-1e8,1e8,1e8,-1e8,1e8,1e8,1e8,1e8,1e8,1e8,-1e8,1e8,1e8,-1e8,1e8,-1e8,-1e8,-1e8,-1e8,-1e8,-1e8,1e8,1e8,-1e8,-1e8,1e8,-1e8,-1e8,-1e8,-1e8,1e8,1e8,-1e8,1e8]);this.vertexPositionBuffer=this.renderer.handler.createArrayBuffer(e,3,e.length/3)}}var ga=Object.freeze({__proto__:null,Axes:class extends Ti{constructor(e=100){super("Axes"),this.size=e,this.axesBuffer=null,this.axesColorBuffer=null}init(){this.createAxesBuffer(this.size),this.drawMode=this.renderer.handler.gl.LINES,this.renderer.handler.addProgram(new Si("axesShader",{uniforms:{projectionViewMatrix:"mat4"},attributes:{aVertexPosition:"vec3",aVertexColor:"vec4"},vertexShader:"attribute vec3 aVertexPosition;\n attribute vec4 aVertexColor;\n uniform mat4 projectionViewMatrix;\n varying vec4 vColor;\n void main(void) {\n gl_Position = projectionViewMatrix * vec4(aVertexPosition, 1.0);\n vColor = aVertexColor;\n }",fragmentShader:"precision highp float;\n varying vec4 vColor;\n void main(void) {\n gl_FragColor = vColor;\n }"}))}frame(){this.renderer.handler.programs.axesShader.activate().set({projectionViewMatrix:this.renderer.activeCamera.getProjectionViewMatrix(),aVertexPosition:this.axesBuffer,aVertexColor:this.axesColorBuffer}),this.renderer.handler.programs.axesShader.drawArrays(this.drawMode,this.axesBuffer.numItems)}createAxesBuffer(e){const t=[0,0,0,e-1,0,0,0,0,0,0,e-1,0,0,0,0,0,0,e-1];this.axesBuffer=this.renderer.handler.createArrayBuffer(new Float32Array(t),3,6),this.axesColorBuffer=this.renderer.handler.createArrayBuffer(new Float32Array([1,0,0,1,1,0,0,1,0,0,1,1,0,0,1,1,0,1,0,1,0,1,0,1]),4,6)}},Planet:_a,RenderNode:Ti,SkyBox:fa});class pa{constructor(e={}){this.__id=pa.__counter__++,this.equalizeVertices=e.equalizeVertices||!1,this.equalizeNormals=!1,this.isEmpty=!0,this.name=e.name||"empty",this.minZoom=e.minZoom||2,this.maxZoom=e.maxZoom||19,this.maxNativeZoom=e.maxNativeZoom||this.maxZoom,this.gridSizeByZoom=e.gridSizeByZoom||[64,32,16,8,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],this._maxNodeZoom=this.gridSizeByZoom.length-1,this.plainGridSize=2,this.noDataValues=[],this._planet=null,this._geoid=e.geoid||new Ys({src:e.geoidSrc||null}),this._isReady=!1}get isIdle(){return!0}isEqual(e){return e.__id===this.__id}static checkNoDataValue(e,t){return-1!==Pe(e,t)}isBlur(e){return!1}set maxNodeZoom(e){e>this.gridSizeByZoom.length-1&&(e=this.gridSizeByZoom.length-1),this._maxNodeZoom=e}get maxNodeZoom(){return this._maxNodeZoom}set geoid(e){this._geoid=e}get geoid(){return this._geoid}getGeoid(){return this._geoid}handleSegmentTerrain(e){e.terrainIsLoading=!1,e.terrainReady=!0,e.terrainExists=!0}isReady(){return this._isReady}abortLoading(){}clearCache(){}getHeightAsync(e,t){return t(0),!0}loadTerrain(e,t=!1){}}pa.__counter__=0;class ma extends pa{constructor(e="",t={}){super({geoidSrc:"//openglobus.org/geoid/egm84-30.pgm",maxNativeZoom:t.maxNativeZoom||14,...t}),this._s=t.subdomains||["a","b","c"],this.events=Tt(va,this),this._requestCount=0,this._requestsPeerSubdomain=4,this.isEmpty=!1,this.equalizeNormals=!0,this.name=e||"openglobus",this.url=t.url||"//{s}.srtm3.openglobus.org/{z}/{y}/{x}.ddm",this.gridSizeByZoom=t.gridSizeByZoom||[64,32,32,16,16,8,8,8,8,16,16,16,16,32,32,16,8,4,2,2,2,2,2,2],this.noDataValues=t.noDataValues||[],this.plainGridSize=t.plainGridSize||32,this._extent=Ae(t.extent,new ie(new I(-180,-90),new I(180,90))),this._dataType="arrayBuffer",this._maxNodeZoom=this.gridSizeByZoom.length-1,this._elevationCache={},this._fetchCache={},this._loader=new Xs,this._urlRewriteCallback=t.urlRewrite||null}get loader(){return this._loader}clearCache(){for(let e in this._elevationCache)this._elevationCache[e].heights=null,this._elevationCache[e].extent=null,delete this._elevationCache[e];this._elevationCache=null,this._elevationCache={};for(let e in this._fetchCache)this._fetchCache[e]=null,delete this._fetchCache[e];this._fetchCache=null,this._fetchCache={}}isBlur(e){return e.tileZoom>=6}getHeightAsync(e,t,i,r){if(!e||e.lat>J||e.lat<ee)return t(0),!0;r=null==r||r;let n=i||this.maxZoom,s=Math.pow(2,n),a=D/s,o=Z(e),l=Math.floor((F+o.lon)/a),h=Math.floor((F-o.lat)/a),c=Ut.getTileIndex(l,h,n),d=this._elevationCache[c];if(d)return d.heights?t(this._getGroundHeightMerc(o,d)):t(0),!0;if(!this._fetchCache[c]){let e=this._buildURL(l,h,n);this._fetchCache[c]=this._loader.fetch({src:e,type:this._dataType})}return this._fetchCache[c].then((i=>{let s=Q(l,h,n);if("ready"===i.status){let e={heights:this._createHeights(i.data,c,l,h,n,s),extent:s};this._elevationCache[c]=e,t(this._getGroundHeightMerc(o,e))}else if("error"===i.status){if(r&&n>this.maxNativeZoom)return r=!1,void this.getHeightAsync(e,t,this.maxNativeZoom,!1);this._elevationCache[c]={heights:null,extent:s},t(0)}else this._fetchCache[c]=null,delete this._fetchCache[c]})),!1}getTileCache(e,t){if(!e||e.lat>J||e.lat<ee)return;let i=Math.pow(2,t),r=D/i,n=Z(e),s=Math.floor((F+n.lon)/r),a=Math.floor((F-n.lat)/r),o=Ut.getTileIndex(s,a,t);return this._elevationCache[o]}_getGroundHeightMerc(e,t){if(!t.extent||!t.heights)return 0;let i=t.extent.getWidth(),r=Math.sqrt(t.heights.length),n=i/(r-1),s=r-Math.ceil((e.lat-t.extent.southWest.lat)/n)-1,a=Math.floor((e.lon-t.extent.southWest.lon)/n),o=(s+1)*r+a,l=o+1,h=s*r+a,c=h+1,d=t.heights[o],_=t.heights[l],u=t.heights[h],f=t.heights[c],g=new oe(t.extent.southWest.lon+n*a,d,t.extent.northEast.lat-n*s-n),p=new oe(g.x+n,_,g.z),m=new oe(g.x,u,g.z+n),v=new oe(g.x+n,f,g.z+n),y=new oe(e.lon,1e5,e.lat),x=new ai(y,new oe(0,-1,0)),b=new oe,w=x.hitTriangle(g,p,m,b);return w===ai.INSIDE?b.y:(w=x.hitTriangle(p,v,m,b),w===ai.INSIDE?b.y:0)}abortLoading(){this._loader.abortAll()}setUrl(e){this.url=e}setName(e){this.name=e}isReadyToLoad(e){return e._projection.equal(xs)&&this._extent.overlaps(e.getExtentLonLat())}loadTerrain(e,t=!1){if(this._planet.terrainLock.isFree())if(e.terrainReady=!1,e.terrainIsLoading=!0,this.isReadyToLoad(e)){let i=this._elevationCache[e.tileIndex];i?this._applyElevationsData(e,i.heights):this._loader.load({sender:this,src:this._getHTTPRequestString(e),segment:e,type:this._dataType,filter:()=>e.plainReady&&0!==e.node.getState()||t},(t=>{if("ready"===t.status){let i=this._createHeights(t.data,e.tileIndex,e.tileX,e.tileY,e.tileZoom,e.getExtent(),e.tileZoom===this.maxZoom);this._elevationCache[e.tileIndex]={heights:i,extent:e.getExtent()},this._applyElevationsData(e,i)}else"abort"===t.status?e.terrainIsLoading=!1:"error"===t.status?this._applyElevationsData(e,null):e.terrainIsLoading=!1}))}else e.elevationsNotExists();else e.terrainIsLoading=!1}_getSubdomain(){return this._requestCount++,this._s[Math.floor(this._requestCount%(this._requestsPeerSubdomain*this._s.length)/this._requestsPeerSubdomain)]}_buildURL(e,t,i){return ye(this.url,{s:this._getSubdomain(),x:e.toString(),y:t.toString(),z:i.toString()})}_createUrl(e){return this._buildURL(e.tileX,e.tileY,e.tileZoom)}_getHTTPRequestString(e){return this._urlRewriteCallback?this._urlRewriteCallback(e,this.url):this._createUrl(e)}setUrlRewriteCallback(e){this._urlRewriteCallback=e}_createHeights(e,t,i,r,n,s,a){return new Float32Array(e)}_applyElevationsData(e,t){if(e){let i=this.events.load;i.handlers.length&&this.events.dispatch(i,{elevations:t,segment:e}),e.applyTerrain(t)}}}const va=["load","loadend"];class ya extends Ut{constructor(e,t={}){super(e,t),this.events=this.events.registerNames(xa),this.url=t.url||"",this._s=t.subdomains||["a","b","c"],this.minNativeZoom=t.minNativeZoom||0,this.maxNativeZoom=t.maxNativeZoom||19,this._urlRewriteCallback=t.urlRewrite||null,this._requestsPeerSubdomains=4,this._requestCount=0}get isIdle(){return super.isIdle&&0===this._planet._tileLoader.getRequestCounter(this)}get instanceName(){return"XYZ"}abortLoading(){this._planet&&this._planet._tileLoader.abort(this)}setVisibility(e){e!==this._visibility&&(super.setVisibility(e),e||this.abortLoading())}remove(){return this.abortLoading(),super.remove(),this}setUrl(e){this.url=e}_checkSegment(e){return e._projection.id===this._planet.quadTreeStrategy.projection.id}loadMaterial(e,t=!1){let i=e.segment;this._isBaseLayer?e.texture=i.getDefaultTexture():e.texture=i.planet.transparentTexture,(this._planet.layerLock.isFree()||e.segment.tileZoom<2)&&(e.isReady=!1,e.isLoading=!0,this._checkSegment(i)?(e.loadingAttempts++,this._planet._tileLoader.load({sender:this,src:this._getHTTPRequestString(e.segment),type:"imageBitmap",filter:()=>i.initialized&&1===i.node.getState()||t,options:{}},(t=>{if("ready"===t.status){if(e.isLoading){let i=this.events.load;i.handlers.length&&this.events.dispatch(i,e),e.applyImage(t.data),t.data=null}}else"abort"===t.status?e.isLoading=!1:"error"===t.status&&e.isLoading&&e.textureNotExists()}))):e.textureNotExists())}_createUrl(e){return ye(this.url,{s:this._getSubdomain(),x:e.tileX.toString(),y:e.tileY.toString(),z:e.tileZoom.toString()})}_getSubdomain(){return this._requestCount++,this._s[Math.floor(this._requestCount%(this._requestsPeerSubdomains*this._s.length)/this._requestsPeerSubdomains)]}_getHTTPRequestString(e){return this._urlRewriteCallback?this._urlRewriteCallback(e,this.url):this._createUrl(e)}setUrlRewriteCallback(e){this._urlRewriteCallback=e}applyMaterial(e,t=!1){if(e.isReady)return e.texOffset;if(e.segment.tileZoom<this.minNativeZoom)e.textureNotExists();else{let i=e.segment,r=i.node,n=!1,s=this.__id,a=e;for(;r.parentNode;)if(r=r.parentNode,a=r.segment.materials[s],a&&a.textureExists){n=!0;break}if(i.passReady){let n=e.layer.maxNativeZoom;if(r.segment.tileZoom===n)e.textureNotExists();else if(e.segment.tileZoom<=n)!e.isLoading&&!e.isReady&&this.loadMaterial(e,t);else{let t=i.node;for(;t.segment.tileZoom>e.layer.maxNativeZoom;)t=t.parentNode;let r=t.segment.materials[e.layer.__id];r?!r.isLoading&&!r.isReady&&this.loadMaterial(r,!0):(r=t.segment.materials[e.layer.__id]=e.layer.createMaterial(t.segment),this.loadMaterial(r,!0))}}if(n){e.appliedNode=r,e.appliedNodeId=r.nodeId,e.texture=a.texture;let t=1/(2<<i.tileZoom-r.segment.tileZoom-1);e.texOffset[0]=i.tileX*t-r.segment.tileX,e.texOffset[1]=i.tileY*t-r.segment.tileY,e.texOffset[2]=t,e.texOffset[3]=t}else e.texture=i.planet.transparentTexture,e.texOffset[0]=0,e.texOffset[1]=0,e.texOffset[2]=1,e.texOffset[3]=1}return e.texOffset}clearMaterial(e){e.isReady&&e.textureExists&&(!e.texture.default&&e.segment.handler.gl.deleteTexture(e.texture),e.texture=null),e.isReady=!1,e.textureExists=!1,e.isLoading=!1}_correctFullExtent(){let e=this._extent,t=this._extentMerc,i=F+5e4,r=F+5e4;90===e.northEast.lat&&(t.northEast.lat=r),180===e.northEast.lon&&(t.northEast.lon=i),-90===e.southWest.lat&&(t.southWest.lat=-20087508.34),-180===e.southWest.lon&&(t.southWest.lon=-20087508.34),e.northEast.lat>=J&&(e.northEast.lat=J),e.northEast.lat<=ee&&(e.northEast.lat=ee)}}const xa=["load","loadend"];class ba extends ya{constructor(e,t){super(e,t),this._extra=new URLSearchParams(t.extra).toString(),t.extent||this.setExtent(new ie(new I(-180,-90),new I(180,90))),this.layers=t.layers,this.imageWidth=t.imageWidth||256,this.imageHeight=t.imageHeight||256,this._getBbox=ba.get_bbox_v1_1_1,this._version="",this.setVersion(t.version)}static createRequestUrl(e,t,i="image/png",r="1.1.1",n="GetMap",s,a,o=256,l=256,h){return`${e}/?LAYERS=${t}&FORMAT=${i}&SERVICE=WMS&VERSION=${r}&REQUEST=${n}&SRS=${s}&BBOX=${a}&WIDTH=${o}&HEIGHT=${l}`+(h?`&${h}`:"")}static get_bbox_v1_1_1(e){return`${e.getWest()},${e.getSouth()},${e.getEast()},${e.getNorth()}`}static get_bbox_v1_3_0(e){return`${e.getSouth()},${e.getWest()},${e.getNorth()},${e.getEast()}`}_checkSegment(e){return!0}get instanceName(){return"WMS"}_createUrl(e){return ba.createRequestUrl(this.url,this.layers,"image/png",this._version,"GetMap",e._projection.code,this._getBbox(e.getExtent()),this.imageWidth,this.imageHeight,this._extra)}setVersion(e){this._version=e||"1.1.1","1.1.1"===this._version?this._getBbox=ba.get_bbox_v1_1_1:"1.3.0"===e&&(this._getBbox=ba.get_bbox_v1_3_0)}_correctFullExtent(){const e=this._extent,t=this._extentMerc,i=F+5e4,r=F+5e4;90===e.northEast.lat&&(t.northEast.lat=r),180===e.northEast.lon&&(t.northEast.lon=i),-90===e.southWest.lat&&(t.southWest.lat=-20087508.34),-180===e.southWest.lon&&(t.southWest.lon=-20087508.34)}}class wa extends ma{constructor(e={}){super("BilTerrain",e),this.equalizeVertices=!0,this.equalizeNormals=!0,this.minZoom=e.minZoom||2,this.maxZoom=e.maxZoom||14,this.noDataValues=e.noDataValues||[-9999,32767],this.url=e.url||"",this._format="application/bil16",this._layers=e.layers||"",this._imageSize=e.imageSize||256,this.plainGridSize=null!=e.plainGridSize?e.plainGridSize:m(this._imageSize)?this._imageSize/2:v(this._imageSize)/2,this._dataType="arrayBuffer"}isBlur(e){return e.tileZoom>=18}_createUrl(e){return ba.createRequestUrl(this.url,this._layers,this._format,"1.1.1","GetMap",e._projection.code,ba.get_bbox_v1_1_1(e.getExtent()),this._imageSize,this._imageSize)}_createHeights(e,t,i,r,n,s,a){let o=new Int16Array(e);if(!m(this._imageSize)){let e=new Float32Array(o.length);return function(e,t){for(let i=0,r=t.length;i<r;i++)t[i]=e[i]}(o,e),e}let l=(this.plainGridSize+1)*(this.plainGridSize+1),h=new Array(4);for(let e=0;e<4;e++){h[e]=[];for(let t=0;t<4;t++)h[e][t]=new Float32Array(l)}let c=new Float32Array(l);!function(e,t,i,r){let n=Math.sqrt(i.length)-1,s=n+1,a=Math.sqrt(e.length),o=a/n,l=0,h=0;for(let c=0,d=0,_=e.length;c<_;c++){let _=e[c],u=wa.checkNoDataValue(t,_),f=!1,g=!1,p=Math.floor(c/a),m=c%a,v=Math.floor(m/n),y=Math.floor(p/n),x=r[y][v],b=p%n,w=m%n,T=(b+y)*s+w+v;if(x[T]=_,(p+y)%o==0&&(m+v)%o==0&&(i[d++]=_),(m+1)%n==0&&m!==a-1){l=e[c],f=wa.checkNoDataValue(t,l);let a=_;u||f||(a=.5*(_+l)),T=(b+y)*s+w+1,x[T]=a,(p+y)%o==0&&(i[d++]=a);let h=(b+y)*s+(w+1)%n;r[y][v+1][h]=a}if((p+1)%n==0&&p!==a-1){h=e[c+a],g=wa.checkNoDataValue(t,h);let l=_;u||g||(l=.5*(_+h)),T=(b+1)*s+w+v,x[T]=l,(m+v)%o==0&&(i[d++]=l);let f=(b+1)%n*s+w+v;r[y+1][v][f]=l}if((m+1)%n==0&&m!==a-1&&(p+1)%n==0&&p!==a-1){let o=e[c+a+1],p=wa.checkNoDataValue(t,o),m=_;u||f||g||p||(m=.25*(_+l+h+o)),T=(b+1)*s+(w+1),x[T]=m,i[d++]=m;let C=(b+1)*s;r[y][v+1][C]=m;let L=n;r[y+1][v][L]=m;let A=0;r[y+1][v+1][A]=m}}}(o,this.noDataValues,c,h),this._elevationCache[t]={heights:c,extent:s};let d=this._imageSize/this.plainGridSize;for(let e=0;e<d;e++)for(let t=0;t<d;t++){let s=2*i+t,a=2*r+e,o=n+1,l=Ut.getTileIndex(s,a,o);this._elevationCache[l]={heights:h[e][t],extent:Q(s,a,o)}}return c}}const Ta=(e,t,i)=>.1*(256*e*256+256*t+i)-1e4;class Ca extends ma{constructor(e,t={}){super(e||"MapboxTerrain",{equalizeVertices:null==t.equalizeVertices||t.equalizeVertices,maxZoom:t.maxZoom||17,...t}),this.equalizeNormals=t.equalizeNormals||!1,this.gridSizeByZoom=t.gridSizeByZoom||[64,32,16,8,8,8,8,16,16,16,16,16,32,16,32,16,32,16,32,16,8,4],this.url=null!=t.url?t.url:`//api.mapbox.com/v4/mapbox.terrain-rgb/{z}/{x}/{y}.pngraw?access_token=${t.key||"pk.eyJ1IjoiZm94bXVsZGVyODMiLCJhIjoiY2pqYmR3dG5oM2Z1bzNrczJqYm5pODhuNSJ9.Y4DRmEPhb-XSlCR9CAXACQ"}`,this.noDataValues=t.noDataValues||[-65537,-1e4],this.plainGridSize=t.plainGridSize||128,this._dataType="imageBitmap",this._imageSize=t.imageSize||256,this._ctx=this._createTemporalCanvas(this._imageSize),this._imageDataCache={}}isBlur(e){return e.tileZoom>=16}_createTemporalCanvas(e){let t=document.createElement("canvas");return t.width=e,t.height=e,t.getContext("2d",{willReadFrequently:!0})}_createHeights(e,t,i,r,n,s,a){this._ctx.clearRect(0,0,this._imageSize,this._imageSize),this._ctx.drawImage(e,0,0);let o=this._ctx.getImageData(0,0,this._imageSize,this._imageSize).data;const l=e.width;if(!m(this._imageSize)&&l===this._imageSize){let e=new Float32Array(l*l);return function(e,t){for(let i=0,r=t.length;i<r;i++){let r=4*i;t[i]=Ta(e[r],e[r+1],e[r+2])}}(o,e),e}if(this._imageSize===this.plainGridSize){let e=(this.plainGridSize+1)*(this.plainGridSize+1),t=new Float32Array(e);for(let e=0,i=this._imageSize*this._imageSize;e<i;e++){let i=e%this._imageSize,r=Math.floor(e/this._imageSize),n=4*e,s=Ta(o[n],o[n+1],o[n+2]);t[r*(this._imageSize+1)+i]=s}for(let e=0,i=this._imageSize;e<i;e++){let i=this._imageSize-1,r=4*(e*this._imageSize+i),n=Ta(o[r],o[r+1],o[r+2]);t[e*(this._imageSize+1)+this._imageSize]=n}for(let e=0,i=this._imageSize;e<i;e++){let i=4*((this._imageSize-1)*this._imageSize+e),r=Ta(o[i],o[i+1],o[i+2]);t[this._imageSize*(this._imageSize+1)+e]=r}let i=Ta(o[o.length-4],o[o.length-3],o[o.length-2]);return t[t.length-1]=i,t}let h=(this.plainGridSize+1)*(this.plainGridSize+1),c=l/this.plainGridSize,d=new Float32Array(h),_=new Array(c);for(let e=0;e<c;e++){_[e]=[];for(let t=0;t<c;t++)_[e][t]=new Float32Array(h)}if(a?function(e,t,i){let r=Math.sqrt(i.length)-1,n=Math.sqrt(e.length/4),s=n/r,a=0,o=0,l=0;for(let h=0,c=0,d=e.length/4;h<d;h++){let d=4*h,_=Ta(e[d],e[d+1],e[d+2]),u=Ca.checkNoDataValue(t,_),f=!1,g=!1,p=Math.floor(h/n),m=h%n,v=Math.floor(m/r),y=Math.floor(p/r);if((p+y)%s==0&&(m+v)%s==0&&(i[c++]=_),(m+1)%r==0&&m!==n-1){a=Ta(e[d+4],e[d+5],e[d+6]),f=Ca.checkNoDataValue(t,a);let r=_;u||f||(r=.5*(_+a)),(p+y)%s==0&&(i[c++]=r)}if((p+1)%r==0&&p!==n-1){l=4*n,o=Ta(e[d+l],e[d+l+1],e[d+l+2]),g=Ca.checkNoDataValue(t,o);let r=.5*(_+o);u||g||(r=.5*(_+o)),(m+v)%s==0&&(i[c++]=r)}if((m+1)%r==0&&m!==n-1&&(p+1)%r==0&&p!==n-1){let r=Ta(e[d+l+4],e[d+l+5],e[d+l+6]),n=Ca.checkNoDataValue(t,r),s=_;u||f||g||n||(s=.25*(_+a+o+r)),i[c++]=s}}}(o,this.noDataValues,d):function(e,t,i,r){let n=Math.sqrt(i.length)-1,s=n+1,a=Math.sqrt(e.length/4),o=a/n,l=0,h=0,c=0;for(let d=0,_=0,u=e.length/4;d<u;d++){let u=4*d,f=Ta(e[u],e[u+1],e[u+2]),g=Ca.checkNoDataValue(t,f),p=!1,m=!1,v=Math.floor(d/a),y=d%a,x=Math.floor(y/n),b=Math.floor(v/n),w=r[b][x],T=v%n,C=y%n,L=(T+b)*s+C+x;if(w[L]=f,(v+b)%o==0&&(y+x)%o==0&&(i[_++]=f),(y+1)%n==0&&y!==a-1){l=Ta(e[u+4],e[u+5],e[u+6]),p=Ca.checkNoDataValue(t,l);let a=f;g||p||(a=.5*(f+l)),L=(T+b)*s+C+1,w[L]=a,(v+b)%o==0&&(i[_++]=a);let h=(T+b)*s+(C+1)%n;r[b][x+1][h]=a}if((v+1)%n==0&&v!==a-1){c=4*a,h=Ta(e[u+c],e[u+c+1],e[u+c+2]),m=Ca.checkNoDataValue(t,h);let l=.5*(f+h);g||m||(l=.5*(f+h)),L=(T+1)*s+C+x,w[L]=l,(y+x)%o==0&&(i[_++]=l);let d=(T+1)%n*s+C+x;r[b+1][x][d]=l}if((y+1)%n==0&&y!==a-1&&(v+1)%n==0&&v!==a-1){let a=Ta(e[u+c+4],e[u+c+5],e[u+c+6]),o=Ca.checkNoDataValue(t,a),d=f;g||p||m||o||(d=.25*(f+l+h+a)),L=(T+1)*s+(C+1),w[L]=d,i[_++]=d;let v=(T+1)*s;r[b][x+1][v]=d;let y=n;r[b+1][x][y]=d;let A=0;r[b+1][x+1][A]=d}}}(o,this.noDataValues,d,_),this._elevationCache[t]={heights:d,extent:s},!a)for(let e=0;e<c;e++)for(let t=0;t<c;t++){let s=2*i+t,a=2*r+e,o=n+1,l=Ut.getTileIndex(s,a,o);this._elevationCache[l]={heights:_[e][t],extent:Q(s,a,o)}}return d}getHeightAsync(e,t,i){if(!e||e.lat>J||e.lat<ee)return t(0),!0;let r=i||this.maxZoom,n=D/Math.pow(2,r),s=Z(e),a=Math.floor((F+s.lon)/n),o=Math.floor((F-s.lat)/n),l=Ut.getTileIndex(a,o,r),h=Q(a,o,r),c=h.getWidth()/(this._imageSize-1),d=h.getHeight()/(this._imageSize-1),_=this._imageSize-Math.ceil((s.lat-h.southWest.lat)/d)-1,u=Math.floor((s.lon-h.southWest.lon)/c),f=4*(_*this._imageSize+u);if(this._imageDataCache[l]){let e=this._imageDataCache[l];return t(Ta(e[f],e[f+1],e[f+2])),!0}if(!this._fetchCache[l]){let e=this._buildURL(a,o,r);this._fetchCache[l]=this._loader.fetch({src:e,type:this._dataType})}return this._fetchCache[l].then((e=>{if("ready"===e.status){this._ctx.clearRect(0,0,this._imageSize,this._imageSize),this._ctx.drawImage(e.data,0,0);let i=this._ctx.getImageData(0,0,256,256).data;this._imageDataCache[l]=i,t(Ta(i[f],i[f+1],i[f+2]))}else"error"===e.status?t(0):(this._fetchCache[l]=null,delete this._fetchCache[l])})),!1}}var La=Object.freeze({__proto__:null,BilTerrain:wa,EmptyTerrain:pa,GlobusTerrain:ma,MapboxTerrain:Ca});class Aa extends tn{constructor(e,t={}){super(e,t),this._image=t.image||null,this._src=t.src||null,this._onLoad_=null}get instanceName(){return"GeoImage"}abortLoading(){this._image instanceof HTMLImageElement&&(this._image.src="")}setSrc(e){this._planet&&this._planet._geoImageCreator.remove(this),this._src=e,this._sourceReady=!1,this._sourceCreated=!1,this._image=new Image,this._onLoad_=this._onLoad.bind(this),this._image.addEventListener("load",this._onLoad_),this._image.src=e}setImage(e){this._planet&&this._planet._geoImageCreator.remove(this),this._sourceCreated=!1,this._sourceReady=!1,this._image=e,this._src=e.src,Ye(this._image)?this._applyImage(this._image):(this._onLoad_=this._onLoad.bind(this),this._image.addEventListener("load",this._onLoad_))}_createSourceTexture(){!this._sourceCreated&&this._image&&(this._sourceTexture=this._planet.renderer.handler.createTexture_l(this._image),this._sourceCreated=!0)}_onLoad(e){this._applyImage(this._image),this._image instanceof HTMLImageElement&&this._image.removeEventListener("load",this._onLoad_),this._onLoad_=null}_applyImage(e){e&&(this._frameWidth=v(2*e.width,4096),this._frameHeight=v(3*e.height,4096),this._sourceReady=!0,this._planet&&this._planet._geoImageCreator.add(this))}loadMaterial(e){e.isLoading=!0,this._creationProceeding=!0,!this._sourceReady&&this._src?this._image?this._image instanceof HTMLImageElement&&(Ye(this._image)?this._applyImage(this._image):(this._onLoad_=this._onLoad.bind(this),this._image.addEventListener("load",this._onLoad_))):(this._image=new Image,this._onLoad_=this._onLoad.bind(this),this._image.addEventListener("load",this._onLoad_),this._image.src=this._src):this._planet&&this._planet._geoImageCreator.add(this)}abortMaterialLoading(e){this._image&&this._image instanceof HTMLImageElement&&(this._image.src=""),this._creationProceeding=!1,e.isLoading=!1,e.isReady=!1}}class Ea extends tn{constructor(e,t={}){super(e,t),this._sourceTexture=t.texture||null,t.texture&&(this._sourceReady=!0,this._sourceCreated=!0),this._frameWidth=null!=t.frameWidth?v(t.frameWidth):256,this._frameHeight=null!=t.frameHeight?v(t.frameHeight):256,this._animate=!0}get instanceName(){return"GeoTexture2d"}loadMaterial(e){this._planet._geoImageCreator.add(this)}bindTexture(e){this._sourceReady=!0,this._sourceCreated=!0,this._sourceTexture=e}setSize(e,t){this._frameWidth=e,this._frameHeight=t,this._frameCreated=!1}abortMaterialLoading(e){this._creationProceeding=!1,e.isLoading=!1,e.isReady=!1}}class Pa extends tn{constructor(e,t={}){super(e,t),this._animate=!0,this._video=t.videoElement||null,this._src=t.src||null}get instanceName(){return"GeoVideo"}setSrc(e){this._planet&&this._planet._geoImageCreator.remove(this),this._src=e,this._sourceReady=!1}setVideoElement(e){this._planet&&this._planet._geoImageCreator.remove(this),this._video=e,this._src=e.src,this._sourceReady=!1}setVisibility(e){e!=this._visibility&&(super.setVisibility(e),this._planet&&(e?(this._sourceReady&&this._planet._geoImageCreator.add(this),this._video&&this._video.play()):(this._sourceReady&&this._planet._geoImageCreator.remove(this),this._video&&this._video.pause())))}_createSourceTexture(){let e=this._planet.renderer.handler.gl;this._sourceCreated?(e.bindTexture(e.TEXTURE_2D,this._sourceTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,this._video)):(this._sourceTexture=this._planet.renderer.handler.createTexture_n_webgl1(this._video),this._sourceCreated=!0)}_onCanPlay(e){this._frameWidth=e.videoWidth,this._frameHeight=e.videoHeight,e.width=e.videoWidth,e.height=e.videoHeight,e.play(),this._sourceReady=!0,this._planet._geoImageCreator.add(this)}_onError(e){let t="unknown error";switch(e.error.code){case 1:t="video loading aborted";break;case 2:t="network loading error";break;case 3:t="video decoding failed / corrupted data or unsupported codec";break;case 4:t="video not supported"}console.warn(`Error: ${t} error-code=${e.error.code})`)}loadMaterial(e){if(e.isLoading=!0,this._creationProceeding=!0,!this._sourceReady&&this._src){if(this._video){if(this._video.readyState===this._video.HAVE_ENOUGH_DATA)this._onCanPlay(this._video);else if(this._video.src){let e=this;this._video.addEventListener("canplay",(function(t){e._onCanPlay(this)}))}}else{this._video=document.createElement("video"),this._video.crossOrigin="Anonymous";let e=this;this._video.addEventListener("canplay",(function(){e._onCanPlay(this)})),this._video.addEventListener("error",(function(){e._onError(this)}))}this._video.autoplay=!0,this._video.loop=!0,this._video.src=this._src,this._video.muted=!0,this._video.setAttribute("playsinline","true"),this._video.setAttribute("webkit-playsinline","true")}else this._planet._geoImageCreator.add(this)}abortMaterialLoading(e){this._video&&(this._video.src=""),this._creationProceeding=!1,e.isLoading=!1,e.isReady=!1}}class Ma extends Pr{constructor(e,t={}){super(e,t),this._billboard=t.billboard||{src:"https://openglobus.org/examples/billboards/carrot.png"},this._color=t.color||"#6689db"}get instanceName(){return"KML"}_extractCoordonatesFromKml(e){return Array.from(e.getElementsByTagName("coordinates")).map((e=>e.textContent.trim())).map((e=>e.replace(/\n/g," ").replace(/\t/g," ").replace(/ +/g," ").split(" ").map((e=>e.split(",").map(parseFloat)))))}_AGBRtoRGBA(e){if(!e||8!=e.length)return;const t=parseInt(e.slice(0,2),16)/255,i=parseInt(e.slice(2,4),16),r=parseInt(e.slice(4,6),16);return`rgba(${parseInt(e.slice(6,8),16)},${r},${i},${t})`}_parseKMLcoordinates(e){return e.innerHTML.trim().replace(/\n/g," ").replace(/\t/g," ").replace(/ +/g," ").split(" ").map((e=>e.split(",").map(parseFloat)))}_kmlPlacemarkToEntity(e,t){if(!e)return;const i=Array.from(e.getElementsByTagName("name")),r=i&&i.length>0?i[0].innerHTML.trim():"",{iconHeading:n,iconURL:s,iconColor:a,lineWidth:o,lineColor:l}=this._extractStyle(e),h=[];for(const i of e.getElementsByTagName("coordinates")){const e=this._parseKMLcoordinates(i)||[[0,0,0]];for(const i of e){const[e,r,n]=i;h.push(new I(e,r,n)),e<t.southWest.lon&&(t.southWest.lon=e),r<t.southWest.lat&&(t.southWest.lat=r),e>t.northEast.lon&&(t.northEast.lon=e),r>t.northEast.lat&&(t.northEast.lat=r)}}if(1===h.length){const e=.01745329*n;return new vi({name:r,lonlat:h[0],billboard:{src:s,size:[24,24],color:a,rotation:e},properties:{color:a,heading:n}})}return new vi({polyline:{pathLonLat:[h],thickness:o,color:l,isClosed:!1}})}_extractStyle(e){let t,i,r,n,s;const a=e.getElementsByTagName("Style")[0];if(a){let e=a.getElementsByTagName("IconStyle")[0];if(e){let n=e.getElementsByTagName("color")[0];n&&(t=this._AGBRtoRGBA(n.innerHTML.trim()));let s=e.getElementsByTagName("heading")[0];if(s){const e=parseFloat(s.innerHTML.trim());e>=0&&e<=360&&(i=e%360)}let a=e.getElementsByTagName("Icon")[0];if(a){let e=a.getElementsByTagName("href")[0];e&&(r=e.innerHTML.trim())}}let o=a.getElementsByTagName("LineStyle")[0];if(o){let e=o.getElementsByTagName("color")[0];e&&(n=this._AGBRtoRGBA(e.innerHTML.trim()));let t=o.getElementsByTagName("width")[0];void 0!==t&&(s=parseFloat(t.innerHTML.trim()))}}return t||(t="#FFFFFF"),i||(i=0),r||(r="https://openglobus.org/examples/billboards/carrot.png"),n||(n="#FFFFFF"),s||(s=1),{iconHeading:i,iconURL:r,iconColor:t,lineWidth:s,lineColor:n}}_parseKML(e,t,i){if(i||(i=[]),"kml"!==e.documentElement.nodeName)return i;for(const r of e.getElementsByTagName("Placemark")){const e=this._kmlPlacemarkToEntity(r,t);e&&i.push(e)}return i}_convertKMLintoEntities(e){const t=new ie(new I(180,90),new I(-180,-90));return{entities:this._parseKML(e,t),extent:t}}_convertCoordonatesIntoEntities(e,t,i){const r=new ie(new I(180,90),new I(-180,-90)),n=e=>{const t=e[0],i=e[1];t<r.southWest.lon&&(r.southWest.lon=t),i<r.southWest.lat&&(r.southWest.lat=i),t>r.northEast.lon&&(r.northEast.lon=t),i>r.northEast.lat&&(r.northEast.lat=i)},s=[];e.forEach((e=>e.forEach((e=>s.push(e)))));return{entities:s.map((e=>{if(1===e.length){const t=e[0],r=new vi({lonlat:t,billboard:i});return n(t),r}if(e.length>1){const i=e.map((e=>(n(e),new I(e[0],e[1],e[2]))));return new vi({polyline:{pathLonLat:[i],thickness:3,color:t,isClosed:!1}})}})),extent:r}}_getXmlContent(e){return new Promise((t=>{const i=new FileReader;i.onload=async e=>t((new DOMParser).parseFromString(e.target.result,"text/xml")),i.readAsText(e)}))}_expandExtents(e,t){return e?(t.southWest.lon<e.southWest.lon&&(e.southWest.lon=t.southWest.lon),t.southWest.lat<e.southWest.lat&&(e.southWest.lat=t.southWest.lat),t.northEast.lon>e.northEast.lon&&(e.northEast.lon=t.northEast.lon),t.northEast.lat>e.northEast.lat&&(e.northEast.lat=t.northEast.lat),e):t}async addKmlFromFiles(e,t,i){if(!Array.isArray(e))return null;const r=(await Promise.all(e.map(this._getXmlContent))).map(this._extractCoordonatesFromKml),{entities:n,extent:s}=this._convertCoordonatesIntoEntities(r,t||this._color,i||this._billboard);return this._extent=this._expandExtents(this._extent,s),n.forEach(this.add.bind(this)),{entities:n,extent:s}}setColor(e){this._color=e,this._billboard.color=e}_getKmlFromUrl(e){return new Promise(((t,i)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.responseType="document",r.overrideMimeType("text/xml"),r.onload=()=>{r.readyState===r.DONE&&200===r.status?t(r.responseXML):i(new Error("no valid kml file"))},r.send()}))}async addKmlFromUrl(e,t,i){const r=await this._getKmlFromUrl(e),{entities:n,extent:s}=this._convertKMLintoEntities(r);return this._extent=this._expandExtents(this._extent,s),n.forEach(this.add.bind(this)),{entities:n,extent:s}}}var Sa=Object.freeze({__proto__:null,CanvasTiles:jt,GeoImage:Aa,GeoTexture2d:Ea,GeoVideo:Pa,KML:Ma,Layer:Ut,Material:Ot,Vector:Pr,WMS:ba,XYZ:ya});const Ba=["tick","end","start","stop"];class ka{constructor(e={}){this.__handler=null,this.active=!0,this.__id=ka.__counter__++,this.events=Tt(Ba,this),this.name=e.name||"",this.startDate=e.startDate||0,this.endDate=e.endDate||0;let t=e.currentDate||ct(new Date);e.startDate&&t<e.startDate&&(t=e.startDate),e.endDate&&t>e.endDate&&(t=e.endDate),this.currentDate=t,this._multiplier=void 0!==e.multiplier?e.multiplier:1,this._running=1,this.deltaTicks=0,this.active=!0,this._intervalDelay=0,this._intervalStart=0,this._intervalCallback=null}clearInterval(){this._intervalDelay=0,this._intervalStart=0,this._intervalCallback=null}setInterval(e,t){this._intervalStart=this.currentDate,this._intervalDelay=e*at,this._intervalCallback=t}setDate(e){let t=ct(e);this.startDate&&t<this.startDate&&(t=this.startDate),this.endDate&&t>this.endDate&&(t=this.endDate),this.currentDate=t}getDate(){return ut(this.currentDate)}reset(){this.startDate&&(this.currentDate=this.startDate)}tick(e){let t=this._multiplier*this._running;if(this.deltaTicks=e*t,this.active){let e=ft(this.currentDate,this.deltaTicks);t>0?this.endDate&&e>this.endDate?(this.currentDate=this.startDate,this.events.dispatch(this.events.end,this)):this.currentDate=e:this.startDate&&e<this.startDate?(this.currentDate=this.endDate,this.events.dispatch(this.events.end,this)):this.currentDate=e,this._intervalCallback&&this.currentDate-this._intervalStart>=this._intervalDelay&&(this._intervalStart=this.currentDate,this._intervalCallback(this)),this.events.dispatch(this.events.tick,this)}}isEqual(e){return this.__id===e.__id}start(){0===this._running&&(this._running=1,this.events.dispatch(this.events.start,this))}get multiplier(){return this._multiplier}set multiplier(e){this._multiplier=e}stop(){1===this._running&&(this._running=0,this.events.dispatch(this.events.stop,this))}}ka.__counter__=0;class Ra{constructor(e,t){this._program=t,this._handler=e,this._activated=!1}initialize(){this._handler.gl&&this._program.createProgram(this._handler.gl)}getProgram(){return this._program}activate(){if(!this._activated){this._handler.activeProgram.deactivate(),this._handler.activeProgram=this;let e=this._program;this._activated=!0,e.enableAttribArrays(),e.use()}return this}remove(){let e=this._handler.programs;e[this._program.name]&&(this._activated&&this.deactivate(),this._program.delete(),delete e[this._program.name])}deactivate(){this._program.disableAttribArrays(),this._activated=!1}isActive(){return this._activated}set(e){return this.activate(),this._program.set(e),this}drawIndexBuffer(e,t){return this._program.drawIndexBuffer(e,t),this}drawArrays(e,t){return this._program.drawArrays(e,t),this}}class za{constructor(){this.next=null,this.prev=null,this.data=null}}class Ia{constructor(e=256){this._current=new za,this._head=this._current;for(let t=0;t<e;t++){let e=new za;e.prev=this._current,this._current.next=e,this._current=e}this._current=this._head}current(){return this._current}push(e){this._current=this._current.next,this._current.data=e}pop(){let e=this._current.data;return this._current=this._current.prev,e}popPrev(){return this._current=this._current.prev,this._current.data}}const Fa=["","WEBKIT_","MOZ_"],Da=["webgl2","webgl"];class Na{constructor(e,t={}){this.framebufferStack=new Ia,this._requestAnimationFrameId=0,this.events=Tt(["visibilitychange","resize"]),this.defaultClock=new ka,this._clocks=[],this.deltaTime=0,this.canvas=null,this.gl=null,this.programs={},this.activeProgram=null,this._canvasSize=[0,0],this._params={anisotropy:t.anisotropy||4,width:t.width||256,height:t.height||256,pixelRatio:qe("og_dpi")||t.pixelRatio||1,extensions:t.extensions||[],context:t.context||{}},this._oneByHeight=1/(this._params.height*this._params.pixelRatio),this.extensions={},this._canvasTarget=e,this._lastAnimationFrameTime=0,this._initialized=!1,this._frameCallback=function(){},this.transparentTexture=null,this.defaultTexture=null,this.framebufferStack=new Ia,this.createTexture_n=this.createTexture_n_webgl2.bind(this),this.createTexture_l=this.createTexture_l_webgl2.bind(this),this.createTexture_mm=this.createTexture_mm_webgl2.bind(this),this.createTexture_a=this.createTexture_a_webgl2.bind(this),this.createTexture={NEAREST:this.createTexture_n,LINEAR:this.createTexture_l,MIPMAP:this.createTexture_mm,ANISOTROPIC:this.createTexture_a},this.createTextureDefault=this.createTexture_n,this.ONCANVASRESIZE=null,this._createCanvas(),(t.autoActivate||de(t.autoActivate))&&this.initialize()}isInitialized(){return this._initialized}_createCanvas(){this._canvasTarget?this._canvasTarget instanceof HTMLElement?this.canvas=this._canvasTarget:this.canvas=document.getElementById(this._canvasTarget)||document.querySelector(this._canvasTarget):(this.canvas=document.createElement("canvas"),this.canvas.width=this._params.width,this.canvas.height=this._params.height)}static getExtension(e,t){if(!e)return;let i,r;for(i in Fa)if(r=e.getExtension(Fa[i]+t),r)return r}static getContext(e,t){let i=null;try{let r=new URLSearchParams(location.search).get("og_ver");if(r)i=e.getContext(r,t),i&&(i.type=r);else for(let r=0;r<Da.length;r++)if(i=e.getContext(Da[r],t),i){i.type=Da[r];break}}catch(e){Ci.logErr("exception during the GL context initialization")}return i||Ci.logErr("could not initialise WebGL"),i}setFrameCallback(e){e&&(this._frameCallback=e)}createEmptyTexture2DExt(e=1,t=1,i="NEAREST",r="RGBA",n="RGBA",s="UNSIGNED_BYTE",a=0){let o=this.gl,l=o.createTexture();return o.bindTexture(o.TEXTURE_2D,l),o.texImage2D(o.TEXTURE_2D,a,o[r.toUpperCase()],e,t,0,o[n.toUpperCase()],o[s.toUpperCase()],null),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o[i.toUpperCase()]),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o[i.toUpperCase()]),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE),o.bindTexture(o.TEXTURE_2D,null),l}createEmptyTexture_n(e,t,i){let r=this.gl,n=r.createTexture();return r.bindTexture(r.TEXTURE_2D,n),r.texImage2D(r.TEXTURE_2D,0,i||r.RGBA,e,t,0,r.RGBA,r.UNSIGNED_BYTE,null),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),n}createEmptyTexture_l(e,t,i){let r=this.gl,n=r.createTexture();return r.bindTexture(r.TEXTURE_2D,n),r.texImage2D(r.TEXTURE_2D,0,i||r.RGBA,e,t,0,r.RGBA,r.UNSIGNED_BYTE,null),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),n}createTexture_n_webgl1(e,t,i=null){let r=this.gl;return i=i||r.createTexture(),r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,t||r.RGBA,r.RGBA,r.UNSIGNED_BYTE,e),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),i}createTexture_l_webgl1(e,t,i=null){let r=this.gl;return i=i||r.createTexture(),r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,t||r.RGBA,r.RGBA,r.UNSIGNED_BYTE,e),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),i}createTexture_mm_webgl1(e,t,i=null){let r=this.gl;return i=i||r.createTexture(),r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,t||r.RGBA,r.RGBA,r.UNSIGNED_BYTE,e),r.generateMipmap(r.TEXTURE_2D),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR_MIPMAP_LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),i}createTexture_a_webgl1(e,t,i=null){let r=this.gl;return i=i||r.createTexture(),r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,t||r.RGBA,r.RGBA,r.UNSIGNED_BYTE,e),r.generateMipmap(r.TEXTURE_2D),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR_MIPMAP_LINEAR),r.texParameterf(r.TEXTURE_2D,this.extensions.EXT_texture_filter_anisotropic.TEXTURE_MAX_ANISOTROPY_EXT,this._params.anisotropy),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),i}createTexture_n_webgl2(e,t,i=null){let r=this.gl;return i=i||r.createTexture(),r.bindTexture(r.TEXTURE_2D,i),r.texStorage2D(r.TEXTURE_2D,1,t||r.RGBA8,e.width,e.height),r.texSubImage2D(r.TEXTURE_2D,0,0,0,e.width,e.height,r.RGBA,r.UNSIGNED_BYTE,e),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),i}createTexture_l_webgl2(e,t,i=null){let r=this.gl;return i=i||r.createTexture(),r.bindTexture(r.TEXTURE_2D,i),r.texStorage2D(r.TEXTURE_2D,1,t||r.RGBA8,e.width,e.height),r.texSubImage2D(r.TEXTURE_2D,0,0,0,e.width,e.height,r.RGBA,r.UNSIGNED_BYTE,e),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),i}createTexture_mm_webgl2(e,t,i=null){let r=this.gl;return i=i||r.createTexture(),r.bindTexture(r.TEXTURE_2D,i),r.texStorage2D(r.TEXTURE_2D,2,t||r.RGBA8,e.width,e.height),r.texSubImage2D(r.TEXTURE_2D,0,0,0,e.width,e.height,r.RGBA,r.UNSIGNED_BYTE,e),r.generateMipmap(r.TEXTURE_2D),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR_MIPMAP_LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),i}createTexture_a_webgl2(e,t,i=null){let r=this.gl;return i=i||r.createTexture(),r.bindTexture(r.TEXTURE_2D,i),r.texStorage2D(r.TEXTURE_2D,2,t||r.RGBA8,e.width,e.height),r.texSubImage2D(r.TEXTURE_2D,0,0,0,e.width,e.height,r.RGBA,r.UNSIGNED_BYTE,e),r.generateMipmap(r.TEXTURE_2D),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR_MIPMAP_LINEAR),r.texParameterf(r.TEXTURE_2D,this.extensions.EXT_texture_filter_anisotropic.TEXTURE_MAX_ANISOTROPY_EXT,this._params.anisotropy),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),i}loadCubeMapTexture(e){let t=this.gl,i=t.createTexture();t.bindTexture(t.TEXTURE_CUBE_MAP,i),t.texParameteri(t.TEXTURE_CUBE_MAP,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_CUBE_MAP,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_CUBE_MAP,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_CUBE_MAP,t.TEXTURE_MAG_FILTER,t.LINEAR);let r=[[e.px,t.TEXTURE_CUBE_MAP_POSITIVE_X],[e.nx,t.TEXTURE_CUBE_MAP_NEGATIVE_X],[e.py,t.TEXTURE_CUBE_MAP_POSITIVE_Y],[e.ny,t.TEXTURE_CUBE_MAP_NEGATIVE_Y],[e.pz,t.TEXTURE_CUBE_MAP_POSITIVE_Z],[e.nz,t.TEXTURE_CUBE_MAP_NEGATIVE_Z]],n=new us;n.fillEmpty();let s=n.getImage();for(let e=0;e<r.length;e++){let n=r[e][1];t.bindTexture(t.TEXTURE_CUBE_MAP,i),t.texImage2D(n,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,s)}for(let e=0;e<r.length;e++){let n=r[e][1],s=new Image;s.crossOrigin="",s.onload=function(e,i,r){return function(){t&&e&&(t.bindTexture(t.TEXTURE_CUBE_MAP,e),t.texImage2D(i,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,r))}}(i,n,s),s.src=r[e][0]}return i}addProgram(e,t=!1){if(this.programs[e.name])console.warn(`Shader program: "${e.name}" already exists.`);else{let i=new Ra(this,e);this.programs[e.name]=i,this._initProgramController(i),t&&(i._activated=!1)}return e}removeProgram(e){this.programs[e]&&this.programs[e].remove()}addPrograms(e){for(let t=0;t<e.length;t++)this.addProgram(e[t])}_initProgramController(e){this._initialized&&(e.initialize(),this.activeProgram?(e.deactivate(),this.activeProgram._program.enableAttribArrays(),this.activeProgram._program.use()):(this.activeProgram=e,e.activate()))}_initPrograms(){for(let e in this.programs)this._initProgramController(this.programs[e])}initializeExtension(e,t=!1){if(!this.extensions||!this.extensions[e]){let i=Na.getExtension(this.gl,e);i?this.extensions[e]=i:t&&console.warn("og.webgl.Handler: extension '"+e+"' doesn't initialize.")}return this.extensions&&this.extensions[e]}initialize(){if(this._initialized)return;if(!this.canvas)return;if(this.gl=Na.getContext(this.canvas,this._params.context),!this.gl)return;this._initialized=!0,this._params.extensions.push("EXT_texture_filter_anisotropic"),"webgl"===this.gl.type?(this._params.extensions.push("OES_standard_derivatives"),this._params.extensions.push("OES_element_index_uint"),this._params.extensions.push("WEBGL_depth_texture"),this._params.extensions.push("ANGLE_instanced_arrays")):(this._params.extensions.push("EXT_color_buffer_float"),this._params.extensions.push("OES_texture_float_linear"));let e=this._params.extensions.length;for(;e--;)this.initializeExtension(this._params.extensions[e],!0);"webgl"===this.gl.type?(this.createTexture_n=this.createTexture_n_webgl1.bind(this),this.createTexture_l=this.createTexture_l_webgl1.bind(this),this.createTexture_mm=this.createTexture_mm_webgl1.bind(this),this.createTexture_a=this.createTexture_a_webgl1.bind(this)):(this.createTexture_n=this.createTexture_n_webgl2.bind(this),this.createTexture_l=this.createTexture_l_webgl2.bind(this),this.createTexture_mm=this.createTexture_mm_webgl2.bind(this),this.createTexture_a=this.createTexture_a_webgl2.bind(this)),this.createTexture.NEAREST=this.createTexture_n,this.createTexture.LINEAR=this.createTexture_l,this.createTexture.MIPMAP=this.createTexture_mm,this.createTexture.ANISOTROPIC=this.createTexture_a,this.extensions.EXT_texture_filter_anisotropic?this.createTextureDefault=this.createTexture_a:this.createTextureDefault=this.createTexture_mm,this._initPrograms(),this._setDefaults(),this.intersectionObserver=new IntersectionObserver((e=>{this._toggleVisibilityChange(e[0].isIntersecting)}),{threshold:0}),this.intersectionObserver.observe(this.canvas),this.resizeObserver=new ResizeObserver((e=>{this._toggleVisibilityChange(0!==e[0].contentRect.width&&0!==e[0].contentRect.height)})),this.resizeObserver.observe(this.canvas),document.addEventListener("visibilitychange",(()=>{this._toggleVisibilityChange("visible"===document.visibilityState)}))}_toggleVisibilityChange(e){e?(this.start(),this.ONCANVASRESIZE&&this.ONCANVASRESIZE(),this.events.dispatch(this.events.visibilitychange,!0)):(this.events.dispatch(this.events.visibilitychange,!1),this.stop())}_setDefaults(){let e=this.gl;e&&this.canvas&&(e.depthFunc(e.LESS),e.enable(e.DEPTH_TEST),this.setSize(this.canvas.clientWidth||this._params.width,this.canvas.clientHeight||this._params.height),e.frontFace(e.CCW),e.cullFace(e.BACK),e.enable(e.CULL_FACE),e.disable(e.BLEND),this.createDefaultTexture({color:"rgba(0,0,0,0.0)"},(e=>{this.transparentTexture=e})),this.createDefaultTexture({color:"rgba(255, 255, 255, 1.0)"},(e=>{this.defaultTexture=e})))}getCanvasSize(){return this._canvasSize}createStreamArrayBuffer(e,t,i,r=4){let n=this.gl,s=n.createBuffer();return n.bindBuffer(n.ARRAY_BUFFER,s),n.bufferData(n.ARRAY_BUFFER,t*e*r,i||n.STREAM_DRAW),n.bindBuffer(n.ARRAY_BUFFER,null),s.itemSize=e,s.numItems=t,s}setStreamArrayBuffer(e,t,i=0){let r=this.gl;return r.bindBuffer(r.ARRAY_BUFFER,e),r.bufferSubData(r.ARRAY_BUFFER,i,t),r.bindBuffer(r.ARRAY_BUFFER,null),e}createArrayBuffer(e,t,i,r){let n=this.gl,s=n.createBuffer();return n.bindBuffer(n.ARRAY_BUFFER,s),n.bufferData(n.ARRAY_BUFFER,e,r||n.STATIC_DRAW),n.bindBuffer(n.ARRAY_BUFFER,null),s.itemSize=t,s.numItems=i,s}createArrayBufferLength(e,t){let i=this.gl,r=i.createBuffer();return i.bindBuffer(i.ARRAY_BUFFER,r),i.bufferData(i.ARRAY_BUFFER,e,t||i.STATIC_DRAW),i.bindBuffer(i.ARRAY_BUFFER,null),r.itemSize=1,r.numItems=e,r}createElementArrayBuffer(e,t,i,r){let n=this.gl,s=n.createBuffer();return n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,s),n.bufferData(n.ELEMENT_ARRAY_BUFFER,e,r||n.STATIC_DRAW),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,null),s.itemSize=t,s.numItems=i||e.length,s}setSize(e,t){this._params.width=e,this._params.height=t,this.canvas&&(this.canvas.width=e*this._params.pixelRatio,this.canvas.height=t*this._params.pixelRatio,this._canvasSize[0]=this.canvas.width,this._canvasSize[1]=this.canvas.height,this._oneByHeight=1/this.canvas.height,this.gl&&this.gl.viewport(0,0,e,t),this.ONCANVASRESIZE&&this.ONCANVASRESIZE(this.canvas),this.events.dispatch(this.events.resize,this))}get pixelRatio(){return this._params.pixelRatio}set pixelRatio(e){this._params.pixelRatio=e,this.setSize(this._params.width,this._params.height)}getWidth(){return this.canvas?this.canvas.width:0}getHeight(){return this.canvas?this.canvas.height:0}getClientAspect(){return this.canvas?this.canvas.clientWidth/this.canvas.clientHeight:0}getCenter(){let e=this.canvas;return e?new le(Math.round(.5*e.width),Math.round(.5*e.height)):new le}drawFrame(){let e=window.performance.now();this.deltaTime=e-this._lastAnimationFrameTime,this._lastAnimationFrameTime=e,this.defaultClock.tick(this.deltaTime);for(let e=0;e<this._clocks.length;e++)this._clocks[e].tick(this.deltaTime);let t=this.canvas;Math.floor(t.clientWidth*this._params.pixelRatio)===t.width&&Math.floor(t.clientHeight*this._params.pixelRatio)===t.height||(0===t.clientWidth||0===t.clientHeight?this.stop():document.hidden||(this.start(),this.setSize(t.clientWidth,t.clientHeight))),this._frameCallback()}clearFrame(){let e=this.gl;e.clearColor(0,0,0,1),e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}start(){!this._requestAnimationFrameId&&this._initialized&&this._animationFrameCallback()}stop(){this._requestAnimationFrameId&&(window.cancelAnimationFrame(this._requestAnimationFrameId),this._requestAnimationFrameId=0)}isStopped(){return!this._requestAnimationFrameId}isWebGl2(){return!!this.gl&&"webgl2"===this.gl.type}_animationFrameCallback(){this._requestAnimationFrameId=window.requestAnimationFrame((()=>{this.drawFrame(),this._requestAnimationFrameId&&this._animationFrameCallback()}))}createDefaultTexture(e,t){let i,r;if(e&&e.color)i=new us(2,2),i.fillColor(e.color),r=this.createTexture_n(i.getCanvas()),r.default=!0,t(r);else if(e&&e.url){let i=new Image,n=this;i.onload=function(){r=n.createTextureDefault(i),r.default=!0,t(r)},i.src=e.url}else i=new us(2,2),i.fillColor("#C5C5C5"),r=this.createTexture_n(i.getCanvas()),r.default=!0,t(r)}deleteTexture(e){e&&!e.default&&this.gl.deleteTexture(e)}destroy(){this.resizeObserver?.disconnect(),this.intersectionObserver?.disconnect(),this.stop();for(let e in this.programs)this.removeProgram(e);let e=this.gl;if(e){e.deleteTexture(this.transparentTexture),this.transparentTexture=null,e.deleteTexture(this.defaultTexture),this.defaultTexture=null,this.framebufferStack=new Ia;let t=e.getParameter(e.MAX_VERTEX_ATTRIBS),i=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,i);for(let i=0;i<t;++i)e.disableVertexAttribArray(i),e.vertexAttribPointer(i,4,e.FLOAT,!1,0,0),e.vertexAttrib1f(i,0);e.deleteBuffer(i);let r=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS);for(let t=0;t<r;++t)e.activeTexture(e.TEXTURE0+t),e.bindTexture(e.TEXTURE_CUBE_MAP,null),e.bindTexture(e.TEXTURE_2D,null);e.activeTexture(e.TEXTURE0),e.useProgram(null),e.bindBuffer(e.ARRAY_BUFFER,null),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindRenderbuffer(e.RENDERBUFFER,null),e.disable(e.BLEND),e.disable(e.CULL_FACE),e.disable(e.DEPTH_TEST),e.disable(e.DITHER),e.disable(e.SCISSOR_TEST),e.blendColor(0,0,0,0),e.blendEquation(e.FUNC_ADD),e.blendFunc(e.ONE,e.ZERO),e.clearColor(0,0,0,0),e.clearDepth(1),e.clearStencil(-1)}this.canvas&&(this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.canvas.width=1,this.canvas.height=1,this.canvas=null),this.gl=null,this._initialized=!1}addClock(e){e.__handler||(e.__handler=this,this._clocks.push(e))}addClocks(e){for(let t=0;t<e.length;t++)this.addClock(e[t])}removeClock(e){if(e.__handler){let t=this._clocks,i=t.length;for(;i--;)if(t[i].isEqual(e)){e.__handler=null,t.splice(i,1);break}}}}class Ha extends _s{constructor(e,t={}){super(e,t),this._internalFormat=t.internalFormat?t.internalFormat.toUpperCase():"RGBA8",this._msaa=null!=t.msaa?t.msaa:4,this._glFilter=0,this.renderbuffers=new Array(this._size)}destroy(){let e=this.handler.gl;if(e){for(let t=0;t<this.renderbuffers.length;t++)e.deleteRenderbuffer(this.renderbuffers[t]);this.renderbuffers=new Array(this._size),e.deleteFramebuffer(this._fbo),e.deleteRenderbuffer(this._depthRenderbuffer),this._depthRenderbuffer=null,this._fbo=null,this._active=!1}}init(){let e=this.handler.gl;if(!e)return;this._glFilter=e[this._filter],this._fbo=e.createFramebuffer(),e.bindFramebuffer(e.FRAMEBUFFER,this._fbo);let t=[];for(let i=0;i<this.renderbuffers.length;i++){let r=e.createRenderbuffer();e.bindRenderbuffer(e.RENDERBUFFER,r),this._msaa>0?e.renderbufferStorageMultisample(e.RENDERBUFFER,this._msaa,e[this._internalFormat],this._width,this._height):e.renderbufferStorage(e.RENDERBUFFER,e[this._internalFormat],this._width,this._height),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+i,e.RENDERBUFFER,r),t.push(e.COLOR_ATTACHMENT0+i),this.renderbuffers[i]=r,e.bindRenderbuffer(e.RENDERBUFFER,null)}e.drawBuffers(t),this._useDepth&&(this._depthRenderbuffer=e.createRenderbuffer(),e.bindRenderbuffer(e.RENDERBUFFER,this._depthRenderbuffer),e.renderbufferStorageMultisample(e.RENDERBUFFER,this._msaa,e[this._depthComponent],this._width,this._height),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,this._depthRenderbuffer),e.bindRenderbuffer(e.RENDERBUFFER,null)),e.bindFramebuffer(e.FRAMEBUFFER,null)}blitTo(e,t=0){let i=this.handler.gl;i.bindFramebuffer(i.READ_FRAMEBUFFER,this._fbo),i.bindFramebuffer(i.DRAW_FRAMEBUFFER,e._fbo),i.readBuffer(i.COLOR_ATTACHMENT0+t),i.clearBufferfv(i.COLOR,0,[0,0,0,1]),i.blitFramebuffer(0,0,this._width,this._height,0,0,e._width,e._height,i.COLOR_BUFFER_BIT,this._glFilter),i.bindFramebuffer(i.FRAMEBUFFER,null),i.bindFramebuffer(i.READ_FRAMEBUFFER,null),i.bindFramebuffer(i.DRAW_FRAMEBUFFER,null)}}var Oa=Object.freeze({__proto__:null,Framebuffer:fs,Handler:Na,Multisample:Ha,Program:Si,types:Ai});const Va=function(e,t){return Number(e.priority<t.priority)};class Ua{constructor(){this._currentlyPressedKeys={},this._pressedKeysCallbacks={},this._unpressedKeysCallbacks={},this._charkeysCallbacks={},this._anykeyCallback=null,this._event=null,this._active=!0,this._stampCache={},document.onkeydown=e=>{this._event=e,this._active&&this.handleKeyDown()},document.onkeyup=e=>{this._event=e,this._active&&this.handleKeyUp()}}getcurrentlyPressedKeys(){return this._currentlyPressedKeys}getPressedKeysCallbacks(){return this._pressedKeysCallbacks}getUnpressedKeysCallbacks(){return this._unpressedKeysCallbacks}getCharkeysCallbacks(){return this._charkeysCallbacks}removeEvent(e,t,i){let r=this._getStamp(e,t,i._openglobus_id);i._openglobus_id&&this._stampCache[r]&&(delete this._stampCache[r],"keypress"===e?this._removeCallback(this._pressedKeysCallbacks[t],i):"keyfree"===e?this._removeCallback(this._unpressedKeysCallbacks[t],i):"charkeypress"===e&&this._removeCallback(this._charkeysCallbacks[t],i))}_removeCallback(e,t){for(let i=0;i<e.length;i++)e[i].callback._openglobus_id===t._openglobus_id&&e.splice(i,1)}_getStamp(e,t,i){return`${e}_${t}_${i}`}_stamp(e,t,i){const r=fe(i),n=this._getStamp(e,t,r);return!this._stampCache[n]&&(this._stampCache[n]=r,!0)}setActivity(e){this._active=e}releaseKeys(){this._currentlyPressedKeys={}}addEvent(e,t,i,r,n){if(this._stamp(e,t,i))switch(void 0===n&&(n=1600),e){case"keyfree":this._unpressedKeysCallbacks[t]||(this._unpressedKeysCallbacks[t]=[]),this._unpressedKeysCallbacks[t].push({callback:i,sender:r,priority:n}),this._unpressedKeysCallbacks[t].sort(Va);break;case"keypress":null==t?this._anykeyCallback={callback:i,sender:r||this}:(this._pressedKeysCallbacks[t]||(this._pressedKeysCallbacks[t]=[]),this._pressedKeysCallbacks[t].push({callback:i,sender:r,priority:n}),this._pressedKeysCallbacks[t].sort(Va));break;case"charkeypress":this._charkeysCallbacks[t]||(this._charkeysCallbacks[t]=[]),this._charkeysCallbacks[t].push({callback:i,sender:r,priority:n}),this._charkeysCallbacks[t].sort(Va)}}isKeyPressed(e){return this._currentlyPressedKeys[e]}handleKeyDown(){this._anykeyCallback&&this._anykeyCallback.callback.call(this._anykeyCallback.sender,this._event),this._currentlyPressedKeys[this._event.keyCode]=!0;for(let e in this._charkeysCallbacks)if(String.fromCharCode(this._event.keyCode)===String.fromCharCode(Number(e))){let t=this._charkeysCallbacks[e];for(let e=0;e<t.length;e++)t[e].callback.call(t[e].sender,this._event)}this._event.keyCode!=rn.KEY_ALT&&this._event.keyCode!=rn.KEY_SHIFT||this._event.preventDefault()}handleKeyUp(){if(this._currentlyPressedKeys[this._event.keyCode]||this._event.keyCode===rn.KEY_PRINTSCREEN)for(let e in this._unpressedKeysCallbacks)if(this._currentlyPressedKeys[e]||this._event.keyCode===rn.KEY_PRINTSCREEN&&Number(e)===rn.KEY_PRINTSCREEN){let t=this._unpressedKeysCallbacks[e];for(let e=0;e<t.length;e++)t[e].callback.call(t[e].sender,this._event)}this._currentlyPressedKeys[this._event.keyCode]=!1}handleEvents(){for(let e in this._pressedKeysCallbacks)if(this._currentlyPressedKeys[e]){let t=this._pressedKeysCallbacks[e];for(let e=0;e<t.length;e++)t[e].callback.call(t[e].sender,this._event)}}}class Ga{constructor(e){this._htmlObject=e}setEvent(e,t,i){switch(e){case"mousewheel":this._htmlObject.addEventListener("wheel",(function(e){let r=e.deltaY||e.detail||e.wheelDelta||0;null==e.wheelDelta&&(e.wheelDelta=-120*r),i.call(t,e),e.preventDefault()}),!1);break;case"mousedown":this._htmlObject.addEventListener("mousedown",(function(e){let r=this.getBoundingClientRect();i.call(t,e,{button:e.button,clientX:e.clientX-r.left,clientY:e.clientY-r.top})})),this._htmlObject.addEventListener("contextmenu",(function(e){return e.preventDefault(),!1}));break;case"mouseup":this._htmlObject.addEventListener("mouseup",(function(e){let r=this.getBoundingClientRect();i.call(t,e,{button:e.button,clientX:e.clientX-r.left,clientY:e.clientY-r.top})}));break;case"mousemove":this._htmlObject.addEventListener("mousemove",(function(e){let r=this.getBoundingClientRect();i.call(t,e,{clientX:e.clientX-r.left,clientY:e.clientY-r.top})}));break;case"mouseleave":this._htmlObject.addEventListener("mouseleave",(function(e){i.call(t,e)}));break;case"mouseout":this._htmlObject.addEventListener("mouseout",(function(e){i.call(t,e)}));break;case"mouseover":this._htmlObject.addEventListener("mouseover",(function(e){i.call(t,e)}));break;case"mouseenter":this._htmlObject.addEventListener("mouseenter",(function(e){i.call(t,e)}))}}}class Wa{constructor(e){this._htmlObject=e}setEvent(e,t,i){switch(e){case"touchcancel":this._htmlObject.addEventListener("touchcancel",(function(e){e.preventDefault();const r=this.getBoundingClientRect(),n=Object.assign(e,{offsetLeft:r.left,offsetTop:r.top});i.call(t,n)}));break;case"touchstart":this._htmlObject.addEventListener("touchstart",(function(e){e.preventDefault();const r=this.getBoundingClientRect(),n=Object.assign(e,{offsetLeft:r.left,offsetTop:r.top});i.call(t,n)}));break;case"touchend":this._htmlObject.addEventListener("touchend",(function(e){e.preventDefault();const r=this.getBoundingClientRect(),n=Object.assign(e,{offsetLeft:r.left,offsetTop:r.top});i.call(t,n)}));break;case"touchmove":this._htmlObject.addEventListener("touchmove",(function(e){e.preventDefault();const r=this.getBoundingClientRect(),n=Object.assign(e,{offsetLeft:r.left,offsetTop:r.top});i.call(t,n)}))}}}let ja=0;const Ya=e=>!(e[0]||e[1]||e[2]);let qa=new Uint8Array(4),Za=new Uint8Array(4),Xa=new Uint8Array(4);class $a extends Ct{constructor(e){super(Ka),this.renderer=e,this._touchHandler=new Wa(e.handler.canvas),this._mouseHandler=new Ga(e.handler.canvas),this._keyboardHandler=new Ua,this._active=!0,this.clickRadius=15,this.mouseState={clientX:0,clientY:0,pos:new le,x:0,y:0,nx:0,ny:0,prev_x:0,prev_y:0,direction:new oe,leftButtonUp:!1,rightButtonUp:!1,middleButtonUp:!1,leftButtonDown:!1,rightButtonDown:!1,middleButtonDown:!1,leftButtonHold:!1,rightButtonHold:!1,middleButtonHold:!1,leftButtonDoubleClick:!1,rightButtonDoubleClick:!1,middleButtonDoubleClick:!1,leftButtonClick:!1,rightButtonClick:!1,middleButtonClick:!1,moving:!1,justStopped:!1,doubleClickDelay:500,clickDelay:200,wheelDelta:0,sys:null,pickingObject:null,renderer:e},this.touchState={moving:!1,touchEnd:!1,touchStart:!1,touchCancel:!1,doubleTouch:!1,doubleTouchDelay:550,doubleTouchRadius:10,clientX:0,clientY:0,pos:new le,x:0,y:0,nx:0,ny:0,prev_x:0,prev_y:0,direction:new oe,sys:null,pickingObject:null,renderer:e},this._dblTchCoords=new le,this._oneTouchStart=!1,this._dblTchBegins=0,this._mousestopThread=null,this._ldblClkBegins=0,this._rdblClkBegins=0,this._mdblClkBegins=0,this._lClkBegins=0,this._rClkBegins=0,this._mClkBegins=0,this._lclickX=0,this._lclickY=0,this._rclickX=0,this._rclickY=0,this._mclickX=0,this._mclickY=0}pointerEvent(){let e=this.mouseState,t=this.touchState;return e.moving||e.justStopped||t.moving||t.touchStart||t.touchEnd||0!==e.wheelDelta}get active(){return this._active}set active(e){this._active=e,this._keyboardHandler.setActivity(e)}handleEvents(){this._active&&(this.mouseState.direction=this.renderer.activeCamera.unproject(this.mouseState.x,this.mouseState.y),this.touchState.direction=this.renderer.activeCamera.unproject(this.touchState.x,this.touchState.y),this._keyboardHandler.handleEvents(),this.handleMouseEvents(),this.handleTouchEvents(),this.entityPickingEvents())}on(e,t,i,r,n){"keypress"===e||"charkeypress"===e||"keyfree"===e?this._keyboardHandler.addEvent(e,t,i,r,n):super.on(e,t,i,r)}off(e,t,i){"keypress"===e||"charkeypress"===e||"keyfree"===e?this._keyboardHandler.removeEvent(e,t,i):super.off(e,t)}isKeyPressed(e){return this._keyboardHandler.isKeyPressed(e)}releaseKeys(){this._keyboardHandler.releaseKeys()}initialize(){this._mouseHandler.setEvent("mouseup",this,this.onMouseUp),this._mouseHandler.setEvent("mousemove",this,this.onMouseMove),this._mouseHandler.setEvent("mousedown",this,this.onMouseDown),this._mouseHandler.setEvent("mousewheel",this,this.onMouseWheel),this._mouseHandler.setEvent("mouseleave",this,this.onMouseLeave),this._mouseHandler.setEvent("mouseenter",this,this.onMouseEnter),this._touchHandler.setEvent("touchstart",this,this.onTouchStart),this._touchHandler.setEvent("touchend",this,this.onTouchEnd),this._touchHandler.setEvent("touchcancel",this,this.onTouchCancel),this._touchHandler.setEvent("touchmove",this,this.onTouchMove)}onMouseWheel(e){this.mouseState.sys=e,this.mouseState.wheelDelta=e.wheelDelta||0}updateButtonsStates(e){let t=this.mouseState;1&e&&t.leftButtonDown?t.leftButtonDown=!0:(t.leftButtonHold=!1,t.leftButtonDown=!1),2&e&&t.rightButtonDown?t.rightButtonDown=!0:(t.rightButtonHold=!1,t.rightButtonDown=!1),4&e&&t.middleButtonDown?t.middleButtonDown=!0:(t.middleButtonHold=!1,t.middleButtonDown=!1)}onMouseMove(e,t){let i=this.mouseState;this.updateButtonsStates(e.buttons),i.sys=e;let r=t.clientX,n=t.clientY,s=this.clickRadius;if(Math.abs(this._lclickX-r)>=s&&Math.abs(this._lclickY-n)>=s&&(this._ldblClkBegins=0,this._lClkBegins=0),Math.abs(this._rclickX-r)>=s&&Math.abs(this._rclickY-n)>=s&&(this._rdblClkBegins=0,this._rClkBegins=0),Math.abs(this._mclickX-r)>=s&&Math.abs(this._mclickY-n)>=s&&(this._mdblClkBegins=0,this._mClkBegins=0),i.clientX===t.clientX&&i.clientY===t.clientY)return;i.clientX=t.clientX,i.clientY=t.clientY;let a=this.renderer.handler;i.pos.x=i.x=t.clientX*a.pixelRatio,i.pos.y=i.y=t.clientY*a.pixelRatio,i.nx=i.x/a.canvas.width,i.ny=i.y/a.canvas.height,i.moving=!0,clearTimeout(this._mousestopThread),this._mousestopThread=setTimeout((function(){i.justStopped=!0}),100)}onMouseLeave(e){this.mouseState.sys=e,this.dispatch(this.mouseleave,this.mouseState)}onMouseEnter(e){this.mouseState.sys=e,this.dispatch(this.mouseenter,this.mouseState)}onMouseDown(e,t){t.button===rn.MB_LEFT?(this._lClkBegins=window.performance.now(),this._lclickX=t.clientX,this._lclickY=t.clientY,this.mouseState.sys=e,this.mouseState.leftButtonDown=!0):t.button===rn.MB_RIGHT?(this._rClkBegins=window.performance.now(),this._rclickX=t.clientX,this._rclickY=t.clientY,this.mouseState.sys=e,this.mouseState.rightButtonDown=!0):t.button===rn.MB_MIDDLE&&(this._mClkBegins=window.performance.now(),this._mclickX=t.clientX,this._mclickY=t.clientY,this.mouseState.sys=e,this.mouseState.middleButtonDown=!0)}onMouseUp(e,t){let i=this.mouseState;i.sys=e;let r=window.performance.now();if(t.button===rn.MB_LEFT){if(i.leftButtonDown=!1,i.leftButtonUp=!0,Math.abs(this._lclickX-t.clientX)<this.clickRadius&&Math.abs(this._lclickY-t.clientY)<this.clickRadius&&r-this._lClkBegins<=i.clickDelay){if(this._ldblClkBegins){window.performance.now()-this._ldblClkBegins<=i.doubleClickDelay&&(i.leftButtonDoubleClick=!0),this._ldblClkBegins=0}else this._ldblClkBegins=window.performance.now();i.leftButtonClick=!0,this._lClkBegins=0}}else if(t.button===rn.MB_RIGHT){if(i.rightButtonDown=!1,i.rightButtonUp=!0,Math.abs(this._rclickX-t.clientX)<this.clickRadius&&Math.abs(this._rclickY-t.clientY)<this.clickRadius&&r-this._rClkBegins<=i.clickDelay){if(this._rdblClkBegins){window.performance.now()-this._rdblClkBegins<=i.doubleClickDelay&&(i.rightButtonDoubleClick=!0),this._rdblClkBegins=0}else this._rdblClkBegins=window.performance.now();i.rightButtonClick=!0,this._rClkBegins=0}}else if(t.button===rn.MB_MIDDLE&&(i.middleButtonDown=!1,i.middleButtonUp=!0,Math.abs(this._mclickX-t.clientX)<this.clickRadius&&Math.abs(this._mclickY-t.clientY)<this.clickRadius&&r-this._mClkBegins<=i.clickDelay)){if(this._mdblClkBegins){window.performance.now()-this._mdblClkBegins<=i.doubleClickDelay&&(i.middleButtonDoubleClick=!0),this._mdblClkBegins=0}else this._mdblClkBegins=window.performance.now();i.middleButtonClick=!0,this._mClkBegins=0}}onTouchStart(e){let t=this.touchState;t.sys=e,t.clientX=e.touches.item(0).clientX-e.offsetLeft,t.clientY=e.touches.item(0).clientY-e.offsetTop;let i=this.renderer.handler;t.pos.x=t.x=t.clientX*i.pixelRatio,t.pos.y=t.y=t.clientY*i.pixelRatio,t.nx=t.x/i.canvas.width,t.ny=t.y/i.canvas.height,t.prev_x=t.x,t.prev_y=t.y,t.touchStart=!0,1===e.touches.length?(this._dblTchCoords.x=t.x,this._dblTchCoords.y=t.y,this._oneTouchStart=!0):this._oneTouchStart=!1}onTouchEnd(e){let t=this.touchState;if(t.sys=e,t.touchEnd=!0,0===e.touches.length&&(t.prev_x=t.x,t.prev_y=t.y,this._oneTouchStart)){if(this._dblTchBegins){window.performance.now()-this._dblTchBegins<=t.doubleTouchDelay&&(t.doubleTouch=!0),this._dblTchBegins=0}this._dblTchBegins=window.performance.now(),this._oneTouchStart=!1}}onTouchCancel(e){let t=this.touchState;t.sys=e,t.touchCancel=!0}onTouchMove(e){let t=this.touchState;t.clientX=e.touches.item(0).clientX-e.offsetLeft,t.clientY=e.touches.item(0).clientY-e.offsetTop;let i=this.renderer.handler;t.x=t.clientX*i.pixelRatio,t.y=t.clientY*i.pixelRatio,t.nx=t.x/i.canvas.width,t.ny=t.y/i.canvas.height,t.sys=e,t.moving=!0;let r=t.x-t.prev_x,n=t.y-t.prev_y;(Math.abs(r)>9||Math.abs(n)>9)&&(this._dblTchBegins=0,this._oneTouchStart=!1)}entityPickingEvents(){let e=this.touchState,t=this.mouseState;if(!(t.leftButtonHold||t.rightButtonHold||t.middleButtonHold)){let i=this.renderer,r=qa,n=Xa,s=Za;if(e.x||e.y?i.readPickingColor(e.nx,1-e.ny,s):i.readPickingColor(t.nx,1-t.ny,s),Ya(s)&&ja++<15)return;ja=0,n[0]=r[0],n[1]=r[1],n[2]=r[2],r[0]=s[0],r[1]=s[1],r[2]=s[2],t.pickingObject=null,e.pickingObject=null;let a=i.getPickingObjectArr(r);if(t.pickingObject=a,e.pickingObject=a,r[0]!==n[0]||r[1]!==n[1]||r[2]!==n[2])if(Ya(r)){let r=i.getPickingObjectArr(n);if(r){let i=r.rendererEvents;t.pickingObject=r,i&&i.dispatch(i.mouseleave,t),e.pickingObject=r,i&&i.dispatch(i.touchleave,e)}}else{if((e=>!!(e[0]||e[1]||e[2]))(n)){let r=i.getPickingObjectArr(n);if(r){let i=r.rendererEvents;t.pickingObject=r,i&&i.dispatch(i.mouseleave,t),e.pickingObject=r,i&&i.dispatch(i.touchleave,e)}}if(a){let i=a.rendererEvents;t.pickingObject=a,i&&i.dispatch(i.mouseenter,t),e.pickingObject=a,i&&i.dispatch(i.touchenter,e)}}}}handleMouseEvents(){let e=this,t=this.mouseState,i=t.pickingObject,r=null;t.leftButtonClick&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.lclick,t)),this.dispatch(e.lclick,t),t.leftButtonClick=!1),t.rightButtonClick&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.rclick,t)),this.dispatch(e.rclick,t),t.rightButtonClick=!1),t.middleButtonClick&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.mclick,t)),this.dispatch(e.mclick,t),t.middleButtonClick=!1),t.leftButtonDown&&(t.leftButtonHold?(i&&(r=i.rendererEvents,r&&r.dispatch(r.lhold,t)),this.dispatch(e.lhold,t)):(t.leftButtonHold=!0,i&&(r=i.rendererEvents,r&&r.dispatch(r.ldown,t)),this.dispatch(e.ldown,t))),t.rightButtonDown&&(t.rightButtonHold?(i&&(r=i.rendererEvents,r&&r.dispatch(r.rhold,t)),this.dispatch(e.rhold,t)):(t.rightButtonHold=!0,i&&(r=i.rendererEvents,r&&r.dispatch(r.rdown,t)),this.dispatch(e.rdown,t))),t.middleButtonDown&&(t.middleButtonHold?(i&&(r=i.rendererEvents,r&&r.dispatch(r.mhold,t)),this.dispatch(e.mhold,t)):(t.middleButtonHold=!0,i&&(r=i.rendererEvents,r&&r.dispatch(r.mdown,t)),this.dispatch(e.mdown,t))),t.leftButtonUp&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.lup,t)),this.dispatch(e.lup,t),t.leftButtonUp=!1,t.leftButtonHold=!1),t.rightButtonUp&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.rup,t)),this.dispatch(e.rup,t),t.rightButtonUp=!1,t.rightButtonHold=!1),t.middleButtonUp&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.mup,t)),this.dispatch(e.mup,t),t.middleButtonUp=!1,t.middleButtonHold=!1),t.leftButtonDoubleClick&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.ldblclick,t)),this.dispatch(e.ldblclick,t),t.leftButtonDoubleClick=!1),t.rightButtonDoubleClick&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.rdblclick,t)),this.dispatch(e.rdblclick,t),t.rightButtonDoubleClick=!1),t.middleButtonDoubleClick&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.mdblclick,t)),this.dispatch(e.mdblclick,t),t.middleButtonDoubleClick=!1),t.wheelDelta&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.mousewheel,t)),this.dispatch(e.mousewheel,t)),t.moving&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.mousemove,t)),this.dispatch(e.mousemove,t),t.prev_x=t.x,t.prev_y=t.y),t.justStopped&&this.dispatch(e.mousestop,t)}handleTouchEvents(){let e=this,t=this.touchState,i=t.pickingObject,r=null;if(t.touchCancel&&(this.dispatch(e.touchcancel,t),t.touchCancel=!1),t.touchStart){let n=this.renderer;n.pickingFramebuffer.activate(),n.pickingFramebuffer.readPixels(qa,t.nx,1-t.ny,1),n.pickingFramebuffer.deactivate();let s=n.getPickingObjectArr(qa);i=t.pickingObject=s,i&&(r=i.rendererEvents,r&&r.dispatch(r.touchstart,t)),this.dispatch(e.touchstart,t),t.touchStart=!1}t.doubleTouch&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.doubletouch,t)),this.dispatch(e.doubletouch,t),t.doubleTouch=!1),t.touchEnd&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.touchend,t)),this.dispatch(e.touchend,t),t.x=0,t.y=0,t.touchEnd=!1),t.moving&&(i&&(r=i.rendererEvents,r&&r.dispatch(r.touchmove,t)),this.dispatch(e.touchmove,t),t.prev_x=t.x,t.prev_y=t.y)}}const Ka=["draw","postdraw","resize","resizeend","mouseenter","mouseleave","mousemove","mousestop","lclick","rclick","mclick","ldblclick","rdblclick","mdblclick","lup","rup","mup","ldown","rdown","mdown","lhold","rhold","mhold","mousewheel","touchstart","touchend","touchcancel","touchmove","doubletouch","touchleave","touchenter"];class Qa{constructor(){this.resolve=()=>{},this.reject=()=>{},this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t})),Object.freeze(this)}}class Ja{constructor(e=0,t=0,i=0,r=0){this.left=e,this.right=i,this.top=t,this.bottom=r}set(e=0,t=0,i=0,r=0){this.left=e,this.right=i,this.top=t,this.bottom=r}clone(){return new Ja(this.left,this.top,this.right,this.bottom)}getWidth(){return Math.abs(this.right-this.left)}getHeight(){return Math.abs(this.bottom-this.top)}getSquare(){return this.getHeight()*this.getWidth()}getDiagonal(){let e=this.getWidth(),t=this.getHeight();return Math.sqrt(t*t+e*e)}fit(e,t){return this.getWidth()===e&&this.getHeight()===t}isInside(e,t){return e>=this.left&&e<=this.right&&t>=this.top&&t<=this.bottom}}class eo{constructor(){this.imagesCache={},this._counter=0,this._pendingsQueue=new Er,this._imageIndexCounter=0}load(e,t){if(this.imagesCache[e])t(this.imagesCache[e]);else{let i={src:e,success:t};this._counter>=1?this._pendingsQueue.unshift(i):this._exec(i)}}_exec(e){this._counter++;const t=this;let i=new Image;i.crossOrigin="",i.onload=function(){t.imagesCache[e.src]=i,i.__nodeIndex=t._imageIndexCounter++,e.success(i),t._dequeueRequest()},i.onerror=function(){t._dequeueRequest()},i.src=e.src}_dequeueRequest(){if(this._counter--,this._pendingsQueue.length&&this._counter<1)for(;this._pendingsQueue.length;){let e=this._pendingsQueue.pop();if(e){if(!this.imagesCache[e.src]){this._exec(e);break}this._counter<=0?this._counter=0:this._counter--,e.success(this.imagesCache[e.src])}}}}class to{constructor(e=1024,t=1024){this.nodes=new Map,this.texture=null,this.canvas=new us(e,t),this.clearCanvas(),this._handler=null,this._images=[],this._btree=null,this._imagesCacheManager=new eo,this.borderSize=4}getImage(){return this.canvas.getImage()}getCanvas(){return this.canvas.getCanvas()}clearCanvas(){this.canvas.fillEmpty()}assignHandler(e){this._handler=e,this.createTexture()}getDiagonal(e){let t=e.atlasWidth||e.width,i=e.atlasHeight||e.height;return Math.sqrt(t*t+i*i)}addImage(e,t=!1){if(e.width&&e.height)return this._images.push(e),this._makeAtlas(t),null!=e.__nodeIndex?this.get(e.__nodeIndex):void 0}_completeNode(e,t){if(t){let i=this.canvas.getWidth(),r=this.canvas.getHeight(),n=t.image,s=t.rect,a=Math.round(.5*this.borderSize);this.canvas.drawImage(n,s.left+a,s.top+a,n.atlasWidth||0,n.atlasHeight||0);let o=t.texCoords;o[0]=(s.left+a)/i,o[1]=(s.top+a)/r,o[2]=(s.left+a)/i,o[3]=(s.bottom-a)/r,o[4]=(s.right-a)/i,o[5]=(s.bottom-a)/r,o[6]=(s.right-a)/i,o[7]=(s.bottom-a)/r,o[8]=(s.right-a)/i,o[9]=(s.top+a)/r,o[10]=(s.left+a)/i,o[11]=(s.top+a)/r,e.set(n.__nodeIndex,t)}}_makeAtlas(e=!1){if(e&&this._btree){let e=this._images[this._images.length-1];this._completeNode(this.nodes,this._btree.insert(e))}else{let e=this._images.slice(0);e.sort((function(e,t){return(t.atlasWidth||t.width)-(e.atlasWidth||e.width)||(t.atlasHeight||t.height)-(e.atlasHeight||e.height)})),this._btree=new io(new Ja(0,0,this.canvas.getWidth(),this.canvas.getHeight())),this._btree.atlas=this,this.clearCanvas();let t=new Map;for(let i=0;i<e.length;i++)this._completeNode(t,this._btree.insert(e[i]));this.nodes=null,this.nodes=t}}get(e){return this.nodes.get(e)}set(e,t){this.nodes.set(e,t)}createTexture(e,t){this._handler&&(this._handler.gl.deleteTexture(this.texture),e&&(this.canvas.resize(e.width,e.height),this.canvas.drawImage(e,0,0,e.width,e.height)),this.texture=this._handler.createTexture_l(this.canvas.getCanvas(),t))}loadImage(e,t){this._imagesCacheManager.load(e,t)}getImageTexCoordinates(e){if(null!=e.__nodeIndex){let t=this.get(e.__nodeIndex);if(t)return t.texCoords}}}class io{constructor(e,t){this.childNodes=null,this.image=null,this.rect=e||new Ja,this.texCoords=t||[],this.atlas=null}insert(e){if(this.childNodes){let t=this.childNodes[0].insert(e);return t||this.childNodes[1].insert(e)}{if(null!=this.image)return;let t=this.rect;const i=(e.atlasWidth||e.width)+this.atlas.borderSize,r=(e.atlasHeight||e.height)+this.atlas.borderSize;if(i>t.getWidth()||r>t.getHeight())return;if(t.fit(i,r))return this.image=e,this;this.childNodes=new Array(2),this.childNodes[0]=new io,this.childNodes[0].atlas=this.atlas,this.childNodes[1]=new io,this.childNodes[1].atlas=this.atlas;return t.getWidth()-i>t.getHeight()-r?(this.childNodes[0].rect.set(t.left,t.top,t.left+i,t.bottom),this.childNodes[1].rect.set(t.left+i,t.top,t.right,t.bottom)):(this.childNodes[0].rect.set(t.left,t.top,t.right,t.top+r),this.childNodes[1].rect.set(t.left,t.top+r,t.right,t.bottom)),this.childNodes[0].insert(e)}}}class ro extends to{constructor(e,t){super(e,t),this.width=0,this.height=0,this.gliphSize=0,this.distanceRange=0,this.nodes=new Map,this.kernings={}}get(e){return this.nodes.get(e)}}class no extends io{constructor(e,t){super(e,t),this.emptySize=1,this.metrics={id:0,char:"",width:0,height:0,x:0,y:0,chnl:0,index:0,page:0,xadvance:0,xoffset:0,yoffset:0,nChar:"",nCode:0,nWidth:0,nHeight:0,nAdvance:0,nXOffset:0,nYOffset:0}}}class so{constructor(e){this.atlasesArr=[],this.atlasIndexes={},this.atlasIndexesDeferred={},this.tokenImageSize=64,this.samplerArr=new Uint32Array(11),this.sdfParamsArr=new Float32Array(44),this._handler=null,this.catalogSrc=e||"./"}assignHandler(e){this._handler=e}getFontIndex(e){let t=this.getFullIndex(e);return this.atlasIndexes[t]||this.loadFont(t,this.catalogSrc,`${t}.json`),this.atlasIndexesDeferred[t]||(this.atlasIndexesDeferred[t]=new Qa),this.atlasIndexesDeferred[t].promise}getFullIndex(e){return e.trim().toLowerCase()}_applyFontDataToAtlas(e,t,i=0){let r=t.chars;e.height=t.common.scaleH,e.width=t.common.scaleW,e.gliphSize=t.info.size,e.distanceRange=t.distanceField.distanceRange;let n=e.width,s=e.height,a=e.gliphSize;this.sdfParamsArr[4*i]=n,this.sdfParamsArr[4*i+1]=s,this.sdfParamsArr[4*i+2]=a,this.sdfParamsArr[4*i+3]=e.distanceRange;let o={};for(let t=0;t<r.length;t++){let i=r[t],l=i.char;o[i.id]=l;let h=new Ja(i.x,i.y,i.x+i.width,i.y+i.height),c=new Array(12);c[0]=h.left/n,c[1]=h.top/s,c[2]=h.left/n,c[3]=h.bottom/s,c[4]=h.right/n,c[5]=h.bottom/s,c[6]=h.right/n,c[7]=h.bottom/s,c[8]=h.right/n,c[9]=h.top/s,c[10]=h.left/n,c[11]=h.top/s;let d=new no(h,c),_=i.char.normalize("NFKC"),u=_.charCodeAt(0),f=d.metrics;f.id=i.id,f.char=i.char,f.width=i.width,f.height=i.height,f.x=i.x,f.y=i.y,f.chnl=i.chnl,f.index=i.index,f.page=i.page,f.xadvance=i.xadvance,f.xoffset=i.xoffset,f.yoffset=i.yoffset,f.nChar=_,f.nCode=u,f.nWidth=d.metrics.width/a,f.nHeight=d.metrics.height/a,f.nAdvance=d.metrics.xadvance/a,f.nXOffset=d.metrics.xoffset/a,f.nYOffset=1-d.metrics.yoffset/a,d.emptySize=1,e.nodes.set(_.charCodeAt(0),d)}e.kernings={};for(let i=0;i<t.kernings.length;i++){let r=t.kernings[i],n=r.first,s=r.second;e.kernings[n]||(e.kernings[n]={}),e.kernings[n][s]=r.amount/a}}initFont(e,t,i){let r=this.atlasesArr.length,n=this.getFullIndex(e);this.atlasIndexes[n]=r;let s=this.atlasIndexesDeferred[n];s||(s=this.atlasIndexesDeferred[n]=new Qa),this.samplerArr[this.atlasesArr.length]=r;let a=new ro;a.height=0,a.width=0,a.gliphSize=0,a.distanceRange=0,a.kernings={},a.assignHandler(this._handler),this.atlasesArr[r]=a,this._applyFontDataToAtlas(a,t,r);let o=new Image;o.onload=()=>{this._createTexture(a,o),s.resolve(r)},o.src=i}_createTexture(e,t){e.createTexture(t)}loadFont(e,t,i){let r=this.atlasesArr.length,n=this.getFullIndex(e);this.atlasIndexes[n]=r;let s=this.atlasIndexesDeferred[n];s||(s=this.atlasIndexesDeferred[n]=new Qa),this.samplerArr[this.atlasesArr.length]=r;let a=new ro;a.height=0,a.width=0,a.gliphSize=0,a.distanceRange=0,a.kernings={},a.assignHandler(this._handler),this.atlasesArr[r]=a,fetch(`${t}/${i}`).then((e=>{if(!e.ok)throw Error(`Unable to load "${t}/${i}"`);return e.json()})).then((e=>{this._applyFontDataToAtlas(a,e,r);let i=new Image;i.onload=()=>{this._createTexture(a,i),s.resolve(r)},i.src=`${t}/${e.pages[0]}`,i.crossOrigin="Anonymous"})).catch((e=>(s.reject(),{status:"error",msg:e.toString()})))}}let ao,oo=0,lo=0,ho=0;class co{constructor(e,t={}){if(this.div=null,this.handler=e,this.exposure=3.01,this.gamma=.47,this.whitepoint=1,this.brightThreshold=.9,this._renderNodesArr=[],this.renderNodes={},this.activeCamera=null,this.events=new $a(this),this.controls={},t.controls)for(let e in t.controls)this.controls[t.controls[e].name]=t.controls[e];this.controlsBag={},this.colorObjects=new Map,this._pickingCallbacks=[],this.pickingFramebuffer=null,this._tempPickingPix_=new Uint8Array([]),this.distanceFramebuffer=null,this._distanceCallbacks=[],this._tempDistancePix_=new Uint8Array([]),this._depthCallbacks=[],this.depthFramebuffer=null;let i=new URLSearchParams(location.search),r=i.get("og_msaa");this._msaa=r?Number(i.get("og_msaa")):null!=t.msaa?t.msaa:0,this._internalFormat="RGBA16F",this._format="RGBA",this._type="FLOAT",this.sceneFramebuffer=null,this.blitFramebuffer=null,this.toneMappingFramebuffer=null,this._initialized=!1,this.billboardsTextureAtlas=new to,this.geoObjectsTextureAtlas=new to,this.fontAtlas=new so(t.fontsSrc),this._entityCollections=[],this._currentOutput="screen",this._fnScreenFrame=null,this.labelWorker=new Kt(4),this.__useDistanceFramebuffer__=!0,this.screenDepthFramebuffer=null,this.screenFramePositionBuffer=null,this.screenTexture={},this.outputTexture=null,this._pickingMaskCoordinatesBuffer=null,(t.autoActivate||de(t.autoActivate))&&this.start()}enableBlendOneSrcAlpha(){let e=this.handler.gl;e.enable(e.BLEND),e.blendEquation(e.FUNC_ADD),e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA)}enableBlendDefault(){let e=this.handler.gl;e.enable(e.BLEND),e.blendEquation(e.FUNC_ADD),e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE)}setEventsActivity(e){this.events.active=e}addDepthCallback(e,t){let i=lo++;return this._depthCallbacks.push({id:i,callback:t,sender:e}),i}removeDepthCallback(e){for(let t=0;t<this._depthCallbacks.length;t++)if(e===this._depthCallbacks[t].id){this._depthCallbacks.splice(t,1);break}}addDistanceCallback(e,t){let i=ho++;return this._distanceCallbacks.push({id:i,callback:t,sender:e}),i}removeDistanceCallback(e){for(let t=0;t<this._distanceCallbacks.length;t++)if(e===this._distanceCallbacks[t].id){this._distanceCallbacks.splice(t,1);break}}addPickingCallback(e,t){let i=oo++;return this._pickingCallbacks.push({id:i,callback:t,sender:e}),i}removePickingCallback(e){for(let t=0;t<this._pickingCallbacks.length;t++)if(e===this._pickingCallbacks[t].id){this._pickingCallbacks.splice(t,1);break}}getPickingObject(e,t,i){return this.colorObjects.get(`${e}_${t}_${i}`)}getPickingObjectArr(e){return this.colorObjects.get(`${e[0]}_${e[1]}_${e[2]}`)}getPickingObject3v(e){return this.colorObjects.get(`${e.x}_${e.y}_${e.z}`)}assignPickingColor(e){if(!e._pickingColor||e._pickingColor.isZero()){let t=0,i=0,r=0,n="0_0_0";for(;!(t||i||r)||this.colorObjects.has(n);)t=y(1,255),i=y(1,255),r=y(1,255),n=`${t}_${i}_${r}`;e._pickingColor?e._pickingColor.set(t,i,r):e._pickingColor=new oe(t,i,r),e._pickingColorU=new Float32Array([t/255,i/255,r/255]),this.colorObjects.set(n,e)}}clearPickingColor(e){if(e._pickingColor&&!e._pickingColor.isZero()){let t=e._pickingColor;t.isZero()||(this.colorObjects.delete(`${t.x}_${t.y}_${t.z}`),t.x=t.y=t.z=0)}}getWidth(){return this.handler.canvas.clientWidth}getHeight(){return this.handler.canvas.clientHeight}getCenter(){let e=this.handler.canvas;return new le(Math.round(.5*e.width),Math.round(.5*e.height))}getClientCenter(){let e=this.handler.canvas;return new le(Math.round(.5*e.clientWidth),Math.round(.5*e.clientHeight))}addControl(e){e.addTo(this)}addControls(e){for(let t=0;t<e.length;t++)e[t].addTo(this)}removeControl(e){e.remove()}isInitialized(){return this._initialized}initialize(){if(!this._initialized){if(this._initialized=!0,this.handler.initialize(),this.billboardsTextureAtlas.assignHandler(this.handler),this.geoObjectsTextureAtlas.assignHandler(this.handler),this.fontAtlas.assignHandler(this.handler),this.handler.setFrameCallback((()=>{this.draw()})),this.activeCamera=new ia(this,{eye:new oe(0,0,0),look:new oe(0,0,-1),up:new oe(0,1,0)}),this.events.initialize(),this.events.on("charkeypress",rn.KEY_APOSTROPHE,(function(){Ci.setVisibility(!Ci.getVisibility())})),this.handler.addProgram(new Si("screenFrame",{uniforms:{texture:"sampler2d"},attributes:{corners:"vec3"},vertexShader:"attribute vec2 corners;\n \n varying vec2 tc;\n void main(void) {\n gl_Position = vec4(corners, 0.0, 1.0);\n tc = corners * 0.5 + 0.5;\n }",fragmentShader:"precision highp float;\n uniform sampler2D texture;\n \n varying vec2 tc;\n \n void main(void) {\n gl_FragColor = texture2D( texture, tc );\n }"})),this.pickingFramebuffer=new fs(this.handler,{width:640,height:480,depthComponent:"DEPTH_STENCIL",renderbufferTarget:"DEPTH_STENCIL_ATTACHMENT"}),this.pickingFramebuffer.init(),this._tempPickingPix_=new Uint8Array(this.pickingFramebuffer.width*this.pickingFramebuffer.height*4),this.distanceFramebuffer=new fs(this.handler,{width:320,height:240}),this.distanceFramebuffer.init(),this._tempDistancePix_=new Uint8Array(this.distanceFramebuffer.width*this.distanceFramebuffer.height*4),this.depthFramebuffer=new fs(this.handler,{size:2,internalFormat:["RGBA","DEPTH_COMPONENT24"],format:["RGBA","DEPTH_COMPONENT"],type:["UNSIGNED_BYTE","UNSIGNED_INT"],attachment:["COLOR_ATTACHMENT","DEPTH_ATTACHMENT"],useDepth:!1}),this.depthFramebuffer.init(),this.screenDepthFramebuffer=new fs(this.handler,{useDepth:!1}),this.screenDepthFramebuffer.init(),"webgl"===this.handler.gl.type)this.sceneFramebuffer=new fs(this.handler),this.sceneFramebuffer.init(),this._fnScreenFrame=this._screenFrameNoMSAA,this.screenTexture={screen:this.sceneFramebuffer.textures[0],picking:this.pickingFramebuffer.textures[0],distance:this.distanceFramebuffer.textures[0],depth:this.screenDepthFramebuffer.textures[0]};else{let e=this.getMaxMSAA(this._internalFormat);this._msaa>e&&(this._msaa=e),this.handler.addPrograms([new Si("toneMapping",{uniforms:{hdrBuffer:"sampler2d",exposure:"float",gamma:"float",whitepoint:"float"},attributes:{corners:"vec3"},vertexShader:"#version 300 es\n \n in vec2 corners;\n \n out vec2 tc;\n\n void main(void) {\n gl_Position = vec4(corners, 0.0, 1.0);\n tc = corners * 0.5 + 0.5;\n }",fragmentShader:"#version 300 es\n\n precision highp float;\n\n #ifndef saturate\n #define saturate(a) clamp(a, 0.0, 1.0)\n #endif\n\n uniform sampler2D hdrBuffer;\n\n uniform float whitepoint;\n uniform float exposure;\n uniform float gamma;\n\n vec3 LinearToneMapping(vec3 color) {\n return exposure * color;\n }\n\n vec3 ReinhardToneMapping2(vec3 color) {\n return vec3(1.0) - exp(-color * exposure);\n }\n\n vec3 ReinhardToneMapping(vec3 color) {\n color *= exposure;\n return saturate(color / (vec3(1.0) + color));\n }\n\n #define Uncharted2Helper(x) max(((x * (0.15 * x + 0.10 * 0.50) + 0.20 * 0.02) / (x * (0.15 * x + 0.50) + 0.20 * 0.30)) - 0.02 / 0.30, vec3(0.0))\n\n vec3 Uncharted2ToneMapping(vec3 color) {\n color *= exposure;\n return saturate(Uncharted2Helper(color) / Uncharted2Helper(vec3(whitepoint)));\n }\n\n vec3 OptimizedCineonToneMapping(vec3 color) {\n color *= exposure;\n color = max(vec3(0.0), color - 0.004);\n return pow((color * (6.2 * color + 0.5)) / (color * (6.2 * color + 1.7) + 0.06), vec3(2.2));\n }\n\n vec3 ACESFilmicToneMapping(vec3 color) {\n color *= exposure;\n return saturate((color * (2.51 * color + 0.03)) / (color * (2.43 * color + 0.59) + 0.14));\n }\n\n in vec2 tc;\n\n layout(location = 0) out vec4 fragColor;\n \n void main(void) {\n vec4 hdrColor = texture(hdrBuffer, tc).rgba;\n \n float oneByGamma = gamma / gamma;\n float oneByWhitePoint = whitepoint / whitepoint;\n vec3 mapped = ReinhardToneMapping2(hdrColor.rgb) * oneByGamma * oneByWhitePoint;\n //vec3 mapped = ACESFilmicToneMapping(hdrColor.rgb) * oneByGamma * oneByWhitePoint;\n\n mapped = pow(mapped, vec3(1.0 / gamma));\n \n fragColor = vec4(mapped, hdrColor.a);\n }"})]),this.handler.addPrograms([new Si("depth",{uniforms:{depthTexture:"sampler2d"},attributes:{corners:"vec2"},vertexShader:"#version 300 es\n \n in vec2 corners;\n \n out vec2 tc;\n\n void main(void) {\n gl_Position = vec4(corners, 0.0, 1.0);\n tc = corners * 0.5 + 0.5;\n }",fragmentShader:"#version 300 es\n\n precision highp float;\n\n #define MAX_FRUSTUMS 4\n\n uniform sampler2D depthTexture;\n \n in vec2 tc;\n\n layout(location = 0) out vec4 fragColor;\n\n float LinearizeDepth(in vec2 uv)\n {\n float depth = texture(depthTexture, tc).x;\n return depth;//(2.0 * zNear) / (zFar + zNear - depth * (zFar - zNear));\n }\n \n void main(void) {\n float c = LinearizeDepth(tc);\n fragColor = vec4(c, c, c, 1.0);\n }"})]),this.sceneFramebuffer=new Ha(this.handler,{size:1,msaa:this._msaa,internalFormat:this._internalFormat,filter:"LINEAR"}),this.sceneFramebuffer.init(),this.blitFramebuffer=new fs(this.handler,{size:1,useDepth:!1,internalFormat:this._internalFormat,format:this._format,type:this._type,filter:"NEAREST"}),this.blitFramebuffer.init(),this.toneMappingFramebuffer=new fs(this.handler,{useDepth:!1}),this.toneMappingFramebuffer.init(),this._fnScreenFrame=this._screenFrameMSAA,this.screenTexture={screen:this.toneMappingFramebuffer.textures[0],picking:this.pickingFramebuffer.textures[0],distance:this.distanceFramebuffer.textures[0],depth:this.screenDepthFramebuffer.textures[0],frustum:this.depthFramebuffer.textures[0]}}this.handler.addProgram(new Si("pickingMask",{uniforms:{offset:"vec2"},attributes:{coordinates:"vec2"},vertexShader:"attribute vec2 coordinates;\n uniform vec2 offset;\n void main() {\n \n gl_Position = vec4(coordinates + offset, 0.0, 1.0);\n gl_PointSize = 5.0;\n }",fragmentShader:"precision highp float;\n void main(void) {\n gl_FragColor = vec4(1.0);\n }"})),this.handler.ONCANVASRESIZE=()=>{this._resizeStart(),this.events.dispatch(this.events.resize,this.handler.canvas),clearTimeout(ao),ao=setTimeout((()=>{this._resizeEnd(),this.events.dispatch(this.events.resizeend,this.handler.canvas)}),320)},this.screenFramePositionBuffer=this.handler.createArrayBuffer(new Float32Array([1,1,-1,1,1,-1,-1,-1]),2,4),this.outputTexture=this.screenTexture.screen,this._pickingMaskCoordinatesBuffer=this.handler.createArrayBuffer(new Float32Array([0,0]),2,1),this._initializeRenderNodes(),this._initializeControls()}}_initializeControls(){let e=this.controls;this.controls={};for(let t in e)this.addControl(e[t])}resize(){this._resizeEnd()}setCurrentScreen(e){this._currentOutput=e,this.screenTexture[e]&&(this.outputTexture=this.screenTexture[e])}_resizeStart(){let e=this.handler.canvas;this.activeCamera.setAspectRatio(e.width/e.height),this.sceneFramebuffer.setSize(.5*e.width,.5*e.height),this.blitFramebuffer&&this.blitFramebuffer.setSize(.5*e.width,.5*e.height,!0)}_resizeEnd(){let e=this.handler.canvas;this.activeCamera.setAspectRatio(e.width/e.height),this.sceneFramebuffer.setSize(e.width,e.height),this.blitFramebuffer&&this.blitFramebuffer.setSize(e.width,e.height,!0),this.toneMappingFramebuffer&&this.toneMappingFramebuffer.setSize(e.width,e.height,!0),this.depthFramebuffer&&this.depthFramebuffer.setSize(e.clientWidth,e.clientHeight,!0),this.screenDepthFramebuffer&&this.screenDepthFramebuffer.setSize(e.clientWidth,e.clientHeight,!0),"webgl"===this.handler.gl.type?(this.screenTexture.screen=this.sceneFramebuffer.textures[0],this.screenTexture.picking=this.pickingFramebuffer.textures[0],this.screenTexture.distance=this.distanceFramebuffer.textures[0],this.screenTexture.depth=this.screenDepthFramebuffer.textures[0],this.screenTexture.frustum=this.depthFramebuffer.textures[0]):(this.screenTexture.screen=this.toneMappingFramebuffer.textures[0],this.screenTexture.picking=this.pickingFramebuffer.textures[0],this.screenTexture.distance=this.distanceFramebuffer.textures[0],this.screenTexture.depth=this.screenDepthFramebuffer.textures[0],this.screenTexture.frustum=this.depthFramebuffer.textures[0]),this.setCurrentScreen(this._currentOutput)}removeNode(e){e.remove()}addNode(e){this.renderNodes[e.name]?Ci.logWrn(`Node name ${e.name} already exists.`):(e.assign(this),this._renderNodesArr.unshift(e),this.renderNodes[e.name]=e)}_initializeRenderNodes(){for(let e=0;e<this._renderNodesArr.length;e++)this._renderNodesArr[e].initialize()}addNodeBefore(e,t){if(this.renderNodes[e.name])Ci.logWrn(`Node name ${e.name} already exists.`);else{e.assign(this),this.renderNodes[e.name]=e;for(let i=0;i<this._renderNodesArr.length;i++)if(this._renderNodesArr[i].isEqual(t)){this._renderNodesArr.splice(i,0,e);break}this._renderNodesArr.unshift(e)}}addNodes(e){for(let t=0;t<e.length;t++)this.addNode(e[t])}getMaxMSAA(e){let t=this.handler.gl;return t.getInternalformatParameter(t.RENDERBUFFER,t[e],t.SAMPLES)[0]}getMSAA(){return this._msaa}enqueueEntityCollectionsToDraw(e){this._entityCollections.push.apply(this._entityCollections,e)}_drawOpaqueEntityCollections(){let e=this._entityCollections;if(e.length){this.enableBlendDefault();let t=e.length;for(;t--;){let i=e[t];e[t]._fadingOpacity&&(i.events.dispatch(i.events.draw,i),e[t].geoObjectHandler.draw())}for(t=e.length;t--;)e[t]._fadingOpacity&&e[t].pointCloudHandler.draw()}}_drawTransparentEntityCollections(){let e=this._entityCollections;if(e.length){let t=this.handler.gl;this.enableBlendDefault(),t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_2D,this.billboardsTextureAtlas.texture);let i=e.length;for(;i--;){let t=e[i];t._fadingOpacity&&t.billboardHandler.draw()}let r=this.fontAtlas.atlasesArr;for(i=0;i<r.length;i++)t.activeTexture(t.TEXTURE0+i),t.bindTexture(t.TEXTURE_2D,r[i].texture);for(i=e.length;i--;)e[i]._fadingOpacity&&e[i].labelHandler.draw();for(i=e.length;i--;)e[i]._fadingOpacity&&e[i].rayHandler.draw();for(i=e.length;i--;)e[i]._fadingOpacity&&e[i].polylineHandler.draw();for(i=e.length;i--;)e[i]._fadingOpacity&&e[i].stripHandler.draw()}}_clearEntityCollectionQueue(){this._entityCollections.length=0,this._entityCollections=[]}draw(){this.activeCamera.checkMoveEnd();let e=this.events;e.handleEvents();let t=this.sceneFramebuffer;t.activate();let i=this.handler,r=i.gl;r.clearColor(0,0,0,1),r.clear(r.COLOR_BUFFER_BIT|r.DEPTH_BUFFER_BIT),e.dispatch(e.draw,this);let n=this.activeCamera.frustums,s=e.pointerEvent()||this.activeCamera.isMoving,a=this._renderNodesArr,o=n.length;for(;o--;){this.activeCamera.setCurrentFrustum(o),r.clear(r.DEPTH_BUFFER_BIT);let e=a.length;for(;e--;)a[e].preDrawNode();for(this._drawOpaqueEntityCollections(),e=a.length;e--;)this.enableBlendDefault(),a[e].drawNode();this._drawTransparentEntityCollections(),this._clearEntityCollectionQueue(),s&&(this._drawPickingBuffer(),this.__useDistanceFramebuffer__&&this._drawDistanceBuffer())}t.deactivate(),this.blitFramebuffer&&t.blitTo(this.blitFramebuffer,0),s&&(i.isWebGl2()&&this._drawDepthBuffer(),this._readPickingBuffer(),this.__useDistanceFramebuffer__&&this._readDistanceBuffer()),this._fnScreenFrame(),e.dispatch(e.postdraw,this),e.mouseState.wheelDelta=0,e.mouseState.justStopped=!1,e.mouseState.moving=!1,e.touchState.moving=!1}_screenFrameMSAA(){let e=this.handler,t=e.programs.toneMapping,i=t._program,r=e.gl;r.disable(r.DEPTH_TEST),r.bindBuffer(r.ARRAY_BUFFER,this.screenFramePositionBuffer),r.vertexAttribPointer(i.attributes.corners,2,r.FLOAT,!1,0,0),this.toneMappingFramebuffer.activate(),t.activate(),r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,this.blitFramebuffer.textures[0]),r.uniform1i(i.uniforms.hdrBuffer,0),r.uniform1f(i.uniforms.gamma,this.gamma),r.uniform1f(i.uniforms.exposure,this.exposure),r.uniform1f(i.uniforms.whitepoint,this.whitepoint),r.drawArrays(r.TRIANGLE_STRIP,0,4),this.toneMappingFramebuffer.deactivate(),t=e.programs.screenFrame,i=t._program,t.activate(),r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,this.outputTexture),r.uniform1i(i.uniforms.texture,0),r.drawArrays(r.TRIANGLE_STRIP,0,4),r.enable(r.DEPTH_TEST)}_screenFrameNoMSAA(){let e=this.handler,t=e.programs.screenFrame,i=t._program,r=e.gl;r.disable(r.DEPTH_TEST),t.activate(),r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,this.outputTexture),r.uniform1i(i.uniforms.texture,0),r.bindBuffer(r.ARRAY_BUFFER,this.screenFramePositionBuffer),r.vertexAttribPointer(i.attributes.corners,2,r.FLOAT,!1,0,0),r.drawArrays(r.TRIANGLE_STRIP,0,4),r.enable(r.DEPTH_TEST)}_drawPickingBuffer(){this.pickingFramebuffer.activate();let e=this.handler,t=e.gl;this.activeCamera.isFirstPass?(t.clearColor(0,0,0,1),t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT)):t.clear(t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT),e.programs.pickingMask.activate();let i=e.programs.pickingMask._program,r=i.uniforms,n=i.attributes,s=this.events.mouseState;t.disable(t.DEPTH_TEST),t.enable(t.STENCIL_TEST),t.colorMask(!1,!1,!1,!1),t.stencilFunc(t.ALWAYS,2,255),t.stencilOp(t.REPLACE,t.ZERO,t.REPLACE),t.uniform2f(r.offset,2*(s.nx-.5),2*(.5-s.ny)),t.bindBuffer(t.ARRAY_BUFFER,this._pickingMaskCoordinatesBuffer),t.vertexAttribPointer(n.coordinates,this._pickingMaskCoordinatesBuffer.itemSize,t.FLOAT,!1,0,0),t.drawArrays(t.POINTS,0,this._pickingMaskCoordinatesBuffer.numItems),t.enable(t.DEPTH_TEST),t.colorMask(!0,!0,!0,!0),t.stencilFunc(t.EQUAL,2,255),t.stencilOp(t.KEEP,t.KEEP,t.KEEP),t.disable(t.BLEND);let a=this._pickingCallbacks;for(let e=0,t=a.length;e<t;e++)a[e].callback.call(a[e].sender);t.enable(t.BLEND),t.disable(t.STENCIL_TEST),this.pickingFramebuffer.deactivate()}_drawDistanceBuffer(){this.distanceFramebuffer.activate();let e=this.handler.gl;this.activeCamera.isFirstPass?(e.clearColor(0,0,0,1),e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)):e.clear(e.DEPTH_BUFFER_BIT),e.disable(e.BLEND);let t=this._distanceCallbacks,i=t.length;for(;i--;)t[i].callback.call(t[i].sender);e.enable(e.BLEND),this.distanceFramebuffer.deactivate()}_drawDepthBuffer(){this.depthFramebuffer.activate();let e=this.handler,t=e.gl;t.clearColor(0,0,0,1),t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT),t.enable(t.DEPTH_TEST);let i=this._depthCallbacks,r=i.length;for(;r--;)i[r].callback.call(i[r].sender);this.depthFramebuffer.deactivate(),this.screenDepthFramebuffer.activate();let n=e.programs.depth,s=n._program;t.bindBuffer(t.ARRAY_BUFFER,this.screenFramePositionBuffer),t.vertexAttribPointer(s.attributes.corners,2,t.FLOAT,!1,0,0),n.activate(),t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_2D,this.depthFramebuffer.textures[1]),t.uniform1i(s.uniforms.depthTexture,0),t.drawArrays(t.TRIANGLE_STRIP,0,4),this.screenDepthFramebuffer.deactivate()}_readPickingBuffer(){this.pickingFramebuffer.activate(),this.pickingFramebuffer.readAllPixels(this._tempPickingPix_),this.pickingFramebuffer.deactivate()}_readDistanceBuffer(){this.distanceFramebuffer.activate(),this.distanceFramebuffer.readAllPixels(this._tempDistancePix_),this.distanceFramebuffer.deactivate()}readPickingColor(e,t,i){let r=this.pickingFramebuffer.width,n=this.pickingFramebuffer.height;e=Math.round(e*r);let s=4*((t=Math.round(t*n))*r+e);i[0]=this._tempPickingPix_[s],i[1]=this._tempPickingPix_[s+1],i[2]=this._tempPickingPix_[s+2]}readDistanceColor(e,t,i){let r=this.distanceFramebuffer.width,n=this.distanceFramebuffer.height;e=Math.round(e*r);let s=4*((t=Math.round(t*n))*r+e);i[0]=this._tempDistancePix_[s],i[1]=this._tempDistancePix_[s+1],i[2]=this._tempDistancePix_[s+2]}start(){this._initialized||this.initialize(),this.handler.start()}destroy(){for(let e in this.controls)this.controls[e].remove();for(let e=0;e<this._renderNodesArr.length;e++)this._renderNodesArr[e].remove();this.div=null,this._renderNodesArr=[],this.renderNodes={},this.activeCamera=null,this.controls={},this.controlsBag={},this.colorObjects.clear(),this.colorObjects=null,this._pickingCallbacks=[],this.pickingFramebuffer=null,this._tempPickingPix_=null,this.distanceFramebuffer=null,this._distanceCallbacks=[],this._tempDistancePix_=null,this._depthCallbacks=[],this.depthFramebuffer=null,this.sceneFramebuffer=null,this.blitFramebuffer=null,this.toneMappingFramebuffer=null,this._entityCollections=[],this.handler.destroy(),this.handler=null,this._initialized=!1}}const _o="/res";class uo{constructor(e){this.$target=null,this._instanceID=`__globus${uo.__counter__++?uo.__counter__:""}__`,window[this._instanceID]=this,this._canvas=document.createElement("canvas"),this._canvas.id=`canvas${this._instanceID}`,this._canvas.style.width="100%",this._canvas.style.height="100%",this._canvas.style.display="block",this._canvas.style.opacity="0.0",this._canvas.style.transition="opacity 150ms",this.$inner=document.createElement("div"),this.$inner.classList.add("og-inner"),this.$inner.appendChild(this._canvas),this.$inner.attributions=document.createElement("div"),e.attributionContainer?e.attributionContainer.appendChild(this.$inner.attributions):(this.$inner.attributions.classList.add("og-attribution"),this.$inner.appendChild(this.$inner.attributions)),e.target&&this.attachTo(e.target);const t=e=>{e.preventDefault()};this._canvas.onmouseenter=function(){document.addEventListener("mousewheel",t,{capture:!1,passive:!1})},this._canvas.onmouseleave=function(){document.removeEventListener("mousewheel",t)},this.renderer=new co(new Na(this._canvas,{autoActivate:!1,pixelRatio:e.dpi||window.devicePixelRatio+.15,context:{alpha:!1,antialias:!1,premultipliedAlpha:!1}}),{autoActivate:!1,msaa:e.msaa,fontsSrc:e.fontsSrc}),this.renderer.div=this.$inner,e.skybox&&this.renderer.addNode(e.skybox),this._planetName=e.name?e.name:"globus_planet_"+uo.__counter__,this.planet=new _a({name:this._planetName,frustums:e.frustums,ellipsoid:e.ellipsoid,maxGridSize:e.maxGridSize,nightTextureSrc:null===e.nightTextureSrc?null:`${e.resourcesSrc||_o}/night.png`,specularTextureSrc:null===e.specularTextureSrc?null:`${e.resourcesSrc||_o}/spec.png`,minAltitude:e.minAltitude,maxAltitude:e.maxAltitude||15e6,maxEqualZoomAltitude:e.maxEqualZoomAltitude,minEqualZoomAltitude:e.minEqualZoomAltitude,minEqualZoomCameraSlope:e.minEqualZoomCameraSlope,quadTreeStrategyPrototype:e.quadTreeStrategyPrototype,maxLoadingRequests:e.maxLoadingRequests,atmosphereEnabled:e.atmosphereEnabled}),e.terrain?Array.isArray(e.terrain)?this.planet.setTerrain(e.terrain[0]):this.planet.setTerrain(e.terrain):this.planet.setTerrain(new pa),this.renderer.addNode(this.planet),e.controls?this.planet.addControls(e.controls):this.planet.addControls([new kn,e.useEarthNavigation?new Jr:new hn({minSlope:e.minSlope}),new Bn,new Kr,new Cn,new St]);const i=this.renderer.controls;let r;for(let e in i)if(i[e]instanceof Mn){r=i[e];break}r?this.sun=r:(this.sun=new Mn,this.planet.addControl(this.sun)),e.sun&&(void 0===e.sun.active||e.sun.active||this.sun.deactivate(),!0===e.sun.stopped&&this.sun.stop()),e.layers&&this.planet.addLayers(e.layers);let n=e.viewExtent;n&&(n instanceof Array?this.planet.viewExtentArr(n):this.planet.viewExtent(n)),(e.autoActivate||de(e.autoActivate))&&this.start()}start(){this.renderer.start(),this.fadeIn()}fadeIn(){this._canvas.style.opacity="1.0"}fadeOut(){this._canvas.style.opacity="0"}attachTo(e){let t;this.detach(),t=e instanceof HTMLElement?e:document.getElementById(e)||document.querySelector(e),t&&(this.$target=t,t.appendChild(this.$inner))}detach(){this.$target&&this.$target.removeChild(this.$inner)}destroy(){this.detach(),this.renderer.destroy()}}uo.__counter__=0;const fo=`<div class="og-popup {className}">\n <div class="og-popup-content-wrapper">\n <div class="og-popup-content"></div>\n </div>\n <div class="og-popup-tip-container">\n <div class="og-popup-tip"></div>\n </div>\n <div class="og-popup-toolbar">\n <div class="og-popup-btn og-popup-close">${Bt}</div>\n </div>\n <div class="og-popup-title">{title}</div>\n </div>`,go=["open","close"];class po extends At{constructor(e){super({template:ye(fo,{title:e.title||""}),classList:e.className?[e.className]:[],...e}),this.events=this.events.registerNames(go),this._content=e.content||"",this.$content=null,this.$tip=null,this.$title=null,this._planet=e.planet,this._offset=e.offset||[0,0],this._lonLat=Ee(e.lonLat),this._cartPos=new oe,this._visibility=e.visibility||!1,this.render()}_updatePosition(){this.setCartesian3v(this._cartPos)}setScreen(e){if(this._planet){let t=this._planet.renderer.handler.pixelRatio;this.el.style.transform=`translate(${e.x/t-.5*this.clientWidth}px, ${e.y/t-this._planet.renderer.handler.canvas.clientHeight-this.$tip.clientHeight}px)`}}get clientWidth(){return this.el?this.el.clientWidth:0}get clientHeight(){return this.el?this.el.clientHeight:0}setOffset(e=0,t=0){return this._offset[0]=e,this._offset[1]=t,this.el&&(this.el.style.left=`${e}px`,this.el.style.bottom=`${t}px`),this}render(e){return super.render(e),this.$content=this.select(".og-popup-content"),this.$title=this.select(".og-popup-title"),this.$tip=this.select(".og-popup-tip-container"),this.setOffset(this._offset[0],this._offset[1]),this.setContent(this._content),this.setLonLat(this._lonLat),this.setVisibility(this._visibility),this.select(".og-popup-close").addEventListener("click",(()=>{this.hide()})),this}setVisibility(e){return e?this.show():this.hide(),this}getContainer(){return this.$content}getToolbarContainer(){return this.select(".og-popup-toolbar")}show(){return this._visibility=!0,this._planet&&(this._planet.events.on("draw",this._updatePosition,this),this.appendTo(this._planet.renderer.div),this.events.dispatch(this.events.open,this)),this}hide(){return this._visibility=!1,this.el&&this.el.parentNode&&(this._planet.events.off("draw",this._updatePosition),this.el.parentNode.removeChild(this.el),this.events.dispatch(this.events.close,this)),this}setCartesian3v(e,t=0){if(this._cartPos=e,this._planet){let i=this._planet.camera,r=this._planet.ellipsoid.equatorialSize+t,n=i._lonLat.height,s=e.sub(i.eye);Math.sqrt((r+n)*(r+n)-r*r)>s.length()&&i.getForward().dot(s.normalize())>0?(this.el.style.display="block",this.setScreen(i.project(e))):this.el.style.display="none"}return this}setTitle(e){this.$title&&(this.$title.innerHTML=e)}setLonLat(e){this._lonLat=e,this._planet&&this.setCartesian3v(this._planet.ellipsoid.lonLatToCartesian(e),e.height)}setContent(e){e&&(this.clear(),this._content=e,this.$content&&("string"==typeof e?this.$content.innerHTML=e:this.$content.appendChild(e)))}clear(){this._content=null,this.$content&&(this.$content.innerHTML="")}}class mo extends Ws{constructor(e,t,i,r){super(e,t,i,r),this.isPole=!1,this._tileGroup=0}_getMaxZoom(){return 150}_assignTileYIndexes(e){this.tileY=Math.round((90-e.northEast.lat)/(e.northEast.lat-e.southWest.lat)),this.tileYN=this.tileY-1,this.tileYS=this.tileY+1}_assignTileXIndexes(e){this.tileX=Math.round(Math.abs(-180-e.southWest.lon)/(e.northEast.lon-e.southWest.lon));let t=2*(1<<this.tileZoom);this.tileXE=(this.tileX+1)%t,this.tileXW=(t+this.tileX-1)%t}}class vo extends Os{constructor(e){super(e,"Mars",bs)}init(){let e=new Hs(mo,this.planet,0,null,0,0,ie.createFromArray([-180,-90,0,90])),t=new Hs(mo,this.planet,0,null,0,0,ie.createFromArray([0,-90,180,90]));this._quadTreeList.push(e),this._quadTreeList.push(t)}}class yo extends Os{constructor(e){super(e,"wgs84",bs)}init(){let e=new Hs(mo,this.planet,0,null,0,0,ie.createFromArray([-180,-90,180,90]));this._quadTreeList.push(e)}}const xo={epsg4326:class extends Os{constructor(e){super(e,"EPSG4326",bs)}init(){let e=new Hs(mo,this.planet,0,null,0,0,ie.createFromArray([-180,-90,0,90])),t=new Hs(mo,this.planet,0,null,0,0,ie.createFromArray([0,-90,180,90]));this._quadTreeList.push(e),this._quadTreeList.push(t)}},earth:js,mars:vo,wgs84:yo};export{wa as BilTerrain,ei as Billboard,ia as Camera,jt as CanvasTiles,ka as Clock,Mt as Control,js as EarthQuadTreeStrategy,la as Ellipsoid,pa as EmptyTerrain,vi as Entity,qi as EntityCollection,Ct as Events,ie as Extent,fs as Framebuffer,Aa as GeoImage,oi as GeoObject,Ea as GeoTexture2d,Pa as GeoVideo,Ys as Geoid,ii as Geometry,uo as Globe,ma as GlobusTerrain,Na as Handler,Ma as KML,di as Label,Ut as Layer,Pn as LightSource,ri as Line2,ni as Line3,I as LonLat,Ca as MapboxTerrain,vo as MarsQuadTreeStrategy,re as Mat3,se as Mat4,Ot as Material,Ha as Multisample,bi as Object3d,si as Plane,_a as Planet,ra as PlanetCamera,_i as PointCloud,ui as Polyline,po as Popup,Si as Program,Os as QuadTreeStrategy,ae as Quat,ai as Ray,Ti as RenderNode,co as Renderer,le as Vec2,oe as Vec3,ne as Vec4,Pr as Vector,ba as WMS,yo as Wgs84QuadTreeStrategy,ya as XYZ,wt as bv,Zn as control,rn as input,yt as jd,Sa as layer,M as math,te as mercator,xo as quadTreeStrategyType,ga as scene,La as terrain,Ze as utils,Oa as webgl,ha as wgs84};
2
+ //# sourceMappingURL=og.esm.js.map