@pirireis/webglobeplugins 1.0.2 → 1.0.3

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 (259) hide show
  1. package/Math/{angle-calculation.ts → angle-calculation.js} +14 -18
  2. package/Math/{arc-cdf-points.ts → arc-cdf-points.js} +272 -329
  3. package/Math/{arc-generate-points-exponantial.ts → arc-generate-points-exponantial.js} +254 -299
  4. package/Math/{arc.ts → arc.js} +292 -421
  5. package/Math/bounds/line-bbox.js +186 -225
  6. package/Math/{circle-cdf-points.ts → circle-cdf-points.js} +78 -143
  7. package/Math/{circle.ts → circle.js} +33 -49
  8. package/Math/{constants.ts → constants.js} +4 -12
  9. package/Math/contour/{quadtreecontours.ts → quadtreecontours.js} +300 -371
  10. package/Math/contour/quadtreecontours1.js +298 -336
  11. package/Math/{finite-line-2d.ts → finite-line-2d.js} +58 -68
  12. package/Math/{haversine.ts → haversine.js} +22 -33
  13. package/Math/index.js +1 -0
  14. package/Math/juction/{arc-plane.ts → arc-plane.js} +143 -203
  15. package/Math/juction/{line-sphere.ts → line-sphere.js} +22 -32
  16. package/Math/juction/{plane-plane.ts → plane-plane.js} +53 -62
  17. package/Math/{line.ts → line.js} +52 -84
  18. package/Math/matrix4.js +1 -0
  19. package/Math/{methods.ts → methods.js} +126 -182
  20. package/Math/{plane.ts → plane.js} +56 -92
  21. package/Math/{quaternion.ts → quaternion.js} +106 -128
  22. package/Math/templete-shapes/{grid-visually-equal.ts → grid-visually-equal.js} +65 -118
  23. package/Math/tessellation/constants.js +1 -0
  24. package/Math/tessellation/{methods.ts → methods.js} +49 -79
  25. package/Math/tessellation/{nearest-value-padding.ts → nearest-value-padding.js} +112 -147
  26. package/Math/tessellation/{spherical-triangle-area.ts → spherical-triangle-area.js} +99 -127
  27. package/Math/tessellation/{tile-merger.ts → tile-merger.js} +429 -578
  28. package/Math/tessellation/{triangle-tessellation.ts → triangle-tessellation.js} +386 -533
  29. package/Math/tessellation/types.js +1 -0
  30. package/Math/types.js +1 -0
  31. package/Math/utils.js +2 -3
  32. package/Math/{vec3.ts → vec3.js} +155 -227
  33. package/Math/{xyz-tile.ts → xyz-tile.js} +18 -26
  34. package/algorithms/search-binary.js +16 -14
  35. package/altitude-locator/adaptors.js +1 -0
  36. package/altitude-locator/keymethod.js +1 -0
  37. package/altitude-locator/plugin.js +344 -445
  38. package/altitude-locator/types.js +21 -26
  39. package/compass-rose/compass-rose-padding-flat.js +230 -274
  40. package/compass-rose/{compass-text-writer.ts → compass-text-writer.js} +155 -210
  41. package/compass-rose/index.js +3 -3
  42. package/{constants.ts → constants.js} +6 -8
  43. package/heatwave/datamanager.js +149 -168
  44. package/heatwave/heatwave.js +206 -261
  45. package/heatwave/index.js +5 -5
  46. package/heatwave/isobar.js +303 -340
  47. package/heatwave/{texture-point-sampler.ts → texture-point-sampler.js} +187 -220
  48. package/investigation-tools/draw/tiles/adapters.js +67 -0
  49. package/investigation-tools/draw/tiles/{tiles.ts → tiles.js} +128 -162
  50. package/jest.config.js +7 -6
  51. package/package.json +1 -1
  52. package/pin/pin-object-array1.js +300 -381
  53. package/pin/pin-point-totem1.js +60 -77
  54. package/programs/arrowfield/arrow-field.js +60 -89
  55. package/programs/arrowfield/logic.js +141 -173
  56. package/programs/data2legend/density-to-legend.js +68 -86
  57. package/programs/data2legend/point-to-density-texture.js +67 -84
  58. package/programs/float2legendwithratio/index.js +2 -3
  59. package/programs/float2legendwithratio/logic.js +118 -144
  60. package/programs/float2legendwithratio/object.js +104 -141
  61. package/programs/helpers/blender.js +58 -73
  62. package/programs/helpers/{fadeaway.ts → fadeaway.js} +60 -73
  63. package/programs/index.js +20 -19
  64. package/programs/line-on-globe/circle-accurate-3d.js +85 -112
  65. package/programs/line-on-globe/circle-accurate-flat.js +148 -200
  66. package/programs/line-on-globe/degree-padding-around-circle-3d.js +102 -134
  67. package/programs/line-on-globe/index.js +1 -0
  68. package/programs/line-on-globe/lines-color-instanced-flat.js +80 -99
  69. package/programs/line-on-globe/linestrip/data.js +4 -0
  70. package/programs/line-on-globe/linestrip/{linestrip.ts → linestrip.js} +93 -152
  71. package/programs/line-on-globe/{naive-accurate-flexible.ts → naive-accurate-flexible.js} +126 -175
  72. package/programs/line-on-globe/util.js +5 -8
  73. package/programs/picking/pickable-polygon-renderer.js +98 -129
  74. package/programs/picking/pickable-renderer.js +98 -130
  75. package/programs/point-on-globe/element-globe-surface-glow.js +93 -122
  76. package/programs/point-on-globe/element-point-glow.js +80 -114
  77. package/programs/point-on-globe/square-pixel-point.js +121 -139
  78. package/programs/polygon-on-globe/{texture-dem-triangles.ts → texture-dem-triangles.js} +163 -207
  79. package/programs/{programcache.ts → programcache.js} +126 -134
  80. package/programs/rings/index.js +1 -1
  81. package/programs/rings/partial-ring/{piece-of-pie.ts → piece-of-pie.js} +152 -222
  82. package/programs/totems/camera-totem-attactment-interface.js +1 -0
  83. package/programs/totems/{camerauniformblock.ts → camerauniformblock.js} +225 -310
  84. package/programs/totems/{canvas-webglobe-info.ts → canvas-webglobe-info.js} +132 -147
  85. package/programs/totems/{dem-textures-manager.ts → dem-textures-manager.js} +257 -360
  86. package/programs/totems/{globe-changes.ts → globe-changes.js} +59 -79
  87. package/programs/totems/gpu-selection-uniform-block.js +99 -127
  88. package/programs/totems/{index.ts → index.js} +2 -2
  89. package/programs/two-d/pixel-padding-for-compass.js +87 -101
  90. package/programs/util.js +14 -19
  91. package/programs/vectorfields/logics/{constants.ts → constants.js} +4 -5
  92. package/programs/vectorfields/logics/{drawrectangleparticles.ts → drawrectangleparticles.js} +80 -115
  93. package/programs/vectorfields/logics/index.js +2 -4
  94. package/programs/vectorfields/logics/particle-ubo.js +16 -0
  95. package/programs/vectorfields/logics/{pixelbased.ts → pixelbased.js} +86 -115
  96. package/programs/vectorfields/logics/ubo.js +51 -57
  97. package/programs/vectorfields/{pingpongbuffermanager.ts → pingpongbuffermanager.js} +99 -113
  98. package/range-tools-on-terrain/bearing-line/{adapters.ts → adapters.js} +114 -154
  99. package/range-tools-on-terrain/bearing-line/{plugin.ts → plugin.js} +457 -569
  100. package/range-tools-on-terrain/bearing-line/types.js +1 -0
  101. package/range-tools-on-terrain/circle-line-chain/{adapters.ts → adapters.js} +85 -104
  102. package/range-tools-on-terrain/circle-line-chain/{chain-list-map.ts → chain-list-map.js} +382 -446
  103. package/range-tools-on-terrain/circle-line-chain/{plugin.ts → plugin.js} +464 -607
  104. package/range-tools-on-terrain/circle-line-chain/types.js +1 -0
  105. package/range-tools-on-terrain/range-ring/{adapters.ts → adapters.js} +93 -114
  106. package/range-tools-on-terrain/range-ring/{enum.ts → enum.js} +2 -2
  107. package/range-tools-on-terrain/range-ring/{plugin.ts → plugin.js} +377 -444
  108. package/range-tools-on-terrain/range-ring/rangeringangletext.js +331 -0
  109. package/range-tools-on-terrain/range-ring/types.js +9 -0
  110. package/semiplugins/interface.js +1 -0
  111. package/semiplugins/lightweight/{line-plugin.ts → line-plugin.js} +221 -342
  112. package/semiplugins/lightweight/{piece-of-pie-plugin.ts → piece-of-pie-plugin.js} +200 -275
  113. package/semiplugins/shape-on-terrain/{arc-plugin.ts → arc-plugin.js} +481 -616
  114. package/semiplugins/shape-on-terrain/{circle-plugin.ts → circle-plugin.js} +444 -588
  115. package/semiplugins/shape-on-terrain/{padding-1-degree.ts → padding-1-degree.js} +539 -713
  116. package/semiplugins/shape-on-terrain/terrain-polygon/{adapters.ts → adapters.js} +55 -69
  117. package/semiplugins/shape-on-terrain/terrain-polygon/data/{cache.ts → cache.js} +102 -149
  118. package/semiplugins/shape-on-terrain/terrain-polygon/data/{index-polygon-map.ts → index-polygon-map.js} +45 -58
  119. package/semiplugins/shape-on-terrain/terrain-polygon/data/{manager.ts → manager.js} +4 -4
  120. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +177 -196
  121. package/semiplugins/shape-on-terrain/terrain-polygon/data/{polygon-to-triangles.ts → polygon-to-triangles.js} +100 -144
  122. package/semiplugins/shape-on-terrain/terrain-polygon/data/{random.ts → random.js} +121 -165
  123. package/semiplugins/shape-on-terrain/terrain-polygon/data/types.js +1 -0
  124. package/semiplugins/shape-on-terrain/terrain-polygon/data/{worker-contact.ts → worker-contact.js} +63 -81
  125. package/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +125 -146
  126. package/semiplugins/shape-on-terrain/terrain-polygon/{terrain-polygon.ts → terrain-polygon.js} +219 -265
  127. package/semiplugins/shape-on-terrain/terrain-polygon/types.js +8 -0
  128. package/semiplugins/shell/bbox-renderer/index.js +2 -0
  129. package/semiplugins/shell/bbox-renderer/{logic.ts → logic.js} +209 -273
  130. package/semiplugins/shell/bbox-renderer/object.js +75 -0
  131. package/semiplugins/type.js +1 -0
  132. package/semiplugins/utility/{container-plugin.ts → container-plugin.js} +94 -126
  133. package/semiplugins/utility/{object-pass-container-plugin.ts → object-pass-container-plugin.js} +80 -101
  134. package/shaders/fragment-toy/firework.js +1 -1
  135. package/shaders/fragment-toy/singularity.js +2 -5
  136. package/tracks/point-heat-map/adaptors/timetracksplugin-format-to-this.js +63 -78
  137. package/tracks/point-heat-map/index.js +1 -0
  138. package/tracks/point-heat-map/plugin-webworker.js +121 -148
  139. package/tracks/point-heat-map/point-to-heat-map-flow.js +121 -150
  140. package/tracks/point-tracks/key-methods.js +2 -3
  141. package/tracks/point-tracks/plugin.js +401 -487
  142. package/tracks/timetracks/adaptors-line-strip.js +65 -79
  143. package/tracks/timetracks/plugin-line-strip.js +240 -295
  144. package/tracks/timetracks/program-line-strip.js +411 -495
  145. package/tracks/timetracks/programpoint-line-strip.js +109 -137
  146. package/types.js +19 -0
  147. package/util/account/bufferoffsetmanager.js +176 -209
  148. package/util/account/create-buffermap-orchastration.js +39 -0
  149. package/util/account/index.js +3 -6
  150. package/util/account/single-attribute-buffer-management/{buffer-manager.ts → buffer-manager.js} +119 -151
  151. package/util/account/single-attribute-buffer-management/{buffer-orchestrator.ts → buffer-orchestrator.js} +212 -238
  152. package/util/account/single-attribute-buffer-management/{buffer-orchestrator1.ts → buffer-orchestrator1.js} +159 -184
  153. package/util/account/single-attribute-buffer-management/{index.ts → index.js} +4 -11
  154. package/util/account/single-attribute-buffer-management/{object-store.ts → object-store.js} +55 -76
  155. package/util/account/single-attribute-buffer-management/types.js +1 -0
  156. package/util/account/util.js +18 -22
  157. package/util/algorithms/index.js +1 -0
  158. package/util/algorithms/search-binary.js +25 -26
  159. package/util/build-strategy/{static-dynamic.ts → static-dynamic.js} +41 -50
  160. package/util/check/index.js +1 -0
  161. package/util/check/typecheck.js +66 -0
  162. package/util/{frame-counter-trigger.ts → frame-counter-trigger.js} +84 -99
  163. package/util/geometry/{index.ts → index.js} +121 -155
  164. package/util/gl-util/buffer/{attribute-loader.ts → attribute-loader.js} +62 -84
  165. package/util/gl-util/buffer/{index.ts → index.js} +3 -6
  166. package/util/gl-util/draw-options/{methods.ts → methods.js} +32 -47
  167. package/util/gl-util/uniform-block/{manager.ts → manager.js} +200 -232
  168. package/util/{globe-default-gl-states.ts → globe-default-gl-states.js} +4 -5
  169. package/util/{helper-methods.ts → helper-methods.js} +8 -9
  170. package/util/index.js +10 -9
  171. package/util/interpolation/index.js +1 -0
  172. package/util/interpolation/timetrack/index.js +2 -9
  173. package/util/interpolation/timetrack/timetrack-interpolator.js +79 -94
  174. package/util/interpolation/timetrack/web-worker.js +46 -51
  175. package/util/picking/{fence.ts → fence.js} +43 -47
  176. package/util/picking/{picker-displayer.ts → picker-displayer.js} +176 -226
  177. package/util/programs/draw-from-pixel-coords.js +164 -201
  178. package/util/programs/{draw-texture-on-canvas.ts → draw-texture-on-canvas.js} +69 -91
  179. package/util/programs/supersampletotextures.js +97 -130
  180. package/util/programs/texturetoglobe.js +128 -153
  181. package/util/shaderfunctions/{geometrytransformations.ts → geometrytransformations.js} +44 -106
  182. package/util/shaderfunctions/index.js +2 -2
  183. package/util/shaderfunctions/nodata.js +2 -4
  184. package/util/shaderfunctions/noisefunctions.js +7 -10
  185. package/util/{webglobjectbuilders.ts → webglobjectbuilders.js} +358 -446
  186. package/vectorfield/arrowfield/adaptor.js +11 -11
  187. package/vectorfield/arrowfield/index.js +3 -3
  188. package/vectorfield/arrowfield/plugin.js +83 -128
  189. package/vectorfield/waveparticles/adaptor.js +15 -16
  190. package/vectorfield/waveparticles/index.js +3 -3
  191. package/vectorfield/waveparticles/{plugin.ts → plugin.js} +415 -506
  192. package/vectorfield/wind/adapters/{image-to-fields.ts → image-to-fields.js} +61 -74
  193. package/vectorfield/wind/adapters/types.js +1 -0
  194. package/vectorfield/wind/{imagetovectorfieldandmagnitude.ts → imagetovectorfieldandmagnitude.js} +53 -78
  195. package/vectorfield/wind/index.js +5 -5
  196. package/vectorfield/wind/{plugin-persistant copy.ts → plugin-persistant copy.js } +364 -461
  197. package/vectorfield/wind/{plugin-persistant.ts → plugin-persistant.js} +375 -483
  198. package/vectorfield/wind/plugin.js +685 -883
  199. package/vectorfield/wind/vectorfieldimage.js +23 -27
  200. package/write-text/{context-text-bulk.ts → context-text-bulk.js} +200 -285
  201. package/write-text/context-text3.js +167 -0
  202. package/write-text/{context-text4.ts → context-text4.js} +146 -231
  203. package/write-text/context-textDELETE.js +94 -125
  204. package/write-text/objectarraylabels/{index.ts → index.js} +2 -2
  205. package/write-text/objectarraylabels/objectarraylabels.js +200 -247
  206. package/Math/matrix4.ts +0 -0
  207. package/Math/mesh/mapbox-delaunay.d.ts +0 -74
  208. package/Math/roadmap.md +0 -10
  209. package/Math/tessellation/constants.ts +0 -1
  210. package/Math/tessellation/roadmap.md +0 -48
  211. package/Math/tessellation/types.ts +0 -1
  212. package/Math/types.ts +0 -68
  213. package/investigation-tools/draw/tiles/adapters.ts +0 -133
  214. package/programs/line-on-globe/linestrip/data.ts +0 -29
  215. package/programs/polygon-on-globe/roadmap.md +0 -8
  216. package/programs/totems/camera-totem-attactment-interface.ts +0 -4
  217. package/programs/vectorfields/logics/particle-ubo.ts +0 -23
  218. package/publish.bat +0 -62
  219. package/range-tools-on-terrain/bearing-line/types.ts +0 -65
  220. package/range-tools-on-terrain/circle-line-chain/types.ts +0 -43
  221. package/range-tools-on-terrain/range-ring/rangeringangletext.ts +0 -396
  222. package/range-tools-on-terrain/range-ring/types.ts +0 -30
  223. package/semiplugins/interface.ts +0 -14
  224. package/semiplugins/shape-on-terrain/goal.md +0 -12
  225. package/semiplugins/shape-on-terrain/terrain-polygon/data/cache-shortcuts.md +0 -20
  226. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.ts +0 -209
  227. package/semiplugins/shape-on-terrain/terrain-polygon/data/readme.md +0 -5
  228. package/semiplugins/shape-on-terrain/terrain-polygon/data/types.ts +0 -37
  229. package/semiplugins/shape-on-terrain/terrain-polygon/notes.md +0 -90
  230. package/semiplugins/shape-on-terrain/terrain-polygon/types.ts +0 -69
  231. package/semiplugins/shell/bbox-renderer/index.ts +0 -2
  232. package/semiplugins/shell/bbox-renderer/object.ts +0 -129
  233. package/semiplugins/type.ts +0 -8
  234. package/terrain-plugin.mmd +0 -83
  235. package/tests/Math/arc-sampling-test.js +0 -367
  236. package/tests/Math/arc-sampling-test.ts +0 -429
  237. package/tests/Math/arc.test.ts +0 -77
  238. package/tests/Math/junction/arc-limit.test.ts +0 -7
  239. package/tests/Math/junction/arc-plane-points.test.ts +0 -196
  240. package/tests/Math/junction/arc-plane.test.ts +0 -172
  241. package/tests/Math/junction/line-sphere.test.ts +0 -127
  242. package/tests/Math/junction/plane-plane.test.ts +0 -91
  243. package/tests/Math/plane-test.ts +0 -17
  244. package/tests/Math/plane.test.ts +0 -43
  245. package/tests/Math/vec3.test.ts +0 -33
  246. package/tracks/point-heat-map/readme.md +0 -15
  247. package/tracks/timetracks/readme.md +0 -1
  248. package/tsconfig.json +0 -22
  249. package/types/@pirireis/webglobe.d.ts +0 -102
  250. package/types/delaunator.d.ts +0 -40
  251. package/types/earcut.d.ts +0 -11
  252. package/types/rbush.d.ts +0 -57
  253. package/types.ts +0 -319
  254. package/util/account/create-buffermap-orchastration.ts +0 -85
  255. package/util/account/single-attribute-buffer-management/types.ts +0 -43
  256. package/util/check/typecheck.ts +0 -74
  257. package/vectorfield/wind/adapters/types.ts +0 -12
  258. package/write-text/context-text3.ts +0 -252
  259. package/write-text/objectarraylabels/objectarraylabels.d.ts +0 -72
@@ -1,487 +1,401 @@
1
- import { BufferOrchestrator, BufferManager, ObjectStore } from "../../util/account/index";
2
-
3
- import { PickerDisplayer } from "../../util/picking/picker-displayer";
4
- import { PointOnGlobeProgramCache } from "../../programs/point-on-globe/square-pixel-point";
5
- import { defaultblendfunction } from "../../util/globe-default-gl-states";
6
- import { wgs84ToCartesian3d, wgs84ToMercator } from "../../Math/methods";
7
-
8
-
9
- const _0vec3 = /* @__PURE__ */[0, 0, 0];
10
-
11
-
12
-
13
- /**
14
- * @typedef {number} long
15
- * @typedef {number} lat
16
- * @typedef {number} height
17
- * @typedef {string} ID
18
- * @typedef {string} trackID
19
- * @typedef {[number, number, number, number]} rgba 0-1
20
- * @typedef { long ,lat, height, ID } Point
21
- * @typedef {Array<Point>, rgba, trackID} Track
22
- */
23
- class PointTracksPlugin {
24
-
25
- constructor(id, {
26
- pointSize = 2,
27
- hoveredPointSize = 4,
28
- selectionPointFilling = 4,
29
- opacity = 1.0,
30
- objectStoreExtraParameters = ["long", "lat", "height"],
31
- initialCapacity = 1000
32
- } = {}) {
33
- this.id = id;
34
- this._isFreed = false;
35
- this._pointProgram = null
36
- this._vao = null;
37
- this._bufferManagersMap = null;
38
- this._bufferOrchestrator = null;
39
- this._pickerDisplayer = null
40
- this._selectedID = -1;
41
- this._selectedObj = null;
42
- this._tracksToPointsMap = new Map(); // one to many
43
- this._opacity = opacity ? opacity : 1.0;
44
- this.program = null
45
- this._lastWH = { w: 0, h: 0 };
46
- this._focusParams = { on: false, length: 0, elementBuffer: null, trackIDs: [] };
47
- this.pointSizes = {
48
- pointSize: pointSize ? pointSize : 2,
49
- selectionPointFilling: selectionPointFilling ? selectionPointFilling : 4,
50
- hoveredPointSize: hoveredPointSize ? hoveredPointSize : 4
51
- }
52
- this._objectStoreExtraParameters = objectStoreExtraParameters ? objectStoreExtraParameters : [];
53
- this._objectStoreExtraParametersFiltered = objectStoreExtraParameters.filter(param => {
54
- return !["long", "lat", "height", "ID", "trackID"].includes(param);
55
- });
56
- this._bufferOrchestrator = new BufferOrchestrator({ capacity: initialCapacity ? initialCapacity : 1000 });
57
-
58
- }
59
-
60
-
61
- init(globe, gl) {
62
-
63
- this.globe = globe;
64
- this.gl = gl;
65
- this._pickerDisplayer = new PickerDisplayer(globe);
66
- this._pointProgram = PointOnGlobeProgramCache.get(globe);
67
- this._focusParams.elementBuffer = gl.createBuffer();
68
- this._initBufferManagers();
69
- }
70
-
71
-
72
- _initBufferManagers() {
73
- const { gl } = this;
74
- const initialCapacity = this._bufferOrchestrator.capacity;
75
- const bufferType = "DYNAMIC_DRAW";
76
- this._bufferManagersMap = new Map(
77
- [
78
- ["pos3D", {
79
- bufferManager: new BufferManager(gl, 3, { bufferType, initialCapacity }),
80
- adaptor: (item) => {
81
- wgs84ToCartesian3d(_0vec3, item.long, item.lat, item.height / 1000); // height is in meters
82
- return new Float32Array(_0vec3) // height is in meters
83
- }
84
- }],
85
- ["pos2D", {
86
- bufferManager: new BufferManager(gl, 2, { bufferType, initialCapacity }),
87
- adaptor: (item) => new Float32Array(wgs84ToMercator(item.long, item.lat))
88
- }],
89
- ["rgba", {
90
- bufferManager: new BufferManager(gl, 4, { bufferType, initialCapacity, typedArrayConstructor: Float32Array }),
91
- // adaptor: (item) => new Uint8Array([
92
- // item.rgba[0] * 255,
93
- // item.rgba[1] * 255,
94
- // item.rgba[2] * 255,
95
- // item.rgba[3] * 255
96
- // ])
97
- adaptor: (item) => new Float32Array(item.rgba)
98
- }],
99
- ["objectStore", {
100
- bufferManager: new ObjectStore({ initialCapacity }),
101
- adaptor: (item) => {
102
- const result = {
103
- trackID: item.trackID,
104
- pointID: item.pointID,
105
- };
106
-
107
- // Add extra parameters specified in _objectStoreExtraParameters
108
- this._objectStoreExtraParameters.forEach(param => {
109
- if (item.hasOwnProperty(param)) {
110
- result[param] = item[param];
111
- }
112
- });
113
-
114
- return result;
115
- }
116
- }]
117
- ]
118
- );
119
-
120
- this._vao = this._pointProgram.createVAO(
121
- this._bufferManagersMap.get("pos3D").bufferManager.buffer,
122
- this._bufferManagersMap.get("pos2D").bufferManager.buffer,
123
- this._bufferManagersMap.get("rgba").bufferManager.buffer,
124
- );
125
- }
126
-
127
-
128
- setPointSize(size) {
129
- this.pointSizes.pointSize = size;
130
- this.globe?.DrawRender();
131
- }
132
-
133
- setSelectionPointFilling(size) {
134
- this.pointSizes.selectionPointFilling = size;
135
- this.globe?.DrawRender();
136
- }
137
-
138
- setHoveredPointSize(size) {
139
- this.pointSizes.hoveredPointSize = size;
140
- this.globe?.DrawRender();
141
- }
142
-
143
- setOpacity(opacity) {
144
- if (opacity < 0 || opacity > 1) return;
145
- this._opacity = opacity;
146
- this.globe?.DrawRender();
147
- }
148
-
149
- getCurrentSelection() {
150
- return this._selectedObj;
151
- }
152
-
153
-
154
- /**
155
- *
156
- * @param {*} x screen x
157
- * @param {*} y screen y
158
- * @param {*} callback callback on selection
159
- */
160
- screenSelection(x, y, callback) {
161
- const { pointSizes, _pickerDisplayer } = this;
162
- const objectStore = this._bufferManagersMap.get("objectStore").bufferManager;
163
- const wrapper = (selectedIDsSet) => {
164
- const selectedIDs = Array.from(selectedIDsSet);
165
- if (selectedIDs.length === 0) {
166
- this._selectedObj = null;
167
- this._selectedID = -1;
168
- callback([]);
169
- return;
170
- }
171
- const selectedPoints = [];
172
- for (let i = 0; i < selectedIDs.length; i++) {
173
- const id = selectedIDs[i];
174
- if (i === 0) {
175
- this._selectedID = id;
176
- this._selectedObj = objectStore.get(id);
177
- }
178
- const obj = objectStore.get(id);
179
- selectedPoints.push(obj);
180
- }
181
-
182
- callback(selectedPoints);
183
- }
184
- _pickerDisplayer.pickXY(x, y, pointSizes.selectionPointFilling, wrapper);
185
- }
186
-
187
-
188
- /**
189
- * @param {Array<Track>} tracks
190
- * @returns
191
- */
192
- insertBulk(tracks) {
193
- this._fillTracksToPointsMap(tracks);
194
- const flattenedPoints = tracks.map(track => trackToFlatPoints(track, this._objectStoreExtraParametersFiltered)).flat();
195
- const currentLoad = this._bufferOrchestrator.length;
196
- if (currentLoad + flattenedPoints.length >= 2147483647) {
197
- throw new Error("Too many points, Point count cannot exceed 2147483647");
198
- }
199
- const { _bufferManagersMap, _bufferOrchestrator } = this;
200
- _bufferOrchestrator.insertBulk(flattenedPoints, _bufferManagersMap);
201
- this._refillFocus();
202
-
203
- this.globe?.DrawRender();
204
-
205
- }
206
-
207
-
208
- flush() {
209
- const capacity = 100
210
- this._bufferOrchestrator?.flush({ capacity });
211
- this._bufferManagersMap.forEach(({ bufferManager }) => bufferManager.resetWithCapacity(capacity));
212
- this._turnOffFocus();
213
- this._tracksToPointsMap.clear();
214
- this.globe?.DrawRender();
215
- }
216
-
217
- /**
218
- * @param {string} trackID
219
- */
220
- deleteTrack(trackID) {
221
- const pointList = this._tracksToPointsMap.get(trackID);
222
- if (!pointList) {
223
- console.warn(`Track with ID ${trackID} does not exist.`);
224
- return;
225
- };
226
- const points = Array.from(pointList);
227
- const { _bufferOrchestrator, _bufferManagersMap } = this;
228
- _bufferOrchestrator.deleteBulk(
229
- points.map((pointID) => keyMethod(trackID, pointID)),
230
- _bufferManagersMap
231
- );
232
- this._tracksToPointsMap.delete(trackID);
233
- this._redraw = true;
234
- this._refillFocus();
235
-
236
- this.globe?.DrawRender();
237
- }
238
-
239
-
240
- /**
241
- * @param {string} trackID
242
- * @param {Array<string>} pointIDs
243
- */
244
- deletePoints(trackID, pointIDs) {
245
- const { _bufferOrchestrator, _bufferManagersMap } = this;
246
- _bufferOrchestrator.deleteBulk(
247
- pointIDs.map((pointID) => keyMethod(trackID, pointID)),
248
- _bufferManagersMap
249
- );
250
- this._deletePointsFromTracksMap(trackID, pointIDs);
251
- this._refillFocus();
252
- this.globe?.DrawRender();
253
- }
254
-
255
- focusTracks(trackIDs = null) {
256
- if (!this.globe) return;
257
- if (trackIDs === null) {
258
- this._focusParams.on = false;
259
- this.globe?.DrawRender();
260
- return;
261
- }
262
- this._focusParams.on = true;
263
- this._fillElementBuffer(trackIDs);
264
- if (!this._focusParams.on) {
265
- this._turnOffFocus();
266
- }
267
- this.globe.DrawRender();
268
- }
269
-
270
-
271
- updateTrackColor(trackID, rgba) {
272
- if (!this._tracksToPointsMap.has(trackID)) {
273
- console.warn(`Track with ID ${trackID} does not exist.`);
274
- return;
275
- }
276
- const pointList = this._tracksToPointsMap.get(trackID);
277
- const points = Array.from(pointList);
278
- const { _bufferOrchestrator, _bufferManagersMap } = this;
279
- _bufferOrchestrator.updateBulk(
280
- points.map((pointID) => {
281
- return {
282
- key: keyMethod(trackID, pointID),
283
- rgba: rgba
284
-
285
- };
286
- }),
287
- _bufferManagersMap,
288
- ["rgba"]
289
- );
290
- this._refillFocus();
291
- this.globe?.DrawRender();
292
- }
293
-
294
- // GLOBE API METHODS
295
-
296
- free() {
297
- if (this._isFreed) return;
298
- this._isFreed = true;
299
- this._pickerDisplayer.free();
300
- PointOnGlobeProgramCache.release(this.globe);
301
- this.gl.deleteBuffer(this._focusParams.elementBuffer);
302
- this._bufferManagersMap.forEach(
303
- ({ bufferManager, adaptor }) => bufferManager.free()
304
- );
305
- }
306
-
307
-
308
- draw3D() {
309
- const { gl, _pointProgram, _pickerDisplayer, _bufferOrchestrator, _vao } = this;
310
- if (!gl) {
311
- throw new Error("GL is not loaded, PointTracks Plugin")
312
- }
313
- if (this._isFreed) {
314
- throw new Error("Plugin is unregistered, PointTracks Plugin");
315
- }
316
- this.resize();
317
-
318
- _pickerDisplayer.bindFBO();
319
- _pickerDisplayer.clearTextures();
320
-
321
- if (this._focusParams.on) {
322
- _pointProgram.draw(_vao, this._focusParams.length,
323
- {
324
- hoveredID: this._selectedID,
325
- opacity: this._opacity,
326
- pointSize: this.pointSizes.pointSize,
327
- hoveredPointSize: this.pointSizes.hoveredPointSize,
328
- elementBuffer: this._focusParams.elementBuffer
329
- });
330
- } else {
331
- _pointProgram.draw(_vao, _bufferOrchestrator.length,
332
- {
333
- hoveredID: this._selectedID,
334
- opacity: this._opacity,
335
- pointSize: this.pointSizes.pointSize,
336
- hoveredPointSize: this.pointSizes.hoveredPointSize
337
- });
338
- }
339
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
340
- _pickerDisplayer.drawColorTexture();
341
-
342
- this._selfSelect();
343
- }
344
-
345
-
346
- resize() {
347
- const w = this.globe.api_ScrW();
348
- const h = this.globe.api_ScrH();
349
- if (w === this._lastWH.w && h === this._lastWH.h) return;
350
-
351
- this._lastWH.w = w;
352
- this._lastWH.h = h;
353
- this._pickerDisplayer.resize();
354
- this.globe?.DrawRender();
355
- }
356
-
357
- // IMPLICIT METHODS
358
-
359
- _fillTracksToPointsMap(tracks) {
360
- for (const track of tracks) {
361
- const trackID = track.trackID;
362
- const points = track.points;
363
- if (!this._tracksToPointsMap.has(trackID)) {
364
- this._tracksToPointsMap.set(trackID, new Set());
365
- }
366
- const pointSet = this._tracksToPointsMap.get(trackID);
367
- for (let p = 0; p < points.length; p++) {
368
- const pointID = points[p].ID;
369
- if (!pointSet.has(pointID)) {
370
- pointSet.add(pointID);
371
- } else {
372
- console.warn(`Point with ID ${pointID} already exists in track ${trackID}. Skipping duplicate.`);
373
- }
374
- }
375
- }
376
- }
377
-
378
- _refillFocus() {
379
- if (this._focusParams.on) {
380
- this.focusTracks(this._focusParams.trackIDs);
381
- }
382
- }
383
-
384
- _deletePointsFromTracksMap(trackID, pointIDs) {
385
- const trackIDs = this._tracksToPointsMap.get(trackID);
386
- if (trackIDs === undefined) {
387
- console.warn(`Track with ID ${trackID} not found.`);
388
- return;
389
- }
390
- for (const pointID of pointIDs) {
391
- if (!trackIDs.has(pointID)) {
392
- console.warn(`Point with ID ${pointID} not found in track ${trackID}.`);
393
- } else {
394
- trackIDs.delete(pointID);
395
- }
396
- }
397
- if (trackIDs.size === 0) {
398
- this._tracksToPointsMap.delete(trackID);
399
- }
400
- }
401
-
402
-
403
- _selfSelect() {
404
- const { globe } = this;
405
- const pos = globe.api_GetMousePos();
406
- const x = pos.canvasX;
407
- const y = globe.api_ScrH() - pos.canvasY;
408
- this.screenSelection(x, y, (selectedPoints) => {
409
- });
410
-
411
- }
412
-
413
- _turnOffFocus() {
414
- const { gl } = this;
415
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._focusParams.elementBuffer);
416
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array([]), gl.STATIC_DRAW);
417
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
418
- this._focusParams.length = 0;
419
- this._focusParams.on = false;
420
- }
421
-
422
- _fillElementBuffer(trackIDs) {
423
-
424
- let length = 0;
425
- const indexes = [];
426
- const foundTracks = []
427
- for (const trackID of trackIDs) {
428
- const pointList = this._tracksToPointsMap.get(trackID);
429
- if (!pointList) continue;
430
- foundTracks.push(trackID);
431
- for (const pointID of pointList) {
432
- const key = keyMethod(trackID, pointID);
433
- const index = this._bufferOrchestrator.offsetMap.get(key);
434
- if (index === undefined) {
435
- throw new Error(`Point with key ${key} not found in buffer orchestrator.`);
436
- }
437
- indexes.push(index);
438
- length++;
439
- }
440
- }
441
- this._focusParams.trackIDs = foundTracks;
442
- this._focusParams.length = length;
443
- if (length === 0) {
444
- return false;
445
- }
446
- const { gl } = this;
447
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._focusParams.elementBuffer);
448
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indexes), gl.STATIC_DRAW);
449
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
450
- return true;
451
- }
452
-
453
- }
454
-
455
-
456
- const trackToFlatPoints = (track, extraParameters) => {
457
-
458
- const trackID = track.trackID;
459
- const points = track.points;
460
- const rgba = new Float32Array(track.rgba);
461
- const flatPoints = [];
462
- for (const point of points) {
463
- flatPoints.push({
464
- key: keyMethod(trackID, point.ID),
465
- long: point.long,
466
- lat: point.lat,
467
- height: point.height,
468
- pointID: point.ID,
469
- rgba,
470
- trackID
471
- });
472
-
473
- for (let i = 0; i < extraParameters.length; i++) {
474
- const param = extraParameters[i];
475
- if (point.hasOwnProperty(param)) {
476
- flatPoints[flatPoints.length - 1][param] = point[param];
477
- }
478
- }
479
-
480
- }
481
- return flatPoints;
482
- }
483
-
484
- const keyMethod = (trackID, pointID) => `${trackID}_${pointID}`;
485
-
486
-
487
- export { PointTracksPlugin, keyMethod };
1
+ import { BufferOrchestrator, BufferManager, ObjectStore } from "../../util/account/index";
2
+ import { PickerDisplayer } from "../../util/picking/picker-displayer";
3
+ import { PointOnGlobeProgramCache } from "../../programs/point-on-globe/square-pixel-point";
4
+ import { defaultblendfunction } from "../../util/globe-default-gl-states";
5
+ import { wgs84ToCartesian3d, wgs84ToMercator } from "../../Math/methods";
6
+ const _0vec3 = /* @__PURE__ */ [0, 0, 0];
7
+ /**
8
+ * @typedef {number} long
9
+ * @typedef {number} lat
10
+ * @typedef {number} height
11
+ * @typedef {string} ID
12
+ * @typedef {string} trackID
13
+ * @typedef {[number, number, number, number]} rgba 0-1
14
+ * @typedef { long ,lat, height, ID } Point
15
+ * @typedef {Array<Point>, rgba, trackID} Track
16
+ */
17
+ class PointTracksPlugin {
18
+ constructor(id, { pointSize = 2, hoveredPointSize = 4, selectionPointFilling = 4, opacity = 1.0, objectStoreExtraParameters = ["long", "lat", "height"], initialCapacity = 1000 } = {}) {
19
+ this.id = id;
20
+ this._isFreed = false;
21
+ this._pointProgram = null;
22
+ this._vao = null;
23
+ this._bufferManagersMap = null;
24
+ this._bufferOrchestrator = null;
25
+ this._pickerDisplayer = null;
26
+ this._selectedID = -1;
27
+ this._selectedObj = null;
28
+ this._tracksToPointsMap = new Map(); // one to many
29
+ this._opacity = opacity ? opacity : 1.0;
30
+ this.program = null;
31
+ this._lastWH = { w: 0, h: 0 };
32
+ this._focusParams = { on: false, length: 0, elementBuffer: null, trackIDs: [] };
33
+ this.pointSizes = {
34
+ pointSize: pointSize ? pointSize : 2,
35
+ selectionPointFilling: selectionPointFilling ? selectionPointFilling : 4,
36
+ hoveredPointSize: hoveredPointSize ? hoveredPointSize : 4
37
+ };
38
+ this._objectStoreExtraParameters = objectStoreExtraParameters ? objectStoreExtraParameters : [];
39
+ this._objectStoreExtraParametersFiltered = objectStoreExtraParameters.filter(param => {
40
+ return !["long", "lat", "height", "ID", "trackID"].includes(param);
41
+ });
42
+ this._bufferOrchestrator = new BufferOrchestrator({ capacity: initialCapacity ? initialCapacity : 1000 });
43
+ }
44
+ init(globe, gl) {
45
+ this.globe = globe;
46
+ this.gl = gl;
47
+ this._pickerDisplayer = new PickerDisplayer(globe);
48
+ this._pointProgram = PointOnGlobeProgramCache.get(globe);
49
+ this._focusParams.elementBuffer = gl.createBuffer();
50
+ this._initBufferManagers();
51
+ }
52
+ _initBufferManagers() {
53
+ const { gl } = this;
54
+ const initialCapacity = this._bufferOrchestrator.capacity;
55
+ const bufferType = "DYNAMIC_DRAW";
56
+ this._bufferManagersMap = new Map([
57
+ ["pos3D", {
58
+ bufferManager: new BufferManager(gl, 3, { bufferType, initialCapacity }),
59
+ adaptor: (item) => {
60
+ wgs84ToCartesian3d(_0vec3, item.long, item.lat, item.height / 1000); // height is in meters
61
+ return new Float32Array(_0vec3); // height is in meters
62
+ }
63
+ }],
64
+ ["pos2D", {
65
+ bufferManager: new BufferManager(gl, 2, { bufferType, initialCapacity }),
66
+ adaptor: (item) => new Float32Array(wgs84ToMercator(item.long, item.lat))
67
+ }],
68
+ ["rgba", {
69
+ bufferManager: new BufferManager(gl, 4, { bufferType, initialCapacity, typedArrayConstructor: Float32Array }),
70
+ // adaptor: (item) => new Uint8Array([
71
+ // item.rgba[0] * 255,
72
+ // item.rgba[1] * 255,
73
+ // item.rgba[2] * 255,
74
+ // item.rgba[3] * 255
75
+ // ])
76
+ adaptor: (item) => new Float32Array(item.rgba)
77
+ }],
78
+ ["objectStore", {
79
+ bufferManager: new ObjectStore({ initialCapacity }),
80
+ adaptor: (item) => {
81
+ const result = {
82
+ trackID: item.trackID,
83
+ pointID: item.pointID,
84
+ };
85
+ // Add extra parameters specified in _objectStoreExtraParameters
86
+ this._objectStoreExtraParameters.forEach(param => {
87
+ if (item.hasOwnProperty(param)) {
88
+ result[param] = item[param];
89
+ }
90
+ });
91
+ return result;
92
+ }
93
+ }]
94
+ ]);
95
+ this._vao = this._pointProgram.createVAO(this._bufferManagersMap.get("pos3D").bufferManager.buffer, this._bufferManagersMap.get("pos2D").bufferManager.buffer, this._bufferManagersMap.get("rgba").bufferManager.buffer);
96
+ }
97
+ setPointSize(size) {
98
+ this.pointSizes.pointSize = size;
99
+ this.globe?.DrawRender();
100
+ }
101
+ setSelectionPointFilling(size) {
102
+ this.pointSizes.selectionPointFilling = size;
103
+ this.globe?.DrawRender();
104
+ }
105
+ setHoveredPointSize(size) {
106
+ this.pointSizes.hoveredPointSize = size;
107
+ this.globe?.DrawRender();
108
+ }
109
+ setOpacity(opacity) {
110
+ if (opacity < 0 || opacity > 1)
111
+ return;
112
+ this._opacity = opacity;
113
+ this.globe?.DrawRender();
114
+ }
115
+ getCurrentSelection() {
116
+ return this._selectedObj;
117
+ }
118
+ /**
119
+ *
120
+ * @param {*} x screen x
121
+ * @param {*} y screen y
122
+ * @param {*} callback callback on selection
123
+ */
124
+ screenSelection(x, y, callback) {
125
+ const { pointSizes, _pickerDisplayer } = this;
126
+ const objectStore = this._bufferManagersMap.get("objectStore").bufferManager;
127
+ const wrapper = (selectedIDsSet) => {
128
+ const selectedIDs = Array.from(selectedIDsSet);
129
+ if (selectedIDs.length === 0) {
130
+ this._selectedObj = null;
131
+ this._selectedID = -1;
132
+ callback([]);
133
+ return;
134
+ }
135
+ const selectedPoints = [];
136
+ for (let i = 0; i < selectedIDs.length; i++) {
137
+ const id = selectedIDs[i];
138
+ if (i === 0) {
139
+ this._selectedID = id;
140
+ this._selectedObj = objectStore.get(id);
141
+ }
142
+ const obj = objectStore.get(id);
143
+ selectedPoints.push(obj);
144
+ }
145
+ callback(selectedPoints);
146
+ };
147
+ _pickerDisplayer.pickXY(x, y, pointSizes.selectionPointFilling, wrapper);
148
+ }
149
+ /**
150
+ * @param {Array<Track>} tracks
151
+ * @returns
152
+ */
153
+ insertBulk(tracks) {
154
+ this._fillTracksToPointsMap(tracks);
155
+ const flattenedPoints = tracks.map(track => trackToFlatPoints(track, this._objectStoreExtraParametersFiltered)).flat();
156
+ const currentLoad = this._bufferOrchestrator.length;
157
+ if (currentLoad + flattenedPoints.length >= 2147483647) {
158
+ throw new Error("Too many points, Point count cannot exceed 2147483647");
159
+ }
160
+ const { _bufferManagersMap, _bufferOrchestrator } = this;
161
+ _bufferOrchestrator.insertBulk(flattenedPoints, _bufferManagersMap);
162
+ this._refillFocus();
163
+ this.globe?.DrawRender();
164
+ }
165
+ flush() {
166
+ const capacity = 100;
167
+ this._bufferOrchestrator?.flush({ capacity });
168
+ this._bufferManagersMap.forEach(({ bufferManager }) => bufferManager.resetWithCapacity(capacity));
169
+ this._turnOffFocus();
170
+ this._tracksToPointsMap.clear();
171
+ this.globe?.DrawRender();
172
+ }
173
+ /**
174
+ * @param {string} trackID
175
+ */
176
+ deleteTrack(trackID) {
177
+ const pointList = this._tracksToPointsMap.get(trackID);
178
+ if (!pointList) {
179
+ console.warn(`Track with ID ${trackID} does not exist.`);
180
+ return;
181
+ }
182
+ ;
183
+ const points = Array.from(pointList);
184
+ const { _bufferOrchestrator, _bufferManagersMap } = this;
185
+ _bufferOrchestrator.deleteBulk(points.map((pointID) => keyMethod(trackID, pointID)), _bufferManagersMap);
186
+ this._tracksToPointsMap.delete(trackID);
187
+ this._redraw = true;
188
+ this._refillFocus();
189
+ this.globe?.DrawRender();
190
+ }
191
+ /**
192
+ * @param {string} trackID
193
+ * @param {Array<string>} pointIDs
194
+ */
195
+ deletePoints(trackID, pointIDs) {
196
+ const { _bufferOrchestrator, _bufferManagersMap } = this;
197
+ _bufferOrchestrator.deleteBulk(pointIDs.map((pointID) => keyMethod(trackID, pointID)), _bufferManagersMap);
198
+ this._deletePointsFromTracksMap(trackID, pointIDs);
199
+ this._refillFocus();
200
+ this.globe?.DrawRender();
201
+ }
202
+ focusTracks(trackIDs = null) {
203
+ if (!this.globe)
204
+ return;
205
+ if (trackIDs === null) {
206
+ this._focusParams.on = false;
207
+ this.globe?.DrawRender();
208
+ return;
209
+ }
210
+ this._focusParams.on = true;
211
+ this._fillElementBuffer(trackIDs);
212
+ if (!this._focusParams.on) {
213
+ this._turnOffFocus();
214
+ }
215
+ this.globe.DrawRender();
216
+ }
217
+ updateTrackColor(trackID, rgba) {
218
+ if (!this._tracksToPointsMap.has(trackID)) {
219
+ console.warn(`Track with ID ${trackID} does not exist.`);
220
+ return;
221
+ }
222
+ const pointList = this._tracksToPointsMap.get(trackID);
223
+ const points = Array.from(pointList);
224
+ const { _bufferOrchestrator, _bufferManagersMap } = this;
225
+ _bufferOrchestrator.updateBulk(points.map((pointID) => {
226
+ return {
227
+ key: keyMethod(trackID, pointID),
228
+ rgba: rgba
229
+ };
230
+ }), _bufferManagersMap, ["rgba"]);
231
+ this._refillFocus();
232
+ this.globe?.DrawRender();
233
+ }
234
+ // GLOBE API METHODS
235
+ free() {
236
+ if (this._isFreed)
237
+ return;
238
+ this._isFreed = true;
239
+ this._pickerDisplayer.free();
240
+ PointOnGlobeProgramCache.release(this.globe);
241
+ this.gl.deleteBuffer(this._focusParams.elementBuffer);
242
+ this._bufferManagersMap.forEach(({ bufferManager, adaptor }) => bufferManager.free());
243
+ }
244
+ draw3D() {
245
+ const { gl, _pointProgram, _pickerDisplayer, _bufferOrchestrator, _vao } = this;
246
+ if (!gl) {
247
+ throw new Error("GL is not loaded, PointTracks Plugin");
248
+ }
249
+ if (this._isFreed) {
250
+ throw new Error("Plugin is unregistered, PointTracks Plugin");
251
+ }
252
+ this.resize();
253
+ _pickerDisplayer.bindFBO();
254
+ _pickerDisplayer.clearTextures();
255
+ if (this._focusParams.on) {
256
+ _pointProgram.draw(_vao, this._focusParams.length, {
257
+ hoveredID: this._selectedID,
258
+ opacity: this._opacity,
259
+ pointSize: this.pointSizes.pointSize,
260
+ hoveredPointSize: this.pointSizes.hoveredPointSize,
261
+ elementBuffer: this._focusParams.elementBuffer
262
+ });
263
+ }
264
+ else {
265
+ _pointProgram.draw(_vao, _bufferOrchestrator.length, {
266
+ hoveredID: this._selectedID,
267
+ opacity: this._opacity,
268
+ pointSize: this.pointSizes.pointSize,
269
+ hoveredPointSize: this.pointSizes.hoveredPointSize
270
+ });
271
+ }
272
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
273
+ _pickerDisplayer.drawColorTexture();
274
+ this._selfSelect();
275
+ }
276
+ resize() {
277
+ const w = this.globe.api_ScrW();
278
+ const h = this.globe.api_ScrH();
279
+ if (w === this._lastWH.w && h === this._lastWH.h)
280
+ return;
281
+ this._lastWH.w = w;
282
+ this._lastWH.h = h;
283
+ this._pickerDisplayer.resize();
284
+ this.globe?.DrawRender();
285
+ }
286
+ // IMPLICIT METHODS
287
+ _fillTracksToPointsMap(tracks) {
288
+ for (const track of tracks) {
289
+ const trackID = track.trackID;
290
+ const points = track.points;
291
+ if (!this._tracksToPointsMap.has(trackID)) {
292
+ this._tracksToPointsMap.set(trackID, new Set());
293
+ }
294
+ const pointSet = this._tracksToPointsMap.get(trackID);
295
+ for (let p = 0; p < points.length; p++) {
296
+ const pointID = points[p].ID;
297
+ if (!pointSet.has(pointID)) {
298
+ pointSet.add(pointID);
299
+ }
300
+ else {
301
+ console.warn(`Point with ID ${pointID} already exists in track ${trackID}. Skipping duplicate.`);
302
+ }
303
+ }
304
+ }
305
+ }
306
+ _refillFocus() {
307
+ if (this._focusParams.on) {
308
+ this.focusTracks(this._focusParams.trackIDs);
309
+ }
310
+ }
311
+ _deletePointsFromTracksMap(trackID, pointIDs) {
312
+ const trackIDs = this._tracksToPointsMap.get(trackID);
313
+ if (trackIDs === undefined) {
314
+ console.warn(`Track with ID ${trackID} not found.`);
315
+ return;
316
+ }
317
+ for (const pointID of pointIDs) {
318
+ if (!trackIDs.has(pointID)) {
319
+ console.warn(`Point with ID ${pointID} not found in track ${trackID}.`);
320
+ }
321
+ else {
322
+ trackIDs.delete(pointID);
323
+ }
324
+ }
325
+ if (trackIDs.size === 0) {
326
+ this._tracksToPointsMap.delete(trackID);
327
+ }
328
+ }
329
+ _selfSelect() {
330
+ const { globe } = this;
331
+ const pos = globe.api_GetMousePos();
332
+ const x = pos.canvasX;
333
+ const y = globe.api_ScrH() - pos.canvasY;
334
+ this.screenSelection(x, y, (selectedPoints) => {
335
+ });
336
+ }
337
+ _turnOffFocus() {
338
+ const { gl } = this;
339
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._focusParams.elementBuffer);
340
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array([]), gl.STATIC_DRAW);
341
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
342
+ this._focusParams.length = 0;
343
+ this._focusParams.on = false;
344
+ }
345
+ _fillElementBuffer(trackIDs) {
346
+ let length = 0;
347
+ const indexes = [];
348
+ const foundTracks = [];
349
+ for (const trackID of trackIDs) {
350
+ const pointList = this._tracksToPointsMap.get(trackID);
351
+ if (!pointList)
352
+ continue;
353
+ foundTracks.push(trackID);
354
+ for (const pointID of pointList) {
355
+ const key = keyMethod(trackID, pointID);
356
+ const index = this._bufferOrchestrator.offsetMap.get(key);
357
+ if (index === undefined) {
358
+ throw new Error(`Point with key ${key} not found in buffer orchestrator.`);
359
+ }
360
+ indexes.push(index);
361
+ length++;
362
+ }
363
+ }
364
+ this._focusParams.trackIDs = foundTracks;
365
+ this._focusParams.length = length;
366
+ if (length === 0) {
367
+ return false;
368
+ }
369
+ const { gl } = this;
370
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._focusParams.elementBuffer);
371
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indexes), gl.STATIC_DRAW);
372
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
373
+ return true;
374
+ }
375
+ }
376
+ const trackToFlatPoints = (track, extraParameters) => {
377
+ const trackID = track.trackID;
378
+ const points = track.points;
379
+ const rgba = new Float32Array(track.rgba);
380
+ const flatPoints = [];
381
+ for (const point of points) {
382
+ flatPoints.push({
383
+ key: keyMethod(trackID, point.ID),
384
+ long: point.long,
385
+ lat: point.lat,
386
+ height: point.height,
387
+ pointID: point.ID,
388
+ rgba,
389
+ trackID
390
+ });
391
+ for (let i = 0; i < extraParameters.length; i++) {
392
+ const param = extraParameters[i];
393
+ if (point.hasOwnProperty(param)) {
394
+ flatPoints[flatPoints.length - 1][param] = point[param];
395
+ }
396
+ }
397
+ }
398
+ return flatPoints;
399
+ };
400
+ const keyMethod = (trackID, pointID) => `${trackID}_${pointID}`;
401
+ export { PointTracksPlugin, keyMethod };