@pirireis/webglobeplugins 0.6.28-c → 0.6.29-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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pirireis/webglobeplugins",
3
- "version": "0.6.28-c",
3
+ "version": "0.6.29-c",
4
4
  "main": "index.js",
5
5
  "author": "Toprak Nihat Deniz Ozturk",
6
6
  "license": "MIT"
@@ -2,12 +2,11 @@ import { createProgram } from "../../util/webglobjectbuilders";
2
2
  import { CameraUniformBlockString, CameraUniformBlockTotemCache } from "../totems/camerauniformblock";
3
3
  import { noRegisterGlobeProgramCache } from "../programcache";
4
4
  import { vaoAttributeLoader } from "../../util/account/util";
5
+ import { Z_ALPHA_MODE } from "./util";
5
6
  import {
6
- longLatRadToMercator, longLatRadToCartesian3D, cartesian3DToGLPosition, mercatorXYToGLPosition, realDistanceOnSphereR1,
7
+ cartesian3DToGLPosition,
7
8
  circleLimpFromLongLatRadCenterCartesian3D_accurate,
8
- circleLimpFromLongLatRadCenterMercatorCompass_accurate,
9
- circleLimpFromLongLatRadCenterMercatorRealDistanceNew_accurate,
10
- POLE
9
+ POLE,
11
10
  } from "../../util/shaderfunctions/geometrytransformations";
12
11
 
13
12
 
@@ -25,14 +24,8 @@ const INITIAL_EDGE_COUNT = 360;
25
24
  const vertexShaderSource = `#version 300 es
26
25
  precision highp float;
27
26
  ${CameraUniformBlockString}
28
- ${longLatRadToMercator}
29
- ${longLatRadToCartesian3D}
30
27
  ${cartesian3DToGLPosition}
31
- ${mercatorXYToGLPosition}
32
- ${realDistanceOnSphereR1}
33
28
  ${circleLimpFromLongLatRadCenterCartesian3D_accurate}
34
- ${circleLimpFromLongLatRadCenterMercatorCompass_accurate}
35
- ${circleLimpFromLongLatRadCenterMercatorRealDistanceNew_accurate}
36
29
 
37
30
 
38
31
  in vec3 center_position3d;
@@ -42,6 +35,7 @@ in vec4 color;
42
35
 
43
36
  uniform float edge_count;
44
37
  uniform float step_angle;
38
+ uniform int z_alpha_on;
45
39
 
46
40
  out float interpolation;
47
41
  out vec4 v_color;
@@ -49,6 +43,12 @@ void main() {
49
43
  if( !is3D) {
50
44
  return;
51
45
  }
46
+ v_color = color;
47
+ if ( z_alpha_on == 1 ){
48
+ float z_alpha = pow(z_level * 0.75, 3.0) * distance(big_radius, small_radius) / (R * 2.0);
49
+ if ( z_alpha < 0.1 ) { return; }
50
+ v_color.a *= z_alpha;
51
+ }
52
52
  int pad_phase = gl_VertexID % 2; // 0 or 1
53
53
  interpolation = float( gl_VertexID - pad_phase) / edge_count;
54
54
  float angle = float( gl_VertexID - pad_phase) * step_angle;
@@ -59,7 +59,7 @@ void main() {
59
59
  position = circleLimpFromLongLatRadCenterCartesian3D_accurate(center_position3d, small_radius, angle);
60
60
  }
61
61
  gl_Position = cartesian3DToGLPosition(position);
62
- v_color = color;
62
+
63
63
  gl_PointSize = 5.0;
64
64
  }`
65
65
 
@@ -87,13 +87,15 @@ class Logic {
87
87
  this._lastOpacity = 1.0;
88
88
  this._lastEdgeCount = INITIAL_EDGE_COUNT;
89
89
  this._lastStepAngle = 360 / INITIAL_EDGE_COUNT;
90
+ this._lastZAlphaMode = Z_ALPHA_MODE.ON;
90
91
  this.program = createProgram(this.gl, vertexShaderSource, fragmentShaderSource);
91
92
 
92
93
  const { gl, program } = this;
93
94
  this.program.uniforms = {
94
95
  opacity: gl.getUniformLocation(program, "opacity"),
95
96
  edgeCount: gl.getUniformLocation(program, "edge_count"),
96
- stepAngle: gl.getUniformLocation(program, "step_angle")
97
+ stepAngle: gl.getUniformLocation(program, "step_angle"),
98
+ zAlphaMode: gl.getUniformLocation(program, "z_alpha_on")
97
99
  };
98
100
 
99
101
  { // initial uniform values
@@ -102,6 +104,7 @@ class Logic {
102
104
  gl.uniform1f(program.uniforms.opacity, 1.0);
103
105
  gl.uniform1f(program.uniforms.edgeCount, INITIAL_EDGE_COUNT * 2);
104
106
  gl.uniform1f(program.uniforms.stepAngle, this._lastStepAngle * Math.PI / 180);
107
+ gl.uniform1i(program.uniforms.zAlphaMode, Z_ALPHA_MODE.ON);
105
108
  gl.useProgram(currentProgram);
106
109
  }
107
110
 
@@ -147,7 +150,7 @@ class Logic {
147
150
  return vao;
148
151
  }
149
152
 
150
- draw(vao, length, edgeCount, stepAngle, opacity) {
153
+ draw(vao, length, edgeCount, stepAngle, opacity, zAlphaMode = Z_ALPHA_MODE.ON) {
151
154
  const { gl, program, cameraBlockTotem, cameraBindingPoint } = this;
152
155
  gl.useProgram(program);
153
156
 
@@ -163,6 +166,10 @@ class Logic {
163
166
  gl.uniform1f(program.uniforms.stepAngle, stepAngle * Math.PI / 180);
164
167
  this._lastStepAngle = stepAngle;
165
168
  }
169
+ if (this._lastZAlphaMode !== zAlphaMode) {
170
+ gl.uniform1i(program.uniforms.zAlphaMode, zAlphaMode);
171
+ this._lastZAlphaMode = zAlphaMode;
172
+ }
166
173
  gl.bindVertexArray(vao);
167
174
  cameraBlockTotem.bind(cameraBindingPoint);
168
175
  gl.drawArraysInstanced(gl.LINES, 0, edgeCount * 2, length);
@@ -3,17 +3,15 @@ import { mercatorXYToGLPosition, POLE } from "../../util/shaderfunctions/geometr
3
3
  import { noRegisterGlobeProgramCache } from "../programcache";
4
4
  import { createProgram } from "../../util";
5
5
  import { vaoAttributeLoader } from "../../util/account/util";
6
+ import { Z_ALPHA_MODE } from "./util";
6
7
 
7
8
  /**
8
9
  * This program draws line between points provided from the first and second buffer.
9
10
  * draw method gl.drawArraysInstanced( gl.POINTS, 0,2, lineCount);
10
11
  * */
11
12
 
12
- const Z_ALPHA_MODE = Object.freeze({
13
- ON: 1,
14
- OFF: 0
15
- });
16
13
 
14
+ // TODO: find better way to eleminate edge case distance(posA, posB) > 37000000.0
17
15
  const vertexShaderSource = `#version 300 es
18
16
  precision highp float;
19
17
  ${CameraUniformBlockString}
@@ -32,10 +30,11 @@ void main() {
32
30
  if ( is3D ) {
33
31
  return;
34
32
  }
35
- float gap = distance(posA, posB);
33
+ float gap = max( distance(posA.x, posB.x), distance(posA.y,posB.y)); //
34
+ if ( gap > 37000000.0) { return; }
36
35
  float z_alpha;
37
- if ( z_alpha_on == 1 || gap > 37000000.0){
38
- z_alpha = z_level * z_level / ( gap / 100.0 );
36
+ if ( z_alpha_on == 1 ){
37
+ z_alpha = pow(z_level,3.0) / ( 37000000.0 / gap);
39
38
  if( z_alpha < 0.1 ) {return;}
40
39
  if( z_alpha > 1.0 ) {z_alpha = 1.0;}
41
40
  } else {
@@ -115,7 +114,7 @@ class Logic {
115
114
  }
116
115
 
117
116
 
118
- draw(vao, lineCount, opacity = 1.0, zAlphaOn = Z_ALPHA_MODE.OFF) {
117
+ draw(vao, lineCount, opacity = 1.0, zAlphaOn = Z_ALPHA_MODE.ON) {
119
118
  const { gl, program, _cameraBindingPoint, _cameraUniformBlock } = this;
120
119
  gl.useProgram(program);
121
120
  _cameraUniformBlock.bind(_cameraBindingPoint);
@@ -0,0 +1,8 @@
1
+
2
+ const Z_ALPHA_MODE = Object.freeze({
3
+ ON: 1,
4
+ OFF: 0
5
+ });
6
+
7
+
8
+ export { Z_ALPHA_MODE }
package/programs/util.js CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
 
3
- export function longlatbbox2normalbbox({ minLon = -180, maxLon = 180, minLat = -90, maxLat = 90 } = {}) {
3
+ function longlatbbox2normalbbox({ minLon = -180, maxLon = 180, minLat = -90, maxLat = 90 } = {}) {
4
4
  // x
5
5
  const horOffset = (minLon) * Math.PI / 180;
6
6
  const horSize = (maxLon - minLon) * Math.PI / 180;
@@ -15,3 +15,6 @@ export function longlatbbox2normalbbox({ minLon = -180, maxLon = 180, minLat = -
15
15
  console.log("longlatbbox2normalbbox", result);
16
16
  return result;
17
17
  }
18
+
19
+
20
+ export { longlatbbox2normalbbox }
@@ -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 };