@openglobus/og 0.14.4 → 0.15.0

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 (102) hide show
  1. package/css/og.css +377 -274
  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 +18 -17
  8. package/src/og/Clock.js +218 -194
  9. package/src/og/Globe.js +1 -3
  10. package/src/og/Object3d.js +104 -145
  11. package/src/og/camera/Camera.js +23 -19
  12. package/src/og/cons.js +107 -107
  13. package/src/og/control/Atmosphere.js +396 -0
  14. package/src/og/control/CompassButton.js +11 -18
  15. package/src/og/control/Control.js +187 -188
  16. package/src/og/control/GeoImageDragControl.js +84 -66
  17. package/src/og/control/LayerSwitcher.js +46 -145
  18. package/src/og/control/Lighting.js +314 -186
  19. package/src/og/control/RulerSwitcher.js +24 -19
  20. package/src/og/control/SimpleSkyBackground.js +38 -12
  21. package/src/og/control/Sun.js +2 -0
  22. package/src/og/control/ZoomControl.js +30 -42
  23. package/src/og/control/ruler/RulerScene.js +5 -23
  24. package/src/og/control/selection/Selection.js +21 -50
  25. package/src/og/control/selection/SelectionScene.js +15 -29
  26. package/src/og/control/timeline/TimelineControl.js +99 -0
  27. package/src/og/control/timeline/TimelineModel.js +133 -0
  28. package/src/og/control/timeline/TimelineView.js +449 -0
  29. package/src/og/control/timeline/timelineUtils.js +132 -0
  30. package/src/og/entity/Entity.js +30 -3
  31. package/src/og/entity/EntityCollection.js +0 -2
  32. package/src/og/entity/GeoObject.js +72 -56
  33. package/src/og/entity/GeoObjectHandler.js +487 -656
  34. package/src/og/input/input.js +3 -1
  35. package/src/og/layer/CanvasTiles.js +39 -34
  36. package/src/og/layer/Layer.js +2 -0
  37. package/src/og/layer/Material.js +1 -8
  38. package/src/og/light/LightSource.js +2 -0
  39. package/src/og/quadTree/Node.js +2 -1
  40. package/src/og/renderer/Renderer.js +26 -42
  41. package/src/og/renderer/RendererEvents.js +4 -4
  42. package/src/og/scene/Planet.js +276 -59
  43. package/src/og/scene/RenderNode.js +27 -12
  44. package/src/og/segment/Segment.js +0 -5
  45. package/src/og/shaders/atmos.js +332 -0
  46. package/src/og/shaders/drawnode.js +475 -109
  47. package/src/og/shaders/geoObject.js +96 -51
  48. package/src/og/shaders/polyline.js +212 -17
  49. package/src/og/shaders/utils.js +88 -0
  50. package/src/og/terrain/GlobusTerrain.js +2 -2
  51. package/src/og/ui/Button.js +106 -0
  52. package/src/og/ui/ButtonGroup.js +57 -0
  53. package/src/og/ui/Dialog.js +242 -0
  54. package/src/og/ui/Slider.js +144 -0
  55. package/src/og/ui/ToggleButton.js +51 -0
  56. package/src/og/ui/View.js +190 -0
  57. package/src/og/utils/shared.js +51 -33
  58. package/src/og/webgl/Framebuffer.js +308 -387
  59. package/src/og/webgl/Handler.js +68 -21
  60. package/src/og/webgl/Multisample.js +8 -0
  61. package/types/Clock.d.ts +7 -2
  62. package/types/Object3d.d.ts +14 -3
  63. package/types/camera/Camera.d.ts +15 -14
  64. package/types/control/Atmosphere.d.ts +15 -0
  65. package/types/control/CompassButton.d.ts +1 -2
  66. package/types/control/GeoImageDragControl.d.ts +7 -1
  67. package/types/control/LayerSwitcher.d.ts +4 -5
  68. package/types/control/Lighting.d.ts +32 -7
  69. package/types/control/SimpleSkyBackground.d.ts +4 -0
  70. package/types/control/ZoomControl.d.ts +0 -1
  71. package/types/control/ruler/RulerScene.d.ts +0 -1
  72. package/types/control/selection/Selection.d.ts +2 -4
  73. package/types/control/selection/SelectionScene.d.ts +0 -1
  74. package/types/entity/Entity.d.ts +8 -0
  75. package/types/entity/GeoObject.d.ts +28 -22
  76. package/types/entity/GeoObjectHandler.d.ts +16 -56
  77. package/types/input/input.d.ts +2 -0
  78. package/types/layer/CanvasTiles.d.ts +1 -0
  79. package/types/layer/Layer.d.ts +1 -0
  80. package/types/math/Plane.d.ts +1 -1
  81. package/types/renderer/Renderer.d.ts +7 -1
  82. package/types/scene/Planet.d.ts +20 -2
  83. package/types/scene/RenderNode.d.ts +2 -1
  84. package/types/segment/Segment.d.ts +1 -1
  85. package/types/shaders/atmos.d.ts +4 -0
  86. package/types/shaders/drawnode.d.ts +3 -2
  87. package/types/shaders/utils.d.ts +1 -0
  88. package/types/terrain/GlobusTerrain.d.ts +1 -1
  89. package/types/ui/Button.d.ts +21 -0
  90. package/types/ui/Dialog.d.ts +41 -0
  91. package/types/ui/Slider.d.ts +30 -0
  92. package/types/ui/ToggleButton.d.ts +10 -0
  93. package/types/ui/View.d.ts +32 -0
  94. package/types/utils/shared.d.ts +16 -14
  95. package/types/webgl/Framebuffer.d.ts +2 -5
  96. package/types/webgl/Handler.d.ts +11 -9
  97. package/types/webgl/Multisample.d.ts +2 -0
  98. package/src/og/ajax.js +0 -204
  99. package/src/og/entity/Object3d.js +0 -504
  100. package/types/ajax.d.ts +0 -24
  101. /package/src/og/{control → ui}/UIhelpers.js +0 -0
  102. /package/types/{control → ui}/UIhelpers.d.ts +0 -0
@@ -42,5 +42,7 @@ export const input = {
42
42
  KEY_APOSTROPHE: 192,
43
43
  MB_LEFT: 0,
44
44
  MB_RIGHT: 2,
45
- MB_MIDDLE: 1
45
+ MB_MIDDLE: 1,
46
+ KEY_BACK_SLASH: 220,
47
+ KEY_SINGLE_QUOTE: 222
46
48
  };
@@ -13,19 +13,17 @@ import { Layer } from "./Layer.js";
13
13
  * @type {number}
14
14
  */
15
15
 
16
- const EVENT_NAMES = [
17
- /**
18
- * Triggered when current tile image has loaded before rendereing.
19
- * @event og.layer.CanvasTiles#load
20
- */
16
+ const EVENT_NAMES = [/**
17
+ * Triggered when current tile image has loaded before rendereing.
18
+ * @event og.layer.CanvasTiles#load
19
+ */
21
20
  "load",
22
21
 
23
22
  /**
24
23
  * Triggered when all tiles have loaded or loading has stopped.
25
24
  * @event og.layer.CanvasTiles#loadend
26
25
  */
27
- "loadend"
28
- ];
26
+ "loadend"];
29
27
 
30
28
  /**
31
29
  * Layer used to rendering each tile as a separate canvas object.
@@ -50,6 +48,8 @@ class CanvasTiles extends Layer {
50
48
 
51
49
  this.events.registerNames(EVENT_NAMES);
52
50
 
51
+ this.animated = options.animated || false;
52
+
53
53
  this.minNativeZoom = options.minNativeZoom || 0;
54
54
  /**
55
55
  * Current creating tiles couter.
@@ -176,22 +176,19 @@ class CanvasTiles extends Layer {
176
176
  that.events.dispatch(e, material);
177
177
  }
178
178
  requestAnimationFrame(() => {
179
- that.drawTile(
180
- material,
181
- /**
182
- * Apply canvas.
183
- * @callback applyCanvasCallback
184
- * @param {Object} canvas -
185
- */
186
- function (canvas) {
187
- that._counter--;
188
- CanvasTiles.__requestsCounter--;
189
- if (material.isLoading) {
190
- material.applyImage(canvas);
191
- }
192
- that._dequeueRequest();
179
+ that.drawTile(material, /**
180
+ * Apply canvas.
181
+ * @callback applyCanvasCallback
182
+ * @param {Object} canvas -
183
+ */
184
+ function (canvas) {
185
+ that._counter--;
186
+ CanvasTiles.__requestsCounter--;
187
+ if (material.isLoading) {
188
+ material.applyImage(canvas);
193
189
  }
194
- );
190
+ that._dequeueRequest();
191
+ });
195
192
  });
196
193
  } else {
197
194
  material.textureNotExists();
@@ -231,10 +228,7 @@ class CanvasTiles extends Layer {
231
228
  while (this._pendingsQueue.length) {
232
229
  var pmat = this._pendingsQueue.pop();
233
230
  if (pmat.segment.node) {
234
- if (
235
- pmat.segment.initialized &&
236
- pmat.segment.node.getState() === quadTree.RENDERING
237
- ) {
231
+ if (pmat.segment.initialized && pmat.segment.node.getState() === quadTree.RENDERING) {
238
232
  return pmat;
239
233
  }
240
234
  pmat.isLoading = false;
@@ -245,14 +239,20 @@ class CanvasTiles extends Layer {
245
239
 
246
240
  applyMaterial(material) {
247
241
  if (material.isReady) {
242
+ if (material.layer.animated) {
243
+ requestAnimationFrame(() => {
244
+ this.drawTile(material, function (canvas) {
245
+ material.applyImage(canvas);
246
+ });
247
+ });
248
+ }
248
249
  return [0, 0, 1, 1];
249
250
  } else if (material.segment.tileZoom < this.minNativeZoom) {
250
251
  material.textureNotExists();
251
252
  } else {
252
253
 
253
254
  let segment = material.segment;
254
- let pn = segment.node,
255
- notEmpty = false;
255
+ let pn = segment.node, notEmpty = false;
256
256
 
257
257
  if (segment.passReady && !material.isLoading) {
258
258
  this.loadMaterial(material);
@@ -270,15 +270,20 @@ class CanvasTiles extends Layer {
270
270
  }
271
271
 
272
272
  if (notEmpty) {
273
+
274
+ if (material.layer.animated) {
275
+ requestAnimationFrame(() => {
276
+ this.drawTile(material, function (canvas) {
277
+ material.applyImage(canvas);
278
+ });
279
+ });
280
+ }
281
+
273
282
  material.appliedNodeId = pn.nodeId;
274
283
  material.texture = psegm.texture;
284
+
275
285
  let dZ2 = 1.0 / (2 << (segment.tileZoom - pn.segment.tileZoom - 1));
276
- return [
277
- segment.tileX * dZ2 - pn.segment.tileX,
278
- segment.tileY * dZ2 - pn.segment.tileY,
279
- dZ2,
280
- dZ2
281
- ];
286
+ return [segment.tileX * dZ2 - pn.segment.tileX, segment.tileY * dZ2 - pn.segment.tileY, dZ2, dZ2];
282
287
  } else {
283
288
  material.texture = segment.planet.transparentTexture;
284
289
  return [0, 0, 1, 1];
@@ -229,6 +229,8 @@ class Layer {
229
229
  let shininess = options.shininess || 20.0;
230
230
  this._specular = new Float32Array([s.x, s.y, s.z, shininess]);
231
231
  }
232
+
233
+ this.nightTextureCoefficient = options.nightTextureCoefficient || null;
232
234
  }
233
235
 
234
236
  set diffuse(rgb) {
@@ -29,13 +29,6 @@ class Material {
29
29
  this.pickingReady = false;
30
30
  }
31
31
 
32
- ///**
33
- // * @param {*} layer
34
- // */
35
- //assignLayer(layer) {
36
- // this.layer = layer;
37
- //}
38
-
39
32
  /**
40
33
  *
41
34
  */
@@ -44,7 +37,7 @@ class Material {
44
37
  }
45
38
 
46
39
  _createTexture(img) {
47
- return this.layer._planet && this.layer.createTexture(img, this.layer._internalFormat);
40
+ return this.layer._planet && this.layer.createTexture(img, this.layer._internalFormat, this.isReady ? this.texture : null);
48
41
  }
49
42
 
50
43
  /**
@@ -127,9 +127,11 @@ class LightSource {
127
127
  this._ambient.x = rn._lightsParamsv[index] = this._tempAmbient.x;
128
128
  this._ambient.y = rn._lightsParamsv[index + 1] = this._tempAmbient.y;
129
129
  this._ambient.z = rn._lightsParamsv[index + 2] = this._tempAmbient.z;
130
+
130
131
  this._diffuse.x = rn._lightsParamsv[index + 3] = this._tempDiffuse.x;
131
132
  this._diffuse.y = rn._lightsParamsv[index + 4] = this._tempDiffuse.y;
132
133
  this._diffuse.z = rn._lightsParamsv[index + 5] = this._tempDiffuse.z;
134
+
133
135
  this._specular.x = rn._lightsParamsv[index + 6] = this._tempSpecular.x;
134
136
  this._specular.y = rn._lightsParamsv[index + 7] = this._tempSpecular.y;
135
137
  this._specular.z = rn._lightsParamsv[index + 8] = this._tempSpecular.z;
@@ -351,7 +351,8 @@ class Node {
351
351
  var bp = ni.segment;
352
352
  var ld = ap.gridSize / (bp.gridSize * Math.pow(2, bp.tileZoom - ap.tileZoom));
353
353
 
354
- let cs_size = ap.gridSize, opcs_size = bp.gridSize;
354
+ let cs_size = ap.gridSize,
355
+ opcs_size = bp.gridSize;
355
356
 
356
357
  if (ld > 1) {
357
358
  cs_size = Math.ceil(ap.gridSize / ld);
@@ -21,6 +21,10 @@ let __pickingCallbackCounter__ = 0;
21
21
 
22
22
  let __depthCallbackCounter__ = 0;
23
23
 
24
+ const DIFFUSE = 0;
25
+ const NORMAL = 1;
26
+ const POSITION = 2;
27
+
24
28
  /**
25
29
  * Represents high level WebGL context interface that starts WebGL handler working in real time.
26
30
  * @class
@@ -193,6 +197,13 @@ class Renderer {
193
197
  * @type {utils.TextureAtlas}
194
198
  */
195
199
  this.billboardsTextureAtlas = new TextureAtlas();
200
+ //TODO global texture atlas
201
+ /**
202
+ * Texture atlas for the billboards images. One atlas per node.
203
+ * @protected
204
+ * @type {utils.TextureAtlas}
205
+ */
206
+ this.geoObjectsTextureAtlas = new TextureAtlas();
196
207
 
197
208
  /**
198
209
  * Texture font atlas for the font families and styles. One atlas per node.
@@ -389,6 +400,7 @@ class Renderer {
389
400
  var that = this;
390
401
 
391
402
  this.billboardsTextureAtlas.assignHandler(this.handler);
403
+ this.geoObjectsTextureAtlas.assignHandler(this.handler);
392
404
 
393
405
  this.fontAtlas.assignHandler(this.handler);
394
406
 
@@ -459,6 +471,7 @@ class Renderer {
459
471
  }).init();
460
472
 
461
473
  this.blitFramebuffer = new Framebuffer(this.handler, {
474
+ size: 1,
462
475
  useDepth: false,
463
476
  internalFormat: this._internalFormat,
464
477
  format: this._format,
@@ -487,10 +500,10 @@ class Renderer {
487
500
  __resizeTimeout = setTimeout(() => {
488
501
  this._resizeEnd();
489
502
  this.events.dispatch(this.events.resizeend, this.handler.canvas);
490
- }, 500);
503
+ }, 320);
491
504
  };
492
505
 
493
- this._screenFrameCornersBuffer = this.handler.createArrayBuffer(
506
+ this.screenFramePositionBuffer = this.handler.createArrayBuffer(
494
507
  new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]),
495
508
  2,
496
509
  4
@@ -552,36 +565,6 @@ class Renderer {
552
565
  this.setCurrentScreen(this._currentOutput);
553
566
  }
554
567
 
555
- // resize() {
556
- // let c = this.handler.canvas;
557
- //
558
- // this.activeCamera.setAspectRatio(c.width / c.height);
559
- //
560
- // this.sceneFramebuffer.setSize(c.width, c.height);
561
- //
562
- // this.blitFramebuffer && this.blitFramebuffer.setSize(c.width, c.height, true);
563
- //
564
- // this.toneMappingFramebuffer && this.toneMappingFramebuffer.setSize(c.width, c.height, true);
565
- //
566
- // this.depthFramebuffer && this.depthFramebuffer.setSize(c.clientWidth, c.clientHeight, true);
567
- //
568
- // this.screenDepthFramebuffer && this.screenDepthFramebuffer.setSize(c.clientWidth, c.clientHeight, true);
569
- //
570
- // if (this.handler.gl.type === "webgl") {
571
- // this.screenTexture.screen = this.sceneFramebuffer.textures[0];
572
- // this.screenTexture.picking = this.pickingFramebuffer.textures[0];
573
- // this.screenTexture.depth = this.screenDepthFramebuffer.textures[0];
574
- // this.screenTexture.frustum = this.depthFramebuffer.textures[0];
575
- // } else {
576
- // this.screenTexture.screen = this.toneMappingFramebuffer.textures[0];
577
- // this.screenTexture.picking = this.pickingFramebuffer.textures[0];
578
- // this.screenTexture.depth = this.screenDepthFramebuffer.textures[0];
579
- // this.screenTexture.frustum = this.depthFramebuffer.textures[0];
580
- // }
581
- //
582
- // this.setCurrentScreen(this._currentOutput);
583
- // }
584
-
585
568
  removeNode(renderNode) {
586
569
  renderNode.remove();
587
570
  }
@@ -758,8 +741,8 @@ class Renderer {
758
741
  let e = this.events;
759
742
  e.handleEvents();
760
743
 
761
- let sfb = this.sceneFramebuffer;
762
- sfb.activate();
744
+ let sceneFramebuffer = this.sceneFramebuffer;
745
+ sceneFramebuffer.activate();
763
746
 
764
747
  let h = this.handler,
765
748
  gl = h.gl;
@@ -786,6 +769,7 @@ class Renderer {
786
769
  while (i--) {
787
770
  rn[i].drawNode();
788
771
  }
772
+
789
773
  this._drawEntityCollections();
790
774
 
791
775
  if (pointerEvent) {
@@ -793,9 +777,9 @@ class Renderer {
793
777
  }
794
778
  }
795
779
 
796
- sfb.deactivate();
780
+ sceneFramebuffer.deactivate();
797
781
 
798
- this.blitFramebuffer && sfb.blitTo(this.blitFramebuffer);
782
+ this.blitFramebuffer && sceneFramebuffer.blitTo(this.blitFramebuffer, 0);
799
783
 
800
784
  if (pointerEvent) {
801
785
  // It works ONLY for 0 (closest) frustum
@@ -825,7 +809,7 @@ class Renderer {
825
809
 
826
810
  gl.disable(gl.DEPTH_TEST);
827
811
 
828
- gl.bindBuffer(gl.ARRAY_BUFFER, this._screenFrameCornersBuffer);
812
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.screenFramePositionBuffer);
829
813
  gl.vertexAttribPointer(p.attributes.corners, 2, gl.FLOAT, false, 0, 0);
830
814
 
831
815
  this.toneMappingFramebuffer.activate();
@@ -869,7 +853,7 @@ class Renderer {
869
853
  gl.activeTexture(gl.TEXTURE0);
870
854
  gl.bindTexture(gl.TEXTURE_2D, this.outputTexture);
871
855
  gl.uniform1i(p.uniforms.texture, 0);
872
- gl.bindBuffer(gl.ARRAY_BUFFER, this._screenFrameCornersBuffer);
856
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.screenFramePositionBuffer);
873
857
  gl.vertexAttribPointer(p.attributes.corners, 2, gl.FLOAT, false, 0, 0);
874
858
  gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
875
859
  gl.enable(gl.DEPTH_TEST);
@@ -885,7 +869,7 @@ class Renderer {
885
869
  var h = this.handler;
886
870
  var gl = h.gl;
887
871
 
888
- if (frustumIndex === this.activeCamera.FARTHEST_FRUSTUM_INDEX) {
872
+ if (this.activeCamera.isFirstPass) {
889
873
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
890
874
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
891
875
  } else {
@@ -894,8 +878,8 @@ class Renderer {
894
878
 
895
879
  gl.disable(h.gl.BLEND);
896
880
 
897
- var dp = this._pickingCallbacks;
898
- var i = dp.length;
881
+ let dp = this._pickingCallbacks;
882
+ let i = dp.length;
899
883
  while (i--) {
900
884
  /**
901
885
  * This callback renders picking frame.
@@ -938,7 +922,7 @@ class Renderer {
938
922
 
939
923
  gl = h.gl;
940
924
 
941
- gl.bindBuffer(gl.ARRAY_BUFFER, this._screenFrameCornersBuffer);
925
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.screenFramePositionBuffer);
942
926
  gl.vertexAttribPointer(p.attributes.corners, 2, gl.FLOAT, false, 0, 0);
943
927
 
944
928
  sh.activate();
@@ -311,22 +311,22 @@ class RendererEvents extends Events {
311
311
  * @protected
312
312
  */
313
313
  updateButtonsStates(buttons) {
314
- var ms = this.mouseState;
315
- if (buttons & LB_M) {
314
+ let ms = this.mouseState;
315
+ if ((buttons & LB_M) && ms.leftButtonDown) {
316
316
  ms.leftButtonDown = true;
317
317
  } else {
318
318
  ms.leftButtonHold = false;
319
319
  ms.leftButtonDown = false;
320
320
  }
321
321
 
322
- if (buttons & RB_M) {
322
+ if ((buttons & RB_M) && ms.rightButtonDown) {
323
323
  ms.rightButtonDown = true;
324
324
  } else {
325
325
  ms.rightButtonHold = false;
326
326
  ms.rightButtonDown = false;
327
327
  }
328
328
 
329
- if (buttons & MB_M) {
329
+ if ((buttons & MB_M) && ms.middleButtonDown) {
330
330
  ms.middleButtonDown = true;
331
331
  } else {
332
332
  ms.middleButtonHold = false;