@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.
Files changed (78) hide show
  1. package/css/og.css +66 -25
  2. package/dist/@openglobus/og.css +1 -1
  3. package/dist/@openglobus/og.esm.js +2 -2
  4. package/dist/@openglobus/og.esm.js.map +1 -1
  5. package/dist/@openglobus/og.umd.js +2 -2
  6. package/dist/@openglobus/og.umd.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/og/Events.js +188 -188
  9. package/src/og/Extent.js +1 -9
  10. package/src/og/Globe.js +1 -0
  11. package/src/og/Object3d.js +384 -0
  12. package/src/og/arial.js +1705 -1703
  13. package/src/og/camera/Camera.js +640 -640
  14. package/src/og/control/DebugInfo.js +15 -4
  15. package/src/og/control/EarthCoordinates.js +151 -160
  16. package/src/og/control/KeyboardNavigation.js +48 -2
  17. package/src/og/control/LayerAnimation.js +115 -0
  18. package/src/og/control/MouseNavigation.js +460 -460
  19. package/src/og/control/Sun.js +170 -170
  20. package/src/og/control/TouchNavigation.js +13 -13
  21. package/src/og/control/ZoomControl.js +1 -3
  22. package/src/og/control/index.js +3 -1
  23. package/src/og/control/ruler/Ruler.js +43 -0
  24. package/src/og/control/ruler/RulerScene.js +370 -0
  25. package/src/og/control/visibleExtent/Segment.js +1 -4
  26. package/src/og/ellipsoid/Ellipsoid.js +20 -1
  27. package/src/og/entity/Entity.js +1 -1
  28. package/src/og/entity/GeoObject.js +1 -1
  29. package/src/og/entity/LabelHandler.js +3 -2
  30. package/src/og/input/input.js +7 -1
  31. package/src/og/layer/CanvasTiles.js +8 -8
  32. package/src/og/layer/KML.js +181 -12
  33. package/src/og/layer/Layer.js +27 -42
  34. package/src/og/layer/Vector.js +80 -14
  35. package/src/og/layer/XYZ.js +8 -2
  36. package/src/og/math/Vec3.js +1 -1
  37. package/src/og/math.js +4 -4
  38. package/src/og/quadTree/Node.js +2 -1
  39. package/src/og/renderer/Renderer.js +1 -2
  40. package/src/og/renderer/RendererEvents.js +17 -3
  41. package/src/og/res/images.js +0 -2
  42. package/src/og/scene/Planet.js +92 -32
  43. package/src/og/segment/Segment.js +1 -8
  44. package/src/og/shaders/label.js +30 -42
  45. package/src/og/terrain/EmptyTerrain.js +164 -146
  46. package/src/og/terrain/Geoid.js +246 -241
  47. package/src/og/terrain/GlobusTerrain.js +23 -24
  48. package/src/og/terrain/MapboxTerrain.js +292 -294
  49. package/src/og/utils/FontAtlas.js +1 -2
  50. package/src/og/utils/Loader.js +160 -112
  51. package/src/og/utils/PlainSegmentWorker.js +38 -26
  52. package/src/og/utils/VectorTileCreator.js +1 -1
  53. package/src/og/utils/units.js +78 -0
  54. package/src/og/webgl/ProgramController.js +143 -143
  55. package/types/Object3d.d.ts +21 -0
  56. package/types/arial.d.ts +1 -0
  57. package/types/control/EarthCoordinates.d.ts +27 -30
  58. package/types/control/KeyboardNavigation.d.ts +3 -0
  59. package/types/control/Sun.d.ts +1 -1
  60. package/types/control/index.d.ts +2 -1
  61. package/types/control/ruler/Ruler.d.ts +13 -0
  62. package/types/control/ruler/RulerScene.d.ts +48 -0
  63. package/types/ellipsoid/Ellipsoid.d.ts +8 -0
  64. package/types/input/input.d.ts +6 -0
  65. package/types/layer/KML.d.ts +26 -1
  66. package/types/layer/Layer.d.ts +23 -31
  67. package/types/layer/Vector.d.ts +2 -0
  68. package/types/layer/XYZ.d.ts +1 -0
  69. package/types/math.d.ts +1 -1
  70. package/types/renderer/RendererEvents.d.ts +2 -0
  71. package/types/res/images.d.ts +0 -1
  72. package/types/scene/Planet.d.ts +12 -3
  73. package/types/terrain/EmptyTerrain.d.ts +4 -1
  74. package/types/terrain/Geoid.d.ts +1 -10
  75. package/types/terrain/GlobusTerrain.d.ts +0 -2
  76. package/types/terrain/MapboxTerrain.d.ts +1 -1
  77. package/types/utils/Loader.d.ts +4 -0
  78. package/types/utils/units.d.ts +20 -0
@@ -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._promises = {
30
- 'json': r => r.json(),
31
- 'blob': r => r.blob(),
32
- 'arrayBuffer': r => r.arrayBuffer(),
33
- 'imageBitmap': r => r.blob().then(createImageBitmap),
34
- 'text': r => r.text()
35
- };
36
- }
37
-
38
- load(params, callback) {
39
- this._queue.push({ 'params': params, 'callback': callback });
40
- this._exec();
41
- }
42
-
43
- fetch(params) {
44
- return fetch(
45
- params.src,
46
- params.options || {})
47
-
48
- .then(response => {
49
- if (!response.ok) {
50
- throw Error(`Unable to load '${params.src}'`);
51
- }
52
- return this._promises[params.type || "blob"](response);
53
- })
54
-
55
- .then(data => {
56
- return { 'status': "ready", 'data': data };
57
-
58
- })
59
-
60
- .catch(err => {
61
- return { 'status': "error", 'msg': err.toString() };
62
- });
63
- }
64
-
65
- _exec() {
66
-
67
- if (this._queue.length > 0 && this._loading < this.MAX_REQUESTS) {
68
-
69
- let q = this._queue.pop(),
70
- p = q.params;
71
-
72
- if (!p.filter || p.filter(p)) {
73
-
74
- this._loading++;
75
-
76
- return fetch(p.src, p.options || {})
77
- .then(response => {
78
- if (!response.ok) {
79
- throw Error(`Unable to load '${p.src}'`);
80
- }
81
- return this._promises[p.type || "blob"](response);
82
- })
83
- .then(data => {
84
- this._loading--;
85
- q.callback({ 'status': "ready", 'data': data });
86
- this._exec();
87
- })
88
- .catch(err => {
89
- this._loading--;
90
- q.callback({ 'status': "error", 'msg': err.toString() });
91
- this._exec();
92
- });
93
-
94
- } else {
95
- q.callback({ 'status': "abort" });
96
- this._exec();
97
- }
98
- } else if (this._loading === 0) {
99
- this.events.dispatch(this.events.loadend);
100
- }
101
- }
102
-
103
- abort() {
104
- //this._queue.each(e => e.callback({ 'status': "abort" }));
105
- //this._queue.clear();
106
-
107
- for (let i = 0, len = this._queue.length; i < len; i++) {
108
- this._queue[i].callback({ 'status': "abort" });
109
- this._queue[i] = null;
110
- }
111
- this._queue = [];
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
- let m = geoid.model;
53
-
54
- let model = {
55
- scale: m.scale,
56
- offset: m.offset,
57
- width: m.width,
58
- height: m.height,
59
- rlonres: m.rlonres,
60
- rlatres: m.rlatres,
61
- i: m.i
62
- };
63
-
64
- this._workerQueue.forEach((w) => {
65
- let rawfile = new Uint8Array(m.rawfile.length);
66
- rawfile.set(m.rawfile);
67
-
68
- w.postMessage(
69
- {
70
- model: model,
71
- rawfile: rawfile
72
- },
73
- [rawfile.buffer]
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 = (material._updateTexture && material._updateTexture) || h.createEmptyTexture_l(width, height);
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
+ }