@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,420 +1,357 @@
1
- /**
2
- * ring data model
3
- * [centerX, centerY, range, padding, r, g, b, a, hide]
4
- *
5
- * Buffer is initialized with ring capacity and buffer is created with that capacity. It might be called buffer orphaning.
6
- *
7
- * */
8
-
9
-
10
- /**
11
- * TODO
12
- * delete registerCenter
13
- *
14
- *
15
- */
16
- const RING_SIZE = 9;
17
-
18
- export default class {
19
- /**
20
- * @param {WebGL2RenderingContext} gl
21
- * @param {Object} options
22
- * @param {Number} options.initialRingCapacity
23
- * @param {String} options.bufferType - "static" or "dynamic"
24
- * */
25
- constructor(gl, globe, { initialRingCapacity = 20, bufferType = "STATIC_DRAW", implicitExtentionRate = 1.2 } = {}) {
26
- this.gl = gl;
27
- this.globe = globe;
28
- this._capacity = initialRingCapacity;
29
- this._ringCounter = 0;
30
- this._length = 0;
31
-
32
- this._centerMap = new Map(); // key, new MAP(x,y, rings:[])
33
- this._ringOffsets = new Map();
34
- this._removedRingsOffsetStack = [];
35
-
36
- this._bufferType = gl[bufferType.toUpperCase()];
37
- this.implicitExtentionRate = implicitExtentionRate;
38
- this.buffer = gl.createBuffer();
39
-
40
- { // initilize data
41
- gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
42
- gl.bufferData(gl.ARRAY_BUFFER, initialRingCapacity * 4 * RING_SIZE, this._bufferType);
43
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
44
- }
45
-
46
- {
47
- this._circleVAO = gl.createVertexArray();
48
- gl.bindVertexArray(this._circleVAO);
49
- gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
50
- gl.enableVertexAttribArray(0);
51
- gl.vertexAttribPointer(0, 2, gl.FLOAT, false, RING_SIZE * 4, 0);
52
- gl.enableVertexAttribArray(1);
53
- gl.vertexAttribPointer(1, 1, gl.FLOAT, false, RING_SIZE * 4, 2 * 4);
54
- gl.enableVertexAttribArray(2);
55
- gl.vertexAttribPointer(2, 4, gl.FLOAT, false, RING_SIZE * 4, 4 * 4);
56
- gl.enableVertexAttribArray(3);
57
- gl.vertexAttribPointer(3, 3, gl.FLOAT, false, RING_SIZE * 4, 8 * 4);
58
-
59
- // set divisors to 1
60
- gl.vertexAttribDivisor(0, 1);
61
- gl.vertexAttribDivisor(1, 1);
62
- gl.vertexAttribDivisor(2, 1);
63
- gl.vertexAttribDivisor(3, 1);
64
- gl.bindVertexArray(null);
65
- }
66
-
67
- {
68
- this._paddingVAO = gl.createVertexArray();
69
- gl.bindVertexArray(this._paddingVAO);
70
- gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
71
- gl.enableVertexAttribArray(0);
72
- gl.vertexAttribPointer(0, 2, gl.FLOAT, false, RING_SIZE * 4, 0);
73
- gl.enableVertexAttribArray(1);
74
- gl.vertexAttribPointer(1, 1, gl.FLOAT, false, RING_SIZE * 4, 2 * 4);
75
- gl.enableVertexAttribArray(2);
76
- gl.vertexAttribPointer(2, 1, gl.FLOAT, false, RING_SIZE * 4, 3 * 4);
77
- gl.enableVertexAttribArray(3);
78
- gl.vertexAttribPointer(3, 4, gl.FLOAT, false, RING_SIZE * 4, 4 * 4);
79
- gl.enableVertexAttribArray(4);
80
- gl.vertexAttribPointer(4, 3, gl.FLOAT, false, RING_SIZE * 4, 8 * 4);
81
- gl.vertexAttribDivisor(0, 1);
82
- gl.vertexAttribDivisor(1, 1);
83
- gl.vertexAttribDivisor(2, 1);
84
- gl.vertexAttribDivisor(3, 1);
85
- gl.vertexAttribDivisor(4, 1);
86
- gl.bindVertexArray(null);
87
- }
88
- }
89
-
90
- /**
91
- * @param {String} centerID
92
- * @param {Object} options
93
- * @param {Number} options.x
94
- * @param {Number} options.y
95
- * */
96
- registerCenter(centerID, { x = 0, y = 0 } = {}) {
97
- this._centerMap.set(centerID, new Map(
98
- [
99
- ["x", x],
100
- ["y", y],
101
- ["rings", []] // ring keys
102
- ]
103
- ));
104
- }
105
-
106
- /**
107
- *
108
- * @param {null | number} newCapacity if null, vacuum defragmentation is applied -> capacity is set to the current ring count
109
- */
110
- defrag(newCapacity = null) {
111
- const { _removedRingsOffsetStack, _ringOffsets } = this;
112
- _removedRingsOffsetStack.sort();
113
- this._capacity = newCapacity || this._ringCounter;
114
- const arrayToLoad = new Float32Array(this._capacity * RING_SIZE);
115
- const bufferData = this._getBufferData();
116
- let arrayOffset = 0;
117
- const newRingOffsets = new Map();
118
- for (const [key, offset] of _ringOffsets) {
119
- const ringOffset = offset / 4
120
- const ringData = bufferData.slice(ringOffset, ringOffset + RING_SIZE);
121
- arrayToLoad.set(ringData, arrayOffset);
122
- newRingOffsets.set(key, arrayOffset * 4);
123
- arrayOffset += RING_SIZE;
124
- }
125
- const { gl, buffer } = this;
126
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
127
- gl.bufferData(gl.ARRAY_BUFFER, arrayToLoad, this._bufferType);
128
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
129
- this._ringOffsets = newRingOffsets;
130
- this._removedRingsOffsetStack = [];
131
- this._length = this._ringCounter;
132
- }
133
-
134
- extendBuffer(newCapacity) {
135
- if (this._capacity >= newCapacity) {
136
- console.warn("New capacity is smaller than the current capacity");
137
- return;
138
- }
139
- this._capacity = newCapacity;
140
- const { gl, buffer } = this;
141
- const bufferData = this._getBufferData();
142
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
143
- gl.bufferData(gl.ARRAY_BUFFER, newCapacity * RING_SIZE * 4, this._bufferType);
144
- gl.bufferSubData(gl.ARRAY_BUFFER, 0, bufferData);
145
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
146
- }
147
-
148
- checkCapacity(sizeLeft = 1) {
149
- return sizeLeft <= this._capacity - this._ringCounter;
150
- }
151
-
152
- capacityLeft() {
153
- return this._capacity - this._ringCounter;
154
- }
155
-
156
- get capacity() {
157
- return this._capacity;
158
- }
159
-
160
- get length() {
161
- return this._length;
162
- }
163
-
164
- get ringCount() {
165
- return this._ringCounter;
166
- }
167
-
168
-
169
-
170
-
171
- /**
172
- * @param {Array<string>} centerIDs
173
- * */
174
- removeCenters(centerIDs) {
175
- const { gl, buffer } = this;
176
- const zero = new Float32Array([0]);
177
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
178
- for (let centerID of centerIDs) {
179
- if (!this._centerMap.has(centerID)) {
180
- // console.warn("Center is not registered yet");
181
- // return;
182
- continue;
183
- }
184
- const center = this._centerMap.get(centerID);
185
- const rings = center.get("rings");
186
- for (let i = 0; i < rings.length; i++) {
187
- // set range to 0, 3rd index of float32array
188
- const offset = this._ringOffsets.get(rings[i]);
189
- gl.bufferSubData(gl.ARRAY_BUFFER, offset + 8, zero);
190
- this._removedRingsOffsetStack.push(offset);
191
- this._ringOffsets.delete(rings[i]);
192
- }
193
- this._ringCounter -= rings.length;
194
- this._centerMap.delete(centerID);
195
- }
196
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
197
- this.globe.DrawRender();
198
- }
199
-
200
-
201
- /**
202
- *
203
- * @property {String} centerID
204
- * @property {Number} x radians x
205
- * @property {Number} y radians y
206
- * @param {*} centerIDxyList
207
- */
208
- updateCentersXY(centerIDxyList) {
209
- const { gl, buffer } = this;
210
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
211
- for (let { centerID, x, y } of centerIDxyList) {
212
- const center = this._centerMap.get(centerID);
213
- center.set("x", x);
214
- center.set("y", y);
215
- const xyBlock = new Float32Array([x, y]);
216
- const rings = center.get("rings");
217
- for (let i = 0; i < rings.length; i++) {
218
- const offset = this._ringOffsets.get(rings[i]);
219
- gl.bufferSubData(gl.ARRAY_BUFFER, offset, xyBlock);
220
- }
221
- }
222
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
223
- this.globe.DrawRender();
224
- }
225
-
226
-
227
- updateCentersHide(data) {
228
- const { gl, buffer } = this;
229
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
230
- for (let { centerID, hide = null } of data) {
231
- if (hide === null) continue;
232
- const rings = this._centerMap.get(centerID).get("rings");
233
- for (let i = 0; i < rings.length; i++) {
234
- const offset = this._ringOffsets.get(rings[i]);
235
- gl.bufferSubData(gl.ARRAY_BUFFER, offset + 32, new Float32Array([hide]));
236
- }
237
- }
238
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
239
- this.globe.DrawRender();
240
- }
241
-
242
-
243
- insertBulk(rangeRingDatas) {
244
- const { gl, buffer } = this;
245
-
246
- {// remove existring centers
247
- const existingCenterIDs = [];
248
- for (let { centerID } of rangeRingDatas) {
249
- if (this._centerMap.has(centerID)) {
250
- existingCenterIDs.push(centerID);
251
- }
252
- }
253
- this.removeCenters(existingCenterIDs);
254
- }
255
-
256
- { // capacity check
257
- let incomingRingSize = 0;
258
- for (let { rings } of rangeRingDatas) {
259
- incomingRingSize += rings.length;
260
- // It should check if ring is already registered but for now it is not implemented.
261
- // Reasons: increase in complexity and performance
262
- }
263
- this._implicitExtendBufferInNeed(incomingRingSize);
264
- }
265
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
266
- for (const { centerID, x, y, rings, hide = 0 } of rangeRingDatas) {
267
- this.registerCenter(centerID, { x, y })
268
- for (const { ringID, radius, padding, rgba } of rings) {
269
- const key = this._ringKey(centerID, ringID);
270
- const bufferData = new Float32Array([x, y, radius, padding, ...rgba, hide]);
271
- const offset = this._nextBufferOffset();
272
- gl.bufferSubData(gl.ARRAY_BUFFER, offset, bufferData);
273
- this._ringOffsets.set(key, offset);
274
- this._centerMap.get(centerID).get("rings").push(key);
275
- }
276
- }
277
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
278
- this.globe.DrawRender();
279
- }
280
-
281
-
282
-
283
- /**
284
- *
285
- * @param {Array<{centerID, rgba}} centersColors
286
- */
287
- updateCentersColor(centersColors) {
288
- const { gl, buffer } = this;
289
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
290
- for (let { centerID, rgba } of centersColors) {
291
- if (!this._centerMap.has(centerID)) {
292
- console.warn("Center is not registered yet");
293
- continue;
294
- }
295
- const rings = this._centerMap.get(centerID).get("rings");
296
- const block = new Float32Array(rgba);
297
- for (let i = 0; i < rings.length; i++) {
298
- const offset = this._ringOffsets.get(rings[i]);
299
- gl.bufferSubData(gl.ARRAY_BUFFER, offset + 16, block);
300
- }
301
- }
302
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
303
- this.globe.DrawRender();
304
- }
305
-
306
- // ----------------- INTERNAL METHODS ----------------- //
307
-
308
-
309
- bindCircleVAO() {
310
- this.gl.bindVertexArray(this._circleVAO);
311
- }
312
-
313
- bindPaddingVAO() {
314
- this.gl.bindVertexArray(this._paddingVAO);
315
- }
316
-
317
-
318
- free() {
319
- this.gl.deleteBuffer(this.buffer);
320
- this.gl.deleteVertexArray(this._circleVAO);
321
- this.gl.deleteVertexArray(this._paddingVAO);
322
- }
323
-
324
- // ----------------- PRIVATE METHODS ----------------- //
325
-
326
- _getBufferData() {
327
- const { gl, buffer } = this;
328
- const size = new Float32Array(this._length * RING_SIZE);
329
- const bufferData = new Float32Array(size);
330
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
331
- gl.getBufferSubData(gl.ARRAY_BUFFER, 0, bufferData);
332
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
333
- return bufferData;
334
- }
335
-
336
- _ringKey(centerID, ringID) {
337
- return `C=${centerID},R=${ringID}`;
338
- }
339
-
340
-
341
-
342
- _nextBufferOffset() {
343
- if (!this.checkCapacity()) {
344
- throw new Error("Buffer is full");
345
- return;
346
- }
347
- let offset;
348
- if (this._removedRingsOffsetStack.length > 0) {
349
- offset = this._removedRingsOffsetStack.pop();
350
- } else {
351
- offset = this._ringCounter * RING_SIZE * 4;
352
- this._length++;
353
- }
354
- this._ringCounter++;
355
- return offset;
356
- }
357
-
358
-
359
- _implicitExtendBufferInNeed(incomingRingSize) {
360
- const overCapacity = incomingRingSize - this.capacityLeft();
361
- if (overCapacity <= 0) return;
362
- const newCapacity = Math.ceil((this._capacity + overCapacity) * this.implicitExtentionRate);
363
- this.extendBuffer(newCapacity);
364
- }
365
-
366
-
367
- async readRing(centerID, ringID) {
368
- const key = this._ringKey(centerID, ringID);
369
- if (!this._ringOffsets.has(key)) {
370
- console.warn("Ring is not registered yet");
371
- return;
372
- }
373
- const offset = this._ringOffsets.get(key);
374
- const { gl, buffer } = this;
375
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
376
- const bufferData = new Float32Array(9);
377
- gl.getBufferSubData(gl.ARRAY_BUFFER, offset, bufferData);
378
- return {
379
- centerX: bufferData[0],
380
- centerY: bufferData[1],
381
- range: bufferData[2],
382
- padding: bufferData[3],
383
- rgba: [bufferData[4], bufferData[5], bufferData[6], bufferData[7]],
384
- hide: bufferData[8]
385
- }
386
- }
387
-
388
-
389
-
390
- /**
391
- * TODOS:
392
- * - bulk ring registration. This must be managed here to avoid binding and unbinding buffer multiple times
393
- * - bulk centers and rings registration
394
- *
395
- * - Check capacity on extend buffer and collect garbage
396
- * - set length to the filled part of the buffer. used for draw calls
397
- * */
398
-
399
- /**
400
- * collectGarbage with Defragmantation
401
- * Basic idea: on unregistration the last ring is moved to the removed ring's place. length is decreased by 1
402
- * Optimization: Reading buffer is expensive. So bulk defragmentation is needed to work with this approach
403
- * */
404
- }
405
-
406
-
407
- /**
408
- * Documentation
409
- *
410
- * Methods:
411
- * - insertRings(centerIdringIdRadiusPaddingRgbaHide)
412
- * - removeRings(centerIDringIDs)
413
- * - removeCenters(centerIDs)
414
- * - updateCentersXY(centerIDxyList)
415
- * - updateCenters(centerDatas)
416
- * - insertBulk(rangeRingDatas)
417
- * - updateRing(centerID, ringID, { radius, padding, rgba, hide })
418
- * - readRing(centerID, ringID)
419
- *
420
- */
1
+ "use strict";
2
+ /**
3
+ * ring data model
4
+ * [centerX, centerY, range, padding, r, g, b, a, hide]
5
+ *
6
+ * Buffer is initialized with ring capacity and buffer is created with that capacity. It might be called buffer orphaning.
7
+ *
8
+ * */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ /**
11
+ * TODO
12
+ * delete registerCenter
13
+ *
14
+ *
15
+ */
16
+ const RING_SIZE = 9;
17
+ class default_1 {
18
+ /**
19
+ * @param {WebGL2RenderingContext} gl
20
+ * @param {Object} options
21
+ * @param {Number} options.initialRingCapacity
22
+ * @param {String} options.bufferType - "static" or "dynamic"
23
+ * */
24
+ constructor(gl, globe, { initialRingCapacity = 20, bufferType = "STATIC_DRAW", implicitExtentionRate = 1.2 } = {}) {
25
+ this.gl = gl;
26
+ this.globe = globe;
27
+ this._capacity = initialRingCapacity;
28
+ this._ringCounter = 0;
29
+ this._length = 0;
30
+ this._centerMap = new Map(); // key, new MAP(x,y, rings:[])
31
+ this._ringOffsets = new Map();
32
+ this._removedRingsOffsetStack = [];
33
+ this._bufferType = gl[bufferType.toUpperCase()];
34
+ this.implicitExtentionRate = implicitExtentionRate;
35
+ this.buffer = gl.createBuffer();
36
+ { // initilize data
37
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
38
+ gl.bufferData(gl.ARRAY_BUFFER, initialRingCapacity * 4 * RING_SIZE, this._bufferType);
39
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
40
+ }
41
+ {
42
+ this._circleVAO = gl.createVertexArray();
43
+ gl.bindVertexArray(this._circleVAO);
44
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
45
+ gl.enableVertexAttribArray(0);
46
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, RING_SIZE * 4, 0);
47
+ gl.enableVertexAttribArray(1);
48
+ gl.vertexAttribPointer(1, 1, gl.FLOAT, false, RING_SIZE * 4, 2 * 4);
49
+ gl.enableVertexAttribArray(2);
50
+ gl.vertexAttribPointer(2, 4, gl.FLOAT, false, RING_SIZE * 4, 4 * 4);
51
+ gl.enableVertexAttribArray(3);
52
+ gl.vertexAttribPointer(3, 3, gl.FLOAT, false, RING_SIZE * 4, 8 * 4);
53
+ // set divisors to 1
54
+ gl.vertexAttribDivisor(0, 1);
55
+ gl.vertexAttribDivisor(1, 1);
56
+ gl.vertexAttribDivisor(2, 1);
57
+ gl.vertexAttribDivisor(3, 1);
58
+ gl.bindVertexArray(null);
59
+ }
60
+ {
61
+ this._paddingVAO = gl.createVertexArray();
62
+ gl.bindVertexArray(this._paddingVAO);
63
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
64
+ gl.enableVertexAttribArray(0);
65
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, RING_SIZE * 4, 0);
66
+ gl.enableVertexAttribArray(1);
67
+ gl.vertexAttribPointer(1, 1, gl.FLOAT, false, RING_SIZE * 4, 2 * 4);
68
+ gl.enableVertexAttribArray(2);
69
+ gl.vertexAttribPointer(2, 1, gl.FLOAT, false, RING_SIZE * 4, 3 * 4);
70
+ gl.enableVertexAttribArray(3);
71
+ gl.vertexAttribPointer(3, 4, gl.FLOAT, false, RING_SIZE * 4, 4 * 4);
72
+ gl.enableVertexAttribArray(4);
73
+ gl.vertexAttribPointer(4, 3, gl.FLOAT, false, RING_SIZE * 4, 8 * 4);
74
+ gl.vertexAttribDivisor(0, 1);
75
+ gl.vertexAttribDivisor(1, 1);
76
+ gl.vertexAttribDivisor(2, 1);
77
+ gl.vertexAttribDivisor(3, 1);
78
+ gl.vertexAttribDivisor(4, 1);
79
+ gl.bindVertexArray(null);
80
+ }
81
+ }
82
+ /**
83
+ * @param {String} centerID
84
+ * @param {Object} options
85
+ * @param {Number} options.x
86
+ * @param {Number} options.y
87
+ * */
88
+ registerCenter(centerID, { x = 0, y = 0 } = {}) {
89
+ this._centerMap.set(centerID, new Map([
90
+ ["x", x],
91
+ ["y", y],
92
+ ["rings", []] // ring keys
93
+ ]));
94
+ }
95
+ /**
96
+ *
97
+ * @param {null | number} newCapacity if null, vacuum defragmentation is applied -> capacity is set to the current ring count
98
+ */
99
+ defrag(newCapacity = null) {
100
+ const { _removedRingsOffsetStack, _ringOffsets } = this;
101
+ _removedRingsOffsetStack.sort();
102
+ this._capacity = newCapacity || this._ringCounter;
103
+ const arrayToLoad = new Float32Array(this._capacity * RING_SIZE);
104
+ const bufferData = this._getBufferData();
105
+ let arrayOffset = 0;
106
+ const newRingOffsets = new Map();
107
+ for (const [key, offset] of _ringOffsets) {
108
+ const ringOffset = offset / 4;
109
+ const ringData = bufferData.slice(ringOffset, ringOffset + RING_SIZE);
110
+ arrayToLoad.set(ringData, arrayOffset);
111
+ newRingOffsets.set(key, arrayOffset * 4);
112
+ arrayOffset += RING_SIZE;
113
+ }
114
+ const { gl, buffer } = this;
115
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
116
+ gl.bufferData(gl.ARRAY_BUFFER, arrayToLoad, this._bufferType);
117
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
118
+ this._ringOffsets = newRingOffsets;
119
+ this._removedRingsOffsetStack = [];
120
+ this._length = this._ringCounter;
121
+ }
122
+ extendBuffer(newCapacity) {
123
+ if (this._capacity >= newCapacity) {
124
+ console.warn("New capacity is smaller than the current capacity");
125
+ return;
126
+ }
127
+ this._capacity = newCapacity;
128
+ const { gl, buffer } = this;
129
+ const bufferData = this._getBufferData();
130
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
131
+ gl.bufferData(gl.ARRAY_BUFFER, newCapacity * RING_SIZE * 4, this._bufferType);
132
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, bufferData);
133
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
134
+ }
135
+ checkCapacity(sizeLeft = 1) {
136
+ return sizeLeft <= this._capacity - this._ringCounter;
137
+ }
138
+ capacityLeft() {
139
+ return this._capacity - this._ringCounter;
140
+ }
141
+ get capacity() {
142
+ return this._capacity;
143
+ }
144
+ get length() {
145
+ return this._length;
146
+ }
147
+ get ringCount() {
148
+ return this._ringCounter;
149
+ }
150
+ /**
151
+ * @param {Array<string>} centerIDs
152
+ * */
153
+ removeCenters(centerIDs) {
154
+ const { gl, buffer } = this;
155
+ const zero = new Float32Array([0]);
156
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
157
+ for (let centerID of centerIDs) {
158
+ if (!this._centerMap.has(centerID)) {
159
+ // console.warn("Center is not registered yet");
160
+ // return;
161
+ continue;
162
+ }
163
+ const center = this._centerMap.get(centerID);
164
+ const rings = center.get("rings");
165
+ for (let i = 0; i < rings.length; i++) {
166
+ // set range to 0, 3rd index of float32array
167
+ const offset = this._ringOffsets.get(rings[i]);
168
+ gl.bufferSubData(gl.ARRAY_BUFFER, offset + 8, zero);
169
+ this._removedRingsOffsetStack.push(offset);
170
+ this._ringOffsets.delete(rings[i]);
171
+ }
172
+ this._ringCounter -= rings.length;
173
+ this._centerMap.delete(centerID);
174
+ }
175
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
176
+ this.globe.DrawRender();
177
+ }
178
+ /**
179
+ *
180
+ * @property {String} centerID
181
+ * @property {Number} x radians x
182
+ * @property {Number} y radians y
183
+ * @param {*} centerIDxyList
184
+ */
185
+ updateCentersXY(centerIDxyList) {
186
+ const { gl, buffer } = this;
187
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
188
+ for (let { centerID, x, y } of centerIDxyList) {
189
+ const center = this._centerMap.get(centerID);
190
+ center.set("x", x);
191
+ center.set("y", y);
192
+ const xyBlock = new Float32Array([x, y]);
193
+ const rings = center.get("rings");
194
+ for (let i = 0; i < rings.length; i++) {
195
+ const offset = this._ringOffsets.get(rings[i]);
196
+ gl.bufferSubData(gl.ARRAY_BUFFER, offset, xyBlock);
197
+ }
198
+ }
199
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
200
+ this.globe.DrawRender();
201
+ }
202
+ updateCentersHide(data) {
203
+ const { gl, buffer } = this;
204
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
205
+ for (let { centerID, hide = null } of data) {
206
+ if (hide === null)
207
+ continue;
208
+ const rings = this._centerMap.get(centerID).get("rings");
209
+ for (let i = 0; i < rings.length; i++) {
210
+ const offset = this._ringOffsets.get(rings[i]);
211
+ gl.bufferSubData(gl.ARRAY_BUFFER, offset + 32, new Float32Array([hide]));
212
+ }
213
+ }
214
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
215
+ this.globe.DrawRender();
216
+ }
217
+ insertBulk(rangeRingDatas) {
218
+ const { gl, buffer } = this;
219
+ { // remove existring centers
220
+ const existingCenterIDs = [];
221
+ for (let { centerID } of rangeRingDatas) {
222
+ if (this._centerMap.has(centerID)) {
223
+ existingCenterIDs.push(centerID);
224
+ }
225
+ }
226
+ this.removeCenters(existingCenterIDs);
227
+ }
228
+ { // capacity check
229
+ let incomingRingSize = 0;
230
+ for (let { rings } of rangeRingDatas) {
231
+ incomingRingSize += rings.length;
232
+ // It should check if ring is already registered but for now it is not implemented.
233
+ // Reasons: increase in complexity and performance
234
+ }
235
+ this._implicitExtendBufferInNeed(incomingRingSize);
236
+ }
237
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
238
+ for (const { centerID, x, y, rings, hide = 0 } of rangeRingDatas) {
239
+ this.registerCenter(centerID, { x, y });
240
+ for (const { ringID, radius, padding, rgba } of rings) {
241
+ const key = this._ringKey(centerID, ringID);
242
+ const bufferData = new Float32Array([x, y, radius, padding, ...rgba, hide]);
243
+ const offset = this._nextBufferOffset();
244
+ gl.bufferSubData(gl.ARRAY_BUFFER, offset, bufferData);
245
+ this._ringOffsets.set(key, offset);
246
+ this._centerMap.get(centerID).get("rings").push(key);
247
+ }
248
+ }
249
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
250
+ this.globe.DrawRender();
251
+ }
252
+ /**
253
+ *
254
+ * @param {Array<{centerID, rgba}} centersColors
255
+ */
256
+ updateCentersColor(centersColors) {
257
+ const { gl, buffer } = this;
258
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
259
+ for (let { centerID, rgba } of centersColors) {
260
+ if (!this._centerMap.has(centerID)) {
261
+ console.warn("Center is not registered yet");
262
+ continue;
263
+ }
264
+ const rings = this._centerMap.get(centerID).get("rings");
265
+ const block = new Float32Array(rgba);
266
+ for (let i = 0; i < rings.length; i++) {
267
+ const offset = this._ringOffsets.get(rings[i]);
268
+ gl.bufferSubData(gl.ARRAY_BUFFER, offset + 16, block);
269
+ }
270
+ }
271
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
272
+ this.globe.DrawRender();
273
+ }
274
+ // ----------------- INTERNAL METHODS ----------------- //
275
+ bindCircleVAO() {
276
+ this.gl.bindVertexArray(this._circleVAO);
277
+ }
278
+ bindPaddingVAO() {
279
+ this.gl.bindVertexArray(this._paddingVAO);
280
+ }
281
+ free() {
282
+ this.gl.deleteBuffer(this.buffer);
283
+ this.gl.deleteVertexArray(this._circleVAO);
284
+ this.gl.deleteVertexArray(this._paddingVAO);
285
+ }
286
+ // ----------------- PRIVATE METHODS ----------------- //
287
+ _getBufferData() {
288
+ const { gl, buffer } = this;
289
+ const size = new Float32Array(this._length * RING_SIZE);
290
+ const bufferData = new Float32Array(size);
291
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
292
+ gl.getBufferSubData(gl.ARRAY_BUFFER, 0, bufferData);
293
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
294
+ return bufferData;
295
+ }
296
+ _ringKey(centerID, ringID) {
297
+ return `C=${centerID},R=${ringID}`;
298
+ }
299
+ _nextBufferOffset() {
300
+ if (!this.checkCapacity()) {
301
+ throw new Error("Buffer is full");
302
+ return;
303
+ }
304
+ let offset;
305
+ if (this._removedRingsOffsetStack.length > 0) {
306
+ offset = this._removedRingsOffsetStack.pop();
307
+ }
308
+ else {
309
+ offset = this._ringCounter * RING_SIZE * 4;
310
+ this._length++;
311
+ }
312
+ this._ringCounter++;
313
+ return offset;
314
+ }
315
+ _implicitExtendBufferInNeed(incomingRingSize) {
316
+ const overCapacity = incomingRingSize - this.capacityLeft();
317
+ if (overCapacity <= 0)
318
+ return;
319
+ const newCapacity = Math.ceil((this._capacity + overCapacity) * this.implicitExtentionRate);
320
+ this.extendBuffer(newCapacity);
321
+ }
322
+ async readRing(centerID, ringID) {
323
+ const key = this._ringKey(centerID, ringID);
324
+ if (!this._ringOffsets.has(key)) {
325
+ console.warn("Ring is not registered yet");
326
+ return;
327
+ }
328
+ const offset = this._ringOffsets.get(key);
329
+ const { gl, buffer } = this;
330
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
331
+ const bufferData = new Float32Array(9);
332
+ gl.getBufferSubData(gl.ARRAY_BUFFER, offset, bufferData);
333
+ return {
334
+ centerX: bufferData[0],
335
+ centerY: bufferData[1],
336
+ range: bufferData[2],
337
+ padding: bufferData[3],
338
+ rgba: [bufferData[4], bufferData[5], bufferData[6], bufferData[7]],
339
+ hide: bufferData[8]
340
+ };
341
+ }
342
+ }
343
+ exports.default = default_1;
344
+ /**
345
+ * Documentation
346
+ *
347
+ * Methods:
348
+ * - insertRings(centerIdringIdRadiusPaddingRgbaHide)
349
+ * - removeRings(centerIDringIDs)
350
+ * - removeCenters(centerIDs)
351
+ * - updateCentersXY(centerIDxyList)
352
+ * - updateCenters(centerDatas)
353
+ * - insertBulk(rangeRingDatas)
354
+ * - updateRing(centerID, ringID, { radius, padding, rgba, hide })
355
+ * - readRing(centerID, ringID)
356
+ *
357
+ */