@openglobus/og 0.17.1 → 0.18.0

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 (490) hide show
  1. package/README.md +75 -46
  2. package/dist/@openglobus/og.esm.js +1 -20
  3. package/dist/@openglobus/og.esm.js.map +1 -1
  4. package/dist/@openglobus/og.umd.js +1 -20
  5. package/dist/@openglobus/og.umd.js.map +1 -1
  6. package/dist/@openglobus/res/fonts/Karla-Bold.json +5252 -0
  7. package/dist/@openglobus/res/fonts/Karla-Bold.ttf.cfg +920 -0
  8. package/dist/@openglobus/res/fonts/Karla-Bold.ttf.png +0 -0
  9. package/dist/@openglobus/res/fonts/Karla-Light.json +5252 -0
  10. package/dist/@openglobus/res/fonts/Karla-Light.ttf.cfg +830 -0
  11. package/dist/@openglobus/res/fonts/Karla-Light.ttf.png +0 -0
  12. package/dist/@openglobus/res/fonts/Karla-Medium.json +5252 -0
  13. package/dist/@openglobus/res/fonts/Karla-Medium.ttf.cfg +1196 -0
  14. package/dist/@openglobus/res/fonts/Karla-Medium.ttf.png +0 -0
  15. package/dist/@openglobus/res/fonts/NotoSansArabic-Regular.json +3332 -0
  16. package/dist/@openglobus/res/fonts/NotoSansArabic-Regular.ttf.cfg +1370 -0
  17. package/dist/@openglobus/res/fonts/NotoSansArabic-Regular.ttf.png +0 -0
  18. package/dist/@openglobus/res/fonts/Roboto-Regular.json +37147 -0
  19. package/dist/@openglobus/res/fonts/Roboto-Regular.ttf.cfg +1340 -0
  20. package/dist/@openglobus/res/fonts/Roboto-Regular.ttf.png +0 -0
  21. package/dist/@openglobus/res/fonts/arial.json +4321 -0
  22. package/dist/@openglobus/res/fonts/arial.ttf.cfg +1570 -0
  23. package/dist/@openglobus/res/fonts/arial.ttf.png +0 -0
  24. package/dist/@openglobus/res/night-4326.png +0 -0
  25. package/dist/@openglobus/res/night.png +0 -0
  26. package/dist/@openglobus/res/spec.png +0 -0
  27. package/package.json +25 -23
  28. package/src/{og/Clock.js → Clock.ts} +100 -78
  29. package/src/Deferred.ts +17 -0
  30. package/src/Events.ts +200 -0
  31. package/src/{og/Extent.js → Extent.ts} +324 -352
  32. package/src/Globe.ts +363 -0
  33. package/src/{og/ImageCanvas.js → ImageCanvas.ts} +244 -236
  34. package/src/Lock.ts +41 -0
  35. package/src/{og/LonLat.js → LonLat.ts} +50 -47
  36. package/src/{og/Object3d.js → Object3d.ts} +89 -55
  37. package/src/Popup.ts +228 -0
  38. package/src/{og/QueueArray.js → QueueArray.ts} +76 -75
  39. package/src/{og/Rectangle.js → Rectangle.ts} +115 -111
  40. package/src/Stack.ts +58 -0
  41. package/src/{og/astro/astro.js → astro/astro.ts} +49 -51
  42. package/src/{og/astro/earth.js → astro/earth.ts} +8 -9
  43. package/src/{og/astro/jd.js → astro/jd.ts} +92 -111
  44. package/src/{og/astro/orbit.js → astro/orbit.ts} +35 -37
  45. package/src/{og/astro/rotation.js → astro/rotation.ts} +4 -6
  46. package/src/{og/bv/Box.js → bv/Box.ts} +21 -17
  47. package/src/{og/bv/Sphere.js → bv/Sphere.ts} +21 -19
  48. package/src/bv/index.ts +4 -0
  49. package/src/{og/camera/Camera.js → camera/Camera.ts} +254 -197
  50. package/src/{og/camera/Frustum.js → camera/Frustum.ts} +137 -111
  51. package/src/{og/camera/PlanetCamera.js → camera/PlanetCamera.ts} +248 -185
  52. package/src/camera/index.ts +4 -0
  53. package/src/{og/cons.js → cons.ts} +14 -18
  54. package/src/{og/control/Atmosphere.js → control/Atmosphere.ts} +50 -50
  55. package/src/{og/control/CompassButton.js → control/CompassButton.ts} +27 -30
  56. package/src/{og/control/Control.js → control/Control.ts} +76 -70
  57. package/src/{og/control/DebugInfo.js → control/DebugInfo.ts} +130 -62
  58. package/src/{og/control/DrawingSwitcher.js → control/DrawingSwitcher.ts} +16 -22
  59. package/src/control/EarthCoordinates.ts +222 -0
  60. package/src/control/EarthNavigation.ts +293 -0
  61. package/src/{og/control/GeoImageDragControl.js → control/GeoImageDragControl.ts} +37 -29
  62. package/src/control/KeyboardNavigation.ts +168 -0
  63. package/src/{og/control/LayerAnimation.js → control/LayerAnimation.ts} +74 -90
  64. package/src/control/LayerSwitcher.ts +76 -0
  65. package/src/{og/control/Lighting.js → control/Lighting.ts} +158 -120
  66. package/src/control/MouseNavigation.ts +468 -0
  67. package/src/control/MouseWheelZoomControl.ts +269 -0
  68. package/src/{og/control/RulerSwitcher.js → control/RulerSwitcher.ts} +18 -20
  69. package/src/control/ScaleControl.ts +131 -0
  70. package/src/control/SegmentBoundVisualization.ts +50 -0
  71. package/src/control/ShowFps.ts +28 -0
  72. package/src/control/SimpleNavigation.ts +118 -0
  73. package/src/{og/control/SimpleSkyBackground.js → control/SimpleSkyBackground.ts} +36 -38
  74. package/src/{og/control/Sun.js → control/Sun.ts} +56 -64
  75. package/src/control/ToggleWireframe.ts +35 -0
  76. package/src/control/TouchNavigation.ts +368 -0
  77. package/src/control/ZoomControl.ts +111 -0
  78. package/src/control/drawing/DrawingControl.ts +45 -0
  79. package/src/{og/control/drawing/LineStringDrawingScene.js → control/drawing/LineStringDrawingScene.ts} +28 -35
  80. package/src/{og/control/drawing/PolygonDrawingScene.js → control/drawing/PolygonDrawingScene.ts} +148 -201
  81. package/src/{og/control/elevationProfile/ElevationProfile.js → control/elevationProfile/ElevationProfile.ts} +70 -36
  82. package/src/control/heightRuler/HeightRuler.ts +16 -0
  83. package/src/{og/control/heightRuler/HeightRulerScene.js → control/heightRuler/HeightRulerScene.ts} +92 -87
  84. package/src/{og/control/heightRuler/HeightRulerSwitcher.js → control/heightRuler/HeightRulerSwitcher.ts} +3 -3
  85. package/src/control/index.ts +45 -0
  86. package/src/control/ruler/Ruler.ts +35 -0
  87. package/src/{og/control/ruler/RulerScene.js → control/ruler/RulerScene.ts} +163 -121
  88. package/src/{og/control/selection/Selection.js → control/selection/Selection.ts} +23 -21
  89. package/src/{og/control/selection/SelectionScene.js → control/selection/SelectionScene.ts} +64 -50
  90. package/src/{og/control/timeline/TimelineControl.js → control/timeline/TimelineControl.ts} +37 -28
  91. package/src/{og/control/timeline/TimelineModel.js → control/timeline/TimelineModel.ts} +50 -35
  92. package/src/{og/control/timeline/TimelineView.js → control/timeline/TimelineView.ts} +162 -113
  93. package/src/{og/control/timeline/timelineUtils.js → control/timeline/timelineUtils.ts} +11 -10
  94. package/src/{og/control → control}/visibleExtent/Segment.js +5 -5
  95. package/src/{og/control → control}/visibleExtent/VisibleExtent.js +8 -15
  96. package/src/{og/control/visibleExtent/drawnode.js → control/visibleExtent/drawnode.ts} +1 -3
  97. package/src/{og/ellipsoid/Ellipsoid.js → ellipsoid/Ellipsoid.ts} +113 -59
  98. package/src/ellipsoid/index.ts +4 -0
  99. package/src/{og/ellipsoid/wgs84.js → ellipsoid/wgs84.ts} +1 -3
  100. package/src/{og/entity/BaseBillboard.js → entity/BaseBillboard.ts} +128 -102
  101. package/src/entity/BaseBillboardHandler.ts +772 -0
  102. package/src/{og/entity/Billboard.js → entity/Billboard.ts} +77 -47
  103. package/src/entity/BillboardHandler.ts +135 -0
  104. package/src/{og/entity/Entity.js → entity/Entity.ts} +285 -226
  105. package/src/{og/entity/EntityCollection.js → entity/EntityCollection.ts} +340 -247
  106. package/src/{og/entity/GeoObject.js → entity/GeoObject.ts} +122 -67
  107. package/src/{og/entity/GeoObjectHandler.js → entity/GeoObjectHandler.ts} +273 -198
  108. package/src/entity/Geometry.ts +486 -0
  109. package/src/{og/entity/GeometryHandler.js → entity/GeometryHandler.ts} +383 -541
  110. package/src/{og/entity/Label.js → entity/Label.ts} +131 -83
  111. package/src/{og/entity/LabelHandler.js → entity/LabelHandler.ts} +289 -255
  112. package/src/{og/entity/LabelWorker.js → entity/LabelWorker.ts} +26 -36
  113. package/src/{og/entity/PointCloud.js → entity/PointCloud.ts} +200 -164
  114. package/src/entity/PointCloudHandler.ts +125 -0
  115. package/src/{og/entity/Polyline.js → entity/Polyline.ts} +517 -539
  116. package/src/{og/entity/PolylineHandler.js → entity/PolylineHandler.ts} +29 -31
  117. package/src/{og/entity/Ray.js → entity/Ray.ts} +89 -60
  118. package/src/{og/entity/RayHandler.js → entity/RayHandler.ts} +201 -306
  119. package/src/{og/entity/Strip.js → entity/Strip.ts} +143 -100
  120. package/src/{og/entity/StripHandler.js → entity/StripHandler.ts} +76 -72
  121. package/src/entity/index.ts +12 -0
  122. package/src/index.ts +173 -0
  123. package/src/input/KeyboardHandler.ts +196 -0
  124. package/src/{og/input/MouseHandler.js → input/MouseHandler.ts} +46 -35
  125. package/src/input/TouchHandler.ts +54 -0
  126. package/src/{og/input/input.js → input/input.ts} +1 -3
  127. package/src/{og/layer/BaseGeoImage.js → layer/BaseGeoImage.ts} +174 -107
  128. package/src/{og/layer/CanvasTiles.js → layer/CanvasTiles.ts} +139 -105
  129. package/src/{og/layer/GeoImage.js → layer/GeoImage.ts} +62 -52
  130. package/src/layer/GeoTexture2d.ts +56 -0
  131. package/src/{og/layer/GeoVideo.js → layer/GeoVideo.ts} +53 -53
  132. package/src/{og/layer/KML.js → layer/KML.ts} +63 -74
  133. package/src/{og/layer/Layer.js → layer/Layer.ts} +399 -223
  134. package/src/{og/layer/Material.js → layer/Material.ts} +40 -35
  135. package/src/{og/layer/Vector.js → layer/Vector.ts} +319 -267
  136. package/src/{og/layer/WMS.js → layer/WMS.ts} +76 -64
  137. package/src/{og/layer/XYZ.js → layer/XYZ.ts} +123 -98
  138. package/src/layer/index.ts +12 -0
  139. package/src/{og/light/LightSource.js → light/LightSource.ts} +132 -93
  140. package/src/{og/math/Line2.js → math/Line2.ts} +11 -8
  141. package/src/{og/math/Line3.js → math/Line3.ts} +49 -27
  142. package/src/{og/math/Mat3.js → math/Mat3.ts} +43 -27
  143. package/src/{og/math/Mat4.js → math/Mat4.ts} +110 -77
  144. package/src/{og/math/Plane.js → math/Plane.ts} +28 -23
  145. package/src/{og/math/Quat.js → math/Quat.ts} +238 -222
  146. package/src/{og/math/Ray.js → math/Ray.ts} +59 -63
  147. package/src/{og/math/Vec2.js → math/Vec2.ts} +85 -76
  148. package/src/{og/math/Vec3.js → math/Vec3.ts} +141 -140
  149. package/src/{og/math/Vec4.js → math/Vec4.ts} +64 -53
  150. package/src/{og/math/coder.js → math/coder.ts} +30 -27
  151. package/src/math/index.ts +26 -0
  152. package/src/{og/math.js → math.ts} +46 -49
  153. package/src/{og/mercator.js → mercator.ts} +143 -149
  154. package/src/{og/proj/EPSG3857.js → proj/EPSG3857.ts} +1 -3
  155. package/src/{og/proj/EPSG4326.js → proj/EPSG4326.ts} +11 -13
  156. package/src/{og/proj/Proj.js → proj/Proj.ts} +27 -23
  157. package/src/{og/quadTree/EPSG4326QuadTreeStrategy.js → quadTree/EPSG4326QuadTreeStrategy.ts} +10 -13
  158. package/src/{og/quadTree/EarthQuadTreeStrategy.js → quadTree/EarthQuadTreeStrategy.ts} +11 -13
  159. package/src/quadTree/EntityCollectionNode.ts +395 -0
  160. package/src/{og/quadTree/MarsQuadTreeStrategy.js → quadTree/MarsQuadTreeStrategy.ts} +10 -13
  161. package/src/{og/quadTree/Node.js → quadTree/Node.ts} +283 -191
  162. package/src/{og/quadTree/QuadTreeStrategy.js → quadTree/QuadTreeStrategy.ts} +35 -29
  163. package/src/quadTree/Wgs84QuadTreeStrategy.ts +22 -0
  164. package/src/quadTree/index.ts +14 -0
  165. package/src/{og/quadTree/quadTree.js → quadTree/quadTree.ts} +75 -77
  166. package/src/{og/renderer/Renderer.js → renderer/Renderer.ts} +454 -298
  167. package/src/{og/renderer/RendererEvents.js → renderer/RendererEvents.ts} +347 -270
  168. package/src/{og/scene/Axes.js → scene/Axes.ts} +26 -22
  169. package/src/{og/scene/BaseNode.js → scene/BaseNode.ts} +53 -47
  170. package/src/{og/scene/Planet.js → scene/Planet.ts} +777 -595
  171. package/src/{og/scene/RenderNode.js → scene/RenderNode.ts} +105 -91
  172. package/src/{og/scene/SkyBox.js → scene/SkyBox.ts} +29 -25
  173. package/src/scene/index.ts +6 -0
  174. package/src/{og/segment/Segment.js → segment/Segment.ts} +497 -371
  175. package/src/{og/segment/SegmentLonLat.js → segment/SegmentLonLat.ts} +81 -87
  176. package/src/{og/segment/SegmentLonLatWgs84.js → segment/SegmentLonLatWgs84.ts} +9 -16
  177. package/src/{og/segment/Slice.js → segment/Slice.ts} +15 -9
  178. package/src/{og/segment/segmentHelper.js → segment/segmentHelper.ts} +57 -49
  179. package/src/{og/shaders/atmos.js → shaders/atmos.ts} +4 -6
  180. package/src/{og/shaders/billboard.js → shaders/billboard.ts} +3 -5
  181. package/src/{og/shaders/bloom.js → shaders/bloom.ts} +2 -4
  182. package/src/{og/shaders/blur.js → shaders/blur.ts} +4 -7
  183. package/src/{og/shaders/depth.js → shaders/depth.ts} +1 -3
  184. package/src/{og/shaders/drawnode.js → shaders/drawnode.ts} +19 -21
  185. package/src/{og/shaders/geoObject.js → shaders/geoObject.ts} +17 -19
  186. package/src/{og/shaders/label.js → shaders/label.ts} +4 -6
  187. package/src/{og/shaders/lumFilter.js → shaders/lumFilter.ts} +2 -4
  188. package/src/{og/shaders/pickingMask.js → shaders/pickingMask.ts} +2 -4
  189. package/src/{og/shaders/pointCloud.js → shaders/pointCloud.ts} +7 -10
  190. package/src/{og/shaders/polyline.js → shaders/polyline.ts} +3 -200
  191. package/src/{og/shaders/ray.js → shaders/ray.ts} +2 -4
  192. package/src/{og/shaders/screenFrame.js → shaders/screenFrame.ts} +2 -4
  193. package/src/{og/shaders/skybox.js → shaders/skybox.ts} +7 -9
  194. package/src/{og/shaders/toneMapping.js → shaders/toneMapping.ts} +2 -4
  195. package/src/{og/shaders/utils.js → shaders/utils.ts} +0 -2
  196. package/src/{og/terrain/BilTerrain.js → terrain/BilTerrain.ts} +38 -32
  197. package/src/terrain/EmptyTerrain.ts +230 -0
  198. package/src/{og/terrain/Geoid.js → terrain/Geoid.ts} +67 -41
  199. package/src/{og/terrain/GlobusTerrain.js → terrain/GlobusTerrain.ts} +159 -153
  200. package/src/{og/terrain/MapboxTerrain.js → terrain/MapboxTerrain.ts} +58 -61
  201. package/src/terrain/index.ts +6 -0
  202. package/src/ui/Button.ts +121 -0
  203. package/src/ui/ButtonGroup.ts +63 -0
  204. package/src/ui/Dialog.ts +244 -0
  205. package/src/ui/Slider.ts +188 -0
  206. package/src/ui/ToggleButton.ts +68 -0
  207. package/src/{og/ui/View.js → ui/View.ts} +66 -59
  208. package/src/utils/BaseWorker.ts +60 -0
  209. package/src/utils/FontAtlas.ts +356 -0
  210. package/src/{og/utils/GeoImageCreator.js → utils/GeoImageCreator.ts} +45 -29
  211. package/src/{og/utils/ImagesCacheManager.js → utils/ImagesCacheManager.ts} +85 -70
  212. package/src/utils/Loader.ts +247 -0
  213. package/src/{og/utils/NormalMapCreator.js → utils/NormalMapCreator.ts} +114 -77
  214. package/src/{og/utils/PlainSegmentWorker.js → utils/PlainSegmentWorker.ts} +41 -24
  215. package/src/{og/utils/TerrainWorker.js → utils/TerrainWorker.ts} +51 -36
  216. package/src/utils/TextureAtlas.ts +322 -0
  217. package/src/{og/utils/VectorTileCreator.js → utils/VectorTileCreator.ts} +67 -52
  218. package/src/{og/utils/colorTable.js → utils/colorTable.ts} +142 -144
  219. package/src/{og/utils/earcut.js → utils/earcut.ts} +664 -661
  220. package/src/{og/utils/objParser.js → utils/objParser.ts} +66 -37
  221. package/src/{og/utils/shared.js → utils/shared.ts} +267 -206
  222. package/src/utils/units.ts +78 -0
  223. package/src/webgl/BaseFramebuffer.ts +125 -0
  224. package/src/webgl/Framebuffer.ts +206 -0
  225. package/src/webgl/Handler.ts +1414 -0
  226. package/src/webgl/Multisample.ts +153 -0
  227. package/src/webgl/Program.ts +451 -0
  228. package/src/{og/webgl/ProgramController.js → webgl/ProgramController.ts} +44 -43
  229. package/src/webgl/index.ts +13 -0
  230. package/src/{og/webgl/types.js → webgl/types.ts} +29 -31
  231. package/src/webgl/variableHandlers.ts +114 -0
  232. package/src/og/Deferred.js +0 -11
  233. package/src/og/Events.js +0 -185
  234. package/src/og/Globe.js +0 -342
  235. package/src/og/Lock.js +0 -44
  236. package/src/og/Popup.js +0 -187
  237. package/src/og/Stack.js +0 -49
  238. package/src/og/bv/index.js +0 -4
  239. package/src/og/camera/index.js +0 -4
  240. package/src/og/control/EarthCoordinates.js +0 -214
  241. package/src/og/control/EarthNavigation.js +0 -258
  242. package/src/og/control/KeyboardNavigation.js +0 -149
  243. package/src/og/control/LayerSwitcher.js +0 -424
  244. package/src/og/control/MouseNavigation.js +0 -436
  245. package/src/og/control/MouseWheelZoomControl.js +0 -253
  246. package/src/og/control/ScaleControl.js +0 -119
  247. package/src/og/control/SegmentBoundVisualization.js +0 -54
  248. package/src/og/control/ShowFps.js +0 -40
  249. package/src/og/control/SimpleNavigation.js +0 -123
  250. package/src/og/control/ToggleWireframe.js +0 -35
  251. package/src/og/control/TouchNavigation.js +0 -350
  252. package/src/og/control/ZoomControl.js +0 -115
  253. package/src/og/control/drawing/DrawingControl.js +0 -51
  254. package/src/og/control/heightRuler/HeightRuler.js +0 -12
  255. package/src/og/control/index.js +0 -56
  256. package/src/og/control/ruler/Ruler.js +0 -39
  257. package/src/og/ellipsoid/index.js +0 -4
  258. package/src/og/entity/BillboardHandler.js +0 -883
  259. package/src/og/entity/Geometry.js +0 -320
  260. package/src/og/entity/PointCloudHandler.js +0 -122
  261. package/src/og/entity/index.js +0 -9
  262. package/src/og/index.js +0 -112
  263. package/src/og/input/KeyboardHandler.js +0 -128
  264. package/src/og/input/TouchHandler.js +0 -59
  265. package/src/og/layer/GeoTexture2d.js +0 -50
  266. package/src/og/layer/index.js +0 -11
  267. package/src/og/math/index.js +0 -23
  268. package/src/og/quadTree/EntityCollectionNode.js +0 -391
  269. package/src/og/quadTree/Wgs84QuadTreeStrategy.js +0 -27
  270. package/src/og/quadTree/index.js +0 -14
  271. package/src/og/res/images.js +0 -8
  272. package/src/og/scene/index.js +0 -5
  273. package/src/og/terrain/EmptyTerrain.js +0 -174
  274. package/src/og/terrain/index.js +0 -6
  275. package/src/og/ui/Button.js +0 -107
  276. package/src/og/ui/ButtonGroup.js +0 -57
  277. package/src/og/ui/Dialog.js +0 -239
  278. package/src/og/ui/Slider.js +0 -170
  279. package/src/og/ui/ToggleButton.js +0 -51
  280. package/src/og/ui/UIhelpers.js +0 -155
  281. package/src/og/utils/BaseWorker.js +0 -46
  282. package/src/og/utils/FontAtlas.js +0 -218
  283. package/src/og/utils/Loader.js +0 -188
  284. package/src/og/utils/TextureAtlas.js +0 -291
  285. package/src/og/utils/functionComposition.js +0 -13
  286. package/src/og/utils/units.js +0 -78
  287. package/src/og/webgl/Framebuffer.js +0 -311
  288. package/src/og/webgl/Handler.js +0 -1168
  289. package/src/og/webgl/Multisample.js +0 -275
  290. package/src/og/webgl/Program.js +0 -407
  291. package/src/og/webgl/callbacks.js +0 -98
  292. package/src/og/webgl/index.js +0 -13
  293. package/src/og.jsdoc +0 -3
  294. package/types/Clock.d.ts +0 -99
  295. package/types/Deferred.d.ts +0 -6
  296. package/types/Events.d.ts +0 -78
  297. package/types/Extent.d.ts +0 -166
  298. package/types/Globe.d.ts +0 -108
  299. package/types/ImageCanvas.d.ts +0 -128
  300. package/types/Lock.d.ts +0 -12
  301. package/types/LonLat.d.ts +0 -127
  302. package/types/Object3d.d.ts +0 -35
  303. package/types/Popup.d.ts +0 -29
  304. package/types/QueueArray.d.ts +0 -19
  305. package/types/Rectangle.d.ts +0 -80
  306. package/types/Stack.d.ts +0 -19
  307. package/types/arial.d.ts +0 -49
  308. package/types/astro/astro.d.ts +0 -38
  309. package/types/astro/earth.d.ts +0 -7
  310. package/types/astro/jd.d.ts +0 -254
  311. package/types/bv/Box.d.ts +0 -30
  312. package/types/bv/Sphere.d.ts +0 -38
  313. package/types/bv/index.d.ts +0 -3
  314. package/types/camera/Camera.d.ts +0 -314
  315. package/types/camera/Frustum.d.ts +0 -133
  316. package/types/camera/PlanetCamera.d.ts +0 -219
  317. package/types/camera/index.d.ts +0 -3
  318. package/types/cons.d.ts +0 -40
  319. package/types/control/Atmosphere.d.ts +0 -15
  320. package/types/control/CompassButton.d.ts +0 -16
  321. package/types/control/Control.d.ts +0 -104
  322. package/types/control/DebugInfo.d.ts +0 -19
  323. package/types/control/DrawingSwitcher.d.ts +0 -13
  324. package/types/control/EarthCoordinates.d.ts +0 -44
  325. package/types/control/EarthNavigation.d.ts +0 -43
  326. package/types/control/GeoImageDragControl.d.ts +0 -14
  327. package/types/control/KeyboardNavigation.d.ts +0 -24
  328. package/types/control/LayerAnimation.d.ts +0 -73
  329. package/types/control/LayerSwitcher.d.ts +0 -64
  330. package/types/control/Lighting.d.ts +0 -41
  331. package/types/control/MouseNavigation.d.ts +0 -49
  332. package/types/control/MouseWheelZoomControl.d.ts +0 -46
  333. package/types/control/ScaleControl.d.ts +0 -23
  334. package/types/control/ShowFps.d.ts +0 -11
  335. package/types/control/SimpleNavigation.d.ts +0 -26
  336. package/types/control/SimpleSkyBackground.d.ts +0 -15
  337. package/types/control/Sun.d.ts +0 -53
  338. package/types/control/ToggleWireframe.d.ts +0 -12
  339. package/types/control/TouchNavigation.d.ts +0 -54
  340. package/types/control/ZoomControl.d.ts +0 -26
  341. package/types/control/drawing/DrawingControl.d.ts +0 -14
  342. package/types/control/drawing/LineStringDrawingScene.d.ts +0 -5
  343. package/types/control/drawing/PolygonDrawingScene.d.ts +0 -99
  344. package/types/control/heightRuler/HeightRuler.d.ts +0 -6
  345. package/types/control/heightRuler/HeightRulerScene.d.ts +0 -23
  346. package/types/control/index.d.ts +0 -27
  347. package/types/control/ruler/Ruler.d.ts +0 -13
  348. package/types/control/ruler/RulerScene.d.ts +0 -51
  349. package/types/control/selection/Selection.d.ts +0 -49
  350. package/types/control/selection/SelectionScene.d.ts +0 -32
  351. package/types/control/timeline/TimelineControl.d.ts +0 -10
  352. package/types/control/timeline/TimelineModel.d.ts +0 -33
  353. package/types/control/timeline/TimelineView.d.ts +0 -57
  354. package/types/control/timeline/timelineUtils.d.ts +0 -9
  355. package/types/ellipsoid/Ellipsoid.d.ts +0 -170
  356. package/types/ellipsoid/index.d.ts +0 -3
  357. package/types/ellipsoid/wgs84.d.ts +0 -6
  358. package/types/entity/BaseBillboard.d.ts +0 -215
  359. package/types/entity/Billboard.d.ts +0 -94
  360. package/types/entity/BillboardHandler.d.ts +0 -75
  361. package/types/entity/Entity.d.ts +0 -340
  362. package/types/entity/EntityCollection.d.ts +0 -303
  363. package/types/entity/GeoObject.d.ts +0 -117
  364. package/types/entity/GeoObjectHandler.d.ts +0 -41
  365. package/types/entity/Geometry.d.ts +0 -79
  366. package/types/entity/GeometryHandler.d.ts +0 -76
  367. package/types/entity/Label.d.ts +0 -190
  368. package/types/entity/LabelHandler.d.ts +0 -31
  369. package/types/entity/LabelWorker.d.ts +0 -9
  370. package/types/entity/PointCloud.d.ts +0 -174
  371. package/types/entity/PointCloudHandler.d.ts +0 -38
  372. package/types/entity/Polyline.d.ts +0 -307
  373. package/types/entity/PolylineHandler.d.ts +0 -18
  374. package/types/entity/Ray.d.ts +0 -122
  375. package/types/entity/RayHandler.d.ts +0 -63
  376. package/types/entity/Strip.d.ts +0 -119
  377. package/types/entity/StripHandler.d.ts +0 -38
  378. package/types/entity/index.d.ts +0 -8
  379. package/types/index.d.ts +0 -53
  380. package/types/input/KeyboardHandler.d.ts +0 -10
  381. package/types/input/MouseHandler.d.ts +0 -5
  382. package/types/input/TouchHandler.d.ts +0 -5
  383. package/types/input/input.d.ts +0 -42
  384. package/types/layer/BaseGeoImage.d.ts +0 -116
  385. package/types/layer/CanvasTiles.d.ts +0 -73
  386. package/types/layer/GeoImage.d.ts +0 -51
  387. package/types/layer/GeoTexture2d.d.ts +0 -7
  388. package/types/layer/GeoVideo.d.ts +0 -47
  389. package/types/layer/KML.d.ts +0 -93
  390. package/types/layer/Layer.d.ts +0 -320
  391. package/types/layer/Material.d.ts +0 -45
  392. package/types/layer/Vector.d.ts +0 -211
  393. package/types/layer/WMS.d.ts +0 -66
  394. package/types/layer/XYZ.d.ts +0 -122
  395. package/types/layer/index.d.ts +0 -10
  396. package/types/light/LightSource.d.ts +0 -178
  397. package/types/math/Line2.d.ts +0 -11
  398. package/types/math/Line3.d.ts +0 -10
  399. package/types/math/Mat3.d.ts +0 -65
  400. package/types/math/Mat4.d.ts +0 -176
  401. package/types/math/Plane.d.ts +0 -18
  402. package/types/math/Quat.d.ts +0 -379
  403. package/types/math/Ray.d.ts +0 -82
  404. package/types/math/Vec2.d.ts +0 -309
  405. package/types/math/Vec3.d.ts +0 -472
  406. package/types/math/Vec4.d.ts +0 -161
  407. package/types/math/coder.d.ts +0 -43
  408. package/types/math/index.d.ts +0 -11
  409. package/types/math.d.ts +0 -268
  410. package/types/mercator.d.ts +0 -92
  411. package/types/proj/EPSG3857.d.ts +0 -6
  412. package/types/proj/EPSG4326.d.ts +0 -6
  413. package/types/proj/Proj.d.ts +0 -42
  414. package/types/quadTree/EPSG4326QuadTreeStrategy.d.ts +0 -3
  415. package/types/quadTree/EarthQuadTreeStrategy.d.ts +0 -3
  416. package/types/quadTree/EntityCollectionNode.d.ts +0 -41
  417. package/types/quadTree/MarsQuadTreeStrategy.d.ts +0 -3
  418. package/types/quadTree/Node.d.ts +0 -58
  419. package/types/quadTree/QuadTreeStrategy.d.ts +0 -21
  420. package/types/quadTree/Wgs84QuadTreeStrategy.d.ts +0 -3
  421. package/types/quadTree/index.d.ts +0 -12
  422. package/types/quadTree/quadTree.d.ts +0 -40
  423. package/types/renderer/Renderer.d.ts +0 -291
  424. package/types/renderer/RendererEvents.d.ts +0 -255
  425. package/types/res/images.d.ts +0 -2
  426. package/types/scene/Axes.d.ts +0 -10
  427. package/types/scene/BaseNode.d.ts +0 -60
  428. package/types/scene/Planet.d.ts +0 -595
  429. package/types/scene/RenderNode.d.ts +0 -152
  430. package/types/scene/SkyBox.d.ts +0 -9
  431. package/types/scene/index.d.ts +0 -4
  432. package/types/segment/Segment.d.ts +0 -273
  433. package/types/segment/SegmentLonLat.d.ts +0 -22
  434. package/types/segment/SegmentLonLatWgs84.d.ts +0 -4
  435. package/types/segment/Slice.d.ts +0 -10
  436. package/types/segment/segmentHelper.d.ts +0 -13
  437. package/types/shaders/atmos.d.ts +0 -4
  438. package/types/shaders/billboard.d.ts +0 -3
  439. package/types/shaders/depth.d.ts +0 -2
  440. package/types/shaders/drawnode.d.ts +0 -8
  441. package/types/shaders/geoObject.d.ts +0 -3
  442. package/types/shaders/label.d.ts +0 -4
  443. package/types/shaders/pickingMask.d.ts +0 -2
  444. package/types/shaders/pointCloud.d.ts +0 -2
  445. package/types/shaders/polyline.d.ts +0 -3
  446. package/types/shaders/ray.d.ts +0 -2
  447. package/types/shaders/screenFrame.d.ts +0 -2
  448. package/types/shaders/skybox.d.ts +0 -2
  449. package/types/shaders/toneMapping.d.ts +0 -2
  450. package/types/shaders/utils.d.ts +0 -1
  451. package/types/terrain/BilTerrain.d.ts +0 -14
  452. package/types/terrain/EmptyTerrain.d.ts +0 -87
  453. package/types/terrain/Geoid.d.ts +0 -17
  454. package/types/terrain/GlobusTerrain.d.ts +0 -122
  455. package/types/terrain/MapboxTerrain.d.ts +0 -14
  456. package/types/terrain/index.d.ts +0 -5
  457. package/types/ui/Button.d.ts +0 -21
  458. package/types/ui/ButtonGroup.d.ts +0 -12
  459. package/types/ui/Dialog.d.ts +0 -41
  460. package/types/ui/Slider.d.ts +0 -33
  461. package/types/ui/ToggleButton.d.ts +0 -10
  462. package/types/ui/UIhelpers.d.ts +0 -13
  463. package/types/ui/View.d.ts +0 -33
  464. package/types/ui/icons.d.ts +0 -1
  465. package/types/utils/BaseWorker.d.ts +0 -14
  466. package/types/utils/FontAtlas.d.ts +0 -16
  467. package/types/utils/GeoImageCreator.d.ts +0 -30
  468. package/types/utils/ImagesCacheManager.d.ts +0 -10
  469. package/types/utils/Loader.d.ts +0 -31
  470. package/types/utils/NormalMapCreator.d.ts +0 -39
  471. package/types/utils/PlainSegmentWorker.d.ts +0 -8
  472. package/types/utils/TerrainWorker.d.ts +0 -7
  473. package/types/utils/TextureAtlas.d.ts +0 -113
  474. package/types/utils/VectorTileCreator.d.ts +0 -14
  475. package/types/utils/colorTable.d.ts +0 -143
  476. package/types/utils/earcut.d.ts +0 -6
  477. package/types/utils/functionComposition.d.ts +0 -5
  478. package/types/utils/objParser.d.ts +0 -8
  479. package/types/utils/shared.d.ts +0 -241
  480. package/types/utils/units.d.ts +0 -20
  481. package/types/webgl/Framebuffer.d.ts +0 -134
  482. package/types/webgl/Handler.d.ts +0 -403
  483. package/types/webgl/Multisample.d.ts +0 -91
  484. package/types/webgl/Program.d.ts +0 -163
  485. package/types/webgl/ProgramController.d.ts +0 -89
  486. package/types/webgl/callbacks.d.ts +0 -1
  487. package/types/webgl/index.d.ts +0 -6
  488. package/types/webgl/types.d.ts +0 -2
  489. /package/{src/og → dist/@openglobus/res/fonts}/arial.js +0 -0
  490. /package/src/{og/ui/icons.js → ui/icons.ts} +0 -0
@@ -1,661 +1,664 @@
1
- /* eslint-disable no-unused-vars */
2
- /* eslint-disable curly */
3
- /* eslint-disable operator-linebreak */
4
- /* eslint-disable no-mixed-operators */
5
- /**
6
- * @module og/utils/earcut
7
- */
8
-
9
- 'use strict';
10
-
11
- // ISC License
12
- //
13
- // Copyright (c) 2016, Mapbox
14
- //
15
- // Permission to use, copy, modify, and/or distribute this software for any purpose
16
- // with or without fee is hereby granted, provided that the above copyright notice
17
- // and this permission notice appear in all copies.
18
- //
19
- // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
20
- // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
21
- // FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
22
- // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
23
- // OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
24
- // TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
25
- // THIS SOFTWARE.
26
- //
27
- //https://github.com/mapbox/earcut
28
- function earcut(data, holeIndices, dim) {
29
-
30
- dim = dim || 2;
31
-
32
- var hasHoles = holeIndices && holeIndices.length,
33
- outerLen = hasHoles ? holeIndices[0] * dim : data.length,
34
- outerNode = linkedList(data, 0, outerLen, dim, true),
35
- triangles = [];
36
-
37
- if (!outerNode) return triangles;
38
-
39
- var minX, minY, maxX, maxY, x, y, size;
40
-
41
- if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
42
-
43
- // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
44
- if (data.length > 80 * dim) {
45
- minX = maxX = data[0];
46
- minY = maxY = data[1];
47
-
48
- for (let i = dim; i < outerLen; i += dim) {
49
- x = data[i];
50
- y = data[i + 1];
51
- if (x < minX) minX = x;
52
- if (y < minY) minY = y;
53
- if (x > maxX) maxX = x;
54
- if (y > maxY) maxY = y;
55
- }
56
-
57
- // minX, minY and size are later used to transform coords into integers for z-order calculation
58
- size = Math.max(maxX - minX, maxY - minY);
59
- }
60
-
61
- earcutLinked(outerNode, triangles, dim, minX, minY, size);
62
-
63
- return triangles;
64
- }
65
-
66
- // create a circular doubly linked list from polygon points in the specified winding order
67
- function linkedList(data, start, end, dim, clockwise) {
68
- var i, last;
69
-
70
- if (clockwise === (signedArea(data, start, end, dim) > 0)) {
71
- for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
72
- } else {
73
- for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
74
- }
75
-
76
- if (last && equals(last, last.next)) {
77
- removeNode(last);
78
- last = last.next;
79
- }
80
-
81
- return last;
82
- }
83
-
84
- // eliminate colinear or duplicate points
85
- function filterPoints(start, end) {
86
- if (!start) return start;
87
- if (!end) end = start;
88
-
89
- var p = start,
90
- again;
91
- do {
92
- again = false;
93
-
94
- if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
95
- removeNode(p);
96
- p = end = p.prev;
97
- if (p === p.next) return null;
98
- again = true;
99
-
100
- } else {
101
- p = p.next;
102
- }
103
- } while (again || p !== end);
104
-
105
- return end;
106
- }
107
-
108
- // main ear slicing loop which triangulates a polygon (given as a linked list)
109
- function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
110
- if (!ear) return;
111
-
112
- // interlink polygon nodes in z-order
113
- if (!pass && size) indexCurve(ear, minX, minY, size);
114
-
115
- var stop = ear,
116
- prev, next;
117
-
118
- // iterate through ears, slicing them one by one
119
- while (ear.prev !== ear.next) {
120
- prev = ear.prev;
121
- next = ear.next;
122
-
123
- if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {
124
- // cut off the triangle
125
- triangles.push(prev.i / dim);
126
- triangles.push(ear.i / dim);
127
- triangles.push(next.i / dim);
128
-
129
- removeNode(ear);
130
-
131
- // skipping the next vertice leads to less sliver triangles
132
- ear = next.next;
133
- stop = next.next;
134
-
135
- continue;
136
- }
137
-
138
- ear = next;
139
-
140
- // if we looped through the whole remaining polygon and can't find any more ears
141
- if (ear === stop) {
142
- // try filtering points and slicing again
143
- if (!pass) {
144
- earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);
145
-
146
- // if this didn't work, try curing all small self-intersections locally
147
- } else if (pass === 1) {
148
- ear = cureLocalIntersections(ear, triangles, dim);
149
- earcutLinked(ear, triangles, dim, minX, minY, size, 2);
150
-
151
- // as a last resort, try splitting the remaining polygon into two
152
- } else if (pass === 2) {
153
- splitEarcut(ear, triangles, dim, minX, minY, size);
154
- }
155
-
156
- break;
157
- }
158
- }
159
- }
160
-
161
- // check whether a polygon node forms a valid ear with adjacent nodes
162
- function isEar(ear) {
163
- var a = ear.prev,
164
- b = ear,
165
- c = ear.next;
166
-
167
- if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
168
-
169
- // now make sure we don't have other points inside the potential ear
170
- var p = ear.next.next;
171
-
172
- while (p !== ear.prev) {
173
- if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
174
- area(p.prev, p, p.next) >= 0) return false;
175
- p = p.next;
176
- }
177
-
178
- return true;
179
- }
180
-
181
- function isEarHashed(ear, minX, minY, size) {
182
- var a = ear.prev,
183
- b = ear,
184
- c = ear.next;
185
-
186
- if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
187
-
188
- // triangle bbox; min & max are calculated like this for speed
189
- var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
190
- minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
191
- maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
192
- maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
193
-
194
- // z-order range for the current triangle bbox;
195
- var minZ = zOrder(minTX, minTY, minX, minY, size),
196
- maxZ = zOrder(maxTX, maxTY, minX, minY, size);
197
-
198
- // first look for points inside the triangle in increasing z-order
199
- var p = ear.nextZ;
200
-
201
- while (p && p.z <= maxZ) {
202
- if (p !== ear.prev && p !== ear.next &&
203
- pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
204
- area(p.prev, p, p.next) >= 0) return false;
205
- p = p.nextZ;
206
- }
207
-
208
- // then look for points in decreasing z-order
209
- p = ear.prevZ;
210
-
211
- while (p && p.z >= minZ) {
212
- if (p !== ear.prev && p !== ear.next &&
213
- pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
214
- area(p.prev, p, p.next) >= 0) return false;
215
- p = p.prevZ;
216
- }
217
-
218
- return true;
219
- }
220
-
221
- // go through all polygon nodes and cure small local self-intersections
222
- function cureLocalIntersections(start, triangles, dim) {
223
- var p = start;
224
- do {
225
- var a = p.prev,
226
- b = p.next.next;
227
-
228
- if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
229
-
230
- triangles.push(a.i / dim);
231
- triangles.push(p.i / dim);
232
- triangles.push(b.i / dim);
233
-
234
- // remove two nodes involved
235
- removeNode(p);
236
- removeNode(p.next);
237
-
238
- p = start = b;
239
- }
240
- p = p.next;
241
- } while (p !== start);
242
-
243
- return p;
244
- }
245
-
246
- // try splitting polygon into two and triangulate them independently
247
- function splitEarcut(start, triangles, dim, minX, minY, size) {
248
- // look for a valid diagonal that divides the polygon into two
249
- var a = start;
250
- do {
251
- var b = a.next.next;
252
- while (b !== a.prev) {
253
- if (a.i !== b.i && isValidDiagonal(a, b)) {
254
- // split the polygon in two by the diagonal
255
- var c = splitPolygon(a, b);
256
-
257
- // filter colinear points around the cuts
258
- a = filterPoints(a, a.next);
259
- c = filterPoints(c, c.next);
260
-
261
- // run earcut on each half
262
- earcutLinked(a, triangles, dim, minX, minY, size);
263
- earcutLinked(c, triangles, dim, minX, minY, size);
264
- return;
265
- }
266
- b = b.next;
267
- }
268
- a = a.next;
269
- } while (a !== start);
270
- }
271
-
272
- // link every hole into the outer loop, producing a single-ring polygon without holes
273
- function eliminateHoles(data, holeIndices, outerNode, dim) {
274
- var queue = [],
275
- i, len, start, end, list;
276
-
277
- for (i = 0, len = holeIndices.length; i < len; i++) {
278
- start = holeIndices[i] * dim;
279
- end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
280
- list = linkedList(data, start, end, dim, false);
281
- if (list === list.next) list.steiner = true;
282
- queue.push(getLeftmost(list));
283
- }
284
-
285
- queue.sort(compareX);
286
-
287
- // process holes from left to right
288
- for (i = 0; i < queue.length; i++) {
289
- eliminateHole(queue[i], outerNode);
290
- outerNode = filterPoints(outerNode, outerNode.next);
291
- }
292
-
293
- return outerNode;
294
- }
295
-
296
- function compareX(a, b) {
297
- return a.x - b.x;
298
- }
299
-
300
- // find a bridge between vertices that connects hole with an outer ring and and link it
301
- function eliminateHole(hole, outerNode) {
302
- outerNode = findHoleBridge(hole, outerNode);
303
- if (outerNode) {
304
- var b = splitPolygon(outerNode, hole);
305
- filterPoints(b, b.next);
306
- }
307
- }
308
-
309
- // David Eberly's algorithm for finding a bridge between hole and outer polygon
310
- function findHoleBridge(hole, outerNode) {
311
- var p = outerNode,
312
- hx = hole.x,
313
- hy = hole.y,
314
- qx = -Infinity,
315
- m;
316
-
317
- // find a segment intersected by a ray from the hole's leftmost point to the left;
318
- // segment's endpoint with lesser x will be potential connection point
319
- do {
320
- if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
321
- var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
322
- if (x <= hx && x > qx) {
323
- qx = x;
324
- if (x === hx) {
325
- if (hy === p.y) return p;
326
- if (hy === p.next.y) return p.next;
327
- }
328
- m = p.x < p.next.x ? p : p.next;
329
- }
330
- }
331
- p = p.next;
332
- } while (p !== outerNode);
333
-
334
- if (!m) return null;
335
-
336
- if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint
337
-
338
- // look for points inside the triangle of hole point, segment intersection and endpoint;
339
- // if there are no points found, we have a valid connection;
340
- // otherwise choose the point of the minimum angle with the ray as connection point
341
-
342
- var stop = m,
343
- mx = m.x,
344
- my = m.y,
345
- tanMin = Infinity,
346
- tan;
347
-
348
- p = m.next;
349
-
350
- while (p !== stop) {
351
- if (hx >= p.x && p.x >= mx && hx !== p.x &&
352
- pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
353
-
354
- tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
355
-
356
- if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {
357
- m = p;
358
- tanMin = tan;
359
- }
360
- }
361
-
362
- p = p.next;
363
- }
364
-
365
- return m;
366
- }
367
-
368
- // interlink polygon nodes in z-order
369
- function indexCurve(start, minX, minY, size) {
370
- var p = start;
371
- do {
372
- if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);
373
- p.prevZ = p.prev;
374
- p.nextZ = p.next;
375
- p = p.next;
376
- } while (p !== start);
377
-
378
- p.prevZ.nextZ = null;
379
- p.prevZ = null;
380
-
381
- sortLinked(p);
382
- }
383
-
384
- // Simon Tatham's linked list merge sort algorithm
385
- // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
386
- function sortLinked(list) {
387
- var i, p, q, e, tail, numMerges, pSize, qSize,
388
- inSize = 1;
389
-
390
- do {
391
- p = list;
392
- list = null;
393
- tail = null;
394
- numMerges = 0;
395
-
396
- while (p) {
397
- numMerges++;
398
- q = p;
399
- pSize = 0;
400
- for (i = 0; i < inSize; i++) {
401
- pSize++;
402
- q = q.nextZ;
403
- if (!q) break;
404
- }
405
- qSize = inSize;
406
-
407
- while (pSize > 0 || (qSize > 0 && q)) {
408
-
409
- if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
410
- e = p;
411
- p = p.nextZ;
412
- pSize--;
413
- } else {
414
- e = q;
415
- q = q.nextZ;
416
- qSize--;
417
- }
418
-
419
- if (tail) tail.nextZ = e;
420
- else list = e;
421
-
422
- e.prevZ = tail;
423
- tail = e;
424
- }
425
-
426
- p = q;
427
- }
428
-
429
- tail.nextZ = null;
430
- inSize *= 2;
431
-
432
- } while (numMerges > 1);
433
-
434
- return list;
435
- }
436
-
437
- // z-order of a point given coords and size of the data bounding box
438
- function zOrder(x, y, minX, minY, size) {
439
- // coords are transformed into non-negative 15-bit integer range
440
- x = 32767 * (x - minX) / size;
441
- y = 32767 * (y - minY) / size;
442
-
443
- x = (x | (x << 8)) & 0x00FF00FF;
444
- x = (x | (x << 4)) & 0x0F0F0F0F;
445
- x = (x | (x << 2)) & 0x33333333;
446
- x = (x | (x << 1)) & 0x55555555;
447
-
448
- y = (y | (y << 8)) & 0x00FF00FF;
449
- y = (y | (y << 4)) & 0x0F0F0F0F;
450
- y = (y | (y << 2)) & 0x33333333;
451
- y = (y | (y << 1)) & 0x55555555;
452
-
453
- return x | (y << 1);
454
- }
455
-
456
- // find the leftmost node of a polygon ring
457
- function getLeftmost(start) {
458
- var p = start,
459
- leftmost = start;
460
- do {
461
- if (p.x < leftmost.x) leftmost = p;
462
- p = p.next;
463
- } while (p !== start);
464
-
465
- return leftmost;
466
- }
467
-
468
- // check if a point lies within a convex triangle
469
- function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
470
- return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
471
- (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
472
- (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
473
- }
474
-
475
- // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
476
- function isValidDiagonal(a, b) {
477
- return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&
478
- locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);
479
- }
480
-
481
- // signed area of a triangle
482
- function area(p, q, r) {
483
- return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
484
- }
485
-
486
- // check if two points are equal
487
- function equals(p1, p2) {
488
- return p1.x === p2.x && p1.y === p2.y;
489
- }
490
-
491
- // check if two segments intersect
492
- function intersects(p1, q1, p2, q2) {
493
- if ((equals(p1, q1) && equals(p2, q2)) ||
494
- (equals(p1, q2) && equals(p2, q1))) return true;
495
- return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&
496
- area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;
497
- }
498
-
499
- // check if a polygon diagonal intersects any polygon segments
500
- function intersectsPolygon(a, b) {
501
- var p = a;
502
- do {
503
- if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
504
- intersects(p, p.next, a, b)) return true;
505
- p = p.next;
506
- } while (p !== a);
507
-
508
- return false;
509
- }
510
-
511
- // check if a polygon diagonal is locally inside the polygon
512
- function locallyInside(a, b) {
513
- return area(a.prev, a, a.next) < 0 ?
514
- area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
515
- area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
516
- }
517
-
518
- // check if the middle point of a polygon diagonal is inside the polygon
519
- function middleInside(a, b) {
520
- var p = a,
521
- inside = false,
522
- px = (a.x + b.x) / 2,
523
- py = (a.y + b.y) / 2;
524
- do {
525
- if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
526
- (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
527
- inside = !inside;
528
- p = p.next;
529
- } while (p !== a);
530
-
531
- return inside;
532
- }
533
-
534
- // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
535
- // if one belongs to the outer ring and another to a hole, it merges it into a single ring
536
- function splitPolygon(a, b) {
537
- var a2 = new Node(a.i, a.x, a.y),
538
- b2 = new Node(b.i, b.x, b.y),
539
- an = a.next,
540
- bp = b.prev;
541
-
542
- a.next = b;
543
- b.prev = a;
544
-
545
- a2.next = an;
546
- an.prev = a2;
547
-
548
- b2.next = a2;
549
- a2.prev = b2;
550
-
551
- bp.next = b2;
552
- b2.prev = bp;
553
-
554
- return b2;
555
- }
556
-
557
- // create a node and optionally link it with previous one (in a circular doubly linked list)
558
- function insertNode(i, x, y, last) {
559
- var p = new Node(i, x, y);
560
-
561
- if (!last) {
562
- p.prev = p;
563
- p.next = p;
564
-
565
- } else {
566
- p.next = last.next;
567
- p.prev = last;
568
- last.next.prev = p;
569
- last.next = p;
570
- }
571
- return p;
572
- }
573
-
574
- function removeNode(p) {
575
- p.next.prev = p.prev;
576
- p.prev.next = p.next;
577
-
578
- if (p.prevZ) p.prevZ.nextZ = p.nextZ;
579
- if (p.nextZ) p.nextZ.prevZ = p.prevZ;
580
- }
581
-
582
- function Node(i, x, y) {
583
- // vertice index in coordinates array
584
- this.i = i;
585
-
586
- // vertex coordinates
587
- this.x = x;
588
- this.y = y;
589
-
590
- // previous and next vertice nodes in a polygon ring
591
- this.prev = null;
592
- this.next = null;
593
-
594
- // z-order curve value
595
- this.z = null;
596
-
597
- // previous and next nodes in z-order
598
- this.prevZ = null;
599
- this.nextZ = null;
600
-
601
- // indicates whether this is a steiner point
602
- this.steiner = false;
603
- }
604
-
605
- // return a percentage difference between the polygon area and its triangulation area;
606
- // used to verify correctness of triangulation
607
- function deviation(data, holeIndices, dim, triangles) {
608
- var hasHoles = holeIndices && holeIndices.length;
609
- var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
610
-
611
- var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
612
- if (hasHoles) {
613
- for (let i = 0, len = holeIndices.length; i < len; i++) {
614
- var start = holeIndices[i] * dim;
615
- var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
616
- polygonArea -= Math.abs(signedArea(data, start, end, dim));
617
- }
618
- }
619
-
620
- var trianglesArea = 0;
621
- for (let i = 0; i < triangles.length; i += 3) {
622
- var a = triangles[i] * dim;
623
- var b = triangles[i + 1] * dim;
624
- var c = triangles[i + 2] * dim;
625
- trianglesArea += Math.abs(
626
- (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
627
- (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
628
- }
629
-
630
- return polygonArea === 0 && trianglesArea === 0 ? 0 :
631
- Math.abs((trianglesArea - polygonArea) / polygonArea);
632
- }
633
-
634
- function signedArea(data, start, end, dim) {
635
- var sum = 0;
636
- for (let i = start, j = end - dim; i < end; i += dim) {
637
- sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
638
- j = i;
639
- }
640
- return sum;
641
- }
642
-
643
- // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
644
- function flatten(data) {
645
- var dim = data[0][0].length,
646
- result = { vertices: [], holes: [], dimensions: dim },
647
- holeIndex = 0;
648
-
649
- for (let i = 0; i < data.length; i++) {
650
- for (let j = 0; j < data[i].length; j++) {
651
- for (let d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
652
- }
653
- if (i > 0) {
654
- holeIndex += data[i - 1].length;
655
- result.holes.push(holeIndex);
656
- }
657
- }
658
- return result;
659
- }
660
-
661
- export { earcut, flatten };
1
+ // @ts-nocheck
2
+
3
+ /* eslint-disable no-unused-vars */
4
+ /* eslint-disable curly */
5
+ /* eslint-disable operator-linebreak */
6
+ /* eslint-disable no-mixed-operators */
7
+
8
+ /**
9
+ * @module og/utils/earcut
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ // ISC License
15
+ //
16
+ // Copyright (c) 2016, Mapbox
17
+ //
18
+ // Permission to use, copy, modify, and/or distribute this software for any purpose
19
+ // with or without fee is hereby granted, provided that the above copyright notice
20
+ // and this permission notice appear in all copies.
21
+ //
22
+ // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
23
+ // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
24
+ // FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
25
+ // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
26
+ // OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27
+ // TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
28
+ // THIS SOFTWARE.
29
+ //
30
+ //https://github.com/mapbox/earcut
31
+ function earcut(data, holeIndices, dim) {
32
+
33
+ dim = dim || 2;
34
+
35
+ var hasHoles = holeIndices && holeIndices.length,
36
+ outerLen = hasHoles ? holeIndices[0] * dim : data.length,
37
+ outerNode = linkedList(data, 0, outerLen, dim, true),
38
+ triangles = [];
39
+
40
+ if (!outerNode) return triangles;
41
+
42
+ var minX, minY, maxX, maxY, x, y, size;
43
+
44
+ if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
45
+
46
+ // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
47
+ if (data.length > 80 * dim) {
48
+ minX = maxX = data[0];
49
+ minY = maxY = data[1];
50
+
51
+ for (let i = dim; i < outerLen; i += dim) {
52
+ x = data[i];
53
+ y = data[i + 1];
54
+ if (x < minX) minX = x;
55
+ if (y < minY) minY = y;
56
+ if (x > maxX) maxX = x;
57
+ if (y > maxY) maxY = y;
58
+ }
59
+
60
+ // minX, minY and size are later used to transform coords into integers for z-order calculation
61
+ size = Math.max(maxX - minX, maxY - minY);
62
+ }
63
+
64
+ earcutLinked(outerNode, triangles, dim, minX, minY, size);
65
+
66
+ return triangles;
67
+ }
68
+
69
+ // create a circular doubly linked list from polygon points in the specified winding order
70
+ function linkedList(data, start, end, dim, clockwise) {
71
+ var i, last;
72
+
73
+ if (clockwise === (signedArea(data, start, end, dim) > 0)) {
74
+ for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
75
+ } else {
76
+ for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
77
+ }
78
+
79
+ if (last && equals(last, last.next)) {
80
+ removeNode(last);
81
+ last = last.next;
82
+ }
83
+
84
+ return last;
85
+ }
86
+
87
+ // eliminate colinear or duplicate points
88
+ function filterPoints(start, end) {
89
+ if (!start) return start;
90
+ if (!end) end = start;
91
+
92
+ var p = start,
93
+ again;
94
+ do {
95
+ again = false;
96
+
97
+ if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
98
+ removeNode(p);
99
+ p = end = p.prev;
100
+ if (p === p.next) return null;
101
+ again = true;
102
+
103
+ } else {
104
+ p = p.next;
105
+ }
106
+ } while (again || p !== end);
107
+
108
+ return end;
109
+ }
110
+
111
+ // main ear slicing loop which triangulates a polygon (given as a linked list)
112
+ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
113
+ if (!ear) return;
114
+
115
+ // interlink polygon nodes in z-order
116
+ if (!pass && size) indexCurve(ear, minX, minY, size);
117
+
118
+ var stop = ear,
119
+ prev, next;
120
+
121
+ // iterate through ears, slicing them one by one
122
+ while (ear.prev !== ear.next) {
123
+ prev = ear.prev;
124
+ next = ear.next;
125
+
126
+ if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {
127
+ // cut off the triangle
128
+ triangles.push(prev.i / dim);
129
+ triangles.push(ear.i / dim);
130
+ triangles.push(next.i / dim);
131
+
132
+ removeNode(ear);
133
+
134
+ // skipping the next vertice leads to less sliver triangles
135
+ ear = next.next;
136
+ stop = next.next;
137
+
138
+ continue;
139
+ }
140
+
141
+ ear = next;
142
+
143
+ // if we looped through the whole remaining polygon and can't find any more ears
144
+ if (ear === stop) {
145
+ // try filtering points and slicing again
146
+ if (!pass) {
147
+ earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);
148
+
149
+ // if this didn't work, try curing all small self-intersections locally
150
+ } else if (pass === 1) {
151
+ ear = cureLocalIntersections(ear, triangles, dim);
152
+ earcutLinked(ear, triangles, dim, minX, minY, size, 2);
153
+
154
+ // as a last resort, try splitting the remaining polygon into two
155
+ } else if (pass === 2) {
156
+ splitEarcut(ear, triangles, dim, minX, minY, size);
157
+ }
158
+
159
+ break;
160
+ }
161
+ }
162
+ }
163
+
164
+ // check whether a polygon node forms a valid ear with adjacent nodes
165
+ function isEar(ear) {
166
+ var a = ear.prev,
167
+ b = ear,
168
+ c = ear.next;
169
+
170
+ if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
171
+
172
+ // now make sure we don't have other points inside the potential ear
173
+ var p = ear.next.next;
174
+
175
+ while (p !== ear.prev) {
176
+ if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
177
+ area(p.prev, p, p.next) >= 0) return false;
178
+ p = p.next;
179
+ }
180
+
181
+ return true;
182
+ }
183
+
184
+ function isEarHashed(ear, minX, minY, size) {
185
+ var a = ear.prev,
186
+ b = ear,
187
+ c = ear.next;
188
+
189
+ if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
190
+
191
+ // triangle bbox; min & max are calculated like this for speed
192
+ var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
193
+ minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
194
+ maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
195
+ maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
196
+
197
+ // z-order range for the current triangle bbox;
198
+ var minZ = zOrder(minTX, minTY, minX, minY, size),
199
+ maxZ = zOrder(maxTX, maxTY, minX, minY, size);
200
+
201
+ // first look for points inside the triangle in increasing z-order
202
+ var p = ear.nextZ;
203
+
204
+ while (p && p.z <= maxZ) {
205
+ if (p !== ear.prev && p !== ear.next &&
206
+ pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
207
+ area(p.prev, p, p.next) >= 0) return false;
208
+ p = p.nextZ;
209
+ }
210
+
211
+ // then look for points in decreasing z-order
212
+ p = ear.prevZ;
213
+
214
+ while (p && p.z >= minZ) {
215
+ if (p !== ear.prev && p !== ear.next &&
216
+ pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
217
+ area(p.prev, p, p.next) >= 0) return false;
218
+ p = p.prevZ;
219
+ }
220
+
221
+ return true;
222
+ }
223
+
224
+ // go through all polygon nodes and cure small local self-intersections
225
+ function cureLocalIntersections(start, triangles, dim) {
226
+ var p = start;
227
+ do {
228
+ var a = p.prev,
229
+ b = p.next.next;
230
+
231
+ if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
232
+
233
+ triangles.push(a.i / dim);
234
+ triangles.push(p.i / dim);
235
+ triangles.push(b.i / dim);
236
+
237
+ // remove two nodes involved
238
+ removeNode(p);
239
+ removeNode(p.next);
240
+
241
+ p = start = b;
242
+ }
243
+ p = p.next;
244
+ } while (p !== start);
245
+
246
+ return p;
247
+ }
248
+
249
+ // try splitting polygon into two and triangulate them independently
250
+ function splitEarcut(start, triangles, dim, minX, minY, size) {
251
+ // look for a valid diagonal that divides the polygon into two
252
+ var a = start;
253
+ do {
254
+ var b = a.next.next;
255
+ while (b !== a.prev) {
256
+ if (a.i !== b.i && isValidDiagonal(a, b)) {
257
+ // split the polygon in two by the diagonal
258
+ var c = splitPolygon(a, b);
259
+
260
+ // filter colinear points around the cuts
261
+ a = filterPoints(a, a.next);
262
+ c = filterPoints(c, c.next);
263
+
264
+ // run earcut on each half
265
+ earcutLinked(a, triangles, dim, minX, minY, size);
266
+ earcutLinked(c, triangles, dim, minX, minY, size);
267
+ return;
268
+ }
269
+ b = b.next;
270
+ }
271
+ a = a.next;
272
+ } while (a !== start);
273
+ }
274
+
275
+ // link every hole into the outer loop, producing a single-ring polygon without holes
276
+ function eliminateHoles(data, holeIndices, outerNode, dim) {
277
+ var queue = [],
278
+ i, len, start, end, list;
279
+
280
+ for (i = 0, len = holeIndices.length; i < len; i++) {
281
+ start = holeIndices[i] * dim;
282
+ end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
283
+ list = linkedList(data, start, end, dim, false);
284
+ if (list === list.next) list.steiner = true;
285
+ queue.push(getLeftmost(list));
286
+ }
287
+
288
+ queue.sort(compareX);
289
+
290
+ // process holes from left to right
291
+ for (i = 0; i < queue.length; i++) {
292
+ eliminateHole(queue[i], outerNode);
293
+ outerNode = filterPoints(outerNode, outerNode.next);
294
+ }
295
+
296
+ return outerNode;
297
+ }
298
+
299
+ function compareX(a, b) {
300
+ return a.x - b.x;
301
+ }
302
+
303
+ // find a bridge between vertices that connects hole with an outer ring and and link it
304
+ function eliminateHole(hole, outerNode) {
305
+ outerNode = findHoleBridge(hole, outerNode);
306
+ if (outerNode) {
307
+ var b = splitPolygon(outerNode, hole);
308
+ filterPoints(b, b.next);
309
+ }
310
+ }
311
+
312
+ // David Eberly's algorithm for finding a bridge between hole and outer polygon
313
+ function findHoleBridge(hole, outerNode) {
314
+ var p = outerNode,
315
+ hx = hole.x,
316
+ hy = hole.y,
317
+ qx = -Infinity,
318
+ m;
319
+
320
+ // find a segment intersected by a ray from the hole's leftmost point to the left;
321
+ // segment's endpoint with lesser x will be potential connection point
322
+ do {
323
+ if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
324
+ var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
325
+ if (x <= hx && x > qx) {
326
+ qx = x;
327
+ if (x === hx) {
328
+ if (hy === p.y) return p;
329
+ if (hy === p.next.y) return p.next;
330
+ }
331
+ m = p.x < p.next.x ? p : p.next;
332
+ }
333
+ }
334
+ p = p.next;
335
+ } while (p !== outerNode);
336
+
337
+ if (!m) return null;
338
+
339
+ if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint
340
+
341
+ // look for points inside the triangle of hole point, segment intersection and endpoint;
342
+ // if there are no points found, we have a valid connection;
343
+ // otherwise choose the point of the minimum angle with the ray as connection point
344
+
345
+ var stop = m,
346
+ mx = m.x,
347
+ my = m.y,
348
+ tanMin = Infinity,
349
+ tan;
350
+
351
+ p = m.next;
352
+
353
+ while (p !== stop) {
354
+ if (hx >= p.x && p.x >= mx && hx !== p.x &&
355
+ pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
356
+
357
+ tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
358
+
359
+ if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {
360
+ m = p;
361
+ tanMin = tan;
362
+ }
363
+ }
364
+
365
+ p = p.next;
366
+ }
367
+
368
+ return m;
369
+ }
370
+
371
+ // interlink polygon nodes in z-order
372
+ function indexCurve(start, minX, minY, size) {
373
+ var p = start;
374
+ do {
375
+ if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);
376
+ p.prevZ = p.prev;
377
+ p.nextZ = p.next;
378
+ p = p.next;
379
+ } while (p !== start);
380
+
381
+ p.prevZ.nextZ = null;
382
+ p.prevZ = null;
383
+
384
+ sortLinked(p);
385
+ }
386
+
387
+ // Simon Tatham's linked list merge sort algorithm
388
+ // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
389
+ function sortLinked(list) {
390
+ var i, p, q, e, tail, numMerges, pSize, qSize,
391
+ inSize = 1;
392
+
393
+ do {
394
+ p = list;
395
+ list = null;
396
+ tail = null;
397
+ numMerges = 0;
398
+
399
+ while (p) {
400
+ numMerges++;
401
+ q = p;
402
+ pSize = 0;
403
+ for (i = 0; i < inSize; i++) {
404
+ pSize++;
405
+ q = q.nextZ;
406
+ if (!q) break;
407
+ }
408
+ qSize = inSize;
409
+
410
+ while (pSize > 0 || (qSize > 0 && q)) {
411
+
412
+ if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
413
+ e = p;
414
+ p = p.nextZ;
415
+ pSize--;
416
+ } else {
417
+ e = q;
418
+ q = q.nextZ;
419
+ qSize--;
420
+ }
421
+
422
+ if (tail) tail.nextZ = e;
423
+ else list = e;
424
+
425
+ e.prevZ = tail;
426
+ tail = e;
427
+ }
428
+
429
+ p = q;
430
+ }
431
+
432
+ tail.nextZ = null;
433
+ inSize *= 2;
434
+
435
+ } while (numMerges > 1);
436
+
437
+ return list;
438
+ }
439
+
440
+ // z-order of a point given coords and size of the data bounding box
441
+ function zOrder(x, y, minX, minY, size) {
442
+ // coords are transformed into non-negative 15-bit integer range
443
+ x = 32767 * (x - minX) / size;
444
+ y = 32767 * (y - minY) / size;
445
+
446
+ x = (x | (x << 8)) & 0x00FF00FF;
447
+ x = (x | (x << 4)) & 0x0F0F0F0F;
448
+ x = (x | (x << 2)) & 0x33333333;
449
+ x = (x | (x << 1)) & 0x55555555;
450
+
451
+ y = (y | (y << 8)) & 0x00FF00FF;
452
+ y = (y | (y << 4)) & 0x0F0F0F0F;
453
+ y = (y | (y << 2)) & 0x33333333;
454
+ y = (y | (y << 1)) & 0x55555555;
455
+
456
+ return x | (y << 1);
457
+ }
458
+
459
+ // find the leftmost node of a polygon ring
460
+ function getLeftmost(start) {
461
+ var p = start,
462
+ leftmost = start;
463
+ do {
464
+ if (p.x < leftmost.x) leftmost = p;
465
+ p = p.next;
466
+ } while (p !== start);
467
+
468
+ return leftmost;
469
+ }
470
+
471
+ // check if a point lies within a convex triangle
472
+ function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
473
+ return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
474
+ (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
475
+ (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
476
+ }
477
+
478
+ // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
479
+ function isValidDiagonal(a, b) {
480
+ return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&
481
+ locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);
482
+ }
483
+
484
+ // signed area of a triangle
485
+ function area(p, q, r) {
486
+ return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
487
+ }
488
+
489
+ // check if two points are equal
490
+ function equals(p1, p2) {
491
+ return p1.x === p2.x && p1.y === p2.y;
492
+ }
493
+
494
+ // check if two segments intersect
495
+ function intersects(p1, q1, p2, q2) {
496
+ if ((equals(p1, q1) && equals(p2, q2)) ||
497
+ (equals(p1, q2) && equals(p2, q1))) return true;
498
+ return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&
499
+ area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;
500
+ }
501
+
502
+ // check if a polygon diagonal intersects any polygon segments
503
+ function intersectsPolygon(a, b) {
504
+ var p = a;
505
+ do {
506
+ if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
507
+ intersects(p, p.next, a, b)) return true;
508
+ p = p.next;
509
+ } while (p !== a);
510
+
511
+ return false;
512
+ }
513
+
514
+ // check if a polygon diagonal is locally inside the polygon
515
+ function locallyInside(a, b) {
516
+ return area(a.prev, a, a.next) < 0 ?
517
+ area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
518
+ area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
519
+ }
520
+
521
+ // check if the middle point of a polygon diagonal is inside the polygon
522
+ function middleInside(a, b) {
523
+ var p = a,
524
+ inside = false,
525
+ px = (a.x + b.x) / 2,
526
+ py = (a.y + b.y) / 2;
527
+ do {
528
+ if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
529
+ (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
530
+ inside = !inside;
531
+ p = p.next;
532
+ } while (p !== a);
533
+
534
+ return inside;
535
+ }
536
+
537
+ // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
538
+ // if one belongs to the outer ring and another to a hole, it merges it into a single ring
539
+ function splitPolygon(a, b) {
540
+ var a2 = new Node(a.i, a.x, a.y),
541
+ b2 = new Node(b.i, b.x, b.y),
542
+ an = a.next,
543
+ bp = b.prev;
544
+
545
+ a.next = b;
546
+ b.prev = a;
547
+
548
+ a2.next = an;
549
+ an.prev = a2;
550
+
551
+ b2.next = a2;
552
+ a2.prev = b2;
553
+
554
+ bp.next = b2;
555
+ b2.prev = bp;
556
+
557
+ return b2;
558
+ }
559
+
560
+ // create a node and optionally link it with previous one (in a circular doubly linked list)
561
+ function insertNode(i, x, y, last) {
562
+ var p = new Node(i, x, y);
563
+
564
+ if (!last) {
565
+ p.prev = p;
566
+ p.next = p;
567
+
568
+ } else {
569
+ p.next = last.next;
570
+ p.prev = last;
571
+ last.next.prev = p;
572
+ last.next = p;
573
+ }
574
+ return p;
575
+ }
576
+
577
+ function removeNode(p) {
578
+ p.next.prev = p.prev;
579
+ p.prev.next = p.next;
580
+
581
+ if (p.prevZ) p.prevZ.nextZ = p.nextZ;
582
+ if (p.nextZ) p.nextZ.prevZ = p.prevZ;
583
+ }
584
+
585
+ function Node(i, x, y) {
586
+ // vertice index in coordinates array
587
+ this.i = i;
588
+
589
+ // vertex coordinates
590
+ this.x = x;
591
+ this.y = y;
592
+
593
+ // previous and next vertice nodes in a polygon ring
594
+ this.prev = null;
595
+ this.next = null;
596
+
597
+ // z-order curve value
598
+ this.z = null;
599
+
600
+ // previous and next nodes in z-order
601
+ this.prevZ = null;
602
+ this.nextZ = null;
603
+
604
+ // indicates whether this is a steiner point
605
+ this.steiner = false;
606
+ }
607
+
608
+ // return a percentage difference between the polygon area and its triangulation area;
609
+ // used to verify correctness of triangulation
610
+ function deviation(data, holeIndices, dim, triangles) {
611
+ var hasHoles = holeIndices && holeIndices.length;
612
+ var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
613
+
614
+ var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
615
+ if (hasHoles) {
616
+ for (let i = 0, len = holeIndices.length; i < len; i++) {
617
+ var start = holeIndices[i] * dim;
618
+ var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
619
+ polygonArea -= Math.abs(signedArea(data, start, end, dim));
620
+ }
621
+ }
622
+
623
+ var trianglesArea = 0;
624
+ for (let i = 0; i < triangles.length; i += 3) {
625
+ var a = triangles[i] * dim;
626
+ var b = triangles[i + 1] * dim;
627
+ var c = triangles[i + 2] * dim;
628
+ trianglesArea += Math.abs(
629
+ (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
630
+ (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
631
+ }
632
+
633
+ return polygonArea === 0 && trianglesArea === 0 ? 0 :
634
+ Math.abs((trianglesArea - polygonArea) / polygonArea);
635
+ }
636
+
637
+ function signedArea(data, start, end, dim) {
638
+ var sum = 0;
639
+ for (let i = start, j = end - dim; i < end; i += dim) {
640
+ sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
641
+ j = i;
642
+ }
643
+ return sum;
644
+ }
645
+
646
+ // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
647
+ function flatten(data) {
648
+ var dim = data[0][0].length,
649
+ result = { vertices: [], holes: [], dimensions: dim },
650
+ holeIndex = 0;
651
+
652
+ for (let i = 0; i < data.length; i++) {
653
+ for (let j = 0; j < data[i].length; j++) {
654
+ for (let d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
655
+ }
656
+ if (i > 0) {
657
+ holeIndex += data[i - 1].length;
658
+ result.holes.push(holeIndex);
659
+ }
660
+ }
661
+ return result;
662
+ }
663
+
664
+ export { earcut, flatten };