@pirireis/webglobeplugins 1.0.2 → 1.0.4

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 (277) hide show
  1. package/package.json +2 -2
  2. package/plugins/alarms/alarmFadeInFadeOutPlugin/AlarmTimeLineFadeInFadeOutPlugin.js +399 -0
  3. package/{Math/angle-calculation.ts → webglobeplugins/Math/angle-calculation.js} +14 -18
  4. package/{Math/arc-cdf-points.ts → webglobeplugins/Math/arc-cdf-points.js} +272 -329
  5. package/{Math/arc-generate-points-exponantial.ts → webglobeplugins/Math/arc-generate-points-exponantial.js} +254 -299
  6. package/{Math/arc.ts → webglobeplugins/Math/arc.js} +292 -421
  7. package/{Math → webglobeplugins/Math}/bounds/line-bbox.js +186 -225
  8. package/{Math/circle-cdf-points.ts → webglobeplugins/Math/circle-cdf-points.js} +78 -143
  9. package/{Math/circle.ts → webglobeplugins/Math/circle.js} +33 -49
  10. package/{Math/constants.ts → webglobeplugins/Math/constants.js} +4 -12
  11. package/{Math/contour/quadtreecontours.ts → webglobeplugins/Math/contour/quadtreecontours.js} +300 -371
  12. package/{Math → webglobeplugins/Math}/contour/quadtreecontours1.js +298 -336
  13. package/{Math/finite-line-2d.ts → webglobeplugins/Math/finite-line-2d.js} +58 -68
  14. package/{Math/haversine.ts → webglobeplugins/Math/haversine.js} +22 -33
  15. package/webglobeplugins/Math/index.js +1 -0
  16. package/{Math/juction/arc-plane.ts → webglobeplugins/Math/juction/arc-plane.js} +143 -203
  17. package/{Math/juction/line-sphere.ts → webglobeplugins/Math/juction/line-sphere.js} +22 -32
  18. package/{Math/juction/plane-plane.ts → webglobeplugins/Math/juction/plane-plane.js} +53 -62
  19. package/{Math/line.ts → webglobeplugins/Math/line.js} +52 -84
  20. package/webglobeplugins/Math/matrix4.js +1 -0
  21. package/{Math/methods.ts → webglobeplugins/Math/methods.js} +126 -182
  22. package/{Math/plane.ts → webglobeplugins/Math/plane.js} +56 -92
  23. package/{Math/quaternion.ts → webglobeplugins/Math/quaternion.js} +106 -128
  24. package/{Math/templete-shapes/grid-visually-equal.ts → webglobeplugins/Math/templete-shapes/grid-visually-equal.js} +65 -118
  25. package/webglobeplugins/Math/tessellation/constants.js +1 -0
  26. package/{Math/tessellation/methods.ts → webglobeplugins/Math/tessellation/methods.js} +49 -79
  27. package/{Math/tessellation/nearest-value-padding.ts → webglobeplugins/Math/tessellation/nearest-value-padding.js} +112 -147
  28. package/{Math/tessellation/spherical-triangle-area.ts → webglobeplugins/Math/tessellation/spherical-triangle-area.js} +99 -127
  29. package/{Math/tessellation/tile-merger.ts → webglobeplugins/Math/tessellation/tile-merger.js} +429 -578
  30. package/{Math/tessellation/triangle-tessellation.ts → webglobeplugins/Math/tessellation/triangle-tessellation.js} +464 -533
  31. package/webglobeplugins/Math/tessellation/types.js +1 -0
  32. package/webglobeplugins/Math/types.js +1 -0
  33. package/{Math → webglobeplugins/Math}/utils.js +2 -3
  34. package/{Math/vec3.ts → webglobeplugins/Math/vec3.js} +155 -227
  35. package/{Math/xyz-tile.ts → webglobeplugins/Math/xyz-tile.js} +18 -26
  36. package/{algorithms → webglobeplugins/algorithms}/search-binary.js +16 -14
  37. package/webglobeplugins/altitude-locator/adaptors.js +1 -0
  38. package/webglobeplugins/altitude-locator/keymethod.js +1 -0
  39. package/{altitude-locator → webglobeplugins/altitude-locator}/plugin.js +344 -445
  40. package/{altitude-locator → webglobeplugins/altitude-locator}/types.js +21 -26
  41. package/{compass-rose → webglobeplugins/compass-rose}/compass-rose-padding-flat.js +230 -274
  42. package/{compass-rose/compass-text-writer.ts → webglobeplugins/compass-rose/compass-text-writer.js} +155 -210
  43. package/{compass-rose → webglobeplugins/compass-rose}/index.js +3 -3
  44. package/{constants.ts → webglobeplugins/constants.js} +6 -8
  45. package/{heatwave → webglobeplugins/heatwave}/datamanager.js +149 -168
  46. package/{heatwave → webglobeplugins/heatwave}/heatwave.js +206 -261
  47. package/{heatwave → webglobeplugins/heatwave}/index.js +5 -5
  48. package/{heatwave → webglobeplugins/heatwave}/isobar.js +306 -340
  49. package/{heatwave/texture-point-sampler.ts → webglobeplugins/heatwave/texture-point-sampler.js} +187 -220
  50. package/webglobeplugins/investigation-tools/draw/tiles/adapters.js +67 -0
  51. package/{investigation-tools/draw/tiles/tiles.ts → webglobeplugins/investigation-tools/draw/tiles/tiles.js} +128 -162
  52. package/{jest.config.js → webglobeplugins/jest.config.js} +7 -6
  53. package/{pin → webglobeplugins/pin}/pin-object-array1.js +300 -381
  54. package/{pin → webglobeplugins/pin}/pin-point-totem1.js +60 -77
  55. package/{programs → webglobeplugins/programs}/arrowfield/arrow-field.js +60 -89
  56. package/{programs → webglobeplugins/programs}/arrowfield/logic.js +141 -173
  57. package/{programs → webglobeplugins/programs}/data2legend/density-to-legend.js +68 -86
  58. package/{programs → webglobeplugins/programs}/data2legend/point-to-density-texture.js +67 -84
  59. package/{programs → webglobeplugins/programs}/float2legendwithratio/index.js +2 -3
  60. package/{programs → webglobeplugins/programs}/float2legendwithratio/logic.js +118 -144
  61. package/{programs → webglobeplugins/programs}/float2legendwithratio/object.js +104 -141
  62. package/{programs → webglobeplugins/programs}/helpers/blender.js +58 -73
  63. package/{programs/helpers/fadeaway.ts → webglobeplugins/programs/helpers/fadeaway.js} +60 -73
  64. package/{programs → webglobeplugins/programs}/index.js +20 -19
  65. package/{programs → webglobeplugins/programs}/line-on-globe/circle-accurate-3d.js +85 -112
  66. package/{programs → webglobeplugins/programs}/line-on-globe/circle-accurate-flat.js +148 -200
  67. package/{programs → webglobeplugins/programs}/line-on-globe/degree-padding-around-circle-3d.js +102 -134
  68. package/webglobeplugins/programs/line-on-globe/index.js +1 -0
  69. package/{programs → webglobeplugins/programs}/line-on-globe/lines-color-instanced-flat.js +80 -99
  70. package/webglobeplugins/programs/line-on-globe/linestrip/data.js +4 -0
  71. package/{programs/line-on-globe/linestrip/linestrip.ts → webglobeplugins/programs/line-on-globe/linestrip/linestrip.js} +93 -152
  72. package/{programs/line-on-globe/naive-accurate-flexible.ts → webglobeplugins/programs/line-on-globe/naive-accurate-flexible.js} +126 -175
  73. package/{programs → webglobeplugins/programs}/line-on-globe/util.js +5 -8
  74. package/{programs → webglobeplugins/programs}/picking/pickable-polygon-renderer.js +98 -129
  75. package/{programs → webglobeplugins/programs}/picking/pickable-renderer.js +98 -130
  76. package/{programs → webglobeplugins/programs}/point-on-globe/element-globe-surface-glow.js +93 -122
  77. package/{programs → webglobeplugins/programs}/point-on-globe/element-point-glow.js +80 -114
  78. package/{programs → webglobeplugins/programs}/point-on-globe/square-pixel-point.js +121 -139
  79. package/{programs/polygon-on-globe/texture-dem-triangles.ts → webglobeplugins/programs/polygon-on-globe/texture-dem-triangles.js} +178 -209
  80. package/{programs/programcache.ts → webglobeplugins/programs/programcache.js} +126 -134
  81. package/webglobeplugins/programs/rings/index.js +1 -0
  82. package/{programs/rings/partial-ring/piece-of-pie.ts → webglobeplugins/programs/rings/partial-ring/piece-of-pie.js} +152 -222
  83. package/webglobeplugins/programs/totems/attachments/adaptive-opacity.js +131 -0
  84. package/{programs/totems/dem-textures-manager.ts → webglobeplugins/programs/totems/attachments/dem-textures-manager.js} +263 -360
  85. package/webglobeplugins/programs/totems/camera-totem-attactment-interface.js +1 -0
  86. package/{programs/totems/camerauniformblock.ts → webglobeplugins/programs/totems/camerauniformblock.js} +225 -310
  87. package/{programs/totems/canvas-webglobe-info.ts → webglobeplugins/programs/totems/canvas-webglobe-info.js} +132 -147
  88. package/{programs/totems/globe-changes.ts → webglobeplugins/programs/totems/globe-changes.js} +59 -79
  89. package/{programs → webglobeplugins/programs}/totems/gpu-selection-uniform-block.js +99 -127
  90. package/{programs/totems/index.ts → webglobeplugins/programs/totems/index.js} +2 -2
  91. package/{programs → webglobeplugins/programs}/two-d/pixel-padding-for-compass.js +87 -101
  92. package/{programs → webglobeplugins/programs}/util.js +14 -19
  93. package/{programs/vectorfields/logics/constants.ts → webglobeplugins/programs/vectorfields/logics/constants.js} +4 -5
  94. package/{programs/vectorfields/logics/drawrectangleparticles.ts → webglobeplugins/programs/vectorfields/logics/drawrectangleparticles.js} +107 -136
  95. package/{programs → webglobeplugins/programs}/vectorfields/logics/index.js +2 -4
  96. package/webglobeplugins/programs/vectorfields/logics/particle-ubo.js +19 -0
  97. package/{programs/vectorfields/logics/pixelbased.ts → webglobeplugins/programs/vectorfields/logics/pixelbased.js} +89 -122
  98. package/{programs → webglobeplugins/programs}/vectorfields/logics/ubo.js +51 -57
  99. package/{programs/vectorfields/pingpongbuffermanager.ts → webglobeplugins/programs/vectorfields/pingpongbuffermanager.js} +99 -113
  100. package/{range-tools-on-terrain/bearing-line/adapters.ts → webglobeplugins/range-tools-on-terrain/bearing-line/adapters.js} +114 -154
  101. package/{range-tools-on-terrain/bearing-line/plugin.ts → webglobeplugins/range-tools-on-terrain/bearing-line/plugin.js} +457 -569
  102. package/webglobeplugins/range-tools-on-terrain/bearing-line/types.js +1 -0
  103. package/{range-tools-on-terrain/circle-line-chain/adapters.ts → webglobeplugins/range-tools-on-terrain/circle-line-chain/adapters.js} +85 -104
  104. package/{range-tools-on-terrain/circle-line-chain/chain-list-map.ts → webglobeplugins/range-tools-on-terrain/circle-line-chain/chain-list-map.js} +382 -446
  105. package/{range-tools-on-terrain/circle-line-chain/plugin.ts → webglobeplugins/range-tools-on-terrain/circle-line-chain/plugin.js} +464 -607
  106. package/webglobeplugins/range-tools-on-terrain/circle-line-chain/types.js +1 -0
  107. package/{range-tools-on-terrain/range-ring/adapters.ts → webglobeplugins/range-tools-on-terrain/range-ring/adapters.js} +93 -114
  108. package/{range-tools-on-terrain/range-ring/enum.ts → webglobeplugins/range-tools-on-terrain/range-ring/enum.js} +2 -2
  109. package/{range-tools-on-terrain/range-ring/plugin.ts → webglobeplugins/range-tools-on-terrain/range-ring/plugin.js} +377 -444
  110. package/webglobeplugins/range-tools-on-terrain/range-ring/rangeringangletext.js +331 -0
  111. package/webglobeplugins/range-tools-on-terrain/range-ring/types.js +9 -0
  112. package/webglobeplugins/semiplugins/interface.js +1 -0
  113. package/{semiplugins/lightweight/line-plugin.ts → webglobeplugins/semiplugins/lightweight/line-plugin.js} +221 -342
  114. package/{semiplugins/lightweight/piece-of-pie-plugin.ts → webglobeplugins/semiplugins/lightweight/piece-of-pie-plugin.js} +200 -275
  115. package/{semiplugins/shape-on-terrain/arc-plugin.ts → webglobeplugins/semiplugins/shape-on-terrain/arc-plugin.js} +481 -616
  116. package/{semiplugins/shape-on-terrain/circle-plugin.ts → webglobeplugins/semiplugins/shape-on-terrain/circle-plugin.js} +444 -588
  117. package/{semiplugins/shape-on-terrain/padding-1-degree.ts → webglobeplugins/semiplugins/shape-on-terrain/padding-1-degree.js} +539 -713
  118. package/{semiplugins/shape-on-terrain/terrain-polygon/adapters.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/adapters.js} +55 -69
  119. package/{semiplugins/shape-on-terrain/terrain-polygon/data/cache.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/cache.js} +104 -149
  120. package/{semiplugins/shape-on-terrain/terrain-polygon/data/index-polygon-map.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/index-polygon-map.js} +45 -58
  121. package/{semiplugins/shape-on-terrain/terrain-polygon/data/manager.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/manager.js} +4 -4
  122. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +241 -0
  123. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/polygon-to-triangles.js +76 -0
  124. package/{semiplugins/shape-on-terrain/terrain-polygon/data/random.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/random.js} +121 -165
  125. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/types.js +1 -0
  126. package/{semiplugins/shape-on-terrain/terrain-polygon/data/worker-contact.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/worker-contact.js} +64 -81
  127. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +162 -0
  128. package/{semiplugins/shape-on-terrain/terrain-polygon/terrain-polygon.ts → webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/terrain-polygon.js} +282 -265
  129. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/test-records.js +14 -0
  130. package/webglobeplugins/semiplugins/shape-on-terrain/terrain-polygon/types.js +8 -0
  131. package/webglobeplugins/semiplugins/shell/bbox-renderer/index.js +2 -0
  132. package/{semiplugins/shell/bbox-renderer/logic.ts → webglobeplugins/semiplugins/shell/bbox-renderer/logic.js} +209 -273
  133. package/webglobeplugins/semiplugins/shell/bbox-renderer/object.js +78 -0
  134. package/webglobeplugins/semiplugins/type.js +1 -0
  135. package/{semiplugins/utility/container-plugin.ts → webglobeplugins/semiplugins/utility/container-plugin.js} +94 -126
  136. package/{semiplugins/utility/object-pass-container-plugin.ts → webglobeplugins/semiplugins/utility/object-pass-container-plugin.js} +80 -101
  137. package/{shaders → webglobeplugins/shaders}/fragment-toy/firework.js +1 -1
  138. package/{shaders → webglobeplugins/shaders}/fragment-toy/singularity.js +2 -5
  139. package/{tracks → webglobeplugins/tracks}/point-heat-map/adaptors/timetracksplugin-format-to-this.js +63 -78
  140. package/webglobeplugins/tracks/point-heat-map/index.js +1 -0
  141. package/{tracks → webglobeplugins/tracks}/point-heat-map/plugin-webworker.js +121 -148
  142. package/{tracks → webglobeplugins/tracks}/point-heat-map/point-to-heat-map-flow.js +121 -150
  143. package/{tracks → webglobeplugins/tracks}/point-tracks/key-methods.js +2 -3
  144. package/{tracks → webglobeplugins/tracks}/point-tracks/plugin.js +401 -487
  145. package/{tracks → webglobeplugins/tracks}/timetracks/adaptors-line-strip.js +65 -79
  146. package/{tracks → webglobeplugins/tracks}/timetracks/plugin-line-strip.js +240 -295
  147. package/{tracks → webglobeplugins/tracks}/timetracks/program-line-strip.js +413 -495
  148. package/{tracks → webglobeplugins/tracks}/timetracks/programpoint-line-strip.js +109 -137
  149. package/webglobeplugins/types.js +19 -0
  150. package/{util → webglobeplugins/util}/account/bufferoffsetmanager.js +176 -209
  151. package/webglobeplugins/util/account/create-buffermap-orchastration.js +39 -0
  152. package/{util → webglobeplugins/util}/account/index.js +3 -6
  153. package/{util/account/single-attribute-buffer-management/buffer-manager.ts → webglobeplugins/util/account/single-attribute-buffer-management/buffer-manager.js} +119 -151
  154. package/{util/account/single-attribute-buffer-management/buffer-orchestrator.ts → webglobeplugins/util/account/single-attribute-buffer-management/buffer-orchestrator.js} +212 -238
  155. package/{util/account/single-attribute-buffer-management/buffer-orchestrator1.ts → webglobeplugins/util/account/single-attribute-buffer-management/buffer-orchestrator1.js} +159 -184
  156. package/{util/account/single-attribute-buffer-management/index.ts → webglobeplugins/util/account/single-attribute-buffer-management/index.js} +4 -11
  157. package/{util/account/single-attribute-buffer-management/object-store.ts → webglobeplugins/util/account/single-attribute-buffer-management/object-store.js} +55 -76
  158. package/webglobeplugins/util/account/single-attribute-buffer-management/types.js +1 -0
  159. package/{util → webglobeplugins/util}/account/util.js +18 -22
  160. package/webglobeplugins/util/algorithms/index.js +1 -0
  161. package/{util → webglobeplugins/util}/algorithms/search-binary.js +25 -26
  162. package/{util/build-strategy/static-dynamic.ts → webglobeplugins/util/build-strategy/static-dynamic.js} +41 -50
  163. package/webglobeplugins/util/check/index.js +1 -0
  164. package/webglobeplugins/util/check/typecheck.js +66 -0
  165. package/{util/frame-counter-trigger.ts → webglobeplugins/util/frame-counter-trigger.js} +84 -99
  166. package/{util/geometry/index.ts → webglobeplugins/util/geometry/index.js} +121 -155
  167. package/webglobeplugins/util/gl-util/buffer/attribute-loader.js +74 -0
  168. package/{util/gl-util/buffer/index.ts → webglobeplugins/util/gl-util/buffer/index.js} +3 -6
  169. package/{util/gl-util/draw-options/methods.ts → webglobeplugins/util/gl-util/draw-options/methods.js} +32 -47
  170. package/{util/gl-util/uniform-block/manager.ts → webglobeplugins/util/gl-util/uniform-block/manager.js} +209 -232
  171. package/{util/globe-default-gl-states.ts → webglobeplugins/util/globe-default-gl-states.js} +4 -5
  172. package/{util/helper-methods.ts → webglobeplugins/util/helper-methods.js} +8 -9
  173. package/{util → webglobeplugins/util}/index.js +10 -9
  174. package/webglobeplugins/util/interpolation/index.js +1 -0
  175. package/webglobeplugins/util/interpolation/timetrack/index.js +2 -0
  176. package/{util → webglobeplugins/util}/interpolation/timetrack/timetrack-interpolator.js +79 -94
  177. package/{util → webglobeplugins/util}/interpolation/timetrack/web-worker.js +46 -51
  178. package/{util/picking/fence.ts → webglobeplugins/util/picking/fence.js} +43 -47
  179. package/{util/picking/picker-displayer.ts → webglobeplugins/util/picking/picker-displayer.js} +176 -226
  180. package/{util → webglobeplugins/util}/programs/draw-from-pixel-coords.js +164 -201
  181. package/{util/programs/draw-texture-on-canvas.ts → webglobeplugins/util/programs/draw-texture-on-canvas.js} +69 -91
  182. package/{util → webglobeplugins/util}/programs/supersampletotextures.js +97 -130
  183. package/{util/programs/texturetoglobe.js → webglobeplugins/util/programs/texturetoglobe_delete.js} +128 -153
  184. package/{util/shaderfunctions/geometrytransformations.ts → webglobeplugins/util/shaderfunctions/geometrytransformations.js} +44 -106
  185. package/{util → webglobeplugins/util}/shaderfunctions/index.js +2 -2
  186. package/{util → webglobeplugins/util}/shaderfunctions/nodata.js +2 -4
  187. package/{util → webglobeplugins/util}/shaderfunctions/noisefunctions.js +7 -10
  188. package/{util/webglobjectbuilders.ts → webglobeplugins/util/webglobjectbuilders.js} +358 -446
  189. package/{vectorfield → webglobeplugins/vectorfield}/arrowfield/adaptor.js +11 -11
  190. package/{vectorfield → webglobeplugins/vectorfield}/arrowfield/index.js +3 -3
  191. package/{vectorfield → webglobeplugins/vectorfield}/arrowfield/plugin.js +83 -128
  192. package/{vectorfield → webglobeplugins/vectorfield}/waveparticles/adaptor.js +15 -16
  193. package/{vectorfield → webglobeplugins/vectorfield}/waveparticles/index.js +3 -3
  194. package/{vectorfield/waveparticles/plugin.ts → webglobeplugins/vectorfield/waveparticles/plugin.js} +455 -506
  195. package/webglobeplugins/vectorfield/wind/adapters/image-to-fields.js +92 -0
  196. package/webglobeplugins/vectorfield/wind/adapters/types.js +1 -0
  197. package/{vectorfield/wind/imagetovectorfieldandmagnitude.ts → webglobeplugins/vectorfield/wind/imagetovectorfieldandmagnitude.js} +53 -78
  198. package/{vectorfield → webglobeplugins/vectorfield}/wind/index.js +5 -5
  199. package/{vectorfield/wind/plugin-persistant.ts → webglobeplugins/vectorfield/wind/plugin-persistant.js} +390 -483
  200. package/{vectorfield → webglobeplugins/vectorfield}/wind/plugin.js +685 -883
  201. package/{vectorfield → webglobeplugins/vectorfield}/wind/vectorfieldimage.js +23 -27
  202. package/{write-text/context-text-bulk.ts → webglobeplugins/write-text/context-text-bulk.js} +200 -285
  203. package/webglobeplugins/write-text/context-text3.js +167 -0
  204. package/{write-text/context-text4.ts → webglobeplugins/write-text/context-text4.js} +146 -231
  205. package/{write-text → webglobeplugins/write-text}/context-textDELETE.js +94 -125
  206. package/{write-text/objectarraylabels/index.ts → webglobeplugins/write-text/objectarraylabels/index.js} +2 -2
  207. package/{write-text → webglobeplugins/write-text}/objectarraylabels/objectarraylabels.js +200 -247
  208. package/Math/index.js +0 -0
  209. package/Math/matrix4.ts +0 -0
  210. package/Math/mesh/mapbox-delaunay.d.ts +0 -74
  211. package/Math/roadmap.md +0 -10
  212. package/Math/tessellation/constants.ts +0 -1
  213. package/Math/tessellation/roadmap.md +0 -48
  214. package/Math/tessellation/types.ts +0 -1
  215. package/Math/types.ts +0 -68
  216. package/altitude-locator/adaptors.js +0 -0
  217. package/altitude-locator/keymethod.js +0 -0
  218. package/investigation-tools/draw/tiles/adapters.ts +0 -133
  219. package/programs/line-on-globe/index.js +0 -0
  220. package/programs/line-on-globe/linestrip/data.ts +0 -29
  221. package/programs/polygon-on-globe/roadmap.md +0 -8
  222. package/programs/rings/index.js +0 -1
  223. package/programs/totems/camera-totem-attactment-interface.ts +0 -4
  224. package/programs/vectorfields/logics/particle-ubo.ts +0 -23
  225. package/publish.bat +0 -62
  226. package/range-tools-on-terrain/bearing-line/types.ts +0 -65
  227. package/range-tools-on-terrain/circle-line-chain/types.ts +0 -43
  228. package/range-tools-on-terrain/range-ring/rangeringangletext.ts +0 -396
  229. package/range-tools-on-terrain/range-ring/types.ts +0 -30
  230. package/semiplugins/interface.ts +0 -14
  231. package/semiplugins/shape-on-terrain/goal.md +0 -12
  232. package/semiplugins/shape-on-terrain/terrain-polygon/data/cache-shortcuts.md +0 -20
  233. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +0 -196
  234. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.ts +0 -209
  235. package/semiplugins/shape-on-terrain/terrain-polygon/data/polygon-to-triangles.ts +0 -144
  236. package/semiplugins/shape-on-terrain/terrain-polygon/data/readme.md +0 -5
  237. package/semiplugins/shape-on-terrain/terrain-polygon/data/types.ts +0 -37
  238. package/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +0 -146
  239. package/semiplugins/shape-on-terrain/terrain-polygon/notes.md +0 -90
  240. package/semiplugins/shape-on-terrain/terrain-polygon/types.ts +0 -69
  241. package/semiplugins/shell/bbox-renderer/index.ts +0 -2
  242. package/semiplugins/shell/bbox-renderer/object.ts +0 -129
  243. package/semiplugins/type.ts +0 -8
  244. package/terrain-plugin.mmd +0 -83
  245. package/tests/Math/arc-sampling-test.js +0 -367
  246. package/tests/Math/arc-sampling-test.ts +0 -429
  247. package/tests/Math/arc.test.ts +0 -77
  248. package/tests/Math/junction/arc-limit.test.ts +0 -7
  249. package/tests/Math/junction/arc-plane-points.test.ts +0 -196
  250. package/tests/Math/junction/arc-plane.test.ts +0 -172
  251. package/tests/Math/junction/line-sphere.test.ts +0 -127
  252. package/tests/Math/junction/plane-plane.test.ts +0 -91
  253. package/tests/Math/plane-test.ts +0 -17
  254. package/tests/Math/plane.test.ts +0 -43
  255. package/tests/Math/vec3.test.ts +0 -33
  256. package/tracks/point-heat-map/index.js +0 -0
  257. package/tracks/point-heat-map/readme.md +0 -15
  258. package/tracks/timetracks/readme.md +0 -1
  259. package/tsconfig.json +0 -22
  260. package/types/@pirireis/webglobe.d.ts +0 -102
  261. package/types/delaunator.d.ts +0 -40
  262. package/types/earcut.d.ts +0 -11
  263. package/types/rbush.d.ts +0 -57
  264. package/types.ts +0 -319
  265. package/util/account/create-buffermap-orchastration.ts +0 -85
  266. package/util/account/single-attribute-buffer-management/types.ts +0 -43
  267. package/util/algorithms/index.js +0 -0
  268. package/util/check/index.js +0 -0
  269. package/util/check/typecheck.ts +0 -74
  270. package/util/gl-util/buffer/attribute-loader.ts +0 -84
  271. package/util/interpolation/index.js +0 -0
  272. package/util/interpolation/timetrack/index.js +0 -9
  273. package/vectorfield/wind/adapters/image-to-fields.ts +0 -74
  274. package/vectorfield/wind/adapters/types.ts +0 -12
  275. package/vectorfield/wind/plugin-persistant copy.ts +0 -461
  276. package/write-text/context-text3.ts +0 -252
  277. package/write-text/objectarraylabels/objectarraylabels.d.ts +0 -72
@@ -1,533 +1,464 @@
1
- /**
2
- * @author Toprak Ozturk
3
- */
4
- /**
5
- * @description Finds inner and edge cut points of givin triangle for given zoom level
6
- *
7
- * @param {number} zoomLevel - The current zoom level
8
- * @param {LongLat} p1 - First point of triangle
9
- * @param {LongLat} p2 - Second point of triangle
10
- * @param {LongLat} p3 - Third point of triangle
11
- *
12
- *
13
- * @returns {positions: LongLat[], indices: number[]} - positions are the inner and edge cut points of triangle, indices are the index array for triangle faces
14
- */
15
-
16
-
17
- import { Arc, Plane, Vec3 } from "../types";
18
- import { Radian, LongLatRadian } from "../../types";
19
- import { create as createArc, calculateZLimitPoint } from "../arc";
20
- import { createUnitVectorFromLongLat, equals, vec3ToLongLatRadians, clone } from "../vec3";
21
- import { TILE_COUNTS } from "./constants";
22
- import { pointsOnArc } from "../juction/arc-plane";
23
- import { latToTileY, tileYtoLat } from "./methods";
24
- import Delaunator from "delaunator";
25
- import { radianToMercatorXY } from "../methods";
26
-
27
- const KEY_PRECISION = 9;
28
-
29
- export type BBoxZoom = {
30
- bbox: { min: LongLatRadian, max: LongLatRadian },
31
- zoom: number
32
- }
33
-
34
-
35
- export type ArcExtended = Arc & {
36
- exceededLimit?: Vec3,
37
- bbox: {
38
- min: LongLatRadian, max: LongLatRadian
39
- },
40
- p0LongLat: LongLatRadian,
41
- p1LongLat: LongLatRadian
42
- };
43
-
44
- export type TriangleTessellationMeta = {
45
- arcs: [ArcExtended, ArcExtended, ArcExtended],
46
- bbox: { min: LongLatRadian, max: LongLatRadian },
47
- showThreshold: number,
48
- shortCut: {
49
- vec3s: Float32Array;
50
- longLats: Float32Array;
51
- indices: Uint32Array;
52
- }
53
- }
54
-
55
- // TODO:get rid of embedded lists. always flat list
56
- const TILE_DEM_VERTEX_COUNT = 5; // 5x5 grid for DEM
57
- const TILE_DEM_STEPCOUNT = TILE_DEM_VERTEX_COUNT - 1; // 4 inner divisions in each dimension
58
-
59
-
60
-
61
- const _plane = /*@__PURE__*/ { normal: [0, 0, 0] as Vec3, distance: 0 } as Plane;
62
- const _resultPoints = /*@__PURE__*/[[0, 0, 0], [0, 0, 0]] as [Vec3, Vec3];
63
-
64
-
65
-
66
- function createBBox(
67
- p1: LongLatRadian,
68
- p2: LongLatRadian,
69
- limitVec: Vec3 | undefined): { min: LongLatRadian, max: LongLatRadian } {
70
- if (limitVec) {
71
- const limitLongLat: LongLatRadian = vec3ToLongLatRadians(limitVec);
72
-
73
- return {
74
- min: [Math.min(p1[0], p2[0], limitLongLat[0]), Math.min(p1[1], p2[1], limitLongLat[1])],
75
- max: [Math.max(p1[0], p2[0], limitLongLat[0]), Math.max(p1[1], p2[1], limitLongLat[1])],
76
- };
77
- }
78
- return {
79
- min: [Math.min(p1[0], p2[0]), Math.min(p1[1], p2[1])],
80
- max: [Math.max(p1[0], p2[0]), Math.max(p1[1], p2[1])],
81
- };
82
- }
83
-
84
-
85
- function radianCheck(point: LongLatRadian): boolean {
86
- return point[0] >= -Math.PI && point[0] <= Math.PI && point[1] >= -Math.PI
87
- && point[1] <= Math.PI / 2 && point[1] >= -Math.PI / 2;
88
- }
89
-
90
- export function createTriangleTessellationMeta(p1: LongLatRadian, p2: LongLatRadian, p3: LongLatRadian): TriangleTessellationMeta {
91
-
92
- if (!radianCheck(p1) || !radianCheck(p2) || !radianCheck(p3)) {
93
- throw new Error('Points must be in radian range: ' +
94
- 'p1:' + p1[0] + ',' + p1[1] +
95
- ' p2:' + p2[0] + ',' + p2[1] +
96
- ' p3:' + p3[0] + ',' + p3[1]);
97
- }
98
- const p1v3: Vec3 = createUnitVectorFromLongLat(p1);
99
- const p2v3: Vec3 = createUnitVectorFromLongLat(p2);
100
- const p3v3: Vec3 = createUnitVectorFromLongLat(p3);
101
- const arc1 = createArc(p1v3, p2v3) as ArcExtended;
102
- const arc2 = createArc(p2v3, p3v3) as ArcExtended;
103
- const arc3 = createArc(p3v3, p1v3) as ArcExtended;
104
-
105
- const limitVec = [0, 0, 0] as Vec3;
106
-
107
- if (calculateZLimitPoint(arc1, limitVec)) {
108
- arc1.exceededLimit = [limitVec[0], limitVec[1], limitVec[2]];
109
- }
110
-
111
- arc1.bbox = createBBox(p1, p2, arc1.exceededLimit);
112
- arc1.p0LongLat = p1;
113
- arc1.p1LongLat = p2;
114
-
115
- if (calculateZLimitPoint(arc2, limitVec)) {
116
- arc2.exceededLimit = [limitVec[0], limitVec[1], limitVec[2]];
117
- }
118
- arc2.bbox = createBBox(p2, p3, arc2.exceededLimit);
119
- arc2.p0LongLat = p2;
120
- arc2.p1LongLat = p3;
121
-
122
- if (calculateZLimitPoint(arc3, limitVec)) {
123
- arc3.exceededLimit = [limitVec[0], limitVec[1], limitVec[2]];
124
- }
125
- arc3.bbox = createBBox(p3, p1, arc3.exceededLimit);
126
- arc3.p0LongLat = p3;
127
- arc3.p1LongLat = p1;
128
-
129
- const bbox = {
130
- min: [
131
- Math.min(arc1.bbox.min[0], arc2.bbox.min[0], arc3.bbox.min[0]),
132
- Math.min(arc1.bbox.min[1], arc2.bbox.min[1], arc3.bbox.min[1])
133
- ] as LongLatRadian,
134
- max: [
135
- Math.max(arc1.bbox.max[0], arc2.bbox.max[0], arc3.bbox.max[0]),
136
- Math.max(arc1.bbox.max[1], arc2.bbox.max[1], arc3.bbox.max[1])
137
- ] as LongLatRadian,
138
- };
139
-
140
-
141
- const meta = {
142
- arcs: [arc1, arc2, arc3],
143
- bbox,
144
- showThreshold: calculateShowThreshold(arc1, arc2, arc3)
145
- } as TriangleTessellationMeta;
146
-
147
- meta.shortCut = partialTessellation(
148
- meta,
149
- [{
150
- bbox: meta.bbox,
151
- zoom: 0
152
- }],
153
- TILE_DEM_STEPCOUNT
154
- );
155
-
156
- return meta;
157
- }
158
-
159
-
160
- function calculateShowThreshold(arc1: Arc, arc2: Arc, arc3: Arc): number {
161
-
162
- const largestCoverAngle = Math.max(arc1.coverAngle, arc2.coverAngle, arc3.coverAngle);
163
- return Math.PI / largestCoverAngle;
164
- }
165
-
166
- export function zoomLevelShowThreshold(zoomLevel: number, tileRatio: number): number {
167
- const tileCount = TILE_COUNTS[zoomLevel];
168
-
169
- return tileCount / tileRatio / 2;
170
- }
171
-
172
-
173
- type EdgePoint = { vec: Vec3, longLat: LongLatRadian, arcIndex: number }
174
- /**
175
- *
176
- * @param triangleMeta
177
- * @param zoom
178
- * @param angle
179
- * @param dimension false for longitude (meridian) true for latitude (parallel)
180
- */
181
- function getPoints(triangleMeta: TriangleTessellationMeta, angle: Radian, dimension: boolean): [EdgePoint, EdgePoint] | [EdgePoint, EdgePoint, EdgePoint, EdgePoint] | [] {
182
- // find which arcs are cut by plane
183
- const radians = angle;
184
- if (dimension) {
185
- _plane.normal[0] = 0;
186
- _plane.normal[1] = 0;
187
- _plane.normal[2] = 1;
188
- _plane.distance = Math.sin(radians);
189
-
190
- } else {
191
- _plane.normal[0] = Math.sin(radians);
192
- _plane.normal[1] = -Math.cos(radians);
193
- _plane.normal[2] = 0;
194
- _plane.distance = 0;
195
- }
196
-
197
- let result: EdgePoint[] = [];
198
- // Add debugging
199
- let resultsFromDistinctArcs = 0;
200
- for (let i = 0; i < 3; i++) {
201
- const arc = triangleMeta.arcs[i];
202
- const coordIndex = dimension ? 1 : 0;
203
- const minCoord = arc.bbox.min[coordIndex];
204
- const maxCoord = arc.bbox.max[coordIndex];
205
-
206
-
207
- if (minCoord > angle || maxCoord < angle) {
208
- continue; // arc is out of range
209
- }
210
-
211
-
212
- const count = pointsOnArc(arc, _plane, _resultPoints);
213
-
214
- if (count === 1) {
215
- result.push({ vec: clone(_resultPoints[0]), longLat: vec3ToLongLatRadians(_resultPoints[0]), arcIndex: i }
216
- );
217
- }
218
- else if (count === 2) {
219
- // throw new Error('Unexpected 2 cut points on arc, should be max 1'); // TODO DELETE this line later
220
- result.push({ vec: [..._resultPoints[0]], longLat: vec3ToLongLatRadians(_resultPoints[0]), arcIndex: i });
221
- result.push({ vec: clone(_resultPoints[1]), longLat: vec3ToLongLatRadians(_resultPoints[1]), arcIndex: i }); // TODO: this is a fix for a bug, need to investigate later
222
- }
223
- resultsFromDistinctArcs += 1;
224
- }
225
-
226
- if (resultsFromDistinctArcs === 3) {
227
- result = filterDuplicate(result);
228
- }
229
-
230
- if (result.length !== 2 && result.length !== 4) {
231
- // throw new Error(`Unexpected cut count for tile cut, got: ${result.length}, angle: ${angle * 180 / Math.PI}, dimension: ${dimension ? 'latitude' : 'longitude'} \n`);
232
- console.error(`Unexpected cut count for tile cut, got: ${result.length}, angle: ${angle * 180 / Math.PI}, dimension: ${dimension ? 'latitude' : 'longitude'} \n`);
233
- return [];
234
- }
235
-
236
- if (dimension) {
237
- result.sort((a, b) => {
238
- return a.longLat[0] - b.longLat[0]; // sort by x for latitude cuts
239
- });
240
- }
241
-
242
- return result as [EdgePoint, EdgePoint] | [EdgePoint, EdgePoint, EdgePoint, EdgePoint];
243
- }
244
-
245
-
246
- function getEdgePoints(triangleMeta: TriangleTessellationMeta, edgePointIndexSets: [Set<number>, Set<number>, Set<number>]): Vec3[] {
247
- const points = [
248
- triangleMeta.arcs[0].p0,
249
- triangleMeta.arcs[1].p0,
250
- triangleMeta.arcs[2].p0,
251
- ]
252
- edgePointIndexSets[0].add(0);
253
- edgePointIndexSets[0].add(1);
254
- edgePointIndexSets[1].add(1);
255
- edgePointIndexSets[1].add(2);
256
- edgePointIndexSets[2].add(2);
257
- edgePointIndexSets[2].add(0);
258
- let exceededLimitPointIndex = 3;
259
- for (let i = 0; i < 3; i++) {
260
- if (triangleMeta.arcs[i].exceededLimit) {
261
- points.push(triangleMeta.arcs[i].exceededLimit as Vec3);
262
- edgePointIndexSets[i].add(exceededLimitPointIndex);
263
- exceededLimitPointIndex++;
264
- }
265
- }
266
- return points;
267
- }
268
-
269
-
270
-
271
- // TODO: EDGES NEED ! LEVEL MORE ZOOM LEVEL OF RESOLUTION as THEY CAN BE NEIGHBOURS OF HIGHER ZOOM LEVEL TILES....
272
- // simple strategy: get max zoom level of neighbour, add edge cuts based on that zoom level, do not fill inner points.
273
- // partialTessellation cure this problem automatically
274
-
275
-
276
-
277
- function filterDuplicate(points: EdgePoint[]): EdgePoint[] {
278
-
279
- if (points.length < 2) {
280
- return points;
281
- }
282
- const result: EdgePoint[] = [points[0]];
283
- for (let i = 1; i < points.length; i++) {
284
- let isDuplicate = false;
285
- for (let j = 0; j < result.length; j++) {
286
- if (equals(points[i].vec, result[j].vec)) {
287
- isDuplicate = true;
288
- break;
289
- }
290
- }
291
- if (!isDuplicate) {
292
- result.push(points[i]);
293
- }
294
- }
295
-
296
- return result;
297
- }
298
-
299
-
300
-
301
-
302
- function filterEdgePointTriangles(
303
- indeces: Uint32Array,
304
- edgePointIndices: [Set<number>, Set<number>, Set<number>]): Uint32Array {
305
-
306
-
307
- const result = []
308
- for (let i = 0; i < indeces.length; i += 3) {
309
-
310
- const i0 = indeces[i];
311
- const i1 = indeces[i + 1];
312
- const i2 = indeces[i + 2];
313
- if ((edgePointIndices[0].has(i0) && edgePointIndices[0].has(i1) && edgePointIndices[0].has(i2)) ||
314
- (edgePointIndices[1].has(i0) && edgePointIndices[1].has(i1) && edgePointIndices[1].has(i2)) ||
315
- (edgePointIndices[2].has(i0) && edgePointIndices[2].has(i1) && edgePointIndices[2].has(i2))) {
316
- continue;
317
- }
318
- result.push(i0, i1, i2);
319
- }
320
- return new Uint32Array(result);
321
-
322
- }
323
-
324
-
325
-
326
-
327
-
328
- export function partialTessellation(
329
- triangleMeta: TriangleTessellationMeta,
330
- limits: BBoxZoom[],
331
- innerCuts: number
332
- ): { vec3s: Float32Array; longLats: Float32Array; indices: Uint32Array } {
333
- // TODO: pointMap can be local variable and cleaned after function call to avoid reinitialization overhead
334
- const pointMap = new Map<string, number>(); // Key: "lon|lat", Value: index
335
- const allVec3s: number[] = [];
336
- const allLongLats: number[] = [];
337
- let pointCounter = 0;
338
- const stepCount = innerCuts - 1; //
339
- const edgePointIndexSets: [Set<number>, Set<number>, Set<number>] = [new Set<number>(), new Set<number>(), new Set<number>()];
340
- // addTriangleVerticesToEdgeSets(edgePointIndexSets);
341
-
342
- /**
343
- * Precision for coordinate keys in the map. 1e-12 radians is
344
- * extremely small (sub-millimeter on Earth's surface) and avoids
345
- * floating point inaccuracies causing duplicate points.
346
- */
347
-
348
- /**
349
- * Adds a point to the vertex arrays if it doesn't already exist.
350
- * Returns the index of the point (new or existing).
351
- */
352
- const addPoint = (longLat: LongLatRadian, vec3?: Vec3, edgeIndex?: number): number => {
353
- const key = `${Math.round(longLat[0] * 1e9)}|${Math.round(longLat[1] * 1e9)}`;
354
-
355
- let index = pointMap.get(key);
356
- if (index !== undefined) {
357
- if (edgeIndex !== undefined) {
358
- edgePointIndexSets[edgeIndex].add(index);
359
- }
360
- return index; // Point already exists
361
- }
362
-
363
- // Point is new, add it
364
- const v3 = vec3 || createUnitVectorFromLongLat(longLat);
365
- allVec3s.push(v3[0], v3[1], v3[2]);
366
- allLongLats.push(longLat[0], longLat[1]);
367
-
368
-
369
- index = pointCounter++;
370
-
371
- pointMap.set(key, index);
372
- if (edgeIndex !== undefined) {
373
- edgePointIndexSets[edgeIndex].add(index);
374
- }
375
- return index;
376
- };
377
-
378
- // 1. Add triangle's "shell" (for Delaunay) and "edge" (vertices/limits) points
379
- // These points constrain the triangulation.
380
- const edgePoints = getEdgePoints(triangleMeta, edgePointIndexSets);
381
- // Assuming shellPoints and edgePoints have the same length and correspond
382
-
383
- for (let i = 0; i < edgePoints.length; i++) {
384
- addPoint(vec3ToLongLatRadians(edgePoints[i]), edgePoints[i], undefined);
385
-
386
- }
387
- // 2. Iterate through each tile limit
388
- for (let i = 0; i < limits.length; i++) {
389
- const tileBBox = limits[i].bbox;
390
- const zoom = limits[i].zoom;
391
-
392
- // 2a. Calculate the intersection BBOX (the area we'll work on)
393
- const workBBox = {
394
- min: [
395
- Math.max(triangleMeta.bbox.min[0], tileBBox.min[0]),
396
- Math.max(triangleMeta.bbox.min[1], tileBBox.min[1])
397
- ] as LongLatRadian,
398
- max: [
399
- Math.min(triangleMeta.bbox.max[0], tileBBox.max[0]),
400
- Math.min(triangleMeta.bbox.max[1], tileBBox.max[1])
401
- ] as LongLatRadian,
402
- };
403
-
404
- // If the intersection is invalid (no overlap), skip this tile
405
- if (workBBox.min[0] >= workBBox.max[0] || workBBox.min[1] >= workBBox.max[1]) {
406
- continue;
407
- }
408
-
409
- // 2b. Calculate grid steps for this tile's zoom
410
- const tileCount = TILE_COUNTS[zoom];
411
- const lonStep = (2 * Math.PI) / tileCount / stepCount;
412
- const latStep = 1.0 / stepCount; // This is in tileY units
413
-
414
- // 2c. Generate Latitude (Parallel) Points
415
- const startTileY = latToTileY(workBBox.max[1], zoom); // max lat -> min tileY
416
- const endTileY = latToTileY(workBBox.min[1], zoom); // min lat -> max tileY
417
-
418
- // let currentY = Math.ceil(startTileY / latStep) * latStep;
419
- let currentY = startTileY - Math.abs(startTileY % latStep);
420
- // if (currentY < startTileY - 1e-9) currentY += latStep; // Ensure we start inside or on edge
421
- if (currentY === startTileY) currentY -= latStep; // since start point is already added
422
-
423
- while (currentY <= endTileY + 1e-9) {
424
- const lat = tileYtoLat(currentY, zoom);
425
-
426
- // Skip if rounding put us slightly outside the work box
427
- if (lat < workBBox.min[1] - 1e-9 || lat > workBBox.max[1] + 1e-9) {
428
- currentY += latStep;
429
- continue;
430
- }
431
-
432
- // Find where this latitude line intersects the triangle
433
- const intersections = getPoints(triangleMeta, lat, true);
434
- if (intersections.length === 0) {
435
- currentY += latStep;
436
- continue;
437
- }
438
-
439
- for (let i = 0; i < intersections.length; i += 2) {
440
- const p0 = intersections[i]; // {vec, longLat, arcIndex}
441
- const p1 = intersections[i + 1];
442
-
443
- // Find the segment of this latitude line that is *inside* both
444
- // the triangle (p0-p1) AND the tile BBOX (workBBox)
445
-
446
-
447
-
448
- const triMinLon = Math.min(p0.longLat[0], p1.longLat[0]);
449
- const triMaxLon = Math.max(p0.longLat[0], p1.longLat[0]);
450
-
451
- const segMinLon = Math.max(workBBox.min[0], triMinLon);
452
- const segMaxLon = Math.min(workBBox.max[0], triMaxLon);
453
-
454
- // If this clipped segment is valid, generate points
455
- if (segMinLon < segMaxLon - 1e-9) {
456
-
457
- // Add the exact start and end points of the clipped segment
458
- addPoint(p0.longLat, p0.vec, p0.arcIndex);
459
- addPoint(p1.longLat, p1.vec, p1.arcIndex);
460
-
461
- // Add fill points *between* them
462
- let currentLon = Math.ceil(segMinLon / lonStep) * lonStep;
463
- if (currentLon < segMinLon - 1e-9) currentLon += lonStep;
464
-
465
- while (currentLon < segMaxLon - 1e-9) {
466
- addPoint([currentLon, lat], undefined, undefined);
467
- currentLon += lonStep;
468
- }
469
- }
470
- }
471
- currentY += latStep;
472
- }
473
-
474
- // 2d. Generate Longitude (Meridian) Points
475
- const startLon = workBBox.min[0];
476
- const endLon = workBBox.max[0];
477
-
478
- let currentLon = Math.ceil(startLon / lonStep) * lonStep;
479
- if (currentLon < startLon - 1e-9) currentLon += lonStep;
480
-
481
- while (currentLon <= endLon + 1e-9) {
482
- // Find where this longitude line intersects the triangle
483
- const intersections = getPoints(triangleMeta, currentLon, false);
484
- if (intersections.length === 0) {
485
- currentLon += lonStep;
486
- continue;
487
- }
488
-
489
- for (const p of intersections) {
490
- const pLongLat = p.longLat;
491
- // Check if this point is inside the *workBBox*
492
- if (
493
- pLongLat[1] >= workBBox.min[1] - 1e-9 &&
494
- pLongLat[1] <= workBBox.max[1] + 1e-9
495
- ) {
496
- addPoint(pLongLat, p.vec, p.arcIndex);
497
- }
498
- }
499
- currentLon += lonStep;
500
- }
501
- } // End loop over limits
502
-
503
- // 3. Triangulate
504
- // We must have at least 3 points to make a triangle
505
- if (pointCounter < 3) {
506
- return {
507
- vec3s: new Float32Array(),
508
- longLats: new Float32Array(),
509
- indices: new Uint32Array(),
510
- };
511
- }
512
-
513
- const delaunator = new Delaunator(allLongLats);
514
-
515
- let indices = delaunator.triangles;
516
-
517
- indices = filterEdgePointTriangles(indices, edgePointIndexSets);
518
-
519
-
520
-
521
- // Convert to Mercator
522
- for (let i = 0; i < allLongLats.length / 2; i++) {
523
- const xy = radianToMercatorXY([allLongLats[i * 2], allLongLats[i * 2 + 1]]);
524
- allLongLats[i * 2] = xy[0];
525
- allLongLats[i * 2 + 1] = xy[1];
526
- }
527
-
528
- return {
529
- vec3s: new Float32Array(allVec3s),
530
- longLats: new Float32Array(allLongLats),
531
- indices: indices,
532
- };
533
- }
1
+ /**
2
+ * @author Toprak Ozturk
3
+ */
4
+ /**
5
+ * @description Finds inner and edge cut points of givin triangle for given zoom level
6
+ *
7
+ * @param {number} zoomLevel - The current zoom level
8
+ * @param {LongLat} p1 - First point of triangle
9
+ * @param {LongLat} p2 - Second point of triangle
10
+ * @param {LongLat} p3 - Third point of triangle
11
+ *
12
+ *
13
+ * @returns {positions: LongLat[], indices: number[]} - positions are the inner and edge cut points of triangle, indices are the index array for triangle faces
14
+ */
15
+ import { create as createArc, calculateZLimitPoint } from "../arc";
16
+ import { createUnitVectorFromLongLat, equals, vec3ToLongLatRadians, clone } from "../vec3";
17
+ import { TILE_COUNTS } from "./constants";
18
+ import { pointsOnArc } from "../juction/arc-plane";
19
+ import { latToTileY, tileYtoLat } from "./methods";
20
+ import Delaunator from "delaunator";
21
+ import { radianToMercatorXY } from "../methods";
22
+ export const uint32Escape = 4294967295;
23
+ // TODO:get rid of embedded lists. always flat list
24
+ const TILE_DEM_VERTEX_COUNT = 5; // 5x5 grid for DEM
25
+ const TILE_DEM_STEPCOUNT = TILE_DEM_VERTEX_COUNT - 1; // 4 inner divisions in each dimension
26
+ const _plane = /*@__PURE__*/ { normal: [0, 0, 0], distance: 0 };
27
+ const _resultPoints = /*@__PURE__*/ [[0, 0, 0], [0, 0, 0]];
28
+ function createBBox(p1, p2, limitVec) {
29
+ if (limitVec) {
30
+ const limitLongLat = vec3ToLongLatRadians(limitVec);
31
+ return {
32
+ min: [Math.min(p1[0], p2[0], limitLongLat[0]), Math.min(p1[1], p2[1], limitLongLat[1])],
33
+ max: [Math.max(p1[0], p2[0], limitLongLat[0]), Math.max(p1[1], p2[1], limitLongLat[1])],
34
+ };
35
+ }
36
+ return {
37
+ min: [Math.min(p1[0], p2[0]), Math.min(p1[1], p2[1])],
38
+ max: [Math.max(p1[0], p2[0]), Math.max(p1[1], p2[1])],
39
+ };
40
+ }
41
+ function radianCheck(point) {
42
+ return point[0] >= -Math.PI && point[0] <= Math.PI && point[1] >= -Math.PI
43
+ && point[1] <= Math.PI / 2 && point[1] >= -Math.PI / 2;
44
+ }
45
+ const _3RealEdges = new Uint32Array([uint32Escape, 0, 1, 2, 0]);
46
+ const _2RealEdges_dismiss2 = new Uint32Array([uint32Escape, 0, 1, 2]);
47
+ const _2RealEdges_dismiss1 = new Uint32Array([uint32Escape, 2, 0, 1]);
48
+ const _2RealEdges_dismiss0 = new Uint32Array([uint32Escape, 1, 2, 0]);
49
+ const _1realEdge_0 = new Uint32Array([uint32Escape, 0, 1]);
50
+ const _1realEdge_1 = new Uint32Array([uint32Escape, 1, 2]);
51
+ const _1realEdge_2 = new Uint32Array([uint32Escape, 2, 0]);
52
+ const _noRealEdges = null;
53
+ export function createTriangleTessellationMeta(p1, p2, p3, isRealp0p1 = false, isRealp1p2 = false, isRealp2p3 = false) {
54
+ // TODO: this might be a problem
55
+ if (!radianCheck(p1) || !radianCheck(p2) || !radianCheck(p3)) {
56
+ throw new Error('Points must be in radian range: ' +
57
+ 'p1:' + p1[0] + ',' + p1[1] +
58
+ ' p2:' + p2[0] + ',' + p2[1] +
59
+ ' p3:' + p3[0] + ',' + p3[1]);
60
+ }
61
+ const p1v3 = createUnitVectorFromLongLat(p1);
62
+ const p2v3 = createUnitVectorFromLongLat(p2);
63
+ const p3v3 = createUnitVectorFromLongLat(p3);
64
+ const arc1 = createArc(p1v3, p2v3);
65
+ const arc2 = createArc(p2v3, p3v3);
66
+ const arc3 = createArc(p3v3, p1v3);
67
+ arc1.realEdge = isRealp0p1;
68
+ arc2.realEdge = isRealp1p2;
69
+ arc3.realEdge = isRealp2p3;
70
+ const realEdgeArcIndices = (() => {
71
+ switch (true) {
72
+ case isRealp0p1 && isRealp1p2 && isRealp2p3:
73
+ return _3RealEdges;
74
+ case isRealp0p1 && isRealp1p2 && !isRealp2p3:
75
+ return _2RealEdges_dismiss2;
76
+ case isRealp1p2 && isRealp2p3 && !isRealp0p1:
77
+ return _2RealEdges_dismiss1;
78
+ case isRealp2p3 && isRealp0p1 && !isRealp1p2:
79
+ return _2RealEdges_dismiss0;
80
+ case isRealp0p1 && !isRealp1p2 && !isRealp2p3:
81
+ return _1realEdge_0;
82
+ case isRealp1p2 && !isRealp2p3 && !isRealp0p1:
83
+ return _1realEdge_1;
84
+ case isRealp2p3 && !isRealp0p1 && !isRealp1p2:
85
+ return _1realEdge_2;
86
+ default:
87
+ return _noRealEdges;
88
+ }
89
+ })();
90
+ const limitVec = [0, 0, 0];
91
+ if (calculateZLimitPoint(arc1, limitVec)) {
92
+ arc1.exceededLimit = [limitVec[0], limitVec[1], limitVec[2]];
93
+ }
94
+ arc1.bbox = createBBox(p1, p2, arc1.exceededLimit);
95
+ arc1.p0LongLat = p1;
96
+ arc1.p1LongLat = p2;
97
+ if (calculateZLimitPoint(arc2, limitVec)) {
98
+ arc2.exceededLimit = [limitVec[0], limitVec[1], limitVec[2]];
99
+ }
100
+ arc2.bbox = createBBox(p2, p3, arc2.exceededLimit);
101
+ arc2.p0LongLat = p2;
102
+ arc2.p1LongLat = p3;
103
+ if (calculateZLimitPoint(arc3, limitVec)) {
104
+ arc3.exceededLimit = [limitVec[0], limitVec[1], limitVec[2]];
105
+ }
106
+ arc3.bbox = createBBox(p3, p1, arc3.exceededLimit);
107
+ arc3.p0LongLat = p3;
108
+ arc3.p1LongLat = p1;
109
+ const bbox = {
110
+ min: [
111
+ Math.min(arc1.bbox.min[0], arc2.bbox.min[0], arc3.bbox.min[0]),
112
+ Math.min(arc1.bbox.min[1], arc2.bbox.min[1], arc3.bbox.min[1])
113
+ ],
114
+ max: [
115
+ Math.max(arc1.bbox.max[0], arc2.bbox.max[0], arc3.bbox.max[0]),
116
+ Math.max(arc1.bbox.max[1], arc2.bbox.max[1], arc3.bbox.max[1])
117
+ ],
118
+ };
119
+ const meta = {
120
+ arcs: [arc1, arc2, arc3],
121
+ bbox,
122
+ showThreshold: calculateShowThreshold(arc1, arc2, arc3),
123
+ };
124
+ // @ts-ignore
125
+ meta.shortCut = partialTessellation(meta, [{
126
+ bbox: meta.bbox,
127
+ zoom: 0
128
+ }], TILE_DEM_STEPCOUNT);
129
+ meta.shortCut.realEdgeArcIndices = realEdgeArcIndices;
130
+ // arcShortCut
131
+ return meta;
132
+ }
133
+ function calculateShowThreshold(arc1, arc2, arc3) {
134
+ const largestCoverAngle = Math.max(arc1.coverAngle, arc2.coverAngle, arc3.coverAngle);
135
+ return Math.PI / largestCoverAngle;
136
+ }
137
+ export function zoomLevelShowThreshold(zoomLevel, tileRatio) {
138
+ const tileCount = TILE_COUNTS[zoomLevel];
139
+ return tileCount / tileRatio / 2;
140
+ }
141
+ /**
142
+ *
143
+ * @param triangleMeta
144
+ * @param zoom
145
+ * @param angle
146
+ * @param dimension false for longitude (meridian) true for latitude (parallel)
147
+ */
148
+ function getPoints(triangleMeta, angle, dimension) {
149
+ // find which arcs are cut by plane
150
+ const radians = angle;
151
+ if (dimension) {
152
+ _plane.normal[0] = 0;
153
+ _plane.normal[1] = 0;
154
+ _plane.normal[2] = 1;
155
+ _plane.distance = Math.sin(radians);
156
+ }
157
+ else {
158
+ _plane.normal[0] = Math.sin(radians);
159
+ _plane.normal[1] = -Math.cos(radians);
160
+ _plane.normal[2] = 0;
161
+ _plane.distance = 0;
162
+ }
163
+ let result = [];
164
+ // Add debugging
165
+ let resultsFromDistinctArcs = 0;
166
+ for (let i = 0; i < 3; i++) {
167
+ const arc = triangleMeta.arcs[i];
168
+ const coordIndex = dimension ? 1 : 0;
169
+ const minCoord = arc.bbox.min[coordIndex];
170
+ const maxCoord = arc.bbox.max[coordIndex];
171
+ if (minCoord > angle || maxCoord < angle) {
172
+ continue; // arc is out of range
173
+ }
174
+ const count = pointsOnArc(arc, _plane, _resultPoints);
175
+ if (count === 1) {
176
+ result.push({ vec: clone(_resultPoints[0]), longLat: vec3ToLongLatRadians(_resultPoints[0]), arcIndex: i });
177
+ }
178
+ else if (count === 2) {
179
+ // throw new Error('Unexpected 2 cut points on arc, should be max 1'); // TODO DELETE this line later
180
+ result.push({ vec: [..._resultPoints[0]], longLat: vec3ToLongLatRadians(_resultPoints[0]), arcIndex: i });
181
+ result.push({ vec: clone(_resultPoints[1]), longLat: vec3ToLongLatRadians(_resultPoints[1]), arcIndex: i }); // TODO: this is a fix for a bug, need to investigate later
182
+ }
183
+ resultsFromDistinctArcs += 1;
184
+ }
185
+ if (resultsFromDistinctArcs === 3) {
186
+ result = filterDuplicate(result);
187
+ }
188
+ if (result.length !== 2 && result.length !== 4) {
189
+ // throw new Error(`Unexpected cut count for tile cut, got: ${result.length}, angle: ${angle * 180 / Math.PI}, dimension: ${dimension ? 'latitude' : 'longitude'} \n`);
190
+ console.error(`Unexpected cut count for tile cut, got: ${result.length}, angle: ${angle * 180 / Math.PI}, dimension: ${dimension ? 'latitude' : 'longitude'} \n`);
191
+ return [];
192
+ }
193
+ if (dimension) {
194
+ result.sort((a, b) => {
195
+ return a.longLat[0] - b.longLat[0]; // sort by x for latitude cuts
196
+ });
197
+ }
198
+ return result;
199
+ }
200
+ function getEdgePoints(triangleMeta, edgePointIndexSets) {
201
+ const points = [
202
+ triangleMeta.arcs[0].p0,
203
+ triangleMeta.arcs[1].p0,
204
+ triangleMeta.arcs[2].p0,
205
+ ];
206
+ edgePointIndexSets[0].add(0);
207
+ edgePointIndexSets[0].add(1);
208
+ edgePointIndexSets[1].add(1);
209
+ edgePointIndexSets[1].add(2);
210
+ edgePointIndexSets[2].add(2);
211
+ edgePointIndexSets[2].add(0);
212
+ let exceededLimitPointIndex = 3;
213
+ for (let i = 0; i < 3; i++) {
214
+ if (triangleMeta.arcs[i].exceededLimit) {
215
+ points.push(triangleMeta.arcs[i].exceededLimit);
216
+ edgePointIndexSets[i].add(exceededLimitPointIndex);
217
+ exceededLimitPointIndex++;
218
+ }
219
+ }
220
+ return points;
221
+ }
222
+ // TODO: EDGES NEED ! LEVEL MORE ZOOM LEVEL OF RESOLUTION as THEY CAN BE NEIGHBOURS OF HIGHER ZOOM LEVEL TILES....
223
+ // simple strategy: get max zoom level of neighbour, add edge cuts based on that zoom level, do not fill inner points.
224
+ // partialTessellation cure this problem automatically
225
+ function filterDuplicate(points) {
226
+ if (points.length < 2) {
227
+ return points;
228
+ }
229
+ const result = [points[0]];
230
+ for (let i = 1; i < points.length; i++) {
231
+ let isDuplicate = false;
232
+ for (let j = 0; j < result.length; j++) {
233
+ if (equals(points[i].vec, result[j].vec)) {
234
+ isDuplicate = true;
235
+ break;
236
+ }
237
+ }
238
+ if (!isDuplicate) {
239
+ result.push(points[i]);
240
+ }
241
+ }
242
+ return result;
243
+ }
244
+ function filterEdgePointTriangles(indeces, edgePointIndices) {
245
+ const result = [];
246
+ for (let i = 0; i < indeces.length; i += 3) {
247
+ const i0 = indeces[i];
248
+ const i1 = indeces[i + 1];
249
+ const i2 = indeces[i + 2];
250
+ if ((edgePointIndices[0].has(i0) && edgePointIndices[0].has(i1) && edgePointIndices[0].has(i2)) ||
251
+ (edgePointIndices[1].has(i0) && edgePointIndices[1].has(i1) && edgePointIndices[1].has(i2)) ||
252
+ (edgePointIndices[2].has(i0) && edgePointIndices[2].has(i1) && edgePointIndices[2].has(i2))) {
253
+ continue;
254
+ }
255
+ result.push(i0, i1, i2);
256
+ }
257
+ return new Uint32Array(result);
258
+ }
259
+ // function createArcPointHarvestingMeta(): ArcPointHarvestingMeta {
260
+ // return {
261
+ // parallelCutIndices: [],
262
+ // meridianCutIndices: [],
263
+ // };
264
+ // }
265
+ export function partialTessellation(triangleMeta, limits, innerCuts, calculateRealEdgeArc = false) {
266
+ // TODO: pointMap can be local variable and cleaned after function call to avoid reinitialization overhead
267
+ const pointMap = new Map(); // Key: "lon|lat", Value: index
268
+ const allVec3s = [];
269
+ const allLongLats = [];
270
+ let pointCounter = 0;
271
+ const stepCount = innerCuts - 1; //
272
+ const edgePointIndexSets = [new Set(), new Set(), new Set()];
273
+ // addTriangleVerticesToEdgeSets(edgePointIndexSets);
274
+ /**
275
+ * Precision for coordinate keys in the map. 1e-12 radians is
276
+ * extremely small (sub-millimeter on Earth's surface) and avoids
277
+ * floating point inaccuracies causing duplicate points.
278
+ */
279
+ /**
280
+ * Adds a point to the vertex arrays if it doesn't already exist.
281
+ * Returns the index of the point (new or existing).
282
+ */
283
+ const addPoint = (longLat, vec3, edgeIndex) => {
284
+ const key = `${Math.round(longLat[0] * 1e9)}|${Math.round(longLat[1] * 1e9)}`;
285
+ let index = pointMap.get(key);
286
+ if (index !== undefined) {
287
+ if (edgeIndex !== undefined) {
288
+ edgePointIndexSets[edgeIndex].add(index);
289
+ }
290
+ return index; // Point already exists
291
+ }
292
+ // Point is new, add it
293
+ const v3 = vec3 || createUnitVectorFromLongLat(longLat);
294
+ allVec3s.push(v3[0], v3[1], v3[2]);
295
+ allLongLats.push(longLat[0], longLat[1]);
296
+ index = pointCounter++;
297
+ pointMap.set(key, index);
298
+ if (edgeIndex !== undefined) {
299
+ edgePointIndexSets[edgeIndex].add(index);
300
+ }
301
+ return index;
302
+ };
303
+ // 1. Add triangle's "shell" (for Delaunay) and "edge" (vertices/limits) points
304
+ // These points constrain the triangulation.
305
+ const edgePoints = getEdgePoints(triangleMeta, edgePointIndexSets);
306
+ // Assuming shellPoints and edgePoints have the same length and correspond
307
+ for (let i = 0; i < edgePoints.length; i++) {
308
+ addPoint(vec3ToLongLatRadians(edgePoints[i]), edgePoints[i], undefined);
309
+ }
310
+ // 2. Iterate through each tile limit
311
+ for (let i = 0; i < limits.length; i++) {
312
+ const tileBBox = limits[i].bbox;
313
+ const zoom = limits[i].zoom;
314
+ // 2a. Calculate the intersection BBOX (the area we'll work on)
315
+ const workBBox = {
316
+ min: [
317
+ Math.max(triangleMeta.bbox.min[0], tileBBox.min[0]),
318
+ Math.max(triangleMeta.bbox.min[1], tileBBox.min[1])
319
+ ],
320
+ max: [
321
+ Math.min(triangleMeta.bbox.max[0], tileBBox.max[0]),
322
+ Math.min(triangleMeta.bbox.max[1], tileBBox.max[1])
323
+ ],
324
+ };
325
+ // If the intersection is invalid (no overlap), skip this tile
326
+ if (workBBox.min[0] >= workBBox.max[0] || workBBox.min[1] >= workBBox.max[1]) {
327
+ continue;
328
+ }
329
+ // 2b. Calculate grid steps for this tile's zoom
330
+ const tileCount = TILE_COUNTS[zoom];
331
+ const lonStep = (2 * Math.PI) / tileCount / stepCount;
332
+ const latStep = 1.0 / stepCount; // This is in tileY units
333
+ // 2c. Generate Latitude (Parallel) Points
334
+ const startTileY = latToTileY(workBBox.max[1], zoom); // max lat -> min tileY
335
+ const endTileY = latToTileY(workBBox.min[1], zoom); // min lat -> max tileY
336
+ // let currentY = Math.ceil(startTileY / latStep) * latStep;
337
+ let currentY = startTileY - Math.abs(startTileY % latStep);
338
+ // if (currentY < startTileY - 1e-9) currentY += latStep; // Ensure we start inside or on edge
339
+ if (currentY === startTileY)
340
+ currentY -= latStep; // since start point is already added
341
+ while (currentY <= endTileY + 1e-9) {
342
+ const lat = tileYtoLat(currentY, zoom);
343
+ // Skip if rounding put us slightly outside the work box
344
+ if (lat < workBBox.min[1] - 1e-9 || lat > workBBox.max[1] + 1e-9) {
345
+ currentY += latStep;
346
+ continue;
347
+ }
348
+ // Find where this latitude line intersects the triangle
349
+ const intersections = getPoints(triangleMeta, lat, true);
350
+ if (intersections.length === 0) {
351
+ currentY += latStep;
352
+ continue;
353
+ }
354
+ for (let i = 0; i < intersections.length; i += 2) {
355
+ const p0 = intersections[i]; // {vec, longLat, arcIndex}
356
+ const p1 = intersections[i + 1];
357
+ // Find the segment of this latitude line that is *inside* both
358
+ // the triangle (p0-p1) AND the tile BBOX (workBBox)
359
+ const triMinLon = Math.min(p0.longLat[0], p1.longLat[0]);
360
+ const triMaxLon = Math.max(p0.longLat[0], p1.longLat[0]);
361
+ const segMinLon = Math.max(workBBox.min[0], triMinLon);
362
+ const segMaxLon = Math.min(workBBox.max[0], triMaxLon);
363
+ // If this clipped segment is valid, generate points
364
+ if (segMinLon < segMaxLon - 1e-9) {
365
+ // Add the exact start and end points of the clipped segment
366
+ addPoint(p0.longLat, p0.vec, p0.arcIndex);
367
+ addPoint(p1.longLat, p1.vec, p1.arcIndex);
368
+ // Add fill points *between* them
369
+ let currentLon = Math.ceil(segMinLon / lonStep) * lonStep;
370
+ if (currentLon < segMinLon - 1e-9)
371
+ currentLon += lonStep;
372
+ while (currentLon < segMaxLon - 1e-9) {
373
+ addPoint([currentLon, lat], undefined, undefined);
374
+ currentLon += lonStep;
375
+ }
376
+ }
377
+ }
378
+ currentY += latStep;
379
+ }
380
+ // 2d. Generate Longitude (Meridian) Points
381
+ const startLon = workBBox.min[0];
382
+ const endLon = workBBox.max[0];
383
+ let currentLon = Math.ceil(startLon / lonStep) * lonStep;
384
+ if (currentLon < startLon - 1e-9)
385
+ currentLon += lonStep;
386
+ while (currentLon <= endLon + 1e-9) {
387
+ // Find where this longitude line intersects the triangle
388
+ const intersections = getPoints(triangleMeta, currentLon, false);
389
+ if (intersections.length === 0) {
390
+ currentLon += lonStep;
391
+ continue;
392
+ }
393
+ for (const p of intersections) {
394
+ const pLongLat = p.longLat;
395
+ // Check if this point is inside the *workBBox*
396
+ if (pLongLat[1] >= workBBox.min[1] - 1e-9 &&
397
+ pLongLat[1] <= workBBox.max[1] + 1e-9) {
398
+ addPoint(pLongLat, p.vec, p.arcIndex);
399
+ }
400
+ }
401
+ currentLon += lonStep;
402
+ }
403
+ } // End loop over limits
404
+ // 3. Triangulate
405
+ // We must have at least 3 points to make a triangle
406
+ if (pointCounter < 3) {
407
+ return {
408
+ vec3s: new Float32Array(),
409
+ longLats: new Float32Array(),
410
+ indices: new Uint32Array(),
411
+ realEdgeArcIndices: null,
412
+ };
413
+ }
414
+ const delaunator = new Delaunator(allLongLats);
415
+ let indices = delaunator.triangles;
416
+ indices = filterEdgePointTriangles(indices, edgePointIndexSets);
417
+ // Convert to Mercator
418
+ for (let i = 0; i < allLongLats.length / 2; i++) {
419
+ const xy = radianToMercatorXY([allLongLats[i * 2], allLongLats[i * 2 + 1]]);
420
+ allLongLats[i * 2] = xy[0];
421
+ allLongLats[i * 2 + 1] = xy[1];
422
+ }
423
+ const realEdgeArcIndices = calculateRealEdgeArc ? orderIndcecesAlongArc(triangleMeta, edgePointIndexSets, allLongLats) : null;
424
+ return {
425
+ vec3s: new Float32Array(allVec3s),
426
+ longLats: new Float32Array(allLongLats),
427
+ indices: indices,
428
+ realEdgeArcIndices,
429
+ };
430
+ }
431
+ function orderIndcecesAlongArc(triangleMeta, edgePointIndexSets, allLongLats) {
432
+ let result = [];
433
+ let itemCounter = 0;
434
+ for (let i = 0; i < 3; i++) {
435
+ const arc = triangleMeta.arcs[i];
436
+ if (!arc.realEdge) {
437
+ continue;
438
+ }
439
+ // convert set to list
440
+ const indices = Array.from(edgePointIndexSets[i]);
441
+ if (indices.length == 0) {
442
+ continue;
443
+ }
444
+ const dimension = Math.abs(arc.normal[2]) < 0.0001 ? 0 : 1;
445
+ indices.sort((a, b) => {
446
+ return allLongLats[a * 2 + dimension] - allLongLats[b * 2 + dimension];
447
+ });
448
+ result.push(indices);
449
+ itemCounter += indices.length + 1;
450
+ }
451
+ if (result.length === 0) {
452
+ return null;
453
+ }
454
+ const finalResult = new Uint32Array(itemCounter);
455
+ let counter = 0;
456
+ for (let i = 0; i < result.length; i++) {
457
+ finalResult[counter++] = uint32Escape;
458
+ const indices = result[i];
459
+ for (let j = 0; j < indices.length; j++) {
460
+ finalResult[counter++] = indices[j];
461
+ }
462
+ }
463
+ return finalResult;
464
+ }