@openglobus/og 0.18.4 → 0.19.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 (64) hide show
  1. package/README.md +19 -68
  2. package/css/og.css +308 -45
  3. package/lib/@openglobus/og.css +1 -1
  4. package/lib/@openglobus/og.esm.js +1 -1
  5. package/lib/@openglobus/og.esm.js.map +1 -1
  6. package/lib/@openglobus/og.umd.js +1 -1
  7. package/lib/@openglobus/og.umd.js.map +1 -1
  8. package/lib/js/Globe.d.ts +2 -0
  9. package/lib/js/Globe.js +3 -1
  10. package/lib/js/camera/PlanetCamera.d.ts +2 -2
  11. package/lib/js/camera/PlanetCamera.js +3 -2
  12. package/lib/js/control/DebugInfo.js +5 -0
  13. package/lib/js/control/EarthCoordinates.js +2 -2
  14. package/lib/js/control/LayerSwitcher.d.ts +18 -3
  15. package/lib/js/control/LayerSwitcher.js +111 -11
  16. package/lib/js/control/MouseNavigation.d.ts +2 -0
  17. package/lib/js/control/MouseNavigation.js +15 -15
  18. package/lib/js/control/elevationProfile/ElevationProfile.d.ts +41 -25
  19. package/lib/js/control/elevationProfile/ElevationProfile.js +106 -75
  20. package/lib/js/control/elevationProfile/ElevationProfileButtonsView.d.ts +14 -0
  21. package/lib/js/control/elevationProfile/ElevationProfileButtonsView.js +61 -0
  22. package/lib/js/control/elevationProfile/ElevationProfileControl.d.ts +33 -0
  23. package/lib/js/control/elevationProfile/ElevationProfileControl.js +153 -0
  24. package/lib/js/control/elevationProfile/ElevationProfileLegend.d.ts +20 -0
  25. package/lib/js/control/elevationProfile/ElevationProfileLegend.js +82 -0
  26. package/lib/js/control/elevationProfile/ElevationProfileScene.d.ts +80 -0
  27. package/lib/js/control/elevationProfile/ElevationProfileScene.js +539 -0
  28. package/lib/js/control/elevationProfile/ElevationProfileView.d.ts +63 -0
  29. package/lib/js/control/elevationProfile/ElevationProfileView.js +504 -0
  30. package/lib/js/control/elevationProfile/PointListDialog.d.ts +12 -0
  31. package/lib/js/control/elevationProfile/PointListDialog.js +57 -0
  32. package/lib/js/control/heightRuler/HeightRulerScene.js +1 -1
  33. package/lib/js/control/index.d.ts +2 -1
  34. package/lib/js/control/index.js +2 -1
  35. package/lib/js/control/ruler/RulerScene.js +3 -3
  36. package/lib/js/control/selection/SelectionScene.js +2 -2
  37. package/lib/js/entity/Entity.js +5 -1
  38. package/lib/js/entity/Polyline.js +1 -1
  39. package/lib/js/layer/GeoImage.js +3 -0
  40. package/lib/js/layer/Layer.d.ts +18 -4
  41. package/lib/js/layer/Layer.js +25 -4
  42. package/lib/js/layer/XYZ.d.ts +0 -1
  43. package/lib/js/quadTree/Node.d.ts +21 -3
  44. package/lib/js/quadTree/Node.js +173 -62
  45. package/lib/js/renderer/Renderer.d.ts +0 -1
  46. package/lib/js/renderer/Renderer.js +22 -44
  47. package/lib/js/renderer/RendererEvents.d.ts +1 -0
  48. package/lib/js/renderer/RendererEvents.js +5 -7
  49. package/lib/js/scene/Planet.d.ts +33 -4
  50. package/lib/js/scene/Planet.js +206 -84
  51. package/lib/js/segment/Segment.d.ts +7 -1
  52. package/lib/js/segment/Segment.js +40 -12
  53. package/lib/js/shaders/drawnode.js +21 -2
  54. package/lib/js/shaders/geoObject.js +26 -18
  55. package/lib/js/terrain/GlobusTerrain.d.ts +3 -0
  56. package/lib/js/terrain/GlobusTerrain.js +15 -3
  57. package/lib/js/terrain/MapboxTerrain.js +29 -29
  58. package/lib/js/ui/Dialog.js +1 -1
  59. package/lib/js/utils/TerrainWorker.js +1 -1
  60. package/lib/js/utils/shared.d.ts +3 -1
  61. package/lib/js/utils/shared.js +22 -3
  62. package/package.json +2 -2
  63. package/lib/js/shaders/pickingMask.d.ts +0 -2
  64. package/lib/js/shaders/pickingMask.js +0 -22
@@ -7,7 +7,6 @@ import { FontAtlas } from "../utils/FontAtlas";
7
7
  import { input } from "../input/input";
8
8
  import { isEmpty } from "../utils/shared";
9
9
  import { LabelWorker } from "../entity/LabelWorker";
10
- import { pickingMask } from "../shaders/pickingMask";
11
10
  import { randomi } from "../math";
12
11
  import { screenFrame } from "../shaders/screenFrame";
13
12
  import { toneMapping } from "../shaders/toneMapping";
@@ -197,7 +196,6 @@ class Renderer {
197
196
  this.screenFramePositionBuffer = null;
198
197
  this.screenTexture = {};
199
198
  this.outputTexture = null;
200
- this._pickingMaskCoordinatesBuffer = null;
201
199
  this._skipDistanceFrame = false;
202
200
  this._distancePixelBuffer = null;
203
201
  this._skipPickingFrame = false;
@@ -418,7 +416,7 @@ class Renderer {
418
416
  });
419
417
  this.handler.addProgram(screenFrame());
420
418
  this.pickingFramebuffer = new Framebuffer(this.handler, {
421
- width: 640, height: 480, depthComponent: "DEPTH_STENCIL", renderbufferTarget: "DEPTH_STENCIL_ATTACHMENT"
419
+ width: 640, height: 480
422
420
  });
423
421
  this.pickingFramebuffer.init();
424
422
  this._tempPickingPix_ = new Uint8Array(this.pickingFramebuffer.width * this.pickingFramebuffer.height * 4);
@@ -491,7 +489,6 @@ class Renderer {
491
489
  };
492
490
  this._initReadPixelsBuffers();
493
491
  }
494
- this.handler.addProgram(pickingMask());
495
492
  this.handler.ONCANVASRESIZE = () => {
496
493
  this._resizeStart();
497
494
  this.events.dispatch(this.events.resize, this.handler.canvas);
@@ -505,7 +502,6 @@ class Renderer {
505
502
  };
506
503
  this.screenFramePositionBuffer = this.handler.createArrayBuffer(new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), 2, 4);
507
504
  this.outputTexture = this.screenTexture.screen;
508
- this._pickingMaskCoordinatesBuffer = this.handler.createArrayBuffer(new Float32Array([0, 0]), 2, 1);
509
505
  this._initializeRenderNodes();
510
506
  this._initializeControls();
511
507
  }
@@ -644,17 +640,8 @@ class Renderer {
644
640
  let ec = this._entityCollections;
645
641
  if (ec.length) {
646
642
  this.enableBlendDefault();
647
- //geoObject
648
- let i = ec.length;
649
- while (i--) {
650
- let eci = ec[i];
651
- if (ec[i]._fadingOpacity) {
652
- eci.events.dispatch(eci.events.draw, eci);
653
- ec[i].geoObjectHandler.draw();
654
- }
655
- }
656
643
  // pointClouds pass
657
- i = ec.length;
644
+ let i = ec.length;
658
645
  while (i--) {
659
646
  ec[i]._fadingOpacity && ec[i].pointCloudHandler.draw();
660
647
  }
@@ -669,10 +656,19 @@ class Renderer {
669
656
  if (ec.length) {
670
657
  let gl = this.handler.gl;
671
658
  this.enableBlendDefault();
659
+ // GeoObjects
660
+ let i = ec.length;
661
+ while (i--) {
662
+ let eci = ec[i];
663
+ if (ec[i]._fadingOpacity) {
664
+ eci.events.dispatch(eci.events.draw, eci);
665
+ ec[i].geoObjectHandler.draw();
666
+ }
667
+ }
672
668
  // billboards pass
673
669
  gl.activeTexture(gl.TEXTURE0);
674
670
  gl.bindTexture(gl.TEXTURE_2D, this.billboardsTextureAtlas.texture);
675
- let i = ec.length;
671
+ i = ec.length;
676
672
  while (i--) {
677
673
  let eci = ec[i];
678
674
  eci._fadingOpacity && eci.billboardHandler.draw();
@@ -721,6 +717,7 @@ class Renderer {
721
717
  let h = this.handler, gl = h.gl;
722
718
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
723
719
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
720
+ this.enableBlendDefault();
724
721
  e.dispatch(e.draw, this);
725
722
  let frustums = this.activeCamera.frustums;
726
723
  let pointerEvent = e.pointerEvent() || this.activeCamera.isMoving;
@@ -742,6 +739,7 @@ class Renderer {
742
739
  }
743
740
  this._drawTransparentEntityCollections();
744
741
  this._clearEntityCollectionQueue();
742
+ e.dispatch(e.drawtransparent, this);
745
743
  if (pointerEvent) {
746
744
  this._drawPickingBuffer();
747
745
  this.__useDistanceFramebuffer__ && this._drawDistanceBuffer();
@@ -815,44 +813,24 @@ class Renderer {
815
813
  let gl = h.gl;
816
814
  if (this.activeCamera.isFirstPass) {
817
815
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
818
- gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
816
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
819
817
  }
820
818
  else {
821
- gl.clear(gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
819
+ gl.clear(gl.DEPTH_BUFFER_BIT);
822
820
  }
823
- //
824
- // draw picking mask
825
- //
826
- h.programs.pickingMask.activate();
827
- let sh = h.programs.pickingMask._program;
828
- let shu = sh.uniforms, sha = sh.attributes;
829
- let /*ts = this.events.touchState,*/ ms = this.events.mouseState;
830
- gl.disable(gl.DEPTH_TEST);
831
- gl.enable(gl.STENCIL_TEST);
832
- gl.colorMask(false, false, false, false);
833
- gl.stencilFunc(gl.ALWAYS, 2, 0xFF);
834
- gl.stencilOp(gl.REPLACE, gl.ZERO, gl.REPLACE);
835
- gl.uniform2f(shu.offset, (ms.nx - 0.5) * 2, (0.5 - ms.ny) * 2);
836
- gl.bindBuffer(gl.ARRAY_BUFFER, this._pickingMaskCoordinatesBuffer);
837
- gl.vertexAttribPointer(sha.coordinates, this._pickingMaskCoordinatesBuffer.itemSize, gl.FLOAT, false, 0, 0);
838
- gl.drawArrays(gl.POINTS, 0, this._pickingMaskCoordinatesBuffer.numItems);
839
- gl.enable(gl.DEPTH_TEST);
840
- //
841
- // draw picking scenes
842
- //
843
- gl.colorMask(true, true, true, true);
844
- gl.stencilFunc(gl.EQUAL, 2, 0xFF);
845
- gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
846
- gl.disable(gl.BLEND);
847
821
  let dp = this._pickingCallbacks;
848
822
  for (let i = 0, len = dp.length; i < len; i++) {
823
+ //
824
+ // draw picking scenes, usually we don't need blending,
825
+ // but sometimes set it manually in the callbacks
826
+ //
827
+ gl.disable(gl.BLEND);
849
828
  /**
850
829
  * This callback renders picking frame.
851
830
  */
852
831
  dp[i].callback.call(dp[i].sender);
832
+ gl.enable(gl.BLEND);
853
833
  }
854
- gl.enable(gl.BLEND);
855
- gl.disable(gl.STENCIL_TEST);
856
834
  this.pickingFramebuffer.deactivate();
857
835
  }
858
836
  /**
@@ -9,6 +9,7 @@ export type RendererEventsHandler = RendererEvents & EventsHandler<RendererEvent
9
9
  export declare function createRendererEvents(renderer: Renderer): RendererEvents;
10
10
  export type RendererEventsType = [
11
11
  "draw",
12
+ "drawtransparent",
12
13
  "postdraw",
13
14
  "resize",
14
15
  "resizeend",
@@ -11,8 +11,6 @@ export function createRendererEvents(renderer) {
11
11
  const LB_M = 0b0001;
12
12
  const RB_M = 0b0010;
13
13
  const MB_M = 0b0100;
14
- let __skipFrames__ = 0;
15
- const MAX_SKIP_FRAMES_ON_BLACK = 15;
16
14
  const ISBLACK = (c) => !(c[0] || c[1] || c[2]);
17
15
  const NOTBLACK = (c) => !!(c[0] || c[1] || c[2]);
18
16
  /**
@@ -454,11 +452,6 @@ class RendererEvents extends Events {
454
452
  else {
455
453
  r.readPickingColor(ms.nx, 1 - ms.ny, t);
456
454
  }
457
- // current is black
458
- if (ISBLACK(t) && __skipFrames__++ < MAX_SKIP_FRAMES_ON_BLACK) {
459
- return;
460
- }
461
- __skipFrames__ = 0;
462
455
  p[0] = c[0];
463
456
  p[1] = c[1];
464
457
  p[2] = c[2];
@@ -717,6 +710,11 @@ const RENDERER_EVENTS = [
717
710
  * @event og.RendererEvents#draw
718
711
  */
719
712
  "draw",
713
+ /**
714
+ * Triggered after all transparent object are drawn
715
+ * @event og.RendererEvents#drawtransparent
716
+ */
717
+ "drawtransparent",
720
718
  /**
721
719
  * Triggered after scene frame is rendered(after render nodes).
722
720
  * @event og.RendererEvents#postdraw
@@ -23,6 +23,8 @@ import { TerrainWorker } from "../utils/TerrainWorker";
23
23
  import { Vec2, Vec3, NumberArray2, NumberArray3, NumberArray4 } from "../math/index";
24
24
  import { VectorTileCreator } from "../utils/VectorTileCreator";
25
25
  import { WebGLBufferExt, WebGLTextureExt, IDefaultTextureParams } from "../webgl/Handler";
26
+ import { Program } from "../webgl/Program";
27
+ import { Segment } from "../segment/Segment";
26
28
  export interface IPlanetParams {
27
29
  name?: string;
28
30
  ellipsoid?: Ellipsoid;
@@ -42,6 +44,7 @@ export interface IPlanetParams {
42
44
  maxGridSize?: number;
43
45
  maxLoadingRequests?: number;
44
46
  atmosphereEnabled?: boolean;
47
+ transitionOpacityEnabled?: boolean;
45
48
  }
46
49
  export type PlanetEventsList = [
47
50
  "draw",
@@ -176,6 +179,8 @@ export declare class Planet extends RenderNode {
176
179
  */
177
180
  _renderedNodes: Node[];
178
181
  _renderedNodesInFrustum: Node[][];
182
+ _fadingNodes: Map<number, Node>;
183
+ _fadingNodesInFrustum: Node[][];
179
184
  /**
180
185
  * Current visible mercator segments tree nodes array.
181
186
  * @public
@@ -306,7 +311,8 @@ export declare class Planet extends RenderNode {
306
311
  * @type {number}
307
312
  */
308
313
  nightTextureCoefficient: number;
309
- protected _renderScreenNodesPASS: Function;
314
+ protected _renderScreenNodesPASS: () => void;
315
+ protected _renderScreenNodesWithHeightPASS: () => void;
310
316
  protected _atmosphereEnabled: boolean;
311
317
  protected _atmosphereMaxMinOpacity: Float32Array;
312
318
  solidTextureOne: WebGLTextureExt | null;
@@ -314,7 +320,15 @@ export declare class Planet extends RenderNode {
314
320
  protected _skipPreRender: boolean;
315
321
  protected _nightTextureSrc: string | null;
316
322
  protected _specularTextureSrc: string | null;
323
+ transitionTime: number;
324
+ _prevNodes: Map<number, Node>;
325
+ _currNodes: Map<number, Node>;
326
+ protected _transitionOpacityEnabled: boolean;
317
327
  constructor(options?: IPlanetParams);
328
+ /**
329
+ * Returns true if current terrain data set is loaded
330
+ */
331
+ get terrainReady(): boolean;
318
332
  get maxGridSize(): number;
319
333
  getNorthFrameRotation(cartesian: Vec3): Quat;
320
334
  set atmosphereMaxOpacity(opacity: number);
@@ -443,11 +457,18 @@ export declare class Planet extends RenderNode {
443
457
  protected _sortLayers(): void;
444
458
  protected _clearRenderedNodeList(): void;
445
459
  protected _clearRenderNodesInFrustum(): void;
460
+ protected _collectRenderedNodesMaxZoom(cam: PlanetCamera): void;
461
+ set transitionOpacityEnabled(isEnabled: boolean);
462
+ get transitionOpacityEnabled(): boolean;
446
463
  /**
447
464
  * Collects visible quad nodes.
448
465
  * @protected
449
466
  */
450
- protected _collectRenderNodes(): void;
467
+ protected _collectRenderNodes(cam: PlanetCamera): void;
468
+ protected _renderScreenNodesPASSNoAtmos(): void;
469
+ protected _renderScreenNodesPASSAtmos(): void;
470
+ protected _renderScreenNodesWithHeightPASSNoAtmos(): void;
471
+ protected _renderScreenNodesWithHeightPASSAtmos(): void;
451
472
  protected _globalPreDraw(): void;
452
473
  /**
453
474
  * Render node callback.
@@ -456,6 +477,7 @@ export declare class Planet extends RenderNode {
456
477
  preFrame(): void;
457
478
  /**
458
479
  * Render node callback.
480
+ * Frame function is called for each renderer activrCamera frustum.
459
481
  * @public
460
482
  * @override
461
483
  */
@@ -463,8 +485,15 @@ export declare class Planet extends RenderNode {
463
485
  protected _checkRendercompleted(): void;
464
486
  lockQuadTree(): void;
465
487
  unlockQuadTree(): void;
466
- protected _renderScreenNodesPASSNoAtmos(): void;
467
- protected _renderScreenNodesPASSAtmos(): void;
488
+ protected _setUniformsNoAtmos(cam: PlanetCamera): Program;
489
+ protected _setUniformsAtmos(cam: PlanetCamera): Program;
490
+ protected _renderingFadingNodes: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number, outTransparentSegments?: Segment[]) => void;
491
+ protected _renderingFadingNodesNoDepth: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number) => void;
492
+ /**
493
+ * Drawing nodes
494
+ */
495
+ protected _renderingScreenNodes(sh: Program, cam: PlanetCamera, renderedNodes: Node[]): void;
496
+ protected _renderingScreenNodesWithHeight(sh: Program, cam: PlanetCamera, renderedNodes: Node[]): void;
468
497
  protected _renderDistanceFramebufferPASS(): void;
469
498
  protected _renderColorPickingFramebufferPASS(): void;
470
499
  protected _renderDepthFramebufferPASS(): void;