@openglobus/og 0.13.5 → 0.13.8
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/css/og.css +66 -25
- 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 +1 -1
- package/src/og/Events.js +188 -188
- package/src/og/Extent.js +1 -9
- package/src/og/Globe.js +1 -0
- package/src/og/Object3d.js +384 -0
- package/src/og/arial.js +1705 -1703
- package/src/og/camera/Camera.js +640 -640
- package/src/og/control/DebugInfo.js +15 -4
- package/src/og/control/EarthCoordinates.js +151 -160
- package/src/og/control/KeyboardNavigation.js +48 -2
- package/src/og/control/LayerAnimation.js +115 -0
- package/src/og/control/MouseNavigation.js +460 -460
- package/src/og/control/Sun.js +170 -170
- package/src/og/control/TouchNavigation.js +13 -13
- package/src/og/control/ZoomControl.js +1 -3
- package/src/og/control/index.js +3 -1
- package/src/og/control/ruler/Ruler.js +43 -0
- package/src/og/control/ruler/RulerScene.js +370 -0
- package/src/og/control/visibleExtent/Segment.js +1 -4
- package/src/og/ellipsoid/Ellipsoid.js +20 -1
- package/src/og/entity/Entity.js +1 -1
- package/src/og/entity/GeoObject.js +1 -1
- package/src/og/entity/LabelHandler.js +3 -2
- package/src/og/input/input.js +7 -1
- package/src/og/layer/CanvasTiles.js +8 -8
- package/src/og/layer/KML.js +181 -12
- package/src/og/layer/Layer.js +27 -42
- package/src/og/layer/Vector.js +80 -14
- package/src/og/layer/XYZ.js +8 -2
- package/src/og/math/Vec3.js +1 -1
- package/src/og/math.js +4 -4
- package/src/og/quadTree/Node.js +2 -1
- package/src/og/renderer/Renderer.js +1 -2
- package/src/og/renderer/RendererEvents.js +17 -3
- package/src/og/res/images.js +0 -2
- package/src/og/scene/Planet.js +92 -32
- package/src/og/segment/Segment.js +1 -8
- package/src/og/shaders/label.js +30 -42
- package/src/og/terrain/EmptyTerrain.js +164 -146
- package/src/og/terrain/Geoid.js +246 -241
- package/src/og/terrain/GlobusTerrain.js +23 -24
- package/src/og/terrain/MapboxTerrain.js +292 -294
- package/src/og/utils/FontAtlas.js +1 -2
- package/src/og/utils/Loader.js +160 -112
- package/src/og/utils/PlainSegmentWorker.js +38 -26
- package/src/og/utils/VectorTileCreator.js +1 -1
- package/src/og/utils/units.js +78 -0
- package/src/og/webgl/ProgramController.js +143 -143
- package/types/Object3d.d.ts +21 -0
- package/types/arial.d.ts +1 -0
- package/types/control/EarthCoordinates.d.ts +27 -30
- package/types/control/KeyboardNavigation.d.ts +3 -0
- package/types/control/Sun.d.ts +1 -1
- package/types/control/index.d.ts +2 -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/input/input.d.ts +6 -0
- package/types/layer/KML.d.ts +26 -1
- package/types/layer/Layer.d.ts +23 -31
- package/types/layer/Vector.d.ts +2 -0
- package/types/layer/XYZ.d.ts +1 -0
- package/types/math.d.ts +1 -1
- package/types/renderer/RendererEvents.d.ts +2 -0
- package/types/res/images.d.ts +0 -1
- package/types/scene/Planet.d.ts +12 -3
- package/types/terrain/EmptyTerrain.d.ts +4 -1
- package/types/terrain/Geoid.d.ts +1 -10
- package/types/terrain/GlobusTerrain.d.ts +0 -2
- package/types/terrain/MapboxTerrain.d.ts +1 -1
- package/types/utils/Loader.d.ts +4 -0
- package/types/utils/units.d.ts +20 -0
package/src/og/utils/Loader.js
CHANGED
|
@@ -1,113 +1,161 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
import { Events } from '../Events.js';
|
|
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
|
-
}
|
|
16
|
-
|
|
17
|
-
export class Loader {
|
|
18
|
-
|
|
19
|
-
constructor(maxRequests = 24) {
|
|
20
|
-
|
|
21
|
-
this.MAX_REQUESTS = maxRequests;
|
|
22
|
-
|
|
23
|
-
this.events = new Events(["loadend"]);
|
|
24
|
-
|
|
25
|
-
this._loading = 0;
|
|
26
|
-
|
|
27
|
-
this._queue = [];//new QueueArray();
|
|
28
|
-
|
|
29
|
-
this.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
'
|
|
33
|
-
'
|
|
34
|
-
'
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
this.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { Events } from '../Events.js';
|
|
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
|
+
}
|
|
16
|
+
|
|
17
|
+
export class Loader {
|
|
18
|
+
|
|
19
|
+
constructor(maxRequests = 24) {
|
|
20
|
+
|
|
21
|
+
this.MAX_REQUESTS = maxRequests;
|
|
22
|
+
|
|
23
|
+
this.events = new Events(["loadend", "layerloadend"]);
|
|
24
|
+
|
|
25
|
+
this._loading = 0;
|
|
26
|
+
|
|
27
|
+
this._queue = [];//new QueueArray();
|
|
28
|
+
|
|
29
|
+
this._senderRequestCounter = [];
|
|
30
|
+
|
|
31
|
+
this._promises = {
|
|
32
|
+
'json': r => r.json(),
|
|
33
|
+
'blob': r => r.blob(),
|
|
34
|
+
'arrayBuffer': r => r.arrayBuffer(),
|
|
35
|
+
'imageBitmap': r => r.blob().then(createImageBitmap),
|
|
36
|
+
'text': r => r.text()
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
load(params, callback) {
|
|
41
|
+
if (params.sender) {
|
|
42
|
+
if (!this._senderRequestCounter[params.sender._id]) {
|
|
43
|
+
this._senderRequestCounter[params.sender._id] = {
|
|
44
|
+
sender: params.sender,
|
|
45
|
+
counter: 0,
|
|
46
|
+
__requestCounterFrame__: null
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
this._senderRequestCounter[params.sender._id].counter++;
|
|
50
|
+
}
|
|
51
|
+
this._queue.push({ 'params': params, 'callback': callback });
|
|
52
|
+
this._exec();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
fetch(params) {
|
|
56
|
+
return fetch(
|
|
57
|
+
params.src,
|
|
58
|
+
params.options || {}
|
|
59
|
+
)
|
|
60
|
+
.then(response => {
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw Error(`Unable to load '${params.src}'`);
|
|
63
|
+
}
|
|
64
|
+
return this._promises[params.type || "blob"](response);
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
.then(data => {
|
|
68
|
+
return { 'status': "ready", 'data': data };
|
|
69
|
+
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
.catch(err => {
|
|
73
|
+
return { 'status': "error", 'msg': err.toString() };
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
isIdle(sender) {
|
|
78
|
+
let request = this._senderRequestCounter[sender._id];
|
|
79
|
+
return request && request.counter === 0 && (!sender._planet || sender._planet._terrainCompletedActivated);
|
|
80
|
+
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
_checkLoadend(request, sender) {
|
|
84
|
+
if (request.counter === 0 && (sender._planet._terrainCompletedActivated || !sender._planet)) {
|
|
85
|
+
sender.events.dispatch(sender.events.loadend, sender);
|
|
86
|
+
this.events.dispatch(this.events.layerloadend, sender);
|
|
87
|
+
request.__requestCounterFrame__ = null;
|
|
88
|
+
} else {
|
|
89
|
+
request.__requestCounterFrame__ = requestAnimationFrame(() => {
|
|
90
|
+
this._checkLoadend(request, sender);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
_handleResponse(q, response) {
|
|
96
|
+
q.callback(response);
|
|
97
|
+
let sender = q.params.sender;
|
|
98
|
+
if (sender && (sender.events.loadend.handlers.length || this.events.layerloadend.handlers.length)) {
|
|
99
|
+
let request = this._senderRequestCounter[sender._id];
|
|
100
|
+
if (request && request.counter > 0) {
|
|
101
|
+
request.counter--;
|
|
102
|
+
cancelAnimationFrame(request.__requestCounterFrame__);
|
|
103
|
+
request.__requestCounterFrame__ = requestAnimationFrame(() => {
|
|
104
|
+
this._checkLoadend(request, sender);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
this._exec();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
_exec() {
|
|
112
|
+
|
|
113
|
+
if (this._queue.length > 0 && this._loading < this.MAX_REQUESTS) {
|
|
114
|
+
|
|
115
|
+
let q = this._queue.pop(),
|
|
116
|
+
p = q.params;
|
|
117
|
+
|
|
118
|
+
if (!p.filter || p.filter(p)) {
|
|
119
|
+
|
|
120
|
+
this._loading++;
|
|
121
|
+
|
|
122
|
+
return fetch(p.src, p.options || {})
|
|
123
|
+
.then(response => {
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
throw Error(`Unable to load '${p.src}'`);
|
|
126
|
+
}
|
|
127
|
+
return this._promises[p.type || "blob"](response);
|
|
128
|
+
})
|
|
129
|
+
.then(data => {
|
|
130
|
+
this._loading--;
|
|
131
|
+
this._handleResponse(q, { status: "ready", data: data });
|
|
132
|
+
})
|
|
133
|
+
.catch(err => {
|
|
134
|
+
this._loading--;
|
|
135
|
+
this._handleResponse(q, { status: "error", msg: err.toString() });
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
} else {
|
|
139
|
+
this._handleResponse(q, { status: "abort" });
|
|
140
|
+
}
|
|
141
|
+
} else if (this._loading === 0) {
|
|
142
|
+
this.events.dispatch(this.events.loadend);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
abort() {
|
|
147
|
+
for (let i = 0, len = this._queue.length; i < len; i++) {
|
|
148
|
+
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;
|
|
154
|
+
}
|
|
155
|
+
qi.callback({ 'status': "abort" });
|
|
156
|
+
this._queue[i] = null;
|
|
157
|
+
}
|
|
158
|
+
this._queue = [];
|
|
159
|
+
this._loading = 0;
|
|
160
|
+
}
|
|
113
161
|
}
|
|
@@ -49,30 +49,42 @@ class PlainSegmentWorker {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
setGeoid(geoid) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
52
|
+
|
|
53
|
+
let model = null;
|
|
54
|
+
|
|
55
|
+
if (geoid.model) {
|
|
56
|
+
let m = geoid.model;
|
|
57
|
+
model = {
|
|
58
|
+
scale: m.scale,
|
|
59
|
+
offset: m.offset,
|
|
60
|
+
width: m.width,
|
|
61
|
+
height: m.height,
|
|
62
|
+
rlonres: m.rlonres,
|
|
63
|
+
rlatres: m.rlatres,
|
|
64
|
+
i: m.i
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
this._workerQueue.forEach((w) => {
|
|
68
|
+
let rawfile = new Uint8Array(m.rawfile.length);
|
|
69
|
+
rawfile.set(m.rawfile);
|
|
70
|
+
|
|
71
|
+
w.postMessage(
|
|
72
|
+
{
|
|
73
|
+
model: model,
|
|
74
|
+
rawfile: rawfile
|
|
75
|
+
},
|
|
76
|
+
[rawfile.buffer]
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
} else {
|
|
80
|
+
this._workerQueue.forEach((w) => {
|
|
81
|
+
w.postMessage(
|
|
82
|
+
{
|
|
83
|
+
model: null
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
76
88
|
}
|
|
77
89
|
|
|
78
90
|
make(segment) {
|
|
@@ -116,6 +128,8 @@ class PlainSegmentWorker {
|
|
|
116
128
|
|
|
117
129
|
const _programm = `
|
|
118
130
|
'use strict';
|
|
131
|
+
|
|
132
|
+
let model = null;
|
|
119
133
|
|
|
120
134
|
let cached_ix = null;
|
|
121
135
|
let cached_iy = null;
|
|
@@ -185,8 +199,6 @@ const _programm = `
|
|
|
185
199
|
return model.offset + model.scale * h;
|
|
186
200
|
};
|
|
187
201
|
|
|
188
|
-
let model = null;
|
|
189
|
-
|
|
190
202
|
const HALF_PI = Math.PI * 0.5;
|
|
191
203
|
const POLE = 20037508.34;
|
|
192
204
|
const PI_BY_POLE = Math.PI / POLE;
|
|
@@ -237,7 +237,7 @@ export class VectorTileCreator {
|
|
|
237
237
|
height = _h;
|
|
238
238
|
}
|
|
239
239
|
|
|
240
|
-
texture =
|
|
240
|
+
texture = material._updateTexture || h.createEmptyTexture_l(width, height);
|
|
241
241
|
|
|
242
242
|
f.setSize(width, height);
|
|
243
243
|
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
export const ELL = 0;
|
|
4
|
+
export const MSL = 1;
|
|
5
|
+
export const GND = 2;
|
|
6
|
+
|
|
7
|
+
export const heightMode = {
|
|
8
|
+
"ell": ELL,
|
|
9
|
+
"msl": MSL,
|
|
10
|
+
"gnd": GND
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const KM_to_M = 1000.0;
|
|
14
|
+
const M_to_KM = 1.0 / KM_to_M;
|
|
15
|
+
const FT_to_M = 0.3048;
|
|
16
|
+
const M_to_FT = 1.0 / FT_to_M;
|
|
17
|
+
const MS_to_KMH = 3.6;
|
|
18
|
+
const KMH_to_MS = 1.0 / MS_to_KMH;
|
|
19
|
+
const MS_to_FTS = 3.28084;
|
|
20
|
+
const FT_to_KM = FT_to_M * M_to_KM;
|
|
21
|
+
const KM_to_FT = 1.0 / FT_to_KM;
|
|
22
|
+
|
|
23
|
+
export const m = 0;
|
|
24
|
+
export const km = 1;
|
|
25
|
+
export const ft = 2;
|
|
26
|
+
export const s = 3;
|
|
27
|
+
export const h = 4;
|
|
28
|
+
export const ms = 5;
|
|
29
|
+
export const kmh = 6;
|
|
30
|
+
export const fts = 7;
|
|
31
|
+
|
|
32
|
+
const DEFAULT_NAN = "--";
|
|
33
|
+
|
|
34
|
+
const _abbr = ["m", "km", "ft", "s", "h", "m/s", "km/h", "ft/s"];
|
|
35
|
+
|
|
36
|
+
export const _tenth = [0, 2, 0, 0, 0, 0, 0, 0];
|
|
37
|
+
|
|
38
|
+
let _convFn = [];
|
|
39
|
+
|
|
40
|
+
_convFn[m] = [];
|
|
41
|
+
_convFn[m][m] = (v) => v;
|
|
42
|
+
_convFn[m][km] = (v) => v * M_to_KM;
|
|
43
|
+
_convFn[m][ft] = (v) => v * M_to_FT;
|
|
44
|
+
|
|
45
|
+
_convFn[ft] = [];
|
|
46
|
+
_convFn[ft][m] = (v) => v * FT_to_M;
|
|
47
|
+
_convFn[ft][km] = (v) => v * FT_to_KM;
|
|
48
|
+
_convFn[ft][ft] = (v) => v;
|
|
49
|
+
|
|
50
|
+
_convFn[km] = [];
|
|
51
|
+
_convFn[km][m] = (v) => v * KM_to_M;
|
|
52
|
+
_convFn[km][km] = (v) => v;
|
|
53
|
+
_convFn[km][ft] = (v) => v * KM_to_FT;
|
|
54
|
+
|
|
55
|
+
_convFn[ms] = [];
|
|
56
|
+
_convFn[ms][ms] = (v) => v;
|
|
57
|
+
_convFn[ms][kmh] = (v) => v * MS_to_KMH;
|
|
58
|
+
_convFn[ms][fts] = (v) => v * MS_to_FTS;
|
|
59
|
+
|
|
60
|
+
_convFn[kmh] = [];
|
|
61
|
+
_convFn[kmh][ms] = (v) => v * KMH_to_MS;
|
|
62
|
+
_convFn[kmh][kmh] = (v) => v;
|
|
63
|
+
//_convFn[kmh][fts] = (v) => v * KMH_to_FTS;
|
|
64
|
+
|
|
65
|
+
export function convert(from, to, val) {
|
|
66
|
+
return _convFn[from][to](val);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function convertExt(isNotNaN, unitFrom, unitTo, val, fixed) {
|
|
70
|
+
if (isNotNaN) {
|
|
71
|
+
return convert(unitFrom, unitTo, val).toFixed(fixed || _tenth[unitTo]);
|
|
72
|
+
}
|
|
73
|
+
return DEFAULT_NAN;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function toString(u) {
|
|
77
|
+
return _abbr[u];
|
|
78
|
+
}
|