@pirireis/webglobeplugins 0.6.28-c → 0.6.30-c

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.
@@ -53,242 +53,32 @@ import { populateFloat32Array } from "../util/jshelpers/data-filler";
53
53
  import { RingAccount, ringKeyMethod, ringBigPaddingKeyMethod } from "./ring-account";
54
54
  import { CirclePadding3DCache } from "../programs/line-on-globe/degree-padding-around-circle-3d";
55
55
  import { LineOnGlobeCache } from '../programs/line-on-globe/naive-accurate';
56
-
57
56
  import RangeRingAngleText from "./rangeringangletext";
57
+ import { Z_ALPHA_MODE } from "../programs/line-on-globe/util";
58
58
 
59
- /**
60
- * Programs:
61
- *
62
- * circle3d circle2d padding3d padding2d
63
- *
64
- *
65
- * */
59
+ const CIRCLE_FLAT_EDGE_COUNT = 362; // 360 + 2 for closing the circle and a cutting point
66
60
 
67
61
 
68
- /**
69
- * [+] Draw circles
70
- * [+] BUG BUFFER OVERFLOW
71
- * [+] Draw one degree paddings 2d
72
- * [+] Create a program for accurate padding 3d
73
- * [+] Draw one degree paddings 3d
74
- * [+] Draw big paddings
75
- * [+] DrawText
76
- * [+] big paddings does not remove
77
- */
78
62
 
79
- // TODO make long,lat -> long, lat
80
63
 
81
64
  class RangeRings {
82
- constructor(id, { oneDegreePadding = true, showNumbers = true, numbersStyle = null, opacity = 1 } = {}) {
65
+ constructor(id, { oneDegreePadding = true, showNumbers = true, numbersStyle = null, opacity = 1, zAlphaOnDegreePadding = Z_ALPHA_MODE.ON } = {}) {
83
66
 
84
67
  this.id = id;
85
68
 
86
69
  this._oneDegreePadding = oneDegreePadding;
70
+ this._zAlphaOnDegreePadding = zAlphaOnDegreePadding;
87
71
  this._showNumbers = showNumbers;
88
72
  this._numbersStyle = numbersStyle;
89
73
  this._opacity = opacity;
90
- this._circleFlatEdgeCount = 362;
91
74
  this._ringAccount = new RingAccount();
92
75
 
93
76
  }
94
77
 
95
78
 
96
- init(globe, gl) {
97
- this.globe = globe;
98
- this.gl = gl;
99
- this._initPrograms();
100
- this._initBufferManagers();
101
- if (this._showNumbers) {
102
- this.textPlugin = new RangeRingAngleText(globe, this.id + "text", { flatCompassMode: this.compass, style: this._numbersStyle, opacity: this._opacity });
103
- delete this._numbersStyle;
104
- }
105
- }
106
-
107
-
108
- _initPrograms() {
109
- const { globe } = this;
110
- this._circleProgram2D = CircleCache2D.get(globe);
111
- this._circleProgram3D = CircleCache3D.get(globe);
112
- this._padding2dProgram = LinesColorInstancedFlatCache.get(globe);
113
- this._padding3dProgram = CirclePadding3DCache.get(globe);
114
- this._bigPadding3dFlatProgram = LineOnGlobeCache.get(globe);
115
-
116
- }
117
-
118
-
119
- _initBufferManagers() {
120
- const { globe, gl, _circleFlatEdgeCount } = this;
121
-
122
- const initialCapacity = 10;
123
- const bufferType = "DYNAMIC_DRAW";
124
- // circle2d, circle3d, 1 degree paddings,
125
- this.bufferOrchestrator = new BufferOrchestrator({ capacity: initialCapacity });
126
-
127
- this.bufferManagersCompMap = new Map(
128
- [
129
- // circle 3D
130
- ["centerCoords3d", {
131
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
132
- 'adaptor': (item) => new Float32Array(item.centerCoords3d),
133
- }],
134
- ["rgba", {
135
- 'bufferManager': new BufferManager(gl, 4, { bufferType, initialCapacity }),
136
- 'adaptor': (item) => new Float32Array(item.hide === 1 ? [0, 0, 0, 0] : item.rgba)
137
- }],
138
- ["radius3d", {
139
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
140
- 'adaptor': (item) => new Float32Array([item.radius])
141
- }],
142
- ["radius3dsmall", {
143
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
144
- 'adaptor': (item) => new Float32Array([item.radius - item.padding / 3])
145
- }],
146
- ["circleDashAngle", {
147
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
148
- 'adaptor': (item) => new Float32Array([1]),
149
- }],
150
- ["dashOpacity", {
151
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
152
- 'adaptor': (item) => new Float32Array([1]),
153
- }],
154
-
155
- // circle 2D
156
- ["centerCoords2dflatForPadding", {
157
- 'bufferManager': new BufferManager(gl, _circleFlatEdgeCount * 2, { bufferType, initialCapacity }),
158
- 'adaptor': (item) => item.centerCoords2dflatForPadding,
159
- }],
160
- ["centerCoords2dflat", {
161
- 'bufferManager': new BufferManager(gl, _circleFlatEdgeCount * 2, { bufferType, initialCapacity }),
162
- 'adaptor': (item) => item.centerCoords2dflat,
163
- }],
164
- ["rgbaMercator", {
165
- 'bufferManager': new BufferManager(gl, 4 * _circleFlatEdgeCount, { bufferType, initialCapacity }),
166
- 'adaptor': (item) => populateFloat32Array.fillWithListData(_circleFlatEdgeCount, item.hide === 1 ? [0, 0, 0, 0] : item.rgba),
167
- }],
168
- ["circleDashAngleMercator", {
169
- 'bufferManager': new BufferManager(gl, _circleFlatEdgeCount, { bufferType, initialCapacity }),
170
- 'adaptor': (item) => populateFloat32Array.fillFloat32Array(_circleFlatEdgeCount, 1),
171
- }],
172
- ["dashOpacityMercator", {
173
- 'bufferManager': new BufferManager(gl, _circleFlatEdgeCount, { bufferType, initialCapacity }),
174
- 'adaptor': (item) => populateFloat32Array.fillFloat32Array(_circleFlatEdgeCount, 1),
175
- }],
176
- ]
177
- );
178
-
179
- const obj = function (bufferManagerComp, divisor = 1) {
180
- return { 'buffer': bufferManagerComp.bufferManager.buffer, 'stride': 0, 'offset': 0, divisor }
181
-
182
- };
183
- this.circle2DVao = this._circleProgram2D.createVAO(
184
- ...["centerCoords2dflat", "rgbaMercator", "circleDashAngleMercator", "dashOpacityMercator"].map(key => obj(this.bufferManagersCompMap.get(key)))
185
- );
186
- this.circle3DVao = this._circleProgram3D.createVAO(
187
- ...["centerCoords3d", "radius3d", "rgba", "circleDashAngle", "dashOpacity"].map(key => obj(this.bufferManagersCompMap.get(key)))
188
- );
189
-
190
- this.oneDegreePaddingVao = this._padding2dProgram.createVAO(
191
- { buffer: this.bufferManagersCompMap.get("centerCoords2dflat").bufferManager.buffer, size: 2, stride: 0, offset: 0 },
192
- { buffer: this.bufferManagersCompMap.get("centerCoords2dflatForPadding").bufferManager.buffer, size: 2, stride: 0, offset: 0 },
193
- { buffer: this.bufferManagersCompMap.get("rgbaMercator").bufferManager.buffer, size: 4, stride: 0, offset: 0 },
194
- );
195
-
196
- // PADDING
197
- // this one needs glue to assosiate rings and their big paddings since the count for center is not fixed
198
- this.paddingBufferOrchestrator = new BufferOrchestrator({ capacity: initialCapacity });
199
- this.bufferManagersCompMapPadding = new Map(
200
- [
201
- ["circlePoint", {
202
- 'bufferManager': new BufferManager(gl, 2, { bufferType, initialCapacity }),
203
- 'adaptor': (item) => item.circlePoint,
204
- }],
205
- ["paddingPoint", {
206
- 'bufferManager': new BufferManager(gl, 2, { bufferType, initialCapacity }),
207
- 'adaptor': (item) => item.paddingPoint,
208
- }],
209
- ["circlePoint3d", {
210
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
211
- 'adaptor': (item) => item.circlePoint3d
212
- }],
213
- ["paddingPoint3d", {
214
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
215
- 'adaptor': (item) => item.paddingPoint3d
216
- }],
217
- ["rgba", {
218
- 'bufferManager': new BufferManager(gl, 4, { bufferType, initialCapacity }),
219
- 'adaptor': (item) => new Float32Array(item.rgba)
220
- }],
221
-
222
- ["dashOpacity", {
223
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
224
- 'adaptor': (item) => new Float32Array([1]),
225
- }],
226
- ["dashRatio", {
227
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
228
- 'adaptor': (item) => new Float32Array([1]),
229
- }],
230
- ]
231
- );
232
-
233
- this._bigPadding3dFlatVAO = this._bigPadding3dFlatProgram.createVAO(
234
- ...["circlePoint", "circlePoint3d", "paddingPoint", "paddingPoint3d", "dashRatio", "dashOpacity", "rgba",].map(key => obj(this.bufferManagersCompMapPadding.get(key)))
235
- );
236
-
237
- this._padding3dOneDegreeVao = this._padding3dProgram.createVAO(
238
- ...["centerCoords3d", "radius3d", "radius3dsmall", "rgba"].map(key => obj(this.bufferManagersCompMap.get(key)))
239
- );
240
-
241
- }
242
-
243
-
244
- // GLOBE API
245
-
246
- draw3D() {
247
- const {
248
- globe, gl,
249
- _circleProgram2D, _circleProgram3D, _padding2dProgram, _padding3dProgram, _bigPadding3dFlatProgram,
250
- circle2DVao, circle3DVao, oneDegreePaddingVao, _padding3dOneDegreeVao, _bigPadding3dFlatVAO,
251
- bufferOrchestrator, paddingBufferOrchestrator,
252
- _circleFlatEdgeCount, _opacity, _oneDegreePadding } = this;
253
- gl.disable(gl.DEPTH_TEST);
254
- const is3D = globe.api_GetCurrentGeometry() === 0;
255
- // const lod = globe.api_GetCurrentLOD();
256
- if (is3D) {
257
- _circleProgram3D.draw(circle3DVao, bufferOrchestrator.length, _opacity);
258
- if (_oneDegreePadding) _padding3dProgram.draw(_padding3dOneDegreeVao, bufferOrchestrator.length, 360, 1, _opacity);
259
- } else {
260
- _circleProgram2D.draw(circle2DVao, bufferOrchestrator.length, _circleFlatEdgeCount, _opacity);
261
- // _padding2dProgram.draw(bigPaddingVAO, paddingBufferOrchestrator.length, _opacity);
262
- if (_oneDegreePadding) _padding2dProgram.draw(oneDegreePaddingVao, bufferOrchestrator.length * _circleFlatEdgeCount, _opacity);
263
- }
264
- _bigPadding3dFlatProgram.draw(_bigPadding3dFlatVAO, paddingBufferOrchestrator.length, _opacity);
265
- gl.enable(gl.DEPTH_TEST);
266
- }
267
-
268
- free() {
269
- if (this._isFreed) return;
270
- const { globe } = this;
271
- this.bufferManagersCompMap.forEach(({ bufferManager }) => bufferManager.free());
272
- this.bufferManagersCompMapPadding.forEach(({ bufferManager }) => bufferManager.free());
273
- // delete vaos
274
- this.gl.deleteVertexArray(this.circle2DVao);
275
- this.gl.deleteVertexArray(this.circle3DVao);
276
- this.gl.deleteVertexArray(this.oneDegreePaddingVao);
277
- this.gl.deleteVertexArray(this._padding3dOneDegreeVao);
278
- this.gl.deleteVertexArray(this._bigPadding3dFlatVAO);
279
- // delete programs
280
- CircleCache2D.release(globe);
281
- CircleCache3D.release(globe);
282
- LinesColorInstancedFlatCache.release(globe);
283
- CirclePadding3DCache.release(globe);
284
- LineOnGlobeCache.release(globe);
285
- this.textPlugin?.free();
286
-
287
- this._isFreed = true;
288
- }
289
79
 
290
80
 
291
- // API
81
+ // USER API
292
82
 
293
83
  /**
294
84
  * @method updateCentersCoordinate @param { Array < { centerID, long,lat } >} items
@@ -354,10 +144,8 @@ class RangeRings {
354
144
  const paddingDatas = this.__reconstructCentralRingsBigPaddings(item.centerID);
355
145
  paddingBufferOrchestrator.insertBulk(paddingDatas, bufferManagersCompMapPadding);
356
146
  }
357
-
358
147
  this.textPlugin?.insertBulk(items);
359
148
  globe.DrawRender();
360
-
361
149
  }
362
150
 
363
151
 
@@ -458,7 +246,6 @@ class RangeRings {
458
246
  * @method setOpacity @param { number } opacity
459
247
  */
460
248
  setOpacity(opacity) {
461
- console.log("opacity", opacity, typeof opacity);
462
249
  if (typeof opacity !== "number" || opacity < 0 || opacity > 1) throw new Error("Invalid opacity value");
463
250
  this._opacity = opacity;
464
251
  this.textPlugin?.setOpacity(opacity);
@@ -470,25 +257,163 @@ class RangeRings {
470
257
  * @method setOneDegreePaddingOn // performance consuming, might be removed
471
258
  */
472
259
  setOneDegreePaddingOn(isOneDegreePaddingOn) {
473
- // TODO
260
+ if (typeof isOneDegreePaddingOn !== "boolean") throw new Error("Invalid value for one degree padding");
474
261
  if (this._oneDegreePadding === isOneDegreePaddingOn) return;
475
262
  this._oneDegreePadding = isOneDegreePaddingOn;
263
+ this.globe.DrawRender();
264
+ }
476
265
 
477
- // Complicated
478
- // if (isOneDegreePaddingOn) {
479
- // // fill the Coordinate Buffer for 1 degree Padding
480
- // // Use orchastrator to create data for all rings
481
266
 
482
- // } else {
483
- // // empty the Coordinate Buffer for 1 degree Padding
484
- // }
267
+ setZAlphaOnDegreePadding(zAlphaOnDegreePadding) {
268
+ if (zAlphaOnDegreePadding !== 0 && zAlphaOnDegreePadding !== 1) throw new Error("Invalid value for zAlphaOnDegreePadding");
269
+ if (this._zAlphaOnDegreePadding === zAlphaOnDegreePadding) return;
270
+ this._zAlphaOnDegreePadding = zAlphaOnDegreePadding;
271
+ this.globe.DrawRender();
485
272
  }
486
273
 
274
+
275
+ // PRIVATE METHODS
276
+
277
+ _initPrograms() {
278
+ const { globe } = this;
279
+ this._circleProgram2D = CircleCache2D.get(globe);
280
+ this._circleProgram3D = CircleCache3D.get(globe);
281
+ this._padding2dProgram = LinesColorInstancedFlatCache.get(globe);
282
+ this._padding3dProgram = CirclePadding3DCache.get(globe);
283
+ this._bigPadding3dFlatProgram = LineOnGlobeCache.get(globe);
284
+
285
+ }
286
+
287
+
288
+ _initBufferManagers() {
289
+ const { gl } = this;
290
+
291
+ const initialCapacity = 10;
292
+ const bufferType = "DYNAMIC_DRAW";
293
+ // circle2d, circle3d, 1 degree paddings,
294
+ this.bufferOrchestrator = new BufferOrchestrator({ capacity: initialCapacity });
295
+
296
+ this.bufferManagersCompMap = new Map(
297
+ [
298
+ // circle 3D
299
+ ["centerCoords3d", {
300
+ 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
301
+ 'adaptor': (item) => new Float32Array(item.centerCoords3d),
302
+ }],
303
+ ["rgba", {
304
+ 'bufferManager': new BufferManager(gl, 4, { bufferType, initialCapacity }),
305
+ 'adaptor': (item) => new Float32Array(item.hide === 1 ? [0, 0, 0, 0] : item.rgba)
306
+ }],
307
+ ["radius3d", {
308
+ 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
309
+ 'adaptor': (item) => new Float32Array([item.radius])
310
+ }],
311
+ ["radius3dsmall", {
312
+ 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
313
+ 'adaptor': (item) => new Float32Array([item.radius - item.padding / 3])
314
+ }],
315
+ ["circleDashAngle", {
316
+ 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
317
+ 'adaptor': (item) => new Float32Array([1]),
318
+ }],
319
+ ["dashOpacity", {
320
+ 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
321
+ 'adaptor': (item) => new Float32Array([1]),
322
+ }],
323
+
324
+ // circle 2D
325
+ ["centerCoords2dflatForPadding", {
326
+ 'bufferManager': new BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT * 2, { bufferType, initialCapacity }),
327
+ 'adaptor': (item) => item.centerCoords2dflatForPadding,
328
+ }],
329
+ ["centerCoords2dflat", {
330
+ 'bufferManager': new BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT * 2, { bufferType, initialCapacity }),
331
+ 'adaptor': (item) => item.centerCoords2dflat,
332
+ }],
333
+ ["rgbaMercator", {
334
+ 'bufferManager': new BufferManager(gl, 4 * CIRCLE_FLAT_EDGE_COUNT, { bufferType, initialCapacity }),
335
+ 'adaptor': (item) => populateFloat32Array.fillWithListData(CIRCLE_FLAT_EDGE_COUNT, item.hide === 1 ? [0, 0, 0, 0] : item.rgba),
336
+ }],
337
+ ["circleDashAngleMercator", {
338
+ 'bufferManager': new BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT, { bufferType, initialCapacity }),
339
+ 'adaptor': (item) => populateFloat32Array.fillFloat32Array(CIRCLE_FLAT_EDGE_COUNT, 1),
340
+ }],
341
+ ["dashOpacityMercator", {
342
+ 'bufferManager': new BufferManager(gl, CIRCLE_FLAT_EDGE_COUNT, { bufferType, initialCapacity }),
343
+ 'adaptor': (item) => populateFloat32Array.fillFloat32Array(CIRCLE_FLAT_EDGE_COUNT, 1),
344
+ }],
345
+ ]
346
+ );
347
+
348
+ const obj = function (bufferManagerComp, divisor = 1) {
349
+ return { 'buffer': bufferManagerComp.bufferManager.buffer, 'stride': 0, 'offset': 0, divisor }
350
+
351
+ };
352
+ this._circle2DVao = this._circleProgram2D.createVAO(
353
+ ...["centerCoords2dflat", "rgbaMercator", "circleDashAngleMercator", "dashOpacityMercator"].map(key => obj(this.bufferManagersCompMap.get(key)))
354
+ );
355
+ this._circle3DVao = this._circleProgram3D.createVAO(
356
+ ...["centerCoords3d", "radius3d", "rgba", "circleDashAngle", "dashOpacity"].map(key => obj(this.bufferManagersCompMap.get(key)))
357
+ );
358
+
359
+ this._oneDegreePaddingVao = this._padding2dProgram.createVAO(
360
+ { buffer: this.bufferManagersCompMap.get("centerCoords2dflat").bufferManager.buffer, size: 2, stride: 0, offset: 0 },
361
+ { buffer: this.bufferManagersCompMap.get("centerCoords2dflatForPadding").bufferManager.buffer, size: 2, stride: 0, offset: 0 },
362
+ { buffer: this.bufferManagersCompMap.get("rgbaMercator").bufferManager.buffer, size: 4, stride: 0, offset: 0 },
363
+ );
364
+
365
+ // PADDING
366
+ // this one needs glue to assosiate rings and their big paddings since the count for center is not fixed
367
+ this.paddingBufferOrchestrator = new BufferOrchestrator({ capacity: initialCapacity });
368
+ this.bufferManagersCompMapPadding = new Map(
369
+ [
370
+ ["circlePoint", {
371
+ 'bufferManager': new BufferManager(gl, 2, { bufferType, initialCapacity }),
372
+ 'adaptor': (item) => item.circlePoint,
373
+ }],
374
+ ["paddingPoint", {
375
+ 'bufferManager': new BufferManager(gl, 2, { bufferType, initialCapacity }),
376
+ 'adaptor': (item) => item.paddingPoint,
377
+ }],
378
+ ["circlePoint3d", {
379
+ 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
380
+ 'adaptor': (item) => item.circlePoint3d
381
+ }],
382
+ ["paddingPoint3d", {
383
+ 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
384
+ 'adaptor': (item) => item.paddingPoint3d
385
+ }],
386
+ ["rgba", {
387
+ 'bufferManager': new BufferManager(gl, 4, { bufferType, initialCapacity }),
388
+ 'adaptor': (item) => new Float32Array(item.rgba)
389
+ }],
390
+
391
+ ["dashOpacity", {
392
+ 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
393
+ 'adaptor': (item) => new Float32Array([1]),
394
+ }],
395
+ ["dashRatio", {
396
+ 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
397
+ 'adaptor': (item) => new Float32Array([1]),
398
+ }],
399
+ ]
400
+ );
401
+
402
+ this._bigPadding3dFlatVAO = this._bigPadding3dFlatProgram.createVAO(
403
+ ...["circlePoint", "circlePoint3d", "paddingPoint", "paddingPoint3d", "dashRatio", "dashOpacity", "rgba",].map(key => obj(this.bufferManagersCompMapPadding.get(key)))
404
+ );
405
+
406
+ this._padding3dOneDegreeVao = this._padding3dProgram.createVAO(
407
+ ...["centerCoords3d", "radius3d", "radius3dsmall", "rgba"].map(key => obj(this.bufferManagersCompMap.get(key)))
408
+ );
409
+
410
+ }
411
+
412
+
487
413
  __reconstructCentralRingsBigPaddings(centerID) {
488
- const { globe, _circleFlatEdgeCount } = this;
414
+ const { globe } = this;
489
415
  const centerItem = this._ringAccount.getCenter(centerID);
490
416
  if (centerItem === undefined) throw new Error("Center not found");
491
- const findPointByPolar = globe.Math.FindPointByPolar;
492
417
  const { long, lat, stepAngle, rgba, rings, hide = 0, textHide = 0 } = centerItem;
493
418
  const result = [];
494
419
  const color = hide === 1 ? new Float32Array([0, 0, 0, 0]) : new Float32Array(rgba)
@@ -514,20 +439,22 @@ class RangeRings {
514
439
  return result;
515
440
  }
516
441
 
442
+ // IMPLICIT METHODS
443
+
517
444
  __reconstructCentralRings(centerID) {
518
- const { globe, _circleFlatEdgeCount } = this;
445
+ const { globe } = this;
519
446
  const centerItem = this._ringAccount.getCenter(centerID);
520
447
  if (centerItem === undefined) throw new Error("Center not found");
521
448
 
522
- const { long, lat, stepAngle, rgba, rings, hide = 0, textHide = 0 } = centerItem;
449
+ const { long, lat, rgba, rings, hide = 0, textHide = 0 } = centerItem;
523
450
  const centerCoords3d = globe.api_GetCartesian3DPoint(long, lat, 0, 0);
524
451
 
525
452
  const result = [];
526
453
 
527
454
  for (const { ringID, radius, padding } of rings) {
528
455
  const key = ringKeyMethod(centerID, ringID);
529
- const centerCoords2dflat = centerCoords2dflatDataCreatorWithRadius(globe, long, lat, radius, { edgeCount: _circleFlatEdgeCount });
530
- const centerCoords2dflatForPadding = centerCoords2dflatDataCreatorWithRadius(globe, long, lat, radius - padding / 3, { edgeCount: _circleFlatEdgeCount });
456
+ const centerCoords2dflat = centerCoords2dflatDataCreatorWithRadius(globe, long, lat, radius, { edgeCount: CIRCLE_FLAT_EDGE_COUNT });
457
+ const centerCoords2dflatForPadding = centerCoords2dflatDataCreatorWithRadius(globe, long, lat, radius - padding / 3, { edgeCount: CIRCLE_FLAT_EDGE_COUNT });
531
458
  result.push({
532
459
  key,
533
460
  centerCoords3d,
@@ -547,7 +474,7 @@ class RangeRings {
547
474
  __reconstructCentralPaddingProperties(centerID) {
548
475
  const centerItem = this._ringAccount.getCenter(centerID);
549
476
  if (centerItem === undefined) throw new Error("Center not found");
550
- const { long, lat, stepAngle, rgba, rings, hide = 0, textHide = 0 } = centerItem;
477
+ const { stepAngle, rgba, rings, hide = 0, textHide = 0 } = centerItem;
551
478
  const result = [];
552
479
  for (const { ringID, } of rings) {
553
480
  let angle = 0;
@@ -578,7 +505,74 @@ class RangeRings {
578
505
  }
579
506
  return result;
580
507
  }
508
+
509
+
510
+
511
+ // GLOBE API
512
+
513
+
514
+ init(globe, gl) {
515
+ this.globe = globe;
516
+ this.gl = gl;
517
+ this._initPrograms();
518
+ this._initBufferManagers();
519
+ if (this._showNumbers) {
520
+ this.textPlugin = new RangeRingAngleText(globe, this.id + "text", { flatCompassMode: this.compass, style: this._numbersStyle, opacity: this._opacity });
521
+ delete this._numbersStyle;
522
+ }
523
+ }
524
+
525
+
526
+
527
+ draw3D() {
528
+ const {
529
+ globe, gl,
530
+ _circleProgram2D, _circleProgram3D, _padding2dProgram, _padding3dProgram, _bigPadding3dFlatProgram,
531
+ _circle2DVao, _circle3DVao, _oneDegreePaddingVao, _padding3dOneDegreeVao, _bigPadding3dFlatVAO,
532
+ bufferOrchestrator, paddingBufferOrchestrator,
533
+ _opacity, _oneDegreePadding, _zAlphaOnDegreePadding } = this;
534
+ gl.disable(gl.DEPTH_TEST);
535
+ const is3D = globe.api_GetCurrentGeometry() === 0;
536
+ // const lod = globe.api_GetCurrentLOD();
537
+ if (is3D) {
538
+ _circleProgram3D.draw(_circle3DVao, bufferOrchestrator.length, _opacity);
539
+ if (_oneDegreePadding) _padding3dProgram.draw(_padding3dOneDegreeVao, bufferOrchestrator.length, 360, 1, _opacity, _zAlphaOnDegreePadding);
540
+ } else {
541
+ _circleProgram2D.draw(_circle2DVao, bufferOrchestrator.length, CIRCLE_FLAT_EDGE_COUNT, _opacity);
542
+ // _padding2dProgram.draw(bigPaddingVAO, paddingBufferOrchestrator.length, _opacity);
543
+ if (_oneDegreePadding) _padding2dProgram.draw(_oneDegreePaddingVao, bufferOrchestrator.length * CIRCLE_FLAT_EDGE_COUNT, _opacity, _zAlphaOnDegreePadding);
544
+ }
545
+ _bigPadding3dFlatProgram.draw(_bigPadding3dFlatVAO, paddingBufferOrchestrator.length, _opacity);
546
+ gl.enable(gl.DEPTH_TEST);
547
+ }
548
+
549
+ free() {
550
+ if (this._isFreed) return;
551
+ const { globe } = this;
552
+ this.bufferManagersCompMap.forEach(({ bufferManager }) => bufferManager.free());
553
+ this.bufferManagersCompMapPadding.forEach(({ bufferManager }) => bufferManager.free());
554
+ // delete vaos
555
+ this.gl.deleteVertexArray(this._circle2DVao);
556
+ this.gl.deleteVertexArray(this._circle3DVao);
557
+ this.gl.deleteVertexArray(this._oneDegreePaddingVao);
558
+ this.gl.deleteVertexArray(this._padding3dOneDegreeVao);
559
+ this.gl.deleteVertexArray(this._bigPadding3dFlatVAO);
560
+ // delete programs
561
+ CircleCache2D.release(globe);
562
+ CircleCache3D.release(globe);
563
+ LinesColorInstancedFlatCache.release(globe);
564
+ CirclePadding3DCache.release(globe);
565
+ LineOnGlobeCache.release(globe);
566
+ this._circleProgram2D = null;
567
+ this._circleProgram3D = null;
568
+ this._padding2dProgram = null;
569
+ this._padding3dProgram = null;
570
+ this._bigPadding3dFlatProgram = null;
571
+ this.textPlugin?.free();
572
+ this._isFreed = true;
573
+ }
574
+
581
575
  }
582
576
 
583
577
 
584
- export { RangeRings };
578
+ export { RangeRings, Z_ALPHA_MODE };
package/util/check/get.js CHANGED
@@ -1,6 +1,7 @@
1
1
 
2
2
  export const mapGetOrThrow = (errorNote) => {
3
3
  return (mapInstance, ids) => {
4
+ if (!ids) throw new Error("There is no map keys to get");
4
5
  const result = [];
5
6
  for (let i = 0; i < ids.length; i++) {
6
7
  const e = mapInstance.get(ids[i]);
@@ -159,6 +159,14 @@ export class ContextTextWriter3 {
159
159
  this.itemMap.set(key, { long: coords.long, lat: coords.lat, text, opacity, angle, payload: item, position });
160
160
  }
161
161
 
162
+
163
+ updateText() {
164
+ this.itemMap.forEach((v, k, m) => {
165
+ const { payload } = v;
166
+ this.insertText(payload, 0, m, payload);
167
+ });
168
+ }
169
+
162
170
  clear() {
163
171
  this.itemMap.clear();
164
172
  }