@pirireis/webglobeplugins 0.8.5 → 0.8.7

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 (61) hide show
  1. package/bearing-line/plugin.js +51 -43
  2. package/circle-line-chain/plugin.js +52 -44
  3. package/compass-rose/compass-rose-padding-flat.js +3 -0
  4. package/compassrose/compassrose.js +1 -8
  5. package/heatwave/isobar/plugin.js +4 -1
  6. package/heatwave/isobar/quadtreecontours.js +0 -2
  7. package/heatwave/plugins/heatwaveglobeshell.js +2 -0
  8. package/package.json +1 -1
  9. package/partialrings/goals.md +2 -0
  10. package/partialrings/plugin.js +2 -1
  11. package/point-glow-line-to-earth/draw-subset-obj.js +27 -0
  12. package/point-glow-line-to-earth/keymethod.js +0 -0
  13. package/point-glow-line-to-earth/plugin.js +439 -0
  14. package/point-glow-line-to-earth/types.js +26 -0
  15. package/point-heat-map/index.js +0 -3
  16. package/point-heat-map/plugin-webworker.js +4 -9
  17. package/point-heat-map/point-to-heat-map-flow.js +0 -6
  18. package/point-tracks/plugin.js +42 -17
  19. package/programs/arrowfield/logic.js +6 -4
  20. package/programs/arrowfield/object.js +1 -1
  21. package/programs/float2legendwithratio/object.js +5 -4
  22. package/programs/globe-util/is-globe-moved.js +27 -0
  23. package/programs/globeshell/wiggle/logic.js +3 -7
  24. package/programs/globeshell/wiggle/object.js +1 -2
  25. package/programs/line-on-globe/circle-accurate-3d.js +16 -23
  26. package/programs/line-on-globe/circle-accurate-flat.js +21 -21
  27. package/programs/line-on-globe/lines-color-instanced-flat.js +6 -7
  28. package/programs/line-on-globe/naive-accurate-flexible.js +239 -0
  29. package/programs/line-on-globe/to-the-surface.js +129 -0
  30. package/programs/picking/pickable-renderer.js +216 -0
  31. package/programs/point-on-globe/element-globe-surface-glow.js +168 -0
  32. package/programs/point-on-globe/element-point-glow.js +184 -0
  33. package/programs/point-on-globe/square-pixel-point.js +8 -7
  34. package/programs/programcache.js +9 -0
  35. package/programs/rings/partial-ring/piece-of-pie.js +1 -1
  36. package/programs/totems/camerauniformblock.js +23 -2
  37. package/rangerings/plugin.js +9 -6
  38. package/shaders/fragment-toy/firework.js +55 -0
  39. package/shaders/fragment-toy/singularity.js +59 -0
  40. package/types.js +16 -0
  41. package/util/account/single-attribute-buffer-management/buffer-manager.js +2 -6
  42. package/util/account/util.js +17 -7
  43. package/util/check/typecheck.js +11 -0
  44. package/util/gl-util/buffer/integrate-buffer.js +74 -0
  45. package/util/gl-util/draw-options/client.js +59 -0
  46. package/util/gl-util/draw-options/methods.js +46 -0
  47. package/util/gl-util/draw-options/types.js +18 -0
  48. package/util/gl-util/uniform-block/manager.js +176 -0
  49. package/util/gl-util/uniform-block/roadmap.md +70 -0
  50. package/util/gl-util/uniform-block/shader.js +0 -0
  51. package/util/gl-util/uniform-block/types.js +7 -0
  52. package/util/jshelpers/equality.js +17 -0
  53. package/util/picking/picker-displayer.js +1 -1
  54. package/util/programs/shapesonglobe.js +17 -19
  55. package/util/shaderfunctions/geometrytransformations.js +27 -63
  56. package/bearing-line/roadmap.md +0 -15
  57. package/point-heat-map/plugin.js +0 -132
  58. package/programs/line-on-globe/naive-accurate.js +0 -221
  59. package/programs/line-on-globe/to-the-origin.js +0 -164
  60. package/util/jshelpers/timemethods.js +0 -19
  61. /package/{programs/point-on-globe/element-draw-glow.js → point-glow-line-to-earth/adaptors.js} +0 -0
@@ -0,0 +1,439 @@
1
+ import './types.js';
2
+
3
+ import { PickableRendererProgramCache } from '../programs/picking/pickable-renderer.js'
4
+ import { ElementPointGlowProgramCache } from '../programs/point-on-globe/element-point-glow.js';
5
+ import { ElementGlobeSufaceGlowCache } from '../programs/point-on-globe/element-globe-surface-glow.js';
6
+
7
+ import { LineOnGlobeCache } from '../programs/line-on-globe/naive-accurate-flexible.js';
8
+
9
+ import { BufferOrchestrator, BufferManager } from "../util/account";
10
+
11
+ import { PickerDisplayer } from '../util/picking/picker-displayer.js';
12
+ import { wgs84ToCartesian3d, wgs84ToMercator } from '../Math/methods.js';
13
+ import { constraintFloat, opacityCheck } from '../util/check/typecheck.js';
14
+ import { createBufferAndReadInfo } from '../util/gl-util/buffer/integrate-buffer.js';
15
+ import { CameraUniformBlockTotemCache } from '../programs/totems/camerauniformblock.js';
16
+
17
+ /**
18
+ * is used with depth we can create a line from surface to the point.
19
+ */
20
+ const glowOverSize = 1.35; // 1.25 is the default value in the shader
21
+
22
+ class PointGlowLineToEarthPlugin {
23
+ constructor({ isGlowPointOn = true, isGlowSurfaceOn = true }) {
24
+ this.globe = null;
25
+ this.gl = null;
26
+ this._pickableWrapper = {};
27
+ this._glowPointWrapper = {};
28
+ this._glowSurfaceWrapper = {};
29
+ this._lineProgramWrapper = {};
30
+ this._modes = {
31
+ isGlowPointOn,
32
+ isGlowSurfaceOn
33
+ }
34
+ this._hoveredObjectId = null;
35
+ this._lastWH = { w: 0, h: 0 };
36
+
37
+ this._opacity = 1.0;
38
+ this._hoverAgentParams = {
39
+ timePass: 0,
40
+ timeGap: 150,
41
+ stillPicking: false
42
+ };
43
+ this._cameraBlockTotem = null;
44
+ this._tickPhase = 0;
45
+ this._parametersChanged = false;
46
+ }
47
+
48
+ init(globe, gl) {
49
+ this.globe = globe;
50
+ this.gl = gl;
51
+ this._init();
52
+ this._cameraBlockTotem = CameraUniformBlockTotemCache.get(this.globe);
53
+ }
54
+
55
+ _init() {
56
+ const { globe, gl, _pickableWrapper, _glowPointWrapper, _glowSurfaceWrapper, _lineProgramWrapper } = this;
57
+ const bufferType = "STATIC_DRAW";
58
+ const initialCapacity = 50;
59
+ this._bufferOrchestrator = new BufferOrchestrator({ initialCapacity });
60
+
61
+ this._bufferManagersMap = new Map(
62
+ [
63
+ ['pos3D', {
64
+ bufferManager: new BufferManager(gl, 6, { bufferType, initialCapacity }),
65
+ adaptor: (item) => new Float32Array([...wgs84ToCartesian3d(item.long, item.lat, item.height / 1000), ...wgs84ToCartesian3d(item.long, item.lat, 0 / 1000)])
66
+ }],
67
+ ['pos2D', {
68
+ bufferManager: new BufferManager(gl, 2, { bufferType, initialCapacity }),
69
+ adaptor: (item) => new Float32Array(wgs84ToMercator(item.long, item.lat))
70
+ }],
71
+ ['rgba', {
72
+ bufferManager: new BufferManager(gl, 8, { bufferType, initialCapacity }),
73
+ adaptor: (item) => new Float32Array([...item.color, ...item.color])
74
+ }],
75
+ ['size', {
76
+ bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
77
+ adaptor: (item) => new Float32Array([item.size])
78
+ }],
79
+
80
+ ]);
81
+
82
+
83
+ _pickableWrapper.program = PickableRendererProgramCache.get(globe);
84
+ _glowPointWrapper.program = ElementPointGlowProgramCache.get(globe);
85
+ _lineProgramWrapper.program = LineOnGlobeCache.get(globe);
86
+
87
+ this._pickerDisplayer = new PickerDisplayer(globe);
88
+
89
+ const obj = (key) => key === null ? null : createBufferAndReadInfo(this._bufferManagersMap.get(key).bufferManager.buffer);
90
+
91
+
92
+
93
+ _pickableWrapper.vao = _pickableWrapper.program.createVAO(
94
+ createBufferAndReadInfo(this._bufferManagersMap.get('pos3D').bufferManager.buffer, 6 * 4, 0),
95
+ createBufferAndReadInfo(this._bufferManagersMap.get('pos2D').bufferManager.buffer),
96
+ createBufferAndReadInfo(this._bufferManagersMap.get('rgba').bufferManager.buffer, 8 * 4, 0),
97
+ createBufferAndReadInfo(this._bufferManagersMap.get('size').bufferManager.buffer),
98
+ );
99
+ _pickableWrapper.vaoLine = _pickableWrapper.program.createVAO(
100
+ ...['pos3D', 'pos2D', 'rgba', null].map(obj)
101
+ );
102
+
103
+ _pickableWrapper.vaoHoverPoint = _pickableWrapper.program.createVAO(
104
+ createBufferAndReadInfo(this._bufferManagersMap.get('pos3D').bufferManager.buffer, 6 * 4, 0),
105
+ createBufferAndReadInfo(this._bufferManagersMap.get('pos2D').bufferManager.buffer),
106
+ null,
107
+ createBufferAndReadInfo(this._bufferManagersMap.get('size').bufferManager.buffer),
108
+ );
109
+
110
+ _pickableWrapper.vaoHoverLine = _pickableWrapper.program.createVAO(
111
+ ...['pos3D', 'pos2D', null, null].map(obj));
112
+
113
+ _glowPointWrapper.vao = _glowPointWrapper.program.createVAO(
114
+ createBufferAndReadInfo(this._bufferManagersMap.get('pos3D').bufferManager.buffer, 6 * 4, 0),
115
+ createBufferAndReadInfo(this._bufferManagersMap.get('pos2D').bufferManager.buffer),
116
+ null,
117
+ createBufferAndReadInfo(this._bufferManagersMap.get('size').bufferManager.buffer),
118
+ );
119
+
120
+
121
+ // _lineProgramWrapper.vao = _lineProgramWrapper.program.createVAO(
122
+ // ...[null, 'pos3D', null, 'reverse3D', null, null, "rgba"].map(obj)
123
+ // );
124
+
125
+ // _pickableWrapper.vaoRev = _pickableWrapper.program.createVAO(
126
+ // ...['reverse3D', 'pos2D', 'rgba', 'size'].map(obj)
127
+ // );
128
+
129
+
130
+ _pickableWrapper.ubo = _pickableWrapper.program.createUBO();
131
+ _pickableWrapper.ubo.update(
132
+ new Map([
133
+ ["u_rgba", [1, 1, 1, 1]],
134
+ ["u_opacity", [1.0]],
135
+ ["u_size_multiplier", [1.0]],
136
+ ["u_size", [1.0]],
137
+ ["u_is_circle", [1.0]],
138
+ ["u_dash_opacity_multiplier", [0.75]],
139
+ ["u_dash_phase", [1.57]],
140
+ ["u_dash_count", [0.5]],
141
+ ["u_is_circle", [1.0]]
142
+ ]));
143
+
144
+
145
+ _pickableWrapper.uboLine = _pickableWrapper.program.createUBO();
146
+ _pickableWrapper.uboLine.update(
147
+ new Map([
148
+ ["u_rgba", [1, 1, 1, 1]],
149
+ ["u_opacity", [1.0]],
150
+ ["u_size_multiplier", [1.0]],
151
+ ["u_size", [1.0]],
152
+ ["u_draw_mode", [1.0]], // 0.0 for default, 1.0 for line
153
+ ["u_dash_phase", [1.0]],
154
+ ["u_dash_count", [1.0]],
155
+ ["u_dash_opacity_multiplier", [1.0]],
156
+ ["u_is_circle", [0.0]]
157
+ ]));
158
+
159
+ _pickableWrapper.uboLineGlow = _pickableWrapper.program.createUBO();
160
+ _pickableWrapper.uboLineGlow.update(
161
+ new Map([
162
+ ["u_rgba", [1, 1, 1, 1]],
163
+ ["u_opacity", [1.0]],
164
+ ["u_size_multiplier", [1.0]],
165
+ ["u_size", [1.0]],
166
+ ["u_draw_mode", [1]], // 0.0 for default, 1.0 for line
167
+ ["u_dash_phase", [0.0]],
168
+ ["u_dash_count", [5.0]],
169
+ ["u_dash_opacity_multiplier", [0.5]],
170
+ ["u_is_circle", [0.0]]
171
+ ]));
172
+
173
+
174
+ // _pickableWrapper._phase = 1;
175
+ // _pickableWrapper.phaseTick = () => {
176
+ // _pickableWrapper._phase -= 0.003;
177
+ // if (_pickableWrapper._phase < 0) {
178
+ // _pickableWrapper._phase = 1;
179
+ // }
180
+ // _pickableWrapper.uboLineGlow.update(new Map([["u_dash_phase", [_pickableWrapper._phase]]]));
181
+ // }
182
+
183
+ _glowPointWrapper.ubo = _glowPointWrapper.program.createUBO();
184
+ _glowPointWrapper.ubo.update(
185
+ new Map([
186
+ ["u_size", new Float32Array([30.0])],
187
+ ["u_size_multiplier", new Float32Array([glowOverSize])],
188
+ ]));
189
+ // _glowPointWrapper._phase = 0;
190
+ // _glowPointWrapper.phaseTick = () => {
191
+ // _glowPointWrapper._phase += 0.0175;
192
+ // if (_glowPointWrapper._phase < 0) {
193
+ // _glowPointWrapper._phase = 1;
194
+ // }
195
+ // _glowPointWrapper.ubo.update(new Map([["u_phase", [_glowPointWrapper._phase]]]));
196
+ // }
197
+ }
198
+
199
+ /**
200
+ *
201
+ * @param {Array<PointGlowData>} data
202
+ */
203
+ insertBulk(data) {
204
+ const { _bufferManagersMap, _bufferOrchestrator, globe } = this;
205
+ _bufferOrchestrator.insertBulk(data, _bufferManagersMap);
206
+ this._changed();
207
+ }
208
+
209
+ setPointSizeMultiplier(sizeMultiplier) {
210
+ constraintFloat(sizeMultiplier, 0.1, null);
211
+ this._pickableWrapper.ubo.update(new Map([["u_size_multiplier", [sizeMultiplier]]]));
212
+ this._glowPointWrapper.ubo.update(new Map([["u_size_multiplier", [sizeMultiplier * 1.25]]]));
213
+ this._changed();
214
+ }
215
+
216
+ /**
217
+ * @param {DrawRange} drawRange if null draws all
218
+ * @returns
219
+ */
220
+ setDrawRange(drawRange = null) {
221
+ this._drawRange = drawRange;
222
+ this._changed();
223
+ }
224
+
225
+ /**
226
+ *
227
+ * sophisticated setDrawRange,
228
+ * 3 concepts:
229
+ */
230
+
231
+
232
+
233
+ setGlowIndexes(glowIndexes) {
234
+ const { gl } = this;
235
+ if (!this._elementBuffer) {
236
+ this._elementBuffer = gl.createBuffer();
237
+ }
238
+ // filter glowIndexes with DrawRange
239
+ gl.bindElementArrayBuffer(this._elementBuffer);
240
+ this._parametersChanged = true;
241
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array(glowIndexes), gl.DYNAMIC_DRAW);
242
+ }
243
+
244
+ setOpacity(opacity) {
245
+ opacityCheck(opacity);
246
+ this._opacity = opacity;
247
+ this._pickableWrapper.ubo.update(new Map([["u_opacity", [opacity]]]));
248
+ this._pickableWrapper.uboLine.update(new Map([["u_opacity", [opacity]]]));
249
+ this._glowPointWrapper.ubo.update(new Map([["u_opacity", [opacity * glowOverSize]]]));
250
+ this._changed();
251
+ }
252
+
253
+
254
+ draw3D() {
255
+
256
+ const { _pickableWrapper, _bufferOrchestrator, _drawRange, _pickerDisplayer } = this;
257
+ const { globe, gl } = this;
258
+ this._hoverAgent();
259
+ this.resize();
260
+ const is3D = globe.api_GetCurrentGeometry() == 0;
261
+
262
+ const drawRange = _drawRange || { first: 0, count: _bufferOrchestrator.length };
263
+
264
+ const drawOptionsPoint = {
265
+ drawRange,
266
+ }
267
+
268
+ this._doDraw(drawOptionsPoint, is3D, drawRange);
269
+
270
+ _pickerDisplayer.drawColorTexture();
271
+
272
+ if (this._hoveredObjectId === -1) {
273
+ return;
274
+ }
275
+
276
+ // hover draw
277
+ gl.disable(gl.DEPTH_TEST);
278
+ const { program, vaoHoverPoint, vaoHoverLine, uboLineGlow } = _pickableWrapper;
279
+ const drawOptionsHoveredPoint = {
280
+ drawRange: {
281
+ first: this._hoveredObjectId,
282
+ count: 1
283
+ },
284
+
285
+ }
286
+
287
+ // program.draw(vaoHoverPoint, drawptionsHoveredPoint, ubo);
288
+ if (true || this._modes.isGlowPointOn) {
289
+
290
+ const { program, vao, ubo } = this._glowPointWrapper;
291
+ // this._glowPointWrapper.phaseTick();
292
+ program.draw(vao, drawOptionsHoveredPoint, ubo);
293
+ } else {
294
+ }
295
+ this.globe.DrawRender();
296
+
297
+ if (is3D) {
298
+ const drawOptionsHoveredLine = {
299
+ drawRange: {
300
+ first: this._hoveredObjectId * 2,
301
+ count: 2
302
+ },
303
+ drawMode: gl.LINES
304
+ }
305
+ // _pickableWrapper.phaseTick();
306
+ program.draw(vaoHoverLine, drawOptionsHoveredLine, uboLineGlow);
307
+ }
308
+
309
+ this._phaseTick();
310
+
311
+
312
+ gl.enable(gl.DEPTH_TEST);
313
+ }
314
+
315
+
316
+ _doDraw(drawOptionsPoint, is3D, drawRange) {
317
+ const { gl, _pickableWrapper, _pickerDisplayer } = this;
318
+ const { program, vao, ubo, uboLine, vaoLine } = _pickableWrapper;
319
+
320
+ if (this._doesChanged()) {
321
+ _pickerDisplayer.bindFBO();
322
+ _pickerDisplayer.clearTextures();
323
+ gl.enable(gl.DEPTH_TEST);
324
+ program.draw(vao, drawOptionsPoint, ubo);
325
+ }
326
+
327
+
328
+ if (is3D) {
329
+ const drawOptionsLine = {
330
+ drawRange: {
331
+ first: drawRange.first * 2,
332
+ count: drawRange.count * 2
333
+ },
334
+ drawMode: gl.LINES
335
+ }
336
+ if (this._doesChanged) {
337
+ uboLine.update(new Map([
338
+ ["u_opacity", [0.01]]
339
+ ]));
340
+
341
+ program.draw(vaoLine, drawOptionsLine, uboLine);
342
+ }
343
+
344
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
345
+ uboLine.update(new Map([
346
+ ["u_opacity", [this._opacity]]
347
+ ]));
348
+ program.draw(vaoLine, drawOptionsLine, uboLine);
349
+ }
350
+ }
351
+
352
+
353
+
354
+ getCurrentSelection() {
355
+ return this._hoveredObjectId;
356
+ }
357
+
358
+
359
+ resize() {
360
+ const w = this.globe.api_ScrW();
361
+ const h = this.globe.api_ScrH();
362
+ if (w === this._lastWH.w && h === this._lastWH.h) return;
363
+ this._lastWH.w = w;
364
+ this._lastWH.h = h;
365
+ this._pickerDisplayer.resize();
366
+ this._changed();
367
+ }
368
+
369
+
370
+ free() {
371
+
372
+ const { _pickableWrapper, _glowPointWrapper, _glowSurfaceWrapper, _lineProgramWrapper } = this;
373
+
374
+ [_pickableWrapper, _glowPointWrapper, _glowSurfaceWrapper, _lineProgramWrapper].forEach((item) => {
375
+ const { vao, ubo } = item;
376
+ ubo?.free();
377
+ this.gl.deleteVertexArray(vao);
378
+ });
379
+
380
+ PickableRendererProgramCache.release(this.globe);
381
+ ElementPointGlowProgramCache.release(this.globe);
382
+ // ElementGlobeSufaceGlowCache.release(this.globe); // TODO: uncomment when needed
383
+ LineOnGlobeCache.release(this.globe);
384
+ if (this._elementBuffer) this.gl.deleteBuffer(this._elementBuffer);
385
+ this._pickerDisplayer.free();
386
+ this._bufferManagersMap.forEach((item) => item.bufferManager.free());
387
+ this._bufferManagersMap.clear();
388
+ CameraUniformBlockTotemCache.release(this.globe);
389
+ }
390
+
391
+
392
+ _phaseTick() {
393
+ this._tickPhase += 0.003;
394
+ if (this._tickPhase > 1) {
395
+ this._tickPhase = 0;
396
+ }
397
+ this._glowPointWrapper.ubo.update(new Map([["u_phase", [this._tickPhase * 2]]]));
398
+ this._pickableWrapper.uboLineGlow.update(new Map([["u_dash_phase", [1 - this._tickPhase]]]));
399
+ }
400
+
401
+
402
+ _hoverAgent() {
403
+ const { globe, _hoverAgentParams } = this;
404
+ const pos = globe.api_GetMousePos();
405
+ const currentTime = new Date().getTime();
406
+ if (_hoverAgentParams.stillPicking || _hoverAgentParams.timePass > currentTime) {
407
+ return
408
+ };
409
+
410
+ _hoverAgentParams.timePass = currentTime + _hoverAgentParams.timeGap;
411
+
412
+ const x = pos.canvasX;
413
+ const y = globe.api_ScrH() - pos.canvasY;
414
+ _hoverAgentParams.stillPicking = true;
415
+ this._pickerDisplayer.pickXY(x, y, 1, (idSet) => {
416
+ _hoverAgentParams.stillPicking = false;
417
+ if (idSet.size === 0) {
418
+ this._hoveredObjectId = -1;
419
+ return;
420
+ }
421
+ const index = [...idSet][0];
422
+ if (index !== this._hoveredObjectId) {
423
+ this._hoveredObjectId = index;
424
+ this.globe.DrawRender();
425
+ }
426
+ });
427
+ }
428
+
429
+ _doesChanged() {
430
+ return this._cameraBlockTotem.isMoved() || this._parametersChanged; // TODO: implement
431
+ }
432
+
433
+ _changed() {
434
+ this._parametersChanged = true;
435
+ this.globe.DrawRender();
436
+ }
437
+ }
438
+
439
+ export { PointGlowLineToEarthPlugin };
@@ -0,0 +1,26 @@
1
+ import "../types";
2
+
3
+ /**
4
+ * @typedef PointGlowData
5
+ * @type {Object}
6
+ * @property {number} key
7
+ * @property {number} latitude
8
+ * @property {number} longitude
9
+ * @property {number} height
10
+ * @property {number} size
11
+ * @property {[number, number, number]} color
12
+ */
13
+
14
+
15
+
16
+
17
+ /**
18
+ *
19
+ *
20
+ * drawSubsetOptions
21
+ * @typedef DrawSubsetOptions
22
+ * @type {Object}
23
+ * @property {null|Color} color if provided, it will override the color
24
+ * @property {Opacity} opacity default 1.0
25
+ * @property {DrawRangeIndexParams} drawOptions
26
+ */
@@ -1,3 +0,0 @@
1
- import { PointHeatmapPlugin } from "./plugin-webworker";
2
- import { timeTrackPluginDataToPointHeatInterpolatorAdapter } from "./adaptors/timetracksplugin-format-to-this";
3
- // export { PointHeatmapPlugin, timeTrackPluginDataToPointHeatInterpolatorAdapter };
@@ -1,6 +1,7 @@
1
1
  import { PointHeatmapFlow } from "./point-to-heat-map-flow";
2
2
  import { webworkerStr } from "../util/interpolation/timetrack/web-worker-str";
3
3
  import { createTexture, getColorRampModed } from "../util";
4
+ import { opacityCheck, constraintFloat } from "../util/check/typecheck";
4
5
 
5
6
  class PointHeatmapPlugin {
6
7
 
@@ -46,9 +47,7 @@ class PointHeatmapPlugin {
46
47
 
47
48
 
48
49
  setPointSize(pointSize) {
49
- if (typeof pointSize !== 'number' || pointSize <= 0) {
50
- throw new Error('Invalid pointSize');
51
- }
50
+ constraintFloat(pointSize, 1);
52
51
  this._pointSize = pointSize;
53
52
  this.globe.DrawRender();
54
53
  }
@@ -96,9 +95,7 @@ class PointHeatmapPlugin {
96
95
 
97
96
 
98
97
  setOpacity(opacity) {
99
- if (typeof opacity !== 'number' || opacity < 0 || opacity > 1) {
100
- throw new Error('Invalid opacity');
101
- }
98
+ opacityCheck(opacity);
102
99
  this._opacity = opacity;
103
100
  this.globe.DrawRender();
104
101
  }
@@ -148,7 +145,5 @@ class PointHeatmapPlugin {
148
145
  }
149
146
 
150
147
 
148
+ export { PointHeatmapPlugin };
151
149
 
152
-
153
-
154
- export { PointHeatmapPlugin };
@@ -25,7 +25,6 @@ class PointHeatmapFlow {
25
25
  this.framebuffer = gl.createFramebuffer();
26
26
  this.densityTexture = this._createDensityTexture();
27
27
  this._bindTextureToFramebuffer();
28
-
29
28
  }
30
29
  }
31
30
 
@@ -51,11 +50,6 @@ class PointHeatmapFlow {
51
50
  gl.bindFramebuffer(gl.FRAMEBUFFER, null);
52
51
  }
53
52
  defaultblendfunction(gl);
54
- // gl.viewport(0, 0, 400, 400);
55
- // this.testTextureProgram.draw(legendTexture, 1.0);
56
- // gl.viewport(0, 400, 400, 400);
57
- // this.testTextureProgram.draw(this.densityTexture, 1.0);
58
- // gl.viewport(0, 0, globe.api_ScrW(), globe.api_ScrH());
59
53
  this._drawLegend(legendTexture, opacity);
60
54
  }
61
55
 
@@ -1,7 +1,7 @@
1
1
  import { BufferOrchestrator, BufferManager, ObjectStore } from "../util/account";
2
2
 
3
3
  import { PickerDisplayer } from "../util/picking/picker-displayer";
4
- import { pointOnGlobeProgramCache } from "../programs/point-on-globe/square-pixel-point";
4
+ import { PointOnGlobeProgramCache } from "../programs/point-on-globe/square-pixel-point";
5
5
 
6
6
  import { wgs84ToCartesian3d, wgs84ToMercator } from "../Math/methods";
7
7
 
@@ -33,7 +33,7 @@ class PointTracksPlugin {
33
33
  this._opacity = opacity;
34
34
  this.program = null
35
35
  this._lastWH = { w: 0, h: 0 };
36
- this._focusParams = { on: false, length: 0, elementBuffer: null };
36
+ this._focusParams = { on: false, length: 0, elementBuffer: null, trackIDs: [] };
37
37
  this.pointSizes = {
38
38
  pointSize,
39
39
  selectionPointFilling,
@@ -47,7 +47,7 @@ class PointTracksPlugin {
47
47
  this.globe = globe;
48
48
  this.gl = gl;
49
49
  this._pickerDisplayer = new PickerDisplayer(globe);
50
- this._pointProgram = pointOnGlobeProgramCache.get(globe);
50
+ this._pointProgram = PointOnGlobeProgramCache.get(globe);
51
51
  this._focusParams.elementBuffer = gl.createBuffer();
52
52
  this._initBufferManagers();
53
53
  }
@@ -156,7 +156,7 @@ class PointTracksPlugin {
156
156
  * @returns
157
157
  */
158
158
  insertBulk(tracks) {
159
- this._fillTracksToPointsMap(tracks);
159
+ this._fillTracksToPointsMap(tracks); // TODO error should be at the top
160
160
  const flattenedPoints = tracks.map(trackToFlatPoints).flat();
161
161
  const currentLoad = this._bufferOrchestrator.length;
162
162
  if (currentLoad + flattenedPoints.length >= 2147483647) {
@@ -164,6 +164,8 @@ class PointTracksPlugin {
164
164
  }
165
165
  const { _bufferManagersMap, _bufferOrchestrator } = this;
166
166
  _bufferOrchestrator.insertBulk(flattenedPoints, _bufferManagersMap);
167
+ this._refillFocus();
168
+
167
169
  this.globe?.DrawRender();
168
170
 
169
171
  }
@@ -173,6 +175,7 @@ class PointTracksPlugin {
173
175
  const capacity = 100
174
176
  this._bufferOrchestrator?.flush({ capacity });
175
177
  this._bufferManagersMap.forEach(({ bufferManager }) => bufferManager.resetWithCapacity(capacity));
178
+ this._turnOffFocus();
176
179
  this._tracksToPointsMap.clear();
177
180
  this.globe?.DrawRender();
178
181
  }
@@ -190,20 +193,11 @@ class PointTracksPlugin {
190
193
  );
191
194
  this._tracksToPointsMap.delete(trackID);
192
195
  this._redraw = true;
196
+ this._refillFocus();
197
+
193
198
  this.globe?.DrawRender();
194
199
  }
195
200
 
196
- focusTracks(trackIDs = null) {
197
- if (!this.globe) return;
198
- if (!trackIDs) {
199
- this._focusParams.on = false;
200
- this.globe?.DrawRender();
201
- return;
202
- }
203
-
204
- this._focusParams.on = this._fillElementBuffer(trackIDs);
205
- this.globe.DrawRender();
206
- }
207
201
 
208
202
  /**
209
203
  * @param {string} trackID
@@ -216,16 +210,32 @@ class PointTracksPlugin {
216
210
  _bufferManagersMap
217
211
  );
218
212
  this._deletePointsFromTracksMap(trackID, pointIDs);
213
+ this._refillFocus();
219
214
  this.globe?.DrawRender();
220
215
  }
221
216
 
217
+ focusTracks(trackIDs = null) {
218
+ if (!this.globe) return;
219
+ if (!trackIDs) {
220
+ this._focusParams.on = false;
221
+ this.globe?.DrawRender();
222
+ return;
223
+ }
224
+ this._focusParams.on = this._fillElementBuffer(trackIDs);
225
+ if (!this._focusParams.on) {
226
+ this._turnOffFocus();
227
+ }
228
+ this.globe.DrawRender();
229
+ }
230
+
231
+
222
232
  // GLOBE API METHODS
223
233
 
224
234
  free() {
225
235
  if (this._isFreed) return;
226
236
  this._isFreed = true;
227
237
  this._pickerDisplayer.free();
228
- pointOnGlobeProgramCache.release(this.globe);
238
+ PointOnGlobeProgramCache.release(this.globe);
229
239
  this.gl.deleteBuffer(this._focusParams.elementBuffer);
230
240
  this._bufferManagersMap.forEach(
231
241
  ({ bufferManager, adaptor }) => bufferManager.free()
@@ -293,6 +303,11 @@ class PointTracksPlugin {
293
303
  }
294
304
  }
295
305
 
306
+ _refillFocus() {
307
+ if (this._focusParams.on) {
308
+ this.focusTracks(this._focusParams.trackIDs);
309
+ }
310
+ }
296
311
 
297
312
  _deletePointsFromTracksMap(trackID, pointIDs) {
298
313
  const trackSet = this._tracksToPointsMap.get(trackID);
@@ -312,15 +327,24 @@ class PointTracksPlugin {
312
327
 
313
328
  }
314
329
 
330
+ _turnOffFocus() {
331
+ const { gl } = this;
332
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._focusParams.elementBuffer);
333
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint32Array([]), gl.STATIC_DRAW);
334
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
335
+ this._focusParams.length = 0;
336
+ this._focusParams.on = false;
337
+ }
315
338
 
316
339
  _fillElementBuffer(trackIDs) {
317
340
 
318
341
  let length = 0;
319
342
  const indexes = [];
320
-
343
+ const foundTracks = []
321
344
  for (const trackID of trackIDs) {
322
345
  const pointSet = this._tracksToPointsMap.get(trackID);
323
346
  if (!pointSet) continue;
347
+ foundTracks.push(trackID);
324
348
  const points = Array.from(pointSet);
325
349
  for (const pointID of points) {
326
350
  const key = keyMethod(trackID, pointID);
@@ -329,6 +353,7 @@ class PointTracksPlugin {
329
353
  length++;
330
354
  }
331
355
  }
356
+ this._focusParams.trackIDs = foundTracks;
332
357
  this._focusParams.length = length;
333
358
  if (length === 0) {
334
359
  return false;