@pirireis/webglobeplugins 0.9.6 → 0.9.8

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 (304) hide show
  1. package/{Math → dist/Math}/angle-calculation.js +15 -14
  2. package/dist/Math/arc.js +65 -0
  3. package/{Math → dist/Math}/bounds/line-bbox.js +188 -225
  4. package/dist/Math/constants.js +9 -0
  5. package/{Math/frustum/camera.ts → dist/Math/frustum/camera.js} +24 -32
  6. package/{Math/frustum/from-globeinfo.ts → dist/Math/frustum/from-globeinfo.js} +48 -63
  7. package/dist/Math/frustum/types.js +2 -0
  8. package/{Math/globe-util/horizon-plane.ts → dist/Math/globe-util/horizon-plane.js} +112 -137
  9. package/dist/Math/index.js +1 -0
  10. package/dist/Math/juction/arc-plane.js +83 -0
  11. package/dist/Math/juction/line-sphere.js +25 -0
  12. package/{Math/juction/plane-plane.ts → dist/Math/juction/plane-plane.js} +58 -66
  13. package/dist/Math/line.js +56 -0
  14. package/dist/Math/matrix4.js +1 -0
  15. package/{Math → dist/Math}/methods.js +201 -237
  16. package/dist/Math/plane.js +60 -0
  17. package/{Math/quaternion.ts → dist/Math/quaternion.js} +104 -120
  18. package/dist/Math/types.js +2 -0
  19. package/dist/Math/utils.js +4 -0
  20. package/{Math/vec3.ts → dist/Math/vec3.js} +126 -155
  21. package/dist/algorithms/search-binary.js +19 -0
  22. package/dist/altitude-locator/adaptors.js +1 -0
  23. package/{altitude-locator → dist/altitude-locator}/draw-subset-obj.js +18 -27
  24. package/dist/altitude-locator/keymethod.js +1 -0
  25. package/{altitude-locator → dist/altitude-locator}/plugin.js +341 -439
  26. package/{altitude-locator → dist/altitude-locator}/types.js +23 -26
  27. package/{arrowfield → dist/arrowfield}/adaptor.js +14 -11
  28. package/dist/arrowfield/index.js +10 -0
  29. package/{arrowfield → dist/arrowfield}/plugin.js +86 -128
  30. package/dist/bearing-line/index.js +8 -0
  31. package/{bearing-line → dist/bearing-line}/plugin.js +449 -512
  32. package/{circle-line-chain → dist/circle-line-chain}/chain-list-map.js +205 -221
  33. package/dist/circle-line-chain/init.js +1 -0
  34. package/{circle-line-chain → dist/circle-line-chain}/plugin.js +424 -469
  35. package/dist/circle-line-chain/util.js +5 -0
  36. package/{compass-rose → dist/compass-rose}/compass-rose-padding-flat.js +225 -266
  37. package/{compass-rose → dist/compass-rose}/compass-text-writer.js +153 -173
  38. package/dist/compass-rose/index.js +7 -0
  39. package/{compassrose → dist/compassrose}/compassrose.js +296 -341
  40. package/dist/compassrose/index.js +8 -0
  41. package/dist/globe-types.js +1 -0
  42. package/dist/heatwave/index.js +10 -0
  43. package/{heatwave → dist/heatwave}/isobar/objectarraylabels.js +202 -247
  44. package/{heatwave → dist/heatwave}/isobar/plugin.js +343 -340
  45. package/{heatwave → dist/heatwave}/isobar/quadtreecontours.js +300 -336
  46. package/{heatwave → dist/heatwave}/plugins/heatwaveglobeshell.js +206 -258
  47. package/dist/index.js +58 -0
  48. package/{jest.config.js → dist/jest.config.js} +7 -6
  49. package/{partialrings → dist/partialrings}/buffer-manager.js +81 -89
  50. package/dist/partialrings/index.js +41 -0
  51. package/{partialrings → dist/partialrings}/plugin.js +135 -160
  52. package/{partialrings → dist/partialrings}/program.js +204 -242
  53. package/{pin → dist/pin}/pin-object-array.js +305 -381
  54. package/{pin → dist/pin}/pin-point-totem.js +60 -77
  55. package/{point-heat-map → dist/point-heat-map}/adaptors/timetracksplugin-format-to-this.js +66 -78
  56. package/dist/point-heat-map/index.js +1 -0
  57. package/{point-heat-map → dist/point-heat-map}/plugin-webworker.js +126 -151
  58. package/{point-heat-map → dist/point-heat-map}/point-to-heat-map-flow.js +127 -150
  59. package/dist/point-tracks/key-methods.js +5 -0
  60. package/{point-tracks → dist/point-tracks}/plugin.js +338 -394
  61. package/dist/programs/arrowfield/index.js +7 -0
  62. package/{programs → dist/programs}/arrowfield/logic.js +144 -173
  63. package/{programs → dist/programs}/arrowfield/object.js +66 -89
  64. package/{programs → dist/programs}/data2legend/density-to-legend.js +76 -90
  65. package/{programs → dist/programs}/data2legend/point-to-density-texture.js +76 -90
  66. package/dist/programs/float2legendwithratio/index.js +8 -0
  67. package/{programs → dist/programs}/float2legendwithratio/logic.js +122 -145
  68. package/{programs → dist/programs}/float2legendwithratio/object.js +110 -141
  69. package/{programs → dist/programs}/globe-util/is-globe-moved.js +21 -27
  70. package/dist/programs/globeshell/index.js +8 -0
  71. package/dist/programs/globeshell/noise/noises.js +1 -0
  72. package/dist/programs/globeshell/wiggle/index.js +8 -0
  73. package/{programs → dist/programs}/globeshell/wiggle/logic.js +246 -272
  74. package/{programs → dist/programs}/globeshell/wiggle/object.js +72 -93
  75. package/dist/programs/helpers/blender/index.js +1 -0
  76. package/{programs → dist/programs}/helpers/blender/program.js +61 -73
  77. package/dist/programs/helpers/fadeaway/index.js +7 -0
  78. package/{programs → dist/programs}/helpers/fadeaway/logic.js +49 -53
  79. package/dist/programs/helpers/fadeaway/object.js +20 -0
  80. package/dist/programs/helpers/index.js +8 -0
  81. package/dist/programs/index.js +58 -0
  82. package/dist/programs/interface.js +1 -0
  83. package/{programs → dist/programs}/line-on-globe/angled-line.js +125 -155
  84. package/{programs → dist/programs}/line-on-globe/circle-accurate-3d.js +95 -121
  85. package/{programs → dist/programs}/line-on-globe/circle-accurate-flat.js +158 -204
  86. package/{programs → dist/programs}/line-on-globe/circle-accurate.js +117 -141
  87. package/{programs → dist/programs}/line-on-globe/circle.js +111 -135
  88. package/{programs → dist/programs}/line-on-globe/degree-padding-around-circle-3d.js +111 -140
  89. package/dist/programs/line-on-globe/index.js +1 -0
  90. package/{programs → dist/programs}/line-on-globe/lines-color-instanced-flat.js +91 -106
  91. package/{programs/line-on-globe/linestrip.ts → dist/programs/line-on-globe/linestrip.js} +108 -165
  92. package/{programs → dist/programs}/line-on-globe/naive-accurate-flexible.js +127 -171
  93. package/{programs → dist/programs}/line-on-globe/to-the-surface.js +83 -101
  94. package/dist/programs/line-on-globe/util.js +8 -0
  95. package/{programs → dist/programs}/picking/pickable-renderer.js +107 -135
  96. package/{programs → dist/programs}/point-on-globe/element-globe-surface-glow.js +101 -127
  97. package/{programs → dist/programs}/point-on-globe/element-point-glow.js +88 -119
  98. package/{programs → dist/programs}/point-on-globe/square-pixel-point.js +126 -141
  99. package/{programs/programcache.ts → dist/programs/programcache.js} +131 -131
  100. package/{programs → dist/programs}/rings/distancering/circleflatprogram.js +115 -95
  101. package/{programs → dist/programs}/rings/distancering/circlepaddingfreeangleprogram.js +320 -329
  102. package/{programs → dist/programs}/rings/distancering/circlepaddysharedbuffer.js +357 -420
  103. package/dist/programs/rings/distancering/index.js +14 -0
  104. package/{programs → dist/programs}/rings/distancering/paddyflatprogram.js +120 -94
  105. package/{programs → dist/programs}/rings/distancering/paddyflatprogram2d.js +122 -98
  106. package/{programs → dist/programs}/rings/distancering/paddyflatprogram3d.js +120 -94
  107. package/dist/programs/rings/distancering/shader.js +1 -0
  108. package/dist/programs/rings/index.js +17 -0
  109. package/{programs → dist/programs}/rings/partial-ring/piece-of-pie.js +181 -221
  110. package/{programs → dist/programs}/totems/camerauniformblock.js +147 -184
  111. package/{programs → dist/programs}/totems/canvas-webglobe-info.js +102 -128
  112. package/{programs → dist/programs}/totems/gpu-selection-uniform-block.js +104 -128
  113. package/dist/programs/totems/index.js +40 -0
  114. package/dist/programs/two-d/pixel-circle.js +1 -0
  115. package/{programs → dist/programs}/two-d/pixel-padding-for-compass.js +101 -113
  116. package/{programs → dist/programs}/util.js +17 -20
  117. package/dist/programs/vectorfields/index.js +23 -0
  118. package/{programs → dist/programs}/vectorfields/logics/drawrectangleparticles.js +65 -83
  119. package/dist/programs/vectorfields/logics/index.js +12 -0
  120. package/{programs → dist/programs}/vectorfields/logics/pixelbased.js +84 -103
  121. package/{programs → dist/programs}/vectorfields/logics/ubo.js +55 -56
  122. package/{programs → dist/programs}/vectorfields/pingpongbuffermanager.js +76 -80
  123. package/dist/rangerings/enum.js +5 -0
  124. package/dist/rangerings/index.js +15 -0
  125. package/{rangerings → dist/rangerings}/plugin.js +560 -649
  126. package/{rangerings → dist/rangerings}/rangeringangletext.js +329 -368
  127. package/{rangerings → dist/rangerings}/ring-account.js +117 -129
  128. package/{shaders → dist/shaders}/fragment-toy/firework.js +5 -2
  129. package/{shaders → dist/shaders}/fragment-toy/singularity.js +5 -5
  130. package/{shape-on-terrain/arc/naive/plugin.ts → dist/shape-on-terrain/arc/naive/plugin.js} +252 -304
  131. package/{timetracks → dist/timetracks}/adaptors-line-strip.js +71 -80
  132. package/{timetracks → dist/timetracks}/adaptors.js +122 -133
  133. package/dist/timetracks/index.js +19 -0
  134. package/{timetracks → dist/timetracks}/plugin-line-strip.js +250 -295
  135. package/{timetracks → dist/timetracks}/plugin.js +258 -304
  136. package/{timetracks → dist/timetracks}/program-line-strip.js +416 -493
  137. package/{timetracks → dist/timetracks}/program.js +464 -542
  138. package/{timetracks → dist/timetracks}/programpoint-line-strip.js +101 -122
  139. package/{timetracks → dist/timetracks}/programpoint.js +101 -122
  140. package/{types.ts → dist/types.js} +15 -17
  141. package/{util → dist/util}/account/bufferoffsetmanager.js +179 -209
  142. package/dist/util/account/index.js +23 -0
  143. package/{util/account/single-attribute-buffer-management/buffer-manager.ts → dist/util/account/single-attribute-buffer-management/buffer-manager.js} +108 -119
  144. package/{util/account/single-attribute-buffer-management/buffer-orchestrator.ts → dist/util/account/single-attribute-buffer-management/buffer-orchestrator.js} +150 -173
  145. package/dist/util/account/single-attribute-buffer-management/index.js +9 -0
  146. package/{util/account/single-attribute-buffer-management/object-store.ts → dist/util/account/single-attribute-buffer-management/object-store.js} +51 -65
  147. package/dist/util/account/single-attribute-buffer-management/types.js +2 -0
  148. package/{util → dist/util}/account/util.js +22 -22
  149. package/dist/util/algorithms/index.js +1 -0
  150. package/{util → dist/util}/algorithms/search-binary.js +28 -26
  151. package/dist/util/check/get.js +18 -0
  152. package/dist/util/check/index.js +1 -0
  153. package/dist/util/check/typecheck.js +49 -0
  154. package/{util → dist/util}/geometry/index.js +51 -53
  155. package/{util/gl-util/buffer/attribute-loader.ts → dist/util/gl-util/buffer/attribute-loader.js} +69 -85
  156. package/dist/util/gl-util/buffer/index.js +6 -0
  157. package/dist/util/gl-util/buffer/types.js +1 -0
  158. package/dist/util/gl-util/draw-options/methods.js +38 -0
  159. package/dist/util/gl-util/draw-options/types.js +15 -0
  160. package/{util/gl-util/uniform-block/manager.ts → dist/util/gl-util/uniform-block/manager.js} +156 -187
  161. package/dist/util/gl-util/uniform-block/shader.js +1 -0
  162. package/dist/util/gl-util/uniform-block/types.js +8 -0
  163. package/{util → dist/util}/heatwavedatamanager/datamanager.js +152 -168
  164. package/dist/util/heatwavedatamanager/index.js +10 -0
  165. package/{util → dist/util}/heatwavedatamanager/pointcoordinatesdatacalculator.js +122 -133
  166. package/{util → dist/util}/heatwavedatamanager/pointcoordsmeta.js +20 -22
  167. package/dist/util/index.js +57 -0
  168. package/dist/util/interpolation/index.js +1 -0
  169. package/dist/util/interpolation/timetrack/index.js +5 -0
  170. package/{util → dist/util}/interpolation/timetrack/timetrack-interpolator.js +79 -88
  171. package/{util → dist/util}/interpolation/timetrack/web-worker-str.js +5 -2
  172. package/{util → dist/util}/interpolation/timetrack/web-worker.js +48 -51
  173. package/{util → dist/util}/jshelpers/data-filler.js +20 -19
  174. package/{util → dist/util}/jshelpers/equality.js +20 -17
  175. package/dist/util/jshelpers/index.js +37 -0
  176. package/{util → dist/util}/jshelpers/timefilters.js +32 -32
  177. package/{util → dist/util}/picking/fence.js +46 -46
  178. package/{util → dist/util}/picking/picker-displayer.js +139 -177
  179. package/{util → dist/util}/programs/draw-texture-on-canvas.js +69 -82
  180. package/dist/util/programs/index.js +17 -0
  181. package/{util → dist/util}/programs/shapesonglobe.js +174 -206
  182. package/{util → dist/util}/programs/supersampletotextures.js +103 -132
  183. package/{util → dist/util}/programs/texturetoglobe.js +133 -154
  184. package/{util/shaderfunctions/geometrytransformations.ts → dist/util/shaderfunctions/geometrytransformations.js} +68 -116
  185. package/dist/util/shaderfunctions/index.js +18 -0
  186. package/{util → dist/util}/shaderfunctions/nodata.js +5 -4
  187. package/{util → dist/util}/shaderfunctions/noisefunctions.js +9 -10
  188. package/{util/surface-line-data/arc-bboxes.ts → dist/util/surface-line-data/arc-bboxes.js} +25 -42
  189. package/{util → dist/util}/surface-line-data/arcs-to-cuts.js +50 -74
  190. package/dist/util/surface-line-data/cut-arc.js +1 -0
  191. package/{util/surface-line-data/flow.ts → dist/util/surface-line-data/flow.js} +28 -52
  192. package/dist/util/surface-line-data/rbush-manager.js +1 -0
  193. package/dist/util/surface-line-data/types.js +1 -0
  194. package/dist/util/surface-line-data/web-worker.js +1 -0
  195. package/dist/util/webglobe/gldefaultstates.js +7 -0
  196. package/dist/util/webglobe/index.js +18 -0
  197. package/{util → dist/util}/webglobe/rasteroverlay.js +78 -96
  198. package/{util/webglobjectbuilders.ts → dist/util/webglobjectbuilders.js} +388 -456
  199. package/{util → dist/util}/webglobjectbuilders1.js +237 -271
  200. package/{waveparticles → dist/waveparticles}/adaptor.js +17 -16
  201. package/dist/waveparticles/index.js +10 -0
  202. package/{waveparticles → dist/waveparticles}/plugin.js +266 -313
  203. package/{wind → dist/wind}/imagetovectorfieldandmagnitude.js +35 -39
  204. package/dist/wind/index.js +14 -0
  205. package/{wind → dist/wind}/plugin.js +681 -812
  206. package/{wind → dist/wind}/vectorfieldimage.js +25 -27
  207. package/{write-text → dist/write-text}/attached-text-writer.js +91 -105
  208. package/{write-text → dist/write-text}/context-text.js +98 -125
  209. package/{write-text → dist/write-text}/context-text3.js +155 -178
  210. package/dist/write-text/index.js +5 -0
  211. package/{write-text → dist/write-text}/writer-plugin.js +8 -7
  212. package/package.json +5 -2
  213. package/Math/arc.ts +0 -76
  214. package/Math/constants.ts +0 -11
  215. package/Math/frustum/types.ts +0 -11
  216. package/Math/index.js +0 -0
  217. package/Math/juction/arc-plane.ts +0 -114
  218. package/Math/juction/line-sphere.ts +0 -30
  219. package/Math/line.ts +0 -70
  220. package/Math/matrix4.ts +0 -0
  221. package/Math/plane.ts +0 -86
  222. package/Math/roadmap.md +0 -10
  223. package/Math/types.ts +0 -45
  224. package/Math/utils.js +0 -3
  225. package/algorithms/search-binary.js +0 -14
  226. package/altitude-locator/adaptors.js +0 -0
  227. package/altitude-locator/keymethod.js +0 -0
  228. package/arrowfield/index.js +0 -3
  229. package/bearing-line/index.js +0 -2
  230. package/circle-line-chain/init.js +0 -0
  231. package/circle-line-chain/readme.md +0 -57
  232. package/circle-line-chain/util.js +0 -1
  233. package/compass-rose/index.js +0 -3
  234. package/compassrose/index.js +0 -2
  235. package/depth-locator/readme.md +0 -26
  236. package/globe-types.ts +0 -13
  237. package/heatwave/index.js +0 -4
  238. package/partialrings/goals.md +0 -17
  239. package/partialrings/index.js +0 -3
  240. package/point-heat-map/index.js +0 -0
  241. package/point-heat-map/readme.md +0 -15
  242. package/point-tracks/key-methods.js +0 -3
  243. package/programs/arrowfield/index.js +0 -2
  244. package/programs/float2legendwithratio/index.js +0 -3
  245. package/programs/globeshell/index.js +0 -2
  246. package/programs/globeshell/noise/noises.js +0 -0
  247. package/programs/globeshell/wiggle/index.js +0 -6
  248. package/programs/helpers/blender/index.js +0 -0
  249. package/programs/helpers/fadeaway/index.js +0 -3
  250. package/programs/helpers/fadeaway/object.js +0 -20
  251. package/programs/helpers/index.js +0 -2
  252. package/programs/index.js +0 -21
  253. package/programs/interface.ts +0 -7
  254. package/programs/line-on-globe/index.js +0 -0
  255. package/programs/line-on-globe/util.js +0 -8
  256. package/programs/rings/distancering/index.js +0 -5
  257. package/programs/rings/distancering/shader.js +0 -0
  258. package/programs/rings/index.js +0 -1
  259. package/programs/totems/camerauniformblock.d.ts +0 -48
  260. package/programs/totems/index.ts +0 -2
  261. package/programs/two-d/pixel-circle.js +0 -0
  262. package/programs/vectorfields/index.js +0 -3
  263. package/programs/vectorfields/logics/index.js +0 -5
  264. package/publish.bat +0 -60
  265. package/rangerings/enum.js +0 -3
  266. package/rangerings/index.js +0 -5
  267. package/shape-on-terrain/goal.md +0 -12
  268. package/tests/Math/junction/arc-plane.test.ts +0 -133
  269. package/tests/Math/junction/plane-plane.test.ts +0 -82
  270. package/tests/Math/plane.test.ts +0 -43
  271. package/tests/Math/vec3.test.ts +0 -14
  272. package/timetracks/index.js +0 -6
  273. package/timetracks/readme.md +0 -1
  274. package/tsconfig.json +0 -22
  275. package/util/account/index.js +0 -6
  276. package/util/account/single-attribute-buffer-management/index.ts +0 -13
  277. package/util/account/single-attribute-buffer-management/types.ts +0 -39
  278. package/util/algorithms/index.js +0 -0
  279. package/util/check/get.js +0 -13
  280. package/util/check/index.js +0 -0
  281. package/util/check/typecheck.js +0 -39
  282. package/util/gl-util/buffer/index.ts +0 -6
  283. package/util/gl-util/buffer/types.ts +0 -13
  284. package/util/gl-util/draw-options/methods.ts +0 -66
  285. package/util/gl-util/draw-options/types.ts +0 -28
  286. package/util/gl-util/uniform-block/roadmap.md +0 -70
  287. package/util/gl-util/uniform-block/shader.js +0 -0
  288. package/util/gl-util/uniform-block/types.ts +0 -27
  289. package/util/heatwavedatamanager/index.js +0 -3
  290. package/util/index.js +0 -13
  291. package/util/interpolation/index.js +0 -0
  292. package/util/interpolation/timetrack/index.js +0 -9
  293. package/util/jshelpers/index.js +0 -1
  294. package/util/programs/index.js +0 -1
  295. package/util/shaderfunctions/index.js +0 -2
  296. package/util/surface-line-data/cut-arc.js +0 -0
  297. package/util/surface-line-data/rbush-manager.js +0 -0
  298. package/util/surface-line-data/types.ts +0 -27
  299. package/util/surface-line-data/web-worker.js +0 -0
  300. package/util/webglobe/gldefaultstates.js +0 -5
  301. package/util/webglobe/index.js +0 -2
  302. package/waveparticles/index.js +0 -3
  303. package/wind/index.js +0 -5
  304. package/write-text/index.js +0 -1
@@ -1,649 +1,560 @@
1
- /**
2
- * @typedef RangeRingData
3
- * @property {number} centerX
4
- * @property {number} centerY
5
- * @property {Array<Ring>} rings
6
- *
7
- * @typedef Ring
8
- * @property {number} radius
9
- * @property {number} padding
10
- * @property {[number, number, number]} color
11
- *
12
- *
13
- * @method insertBulk
14
- * @typedef {Array<{ringID, radius, padding}>} rings
15
- * @param {Array<centerID:string, x:number, y:number, stepAngle:number, rgba:[4 numbers], rings:rings} items
16
-
17
- * @method updateCentersCoordinate @param {Array<{centerID, long,lat}>} items
18
- * @method updateCentersColor @param {Array<{centerID, rgba:[4 numbers]}>} centerColors
19
- *
20
- * @method updateCentersHide @param {Array<{centerID, hide, textHide}>} centerHides
21
- * @method removeCenters @param {Array<{centerID}>} centerIds
22
- * @method setOpacity @param {number} opacity
23
- *
24
- * @method setOneDegreePaddingOn // performance consuming, might be removed
25
- *
26
- */
27
-
28
- import { centerCoords2dflatDataCreatorWithRadius, CircleCache as CircleCache2D } from "../programs/line-on-globe/circle-accurate-flat";
29
- import { CircleCache as CircleCache3D } from "../programs/line-on-globe/circle-accurate-3d";
30
- import { LinesColorInstancedFlatCache } from "../programs/line-on-globe/lines-color-instanced-flat";
31
- import { BufferOrchestrator, BufferManager } from "../util/account";
32
- import { mapGetOrThrow } from "../util/check/get";
33
- import { populateFloat32Array } from "../util/jshelpers/data-filler";
34
- import { RingAccount, ringBigPaddingKeyMethod, ringKeyMethod } from "./ring-account";
35
- import { CirclePadding3DCache } from "../programs/line-on-globe/degree-padding-around-circle-3d";
36
- import { LineOnGlobeCache } from '../programs/line-on-globe/naive-accurate-flexible';
37
- import RangeRingAngleText from "./rangeringangletext";
38
- import { Z_ALPHA_MODE } from "../programs/line-on-globe/util";
39
- import { ENUM_HIDE } from "./enum";
40
- import { opacityCheck, constraintFloat } from "../util/check/typecheck";
41
- import { normalize } from "../util/geometry"
42
- const CIRCLE_FLAT_EDGE_COUNT = 362; // 360 + 2 for closing the circle and a cutting point
43
-
44
-
45
- const coordOnSphere = (long, lat, globe, altitude = 0) => {
46
- const coord = globe.api_GetCartesian3DPoint(long, lat, 0, 0);
47
- return normalize(coord, 6378.137 + altitude);
48
- }
49
-
50
-
51
- /**
52
- *
53
- *
54
- * @typedef {string} centerID
55
- *
56
- * @typedef {Object} RangeRing
57
- * @property {string} ringID
58
- * @property {number} radius in range meters
59
- * @property {number} padding badding range in meter
60
- *
61
- *
62
- * Array < centerID: string, long: number, lat: number, stepAngle: number, rgba: [4 numbers], rings: rings, hide, textHide
63
- * @typedef {Object} RangeRingsItem
64
- * @property {centerID} centerID
65
- * @property {number} long
66
- * @property {number} lat
67
- * @property {number} stepAngle
68
- * @property {number} altitude
69
- * @property {number} hide
70
- * @property {number} textHide
71
- * @property {number} rgba
72
- * @property {Array<RangeRing>} rings
73
- */
74
-
75
- class RangeRings {
76
- constructor(id,
77
- {
78
- oneDegreePadding = true, showNumbers = true, numbersStyle = null, opacity = 1, zAlphaOnDegreePadding = Z_ALPHA_MODE.ON
79
- } = {},
80
- {
81
- textDataPreAdaptor = null,
82
- textWritersMap = new Map()
83
- } = {}) {
84
- this.id = id;
85
- this._oneDegreePadding = oneDegreePadding;
86
- this._zAlphaOnDegreePadding = zAlphaOnDegreePadding;
87
- this._showNumbers = showNumbers;
88
- this._numbersStyle = numbersStyle;
89
- this._opacity = opacity;
90
- this._ringAccount = new RingAccount();
91
- this._textWritersMap = textWritersMap;
92
- this._textDataPreAdaptor = textDataPreAdaptor;
93
- this._textWritersMap.forEach((textWriter) => textWriter.setKeyAdaptor((item) => item.__identity__));
94
- }
95
-
96
-
97
- // USER API
98
-
99
- /**
100
- * @method updateCentersCoordinate @param { Array < { centerID, long,lat } >} items
101
- */
102
- updateCentersCoordinate(items, { textWriterIDs = [] } = {}) {
103
- // Algorithm
104
- /**
105
- * 1. ask centerRingAccount for existing rings COORDINATE RELATED KEYS
106
- * 2. update centers
107
- * 3. update buffer orchestators
108
- */
109
-
110
- this._ringAccount.updateCentersCoordinate(items);
111
- const { globe,
112
- bufferOrchestrator, bufferManagersCompMap,
113
- paddingBufferOrchestrator,
114
- bufferManagersCompMapPadding
115
- } = this;
116
- for (const { centerID } of items) {
117
- const datas = this.__reconstructCentralRings(centerID);
118
- bufferOrchestrator.updateBulk(datas, bufferManagersCompMap, ["centerCoords3d", "centerCoords2dflat", "targetCoords3d", "centerCoords2dflatForPadding"]);
119
- const paddingDatas = this.__reconstructCentralRingsBigPaddings(centerID);
120
- paddingBufferOrchestrator.updateBulk(paddingDatas, bufferManagersCompMapPadding, ["circlePoint2d", "paddingPoint2d", "circlePoint3d", "paddingPoint3d"]);
121
- }
122
- this.paddingTextPlugin?.updateCentersXY(items);
123
-
124
- this.__contextTextWriterUpdate(items.map(({ centerID }) => centerID), textWriterIDs);
125
- globe.DrawRender();
126
- }
127
-
128
- /**
129
- * @method insertBulk
130
- * @param { Array < RangeRingsItem> } items
131
- */
132
- insertBulk(items, { textWriterIDs = [] } = {}) {
133
- // Algorithm
134
- /**
135
- * 1 ask centerRingAccount for existing rings
136
- * 2. delete all existing keys with buffer orchestators
137
- * 3. insert new centerRings to centerRingAccount
138
- * 4. insert new keys with buffer orchestators
139
- */
140
- const { globe, _ringAccount, bufferOrchestrator, bufferManagersCompMap, paddingBufferOrchestrator, bufferManagersCompMapPadding } = this;
141
- for (const item of items) {
142
- const existingKeys = _ringAccount.ringKeys(item.centerID);
143
- if (existingKeys.length) {
144
- bufferOrchestrator.deleteBulk(existingKeys, bufferManagersCompMap);
145
- }
146
- const paddingKeys = _ringAccount.ringBigPaddingKeys(item.centerID);
147
- if (paddingKeys.length) {
148
- paddingBufferOrchestrator.deleteBulk(paddingKeys, bufferManagersCompMapPadding);
149
- }
150
- }
151
-
152
- for (const item of items) {
153
- _ringAccount.insertCenter(item);
154
- const datas = this.__reconstructCentralRings(item.centerID);
155
- bufferOrchestrator.insertBulk(datas, bufferManagersCompMap);
156
- const paddingDatas = this.__reconstructCentralRingsBigPaddings(item.centerID);
157
- paddingBufferOrchestrator.insertBulk(paddingDatas, bufferManagersCompMapPadding);
158
- }
159
- this.paddingTextPlugin?.insertBulk(items);
160
- this.__contextTextWriterUpdate(items.map(({ centerID }) => centerID), textWriterIDs);
161
- globe.DrawRender();
162
- }
163
-
164
-
165
-
166
-
167
- /**
168
- * @method updateCentersColor @param { Array < { centerID, rgba: [4 numbers] } >} centerColors
169
- */
170
- updateCentersColor(centerColors, { textWriterIDs = [] } = {}) {
171
- // Algorithm
172
- /**
173
- * 1. ask centerRingAccount for existing rings COLOR KEYS
174
- * 2. update centers
175
- * 3. update buffer orchestators
176
- */
177
- this._ringAccount.updateCentersColor(centerColors);
178
- const { globe,
179
- bufferOrchestrator, bufferManagersCompMap,
180
- paddingBufferOrchestrator, bufferManagersCompMapPadding
181
- } = this;
182
- for (const { centerID } of centerColors) {
183
- const datas = this.__reconstructCentralProperties(centerID);
184
- bufferOrchestrator.updateBulk(datas, bufferManagersCompMap, ["rgba", "rgbaMercator"]);
185
- const paddingDatas = this.__reconstructCentralPaddingProperties(centerID)
186
- paddingBufferOrchestrator.updateBulk(paddingDatas, bufferManagersCompMapPadding, ["rgba"]);
187
- }
188
- this.__contextTextWriterUpdate(centerColors.map(({ centerID }) => centerID), textWriterIDs);
189
- globe.DrawRender();
190
- }
191
-
192
- /**
193
- *
194
- * @method updateCentersHide @param { Array < { centerID, hide, textHide } >} centerHides
195
- */
196
- updateCentersHide(centerHides, { textWriterIDs = [] } = {}) {
197
- // Algorithm
198
- /**
199
- * Simple
200
- * 1. update centers
201
- * 2. reconstruct data,
202
- * 3. update color buffer
203
- * */
204
- this._ringAccount.updateCentersHide(centerHides);
205
- const { globe,
206
- bufferOrchestrator, bufferManagersCompMap,
207
- paddingBufferOrchestrator, bufferManagersCompMapPadding
208
- } = this;
209
-
210
- for (const { centerID } of centerHides) {
211
- const datas = this.__reconstructCentralProperties(centerID);
212
- bufferOrchestrator.updateBulk(datas, bufferManagersCompMap, ["rgba", "rgbaMercator"]);
213
- const paddingDatas0 = this.__reconstructCentralRings(centerID);
214
- bufferOrchestrator.updateBulk(paddingDatas0, bufferManagersCompMap, ["radius3dsmall", "centerCoords2dflatForPadding"]);
215
-
216
- const paddingDatas = this.__reconstructCentralPaddingProperties(centerID)
217
- paddingBufferOrchestrator.updateBulk(paddingDatas, bufferManagersCompMapPadding, ["rgba"]);
218
- }
219
- this.paddingTextPlugin?.updateCentersHide(centerHides);
220
- this.__contextTextWriterUpdate(centerHides.map(({ centerID }) => centerID), textWriterIDs);
221
- globe.DrawRender();
222
- /**
223
- * Complicated
224
- * 1. ask centerRingAccount for existing rings HIDE KEYS
225
- * 2. delete from buffer orchestators
226
- * 3. mark centers as hidden
227
- */
228
- }
229
-
230
-
231
- /**
232
- * @param {Array<string>} textWriterIDs textWritersMap keys to be used for writing text.
233
- * @param {Array<string>} itemKeys if empty, all texts will be updated. Use {@link ringKeyMethod} method to get keys
234
- */
235
- updateText(textWriterIDs = [], itemKeys = null) {
236
- const textWritersMap = textWriterGetOrThrow(this._textWritersMap, textWriterIDs);
237
- if (itemKeys === null) {
238
- this._ringAccount.updateAllText(textWritersMap, this._textDataPreAdaptor);
239
- this.globe.DrawRender();
240
- } else {
241
- itemKeys.forEach((key) => {
242
- const item = this._ringAccount.getCenter(key);
243
- if (item === undefined) throw new Error("Center not found");
244
- const textData = this._textDataPreAdaptor(item);
245
- textWritersMap.forEach((textWriter) => textWriter.insertText(textData));
246
- });
247
- }
248
- this.globe.DrawRender();
249
- }
250
-
251
-
252
-
253
-
254
- /**
255
- * @method removeCenters @param { Array < { centerID } >} centerIDs
256
- */
257
- removeCenters(centerIDs) {
258
- const { globe,
259
- bufferOrchestrator, bufferManagersCompMap,
260
- paddingBufferOrchestrator, bufferManagersCompMapPadding,
261
- _ringAccount } = this;
262
- for (const centerID of centerIDs) {
263
- const existingKeys = _ringAccount.ringKeys(centerID);
264
- if (existingKeys.length) {
265
- bufferOrchestrator.deleteBulk(existingKeys, bufferManagersCompMap);
266
- this._textWritersMap.forEach((textWriter) => textWriter.deleteTextBulk(existingKeys));
267
-
268
- }
269
- }
270
- for (const centerID of centerIDs) {
271
- const paddingKeys = _ringAccount.ringBigPaddingKeys(centerID);
272
- if (paddingKeys.length) {
273
- paddingBufferOrchestrator.deleteBulk(paddingKeys, bufferManagersCompMapPadding);
274
- }
275
- }
276
- this.paddingTextPlugin?.removeCenters(centerIDs);
277
- this._ringAccount.removeCenters(centerIDs);
278
- globe.DrawRender();
279
- }
280
-
281
- /**
282
- * @method setOpacity @param { number } opacity
283
- */
284
- setOpacity(opacity) {
285
- opacityCheck(opacity);
286
- this._opacity = opacity;
287
- this.paddingTextPlugin?.setOpacity(opacity);
288
- this._textWritersMap.forEach((writer) => writer.setOpacity(opacity));
289
- this.globe.DrawRender();
290
- }
291
-
292
-
293
- /**
294
- * @method setOneDegreePaddingOn // performance consuming, might be removed
295
- */
296
- setOneDegreePaddingOn(isOneDegreePaddingOn) {
297
- if (typeof isOneDegreePaddingOn !== "boolean") throw new Error("Invalid value for one degree padding");
298
- if (this._oneDegreePadding === isOneDegreePaddingOn) return;
299
- this._oneDegreePadding = isOneDegreePaddingOn;
300
- this.globe.DrawRender();
301
- }
302
-
303
-
304
- setZAlphaOnDegreePadding(zAlphaOnDegreePadding) {
305
- if (zAlphaOnDegreePadding !== 0 && zAlphaOnDegreePadding !== 1) throw new Error("Invalid value for zAlphaOnDegreePadding");
306
- if (this._zAlphaOnDegreePadding === zAlphaOnDegreePadding) return;
307
- this._zAlphaOnDegreePadding = zAlphaOnDegreePadding;
308
- this.globe.DrawRender();
309
- }
310
-
311
-
312
- // PRIVATE METHODS
313
-
314
- _initPrograms() {
315
- const { globe } = this;
316
- this._circleProgram2D = CircleCache2D.get(globe);
317
- this._circleProgram3D = CircleCache3D.get(globe);
318
- this._padding2dProgram = LinesColorInstancedFlatCache.get(globe);
319
- this._padding3dProgram = CirclePadding3DCache.get(globe);
320
- this._lineOnGlobe_bigPadding = LineOnGlobeCache.get(globe);
321
-
322
- }
323
-
324
-
325
- _initBufferManagers() {
326
- const { gl } = this;
327
-
328
- const initialCapacity = 10;
329
- const bufferType = "DYNAMIC_DRAW";
330
- // circle2d, circle3d, 1 degree paddings,
331
- this.bufferOrchestrator = new BufferOrchestrator({ capacity: initialCapacity });
332
-
333
- this.bufferManagersCompMap = new Map(
334
- [
335
- // circle 3D
336
- ["centerCoords3d", {
337
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
338
- 'adaptor': (item) => new Float32Array(item.centerCoords3d),
339
- }],
340
- ["targetCoords3d", {
341
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
342
- 'adaptor': (item) => new Float32Array(item.targetCoords3d),
343
- }],
344
-
345
- ["rgba", {
346
- 'bufferManager': new BufferManager(gl, 4, { bufferType, initialCapacity }),
347
- 'adaptor': (item) => new Float32Array(item.hide === ENUM_HIDE.HIDE ? [0, 0, 0, 0] : item.rgba)
348
- }],
349
- ["radius3d", {
350
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
351
- 'adaptor': (item) => new Float32Array([item.radius])
352
- }],
353
- ["radius3dsmall", {
354
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
355
- 'adaptor': (item) => {
356
- if (item.hide === ENUM_HIDE.HIDE_1_DEGREE_PADDINGS) return new Float32Array([item.radius]);
357
- return new Float32Array([item.radius - item.padding / 3])
358
- }
359
- }],
360
- ["circleDashAngle", {
361
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
362
- 'adaptor': (item) => new Float32Array([1]),
363
- }],
364
- ["dashOpacity", {
365
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
366
- 'adaptor': (item) => new Float32Array([1]),
367
- }],
368
-
369
- // circle 2D
370
- ["centerCoords2dflatForPadding", {
371
- 'bufferManager': new BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT * 2, { bufferType, initialCapacity }),
372
- 'adaptor': (item) => item.centerCoords2dflatForPadding,
373
- }],
374
- ["centerCoords2dflat", {
375
- 'bufferManager': new BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT * 2, { bufferType, initialCapacity }),
376
- 'adaptor': (item) => item.centerCoords2dflat,
377
- }],
378
- ["rgbaMercator", {
379
- 'bufferManager': new BufferManager(gl, 4 * CIRCLE_FLAT_EDGE_COUNT, { bufferType, initialCapacity }),
380
- 'adaptor': (item) => populateFloat32Array.fillWithListData(CIRCLE_FLAT_EDGE_COUNT, item.hide === ENUM_HIDE.HIDE ? [0, 0, 0, 0] : item.rgba),
381
- }],
382
- ["circleDashAngleMercator", {
383
- 'bufferManager': new BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT, { bufferType, initialCapacity }),
384
- 'adaptor': (item) => populateFloat32Array.fillFloat32Array(CIRCLE_FLAT_EDGE_COUNT, 1),
385
- }],
386
- ["dashOpacityMercator", {
387
- 'bufferManager': new BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT, { bufferType, initialCapacity }),
388
- 'adaptor': (item) => populateFloat32Array.fillFloat32Array(CIRCLE_FLAT_EDGE_COUNT, 1),
389
- }],
390
- ]
391
- );
392
-
393
- const obj = function (bufferManagerComp, divisor = 1) {
394
- if (bufferManagerComp === null) return null;
395
- return { 'buffer': bufferManagerComp.bufferManager.buffer, 'stride': 0, 'offset': 0, divisor }
396
-
397
- };
398
- this._circle2DVao = this._circleProgram2D.createVAO(
399
- ...["centerCoords2dflat", "rgbaMercator", "circleDashAngleMercator", "dashOpacityMercator"].map(key => obj(this.bufferManagersCompMap.get(key)))
400
- );
401
-
402
- this._circle3DVao = this._circleProgram3D.createVAO(
403
- ...["centerCoords3d", "targetCoords3d", "rgba", "circleDashAngle", "dashOpacity"].map(key => obj(this.bufferManagersCompMap.get(key)))
404
- );
405
-
406
- this._oneDegree2DPaddingVao = this._padding2dProgram.createVAO(
407
- { buffer: this.bufferManagersCompMap.get("centerCoords2dflat").bufferManager.buffer, size: 2, stride: 0, offset: 0 },
408
- { buffer: this.bufferManagersCompMap.get("centerCoords2dflatForPadding").bufferManager.buffer, size: 2, stride: 0, offset: 0 },
409
- { buffer: this.bufferManagersCompMap.get("rgbaMercator").bufferManager.buffer, size: 4, stride: 0, offset: 0 },
410
- );
411
-
412
- // PADDING
413
- // this one needs glue to assosiate rings and their big paddings since the count for center is not fixed
414
- this.paddingBufferOrchestrator = new BufferOrchestrator({ capacity: initialCapacity });
415
- this.bufferManagersCompMapPadding = new Map(
416
- [
417
- ["circlePoint2d", {
418
- 'bufferManager': new BufferManager(gl, 2, { bufferType, initialCapacity }),
419
- 'adaptor': (item) => item.circlePoint2d,
420
- }],
421
- ["paddingPoint2d", {
422
- 'bufferManager': new BufferManager(gl, 2, { bufferType, initialCapacity }),
423
- 'adaptor': (item) => item.paddingPoint2d,
424
- }],
425
- ["circlePoint3d", {
426
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
427
- 'adaptor': (item) => item.circlePoint3d
428
- }],
429
- ["paddingPoint3d", {
430
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
431
- 'adaptor': (item) => item.paddingPoint3d
432
- }],
433
- ["rgba", {
434
- 'bufferManager': new BufferManager(gl, 4, { bufferType, initialCapacity }),
435
- 'adaptor': (item) => new Float32Array(item.rgba)
436
- }],
437
-
438
- // ["dashOpacity", {
439
- // 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
440
- // 'adaptor': (item) => new Float32Array([1]),
441
- // }],
442
- // ["dashRatio", {
443
- // 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
444
- // 'adaptor': (item) => new Float32Array([1]),
445
- // }],
446
- ]
447
- );
448
-
449
- this._bigPadding3dFlatVAO = this._lineOnGlobe_bigPadding.createVAO(//"dashRatio", "dashOpacity"
450
- ...["circlePoint2d", "circlePoint3d", "paddingPoint2d", "paddingPoint3d", null, null, "rgba",].map(key =>
451
- (key === null) ? null : obj(this.bufferManagersCompMapPadding.get(key)))
452
- );
453
-
454
- this._padding3dOneDegreeVao = this._padding3dProgram.createVAO(
455
- ...["centerCoords3d", "radius3d", "radius3dsmall", "rgba"].map(key => obj(this.bufferManagersCompMap.get(key)))
456
- );
457
-
458
-
459
-
460
- }
461
-
462
- // IMPLICIT METHODS
463
-
464
- __reconstructCentralRingsBigPaddings(centerID) {
465
- const { globe } = this;
466
- const centerItem = this._ringAccount.getCenter(centerID);
467
- if (centerItem === undefined) throw new Error("Center not found");
468
- const { long, lat, stepAngle, rgba, rings, hide = 0, textHide = 0, altitude: centerAltitude = 0 } = centerItem;
469
- const result = [];
470
- const color = hide === 1 ? new Float32Array([0, 0, 0, 0]) : new Float32Array(rgba)
471
- for (const { ringID, radius, padding, altitude = centerAltitude } of rings) {
472
- let azimuthAngle = 0;
473
- while (azimuthAngle < 360) {
474
- const circlePoint = globe.Math.FindPointByPolar(long, lat, radius, azimuthAngle); // long lat
475
- const paddingPoint = globe.Math.FindPointByPolar(long, lat, radius - padding, azimuthAngle); // long lat
476
- result.push({
477
- key: ringBigPaddingKeyMethod(centerID, ringID, azimuthAngle),
478
- circlePoint2d: new Float32Array(globe.api_GetMercator2DPoint(circlePoint.long, circlePoint.lat)),
479
- paddingPoint2d: new Float32Array(globe.api_GetMercator2DPoint(paddingPoint.long, paddingPoint.lat)),
480
- circlePoint3d: coordOnSphere(circlePoint.long, circlePoint.lat, globe, altitude / 1000),
481
- paddingPoint3d: coordOnSphere(paddingPoint.long, paddingPoint.lat, globe, altitude / 1000),
482
- rgba: color,
483
- hide,
484
- textHide
485
- });
486
- azimuthAngle += stepAngle;
487
-
488
- }
489
- }
490
- return result;
491
- }
492
-
493
-
494
- __reconstructCentralRings(centerID) {
495
- const { globe } = this;
496
- const centerItem = this._ringAccount.getCenter(centerID);
497
- if (centerItem === undefined) throw new Error("Center not found");
498
-
499
- const { long, lat, rgba, rings, hide = 0, textHide = 0, altitude: centralAltitude = 0 } = centerItem;
500
- const centerCoords3d = coordOnSphere(long, lat, globe, centralAltitude / 1000);
501
-
502
- const result = [];
503
-
504
- for (const { ringID, radius, padding, __identity__, altitude = centralAltitude } of rings) {
505
- const key = __identity__;
506
-
507
- const centerCoords2dflat = centerCoords2dflatDataCreatorWithRadius(globe, long, lat, radius, { edgeCount: CIRCLE_FLAT_EDGE_COUNT });
508
- const radiusPadding = hide === ENUM_HIDE.HIDE_1_DEGREE_PADDINGS ? radius : radius - padding / 3;
509
- const targetPoint = globe.Math.FindPointByPolar(long, lat, radius, 0); // long lat
510
- const targetCoords3d = coordOnSphere(targetPoint.long, targetPoint.lat, globe, altitude / 1000);
511
- const centerCoords2dflatForPadding = centerCoords2dflatDataCreatorWithRadius(globe, long, lat, radiusPadding, { edgeCount: CIRCLE_FLAT_EDGE_COUNT });
512
- result.push({
513
- key,
514
- centerCoords3d,
515
- targetCoords3d,
516
- centerCoords2dflat,
517
- radius,
518
- padding,
519
- rgba,
520
- centerCoords2dflatForPadding,
521
- hide,
522
- textHide
523
- });
524
- }
525
- return result;
526
-
527
- }
528
-
529
- __reconstructCentralPaddingProperties(centerID) {
530
- const centerItem = this._ringAccount.getCenter(centerID);
531
- if (centerItem === undefined) throw new Error("Center not found");
532
- const { stepAngle, rgba, rings, hide = 0, textHide = 0 } = centerItem;
533
- const result = [];
534
- for (const { ringID, } of rings) {
535
- let angle = 0;
536
- while (angle < 360) {
537
- result.push({
538
- key: ringBigPaddingKeyMethod(centerID, ringID, angle),
539
- rgba: hide === 1 ? new Float32Array([0, 0, 0, 0]) : rgba,
540
- textHide
541
- });
542
- angle += stepAngle;
543
- }
544
- }
545
- return result;
546
- }
547
-
548
- __reconstructCentralProperties(centerID) {
549
- const centerItem = this._ringAccount.getCenter(centerID);
550
- if (centerItem === undefined) throw new Error("Center not found");
551
- const { rgba, rings, hide = 0, textHide = 0 } = centerItem;
552
- const result = [];
553
- for (const { ringID, __identity__ } of rings) {
554
- const key = __identity__;
555
- result.push({
556
- key,
557
- rgba: hide === ENUM_HIDE.HIDE ? new Float32Array([0, 0, 0, 0]) : rgba,
558
- textHide
559
- });
560
- }
561
- return result;
562
- }
563
-
564
-
565
-
566
- // GLOBE API
567
-
568
-
569
- init(globe, gl) {
570
- this.globe = globe;
571
- this.gl = gl;
572
- this._initPrograms();
573
- this._initBufferManagers();
574
- if (this._showNumbers) {
575
- this.paddingTextPlugin = new RangeRingAngleText(globe, this.id + "text", { style: this._numbersStyle, opacity: this._opacity });
576
- delete this._numbersStyle;
577
- }
578
- }
579
-
580
-
581
-
582
- draw3D() {
583
- const {
584
- globe, gl,
585
- _circleProgram2D, _circleProgram3D, _padding2dProgram, _padding3dProgram, _lineOnGlobe_bigPadding,
586
- _circle2DVao, _circle3DVao, _oneDegree2DPaddingVao, _padding3dOneDegreeVao, _bigPadding3dFlatVAO,
587
- bufferOrchestrator, paddingBufferOrchestrator,
588
- _opacity, _oneDegreePadding, _zAlphaOnDegreePadding } = this;
589
- gl.disable(gl.DEPTH_TEST);
590
- const is3D = globe.api_GetCurrentGeometry() === 0;
591
- // const lod = globe.api_GetCurrentLOD();
592
- if (is3D) {
593
- _circleProgram3D.draw(_circle3DVao, bufferOrchestrator.length, _opacity);
594
- if (_oneDegreePadding) _padding3dProgram.draw(_padding3dOneDegreeVao, bufferOrchestrator.length, 360, 1, _opacity, _zAlphaOnDegreePadding);
595
- } else {
596
- _circleProgram2D.draw(_circle2DVao, bufferOrchestrator.length, CIRCLE_FLAT_EDGE_COUNT, _opacity);
597
- // _padding2dProgram.draw(bigPaddingVAO, paddingBufferOrchestrator.length, _opacity);
598
- if (_oneDegreePadding) _padding2dProgram.draw(_oneDegree2DPaddingVao, bufferOrchestrator.length * CIRCLE_FLAT_EDGE_COUNT, _opacity, _zAlphaOnDegreePadding);
599
- }
600
- const drawOptions = { drawRange: { first: 0, count: paddingBufferOrchestrator.length } };
601
- _lineOnGlobe_bigPadding.draw(_bigPadding3dFlatVAO, drawOptions, _opacity);
602
- this._textWritersMap.forEach((textWriter) => textWriter.draw());
603
- gl.enable(gl.DEPTH_TEST);
604
- }
605
-
606
- free() {
607
- if (this._isFreed) return;
608
- const { globe } = this;
609
- this.bufferManagersCompMap.forEach(({ bufferManager }) => bufferManager.free());
610
- this.bufferManagersCompMapPadding.forEach(({ bufferManager }) => bufferManager.free());
611
- // delete vaos
612
- this.gl.deleteVertexArray(this._circle2DVao);
613
- this.gl.deleteVertexArray(this._circle3DVao);
614
- this.gl.deleteVertexArray(this._oneDegree2DPaddingVao);
615
- this.gl.deleteVertexArray(this._padding3dOneDegreeVao);
616
- this.gl.deleteVertexArray(this._bigPadding3dFlatVAO);
617
- // delete programs
618
- CircleCache2D.release(globe);
619
- CircleCache3D.release(globe);
620
- LinesColorInstancedFlatCache.release(globe);
621
- CirclePadding3DCache.release(globe);
622
- LineOnGlobeCache.release(globe);
623
- this._circleProgram2D = null;
624
- this._circleProgram3D = null;
625
- this._padding2dProgram = null;
626
- this._padding3dProgram = null;
627
- this._lineOnGlobe_bigPadding = null;
628
- this.paddingTextPlugin?.free();
629
- this._isFreed = true;
630
- }
631
-
632
-
633
- __contextTextWriterUpdate(centerIDs, textWriterIDs = null) {
634
- let textWriters = null;
635
- if (textWriterIDs === null) {
636
- textWriters = Array.from(this._textWritersMap.values());
637
- } else if (textWriterIDs.length === 0) {
638
- return
639
- } else {
640
- textWriters = textWriterGetOrThrow(this._textWritersMap, textWriterIDs);
641
- }
642
- centerIDs.forEach((centerID) => { this._ringAccount.textUpdate(centerID, textWriters, this._textDataPreAdaptor); });
643
- }
644
- }
645
-
646
-
647
- const textWriterGetOrThrow = mapGetOrThrow("textWriterIDs is invalid")
648
-
649
- export { RangeRings, Z_ALPHA_MODE };
1
+ "use strict";
2
+ /**
3
+ * @typedef RangeRingData
4
+ * @property {number} centerX
5
+ * @property {number} centerY
6
+ * @property {Array<Ring>} rings
7
+ *
8
+ * @typedef Ring
9
+ * @property {number} radius
10
+ * @property {number} padding
11
+ * @property {[number, number, number]} color
12
+ *
13
+ *
14
+ * @method insertBulk
15
+ * @typedef {Array<{ringID, radius, padding}>} rings
16
+ * @param {Array<centerID:string, x:number, y:number, stepAngle:number, rgba:[4 numbers], rings:rings} items
17
+
18
+ * @method updateCentersCoordinate @param {Array<{centerID, long,lat}>} items
19
+ * @method updateCentersColor @param {Array<{centerID, rgba:[4 numbers]}>} centerColors
20
+ *
21
+ * @method updateCentersHide @param {Array<{centerID, hide, textHide}>} centerHides
22
+ * @method removeCenters @param {Array<{centerID}>} centerIds
23
+ * @method setOpacity @param {number} opacity
24
+ *
25
+ * @method setOneDegreePaddingOn // performance consuming, might be removed
26
+ *
27
+ */
28
+ var __importDefault = (this && this.__importDefault) || function (mod) {
29
+ return (mod && mod.__esModule) ? mod : { "default": mod };
30
+ };
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.Z_ALPHA_MODE = exports.RangeRings = void 0;
33
+ const circle_accurate_flat_1 = require("../programs/line-on-globe/circle-accurate-flat");
34
+ const circle_accurate_3d_1 = require("../programs/line-on-globe/circle-accurate-3d");
35
+ const lines_color_instanced_flat_1 = require("../programs/line-on-globe/lines-color-instanced-flat");
36
+ const account_1 = require("../util/account");
37
+ const get_1 = require("../util/check/get");
38
+ const data_filler_1 = require("../util/jshelpers/data-filler");
39
+ const ring_account_1 = require("./ring-account");
40
+ const degree_padding_around_circle_3d_1 = require("../programs/line-on-globe/degree-padding-around-circle-3d");
41
+ const naive_accurate_flexible_1 = require("../programs/line-on-globe/naive-accurate-flexible");
42
+ const rangeringangletext_1 = __importDefault(require("./rangeringangletext"));
43
+ const util_1 = require("../programs/line-on-globe/util");
44
+ Object.defineProperty(exports, "Z_ALPHA_MODE", { enumerable: true, get: function () { return util_1.Z_ALPHA_MODE; } });
45
+ const enum_1 = require("./enum");
46
+ const typecheck_1 = require("../util/check/typecheck");
47
+ const geometry_1 = require("../util/geometry");
48
+ const CIRCLE_FLAT_EDGE_COUNT = 362; // 360 + 2 for closing the circle and a cutting point
49
+ const coordOnSphere = (long, lat, globe, altitude = 0) => {
50
+ const coord = globe.api_GetCartesian3DPoint(long, lat, 0, 0);
51
+ return (0, geometry_1.normalize)(coord, 6378.137 + altitude);
52
+ };
53
+ /**
54
+ *
55
+ *
56
+ * @typedef {string} centerID
57
+ *
58
+ * @typedef {Object} RangeRing
59
+ * @property {string} ringID
60
+ * @property {number} radius in range meters
61
+ * @property {number} padding badding range in meter
62
+ *
63
+ *
64
+ * Array < centerID: string, long: number, lat: number, stepAngle: number, rgba: [4 numbers], rings: rings, hide, textHide
65
+ * @typedef {Object} RangeRingsItem
66
+ * @property {centerID} centerID
67
+ * @property {number} long
68
+ * @property {number} lat
69
+ * @property {number} stepAngle
70
+ * @property {number} altitude
71
+ * @property {number} hide
72
+ * @property {number} textHide
73
+ * @property {number} rgba
74
+ * @property {Array<RangeRing>} rings
75
+ */
76
+ class RangeRings {
77
+ constructor(id, { oneDegreePadding = true, showNumbers = true, numbersStyle = null, opacity = 1, zAlphaOnDegreePadding = util_1.Z_ALPHA_MODE.ON } = {}, { textDataPreAdaptor = null, textWritersMap = new Map() } = {}) {
78
+ this.id = id;
79
+ this._oneDegreePadding = oneDegreePadding;
80
+ this._zAlphaOnDegreePadding = zAlphaOnDegreePadding;
81
+ this._showNumbers = showNumbers;
82
+ this._numbersStyle = numbersStyle;
83
+ this._opacity = opacity;
84
+ this._ringAccount = new ring_account_1.RingAccount();
85
+ this._textWritersMap = textWritersMap;
86
+ this._textDataPreAdaptor = textDataPreAdaptor;
87
+ this._textWritersMap.forEach((textWriter) => textWriter.setKeyAdaptor((item) => item.__identity__));
88
+ }
89
+ // USER API
90
+ /**
91
+ * @method updateCentersCoordinate @param { Array < { centerID, long,lat } >} items
92
+ */
93
+ updateCentersCoordinate(items, { textWriterIDs = [] } = {}) {
94
+ // Algorithm
95
+ /**
96
+ * 1. ask centerRingAccount for existing rings COORDINATE RELATED KEYS
97
+ * 2. update centers
98
+ * 3. update buffer orchestators
99
+ */
100
+ var _a;
101
+ this._ringAccount.updateCentersCoordinate(items);
102
+ const { globe, bufferOrchestrator, bufferManagersCompMap, paddingBufferOrchestrator, bufferManagersCompMapPadding } = this;
103
+ for (const { centerID } of items) {
104
+ const datas = this.__reconstructCentralRings(centerID);
105
+ bufferOrchestrator.updateBulk(datas, bufferManagersCompMap, ["centerCoords3d", "centerCoords2dflat", "targetCoords3d", "centerCoords2dflatForPadding"]);
106
+ const paddingDatas = this.__reconstructCentralRingsBigPaddings(centerID);
107
+ paddingBufferOrchestrator.updateBulk(paddingDatas, bufferManagersCompMapPadding, ["circlePoint2d", "paddingPoint2d", "circlePoint3d", "paddingPoint3d"]);
108
+ }
109
+ (_a = this.paddingTextPlugin) === null || _a === void 0 ? void 0 : _a.updateCentersXY(items);
110
+ this.__contextTextWriterUpdate(items.map(({ centerID }) => centerID), textWriterIDs);
111
+ globe.DrawRender();
112
+ }
113
+ /**
114
+ * @method insertBulk
115
+ * @param { Array < RangeRingsItem> } items
116
+ */
117
+ insertBulk(items, { textWriterIDs = [] } = {}) {
118
+ var _a;
119
+ // Algorithm
120
+ /**
121
+ * 1 ask centerRingAccount for existing rings
122
+ * 2. delete all existing keys with buffer orchestators
123
+ * 3. insert new centerRings to centerRingAccount
124
+ * 4. insert new keys with buffer orchestators
125
+ */
126
+ const { globe, _ringAccount, bufferOrchestrator, bufferManagersCompMap, paddingBufferOrchestrator, bufferManagersCompMapPadding } = this;
127
+ for (const item of items) {
128
+ const existingKeys = _ringAccount.ringKeys(item.centerID);
129
+ if (existingKeys.length) {
130
+ bufferOrchestrator.deleteBulk(existingKeys, bufferManagersCompMap);
131
+ }
132
+ const paddingKeys = _ringAccount.ringBigPaddingKeys(item.centerID);
133
+ if (paddingKeys.length) {
134
+ paddingBufferOrchestrator.deleteBulk(paddingKeys, bufferManagersCompMapPadding);
135
+ }
136
+ }
137
+ for (const item of items) {
138
+ _ringAccount.insertCenter(item);
139
+ const datas = this.__reconstructCentralRings(item.centerID);
140
+ bufferOrchestrator.insertBulk(datas, bufferManagersCompMap);
141
+ const paddingDatas = this.__reconstructCentralRingsBigPaddings(item.centerID);
142
+ paddingBufferOrchestrator.insertBulk(paddingDatas, bufferManagersCompMapPadding);
143
+ }
144
+ (_a = this.paddingTextPlugin) === null || _a === void 0 ? void 0 : _a.insertBulk(items);
145
+ this.__contextTextWriterUpdate(items.map(({ centerID }) => centerID), textWriterIDs);
146
+ globe.DrawRender();
147
+ }
148
+ /**
149
+ * @method updateCentersColor @param { Array < { centerID, rgba: [4 numbers] } >} centerColors
150
+ */
151
+ updateCentersColor(centerColors, { textWriterIDs = [] } = {}) {
152
+ // Algorithm
153
+ /**
154
+ * 1. ask centerRingAccount for existing rings COLOR KEYS
155
+ * 2. update centers
156
+ * 3. update buffer orchestators
157
+ */
158
+ this._ringAccount.updateCentersColor(centerColors);
159
+ const { globe, bufferOrchestrator, bufferManagersCompMap, paddingBufferOrchestrator, bufferManagersCompMapPadding } = this;
160
+ for (const { centerID } of centerColors) {
161
+ const datas = this.__reconstructCentralProperties(centerID);
162
+ bufferOrchestrator.updateBulk(datas, bufferManagersCompMap, ["rgba", "rgbaMercator"]);
163
+ const paddingDatas = this.__reconstructCentralPaddingProperties(centerID);
164
+ paddingBufferOrchestrator.updateBulk(paddingDatas, bufferManagersCompMapPadding, ["rgba"]);
165
+ }
166
+ this.__contextTextWriterUpdate(centerColors.map(({ centerID }) => centerID), textWriterIDs);
167
+ globe.DrawRender();
168
+ }
169
+ /**
170
+ *
171
+ * @method updateCentersHide @param { Array < { centerID, hide, textHide } >} centerHides
172
+ */
173
+ updateCentersHide(centerHides, { textWriterIDs = [] } = {}) {
174
+ var _a;
175
+ // Algorithm
176
+ /**
177
+ * Simple
178
+ * 1. update centers
179
+ * 2. reconstruct data,
180
+ * 3. update color buffer
181
+ * */
182
+ this._ringAccount.updateCentersHide(centerHides);
183
+ const { globe, bufferOrchestrator, bufferManagersCompMap, paddingBufferOrchestrator, bufferManagersCompMapPadding } = this;
184
+ for (const { centerID } of centerHides) {
185
+ const datas = this.__reconstructCentralProperties(centerID);
186
+ bufferOrchestrator.updateBulk(datas, bufferManagersCompMap, ["rgba", "rgbaMercator"]);
187
+ const paddingDatas0 = this.__reconstructCentralRings(centerID);
188
+ bufferOrchestrator.updateBulk(paddingDatas0, bufferManagersCompMap, ["radius3dsmall", "centerCoords2dflatForPadding"]);
189
+ const paddingDatas = this.__reconstructCentralPaddingProperties(centerID);
190
+ paddingBufferOrchestrator.updateBulk(paddingDatas, bufferManagersCompMapPadding, ["rgba"]);
191
+ }
192
+ (_a = this.paddingTextPlugin) === null || _a === void 0 ? void 0 : _a.updateCentersHide(centerHides);
193
+ this.__contextTextWriterUpdate(centerHides.map(({ centerID }) => centerID), textWriterIDs);
194
+ globe.DrawRender();
195
+ /**
196
+ * Complicated
197
+ * 1. ask centerRingAccount for existing rings HIDE KEYS
198
+ * 2. delete from buffer orchestators
199
+ * 3. mark centers as hidden
200
+ */
201
+ }
202
+ /**
203
+ * @param {Array<string>} textWriterIDs textWritersMap keys to be used for writing text.
204
+ * @param {Array<string>} itemKeys if empty, all texts will be updated. Use {@link ringKeyMethod} method to get keys
205
+ */
206
+ updateText(textWriterIDs = [], itemKeys = null) {
207
+ const textWritersMap = textWriterGetOrThrow(this._textWritersMap, textWriterIDs);
208
+ if (itemKeys === null) {
209
+ this._ringAccount.updateAllText(textWritersMap, this._textDataPreAdaptor);
210
+ this.globe.DrawRender();
211
+ }
212
+ else {
213
+ itemKeys.forEach((key) => {
214
+ const item = this._ringAccount.getCenter(key);
215
+ if (item === undefined)
216
+ throw new Error("Center not found");
217
+ const textData = this._textDataPreAdaptor(item);
218
+ textWritersMap.forEach((textWriter) => textWriter.insertText(textData));
219
+ });
220
+ }
221
+ this.globe.DrawRender();
222
+ }
223
+ /**
224
+ * @method removeCenters @param { Array < { centerID } >} centerIDs
225
+ */
226
+ removeCenters(centerIDs) {
227
+ var _a;
228
+ const { globe, bufferOrchestrator, bufferManagersCompMap, paddingBufferOrchestrator, bufferManagersCompMapPadding, _ringAccount } = this;
229
+ for (const centerID of centerIDs) {
230
+ const existingKeys = _ringAccount.ringKeys(centerID);
231
+ if (existingKeys.length) {
232
+ bufferOrchestrator.deleteBulk(existingKeys, bufferManagersCompMap);
233
+ this._textWritersMap.forEach((textWriter) => textWriter.deleteTextBulk(existingKeys));
234
+ }
235
+ }
236
+ for (const centerID of centerIDs) {
237
+ const paddingKeys = _ringAccount.ringBigPaddingKeys(centerID);
238
+ if (paddingKeys.length) {
239
+ paddingBufferOrchestrator.deleteBulk(paddingKeys, bufferManagersCompMapPadding);
240
+ }
241
+ }
242
+ (_a = this.paddingTextPlugin) === null || _a === void 0 ? void 0 : _a.removeCenters(centerIDs);
243
+ this._ringAccount.removeCenters(centerIDs);
244
+ globe.DrawRender();
245
+ }
246
+ /**
247
+ * @method setOpacity @param { number } opacity
248
+ */
249
+ setOpacity(opacity) {
250
+ var _a;
251
+ (0, typecheck_1.opacityCheck)(opacity);
252
+ this._opacity = opacity;
253
+ (_a = this.paddingTextPlugin) === null || _a === void 0 ? void 0 : _a.setOpacity(opacity);
254
+ this._textWritersMap.forEach((writer) => writer.setOpacity(opacity));
255
+ this.globe.DrawRender();
256
+ }
257
+ /**
258
+ * @method setOneDegreePaddingOn // performance consuming, might be removed
259
+ */
260
+ setOneDegreePaddingOn(isOneDegreePaddingOn) {
261
+ if (typeof isOneDegreePaddingOn !== "boolean")
262
+ throw new Error("Invalid value for one degree padding");
263
+ if (this._oneDegreePadding === isOneDegreePaddingOn)
264
+ return;
265
+ this._oneDegreePadding = isOneDegreePaddingOn;
266
+ this.globe.DrawRender();
267
+ }
268
+ setZAlphaOnDegreePadding(zAlphaOnDegreePadding) {
269
+ if (zAlphaOnDegreePadding !== 0 && zAlphaOnDegreePadding !== 1)
270
+ throw new Error("Invalid value for zAlphaOnDegreePadding");
271
+ if (this._zAlphaOnDegreePadding === zAlphaOnDegreePadding)
272
+ return;
273
+ this._zAlphaOnDegreePadding = zAlphaOnDegreePadding;
274
+ this.globe.DrawRender();
275
+ }
276
+ // PRIVATE METHODS
277
+ _initPrograms() {
278
+ const { globe } = this;
279
+ this._circleProgram2D = circle_accurate_flat_1.CircleCache.get(globe);
280
+ this._circleProgram3D = circle_accurate_3d_1.CircleCache.get(globe);
281
+ this._padding2dProgram = lines_color_instanced_flat_1.LinesColorInstancedFlatCache.get(globe);
282
+ this._padding3dProgram = degree_padding_around_circle_3d_1.CirclePadding3DCache.get(globe);
283
+ this._lineOnGlobe_bigPadding = naive_accurate_flexible_1.LineOnGlobeCache.get(globe);
284
+ }
285
+ _initBufferManagers() {
286
+ const { gl } = this;
287
+ const initialCapacity = 10;
288
+ const bufferType = "DYNAMIC_DRAW";
289
+ // circle2d, circle3d, 1 degree paddings,
290
+ this.bufferOrchestrator = new account_1.BufferOrchestrator({ capacity: initialCapacity });
291
+ this.bufferManagersCompMap = new Map([
292
+ // circle 3D
293
+ ["centerCoords3d", {
294
+ 'bufferManager': new account_1.BufferManager(gl, 3, { bufferType, initialCapacity }),
295
+ 'adaptor': (item) => new Float32Array(item.centerCoords3d),
296
+ }],
297
+ ["targetCoords3d", {
298
+ 'bufferManager': new account_1.BufferManager(gl, 3, { bufferType, initialCapacity }),
299
+ 'adaptor': (item) => new Float32Array(item.targetCoords3d),
300
+ }],
301
+ ["rgba", {
302
+ 'bufferManager': new account_1.BufferManager(gl, 4, { bufferType, initialCapacity }),
303
+ 'adaptor': (item) => new Float32Array(item.hide === enum_1.ENUM_HIDE.HIDE ? [0, 0, 0, 0] : item.rgba)
304
+ }],
305
+ ["radius3d", {
306
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
307
+ 'adaptor': (item) => new Float32Array([item.radius])
308
+ }],
309
+ ["radius3dsmall", {
310
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
311
+ 'adaptor': (item) => {
312
+ if (item.hide === enum_1.ENUM_HIDE.HIDE_1_DEGREE_PADDINGS)
313
+ return new Float32Array([item.radius]);
314
+ return new Float32Array([item.radius - item.padding / 3]);
315
+ }
316
+ }],
317
+ ["circleDashAngle", {
318
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
319
+ 'adaptor': (item) => new Float32Array([1]),
320
+ }],
321
+ ["dashOpacity", {
322
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
323
+ 'adaptor': (item) => new Float32Array([1]),
324
+ }],
325
+ // circle 2D
326
+ ["centerCoords2dflatForPadding", {
327
+ 'bufferManager': new account_1.BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT * 2, { bufferType, initialCapacity }),
328
+ 'adaptor': (item) => item.centerCoords2dflatForPadding,
329
+ }],
330
+ ["centerCoords2dflat", {
331
+ 'bufferManager': new account_1.BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT * 2, { bufferType, initialCapacity }),
332
+ 'adaptor': (item) => item.centerCoords2dflat,
333
+ }],
334
+ ["rgbaMercator", {
335
+ 'bufferManager': new account_1.BufferManager(gl, 4 * CIRCLE_FLAT_EDGE_COUNT, { bufferType, initialCapacity }),
336
+ 'adaptor': (item) => data_filler_1.populateFloat32Array.fillWithListData(CIRCLE_FLAT_EDGE_COUNT, item.hide === enum_1.ENUM_HIDE.HIDE ? [0, 0, 0, 0] : item.rgba),
337
+ }],
338
+ ["circleDashAngleMercator", {
339
+ 'bufferManager': new account_1.BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT, { bufferType, initialCapacity }),
340
+ 'adaptor': (item) => data_filler_1.populateFloat32Array.fillFloat32Array(CIRCLE_FLAT_EDGE_COUNT, 1),
341
+ }],
342
+ ["dashOpacityMercator", {
343
+ 'bufferManager': new account_1.BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT, { bufferType, initialCapacity }),
344
+ 'adaptor': (item) => data_filler_1.populateFloat32Array.fillFloat32Array(CIRCLE_FLAT_EDGE_COUNT, 1),
345
+ }],
346
+ ]);
347
+ const obj = function (bufferManagerComp, divisor = 1) {
348
+ if (bufferManagerComp === null)
349
+ return null;
350
+ return { 'buffer': bufferManagerComp.bufferManager.buffer, 'stride': 0, 'offset': 0, divisor };
351
+ };
352
+ this._circle2DVao = this._circleProgram2D.createVAO(...["centerCoords2dflat", "rgbaMercator", "circleDashAngleMercator", "dashOpacityMercator"].map(key => obj(this.bufferManagersCompMap.get(key))));
353
+ this._circle3DVao = this._circleProgram3D.createVAO(...["centerCoords3d", "targetCoords3d", "rgba", "circleDashAngle", "dashOpacity"].map(key => obj(this.bufferManagersCompMap.get(key))));
354
+ this._oneDegree2DPaddingVao = this._padding2dProgram.createVAO({ buffer: this.bufferManagersCompMap.get("centerCoords2dflat").bufferManager.buffer, size: 2, stride: 0, offset: 0 }, { buffer: this.bufferManagersCompMap.get("centerCoords2dflatForPadding").bufferManager.buffer, size: 2, stride: 0, offset: 0 }, { buffer: this.bufferManagersCompMap.get("rgbaMercator").bufferManager.buffer, size: 4, stride: 0, offset: 0 });
355
+ // PADDING
356
+ // this one needs glue to assosiate rings and their big paddings since the count for center is not fixed
357
+ this.paddingBufferOrchestrator = new account_1.BufferOrchestrator({ capacity: initialCapacity });
358
+ this.bufferManagersCompMapPadding = new Map([
359
+ ["circlePoint2d", {
360
+ 'bufferManager': new account_1.BufferManager(gl, 2, { bufferType, initialCapacity }),
361
+ 'adaptor': (item) => item.circlePoint2d,
362
+ }],
363
+ ["paddingPoint2d", {
364
+ 'bufferManager': new account_1.BufferManager(gl, 2, { bufferType, initialCapacity }),
365
+ 'adaptor': (item) => item.paddingPoint2d,
366
+ }],
367
+ ["circlePoint3d", {
368
+ 'bufferManager': new account_1.BufferManager(gl, 3, { bufferType, initialCapacity }),
369
+ 'adaptor': (item) => item.circlePoint3d
370
+ }],
371
+ ["paddingPoint3d", {
372
+ 'bufferManager': new account_1.BufferManager(gl, 3, { bufferType, initialCapacity }),
373
+ 'adaptor': (item) => item.paddingPoint3d
374
+ }],
375
+ ["rgba", {
376
+ 'bufferManager': new account_1.BufferManager(gl, 4, { bufferType, initialCapacity }),
377
+ 'adaptor': (item) => new Float32Array(item.rgba)
378
+ }],
379
+ // ["dashOpacity", {
380
+ // 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
381
+ // 'adaptor': (item) => new Float32Array([1]),
382
+ // }],
383
+ // ["dashRatio", {
384
+ // 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
385
+ // 'adaptor': (item) => new Float32Array([1]),
386
+ // }],
387
+ ]);
388
+ this._bigPadding3dFlatVAO = this._lineOnGlobe_bigPadding.createVAO(//"dashRatio", "dashOpacity"
389
+ ...["circlePoint2d", "circlePoint3d", "paddingPoint2d", "paddingPoint3d", null, null, "rgba",].map(key => (key === null) ? null : obj(this.bufferManagersCompMapPadding.get(key))));
390
+ this._padding3dOneDegreeVao = this._padding3dProgram.createVAO(...["centerCoords3d", "radius3d", "radius3dsmall", "rgba"].map(key => obj(this.bufferManagersCompMap.get(key))));
391
+ }
392
+ // IMPLICIT METHODS
393
+ __reconstructCentralRingsBigPaddings(centerID) {
394
+ const { globe } = this;
395
+ const centerItem = this._ringAccount.getCenter(centerID);
396
+ if (centerItem === undefined)
397
+ throw new Error("Center not found");
398
+ const { long, lat, stepAngle, rgba, rings, hide = 0, textHide = 0, altitude: centerAltitude = 0 } = centerItem;
399
+ const result = [];
400
+ const color = hide === 1 ? new Float32Array([0, 0, 0, 0]) : new Float32Array(rgba);
401
+ for (const { ringID, radius, padding, altitude = centerAltitude } of rings) {
402
+ let azimuthAngle = 0;
403
+ while (azimuthAngle < 360) {
404
+ const circlePoint = globe.Math.FindPointByPolar(long, lat, radius, azimuthAngle); // long lat
405
+ const paddingPoint = globe.Math.FindPointByPolar(long, lat, radius - padding, azimuthAngle); // long lat
406
+ result.push({
407
+ key: (0, ring_account_1.ringBigPaddingKeyMethod)(centerID, ringID, azimuthAngle),
408
+ circlePoint2d: new Float32Array(globe.api_GetMercator2DPoint(circlePoint.long, circlePoint.lat)),
409
+ paddingPoint2d: new Float32Array(globe.api_GetMercator2DPoint(paddingPoint.long, paddingPoint.lat)),
410
+ circlePoint3d: coordOnSphere(circlePoint.long, circlePoint.lat, globe, altitude / 1000),
411
+ paddingPoint3d: coordOnSphere(paddingPoint.long, paddingPoint.lat, globe, altitude / 1000),
412
+ rgba: color,
413
+ hide,
414
+ textHide
415
+ });
416
+ azimuthAngle += stepAngle;
417
+ }
418
+ }
419
+ return result;
420
+ }
421
+ __reconstructCentralRings(centerID) {
422
+ const { globe } = this;
423
+ const centerItem = this._ringAccount.getCenter(centerID);
424
+ if (centerItem === undefined)
425
+ throw new Error("Center not found");
426
+ const { long, lat, rgba, rings, hide = 0, textHide = 0, altitude: centralAltitude = 0 } = centerItem;
427
+ const centerCoords3d = coordOnSphere(long, lat, globe, centralAltitude / 1000);
428
+ const result = [];
429
+ for (const { ringID, radius, padding, __identity__, altitude = centralAltitude } of rings) {
430
+ const key = __identity__;
431
+ const centerCoords2dflat = (0, circle_accurate_flat_1.centerCoords2dflatDataCreatorWithRadius)(globe, long, lat, radius, { edgeCount: CIRCLE_FLAT_EDGE_COUNT });
432
+ const radiusPadding = hide === enum_1.ENUM_HIDE.HIDE_1_DEGREE_PADDINGS ? radius : radius - padding / 3;
433
+ const targetPoint = globe.Math.FindPointByPolar(long, lat, radius, 0); // long lat
434
+ const targetCoords3d = coordOnSphere(targetPoint.long, targetPoint.lat, globe, altitude / 1000);
435
+ const centerCoords2dflatForPadding = (0, circle_accurate_flat_1.centerCoords2dflatDataCreatorWithRadius)(globe, long, lat, radiusPadding, { edgeCount: CIRCLE_FLAT_EDGE_COUNT });
436
+ result.push({
437
+ key,
438
+ centerCoords3d,
439
+ targetCoords3d,
440
+ centerCoords2dflat,
441
+ radius,
442
+ padding,
443
+ rgba,
444
+ centerCoords2dflatForPadding,
445
+ hide,
446
+ textHide
447
+ });
448
+ }
449
+ return result;
450
+ }
451
+ __reconstructCentralPaddingProperties(centerID) {
452
+ const centerItem = this._ringAccount.getCenter(centerID);
453
+ if (centerItem === undefined)
454
+ throw new Error("Center not found");
455
+ const { stepAngle, rgba, rings, hide = 0, textHide = 0 } = centerItem;
456
+ const result = [];
457
+ for (const { ringID, } of rings) {
458
+ let angle = 0;
459
+ while (angle < 360) {
460
+ result.push({
461
+ key: (0, ring_account_1.ringBigPaddingKeyMethod)(centerID, ringID, angle),
462
+ rgba: hide === 1 ? new Float32Array([0, 0, 0, 0]) : rgba,
463
+ textHide
464
+ });
465
+ angle += stepAngle;
466
+ }
467
+ }
468
+ return result;
469
+ }
470
+ __reconstructCentralProperties(centerID) {
471
+ const centerItem = this._ringAccount.getCenter(centerID);
472
+ if (centerItem === undefined)
473
+ throw new Error("Center not found");
474
+ const { rgba, rings, hide = 0, textHide = 0 } = centerItem;
475
+ const result = [];
476
+ for (const { ringID, __identity__ } of rings) {
477
+ const key = __identity__;
478
+ result.push({
479
+ key,
480
+ rgba: hide === enum_1.ENUM_HIDE.HIDE ? new Float32Array([0, 0, 0, 0]) : rgba,
481
+ textHide
482
+ });
483
+ }
484
+ return result;
485
+ }
486
+ // GLOBE API
487
+ init(globe, gl) {
488
+ this.globe = globe;
489
+ this.gl = gl;
490
+ this._initPrograms();
491
+ this._initBufferManagers();
492
+ if (this._showNumbers) {
493
+ this.paddingTextPlugin = new rangeringangletext_1.default(globe, this.id + "text", { style: this._numbersStyle, opacity: this._opacity });
494
+ delete this._numbersStyle;
495
+ }
496
+ }
497
+ draw3D() {
498
+ const { globe, gl, _circleProgram2D, _circleProgram3D, _padding2dProgram, _padding3dProgram, _lineOnGlobe_bigPadding, _circle2DVao, _circle3DVao, _oneDegree2DPaddingVao, _padding3dOneDegreeVao, _bigPadding3dFlatVAO, bufferOrchestrator, paddingBufferOrchestrator, _opacity, _oneDegreePadding, _zAlphaOnDegreePadding } = this;
499
+ gl.disable(gl.DEPTH_TEST);
500
+ const is3D = globe.api_GetCurrentGeometry() === 0;
501
+ // const lod = globe.api_GetCurrentLOD();
502
+ if (is3D) {
503
+ _circleProgram3D.draw(_circle3DVao, bufferOrchestrator.length, _opacity);
504
+ if (_oneDegreePadding)
505
+ _padding3dProgram.draw(_padding3dOneDegreeVao, bufferOrchestrator.length, 360, 1, _opacity, _zAlphaOnDegreePadding);
506
+ }
507
+ else {
508
+ _circleProgram2D.draw(_circle2DVao, bufferOrchestrator.length, CIRCLE_FLAT_EDGE_COUNT, _opacity);
509
+ // _padding2dProgram.draw(bigPaddingVAO, paddingBufferOrchestrator.length, _opacity);
510
+ if (_oneDegreePadding)
511
+ _padding2dProgram.draw(_oneDegree2DPaddingVao, bufferOrchestrator.length * CIRCLE_FLAT_EDGE_COUNT, _opacity, _zAlphaOnDegreePadding);
512
+ }
513
+ const drawOptions = { drawRange: { first: 0, count: paddingBufferOrchestrator.length } };
514
+ _lineOnGlobe_bigPadding.draw(_bigPadding3dFlatVAO, drawOptions, _opacity);
515
+ this._textWritersMap.forEach((textWriter) => textWriter.draw());
516
+ gl.enable(gl.DEPTH_TEST);
517
+ }
518
+ free() {
519
+ var _a;
520
+ if (this._isFreed)
521
+ return;
522
+ const { globe } = this;
523
+ this.bufferManagersCompMap.forEach(({ bufferManager }) => bufferManager.free());
524
+ this.bufferManagersCompMapPadding.forEach(({ bufferManager }) => bufferManager.free());
525
+ // delete vaos
526
+ this.gl.deleteVertexArray(this._circle2DVao);
527
+ this.gl.deleteVertexArray(this._circle3DVao);
528
+ this.gl.deleteVertexArray(this._oneDegree2DPaddingVao);
529
+ this.gl.deleteVertexArray(this._padding3dOneDegreeVao);
530
+ this.gl.deleteVertexArray(this._bigPadding3dFlatVAO);
531
+ // delete programs
532
+ circle_accurate_flat_1.CircleCache.release(globe);
533
+ circle_accurate_3d_1.CircleCache.release(globe);
534
+ lines_color_instanced_flat_1.LinesColorInstancedFlatCache.release(globe);
535
+ degree_padding_around_circle_3d_1.CirclePadding3DCache.release(globe);
536
+ naive_accurate_flexible_1.LineOnGlobeCache.release(globe);
537
+ this._circleProgram2D = null;
538
+ this._circleProgram3D = null;
539
+ this._padding2dProgram = null;
540
+ this._padding3dProgram = null;
541
+ this._lineOnGlobe_bigPadding = null;
542
+ (_a = this.paddingTextPlugin) === null || _a === void 0 ? void 0 : _a.free();
543
+ this._isFreed = true;
544
+ }
545
+ __contextTextWriterUpdate(centerIDs, textWriterIDs = null) {
546
+ let textWriters = null;
547
+ if (textWriterIDs === null) {
548
+ textWriters = Array.from(this._textWritersMap.values());
549
+ }
550
+ else if (textWriterIDs.length === 0) {
551
+ return;
552
+ }
553
+ else {
554
+ textWriters = textWriterGetOrThrow(this._textWritersMap, textWriterIDs);
555
+ }
556
+ centerIDs.forEach((centerID) => { this._ringAccount.textUpdate(centerID, textWriters, this._textDataPreAdaptor); });
557
+ }
558
+ }
559
+ exports.RangeRings = RangeRings;
560
+ const textWriterGetOrThrow = (0, get_1.mapGetOrThrow)("textWriterIDs is invalid");