@openglobus/og 0.13.7 → 0.13.10

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 (106) hide show
  1. package/README.md +1 -1
  2. package/css/og.css +388 -129
  3. package/dist/@openglobus/og.css +1 -1
  4. package/dist/@openglobus/og.esm.js +2 -2
  5. package/dist/@openglobus/og.esm.js.map +1 -1
  6. package/dist/@openglobus/og.umd.js +2 -2
  7. package/dist/@openglobus/og.umd.js.map +1 -1
  8. package/package.json +20 -19
  9. package/src/og/Globe.js +15 -16
  10. package/src/og/Object3d.js +417 -0
  11. package/src/og/arial.js +1705 -1703
  12. package/src/og/camera/Camera.js +640 -640
  13. package/src/og/control/EarthCoordinates.js +1 -1
  14. package/src/og/control/GeoImageDragControl.js +102 -75
  15. package/src/og/control/LayerAnimation.js +383 -0
  16. package/src/og/control/LayerSwitcher.js +506 -159
  17. package/src/og/control/Lighting.js +27 -27
  18. package/src/og/control/MouseNavigation.js +460 -460
  19. package/src/og/control/RulerSwitcher.js +69 -0
  20. package/src/og/control/Sun.js +170 -170
  21. package/src/og/control/UIhelpers.js +146 -0
  22. package/src/og/control/ZoomControl.js +0 -2
  23. package/src/og/control/index.js +5 -1
  24. package/src/og/control/ruler/Ruler.js +43 -0
  25. package/src/og/control/ruler/RulerScene.js +374 -0
  26. package/src/og/control/visibleExtent/Segment.js +3 -5
  27. package/src/og/ellipsoid/Ellipsoid.js +19 -0
  28. package/src/og/ellipsoid/wgs84.js +1 -1
  29. package/src/og/entity/Entity.js +1 -1
  30. package/src/og/entity/GeoObject.js +1 -1
  31. package/src/og/entity/LabelHandler.js +6 -2
  32. package/src/og/entity/LabelWorker.js +38 -53
  33. package/src/og/layer/BaseGeoImage.js +347 -312
  34. package/src/og/layer/CanvasTiles.js +312 -290
  35. package/src/og/layer/GeoImage.js +222 -214
  36. package/src/og/layer/GeoVideo.js +291 -291
  37. package/src/og/layer/Layer.js +94 -70
  38. package/src/og/layer/Material.js +109 -109
  39. package/src/og/layer/Vector.js +81 -14
  40. package/src/og/layer/XYZ.js +23 -11
  41. package/src/og/light/LightSource.js +364 -363
  42. package/src/og/math/Vec3.js +1 -1
  43. package/src/og/math.js +6 -6
  44. package/src/og/quadTree/Node.js +8 -6
  45. package/src/og/renderer/Renderer.js +2 -3
  46. package/src/og/res/images.js +0 -2
  47. package/src/og/scene/Planet.js +106 -44
  48. package/src/og/segment/Segment.js +34 -64
  49. package/src/og/segment/Slice.js +1 -1
  50. package/src/og/shaders/drawnode.js +1 -1
  51. package/src/og/shaders/label.js +30 -42
  52. package/src/og/terrain/GlobusTerrain.js +31 -20
  53. package/src/og/terrain/MapboxTerrain.js +1 -1
  54. package/src/og/utils/BaseWorker.js +46 -0
  55. package/src/og/utils/FontAtlas.js +1 -2
  56. package/src/og/utils/GeoImageCreator.js +164 -161
  57. package/src/og/utils/Loader.js +187 -153
  58. package/src/og/utils/NormalMapCreator.js +403 -412
  59. package/src/og/utils/PlainSegmentWorker.js +29 -55
  60. package/src/og/utils/TerrainWorker.js +572 -589
  61. package/src/og/utils/VectorTileCreator.js +1 -1
  62. package/src/og/utils/functionComposition.js +13 -0
  63. package/src/og/webgl/Handler.js +42 -41
  64. package/src/og/webgl/ProgramController.js +143 -143
  65. package/types/Object3d.d.ts +22 -0
  66. package/types/arial.d.ts +1 -0
  67. package/types/camera/PlanetCamera.d.ts +4 -0
  68. package/types/control/GeoImageDragControl.d.ts +2 -0
  69. package/types/control/LayerAnimation.d.ts +73 -0
  70. package/types/control/LayerSwitcher.d.ts +55 -11
  71. package/types/control/MouseNavigation.d.ts +1 -0
  72. package/types/control/MouseWheelZoomControl.d.ts +1 -0
  73. package/types/control/Sun.d.ts +2 -1
  74. package/types/control/TouchNavigation.d.ts +1 -0
  75. package/types/control/UIhelpers.d.ts +13 -0
  76. package/types/control/index.d.ts +3 -1
  77. package/types/control/ruler/Ruler.d.ts +13 -0
  78. package/types/control/ruler/RulerScene.d.ts +48 -0
  79. package/types/ellipsoid/Ellipsoid.d.ts +8 -0
  80. package/types/entity/LabelHandler.d.ts +2 -0
  81. package/types/entity/LabelWorker.d.ts +5 -7
  82. package/types/layer/BaseGeoImage.d.ts +9 -1
  83. package/types/layer/CanvasTiles.d.ts +5 -1
  84. package/types/layer/GeoImage.d.ts +1 -0
  85. package/types/layer/GeoTexture2d.d.ts +1 -0
  86. package/types/layer/Layer.d.ts +28 -32
  87. package/types/layer/Vector.d.ts +9 -0
  88. package/types/layer/WMS.d.ts +1 -0
  89. package/types/layer/XYZ.d.ts +8 -5
  90. package/types/math.d.ts +2 -2
  91. package/types/quadTree/EntityCollectionNode.d.ts +7 -0
  92. package/types/quadTree/Node.d.ts +1 -2
  93. package/types/renderer/Renderer.d.ts +1 -1
  94. package/types/renderer/RendererEvents.d.ts +16 -0
  95. package/types/res/images.d.ts +0 -1
  96. package/types/scene/Planet.d.ts +21 -6
  97. package/types/segment/SegmentLonLat.d.ts +2 -0
  98. package/types/terrain/BilTerrain.d.ts +6 -0
  99. package/types/terrain/GlobusTerrain.d.ts +7 -0
  100. package/types/terrain/MapboxTerrain.d.ts +8 -0
  101. package/types/utils/BaseWorker.d.ts +14 -0
  102. package/types/utils/Loader.d.ts +4 -1
  103. package/types/utils/PlainSegmentWorker.d.ts +4 -6
  104. package/types/utils/TerrainWorker.d.ts +4 -6
  105. package/types/utils/functionComposition.d.ts +5 -0
  106. package/types/webgl/Handler.d.ts +4 -1
@@ -92,6 +92,7 @@ export function label_webgl2() {
92
92
 
93
93
  if(a_texCoord.w == EMPTY) {
94
94
  gl_Position = vec4(0.0);
95
+ v_fontIndex = -1;
95
96
  return;
96
97
  }
97
98
 
@@ -154,7 +155,6 @@ export function label_webgl2() {
154
155
  uniform int isOutlinePass;
155
156
 
156
157
  precision highp float;
157
- precision highp int;
158
158
 
159
159
  const int MAX_SIZE = 11;
160
160
 
@@ -207,51 +207,33 @@ export function label_webgl2() {
207
207
  }
208
208
  return median(msdf.r, msdf.g, msdf.b);
209
209
  }
210
-
211
- vec4 getSDFParams() {
212
- if(v_fontIndex == 0) {
213
- return sdfParamsArr[0];
214
- } else if(v_fontIndex == 1){
215
- return sdfParamsArr[1];
216
- } else if(v_fontIndex == 2){
217
- return sdfParamsArr[2];
218
- } else if(v_fontIndex == 3){
219
- return sdfParamsArr[3];
220
- } else if(v_fontIndex == 4){
221
- return sdfParamsArr[4];
222
- } else if(v_fontIndex == 5){
223
- return sdfParamsArr[5];
224
- } else if(v_fontIndex == 6){
225
- return sdfParamsArr[6];
226
- } else if(v_fontIndex == 7){
227
- return sdfParamsArr[7];
228
- } else if(v_fontIndex == 8){
229
- return sdfParamsArr[8];
230
- } else if(v_fontIndex == 9){
231
- return sdfParamsArr[9];
232
- } else if(v_fontIndex == 10){
233
- return sdfParamsArr[10];
234
- }
235
- }
236
210
 
237
211
  void main () {
238
-
239
- vec4 sdfParams = getSDFParams();
212
+
213
+ if(v_fontIndex == -1) {
214
+ return;
215
+ }
216
+
217
+ vec4 sdfParams = sdfParamsArr[v_fontIndex];
240
218
  float sd = getDistance();
241
219
  vec2 dxdy = fwidth(v_uv) * sdfParams.xy;
242
- float dist = sd + min(0.001, 0.5 - 1.0 / sdfParams.w) - 0.5;
243
- float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
244
220
 
245
221
  if(isOutlinePass == 0){
222
+ float dist = sd + min(0.001, 0.5 - 1.0 / sdfParams.w) - 0.5;
223
+ float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
224
+ if(opacity <= 0.1){
225
+ discard;
226
+ }
246
227
  outScreen = vec4(v_rgba.rgb, opacity * v_rgba.a);
247
- } else {
248
- float strokeDist = sd + min(v_outline, 0.5 - 1.0 / sdfParams.w) - 0.5;
249
- float strokeAlpha = v_rgba.a * clamp(strokeDist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
250
- if(strokeAlpha < 0.1){
228
+ } else {
229
+ float dist = sd + min(v_outline, 0.5 - 1.0 / sdfParams.w) - 0.5;
230
+ float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
231
+ if(opacity <= 0.1){
251
232
  discard;
252
233
  }
253
- outScreen = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;
254
- }
234
+ outScreen = vec4(v_rgba.rgb, opacity * v_rgba.a);
235
+ //outScreen = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;
236
+ }
255
237
  }`
256
238
  });
257
239
  }
@@ -326,6 +308,7 @@ export function label_screen() {
326
308
 
327
309
  if(a_texCoord.w == EMPTY) {
328
310
  gl_Position = vec4(0.0);
311
+ v_fontIndex = -1.0;
329
312
  return;
330
313
  }
331
314
 
@@ -469,6 +452,10 @@ export function label_screen() {
469
452
 
470
453
  fontIndex = v_fontIndex + 0.1;
471
454
 
455
+ if(v_fontIndex < 0.0){
456
+ return;
457
+ }
458
+
472
459
  vec4 sdfParams = getSDFParams();
473
460
  float sd = getDistance();
474
461
  vec2 dxdy = fwidth(v_uv) * sdfParams.xy;
@@ -476,14 +463,14 @@ export function label_screen() {
476
463
  float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
477
464
 
478
465
  if(isOutlinePass == 0){
479
- gl_FragColor = vec4(v_rgba.rgb, opacity * v_rgba.a);
466
+ //gl_FragColor = vec4(v_rgba.rgb, opacity * v_rgba.a);
480
467
  } else {
481
468
  float strokeDist = sd + min(v_outline, 0.5 - 1.0 / sdfParams.w) - 0.5;
482
469
  float strokeAlpha = v_rgba.a * clamp(strokeDist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
483
470
  if(strokeAlpha < 0.1){
484
471
  discard;
485
472
  }
486
- gl_FragColor = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;
473
+ //gl_FragColor = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;
487
474
  }
488
475
  }`
489
476
  });
@@ -549,15 +536,16 @@ export function labelPicking() {
549
536
  void main() {
550
537
  vec3 a_positions = a_positionsHigh + a_positionsLow;
551
538
  vec3 cameraPos = eyePositionHigh + eyePositionLow;
552
-
539
+ v_rgba = a_rgba;
540
+
553
541
  if(a_texCoord.w == EMPTY) {
542
+ v_rgba.a = 0.0;
554
543
  gl_Position = vec4(0.0);
555
544
  return;
556
545
  }
557
546
 
558
547
  vec3 look = a_positions - cameraPos;
559
548
  float lookDist = length(look);
560
- v_rgba = a_rgba;
561
549
  if(opacity * step(lookDist, sqrt(dot(cameraPos,cameraPos) - planetRadius) + sqrt(dot(a_positions,a_positions) - planetRadius)) == 0.0){
562
550
  return;
563
551
  }
@@ -611,7 +599,7 @@ export function labelPicking() {
611
599
 
612
600
  vec4 color = v_rgba;
613
601
  if (color.a < 0.05) {
614
- discard;
602
+ return;
615
603
  }
616
604
 
617
605
  gl_FragColor = vec4(v_rgba.rgb, v_rgba.a);
@@ -10,8 +10,7 @@ import { Events } from "../Events.js";
10
10
  import { Loader } from "../utils/Loader.js";
11
11
  import { NOTRENDERING } from "../quadTree/quadTree.js";
12
12
  // import { QueueArray } from '../QueueArray.js';
13
- import { stringTemplate, createExtent } from "../utils/shared.js";
14
- import { Geoid } from "./Geoid.js";
13
+ import { createExtent, stringTemplate } from "../utils/shared.js";
15
14
  import { Layer } from "../layer/Layer.js";
16
15
  import { Vec3 } from "../math/Vec3.js";
17
16
  import { Ray } from "../math/Ray.js";
@@ -56,7 +55,7 @@ class GlobusTerrain extends EmptyTerrain {
56
55
  */
57
56
  constructor(name, options = {}) {
58
57
  super({ geoidSrc: "//openglobus.org/geoid/egm84-30.pgm", ...options });
59
-
58
+ this._s = options.subdomains || ["a", "b", "c"];
60
59
  /**
61
60
  * Events handler.
62
61
  * @public
@@ -64,6 +63,10 @@ class GlobusTerrain extends EmptyTerrain {
64
63
  */
65
64
  this.events = new Events(EVENT_NAMES, this);
66
65
 
66
+ this._requestCount = 0;
67
+
68
+ this._requestsPeerSubdomian = 4;
69
+
67
70
  this.isEmpty = false;
68
71
 
69
72
  this.equalizeNormals = true;
@@ -73,7 +76,7 @@ class GlobusTerrain extends EmptyTerrain {
73
76
  * @public
74
77
  * @type {string}
75
78
  */
76
- this.name = name || "";
79
+ this.name = name || "openglobus";
77
80
 
78
81
  /**
79
82
  * Minimal visible zoom index when terrain handler works.
@@ -94,7 +97,7 @@ class GlobusTerrain extends EmptyTerrain {
94
97
  * @public
95
98
  * @type {string}
96
99
  */
97
- this.url = options.url || "//srtm3.openglobus.org/{z}/{y}/{x}.ddm";
100
+ this.url = options.url || "//{s}.srtm3.openglobus.org/{z}/{y}/{x}.ddm";
98
101
 
99
102
  /**
100
103
  * Array of segment triangulation grid sizes where array index agreed to the segment zoom index.
@@ -192,11 +195,7 @@ class GlobusTerrain extends EmptyTerrain {
192
195
  return true;
193
196
  } else {
194
197
  if (!this._fetchCache[tileIndex]) {
195
- let url = stringTemplate(this.url, {
196
- x: x,
197
- y: y,
198
- z: z
199
- });
198
+ let url = this._buildURL(x, y, z);
200
199
  this._fetchCache[tileIndex] = this._loader.fetch({
201
200
  src: url,
202
201
  type: this._dataType
@@ -279,10 +278,10 @@ class GlobusTerrain extends EmptyTerrain {
279
278
  h3 = tileData.heights[v3Ind];
280
279
 
281
280
  let v0 = new Vec3(
282
- tileData.extent.southWest.lon + size * j,
283
- h0,
284
- tileData.extent.northEast.lat - size * i - size
285
- ),
281
+ tileData.extent.southWest.lon + size * j,
282
+ h0,
283
+ tileData.extent.northEast.lat - size * i - size
284
+ ),
286
285
  v1 = new Vec3(v0.x + size, h1, v0.z),
287
286
  v2 = new Vec3(v0.x, h2, v0.z + size),
288
287
  v3 = new Vec3(v0.x + size, h3, v0.z + size);
@@ -308,7 +307,7 @@ class GlobusTerrain extends EmptyTerrain {
308
307
  * @public
309
308
  */
310
309
  abortLoading() {
311
- this._loader.abort();
310
+ this._loader.abortAll();
312
311
  }
313
312
 
314
313
  /**
@@ -356,6 +355,7 @@ class GlobusTerrain extends EmptyTerrain {
356
355
  } else {
357
356
  this._loader.load(
358
357
  {
358
+ sender: this,
359
359
  src: this._getHTTPRequestString(segment),
360
360
  segment: segment,
361
361
  type: this._dataType,
@@ -397,6 +397,17 @@ class GlobusTerrain extends EmptyTerrain {
397
397
  }
398
398
  }
399
399
 
400
+ _getSubdomain() {
401
+ this._requestCount++;
402
+ return this._s[Math.floor(this._requestCount % (this._requestsPeerSubdomian * this._s.length) / this._requestsPeerSubdomian)];
403
+ }
404
+
405
+ _buildURL(x, y, z) {
406
+ return stringTemplate(this.url, {
407
+ s: this._getSubdomain(), x, y, z
408
+ });
409
+ }
410
+
400
411
  /**
401
412
  * Creates query url.
402
413
  * @protected
@@ -405,11 +416,11 @@ class GlobusTerrain extends EmptyTerrain {
405
416
  * @returns {string} -
406
417
  */
407
418
  _createUrl(segment) {
408
- return stringTemplate(this.url, {
409
- x: segment.tileX.toString(),
410
- y: segment.tileY.toString(),
411
- z: segment.tileZoom.toString()
412
- });
419
+ return this._buildURL(
420
+ segment.tileX.toString(),
421
+ segment.tileY.toString(),
422
+ segment.tileZoom.toString()
423
+ )
413
424
  }
414
425
 
415
426
  /**
@@ -8,7 +8,7 @@ const KEY =
8
8
 
9
9
  class MapboxTerrain extends GlobusTerrain {
10
10
  constructor(name, options = {}) {
11
- super(name, options);
11
+ super(name || "mapbox", options);
12
12
 
13
13
  this.equalizeVertices =
14
14
  options.equalizeVertices != undefined ? options.equalizeVertices : true;
@@ -0,0 +1,46 @@
1
+ export class BaseWorker {
2
+ constructor(numWorkers = 2, program) {
3
+ this._id = 0;
4
+ this._pendingQueue = [];
5
+ this._numWorkers = numWorkers;
6
+ this._workerQueue = [];
7
+ if (program) this.setProgram(program);
8
+ }
9
+
10
+ /**
11
+ * @virtual
12
+ */
13
+ make() {
14
+ }
15
+
16
+ check() {
17
+ if (this._pendingQueue && this._pendingQueue.length) {
18
+ this.make(this._pendingQueue.pop());
19
+ }
20
+ }
21
+
22
+ setProgram(program) {
23
+ let elevationProgramm = new Blob([program], { type: "application/javascript" });
24
+
25
+ for (let i = 0; i < this._numWorkers; i++) {
26
+ let w = new Worker(URL.createObjectURL(elevationProgramm));
27
+ w.onmessage = (e) => {
28
+ this._onMessage(e);
29
+ this._workerQueue && this._workerQueue.unshift(e.target);
30
+ this.check();
31
+ }
32
+ this._workerQueue.push(w);
33
+ }
34
+ }
35
+
36
+ destroy() {
37
+ for (let i = 0; i < this._workerQueue.length; i++) {
38
+ const w = this._workerQueue[i];
39
+ w.onmessage = undefined;
40
+ w.terminate();
41
+ }
42
+ this._pendingQueue = undefined;
43
+ this._numWorkers = undefined;
44
+ this._workerQueue = undefined;
45
+ }
46
+ }
@@ -7,7 +7,6 @@
7
7
  import { Rectangle } from '../Rectangle.js';
8
8
  import { TextureAtlas, TextureAtlasNode } from './TextureAtlas.js';
9
9
  import { Deferred } from '../Deferred.js';
10
- import { ARIAL_FONT_B64 } from '../res/images.js';
11
10
 
12
11
  //TODO: get the value from shader module
13
12
  const MAX_SIZE = 11;
@@ -160,7 +159,7 @@ class FontAtlas {
160
159
  this._createTexture(atlas, img);
161
160
  def.resolve(index);
162
161
  };
163
- img.src = ARIAL_FONT_B64;
162
+ img.src = imageBase64;
164
163
  }
165
164
 
166
165
  _createTexture(atlas, img) {
@@ -1,163 +1,166 @@
1
- 'use strict';
2
-
3
- import { LonLat } from '../LonLat.js';
4
- import * as utils from '../utils/shared.js';
5
- import { Framebuffer } from '../webgl/Framebuffer.js';
6
- import { Program } from '../webgl/Program.js';
7
- import { types } from '../webgl/types.js';
8
-
9
- export class GeoImageCreator {
10
-
11
- constructor(planet, maxFrames) {
12
- this._gridSize = 64;
13
- this._planet = planet;
14
- this._framebuffer = null;
15
- this._texCoordsBuffer = null;
16
- this._indexBuffer = null;
17
- this.MAX_FRAMES = maxFrames || 5;
18
- this._currentFrame = 0;
19
- this._queue = [];
20
- this._animate = [];
21
- this._initialize();
22
- }
23
-
24
- _initialize() {
25
- this._initShaders();
26
- this._initBuffers();
27
- }
28
-
29
- /**
30
- * Creates geoImage corners coordinates grid buffer.
31
- * @public
32
- * @param{Array.<LonLat>} c - GeoImage corners coordinates.
33
- * @return{WebGLBuffer} Grid coordinates buffer.
34
- */
35
- createGridBuffer(c, toMerc) {
36
- var gs = this._gridSize;
37
-
38
- var v03 = new LonLat((c[3].lon - c[0].lon) / gs, (c[3].lat - c[0].lat) / gs),
39
- v12 = new LonLat((c[2].lon - c[1].lon) / gs, (c[2].lat - c[1].lat) / gs),
40
- v01 = new LonLat((c[1].lon - c[0].lon) / gs, (c[1].lat - c[0].lat) / gs),
41
- v32 = new LonLat((c[2].lon - c[3].lon) / gs, (c[2].lat - c[3].lat) / gs);
42
-
43
- var grid = new Float32Array((gs + 1) * (gs + 1) * 2);
44
- var k = 0;
45
- for (let i = 0; i <= gs; i++) {
46
- var P03i = new LonLat(c[0].lon + i * v03.lon, c[0].lat + i * v03.lat),
47
- P12i = new LonLat(c[1].lon + i * v12.lon, c[1].lat + i * v12.lat);
48
- for (let j = 0; j <= gs; j++) {
49
- var P01j = new LonLat(c[0].lon + j * v01.lon, c[0].lat + j * v01.lat),
50
- P32j = new LonLat(c[3].lon + j * v32.lon, c[3].lat + j * v32.lat);
51
- var xx = utils.getLinesIntersectionLonLat(P03i, P12i, P01j, P32j);
52
- grid[k++] = xx.lon;
53
- grid[k++] = xx.lat;
54
- }
55
- }
56
-
57
- if (toMerc) {
58
- for (let i = 0; i < grid.length; i += 2) {
59
- let c = new LonLat(grid[i], grid[i + 1]).forwardMercator();
60
- grid[i] = c.lon;
61
- grid[i + 1] = c.lat;
62
- }
63
- }
64
- return this._planet.renderer.handler.createArrayBuffer(grid, 2, grid.length / 2);
65
- }
66
-
67
- frame() {
68
- var i = this.MAX_FRAMES;
69
- while (i-- && this._queue.length) {
70
- var q = this._queue.shift();
71
- q._isRendering = false;
72
- q.rendering();
73
- }
74
-
75
- i = this._animate.length;
76
- while (i--) {
77
- this._animate[i].rendering();
78
- }
79
- }
80
-
81
- add(geoImage) {
82
- if (!geoImage._isRendering) {
83
- geoImage._isRendering = true;
84
- if (geoImage._animate) {
85
- this._animate.push(geoImage);
86
- } else {
87
- this._queue.push(geoImage);
88
- }
89
- }
90
- }
91
-
92
- remove(geoImage) {
93
- if (geoImage._isRendering) {
94
- geoImage._creationProceeding = false;
95
- geoImage._isRendering = false;
96
- var arr;
97
- if (geoImage._animate) {
98
- arr = this._animate;
99
- } else {
100
- arr = this._queue;
101
- }
102
- for (var i = 0; i < arr.length; i++) {
103
- if (arr[i].isEqual(geoImage)) {
104
- arr.splice(i, 1);
105
- return;
106
- }
107
- }
108
- }
109
- }
110
-
111
- _initBuffers() {
112
-
113
- let h = this._planet.renderer.handler;
114
-
115
- this._framebuffer = new Framebuffer(h, { width: 2, height: 2, useDepth: false });
116
- this._framebuffer.init();
117
-
118
- this._framebufferMercProj = new Framebuffer(h, { width: 2, height: 2, useDepth: false });
119
- this._framebufferMercProj.init();
120
-
121
- let gs = Math.log2(this._gridSize);
122
-
123
- this._texCoordsBuffer = this._planet._textureCoordsBufferCache[gs];
124
-
125
- this._indexBuffer = this._planet._indexesCache[gs][gs][gs][gs][gs].buffer;
126
-
127
- this._quadTexCoordsBuffer = h.createArrayBuffer(new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]), 2, 4);
128
- this._quadVertexBuffer = h.createArrayBuffer(new Float32Array([-1, 1, 1, 1, -1, -1, 1, -1]), 2, 4);
129
- }
130
-
131
- _initShaders() {
132
-
133
- this._planet.renderer.handler.addProgram(new Program("geoImageTransform", {
134
- uniforms: {
135
- sourceTexture: { type: types.SAMPLER2D },
136
- extentParams: { type: types.VEC4 }
137
- },
138
- attributes: {
139
- corners: "vec2",
140
- texCoords: "vec2"
141
- },
142
- vertexShader: `attribute vec2 corners;
143
- attribute vec2 texCoords;
144
- varying vec2 v_texCoords;
145
- uniform vec4 extentParams;
146
- void main() {
147
- v_texCoords = texCoords;
148
- gl_Position = vec4((-1.0 + (corners - extentParams.xy) * extentParams.zw) * vec2(1.0, -1.0), 0.0, 1.0);
149
- }`,
150
- fragmentShader:
151
- `precision highp float;
152
- uniform sampler2D sourceTexture;
153
- varying vec2 v_texCoords;
1
+ 'use strict';
2
+
3
+ import { LonLat } from '../LonLat.js';
4
+ import * as utils from '../utils/shared.js';
5
+ import { Framebuffer } from '../webgl/Framebuffer.js';
6
+ import { Program } from '../webgl/Program.js';
7
+ import { types } from '../webgl/types.js';
8
+
9
+ export class GeoImageCreator {
10
+
11
+ constructor(planet, maxFrames) {
12
+ this._gridSize = 64;
13
+ this._planet = planet;
14
+ this._framebuffer = null;
15
+ this._texCoordsBuffer = null;
16
+ this._indexBuffer = null;
17
+ this.MAX_FRAMES = maxFrames || 5;
18
+ this._currentFrame = 0;
19
+ this._queue = [];
20
+ this._animate = [];
21
+ this._initialize();
22
+ }
23
+
24
+ _initialize() {
25
+ this._initShaders();
26
+ this._initBuffers();
27
+ }
28
+
29
+ /**
30
+ * Creates geoImage corners coordinates grid buffer.
31
+ * @public
32
+ * @param{Array.<LonLat>} c - GeoImage corners coordinates.
33
+ * @return{WebGLBuffer} Grid coordinates buffer.
34
+ */
35
+ createGridBuffer(c, toMerc) {
36
+ var gs = this._gridSize;
37
+
38
+ var v03 = new LonLat((c[3].lon - c[0].lon) / gs, (c[3].lat - c[0].lat) / gs),
39
+ v12 = new LonLat((c[2].lon - c[1].lon) / gs, (c[2].lat - c[1].lat) / gs),
40
+ v01 = new LonLat((c[1].lon - c[0].lon) / gs, (c[1].lat - c[0].lat) / gs),
41
+ v32 = new LonLat((c[2].lon - c[3].lon) / gs, (c[2].lat - c[3].lat) / gs);
42
+
43
+ var grid = new Float32Array((gs + 1) * (gs + 1) * 2);
44
+ var k = 0;
45
+ for (let i = 0; i <= gs; i++) {
46
+ var P03i = new LonLat(c[0].lon + i * v03.lon, c[0].lat + i * v03.lat),
47
+ P12i = new LonLat(c[1].lon + i * v12.lon, c[1].lat + i * v12.lat);
48
+ for (let j = 0; j <= gs; j++) {
49
+ var P01j = new LonLat(c[0].lon + j * v01.lon, c[0].lat + j * v01.lat),
50
+ P32j = new LonLat(c[3].lon + j * v32.lon, c[3].lat + j * v32.lat);
51
+ var xx = utils.getLinesIntersectionLonLat(P03i, P12i, P01j, P32j);
52
+ grid[k++] = xx.lon;
53
+ grid[k++] = xx.lat;
54
+ }
55
+ }
56
+
57
+ if (toMerc) {
58
+ for (let i = 0; i < grid.length; i += 2) {
59
+ let c = new LonLat(grid[i], grid[i + 1]).forwardMercator();
60
+ grid[i] = c.lon;
61
+ grid[i + 1] = c.lat;
62
+ }
63
+ }
64
+ return this._planet.renderer.handler.createArrayBuffer(grid, 2, grid.length / 2);
65
+ }
66
+
67
+ frame() {
68
+ var i = this.MAX_FRAMES;
69
+ while (i-- && this._queue.length) {
70
+ var q = this._queue.shift();
71
+ q._isRendering = false;
72
+ q.rendering();
73
+ q.events.dispatch(q.events.loadend);
74
+ }
75
+
76
+ i = this._animate.length;
77
+ while (i--) {
78
+ this._animate[i].rendering();
79
+ }
80
+ }
81
+
82
+ add(geoImage) {
83
+ if (!geoImage._isRendering) {
84
+ geoImage._isRendering = true;
85
+ if (geoImage._animate) {
86
+ this._animate.push(geoImage);
87
+ } else {
88
+ this._queue.push(geoImage);
89
+ }
90
+ }
91
+ }
92
+
93
+ remove(geoImage) {
94
+ if (geoImage._isRendering) {
95
+ geoImage._creationProceeding = false;
96
+ geoImage._isRendering = false;
97
+ var arr;
98
+ if (geoImage._animate) {
99
+ arr = this._animate;
100
+ } else {
101
+ arr = this._queue;
102
+ }
103
+ for (var i = 0; i < arr.length; i++) {
104
+ if (arr[i].isEqual(geoImage)) {
105
+ arr.splice(i, 1);
106
+ return;
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ _initBuffers() {
113
+
114
+ let h = this._planet.renderer.handler;
115
+
116
+ this._framebuffer = new Framebuffer(h, { width: 2, height: 2, useDepth: false });
117
+ this._framebuffer.init();
118
+
119
+ this._framebufferMercProj = new Framebuffer(h, { width: 2, height: 2, useDepth: false });
120
+ this._framebufferMercProj.init();
121
+
122
+ let gs = Math.log2(this._gridSize);
123
+
124
+ this._texCoordsBuffer = this._planet._textureCoordsBufferCache[gs];
125
+
126
+ this._indexBuffer = this._planet._indexesCache[gs][gs][gs][gs][gs].buffer;
127
+
128
+ this._quadTexCoordsBuffer = h.createArrayBuffer(new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]), 2, 4);
129
+ this._quadVertexBuffer = h.createArrayBuffer(new Float32Array([-1, 1, 1, 1, -1, -1, 1, -1]), 2, 4);
130
+ }
131
+
132
+ _initShaders() {
133
+
134
+ this._planet.renderer.handler.addProgram(new Program("geoImageTransform", {
135
+ uniforms: {
136
+ sourceTexture: "sampler2d",
137
+ extentParams: "vec4",
138
+ isFullExtent: "bool"
139
+ },
140
+ attributes: {
141
+ corners: "vec2",
142
+ texCoords: "vec2"
143
+ },
144
+ vertexShader: `attribute vec2 corners;
145
+ attribute vec2 texCoords;
146
+ varying vec2 v_texCoords;
147
+ uniform vec4 extentParams;
148
+ void main() {
149
+ v_texCoords = texCoords;
150
+ gl_Position = vec4((-1.0 + (corners - extentParams.xy) * extentParams.zw) * vec2(1.0, -1.0), 0.0, 1.0);
151
+ }`,
152
+ fragmentShader:
153
+ `precision highp float;
154
+ uniform sampler2D sourceTexture;
155
+ uniform bool isFullExtent;
156
+ varying vec2 v_texCoords;
154
157
  void main () {
155
- if(v_texCoords.x <= 0.001 || v_texCoords.x >= 0.999 ||
156
- v_texCoords.y <= 0.001 || v_texCoords.y >= 0.999) {
157
- discard;
158
- }
159
- gl_FragColor = texture2D(sourceTexture, v_texCoords);
160
- }`
161
- }));
162
- }
158
+ if(!isFullExtent && (v_texCoords.x <= 0.001 || v_texCoords.x >= 0.999 ||
159
+ v_texCoords.y <= 0.001 || v_texCoords.y >= 0.999)) {
160
+ discard;
161
+ }
162
+ gl_FragColor = texture2D(sourceTexture, v_texCoords);
163
+ }`
164
+ }));
165
+ }
163
166
  }