@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
|
@@ -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
|
-
|
|
7
|
+
cartesian3DToGLPosition,
|
|
7
8
|
circleLimpFromLongLatRadCenterCartesian3D_accurate,
|
|
8
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
38
|
-
z_alpha = z_level
|
|
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.
|
|
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);
|
package/programs/util.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
|
|
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 }
|
package/rangerings/plugin.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
483
|
-
|
|
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
|
|
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
|
|
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,
|
|
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:
|
|
530
|
-
const centerCoords2dflatForPadding = centerCoords2dflatDataCreatorWithRadius(globe, long, lat, radius - padding / 3, { edgeCount:
|
|
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 {
|
|
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 };
|