@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.
- 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 +417 -0
- package/src/og/arial.js +1705 -1703
- package/src/og/camera/Camera.js +640 -640
- package/src/og/control/EarthCoordinates.js +1 -1
- package/src/og/control/GeoImageDragControl.js +102 -75
- package/src/og/control/LayerAnimation.js +383 -0
- package/src/og/control/LayerSwitcher.js +506 -159
- package/src/og/control/Lighting.js +27 -27
- package/src/og/control/MouseNavigation.js +460 -460
- package/src/og/control/RulerSwitcher.js +69 -0
- package/src/og/control/Sun.js +170 -170
- package/src/og/control/UIhelpers.js +146 -0
- package/src/og/control/ZoomControl.js +0 -2
- package/src/og/control/index.js +5 -1
- package/src/og/control/ruler/Ruler.js +43 -0
- package/src/og/control/ruler/RulerScene.js +374 -0
- package/src/og/control/visibleExtent/Segment.js +3 -5
- package/src/og/ellipsoid/Ellipsoid.js +19 -0
- package/src/og/ellipsoid/wgs84.js +1 -1
- package/src/og/entity/Entity.js +1 -1
- package/src/og/entity/GeoObject.js +1 -1
- package/src/og/entity/LabelHandler.js +6 -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 +94 -70
- package/src/og/layer/Material.js +109 -109
- package/src/og/layer/Vector.js +81 -14
- package/src/og/layer/XYZ.js +23 -11
- package/src/og/light/LightSource.js +364 -363
- package/src/og/math/Vec3.js +1 -1
- package/src/og/math.js +6 -6
- package/src/og/quadTree/Node.js +8 -6
- package/src/og/renderer/Renderer.js +2 -3
- package/src/og/res/images.js +0 -2
- package/src/og/scene/Planet.js +106 -44
- package/src/og/segment/Segment.js +34 -64
- package/src/og/segment/Slice.js +1 -1
- package/src/og/shaders/drawnode.js +1 -1
- package/src/og/shaders/label.js +30 -42
- 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/FontAtlas.js +1 -2
- package/src/og/utils/GeoImageCreator.js +164 -161
- package/src/og/utils/Loader.js +187 -153
- 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/VectorTileCreator.js +1 -1
- package/src/og/utils/functionComposition.js +13 -0
- package/src/og/webgl/Handler.js +42 -41
- package/src/og/webgl/ProgramController.js +143 -143
- package/types/Object3d.d.ts +22 -0
- package/types/arial.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 +2 -1
- package/types/control/TouchNavigation.d.ts +1 -0
- package/types/control/UIhelpers.d.ts +13 -0
- package/types/control/index.d.ts +3 -1
- package/types/control/ruler/Ruler.d.ts +13 -0
- package/types/control/ruler/RulerScene.d.ts +48 -0
- package/types/ellipsoid/Ellipsoid.d.ts +8 -0
- 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 +28 -32
- package/types/layer/Vector.d.ts +9 -0
- package/types/layer/WMS.d.ts +1 -0
- package/types/layer/XYZ.d.ts +8 -5
- package/types/math.d.ts +2 -2
- 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/res/images.d.ts +0 -1
- package/types/scene/Planet.d.ts +21 -6
- 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 +4 -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
package/src/og/shaders/label.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
249
|
-
float
|
|
250
|
-
if(
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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
|
+
}
|
|
@@ -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 =
|
|
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
|
-
|
|
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
|
}
|