@pirireis/webglobeplugins 0.8.6 → 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 +4 -4
  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 +2 -4
  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 +1 -5
  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
 
@@ -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) {
@@ -235,7 +235,7 @@ class PointTracksPlugin {
235
235
  if (this._isFreed) return;
236
236
  this._isFreed = true;
237
237
  this._pickerDisplayer.free();
238
- pointOnGlobeProgramCache.release(this.globe);
238
+ PointOnGlobeProgramCache.release(this.globe);
239
239
  this.gl.deleteBuffer(this._focusParams.elementBuffer);
240
240
  this._bufferManagersMap.forEach(
241
241
  ({ bufferManager, adaptor }) => bufferManager.free()
@@ -145,8 +145,8 @@ export default class ArrowFieldLogic {
145
145
 
146
146
  const cameraBlockIndex = gl.getUniformBlockIndex(program, "CameraBlock");
147
147
  gl.uniformBlockBinding(program, cameraBlockIndex, this.cameraBlockBindingPoint);
148
- const buffer = this.cameraUniformBlockTotem.getUBO();
149
- gl.bindBufferBase(gl.UNIFORM_BUFFER, this.cameraBlockBindingPoint, buffer);
148
+
149
+
150
150
 
151
151
  const arrowBlockIndex = gl.getUniformBlockIndex(program, "ArrowBlock");
152
152
  gl.uniformBlockBinding(program, arrowBlockIndex, this.arrayBlockBindingPoint);
@@ -169,12 +169,14 @@ export default class ArrowFieldLogic {
169
169
  }
170
170
 
171
171
  draw(arrowBlockManager, textureManager, instanceCount) {
172
- const { gl } = this;
172
+ const { gl, cameraBlockBindingPoint, cameraUniformBlockTotem } = this;
173
173
  gl.useProgram(this.program);
174
174
  arrowBlockManager.bind();
175
175
  textureManager.activate();
176
+ cameraUniformBlockTotem.bind(cameraBlockBindingPoint);
176
177
  gl.drawArraysInstanced(gl.LINES, 0, 6, instanceCount);
177
178
  // gl.drawArraysInstanced(gl.POINTS, 0, 4, instanceCount);
179
+ cameraUniformBlockTotem.unbind(cameraBlockBindingPoint);
178
180
  arrowBlockManager.unbind();
179
181
  }
180
182
 
@@ -194,7 +196,7 @@ class ArrowBlockBufferManager {
194
196
  gl.bindBuffer(gl.UNIFORM_BUFFER, this.ubo);
195
197
  // 4 + 2+ 2 + 2 + 1 +1 +1 +1+1= 15 ~= 16
196
198
  gl.bufferData(gl.UNIFORM_BUFFER, 56, gl.DYNAMIC_DRAW);
197
-
199
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
198
200
  }
199
201
 
200
202
  update({
@@ -22,7 +22,7 @@ export default class ArrowField {
22
22
  tailLengthRatio = 1,
23
23
  wingLengthRatio = 0.5,
24
24
  noDataValue = null,
25
- maxMagnitude = null
25
+ // maxMagnitude = null
26
26
  } = {}) {
27
27
  this.gl = gl;
28
28
  this.globe = globe;
@@ -3,7 +3,7 @@ import { glProgramCache } from '../programcache';
3
3
 
4
4
  // Uniform Buffer Objects use this
5
5
 
6
- export default class {
6
+ export default class DataObject {
7
7
  constructor(gl, {
8
8
  width = 1,
9
9
  height = 1,
@@ -126,10 +126,11 @@ export default class {
126
126
  this.programlogic.draw(this.texture0, this.texture1, this.colorRampTexture, this.heatParametersBlockManager);
127
127
  }
128
128
 
129
-
130
-
131
129
  free() {
132
- // TODO: What else to free. Does textures and buffers need to be freed?
130
+ const { gl, texture0, texture1, colorRampTexture } = this;
131
+ gl.deleteTexture(texture0);
132
+ gl.deleteTexture(texture1);
133
+ gl.deleteTexture(colorRampTexture);
133
134
  glProgramCache.releaseProgram(this.gl, Float2LegentWithRatioProgram);
134
135
  this.heatParametersBlockManager.free();
135
136
 
@@ -0,0 +1,27 @@
1
+ import { noRegisterGlobeProgramCache } from "../programcache";
2
+
3
+ class IsGlobeMoved {
4
+ constructor(globe) {
5
+ this.globe = globe;
6
+
7
+ this._lastLOD = globe.api_GetCurrentLODWithDecimal();
8
+ }
9
+
10
+ isMoved() {
11
+ const globe = this.globe;
12
+ if (globe.api_IsScreenMoving() || this._lastLOD != globe.api_GetCurrentLODWithDecimal()) {
13
+ this._lastLOD = globe.api_GetCurrentLODWithDecimal();
14
+ return true;
15
+ }
16
+ return false;
17
+ }
18
+
19
+
20
+ }
21
+
22
+
23
+
24
+ const IsGlobeMovedCache = Object.freeze({
25
+ get: (globe) => noRegisterGlobeProgramCache.getProgram(globe, IsGlobeMoved),
26
+ release: (globe) => noRegisterGlobeProgramCache.releaseProgram(globe, IsGlobeMoved)
27
+ });