@pirireis/webglobeplugins 0.9.7 → 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 (212) hide show
  1. package/dist/Math/angle-calculation.js +15 -0
  2. package/dist/Math/arc.js +65 -0
  3. package/dist/Math/bounds/line-bbox.js +188 -0
  4. package/dist/Math/constants.js +9 -0
  5. package/dist/Math/frustum/camera.js +24 -0
  6. package/dist/Math/frustum/from-globeinfo.js +48 -0
  7. package/dist/Math/frustum/types.js +2 -0
  8. package/dist/Math/globe-util/horizon-plane.js +112 -0
  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/dist/Math/juction/plane-plane.js +58 -0
  13. package/dist/Math/line.js +56 -0
  14. package/dist/Math/matrix4.js +1 -0
  15. package/dist/Math/methods.js +201 -0
  16. package/dist/Math/plane.js +60 -0
  17. package/dist/Math/quaternion.js +104 -0
  18. package/dist/Math/types.js +2 -0
  19. package/dist/Math/utils.js +4 -0
  20. package/dist/Math/vec3.js +126 -0
  21. package/dist/algorithms/search-binary.js +19 -0
  22. package/dist/altitude-locator/adaptors.js +1 -0
  23. package/dist/altitude-locator/draw-subset-obj.js +18 -0
  24. package/dist/altitude-locator/keymethod.js +1 -0
  25. package/dist/altitude-locator/plugin.js +341 -0
  26. package/dist/altitude-locator/types.js +23 -0
  27. package/dist/arrowfield/adaptor.js +14 -0
  28. package/dist/arrowfield/index.js +10 -0
  29. package/dist/arrowfield/plugin.js +86 -0
  30. package/dist/bearing-line/index.js +8 -0
  31. package/dist/bearing-line/plugin.js +449 -0
  32. package/dist/circle-line-chain/chain-list-map.js +205 -0
  33. package/dist/circle-line-chain/init.js +1 -0
  34. package/dist/circle-line-chain/plugin.js +424 -0
  35. package/dist/circle-line-chain/util.js +5 -0
  36. package/dist/compass-rose/compass-rose-padding-flat.js +225 -0
  37. package/dist/compass-rose/compass-text-writer.js +153 -0
  38. package/dist/compass-rose/index.js +7 -0
  39. package/dist/compassrose/compassrose.js +296 -0
  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/dist/heatwave/isobar/objectarraylabels.js +202 -0
  44. package/dist/heatwave/isobar/plugin.js +343 -0
  45. package/dist/heatwave/isobar/quadtreecontours.js +300 -0
  46. package/dist/heatwave/plugins/heatwaveglobeshell.js +206 -0
  47. package/dist/index.js +58 -0
  48. package/dist/jest.config.js +7 -0
  49. package/dist/partialrings/buffer-manager.js +81 -0
  50. package/dist/partialrings/index.js +41 -0
  51. package/dist/partialrings/plugin.js +135 -0
  52. package/dist/partialrings/program.js +286 -0
  53. package/dist/pin/pin-object-array.js +305 -0
  54. package/dist/pin/pin-point-totem.js +60 -0
  55. package/dist/point-heat-map/adaptors/timetracksplugin-format-to-this.js +66 -0
  56. package/dist/point-heat-map/index.js +1 -0
  57. package/dist/point-heat-map/plugin-webworker.js +126 -0
  58. package/dist/point-heat-map/point-to-heat-map-flow.js +127 -0
  59. package/dist/point-tracks/key-methods.js +5 -0
  60. package/dist/point-tracks/plugin.js +338 -0
  61. package/dist/programs/arrowfield/index.js +7 -0
  62. package/dist/programs/arrowfield/logic.js +257 -0
  63. package/dist/programs/arrowfield/object.js +66 -0
  64. package/dist/programs/data2legend/density-to-legend.js +101 -0
  65. package/dist/programs/data2legend/point-to-density-texture.js +100 -0
  66. package/dist/programs/float2legendwithratio/index.js +8 -0
  67. package/dist/programs/float2legendwithratio/logic.js +171 -0
  68. package/dist/programs/float2legendwithratio/object.js +110 -0
  69. package/dist/programs/globe-util/is-globe-moved.js +21 -0
  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/dist/programs/globeshell/wiggle/logic.js +345 -0
  74. package/dist/programs/globeshell/wiggle/object.js +72 -0
  75. package/dist/programs/helpers/blender/index.js +1 -0
  76. package/dist/programs/helpers/blender/program.js +79 -0
  77. package/dist/programs/helpers/fadeaway/index.js +7 -0
  78. package/dist/programs/helpers/fadeaway/logic.js +72 -0
  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/dist/programs/line-on-globe/angled-line.js +176 -0
  84. package/dist/programs/line-on-globe/circle-accurate-3d.js +141 -0
  85. package/dist/programs/line-on-globe/circle-accurate-flat.js +216 -0
  86. package/dist/programs/line-on-globe/circle-accurate.js +178 -0
  87. package/dist/programs/line-on-globe/circle.js +167 -0
  88. package/dist/programs/line-on-globe/degree-padding-around-circle-3d.js +159 -0
  89. package/dist/programs/line-on-globe/index.js +1 -0
  90. package/dist/programs/line-on-globe/lines-color-instanced-flat.js +136 -0
  91. package/dist/programs/line-on-globe/linestrip.js +171 -0
  92. package/dist/programs/line-on-globe/naive-accurate-flexible.js +195 -0
  93. package/dist/programs/line-on-globe/to-the-surface.js +111 -0
  94. package/dist/programs/line-on-globe/util.js +8 -0
  95. package/dist/programs/picking/pickable-renderer.js +188 -0
  96. package/dist/programs/point-on-globe/element-globe-surface-glow.js +142 -0
  97. package/dist/programs/point-on-globe/element-point-glow.js +153 -0
  98. package/dist/programs/point-on-globe/square-pixel-point.js +174 -0
  99. package/dist/programs/programcache.js +131 -0
  100. package/dist/programs/rings/distancering/circleflatprogram.js +156 -0
  101. package/dist/programs/rings/distancering/circlepaddingfreeangleprogram.js +369 -0
  102. package/dist/programs/rings/distancering/circlepaddysharedbuffer.js +357 -0
  103. package/dist/programs/rings/distancering/index.js +14 -0
  104. package/dist/programs/rings/distancering/paddyflatprogram.js +172 -0
  105. package/dist/programs/rings/distancering/paddyflatprogram2d.js +174 -0
  106. package/dist/programs/rings/distancering/paddyflatprogram3d.js +172 -0
  107. package/dist/programs/rings/distancering/shader.js +1 -0
  108. package/dist/programs/rings/index.js +17 -0
  109. package/dist/programs/rings/partial-ring/piece-of-pie.js +275 -0
  110. package/dist/programs/totems/camerauniformblock.js +160 -0
  111. package/dist/programs/totems/canvas-webglobe-info.js +110 -0
  112. package/dist/programs/totems/gpu-selection-uniform-block.js +108 -0
  113. package/dist/programs/totems/index.js +40 -0
  114. package/dist/programs/two-d/pixel-circle.js +1 -0
  115. package/dist/programs/two-d/pixel-padding-for-compass.js +162 -0
  116. package/dist/programs/util.js +17 -0
  117. package/dist/programs/vectorfields/index.js +23 -0
  118. package/dist/programs/vectorfields/logics/drawrectangleparticles.js +107 -0
  119. package/dist/programs/vectorfields/logics/index.js +12 -0
  120. package/dist/programs/vectorfields/logics/pixelbased.js +142 -0
  121. package/dist/programs/vectorfields/logics/ubo.js +63 -0
  122. package/dist/programs/vectorfields/pingpongbuffermanager.js +76 -0
  123. package/dist/rangerings/enum.js +5 -0
  124. package/dist/rangerings/index.js +15 -0
  125. package/dist/rangerings/plugin.js +560 -0
  126. package/dist/rangerings/rangeringangletext.js +329 -0
  127. package/dist/rangerings/ring-account.js +117 -0
  128. package/dist/shaders/fragment-toy/firework.js +58 -0
  129. package/dist/shaders/fragment-toy/singularity.js +59 -0
  130. package/dist/shape-on-terrain/arc/naive/plugin.js +252 -0
  131. package/dist/timetracks/adaptors-line-strip.js +71 -0
  132. package/dist/timetracks/adaptors.js +122 -0
  133. package/dist/timetracks/index.js +19 -0
  134. package/dist/timetracks/plugin-line-strip.js +250 -0
  135. package/dist/timetracks/plugin.js +258 -0
  136. package/dist/timetracks/program-line-strip.js +611 -0
  137. package/dist/timetracks/program.js +772 -0
  138. package/dist/timetracks/programpoint-line-strip.js +154 -0
  139. package/dist/timetracks/programpoint.js +147 -0
  140. package/dist/types.js +15 -0
  141. package/dist/util/account/bufferoffsetmanager.js +179 -0
  142. package/dist/util/account/index.js +23 -0
  143. package/dist/util/account/single-attribute-buffer-management/buffer-manager.js +108 -0
  144. package/dist/util/account/single-attribute-buffer-management/buffer-orchestrator.js +150 -0
  145. package/dist/util/account/single-attribute-buffer-management/index.js +9 -0
  146. package/dist/util/account/single-attribute-buffer-management/object-store.js +51 -0
  147. package/dist/util/account/single-attribute-buffer-management/types.js +2 -0
  148. package/dist/util/account/util.js +22 -0
  149. package/dist/util/algorithms/index.js +1 -0
  150. package/dist/util/algorithms/search-binary.js +28 -0
  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/dist/util/geometry/index.js +51 -0
  155. package/dist/util/gl-util/buffer/attribute-loader.js +69 -0
  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/dist/util/gl-util/uniform-block/manager.js +156 -0
  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/dist/util/heatwavedatamanager/datamanager.js +152 -0
  164. package/dist/util/heatwavedatamanager/index.js +10 -0
  165. package/dist/util/heatwavedatamanager/pointcoordinatesdatacalculator.js +122 -0
  166. package/dist/util/heatwavedatamanager/pointcoordsmeta.js +20 -0
  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/dist/util/interpolation/timetrack/timetrack-interpolator.js +79 -0
  171. package/dist/util/interpolation/timetrack/web-worker-str.js +183 -0
  172. package/dist/util/interpolation/timetrack/web-worker.js +48 -0
  173. package/dist/util/jshelpers/data-filler.js +20 -0
  174. package/dist/util/jshelpers/equality.js +20 -0
  175. package/dist/util/jshelpers/index.js +37 -0
  176. package/dist/util/jshelpers/timefilters.js +32 -0
  177. package/dist/util/picking/fence.js +46 -0
  178. package/dist/util/picking/picker-displayer.js +139 -0
  179. package/dist/util/programs/draw-texture-on-canvas.js +89 -0
  180. package/dist/util/programs/index.js +17 -0
  181. package/dist/util/programs/shapesonglobe.js +214 -0
  182. package/dist/util/programs/supersampletotextures.js +113 -0
  183. package/dist/util/programs/texturetoglobe.js +182 -0
  184. package/dist/util/shaderfunctions/geometrytransformations.js +340 -0
  185. package/dist/util/shaderfunctions/index.js +18 -0
  186. package/dist/util/shaderfunctions/nodata.js +11 -0
  187. package/dist/util/shaderfunctions/noisefunctions.js +43 -0
  188. package/dist/util/surface-line-data/arc-bboxes.js +25 -0
  189. package/dist/util/surface-line-data/arcs-to-cuts.js +50 -0
  190. package/dist/util/surface-line-data/cut-arc.js +1 -0
  191. package/dist/util/surface-line-data/flow.js +28 -0
  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/dist/util/webglobe/rasteroverlay.js +78 -0
  198. package/dist/util/webglobjectbuilders.js +388 -0
  199. package/dist/util/webglobjectbuilders1.js +237 -0
  200. package/dist/waveparticles/adaptor.js +17 -0
  201. package/dist/waveparticles/index.js +10 -0
  202. package/dist/waveparticles/plugin.js +266 -0
  203. package/dist/wind/imagetovectorfieldandmagnitude.js +35 -0
  204. package/dist/wind/index.js +14 -0
  205. package/dist/wind/plugin.js +926 -0
  206. package/dist/wind/vectorfieldimage.js +25 -0
  207. package/dist/write-text/attached-text-writer.js +91 -0
  208. package/dist/write-text/context-text.js +98 -0
  209. package/dist/write-text/context-text3.js +155 -0
  210. package/dist/write-text/index.js +5 -0
  211. package/dist/write-text/writer-plugin.js +8 -0
  212. package/package.json +1 -1
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * @typedef {Float32Array} TimeTrackMultiColorData | A linestring is representation, let A{a1, a2, a3}, B{b1, b2} be the points of the line.
4
+ * TimeTrackMultiColorData is [
5
+ * a1x, a1y, a1z, a1time, a1r, a1g, a1b, a1time, a3time,
6
+ * a2x, a2y, a2z, a2time, a2r, a2g, a2b, a1time, a3time,
7
+ * a3x, a3y, a3z, a3time, a3r, a3g, a3b, a1time, a3time,
8
+ * 0, 0, 0, 0, -1, -1, -1, 0, 0,
9
+ * b1x, b1y, b1z, b1time, b1r, b1g, b1b, b1time, b2time,
10
+ * b2x, b2y, b2z, b2time, b2r, b2g, b2b, BstartTime, BendTime
11
+ * ]
12
+ * there is a cutting point between A and B
13
+ *
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.timeTrackPluginDataToPointHeatInterpolatorAdapter = void 0;
17
+ /**
18
+ * ABOVE
19
+ * TO
20
+ * BELOW
21
+
22
+ /**
23
+ * @typedef {Array<number>} vec3 [x, y, z]
24
+ * @typedef {Array<number>} vec2 [x, y]
25
+ * @typedef {Array<number>} vec4 [x, y, z, w]
26
+ * @typedef {number} fraction a number between 0 and 1
27
+ * @typedef {Array<number>} wgs84 [long, lat]
28
+ */
29
+ /**
30
+ * @typedef Timetrack
31
+ * @property {Array<vec4>}} coordinates [x,y,z, length]
32
+ * @property {Array<Number>} times
33
+ * @param {Array<Timetrack>} timeTracks
34
+ */
35
+ const methods_1 = require("../../Math/methods");
36
+ const processACut = (array, offset) => {
37
+ // first 3 values of array
38
+ const v3 = array.slice(offset, offset + 3);
39
+ const v4 = (0, methods_1.pixelXYLenghtToUnitVectorWithHeight)(v3);
40
+ const time = array[offset + 3];
41
+ return [v4, time];
42
+ };
43
+ const timeTrackPluginDataToPointHeatInterpolatorAdapter = (timeTrackPluginData) => {
44
+ const timeTracks = [];
45
+ let offset = 0;
46
+ let timeTrack = {
47
+ coordinates: [],
48
+ times: []
49
+ };
50
+ while (offset < timeTrackPluginData.length) {
51
+ if (!timeTrackPluginData[offset]) {
52
+ timeTracks.push(timeTrack);
53
+ timeTrack = {
54
+ coordinates: [],
55
+ times: []
56
+ };
57
+ offset += 9;
58
+ }
59
+ const point = processACut(timeTrackPluginData, offset);
60
+ offset += 9;
61
+ timeTrack.coordinates.push(point[0]);
62
+ timeTrack.times.push(point[1]);
63
+ }
64
+ return timeTracks;
65
+ };
66
+ exports.timeTrackPluginDataToPointHeatInterpolatorAdapter = timeTrackPluginDataToPointHeatInterpolatorAdapter;
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PointHeatmapPlugin = void 0;
4
+ const point_to_heat_map_flow_1 = require("./point-to-heat-map-flow");
5
+ // import { webworkerStr } from "../util/interpolation/timetrack/web-worker-str"; // TODO: Delete When this plugin is tested on production
6
+ const index_1 = require("../util/interpolation/timetrack/index");
7
+ const util_1 = require("../util");
8
+ const typecheck_1 = require("../util/check/typecheck");
9
+ class PointHeatmapPlugin {
10
+ constructor(id, { opacity = 1.0, pointSize = 5.0, onInterpolationComplete = () => { } } = {}) {
11
+ this.id = id;
12
+ this.globe = null;
13
+ this.gl = null;
14
+ this.densityToLegendProgram = null;
15
+ this._time = null;
16
+ this._opacity = opacity;
17
+ this._pointSize = pointSize;
18
+ this._legendTexture = null;
19
+ this._throttleListener = null;
20
+ this._timeTracksAreSet = false;
21
+ // const blob = new Blob([webworkerStr], { type: 'application/javascript' });
22
+ // this.timeTrackInterpolationWorker = new Worker(URL.createObjectURL(blob), { type: 'module' });
23
+ this.timeTrackInterpolationWorker = (0, index_1.createWorker)();
24
+ this.timeTrackInterpolationWorker.onmessage = (e) => {
25
+ if (e.data.error) {
26
+ throw new Error(e.data.error);
27
+ }
28
+ if (e.data === true) {
29
+ onInterpolationComplete();
30
+ }
31
+ if (e.data instanceof Float32Array) {
32
+ this.flow.setData(e.data);
33
+ this._throttleListener = null;
34
+ onInterpolationComplete();
35
+ }
36
+ };
37
+ }
38
+ // globe interaction
39
+ init(globe, gl) {
40
+ this.globe = globe;
41
+ this.gl = gl;
42
+ this.flow = new point_to_heat_map_flow_1.PointHeatmapFlow(globe);
43
+ this.setGeometry();
44
+ this.resize();
45
+ }
46
+ setPointSize(pointSize) {
47
+ (0, typecheck_1.constraintFloat)(pointSize, 1);
48
+ this._pointSize = pointSize;
49
+ this.globe.DrawRender();
50
+ }
51
+ /**
52
+ * @param {Array<string>}
53
+ * @param {string} mode "interpolated" | "discrete"
54
+ */
55
+ setColorRamp(values, thresholds, mode = "interpolated") {
56
+ const gl = this.gl;
57
+ if (this.gl === null) {
58
+ throw new Error('Plugin not initialized');
59
+ }
60
+ ;
61
+ const rampData = (0, util_1.getColorRampModed)(values, thresholds, mode);
62
+ const texture = (0, util_1.createTexture)(gl, gl.LINEAR, rampData, 256, 1);
63
+ if (this._legendTexture) {
64
+ this.gl.deleteTexture(this._legendTexture);
65
+ }
66
+ this._legendTexture = texture;
67
+ this.globe.DrawRender();
68
+ }
69
+ setTime(time) {
70
+ // TODO: WORK ON THIS
71
+ this._time = time;
72
+ if (this.isReady() && this._throttleListener === null) {
73
+ this._throttleListener = setTimeout(() => {
74
+ this.timeTrackInterpolationWorker.postMessage({ time: this._time });
75
+ }, 0);
76
+ }
77
+ }
78
+ setTimetracks(timeTracks) {
79
+ this._timeTracksAreSet = true;
80
+ this.timeTrackInterpolationWorker.postMessage({ timeTracks });
81
+ if (this._time !== null) {
82
+ this.setTime(this._time);
83
+ }
84
+ this.globe.DrawRender();
85
+ }
86
+ setOpacity(opacity) {
87
+ (0, typecheck_1.opacityCheck)(opacity);
88
+ this._opacity = opacity;
89
+ this.globe.DrawRender();
90
+ }
91
+ setGeometry() {
92
+ const geometry = this.globe.api_GetCurrentGeometry();
93
+ this.timeTrackInterpolationWorker.postMessage({ geometry });
94
+ if (this._time !== null) {
95
+ this.setTime(this._time);
96
+ }
97
+ }
98
+ draw3D() {
99
+ if (this.isReady()) {
100
+ this.flow.draw(this._legendTexture, this._pointSize, this._opacity);
101
+ }
102
+ }
103
+ resize() {
104
+ this.flow.resize();
105
+ if (this._time !== null) {
106
+ this.setTime(this._time);
107
+ }
108
+ }
109
+ isReady() {
110
+ return (this.gl !== null && this._legendTexture !== null && this._timeTracksAreSet);
111
+ }
112
+ free() {
113
+ if (this._isFreed)
114
+ return;
115
+ this.gl.deleteTexture(this._legendTexture);
116
+ this.flow.free();
117
+ this.flow = null;
118
+ this.gl = null;
119
+ this._isFreed = true;
120
+ this.timeTrackInterpolator = null;
121
+ this._legendTexture = null;
122
+ this.timeTrackInterpolationWorker.terminate();
123
+ this.timeTrackInterpolationWorker = null;
124
+ }
125
+ }
126
+ exports.PointHeatmapPlugin = PointHeatmapPlugin;
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PointHeatmapFlow = void 0;
4
+ const density_to_legend_1 = require("../programs/data2legend/density-to-legend");
5
+ const point_to_density_texture_1 = require("../programs/data2legend/point-to-density-texture");
6
+ // import { textureOnCanvasProgramCache } from "../util/programs/draw-texture-on-canvas";
7
+ const gldefaultstates_1 = require("../util/webglobe/gldefaultstates");
8
+ class PointHeatmapFlow {
9
+ constructor(globe) {
10
+ this.globe = null;
11
+ this.gl = null;
12
+ this.program = null;
13
+ this.densityToLegendProgram = null;
14
+ this.globe = globe;
15
+ this.gl = globe.gl;
16
+ this.pointToDensityProgram = point_to_density_texture_1.pointToDensityTextureCache.get(globe);
17
+ this.densityToLegendProgram = density_to_legend_1.densityToLegendProgramCache.get(globe);
18
+ // this.testTextureProgram = textureOnCanvasProgramCache.get(globe.gl);
19
+ this._lookInfo = globe.api_GetCurrentLookInfo();
20
+ const { gl } = this;
21
+ {
22
+ this.buffer = gl.createBuffer();
23
+ this.vao2D = this.pointToDensityProgram.createVAO(this.buffer, 2);
24
+ this.vao3D = this.pointToDensityProgram.createVAO(this.buffer, 3);
25
+ }
26
+ { // framebuffer and texture
27
+ this.framebuffer = gl.createFramebuffer();
28
+ this.densityTexture = this._createDensityTexture();
29
+ this._bindTextureToFramebuffer();
30
+ }
31
+ }
32
+ _bindTextureToFramebuffer() {
33
+ const { gl, densityTexture, framebuffer } = this;
34
+ gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
35
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, densityTexture, 0);
36
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
37
+ }
38
+ draw(legendTexture, pointSize, opacity = 1.0) {
39
+ const { gl, globe, framebuffer } = this;
40
+ if (this._drawDensityRequired || this._isVisionChanged()) {
41
+ gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
42
+ gl.clearColor(0, 0, 0, 0);
43
+ gl.viewport(0, 0, Math.floor(globe.api_ScrW()), Math.floor(globe.api_ScrH()));
44
+ gl.clear(gl.COLOR_BUFFER_BIT);
45
+ this._drawDensity(pointSize);
46
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
47
+ }
48
+ (0, gldefaultstates_1.defaultblendfunction)(gl);
49
+ this._drawLegend(legendTexture, opacity);
50
+ }
51
+ resize() {
52
+ const { gl, densityTexture } = this;
53
+ gl.deleteTexture(densityTexture);
54
+ this.densityTexture = this._createDensityTexture();
55
+ this._bindTextureToFramebuffer();
56
+ this._drawDensityRequired = true;
57
+ }
58
+ // USER API
59
+ /**
60
+ * @param {Float32Array} data
61
+ * @format [x, y, z, height] x,y,z is normalized 3d cartesian coordinates. Height in kilometers. Set 6378.137 for ground level.
62
+ */
63
+ setData(data) {
64
+ const { gl, buffer } = this;
65
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
66
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
67
+ // use program
68
+ this.dataLength = data.length;
69
+ this._drawDensityRequired = true;
70
+ this.globe.DrawRender();
71
+ }
72
+ // implicit Methods
73
+ _createDensityTexture() {
74
+ const { gl, globe } = this;
75
+ const width = Math.floor(globe.api_ScrW());
76
+ const height = Math.floor(globe.api_ScrH());
77
+ const texture = gl.createTexture();
78
+ gl.bindTexture(gl.TEXTURE_2D, texture);
79
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
80
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
81
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
82
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
83
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
84
+ return texture;
85
+ }
86
+ _drawDensity(pointSize) {
87
+ const { gl, globe, pointToDensityProgram, vao2D, vao3D, dataLength } = this;
88
+ const is3D = globe.api_GetCurrentGeometry() === 0;
89
+ const vao = is3D ? vao3D : vao2D;
90
+ const length = dataLength / (is3D ? 3 : 2);
91
+ gl.blendEquation(gl.FUNC_ADD);
92
+ gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE, gl.SRC_ALPHA, gl.ONE);
93
+ pointToDensityProgram.draw(vao, length, pointSize);
94
+ this._drawDensityRequired = false;
95
+ }
96
+ _drawLegend(legendTexture, opacity) {
97
+ const { densityToLegendProgram, densityTexture } = this;
98
+ densityToLegendProgram.draw(densityTexture, legendTexture, opacity);
99
+ }
100
+ _isVisionChanged() {
101
+ const currentLookInfo = this.globe.api_GetCurrentLookInfo();
102
+ const _lookInfo = this._lookInfo;
103
+ if (currentLookInfo.CenterLong !== _lookInfo.CenterLong ||
104
+ currentLookInfo.CenterLat !== _lookInfo.CenterLat ||
105
+ currentLookInfo.Distance !== _lookInfo.Distance ||
106
+ currentLookInfo.Tilt !== _lookInfo.Tilt ||
107
+ currentLookInfo.NorthAng !== _lookInfo.NorthAng) {
108
+ this._lookInfo = currentLookInfo;
109
+ return true;
110
+ }
111
+ return false;
112
+ }
113
+ free() {
114
+ if (this._isFreed)
115
+ return;
116
+ this._isFreed = true;
117
+ density_to_legend_1.densityToLegendProgramCache.release(this.globe);
118
+ point_to_density_texture_1.pointToDensityTextureCache.release(this.globe);
119
+ // textureOnCanvasProgramCache.release(this.gl);
120
+ this.gl.deleteTexture(this.densityTexture);
121
+ this.gl.deleteFramebuffer(this.framebuffer);
122
+ this.gl.deleteBuffer(this.buffer);
123
+ this.gl.deleteVertexArray(this.vao2D);
124
+ this.gl.deleteVertexArray(this.vao3D);
125
+ }
126
+ }
127
+ exports.PointHeatmapFlow = PointHeatmapFlow;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pointKeyMeyhod = void 0;
4
+ const pointKeyMeyhod = (trackId, pointID) => `${trackId}-${pointID}`;
5
+ exports.pointKeyMeyhod = pointKeyMeyhod;
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.keyMethod = exports.PointTracksPlugin = void 0;
4
+ const account_1 = require("../util/account");
5
+ const picker_displayer_1 = require("../util/picking/picker-displayer");
6
+ const square_pixel_point_1 = require("../programs/point-on-globe/square-pixel-point");
7
+ const methods_1 = require("../Math/methods");
8
+ /**
9
+ * @typedef {number} long
10
+ * @typedef {number} lat
11
+ * @typedef {number} height
12
+ * @typedef {string} ID
13
+ * @typedef {string} trackID
14
+ * @typedef {[number, number, number, number]} rgba 0-1
15
+ * @typedef { long ,lat, height, ID } Point
16
+ * @typedef {Array<Point>, rgba, trackID} Track
17
+ */
18
+ class PointTracksPlugin {
19
+ constructor(id, { pointSize = 2, hoveredPointSize = 4, selectionPointFilling = 4, opacity = 1.0 } = {}) {
20
+ this.id = id;
21
+ this._isFreed = false;
22
+ this._pointProgram = null;
23
+ this._vao = null;
24
+ this._bufferManagersMap = null;
25
+ this._bufferOrchestrator = null;
26
+ this._pickerDisplayer = null;
27
+ this._selectedID = -1;
28
+ this._selectedObj = null;
29
+ this._tracksToPointsMap = new Map(); // one to many
30
+ this._opacity = opacity;
31
+ this.program = null;
32
+ this._lastWH = { w: 0, h: 0 };
33
+ this._focusParams = { on: false, length: 0, elementBuffer: null, trackIDs: [] };
34
+ this.pointSizes = {
35
+ pointSize,
36
+ selectionPointFilling,
37
+ hoveredPointSize
38
+ };
39
+ }
40
+ init(globe, gl) {
41
+ this.globe = globe;
42
+ this.gl = gl;
43
+ this._pickerDisplayer = new picker_displayer_1.PickerDisplayer(globe);
44
+ this._pointProgram = square_pixel_point_1.PointOnGlobeProgramCache.get(globe);
45
+ this._focusParams.elementBuffer = gl.createBuffer();
46
+ this._initBufferManagers();
47
+ }
48
+ _initBufferManagers() {
49
+ const { gl } = this;
50
+ const initialCapacity = 10;
51
+ const bufferType = "DYNAMIC_DRAW";
52
+ this._bufferOrchestrator = new account_1.BufferOrchestrator({ initialCapacity });
53
+ this._bufferManagersMap = new Map([
54
+ ["pos3D", {
55
+ bufferManager: new account_1.BufferManager(gl, 3, { bufferType, initialCapacity }),
56
+ adaptor: (item) => new Float32Array((0, methods_1.wgs84ToCartesian3d)(item.long, item.lat, item.height / 1000)) // height is in meters
57
+ }],
58
+ ["pos2D", {
59
+ bufferManager: new account_1.BufferManager(gl, 2, { bufferType, initialCapacity }),
60
+ adaptor: (item) => new Float32Array((0, methods_1.wgs84ToMercator)(item.long, item.lat))
61
+ }],
62
+ ["rgba", {
63
+ bufferManager: new account_1.BufferManager(gl, 4, { bufferType, initialCapacity }),
64
+ adaptor: (item) => item.rgba
65
+ }],
66
+ ["objectStore", {
67
+ bufferManager: new account_1.ObjectStore({ initialCapacity }),
68
+ adaptor: (item) => {
69
+ return {
70
+ trackID: item.trackID, pointID: item.pointID
71
+ };
72
+ }
73
+ }]
74
+ ]);
75
+ this._vao = this._pointProgram.createVAO(this._bufferManagersMap.get("pos3D").bufferManager.buffer, this._bufferManagersMap.get("pos2D").bufferManager.buffer, this._bufferManagersMap.get("rgba").bufferManager.buffer);
76
+ }
77
+ setPointSize(size) {
78
+ var _a;
79
+ this.pointSizes.pointSize = size;
80
+ (_a = this.globe) === null || _a === void 0 ? void 0 : _a.DrawRender();
81
+ }
82
+ setSelectionPointFilling(size) {
83
+ var _a;
84
+ this.pointSizes.selectionPointFilling = size;
85
+ (_a = this.globe) === null || _a === void 0 ? void 0 : _a.DrawRender();
86
+ }
87
+ setHoveredPointSize(size) {
88
+ var _a;
89
+ this.pointSizes.hoveredPointSize = size;
90
+ (_a = this.globe) === null || _a === void 0 ? void 0 : _a.DrawRender();
91
+ }
92
+ setOpacity(opacity) {
93
+ var _a;
94
+ if (opacity < 0 || opacity > 1)
95
+ return;
96
+ this._opacity = opacity;
97
+ (_a = this.globe) === null || _a === void 0 ? void 0 : _a.DrawRender();
98
+ }
99
+ getCurrentSelection() {
100
+ return this._selectedObj;
101
+ }
102
+ /**
103
+ *
104
+ * @param {*} x screen x
105
+ * @param {*} y screen y
106
+ * @param {*} callback callback on selection
107
+ */
108
+ screenSelection(x, y, callback) {
109
+ const { pointSizes, _pickerDisplayer } = this;
110
+ const objectStore = this._bufferManagersMap.get("objectStore").bufferManager;
111
+ const wrapper = (selectedIDsSet) => {
112
+ const selectedIDs = Array.from(selectedIDsSet);
113
+ if (selectedIDs.length === 0) {
114
+ this._selectedObj = null;
115
+ this._selectedID = -1;
116
+ callback([]);
117
+ return;
118
+ }
119
+ const selectedPoints = [];
120
+ for (let i = 0; i < selectedIDs.length; i++) {
121
+ const id = selectedIDs[i];
122
+ if (i === 0) {
123
+ this._selectedID = id;
124
+ this._selectedObj = objectStore.get(id);
125
+ }
126
+ const obj = objectStore.get(id);
127
+ selectedPoints.push(obj);
128
+ }
129
+ callback(selectedPoints);
130
+ };
131
+ _pickerDisplayer.pickXY(x, y, pointSizes.selectionPointFilling, wrapper);
132
+ }
133
+ /**
134
+ * @param {Array<Track>} tracks
135
+ * @returns
136
+ */
137
+ insertBulk(tracks) {
138
+ var _a;
139
+ this._fillTracksToPointsMap(tracks); // TODO error should be at the top
140
+ const flattenedPoints = tracks.map(trackToFlatPoints).flat();
141
+ const currentLoad = this._bufferOrchestrator.length;
142
+ if (currentLoad + flattenedPoints.length >= 2147483647) {
143
+ throw new Error("Too many points, Point count cannot exceed 2147483647");
144
+ }
145
+ const { _bufferManagersMap, _bufferOrchestrator } = this;
146
+ _bufferOrchestrator.insertBulk(flattenedPoints, _bufferManagersMap);
147
+ this._refillFocus();
148
+ (_a = this.globe) === null || _a === void 0 ? void 0 : _a.DrawRender();
149
+ }
150
+ flush() {
151
+ var _a, _b;
152
+ const capacity = 100;
153
+ (_a = this._bufferOrchestrator) === null || _a === void 0 ? void 0 : _a.flush({ capacity });
154
+ this._bufferManagersMap.forEach(({ bufferManager }) => bufferManager.resetWithCapacity(capacity));
155
+ this._turnOffFocus();
156
+ this._tracksToPointsMap.clear();
157
+ (_b = this.globe) === null || _b === void 0 ? void 0 : _b.DrawRender();
158
+ }
159
+ /**
160
+ * @param {string} trackID
161
+ */
162
+ deleteTrack(trackID) {
163
+ var _a;
164
+ const pointSet = this._tracksToPointsMap.get(trackID);
165
+ const points = Array.from(pointSet);
166
+ const { _bufferOrchestrator, _bufferManagersMap } = this;
167
+ _bufferOrchestrator.deleteBulk(points.map((pointID) => keyMethod(trackID, pointID)), _bufferManagersMap);
168
+ this._tracksToPointsMap.delete(trackID);
169
+ this._redraw = true;
170
+ this._refillFocus();
171
+ (_a = this.globe) === null || _a === void 0 ? void 0 : _a.DrawRender();
172
+ }
173
+ /**
174
+ * @param {string} trackID
175
+ * @param {Array<string>} pointIDs
176
+ */
177
+ deletePoints(trackID, pointIDs) {
178
+ var _a;
179
+ const { _bufferOrchestrator, _bufferManagersMap } = this;
180
+ _bufferOrchestrator.deleteBulk(pointIDs.map((pointID) => keyMethod(trackID, pointID)), _bufferManagersMap);
181
+ this._deletePointsFromTracksMap(trackID, pointIDs);
182
+ this._refillFocus();
183
+ (_a = this.globe) === null || _a === void 0 ? void 0 : _a.DrawRender();
184
+ }
185
+ focusTracks(trackIDs = null) {
186
+ var _a;
187
+ if (!this.globe)
188
+ return;
189
+ if (!trackIDs) {
190
+ this._focusParams.on = false;
191
+ (_a = this.globe) === null || _a === void 0 ? void 0 : _a.DrawRender();
192
+ return;
193
+ }
194
+ this._focusParams.on = this._fillElementBuffer(trackIDs);
195
+ if (!this._focusParams.on) {
196
+ this._turnOffFocus();
197
+ }
198
+ this.globe.DrawRender();
199
+ }
200
+ // GLOBE API METHODS
201
+ free() {
202
+ if (this._isFreed)
203
+ return;
204
+ this._isFreed = true;
205
+ this._pickerDisplayer.free();
206
+ square_pixel_point_1.PointOnGlobeProgramCache.release(this.globe);
207
+ this.gl.deleteBuffer(this._focusParams.elementBuffer);
208
+ this._bufferManagersMap.forEach(({ bufferManager, adaptor }) => bufferManager.free());
209
+ }
210
+ draw3D() {
211
+ const { gl, _pointProgram, _pickerDisplayer, _bufferOrchestrator, _vao } = this;
212
+ this.resize();
213
+ _pickerDisplayer.bindFBO();
214
+ _pickerDisplayer.clearTextures();
215
+ if (this._focusParams.on) {
216
+ _pointProgram.draw(_vao, this._focusParams.length, {
217
+ hoveredID: this._selectedID,
218
+ opacity: this._opacity,
219
+ pointSize: this.pointSizes.pointSize,
220
+ hoveredPointSize: this.pointSizes.hoveredPointSize,
221
+ elementBuffer: this._focusParams.elementBuffer
222
+ });
223
+ }
224
+ else {
225
+ _pointProgram.draw(_vao, _bufferOrchestrator.length, {
226
+ hoveredID: this._selectedID,
227
+ opacity: this._opacity,
228
+ pointSize: this.pointSizes.pointSize,
229
+ hoveredPointSize: this.pointSizes.hoveredPointSize
230
+ });
231
+ }
232
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
233
+ _pickerDisplayer.drawColorTexture();
234
+ this._selfSelect();
235
+ }
236
+ resize() {
237
+ var _a;
238
+ const w = this.globe.api_ScrW();
239
+ const h = this.globe.api_ScrH();
240
+ if (w === this._lastWH.w && h === this._lastWH.h)
241
+ return;
242
+ this._lastWH.w = w;
243
+ this._lastWH.h = h;
244
+ this._pickerDisplayer.resize();
245
+ (_a = this.globe) === null || _a === void 0 ? void 0 : _a.DrawRender();
246
+ }
247
+ // IMPLICIT METHODS
248
+ _fillTracksToPointsMap(tracks) {
249
+ for (const track of tracks) {
250
+ const trackID = track.trackID;
251
+ const points = track.points;
252
+ if (!this._tracksToPointsMap.has(trackID)) {
253
+ this._tracksToPointsMap.set(trackID, new Set());
254
+ }
255
+ const pointSet = this._tracksToPointsMap.get(trackID);
256
+ for (let p = 0; p < points.length; p++) {
257
+ const pointID = points[p].ID;
258
+ pointSet.add(pointID);
259
+ }
260
+ }
261
+ }
262
+ _refillFocus() {
263
+ if (this._focusParams.on) {
264
+ this.focusTracks(this._focusParams.trackIDs);
265
+ }
266
+ }
267
+ _deletePointsFromTracksMap(trackID, pointIDs) {
268
+ const trackSet = this._tracksToPointsMap.get(trackID);
269
+ for (const pointID of pointIDs) {
270
+ trackSet.delete(pointID);
271
+ }
272
+ }
273
+ _selfSelect() {
274
+ const { globe } = this;
275
+ const pos = globe.api_GetMousePos();
276
+ const x = pos.canvasX;
277
+ const y = globe.api_ScrH() - pos.canvasY;
278
+ this.screenSelection(x, y, (selectedPoints) => {
279
+ });
280
+ }
281
+ _turnOffFocus() {
282
+ const { gl } = this;
283
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._focusParams.elementBuffer);
284
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array([]), gl.STATIC_DRAW);
285
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
286
+ this._focusParams.length = 0;
287
+ this._focusParams.on = false;
288
+ }
289
+ _fillElementBuffer(trackIDs) {
290
+ let length = 0;
291
+ const indexes = [];
292
+ const foundTracks = [];
293
+ for (const trackID of trackIDs) {
294
+ const pointSet = this._tracksToPointsMap.get(trackID);
295
+ if (!pointSet)
296
+ continue;
297
+ foundTracks.push(trackID);
298
+ const points = Array.from(pointSet);
299
+ for (const pointID of points) {
300
+ const key = keyMethod(trackID, pointID);
301
+ const index = this._bufferOrchestrator.offsetMap.get(key);
302
+ indexes.push(index);
303
+ length++;
304
+ }
305
+ }
306
+ this._focusParams.trackIDs = foundTracks;
307
+ this._focusParams.length = length;
308
+ if (length === 0) {
309
+ return false;
310
+ }
311
+ const { gl } = this;
312
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._focusParams.elementBuffer);
313
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(indexes), gl.STATIC_DRAW);
314
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
315
+ return true;
316
+ }
317
+ }
318
+ exports.PointTracksPlugin = PointTracksPlugin;
319
+ const trackToFlatPoints = (track) => {
320
+ const trackID = track.trackID;
321
+ const points = track.points;
322
+ const rgba = new Float32Array(track.rgba);
323
+ const flatPoints = [];
324
+ for (const point of points) {
325
+ flatPoints.push({
326
+ key: keyMethod(trackID, point.ID),
327
+ long: point.long,
328
+ lat: point.lat,
329
+ height: point.height,
330
+ pointID: point.ID,
331
+ rgba,
332
+ trackID
333
+ });
334
+ }
335
+ return flatPoints;
336
+ };
337
+ const keyMethod = (trackID, pointID) => `${trackID}_${pointID}`;
338
+ exports.keyMethod = keyMethod;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const object_1 = __importDefault(require("./object"));
7
+ exports.default = object_1.default;