@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.
- package/README.md +1 -1
- package/css/og.css +388 -129
- package/dist/@openglobus/og.css +1 -1
- package/dist/@openglobus/og.esm.js +2 -2
- package/dist/@openglobus/og.esm.js.map +1 -1
- package/dist/@openglobus/og.umd.js +2 -2
- package/dist/@openglobus/og.umd.js.map +1 -1
- package/package.json +20 -19
- package/src/og/Globe.js +15 -16
- package/src/og/Object3d.js +33 -0
- package/src/og/control/GeoImageDragControl.js +102 -75
- package/src/og/control/LayerAnimation.js +306 -38
- package/src/og/control/LayerSwitcher.js +506 -159
- package/src/og/control/Lighting.js +27 -27
- package/src/og/control/RulerSwitcher.js +69 -0
- package/src/og/control/UIhelpers.js +146 -0
- package/src/og/control/index.js +3 -1
- package/src/og/control/ruler/RulerScene.js +6 -2
- package/src/og/control/visibleExtent/Segment.js +2 -1
- package/src/og/ellipsoid/wgs84.js +1 -1
- package/src/og/entity/LabelHandler.js +5 -2
- package/src/og/entity/LabelWorker.js +38 -53
- package/src/og/layer/BaseGeoImage.js +347 -312
- package/src/og/layer/CanvasTiles.js +312 -290
- package/src/og/layer/GeoImage.js +222 -214
- package/src/og/layer/GeoVideo.js +291 -291
- package/src/og/layer/Layer.js +71 -30
- package/src/og/layer/Material.js +109 -109
- package/src/og/layer/Vector.js +1 -0
- package/src/og/layer/XYZ.js +20 -12
- package/src/og/light/LightSource.js +364 -363
- package/src/og/math.js +2 -2
- package/src/og/quadTree/Node.js +7 -5
- package/src/og/renderer/Renderer.js +1 -1
- package/src/og/scene/Planet.js +103 -42
- package/src/og/segment/Segment.js +34 -56
- package/src/og/segment/Slice.js +1 -1
- package/src/og/shaders/drawnode.js +1 -1
- package/src/og/terrain/GlobusTerrain.js +31 -20
- package/src/og/terrain/MapboxTerrain.js +1 -1
- package/src/og/utils/BaseWorker.js +46 -0
- package/src/og/utils/GeoImageCreator.js +164 -161
- package/src/og/utils/Loader.js +60 -33
- package/src/og/utils/NormalMapCreator.js +403 -412
- package/src/og/utils/PlainSegmentWorker.js +29 -55
- package/src/og/utils/TerrainWorker.js +572 -589
- package/src/og/utils/functionComposition.js +13 -0
- package/src/og/webgl/Handler.js +42 -41
- package/types/Object3d.d.ts +1 -0
- package/types/camera/PlanetCamera.d.ts +4 -0
- package/types/control/GeoImageDragControl.d.ts +2 -0
- package/types/control/LayerAnimation.d.ts +73 -0
- package/types/control/LayerSwitcher.d.ts +55 -11
- package/types/control/MouseNavigation.d.ts +1 -0
- package/types/control/MouseWheelZoomControl.d.ts +1 -0
- package/types/control/Sun.d.ts +1 -0
- package/types/control/TouchNavigation.d.ts +1 -0
- package/types/control/UIhelpers.d.ts +13 -0
- package/types/control/index.d.ts +2 -1
- package/types/entity/LabelHandler.d.ts +2 -0
- package/types/entity/LabelWorker.d.ts +5 -7
- package/types/layer/BaseGeoImage.d.ts +9 -1
- package/types/layer/CanvasTiles.d.ts +5 -1
- package/types/layer/GeoImage.d.ts +1 -0
- package/types/layer/GeoTexture2d.d.ts +1 -0
- package/types/layer/Layer.d.ts +5 -1
- package/types/layer/Vector.d.ts +7 -0
- package/types/layer/WMS.d.ts +1 -0
- package/types/layer/XYZ.d.ts +8 -6
- package/types/math.d.ts +1 -1
- package/types/quadTree/EntityCollectionNode.d.ts +7 -0
- package/types/quadTree/Node.d.ts +1 -2
- package/types/renderer/Renderer.d.ts +1 -1
- package/types/renderer/RendererEvents.d.ts +16 -0
- package/types/scene/Planet.d.ts +19 -4
- package/types/segment/SegmentLonLat.d.ts +2 -0
- package/types/terrain/BilTerrain.d.ts +6 -0
- package/types/terrain/GlobusTerrain.d.ts +7 -0
- package/types/terrain/MapboxTerrain.d.ts +8 -0
- package/types/utils/BaseWorker.d.ts +14 -0
- package/types/utils/Loader.d.ts +3 -1
- package/types/utils/PlainSegmentWorker.d.ts +4 -6
- package/types/utils/TerrainWorker.d.ts +4 -6
- package/types/utils/functionComposition.d.ts +5 -0
- 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 {
|
|
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 =
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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.
|
|
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
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
geoImage.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
this._framebuffer
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
this._framebufferMercProj
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
this.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
}
|
package/src/og/utils/Loader.js
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
import { Events } from '../Events.js';
|
|
4
4
|
|
|
5
|
-
if (window && !('createImageBitmap' in window)) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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(
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
this.
|
|
152
|
-
|
|
153
|
-
|
|
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
|
}
|