@openglobus/og 0.13.8 → 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 (85) 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 +33 -0
  11. package/src/og/control/GeoImageDragControl.js +102 -75
  12. package/src/og/control/LayerAnimation.js +306 -38
  13. package/src/og/control/LayerSwitcher.js +506 -159
  14. package/src/og/control/Lighting.js +27 -27
  15. package/src/og/control/RulerSwitcher.js +69 -0
  16. package/src/og/control/UIhelpers.js +146 -0
  17. package/src/og/control/index.js +3 -1
  18. package/src/og/control/ruler/RulerScene.js +6 -2
  19. package/src/og/control/visibleExtent/Segment.js +2 -1
  20. package/src/og/ellipsoid/wgs84.js +1 -1
  21. package/src/og/entity/LabelHandler.js +5 -2
  22. package/src/og/entity/LabelWorker.js +38 -53
  23. package/src/og/layer/BaseGeoImage.js +347 -312
  24. package/src/og/layer/CanvasTiles.js +312 -290
  25. package/src/og/layer/GeoImage.js +222 -214
  26. package/src/og/layer/GeoVideo.js +291 -291
  27. package/src/og/layer/Layer.js +71 -30
  28. package/src/og/layer/Material.js +109 -109
  29. package/src/og/layer/Vector.js +1 -0
  30. package/src/og/layer/XYZ.js +20 -12
  31. package/src/og/light/LightSource.js +364 -363
  32. package/src/og/math.js +2 -2
  33. package/src/og/quadTree/Node.js +7 -5
  34. package/src/og/renderer/Renderer.js +1 -1
  35. package/src/og/scene/Planet.js +103 -42
  36. package/src/og/segment/Segment.js +34 -56
  37. package/src/og/segment/Slice.js +1 -1
  38. package/src/og/shaders/drawnode.js +1 -1
  39. package/src/og/terrain/GlobusTerrain.js +31 -20
  40. package/src/og/terrain/MapboxTerrain.js +1 -1
  41. package/src/og/utils/BaseWorker.js +46 -0
  42. package/src/og/utils/GeoImageCreator.js +164 -161
  43. package/src/og/utils/Loader.js +60 -33
  44. package/src/og/utils/NormalMapCreator.js +403 -412
  45. package/src/og/utils/PlainSegmentWorker.js +29 -55
  46. package/src/og/utils/TerrainWorker.js +572 -589
  47. package/src/og/utils/functionComposition.js +13 -0
  48. package/src/og/webgl/Handler.js +42 -41
  49. package/types/Object3d.d.ts +1 -0
  50. package/types/camera/PlanetCamera.d.ts +4 -0
  51. package/types/control/GeoImageDragControl.d.ts +2 -0
  52. package/types/control/LayerAnimation.d.ts +73 -0
  53. package/types/control/LayerSwitcher.d.ts +55 -11
  54. package/types/control/MouseNavigation.d.ts +1 -0
  55. package/types/control/MouseWheelZoomControl.d.ts +1 -0
  56. package/types/control/Sun.d.ts +1 -0
  57. package/types/control/TouchNavigation.d.ts +1 -0
  58. package/types/control/UIhelpers.d.ts +13 -0
  59. package/types/control/index.d.ts +2 -1
  60. package/types/entity/LabelHandler.d.ts +2 -0
  61. package/types/entity/LabelWorker.d.ts +5 -7
  62. package/types/layer/BaseGeoImage.d.ts +9 -1
  63. package/types/layer/CanvasTiles.d.ts +5 -1
  64. package/types/layer/GeoImage.d.ts +1 -0
  65. package/types/layer/GeoTexture2d.d.ts +1 -0
  66. package/types/layer/Layer.d.ts +5 -1
  67. package/types/layer/Vector.d.ts +7 -0
  68. package/types/layer/WMS.d.ts +1 -0
  69. package/types/layer/XYZ.d.ts +8 -6
  70. package/types/math.d.ts +1 -1
  71. package/types/quadTree/EntityCollectionNode.d.ts +7 -0
  72. package/types/quadTree/Node.d.ts +1 -2
  73. package/types/renderer/Renderer.d.ts +1 -1
  74. package/types/renderer/RendererEvents.d.ts +16 -0
  75. package/types/scene/Planet.d.ts +19 -4
  76. package/types/segment/SegmentLonLat.d.ts +2 -0
  77. package/types/terrain/BilTerrain.d.ts +6 -0
  78. package/types/terrain/GlobusTerrain.d.ts +7 -0
  79. package/types/terrain/MapboxTerrain.d.ts +8 -0
  80. package/types/utils/BaseWorker.d.ts +14 -0
  81. package/types/utils/Loader.d.ts +3 -1
  82. package/types/utils/PlainSegmentWorker.d.ts +4 -6
  83. package/types/utils/TerrainWorker.d.ts +4 -6
  84. package/types/utils/functionComposition.d.ts +5 -0
  85. package/types/webgl/Handler.d.ts +4 -1
@@ -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
+ }
@@ -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
  }
@@ -2,17 +2,17 @@
2
2
 
3
3
  import { Events } from '../Events.js';
4
4
 
5
- if (window && !('createImageBitmap' in window)) {
6
- window.createImageBitmap = function (blob) {
7
- return new Promise((resolve, reject) => {
8
- let img = document.createElement('img');
9
- img.addEventListener('load', function () {
10
- resolve(this);
11
- });
12
- img.src = URL.createObjectURL(blob);
13
- });
14
- };
15
- }
5
+ // if (window && !('createImageBitmap' in window)) {
6
+ // window.createImageBitmap = function (blob) {
7
+ // return new Promise((resolve, reject) => {
8
+ // let img = document.createElement('img');
9
+ // img.addEventListener('load', function () {
10
+ // resolve(this);
11
+ // });
12
+ // img.src = URL.createObjectURL(blob);
13
+ // });
14
+ // };
15
+ // }
16
16
 
17
17
  export class Loader {
18
18
 
@@ -32,7 +32,10 @@ export class Loader {
32
32
  'json': r => r.json(),
33
33
  'blob': r => r.blob(),
34
34
  'arrayBuffer': r => r.arrayBuffer(),
35
- 'imageBitmap': r => r.blob().then(createImageBitmap),
35
+ 'imageBitmap': r => r.blob().then(
36
+ (r) => createImageBitmap(r, {
37
+ premultiplyAlpha: "premultiply"
38
+ })),
36
39
  'text': r => r.text()
37
40
  };
38
41
  }
@@ -41,9 +44,7 @@ export class Loader {
41
44
  if (params.sender) {
42
45
  if (!this._senderRequestCounter[params.sender._id]) {
43
46
  this._senderRequestCounter[params.sender._id] = {
44
- sender: params.sender,
45
- counter: 0,
46
- __requestCounterFrame__: null
47
+ sender: params.sender, counter: 0, __requestCounterFrame__: null
47
48
  };
48
49
  }
49
50
  this._senderRequestCounter[params.sender._id].counter++;
@@ -53,10 +54,7 @@ export class Loader {
53
54
  }
54
55
 
55
56
  fetch(params) {
56
- return fetch(
57
- params.src,
58
- params.options || {}
59
- )
57
+ return fetch(params.src, params.options || {})
60
58
  .then(response => {
61
59
  if (!response.ok) {
62
60
  throw Error(`Unable to load '${params.src}'`);
@@ -74,10 +72,18 @@ export class Loader {
74
72
  });
75
73
  }
76
74
 
77
- isIdle(sender) {
78
- let request = this._senderRequestCounter[sender._id];
79
- return request && request.counter === 0 && (!sender._planet || sender._planet._terrainCompletedActivated);
75
+ getRequestCounter(sender) {
76
+ if (sender) {
77
+ let r = this._senderRequestCounter[sender._id];
78
+ if (r) {
79
+ return r.counter;
80
+ }
81
+ }
82
+ return 0;
83
+ }
80
84
 
85
+ isIdle(sender) {
86
+ return sender.isIdle;
81
87
  }
82
88
 
83
89
  _checkLoadend(request, sender) {
@@ -112,8 +118,11 @@ export class Loader {
112
118
 
113
119
  if (this._queue.length > 0 && this._loading < this.MAX_REQUESTS) {
114
120
 
115
- let q = this._queue.pop(),
116
- p = q.params;
121
+ let q = this._queue.pop();
122
+
123
+ if (!q) return;
124
+
125
+ let p = q.params;
117
126
 
118
127
  if (!p.filter || p.filter(p)) {
119
128
 
@@ -143,19 +152,37 @@ export class Loader {
143
152
  }
144
153
  }
145
154
 
146
- abort() {
155
+ abort(sender) {
156
+
157
+ if (this._senderRequestCounter[sender._id]) {
158
+ this._senderRequestCounter[sender._id].counter = 0;
159
+ cancelAnimationFrame(this._senderRequestCounter[sender._id].__requestCounterFrame__);
160
+ this._senderRequestCounter[sender._id].__requestCounterFrame__ = null;
161
+ }
162
+
147
163
  for (let i = 0, len = this._queue.length; i < len; i++) {
148
164
  let qi = this._queue[i];
149
- let sender = qi.params.sender;
150
- if (sender && this._senderRequestCounter[sender._id]) {
151
- this._senderRequestCounter[sender._id].counter = 0;
152
- cancelAnimationFrame(this._senderRequestCounter[sender._id].__requestCounterFrame__);
153
- this._senderRequestCounter[sender._id].__requestCounterFrame__ = null;
165
+ if (qi && sender.isEqual(qi.params.sender)) {
166
+ qi.callback({ 'status': "abort" });
167
+ this._queue[i] = null;
168
+ }
169
+ }
170
+ }
171
+
172
+ abortAll() {
173
+ for (let i = 0, len = this._queue.length; i < len; i++) {
174
+ let qi = this._queue[i];
175
+ if (qi) {
176
+ let sender = qi.params.sender;
177
+ if (sender && this._senderRequestCounter[sender._id]) {
178
+ this._senderRequestCounter[sender._id].counter = 0;
179
+ cancelAnimationFrame(this._senderRequestCounter[sender._id].__requestCounterFrame__);
180
+ this._senderRequestCounter[sender._id].__requestCounterFrame__ = null;
181
+ }
182
+ qi.callback({ 'status': "abort" });
183
+ this._queue[i] = null;
154
184
  }
155
- qi.callback({ 'status': "abort" });
156
- this._queue[i] = null;
157
185
  }
158
186
  this._queue = [];
159
- this._loading = 0;
160
187
  }
161
188
  }