@openglobus/og 0.13.7 → 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 (50) hide show
  1. package/dist/@openglobus/og.esm.js +2 -2
  2. package/dist/@openglobus/og.esm.js.map +1 -1
  3. package/dist/@openglobus/og.umd.js +2 -2
  4. package/dist/@openglobus/og.umd.js.map +1 -1
  5. package/package.json +1 -1
  6. package/src/og/Object3d.js +384 -0
  7. package/src/og/arial.js +1705 -1703
  8. package/src/og/camera/Camera.js +640 -640
  9. package/src/og/control/EarthCoordinates.js +1 -1
  10. package/src/og/control/LayerAnimation.js +115 -0
  11. package/src/og/control/MouseNavigation.js +460 -460
  12. package/src/og/control/Sun.js +170 -170
  13. package/src/og/control/ZoomControl.js +0 -2
  14. package/src/og/control/index.js +3 -1
  15. package/src/og/control/ruler/Ruler.js +43 -0
  16. package/src/og/control/ruler/RulerScene.js +370 -0
  17. package/src/og/control/visibleExtent/Segment.js +1 -4
  18. package/src/og/ellipsoid/Ellipsoid.js +19 -0
  19. package/src/og/entity/Entity.js +1 -1
  20. package/src/og/entity/GeoObject.js +1 -1
  21. package/src/og/entity/LabelHandler.js +1 -0
  22. package/src/og/layer/Layer.js +23 -40
  23. package/src/og/layer/Vector.js +80 -14
  24. package/src/og/layer/XYZ.js +4 -0
  25. package/src/og/math/Vec3.js +1 -1
  26. package/src/og/math.js +4 -4
  27. package/src/og/quadTree/Node.js +1 -1
  28. package/src/og/renderer/Renderer.js +1 -2
  29. package/src/og/res/images.js +0 -2
  30. package/src/og/scene/Planet.js +3 -2
  31. package/src/og/segment/Segment.js +0 -8
  32. package/src/og/shaders/label.js +30 -42
  33. package/src/og/utils/FontAtlas.js +1 -2
  34. package/src/og/utils/Loader.js +160 -153
  35. package/src/og/utils/VectorTileCreator.js +1 -1
  36. package/src/og/webgl/ProgramController.js +143 -143
  37. package/types/Object3d.d.ts +21 -0
  38. package/types/arial.d.ts +1 -0
  39. package/types/control/Sun.d.ts +1 -1
  40. package/types/control/index.d.ts +2 -1
  41. package/types/control/ruler/Ruler.d.ts +13 -0
  42. package/types/control/ruler/RulerScene.d.ts +48 -0
  43. package/types/ellipsoid/Ellipsoid.d.ts +8 -0
  44. package/types/layer/Layer.d.ts +23 -31
  45. package/types/layer/Vector.d.ts +2 -0
  46. package/types/layer/XYZ.d.ts +1 -0
  47. package/types/math.d.ts +1 -1
  48. package/types/res/images.d.ts +0 -1
  49. package/types/scene/Planet.d.ts +2 -2
  50. package/types/utils/Loader.d.ts +1 -0
@@ -227,7 +227,7 @@ export class Planet extends RenderNode {
227
227
  */
228
228
  this.maxCurrZoom = math.MIN;
229
229
 
230
- this._viewExtent = null;
230
+ this._viewExtent = new Extent(new LonLat(180, 180), new LonLat(-180, -180));
231
231
 
232
232
  /**
233
233
  * @protected
@@ -1072,7 +1072,8 @@ export class Planet extends RenderNode {
1072
1072
  // clear first
1073
1073
  this._clearRenderedNodeList();
1074
1074
 
1075
- this._viewExtent = null;
1075
+ this._viewExtent.southWest.set(180, 180);
1076
+ this._viewExtent.northEast.set(-180, -180);
1076
1077
 
1077
1078
  this._visibleNodes = {};
1078
1079
  this._visibleNodesNorth = {};
@@ -1209,14 +1209,6 @@ class Segment {
1209
1209
  _addViewExtent() {
1210
1210
  var ext = this._extentLonLat;
1211
1211
 
1212
- if (!this.planet._viewExtent) {
1213
- this.planet._viewExtent = new Extent(
1214
- new LonLat(ext.southWest.lon, ext.southWest.lat),
1215
- new LonLat(ext.northEast.lon, ext.northEast.lat)
1216
- );
1217
- return;
1218
- }
1219
-
1220
1212
  var viewExt = this.planet._viewExtent;
1221
1213
 
1222
1214
  if (ext.southWest.lon < viewExt.southWest.lon) {
@@ -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
- vec4 sdfParams = getSDFParams();
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 strokeDist = sd + min(v_outline, 0.5 - 1.0 / sdfParams.w) - 0.5;
249
- float strokeAlpha = v_rgba.a * clamp(strokeDist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
250
- if(strokeAlpha < 0.1){
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 * strokeAlpha * (0.5 - opacity) * 2.0;
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
- discard;
602
+ return;
615
603
  }
616
604
 
617
605
  gl_FragColor = vec4(v_rgba.rgb, v_rgba.a);
@@ -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 = ARIAL_FONT_B64;
162
+ img.src = imageBase64;
164
163
  }
165
164
 
166
165
  _createTexture(atlas, img) {
@@ -1,154 +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._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
- _checkLoadend(request, sender) {
78
- if (request.counter === 0 && sender._planet._terrainCompletedActivated) {
79
- sender.events.dispatch(sender.events.loadend);
80
- request.__requestCounterFrame__ = null;
81
- } else {
82
- request.__requestCounterFrame__ = requestAnimationFrame(() => {
83
- this._checkLoadend(request, sender);
84
- });
85
- }
86
- }
87
-
88
- _handleResponse(q, response) {
89
- q.callback(response);
90
- let sender = q.params.sender;
91
- if (sender && sender.events.loadend.handlers.length) {
92
- let request = this._senderRequestCounter[sender._id];
93
- if (request && request.counter > 0) {
94
- request.counter--;
95
- cancelAnimationFrame(request.__requestCounterFrame__);
96
- request.__requestCounterFrame__ = requestAnimationFrame(() => {
97
- this._checkLoadend(request, sender);
98
- });
99
- }
100
- }
101
- this._exec();
102
- }
103
-
104
- _exec() {
105
-
106
- if (this._queue.length > 0 && this._loading < this.MAX_REQUESTS) {
107
-
108
- let q = this._queue.pop(),
109
- p = q.params;
110
-
111
- if (!p.filter || p.filter(p)) {
112
-
113
- this._loading++;
114
-
115
- return fetch(p.src, p.options || {})
116
- .then(response => {
117
- if (!response.ok) {
118
- throw Error(`Unable to load '${p.src}'`);
119
- }
120
- return this._promises[p.type || "blob"](response);
121
- })
122
- .then(data => {
123
- this._loading--;
124
- this._handleResponse(q, { status: "ready", data: data });
125
- })
126
- .catch(err => {
127
- this._loading--;
128
- this._handleResponse(q, { status: "error", msg: err.toString() });
129
- });
130
-
131
- } else {
132
- this._handleResponse(q, { status: "abort" });
133
- }
134
- } else if (this._loading === 0) {
135
- this.events.dispatch(this.events.loadend);
136
- }
137
- }
138
-
139
- abort() {
140
- for (let i = 0, len = this._queue.length; i < len; i++) {
141
- let qi = this._queue[i];
142
- let sender = qi.params.sender;
143
- if (sender && this._senderRequestCounter[sender._id]) {
144
- this._senderRequestCounter[sender._id].counter = 0;
145
- cancelAnimationFrame(this._senderRequestCounter[sender._id].__requestCounterFrame__);
146
- this._senderRequestCounter[sender._id].__requestCounterFrame__ = null;
147
- }
148
- qi.callback({ 'status': "abort" });
149
- this._queue[i] = null;
150
- }
151
- this._queue = [];
152
- this._loading === 0;
153
- }
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
+ }
154
161
  }
@@ -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