@openglobus/og 0.12.4 → 0.13.0

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 (93) hide show
  1. package/README.md +0 -2
  2. package/dist/@openglobus/og.esm.js +2 -2
  3. package/dist/@openglobus/og.esm.js.map +1 -1
  4. package/dist/@openglobus/og.umd.js +2 -2
  5. package/dist/@openglobus/og.umd.js.map +1 -1
  6. package/package.json +7 -7
  7. package/src/og/Extent.js +3 -3
  8. package/src/og/Globe.js +277 -275
  9. package/src/og/ImageCanvas.js +3 -3
  10. package/src/og/LonLat.js +9 -9
  11. package/src/og/QueueArray.js +2 -2
  12. package/src/og/Rectangle.js +5 -5
  13. package/src/og/bv/Box.js +1 -1
  14. package/src/og/bv/Sphere.js +2 -2
  15. package/src/og/camera/Camera.js +1 -1
  16. package/src/og/camera/PlanetCamera.js +649 -646
  17. package/src/og/control/LayerSwitcher.js +1 -1
  18. package/src/og/control/MouseNavigation.js +22 -13
  19. package/src/og/control/MouseWheelZoomControl.js +2 -2
  20. package/src/og/control/ScaleControl.js +1 -1
  21. package/src/og/control/TouchNavigation.js +319 -319
  22. package/src/og/control/ZoomControl.js +132 -132
  23. package/src/og/control/visibleExtent/Segment.js +12 -12
  24. package/src/og/ellipsoid/Ellipsoid.js +577 -567
  25. package/src/og/entity/BillboardHandler.js +878 -1051
  26. package/src/og/entity/Entity.js +1 -1
  27. package/src/og/entity/EntityCollection.js +847 -857
  28. package/src/og/entity/GeoObjectHandler.js +2 -2
  29. package/src/og/entity/LabelHandler.js +888 -1040
  30. package/src/og/entity/LabelWorker.js +0 -6
  31. package/src/og/entity/PointCloud.js +495 -495
  32. package/src/og/entity/Polyline.js +2218 -2222
  33. package/src/og/entity/RayHandler.js +1 -1
  34. package/src/og/layer/CanvasTiles.js +6 -3
  35. package/src/og/layer/GeoImage.js +1 -1
  36. package/src/og/layer/KML.js +5 -5
  37. package/src/og/layer/Layer.js +800 -752
  38. package/src/og/layer/Vector.js +997 -1010
  39. package/src/og/layer/XYZ.js +359 -357
  40. package/src/og/math/Line2.js +4 -4
  41. package/src/og/math/Quat.js +2 -2
  42. package/src/og/math/Ray.js +2 -2
  43. package/src/og/math/Vec2.js +524 -524
  44. package/src/og/math/Vec3.js +900 -900
  45. package/src/og/math/Vec4.js +261 -261
  46. package/src/og/math.js +397 -398
  47. package/src/og/quadTree/EntityCollectionNode.js +389 -387
  48. package/src/og/renderer/Renderer.js +14 -20
  49. package/src/og/renderer/RendererEvents.js +1034 -1045
  50. package/src/og/scene/Planet.js +12 -9
  51. package/src/og/scene/RenderNode.js +347 -354
  52. package/src/og/segment/Segment.js +3 -1
  53. package/src/og/segment/SegmentLonLat.js +1 -4
  54. package/src/og/shaders/billboard.js +220 -204
  55. package/src/og/shaders/drawnode.js +603 -603
  56. package/src/og/shaders/label.js +596 -456
  57. package/src/og/shaders/polyline.js +365 -361
  58. package/src/og/terrain/MapboxTerrain.js +1 -1
  59. package/src/og/utils/FontAtlas.js +209 -200
  60. package/src/og/utils/GeoImageCreator.js +4 -5
  61. package/src/og/utils/TextureAtlas.js +4 -4
  62. package/src/og/utils/VectorTileCreator.js +414 -414
  63. package/src/og/utils/shared.js +1 -1
  64. package/src/og/webgl/Handler.js +28 -60
  65. package/src/og/webgl/Multisample.js +260 -260
  66. package/src/og/webgl/Program.js +411 -396
  67. package/types/bv/Box.d.ts +1 -1
  68. package/types/bv/Sphere.d.ts +1 -1
  69. package/types/camera/PlanetCamera.d.ts +3 -3
  70. package/types/control/LayerSwitcher.d.ts +1 -1
  71. package/types/ellipsoid/Ellipsoid.d.ts +9 -2
  72. package/types/entity/BillboardHandler.d.ts +0 -4
  73. package/types/entity/EntityCollection.d.ts +0 -8
  74. package/types/entity/LabelHandler.d.ts +0 -2
  75. package/types/entity/Polyline.d.ts +1 -1
  76. package/types/layer/KML.d.ts +11 -11
  77. package/types/layer/Layer.d.ts +4 -0
  78. package/types/layer/Vector.d.ts +1 -8
  79. package/types/math/Line2.d.ts +4 -4
  80. package/types/math/Ray.d.ts +2 -2
  81. package/types/math/Vec2.d.ts +1 -1
  82. package/types/math/Vec3.d.ts +1 -1
  83. package/types/math/Vec4.d.ts +2 -2
  84. package/types/math.d.ts +1 -1
  85. package/types/renderer/Renderer.d.ts +1 -1
  86. package/types/renderer/RendererEvents.d.ts +1 -1
  87. package/types/shaders/label.d.ts +1 -1
  88. package/types/utils/FontAtlas.d.ts +3 -2
  89. package/types/utils/TextureAtlas.d.ts +3 -3
  90. package/types/utils/VectorTileCreator.d.ts +4 -4
  91. package/types/utils/shared.d.ts +1 -1
  92. package/types/webgl/Handler.d.ts +6 -31
  93. package/types/webgl/Program.d.ts +2 -0
@@ -1,414 +1,414 @@
1
- /**
2
- * @module og/utils/VectorTileCreator
3
- */
4
-
5
- 'use strict';
6
-
7
- import { doubleToTwoFloats2 } from '../math/coder.js';
8
- import * as quadTree from '../quadTree/quadTree.js';
9
- import { Framebuffer } from '../webgl/Framebuffer.js';
10
- import { Program } from '../webgl/Program.js';
11
-
12
- let tempArr = new Float32Array(2);
13
-
14
- export class VectorTileCreator {
15
-
16
- constructor(planet, maxFrames, width, height) {
17
-
18
- this._width = width || 256;
19
- this._height = height || 256;
20
- this._handler = planet.renderer.handler;
21
- this._planet = planet;
22
- this._framebuffer = null;
23
- this.MAX_FRAMES = maxFrames || 5;
24
- this._currentFrame = 0;
25
- this._queue = [];
26
- this._initialize();
27
- }
28
-
29
- _initialize() {
30
-
31
- //Line
32
- if (!this._handler.programs.vectorTileLineRasterization) {
33
- this._handler.addProgram(new Program("vectorTileLineRasterization", {
34
- uniforms: {
35
- 'viewport': "vec2",
36
- 'thicknessOutline': "float",
37
- 'alpha': "float",
38
- 'extentParamsHigh': "vec4",
39
- 'extentParamsLow': "vec4"
40
- },
41
- attributes: {
42
- 'prevHigh': "vec2",
43
- 'currentHigh': "vec2",
44
- 'nextHigh': "vec2",
45
-
46
- 'prevLow': "vec2",
47
- 'currentLow': "vec2",
48
- 'nextLow': "vec2",
49
-
50
- 'order': "float",
51
- 'color': "vec4",
52
- 'thickness': "float"
53
- },
54
- vertexShader:
55
- `attribute vec2 prevHigh;
56
- attribute vec2 currentHigh;
57
- attribute vec2 nextHigh;
58
-
59
- attribute vec2 prevLow;
60
- attribute vec2 currentLow;
61
- attribute vec2 nextLow;
62
-
63
- attribute float order;
64
- attribute float thickness;
65
- attribute vec4 color;
66
- uniform float thicknessOutline;
67
- uniform vec2 viewport;
68
- uniform vec4 extentParamsHigh;
69
- uniform vec4 extentParamsLow;
70
- varying vec4 vColor;
71
-
72
- vec2 proj(vec2 coordHigh, vec2 coordLow) {
73
- vec2 highDiff = coordHigh - extentParamsHigh.xy;
74
- vec2 lowDiff = coordLow - extentParamsLow.xy;
75
- return vec2(-1.0 + (highDiff + lowDiff) * extentParamsHigh.zw) * vec2(1.0, -1.0);
76
- }
77
-
78
- void main(){
79
- vColor = color;
80
-
81
- vec2 vNext = proj(nextHigh, nextLow),
82
- vCurrent = proj(currentHigh, currentLow),
83
- vPrev = proj(prevHigh, prevLow);
84
-
85
- vec2 _next = vNext;
86
- vec2 _prev = vPrev;
87
- vec2 _current = vCurrent;
88
-
89
- if(_prev == _current){
90
- if(_next == _current){
91
- _next = _current + vec2(1.0, 0.0);
92
- _prev = _current - _next;
93
- }else{
94
- _prev = _current + normalize(_current - _next);
95
- }
96
- }
97
-
98
- if(_next == _current){
99
- _next = _current + normalize(_current - _prev);
100
- }
101
-
102
- vec2 sNext = _next;
103
- vec2 sCurrent = _current;
104
- vec2 sPrev = _prev;
105
-
106
- vec2 dirNext = normalize(sNext - sCurrent);
107
- vec2 dirPrev = normalize(sPrev - sCurrent);
108
- float dotNP = dot(dirNext, dirPrev);
109
-
110
- vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));
111
- vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));
112
- vec2 d = (thickness + thicknessOutline) * 0.5 * sign(order) / viewport;
113
-
114
- vec2 m;
115
- if(dotNP >= 0.99991){
116
- m = sCurrent - normalPrev * d;
117
- }else{
118
- vec2 dir = normalPrev + normalNext;
119
- m = sCurrent + dir * d / (dirNext.x * dir.y - dirNext.y * dir.x);
120
-
121
- if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){
122
- float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);
123
- if(occw == -1.0){
124
- m = sCurrent + normalPrev * d;
125
- }else if(occw == 1.0){
126
- m = sCurrent + normalNext * d;
127
- }else if(occw == -2.0){
128
- m = sCurrent + normalNext * d;
129
- }else if(occw == 2.0){
130
- m = sCurrent + normalPrev * d;
131
- }
132
- }else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){
133
- m = sCurrent + normalNext * d;
134
- }
135
- }
136
- gl_Position = vec4(m.x, m.y, 0.0, 1.0);
137
- }`,
138
- fragmentShader: `precision highp float;
139
- uniform float alpha;
140
- varying vec4 vColor;
141
- void main() {
142
- gl_FragColor = vec4(vColor.rgb, alpha * vColor.a);
143
- }`
144
- }));
145
- }
146
-
147
- //Polygon
148
- if (!this._handler.programs.vectorTilePolygonRasterization) {
149
- this._handler.addProgram(new Program("vectorTilePolygonRasterization", {
150
- uniforms: {
151
- 'extentParamsHigh': "vec4",
152
- 'extentParamsLow': "vec4"
153
- },
154
- attributes: {
155
- 'coordinatesHigh': "vec2",
156
- 'coordinatesLow': "vec2",
157
- 'colors': "vec4"
158
- },
159
- vertexShader:
160
- `attribute vec2 coordinatesHigh;
161
- attribute vec2 coordinatesLow;
162
- attribute vec4 colors;
163
- uniform vec4 extentParamsHigh;
164
- uniform vec4 extentParamsLow;
165
- varying vec4 color;
166
-
167
- vec2 proj(vec2 coordHigh, vec2 coordLow) {
168
- vec2 highDiff = coordHigh - extentParamsHigh.xy;
169
- vec2 lowDiff = coordLow - extentParamsLow.xy;
170
- return vec2(-1.0 + (highDiff + lowDiff) * extentParamsHigh.zw) * vec2(1.0, -1.0);
171
- }
172
-
173
- void main() {
174
- color = colors;
175
- gl_Position = vec4(proj(coordinatesHigh, coordinatesLow), 0.0, 1.0);
176
- }`,
177
- fragmentShader:
178
- `precision highp float;
179
- varying vec4 color;
180
- void main () {
181
- gl_FragColor = color;
182
- }`
183
- }));
184
- }
185
-
186
- this._framebuffer = new Framebuffer(this._handler, {
187
- width: this._width,
188
- height: this._height,
189
- useDepth: false
190
- });
191
- this._framebuffer.init();
192
- }
193
-
194
- frame() {
195
- if (this._planet.layerLock.isFree() && this._queue.length) {
196
- var h = this._handler,
197
- gl = h.gl;
198
-
199
- gl.disable(gl.CULL_FACE);
200
- gl.disable(gl.DEPTH_TEST);
201
- gl.enable(gl.BLEND);
202
- gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
203
- gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
204
-
205
- var hLine = h.programs.vectorTileLineRasterization,
206
- hPoly = h.programs.vectorTilePolygonRasterization;
207
-
208
- var _w = this._width,
209
- _h = this._height,
210
- width = _w,
211
- height = _h,
212
- _w2 = width << 1,
213
- _h2 = height << 1;
214
-
215
- var pickingMask = null,
216
- texture = null;
217
-
218
- // var prevLayerId = -1;
219
-
220
- var extentParamsHigh = new Float32Array(4);
221
- var extentParamsLow = new Float32Array(4);
222
-
223
- var f = this._framebuffer.activate();
224
-
225
- var deltaTime = 0,
226
- startTime = window.performance.now();
227
-
228
- while (this._planet.layerLock.isFree() && this._queue.length && deltaTime < 0.25) {
229
- var material = this._queue.shift();
230
- if (material.isLoading && material.segment.node.getState() === quadTree.RENDERING) {
231
-
232
- if (material.segment.tileZoom <= 3) {
233
- width = _w2;
234
- height = _h2;
235
- } else {
236
- width = _w;
237
- height = _h;
238
- }
239
-
240
- texture = (material._updateTexture && material._updateTexture) || h.createEmptyTexture_l(width, height);
241
-
242
- f.setSize(width, height);
243
-
244
- f.bindOutputTexture(texture);
245
-
246
- gl.clearColor(0.0, 0.0, 0.0, 0.0);
247
- gl.clear(gl.COLOR_BUFFER_BIT);
248
-
249
- var extent = material.segment.getExtentMerc();
250
-
251
- doubleToTwoFloats2(extent.southWest.lon, tempArr);
252
- extentParamsHigh[0] = tempArr[0];
253
- extentParamsLow[0] = tempArr[1];
254
-
255
- doubleToTwoFloats2(extent.southWest.lat, tempArr);
256
- extentParamsHigh[1] = tempArr[0];
257
- extentParamsLow[1] = tempArr[1];
258
-
259
- extentParamsHigh[2] = 2.0 / extent.getWidth();
260
- extentParamsHigh[3] = 2.0 / extent.getHeight();
261
-
262
- hPoly.activate();
263
- var sh = hPoly._program;
264
- var sha = sh.attributes,
265
- shu = sh.uniforms;
266
-
267
- var geomHandler = material.layer._geometryHandler;
268
-
269
- //=========================================
270
- //Polygon rendering
271
- //=========================================
272
- gl.uniform4fv(shu.extentParamsHigh, extentParamsHigh);
273
- gl.uniform4fv(shu.extentParamsLow, extentParamsLow);
274
-
275
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._polyVerticesHighBufferMerc);
276
- gl.vertexAttribPointer(sha.coordinatesHigh, geomHandler._polyVerticesHighBufferMerc.itemSize, gl.FLOAT, false, 0, 0);
277
-
278
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._polyVerticesLowBufferMerc);
279
- gl.vertexAttribPointer(sha.coordinatesLow, geomHandler._polyVerticesLowBufferMerc.itemSize, gl.FLOAT, false, 0, 0);
280
-
281
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._polyColorsBuffer);
282
- gl.vertexAttribPointer(sha.colors, geomHandler._polyColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
283
-
284
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geomHandler._polyIndexesBuffer);
285
-
286
- gl.drawElements(gl.TRIANGLES, geomHandler._polyIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
287
-
288
- //Polygon picking PASS
289
- if (material.layer._pickingEnabled) {
290
- if (!material.pickingReady) {
291
- if (material._updatePickingMask) {
292
- pickingMask = material._updatePickingMask;
293
- } else {
294
- pickingMask = h.createEmptyTexture_n(width, height);
295
- }
296
-
297
- f.bindOutputTexture(pickingMask);
298
-
299
- gl.clearColor(0.0, 0.0, 0.0, 0.0);
300
- gl.clear(gl.COLOR_BUFFER_BIT);
301
-
302
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._polyPickingColorsBuffer);
303
- gl.vertexAttribPointer(sha.colors, geomHandler._polyPickingColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
304
-
305
- gl.drawElements(gl.TRIANGLES, geomHandler._polyIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
306
- } else {
307
- pickingMask = material.pickingMask;
308
- }
309
- }
310
-
311
- //=========================================
312
- //Strokes and linestrings rendering
313
- //=========================================
314
- f.bindOutputTexture(texture);
315
-
316
- hLine.activate();
317
- sh = hLine._program;
318
- sha = sh.attributes;
319
- shu = sh.uniforms;
320
-
321
- gl.uniform2fv(shu.viewport, [width, height]);
322
-
323
- gl.uniform4fv(shu.extentParamsHigh, extentParamsHigh);
324
- gl.uniform4fv(shu.extentParamsLow, extentParamsLow);
325
-
326
- //vertex
327
- var mb = geomHandler._lineVerticesHighBufferMerc;
328
- gl.bindBuffer(gl.ARRAY_BUFFER, mb);
329
-
330
- gl.vertexAttribPointer(sha.prevHigh, mb.itemSize, gl.FLOAT, false, 8, 0);
331
- gl.vertexAttribPointer(sha.currentHigh, mb.itemSize, gl.FLOAT, false, 8, 32);
332
- gl.vertexAttribPointer(sha.nextHigh, mb.itemSize, gl.FLOAT, false, 8, 64);
333
-
334
- mb = geomHandler._lineVerticesLowBufferMerc;
335
- gl.bindBuffer(gl.ARRAY_BUFFER, mb);
336
-
337
- gl.vertexAttribPointer(sha.prevLow, mb.itemSize, gl.FLOAT, false, 8, 0);
338
- gl.vertexAttribPointer(sha.currentLow, mb.itemSize, gl.FLOAT, false, 8, 32);
339
- gl.vertexAttribPointer(sha.nextLow, mb.itemSize, gl.FLOAT, false, 8, 64);
340
-
341
- //order
342
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineOrdersBuffer);
343
- gl.vertexAttribPointer(sha.order, geomHandler._lineOrdersBuffer.itemSize, gl.FLOAT, false, 4, 0);
344
-
345
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geomHandler._lineIndexesBuffer);
346
-
347
- //PASS - stroke
348
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineStrokesBuffer);
349
- gl.vertexAttribPointer(sha.thickness, geomHandler._lineStrokesBuffer.itemSize, gl.FLOAT, false, 0, 0);
350
-
351
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineStrokeColorsBuffer);
352
- gl.vertexAttribPointer(sha.color, geomHandler._lineStrokeColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
353
-
354
- //Antialias pass
355
- gl.uniform1f(shu.thicknessOutline, 2);
356
- gl.uniform1f(shu.alpha, 0.54);
357
- gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
358
- //
359
- //Aliased pass
360
- gl.uniform1f(shu.thicknessOutline, 1);
361
- gl.uniform1f(shu.alpha, 1.0);
362
- gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
363
-
364
- //PASS - inside line
365
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineThicknessBuffer);
366
- gl.vertexAttribPointer(sha.thickness, geomHandler._lineThicknessBuffer.itemSize, gl.FLOAT, false, 0, 0);
367
-
368
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineColorsBuffer);
369
- gl.vertexAttribPointer(sha.color, geomHandler._lineColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
370
-
371
- //Antialias pass
372
- gl.uniform1f(shu.thicknessOutline, 2);
373
- gl.uniform1f(shu.alpha, 0.54);
374
- gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
375
- //
376
- //Aliased pass
377
- gl.uniform1f(shu.thicknessOutline, 1);
378
- gl.uniform1f(shu.alpha, 1.0);
379
- gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
380
-
381
- if (material.layer._pickingEnabled && !material.pickingReady) {
382
- f.bindOutputTexture(pickingMask);
383
- gl.uniform1f(shu.thicknessOutline, 8);
384
- gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._linePickingColorsBuffer);
385
- gl.vertexAttribPointer(sha.color, geomHandler._linePickingColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
386
- gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
387
- }
388
-
389
- material.applyTexture(texture, pickingMask);
390
-
391
- } else {
392
- material.isLoading = false;
393
- }
394
-
395
- deltaTime = window.performance.now() - startTime;
396
- // prevLayerId = material.layer._id;
397
- }
398
-
399
- gl.disable(gl.BLEND);
400
- gl.enable(gl.DEPTH_TEST);
401
- gl.enable(gl.CULL_FACE);
402
-
403
- f.deactivate();
404
- }
405
- }
406
-
407
- add(material) {
408
- this._queue.push(material);
409
- }
410
-
411
- remove(material) {
412
- //...
413
- }
414
- }
1
+ /**
2
+ * @module og/utils/VectorTileCreator
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ import { doubleToTwoFloats2 } from '../math/coder.js';
8
+ import * as quadTree from '../quadTree/quadTree.js';
9
+ import { Framebuffer } from '../webgl/Framebuffer.js';
10
+ import { Program } from '../webgl/Program.js';
11
+
12
+ let tempArr = new Float32Array(2);
13
+
14
+ export class VectorTileCreator {
15
+
16
+ constructor(planet, maxFrames = 5, width = 256, height = 256) {
17
+
18
+ this._width = width;
19
+ this._height = height;
20
+ this._handler = planet.renderer.handler;
21
+ this._planet = planet;
22
+ this._framebuffer = null;
23
+ this.MAX_FRAMES = maxFrames;
24
+ this._currentFrame = 0;
25
+ this._queue = [];
26
+ this._initialize();
27
+ }
28
+
29
+ _initialize() {
30
+
31
+ //Line
32
+ if (!this._handler.programs.vectorTileLineRasterization) {
33
+ this._handler.addProgram(new Program("vectorTileLineRasterization", {
34
+ uniforms: {
35
+ 'viewport': "vec2",
36
+ 'thicknessOutline': "float",
37
+ 'alpha': "float",
38
+ 'extentParamsHigh': "vec4",
39
+ 'extentParamsLow': "vec4"
40
+ },
41
+ attributes: {
42
+ 'prevHigh': "vec2",
43
+ 'currentHigh': "vec2",
44
+ 'nextHigh': "vec2",
45
+
46
+ 'prevLow': "vec2",
47
+ 'currentLow': "vec2",
48
+ 'nextLow': "vec2",
49
+
50
+ 'order': "float",
51
+ 'color': "vec4",
52
+ 'thickness': "float"
53
+ },
54
+ vertexShader:
55
+ `attribute vec2 prevHigh;
56
+ attribute vec2 currentHigh;
57
+ attribute vec2 nextHigh;
58
+
59
+ attribute vec2 prevLow;
60
+ attribute vec2 currentLow;
61
+ attribute vec2 nextLow;
62
+
63
+ attribute float order;
64
+ attribute float thickness;
65
+ attribute vec4 color;
66
+ uniform float thicknessOutline;
67
+ uniform vec2 viewport;
68
+ uniform vec4 extentParamsHigh;
69
+ uniform vec4 extentParamsLow;
70
+ varying vec4 vColor;
71
+
72
+ vec2 proj(vec2 coordHigh, vec2 coordLow) {
73
+ vec2 highDiff = coordHigh - extentParamsHigh.xy;
74
+ vec2 lowDiff = coordLow - extentParamsLow.xy;
75
+ return vec2(-1.0 + (highDiff + lowDiff) * extentParamsHigh.zw) * vec2(1.0, -1.0);
76
+ }
77
+
78
+ void main(){
79
+ vColor = color;
80
+
81
+ vec2 vNext = proj(nextHigh, nextLow),
82
+ vCurrent = proj(currentHigh, currentLow),
83
+ vPrev = proj(prevHigh, prevLow);
84
+
85
+ vec2 _next = vNext;
86
+ vec2 _prev = vPrev;
87
+ vec2 _current = vCurrent;
88
+
89
+ if(_prev == _current){
90
+ if(_next == _current){
91
+ _next = _current + vec2(1.0, 0.0);
92
+ _prev = _current - _next;
93
+ }else{
94
+ _prev = _current + normalize(_current - _next);
95
+ }
96
+ }
97
+
98
+ if(_next == _current){
99
+ _next = _current + normalize(_current - _prev);
100
+ }
101
+
102
+ vec2 sNext = _next;
103
+ vec2 sCurrent = _current;
104
+ vec2 sPrev = _prev;
105
+
106
+ vec2 dirNext = normalize(sNext - sCurrent);
107
+ vec2 dirPrev = normalize(sPrev - sCurrent);
108
+ float dotNP = dot(dirNext, dirPrev);
109
+
110
+ vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));
111
+ vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));
112
+ vec2 d = (thickness + thicknessOutline) * 0.5 * sign(order) / viewport;
113
+
114
+ vec2 m;
115
+ if(dotNP >= 0.99991){
116
+ m = sCurrent - normalPrev * d;
117
+ }else{
118
+ vec2 dir = normalPrev + normalNext;
119
+ m = sCurrent + dir * d / (dirNext.x * dir.y - dirNext.y * dir.x);
120
+
121
+ if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){
122
+ float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);
123
+ if(occw == -1.0){
124
+ m = sCurrent + normalPrev * d;
125
+ }else if(occw == 1.0){
126
+ m = sCurrent + normalNext * d;
127
+ }else if(occw == -2.0){
128
+ m = sCurrent + normalNext * d;
129
+ }else if(occw == 2.0){
130
+ m = sCurrent + normalPrev * d;
131
+ }
132
+ }else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){
133
+ m = sCurrent + normalNext * d;
134
+ }
135
+ }
136
+ gl_Position = vec4(m.x, m.y, 0.0, 1.0);
137
+ }`,
138
+ fragmentShader: `precision highp float;
139
+ uniform float alpha;
140
+ varying vec4 vColor;
141
+ void main() {
142
+ gl_FragColor = vec4(vColor.rgb, alpha * vColor.a);
143
+ }`
144
+ }));
145
+ }
146
+
147
+ //Polygon
148
+ if (!this._handler.programs.vectorTilePolygonRasterization) {
149
+ this._handler.addProgram(new Program("vectorTilePolygonRasterization", {
150
+ uniforms: {
151
+ 'extentParamsHigh': "vec4",
152
+ 'extentParamsLow': "vec4"
153
+ },
154
+ attributes: {
155
+ 'coordinatesHigh': "vec2",
156
+ 'coordinatesLow': "vec2",
157
+ 'colors': "vec4"
158
+ },
159
+ vertexShader:
160
+ `attribute vec2 coordinatesHigh;
161
+ attribute vec2 coordinatesLow;
162
+ attribute vec4 colors;
163
+ uniform vec4 extentParamsHigh;
164
+ uniform vec4 extentParamsLow;
165
+ varying vec4 color;
166
+
167
+ vec2 proj(vec2 coordHigh, vec2 coordLow) {
168
+ vec2 highDiff = coordHigh - extentParamsHigh.xy;
169
+ vec2 lowDiff = coordLow - extentParamsLow.xy;
170
+ return vec2(-1.0 + (highDiff + lowDiff) * extentParamsHigh.zw) * vec2(1.0, -1.0);
171
+ }
172
+
173
+ void main() {
174
+ color = colors;
175
+ gl_Position = vec4(proj(coordinatesHigh, coordinatesLow), 0.0, 1.0);
176
+ }`,
177
+ fragmentShader:
178
+ `precision highp float;
179
+ varying vec4 color;
180
+ void main () {
181
+ gl_FragColor = color;
182
+ }`
183
+ }));
184
+ }
185
+
186
+ this._framebuffer = new Framebuffer(this._handler, {
187
+ width: this._width,
188
+ height: this._height,
189
+ useDepth: false
190
+ });
191
+ this._framebuffer.init();
192
+ }
193
+
194
+ frame() {
195
+ if (this._planet.layerLock.isFree() && this._queue.length) {
196
+ var h = this._handler,
197
+ gl = h.gl;
198
+
199
+ gl.disable(gl.CULL_FACE);
200
+ gl.disable(gl.DEPTH_TEST);
201
+ gl.enable(gl.BLEND);
202
+ gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
203
+ gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
204
+
205
+ var hLine = h.programs.vectorTileLineRasterization,
206
+ hPoly = h.programs.vectorTilePolygonRasterization;
207
+
208
+ var _w = this._width,
209
+ _h = this._height,
210
+ width = _w,
211
+ height = _h,
212
+ _w2 = width << 1,
213
+ _h2 = height << 1;
214
+
215
+ var pickingMask = null,
216
+ texture = null;
217
+
218
+ // var prevLayerId = -1;
219
+
220
+ var extentParamsHigh = new Float32Array(4);
221
+ var extentParamsLow = new Float32Array(4);
222
+
223
+ var f = this._framebuffer.activate();
224
+
225
+ var deltaTime = 0,
226
+ startTime = window.performance.now();
227
+
228
+ while (this._planet.layerLock.isFree() && this._queue.length && deltaTime < 0.25) {
229
+ var material = this._queue.shift();
230
+ if (material.isLoading && material.segment.node.getState() === quadTree.RENDERING) {
231
+
232
+ if (material.segment.tileZoom <= 3) {
233
+ width = _w2;
234
+ height = _h2;
235
+ } else {
236
+ width = _w;
237
+ height = _h;
238
+ }
239
+
240
+ texture = (material._updateTexture && material._updateTexture) || h.createEmptyTexture_l(width, height);
241
+
242
+ f.setSize(width, height);
243
+
244
+ f.bindOutputTexture(texture);
245
+
246
+ gl.clearColor(0.0, 0.0, 0.0, 0.0);
247
+ gl.clear(gl.COLOR_BUFFER_BIT);
248
+
249
+ var extent = material.segment.getExtentMerc();
250
+
251
+ doubleToTwoFloats2(extent.southWest.lon, tempArr);
252
+ extentParamsHigh[0] = tempArr[0];
253
+ extentParamsLow[0] = tempArr[1];
254
+
255
+ doubleToTwoFloats2(extent.southWest.lat, tempArr);
256
+ extentParamsHigh[1] = tempArr[0];
257
+ extentParamsLow[1] = tempArr[1];
258
+
259
+ extentParamsHigh[2] = 2.0 / extent.getWidth();
260
+ extentParamsHigh[3] = 2.0 / extent.getHeight();
261
+
262
+ hPoly.activate();
263
+ var sh = hPoly._program;
264
+ var sha = sh.attributes,
265
+ shu = sh.uniforms;
266
+
267
+ var geomHandler = material.layer._geometryHandler;
268
+
269
+ //=========================================
270
+ //Polygon rendering
271
+ //=========================================
272
+ gl.uniform4fv(shu.extentParamsHigh, extentParamsHigh);
273
+ gl.uniform4fv(shu.extentParamsLow, extentParamsLow);
274
+
275
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._polyVerticesHighBufferMerc);
276
+ gl.vertexAttribPointer(sha.coordinatesHigh, geomHandler._polyVerticesHighBufferMerc.itemSize, gl.FLOAT, false, 0, 0);
277
+
278
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._polyVerticesLowBufferMerc);
279
+ gl.vertexAttribPointer(sha.coordinatesLow, geomHandler._polyVerticesLowBufferMerc.itemSize, gl.FLOAT, false, 0, 0);
280
+
281
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._polyColorsBuffer);
282
+ gl.vertexAttribPointer(sha.colors, geomHandler._polyColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
283
+
284
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geomHandler._polyIndexesBuffer);
285
+
286
+ gl.drawElements(gl.TRIANGLES, geomHandler._polyIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
287
+
288
+ //Polygon picking PASS
289
+ if (material.layer._pickingEnabled) {
290
+ if (!material.pickingReady) {
291
+ if (material._updatePickingMask) {
292
+ pickingMask = material._updatePickingMask;
293
+ } else {
294
+ pickingMask = h.createEmptyTexture_n(width, height);
295
+ }
296
+
297
+ f.bindOutputTexture(pickingMask);
298
+
299
+ gl.clearColor(0.0, 0.0, 0.0, 0.0);
300
+ gl.clear(gl.COLOR_BUFFER_BIT);
301
+
302
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._polyPickingColorsBuffer);
303
+ gl.vertexAttribPointer(sha.colors, geomHandler._polyPickingColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
304
+
305
+ gl.drawElements(gl.TRIANGLES, geomHandler._polyIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
306
+ } else {
307
+ pickingMask = material.pickingMask;
308
+ }
309
+ }
310
+
311
+ //=========================================
312
+ //Strokes and linestrings rendering
313
+ //=========================================
314
+ f.bindOutputTexture(texture);
315
+
316
+ hLine.activate();
317
+ sh = hLine._program;
318
+ sha = sh.attributes;
319
+ shu = sh.uniforms;
320
+
321
+ gl.uniform2fv(shu.viewport, [width, height]);
322
+
323
+ gl.uniform4fv(shu.extentParamsHigh, extentParamsHigh);
324
+ gl.uniform4fv(shu.extentParamsLow, extentParamsLow);
325
+
326
+ //vertex
327
+ var mb = geomHandler._lineVerticesHighBufferMerc;
328
+ gl.bindBuffer(gl.ARRAY_BUFFER, mb);
329
+
330
+ gl.vertexAttribPointer(sha.prevHigh, mb.itemSize, gl.FLOAT, false, 8, 0);
331
+ gl.vertexAttribPointer(sha.currentHigh, mb.itemSize, gl.FLOAT, false, 8, 32);
332
+ gl.vertexAttribPointer(sha.nextHigh, mb.itemSize, gl.FLOAT, false, 8, 64);
333
+
334
+ mb = geomHandler._lineVerticesLowBufferMerc;
335
+ gl.bindBuffer(gl.ARRAY_BUFFER, mb);
336
+
337
+ gl.vertexAttribPointer(sha.prevLow, mb.itemSize, gl.FLOAT, false, 8, 0);
338
+ gl.vertexAttribPointer(sha.currentLow, mb.itemSize, gl.FLOAT, false, 8, 32);
339
+ gl.vertexAttribPointer(sha.nextLow, mb.itemSize, gl.FLOAT, false, 8, 64);
340
+
341
+ //order
342
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineOrdersBuffer);
343
+ gl.vertexAttribPointer(sha.order, geomHandler._lineOrdersBuffer.itemSize, gl.FLOAT, false, 4, 0);
344
+
345
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, geomHandler._lineIndexesBuffer);
346
+
347
+ //PASS - stroke
348
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineStrokesBuffer);
349
+ gl.vertexAttribPointer(sha.thickness, geomHandler._lineStrokesBuffer.itemSize, gl.FLOAT, false, 0, 0);
350
+
351
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineStrokeColorsBuffer);
352
+ gl.vertexAttribPointer(sha.color, geomHandler._lineStrokeColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
353
+
354
+ //Antialias pass
355
+ gl.uniform1f(shu.thicknessOutline, 2);
356
+ gl.uniform1f(shu.alpha, 0.54);
357
+ gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
358
+ //
359
+ //Aliased pass
360
+ gl.uniform1f(shu.thicknessOutline, 1);
361
+ gl.uniform1f(shu.alpha, 1.0);
362
+ gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
363
+
364
+ //PASS - inside line
365
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineThicknessBuffer);
366
+ gl.vertexAttribPointer(sha.thickness, geomHandler._lineThicknessBuffer.itemSize, gl.FLOAT, false, 0, 0);
367
+
368
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._lineColorsBuffer);
369
+ gl.vertexAttribPointer(sha.color, geomHandler._lineColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
370
+
371
+ //Antialias pass
372
+ gl.uniform1f(shu.thicknessOutline, 2);
373
+ gl.uniform1f(shu.alpha, 0.54);
374
+ gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
375
+ //
376
+ //Aliased pass
377
+ gl.uniform1f(shu.thicknessOutline, 1);
378
+ gl.uniform1f(shu.alpha, 1.0);
379
+ gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
380
+
381
+ if (material.layer._pickingEnabled && !material.pickingReady) {
382
+ f.bindOutputTexture(pickingMask);
383
+ gl.uniform1f(shu.thicknessOutline, 8);
384
+ gl.bindBuffer(gl.ARRAY_BUFFER, geomHandler._linePickingColorsBuffer);
385
+ gl.vertexAttribPointer(sha.color, geomHandler._linePickingColorsBuffer.itemSize, gl.FLOAT, false, 0, 0);
386
+ gl.drawElements(gl.TRIANGLE_STRIP, geomHandler._lineIndexesBuffer.numItems, gl.UNSIGNED_INT, 0);
387
+ }
388
+
389
+ material.applyTexture(texture, pickingMask);
390
+
391
+ } else {
392
+ material.isLoading = false;
393
+ }
394
+
395
+ deltaTime = window.performance.now() - startTime;
396
+ // prevLayerId = material.layer._id;
397
+ }
398
+
399
+ gl.disable(gl.BLEND);
400
+ gl.enable(gl.DEPTH_TEST);
401
+ gl.enable(gl.CULL_FACE);
402
+
403
+ f.deactivate();
404
+ }
405
+ }
406
+
407
+ add(material) {
408
+ this._queue.push(material);
409
+ }
410
+
411
+ remove(material) {
412
+ //...
413
+ }
414
+ }