@openglobus/og 0.22.1 → 0.23.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 (168) hide show
  1. package/css/og.css +137 -1
  2. package/lib/@openglobus/js/Object3d.d.ts +20 -10
  3. package/lib/@openglobus/js/camera/Camera.d.ts +9 -0
  4. package/lib/@openglobus/js/camera/Frustum.d.ts +3 -0
  5. package/lib/@openglobus/js/control/CameraLock.d.ts +38 -0
  6. package/lib/@openglobus/js/control/SimpleNavigation.d.ts +27 -10
  7. package/lib/@openglobus/js/control/geoObjectEditor/ArrowEntity.d.ts +15 -0
  8. package/lib/@openglobus/js/control/geoObjectEditor/AxisTrackEntity.d.ts +9 -0
  9. package/lib/@openglobus/js/control/geoObjectEditor/GeoObjectEditor.d.ts +13 -0
  10. package/lib/@openglobus/js/control/geoObjectEditor/GeoObjectEditorDialog.d.ts +69 -0
  11. package/lib/@openglobus/js/control/geoObjectEditor/GeoObjectEditorScene.d.ts +78 -9
  12. package/lib/@openglobus/js/control/geoObjectEditor/MoveAxisEntity.d.ts +17 -0
  13. package/lib/@openglobus/js/control/geoObjectEditor/MovePlaneEntity.d.ts +7 -0
  14. package/lib/@openglobus/js/control/geoObjectEditor/RotateEntity.d.ts +9 -0
  15. package/lib/@openglobus/js/control/geoObjectEditor/colors.d.ts +8 -0
  16. package/lib/@openglobus/js/control/index.d.ts +2 -0
  17. package/lib/@openglobus/js/entity/Entity.d.ts +278 -19
  18. package/lib/@openglobus/js/entity/EntityCollection.d.ts +8 -9
  19. package/lib/@openglobus/js/entity/GeoObject.d.ts +141 -36
  20. package/lib/@openglobus/js/entity/GeoObjectHandler.d.ts +39 -63
  21. package/lib/@openglobus/js/entity/InstanceData.d.ts +76 -0
  22. package/lib/@openglobus/js/entity/Polyline.d.ts +19 -6
  23. package/lib/@openglobus/js/entity/PolylineHandler.d.ts +7 -0
  24. package/lib/@openglobus/js/index.d.ts +2 -1
  25. package/lib/@openglobus/js/layer/Vector.d.ts +4 -0
  26. package/lib/@openglobus/js/light/LightSource.d.ts +1 -139
  27. package/lib/@openglobus/js/math/Quat.d.ts +46 -33
  28. package/lib/@openglobus/js/math/Ray.d.ts +10 -4
  29. package/lib/@openglobus/js/math/Vec3.d.ts +15 -0
  30. package/lib/@openglobus/js/math.d.ts +2 -2
  31. package/lib/@openglobus/js/quadTree/EntityCollectionNode.d.ts +2 -2
  32. package/lib/@openglobus/js/quadTree/Node.d.ts +1 -1
  33. package/lib/@openglobus/js/quadTree/earth/EarthEntityCollectionNodeLonLat.d.ts +1 -1
  34. package/lib/@openglobus/js/quadTree/equi/EquiEntityCollectionNodeLonLat.d.ts +1 -1
  35. package/lib/@openglobus/js/renderer/Renderer.d.ts +64 -44
  36. package/lib/@openglobus/js/renderer/RendererEvents.d.ts +1 -0
  37. package/lib/@openglobus/js/scene/Planet.d.ts +11 -7
  38. package/lib/@openglobus/js/scene/RenderNode.d.ts +10 -25
  39. package/lib/@openglobus/js/shaders/drawnode.d.ts +1 -0
  40. package/lib/@openglobus/js/shaders/geoObject.d.ts +1 -0
  41. package/lib/@openglobus/js/shaders/utils.d.ts +1 -1
  42. package/lib/@openglobus/js/ui/Checkbox.d.ts +31 -0
  43. package/lib/@openglobus/js/ui/Dialog.d.ts +3 -0
  44. package/lib/@openglobus/js/ui/Input.d.ts +32 -0
  45. package/lib/@openglobus/js/ui/View.d.ts +3 -1
  46. package/lib/@openglobus/js/utils/objParser.d.ts +44 -12
  47. package/lib/@openglobus/js/utils/shared.d.ts +22 -0
  48. package/lib/@openglobus/js/webgl/BaseFramebuffer.d.ts +0 -1
  49. package/lib/@openglobus/js/webgl/Framebuffer.d.ts +35 -8
  50. package/lib/@openglobus/js/webgl/Handler.d.ts +3 -0
  51. package/lib/@openglobus/og.css +1 -1
  52. package/lib/@openglobus/og.esm.js +1 -1
  53. package/lib/@openglobus/og.esm.js.map +1 -1
  54. package/lib/@openglobus/og.umd.js +1 -1
  55. package/lib/@openglobus/og.umd.js.map +1 -1
  56. package/lib/js/Globe.js +2 -1
  57. package/lib/js/Object3d.d.ts +20 -10
  58. package/lib/js/Object3d.js +124 -48
  59. package/lib/js/camera/Camera.d.ts +9 -0
  60. package/lib/js/camera/Camera.js +27 -1
  61. package/lib/js/camera/Frustum.d.ts +3 -0
  62. package/lib/js/camera/Frustum.js +7 -0
  63. package/lib/js/control/Atmosphere.js +10 -6
  64. package/lib/js/control/CameraLock.d.ts +38 -0
  65. package/lib/js/control/CameraLock.js +216 -0
  66. package/lib/js/control/Control.js +1 -1
  67. package/lib/js/control/DebugInfo.js +13 -3
  68. package/lib/js/control/KeyboardNavigation.js +1 -1
  69. package/lib/js/control/ScaleControl.js +9 -3
  70. package/lib/js/control/SimpleNavigation.d.ts +27 -10
  71. package/lib/js/control/SimpleNavigation.js +148 -49
  72. package/lib/js/control/Sun.js +1 -1
  73. package/lib/js/control/elevationProfile/ElevationProfileScene.js +4 -4
  74. package/lib/js/control/geoObjectEditor/ArrowEntity.d.ts +15 -0
  75. package/lib/js/control/geoObjectEditor/ArrowEntity.js +59 -0
  76. package/lib/js/control/geoObjectEditor/AxisTrackEntity.d.ts +9 -0
  77. package/lib/js/control/geoObjectEditor/AxisTrackEntity.js +93 -0
  78. package/lib/js/control/geoObjectEditor/GeoObjectEditor.d.ts +13 -0
  79. package/lib/js/control/geoObjectEditor/GeoObjectEditor.js +30 -0
  80. package/lib/js/control/geoObjectEditor/GeoObjectEditorDialog.d.ts +69 -0
  81. package/lib/js/control/geoObjectEditor/GeoObjectEditorDialog.js +502 -0
  82. package/lib/js/control/geoObjectEditor/GeoObjectEditorScene.d.ts +78 -9
  83. package/lib/js/control/geoObjectEditor/GeoObjectEditorScene.js +487 -43
  84. package/lib/js/control/geoObjectEditor/MoveAxisEntity.d.ts +17 -0
  85. package/lib/js/control/geoObjectEditor/MoveAxisEntity.js +106 -0
  86. package/lib/js/control/geoObjectEditor/MovePlaneEntity.d.ts +7 -0
  87. package/lib/js/control/geoObjectEditor/MovePlaneEntity.js +34 -0
  88. package/lib/js/control/geoObjectEditor/RotateEntity.d.ts +9 -0
  89. package/lib/js/control/geoObjectEditor/RotateEntity.js +105 -0
  90. package/lib/js/control/geoObjectEditor/colors.d.ts +8 -0
  91. package/lib/js/control/geoObjectEditor/colors.js +8 -0
  92. package/lib/js/control/index.d.ts +2 -0
  93. package/lib/js/control/index.js +2 -0
  94. package/lib/js/control/timeline/TimelineControl.js +2 -0
  95. package/lib/js/entity/Entity.d.ts +278 -19
  96. package/lib/js/entity/Entity.js +483 -63
  97. package/lib/js/entity/EntityCollection.d.ts +8 -9
  98. package/lib/js/entity/EntityCollection.js +48 -45
  99. package/lib/js/entity/GeoObject.d.ts +141 -36
  100. package/lib/js/entity/GeoObject.js +153 -90
  101. package/lib/js/entity/GeoObjectHandler.d.ts +39 -63
  102. package/lib/js/entity/GeoObjectHandler.js +198 -295
  103. package/lib/js/entity/InstanceData.d.ts +76 -0
  104. package/lib/js/entity/InstanceData.js +344 -0
  105. package/lib/js/entity/Polyline.d.ts +19 -6
  106. package/lib/js/entity/Polyline.js +76 -36
  107. package/lib/js/entity/PolylineHandler.d.ts +7 -0
  108. package/lib/js/entity/PolylineHandler.js +26 -1
  109. package/lib/js/index.d.ts +2 -1
  110. package/lib/js/index.js +2 -1
  111. package/lib/js/layer/Bing.js +2 -2
  112. package/lib/js/layer/Vector.d.ts +4 -0
  113. package/lib/js/layer/Vector.js +16 -0
  114. package/lib/js/light/LightSource.d.ts +1 -139
  115. package/lib/js/light/LightSource.js +21 -227
  116. package/lib/js/math/Quat.d.ts +46 -33
  117. package/lib/js/math/Quat.js +91 -90
  118. package/lib/js/math/Ray.d.ts +10 -4
  119. package/lib/js/math/Ray.js +20 -4
  120. package/lib/js/math/Vec3.d.ts +15 -0
  121. package/lib/js/math/Vec3.js +30 -1
  122. package/lib/js/math.d.ts +2 -2
  123. package/lib/js/math.js +3 -3
  124. package/lib/js/quadTree/EntityCollectionNode.d.ts +2 -2
  125. package/lib/js/quadTree/EntityCollectionNode.js +8 -8
  126. package/lib/js/quadTree/Node.d.ts +1 -1
  127. package/lib/js/quadTree/Node.js +2 -2
  128. package/lib/js/quadTree/QuadTreeStrategy.js +1 -1
  129. package/lib/js/quadTree/earth/EarthEntityCollectionNodeLonLat.d.ts +1 -1
  130. package/lib/js/quadTree/earth/EarthEntityCollectionNodeLonLat.js +2 -2
  131. package/lib/js/quadTree/equi/EquiEntityCollectionNodeLonLat.d.ts +1 -1
  132. package/lib/js/quadTree/equi/EquiEntityCollectionNodeLonLat.js +2 -2
  133. package/lib/js/renderer/Renderer.d.ts +64 -44
  134. package/lib/js/renderer/Renderer.js +264 -263
  135. package/lib/js/renderer/RendererEvents.d.ts +1 -0
  136. package/lib/js/renderer/RendererEvents.js +2 -1
  137. package/lib/js/scene/Planet.d.ts +11 -7
  138. package/lib/js/scene/Planet.js +109 -87
  139. package/lib/js/scene/RenderNode.d.ts +10 -25
  140. package/lib/js/scene/RenderNode.js +70 -58
  141. package/lib/js/shaders/depth.js +2 -5
  142. package/lib/js/shaders/drawnode.d.ts +1 -0
  143. package/lib/js/shaders/drawnode.js +51 -52
  144. package/lib/js/shaders/geoObject.d.ts +1 -0
  145. package/lib/js/shaders/geoObject.js +154 -91
  146. package/lib/js/shaders/polyline.js +68 -51
  147. package/lib/js/shaders/utils.d.ts +1 -1
  148. package/lib/js/shaders/utils.js +11 -0
  149. package/lib/js/ui/Checkbox.d.ts +31 -0
  150. package/lib/js/ui/Checkbox.js +110 -0
  151. package/lib/js/ui/Color.js +2 -1
  152. package/lib/js/ui/Dialog.d.ts +3 -0
  153. package/lib/js/ui/Dialog.js +20 -0
  154. package/lib/js/ui/Input.d.ts +32 -0
  155. package/lib/js/ui/Input.js +107 -0
  156. package/lib/js/ui/View.d.ts +3 -1
  157. package/lib/js/ui/View.js +6 -0
  158. package/lib/js/utils/objParser.d.ts +44 -12
  159. package/lib/js/utils/objParser.js +241 -149
  160. package/lib/js/utils/shared.d.ts +22 -0
  161. package/lib/js/utils/shared.js +34 -0
  162. package/lib/js/webgl/BaseFramebuffer.d.ts +0 -1
  163. package/lib/js/webgl/Framebuffer.d.ts +35 -8
  164. package/lib/js/webgl/Framebuffer.js +136 -29
  165. package/lib/js/webgl/Handler.d.ts +3 -0
  166. package/lib/js/webgl/Handler.js +11 -1
  167. package/lib/js/webgl/Program.js +0 -8
  168. package/package.json +4 -2
@@ -8,6 +8,7 @@ import { Vec3 } from "../math/Vec3";
8
8
  export type RendererEventsHandler = RendererEvents & EventsHandler<RendererEventsType>;
9
9
  export declare function createRendererEvents(renderer: Renderer): RendererEvents;
10
10
  export type RendererEventsType = [
11
+ "changerelativecenter",
11
12
  "draw",
12
13
  "drawtransparent",
13
14
  "postdraw",
@@ -95,7 +95,7 @@ class RendererEvents extends Events {
95
95
  pickingObject: null,
96
96
  renderer: renderer
97
97
  };
98
- this._isMouseInside = false;
98
+ this._isMouseInside = true;
99
99
  this._entityPickingEventsActive = true;
100
100
  this._dblTchCoords = new Vec2();
101
101
  this._oneTouchStart = false;
@@ -703,6 +703,7 @@ class RendererEvents extends Events {
703
703
  }
704
704
  }
705
705
  const RENDERER_EVENTS = [
706
+ "changerelativecenter",
706
707
  /**
707
708
  * Triggered before scene frame is rendered(before render nodes).
708
709
  * @event og.RendererEvents#draw
@@ -20,8 +20,10 @@ import { Quat } from "../math/Quat";
20
20
  import { QuadTreeStrategy } from "../quadTree/QuadTreeStrategy";
21
21
  import { Ray } from "../math/Ray";
22
22
  import { RenderNode } from "./RenderNode";
23
+ import { Sun } from "../control/Sun";
23
24
  import { TerrainWorker } from "../utils/TerrainWorker";
24
25
  import { Vec2, Vec3, NumberArray2, NumberArray3, NumberArray4 } from "../math/index";
26
+ import { Vector } from "../layer/Vector";
25
27
  import { VectorTileCreator } from "../utils/VectorTileCreator";
26
28
  import { WebGLBufferExt, WebGLTextureExt, IDefaultTextureParams } from "../webgl/Handler";
27
29
  import { Program } from "../webgl/Program";
@@ -122,14 +124,15 @@ export declare class Planet extends RenderNode {
122
124
  * @protected
123
125
  * @type {Array.<Layer>}
124
126
  */
125
- protected visibleVectorLayers: Layer[];
127
+ protected visibleVectorLayers: Vector[];
128
+ protected _visibleVectorLayersByDepthOrder: Vector[][];
126
129
  protected _visibleTileLayerSlices: Layer[][];
127
130
  /**
128
131
  * Vector layers visible nodes with collections.
129
132
  * @protected
130
- * @type {Array.<EntityCollection>}
133
+ * @type {EntityCollection[][]}
131
134
  */
132
- protected _frustumEntityCollections: EntityCollection[];
135
+ protected _visibleEntityCollections: EntityCollection[][];
133
136
  /**
134
137
  * There is only one base layer on the globe when layer.isBaseLayer is true.
135
138
  * @public
@@ -184,6 +187,7 @@ export declare class Planet extends RenderNode {
184
187
  _renderedNodesInFrustum: Node[][];
185
188
  _fadingNodes: Map<number, Node>;
186
189
  _fadingNodesInFrustum: Node[][];
190
+ protected _fadingOpaqueSegments: Segment[];
187
191
  /**
188
192
  * Layers activity lock.
189
193
  * @public
@@ -308,6 +312,7 @@ export declare class Planet extends RenderNode {
308
312
  get terrainReady(): boolean;
309
313
  get maxGridSize(): number;
310
314
  getNorthFrameRotation(cartesian: Vec3): Quat;
315
+ getFrameRotation(cartesian: Vec3): Quat;
311
316
  set atmosphereMaxOpacity(opacity: number);
312
317
  get atmosphereMaxOpacity(): number;
313
318
  set atmosphereMinOpacity(opacity: number);
@@ -327,6 +332,7 @@ export declare class Planet extends RenderNode {
327
332
  * @public
328
333
  */
329
334
  getLayers(): Layer[];
335
+ get sun(): Sun | undefined;
330
336
  get sunPos(): Vec3;
331
337
  /**
332
338
  * Add the given control to the renderer of the planet scene.
@@ -466,18 +472,16 @@ export declare class Planet extends RenderNode {
466
472
  unlockQuadTree(): void;
467
473
  protected _setUniformsNoAtmos(cam: PlanetCamera): Program;
468
474
  protected _setUniformsAtmos(cam: PlanetCamera): Program;
469
- protected _renderingFadingNodes: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number, outTransparentSegments?: Segment[]) => void;
470
- protected _renderingFadingNodesNoDepth: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number) => void;
475
+ protected _renderingFadingNodes: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number, outTransparentSegments?: Segment[], outOpaqueSegments?: Segment[]) => void;
476
+ protected _renderingFadingNodesNoDepth: (nodes: Map<number, boolean>, sh: Program, currentNode: Node, sl: Layer[], sliceIndex: number, outOpaqueSegments?: Segment[]) => void;
471
477
  /**
472
478
  * Drawing nodes
473
479
  */
474
480
  protected _renderingScreenNodes(sh: Program, cam: PlanetCamera, renderedNodes: Node[]): void;
475
481
  protected _renderingScreenNodesWithHeight(sh: Program, cam: PlanetCamera, renderedNodes: Node[]): void;
476
- protected _renderDistanceFramebufferPASS(): void;
477
482
  protected _renderColorPickingFramebufferPASS(): void;
478
483
  protected _renderDepthFramebufferPASS(): void;
479
484
  protected _collectVectorLayerCollections(): void;
480
- protected _frustumEntityCollectionPickingCallback(): void;
481
485
  /**
482
486
  * Starts clear memory thread.
483
487
  * @public
@@ -5,7 +5,6 @@ import * as utils from "../utils/shared";
5
5
  import { Atmosphere } from "../control/Atmosphere";
6
6
  import { createColorRGB } from "../utils/shared";
7
7
  import { createEvents } from "../Events";
8
- import { decodeFloatFromRGBAArr } from "../math/coder";
9
8
  import { EarthQuadTreeStrategy } from "../quadTree/earth/EarthQuadTreeStrategy";
10
9
  import { Extent } from "../Extent";
11
10
  import { Geoid } from "../terrain/Geoid";
@@ -19,16 +18,13 @@ import { PlanetCamera } from "../camera/PlanetCamera";
19
18
  import { RenderNode } from "./RenderNode";
20
19
  import { SimpleSkyBackground } from "../control/SimpleSkyBackground";
21
20
  import { TerrainWorker } from "../utils/TerrainWorker";
22
- import { Vec3, Vec4 } from "../math/index";
21
+ import { Vec2, Vec3 } from "../math/index";
23
22
  import { Vector } from "../layer/Vector";
24
23
  import { VectorTileCreator } from "../utils/VectorTileCreator";
25
24
  import { wgs84 } from "../ellipsoid/wgs84";
26
25
  const CUR_LOD_SIZE = 250; //px
27
26
  const MIN_LOD_SIZE = 312; //px
28
27
  const MAX_LOD_SIZE = 190; //px
29
- let _tempPickingPix_ = new Uint8Array(4);
30
- let _tempDepthColor_ = new Uint8Array(4);
31
- const DEPTH_DISTANCE = 11; //m
32
28
  /**
33
29
  * Maximum created nodes count. The more nodes count the more memory usage.
34
30
  * @const
@@ -58,7 +54,7 @@ const HORIZON_TANGENT = 0.81;
58
54
  export class Planet extends RenderNode {
59
55
  constructor(options = {}) {
60
56
  super(options.name);
61
- this._renderingFadingNodes = (nodes, sh, currentNode, sl, sliceIndex, outTransparentSegments) => {
57
+ this._renderingFadingNodes = (nodes, sh, currentNode, sl, sliceIndex, outTransparentSegments, outOpaqueSegments) => {
62
58
  let isFirstPass = sliceIndex === 0;
63
59
  let isEq = this.terrain.equalizeVertices;
64
60
  for (let j = 0, len = currentNode._fadingNodes.length; j < len; j++) {
@@ -73,6 +69,7 @@ export class Planet extends RenderNode {
73
69
  isEq && f.equalize();
74
70
  f.readyToEngage && f.engage();
75
71
  f.screenRendering(sh, sl, sliceIndex);
72
+ outOpaqueSegments.push(f);
76
73
  }
77
74
  else {
78
75
  f.screenRendering(sh, sl, sliceIndex, this.transparentTexture, true);
@@ -81,7 +78,7 @@ export class Planet extends RenderNode {
81
78
  }
82
79
  }
83
80
  };
84
- this._renderingFadingNodesNoDepth = (nodes, sh, currentNode, sl, sliceIndex) => {
81
+ this._renderingFadingNodesNoDepth = (nodes, sh, currentNode, sl, sliceIndex, outOpaqueSegments) => {
85
82
  let isFirstPass = sliceIndex === 0;
86
83
  let isEq = this.terrain.equalizeVertices;
87
84
  let gl = sh.gl;
@@ -94,6 +91,7 @@ export class Planet extends RenderNode {
94
91
  isEq && f.equalize();
95
92
  f.readyToEngage && f.engage();
96
93
  f.screenRendering(sh, sl, sliceIndex);
94
+ outOpaqueSegments.push(f);
97
95
  }
98
96
  else {
99
97
  f.screenRendering(sh, sl, sliceIndex, this.transparentTexture, true);
@@ -113,8 +111,9 @@ export class Planet extends RenderNode {
113
111
  this._updateLayer = false;
114
112
  this.visibleTileLayers = [];
115
113
  this.visibleVectorLayers = [];
114
+ this._visibleVectorLayersByDepthOrder = [];
116
115
  this._visibleTileLayerSlices = [];
117
- this._frustumEntityCollections = [];
116
+ this._visibleEntityCollections = [[]];
118
117
  this.baseLayer = null;
119
118
  this.terrain = null;
120
119
  this.camera = new PlanetCamera(this, {
@@ -142,6 +141,7 @@ export class Planet extends RenderNode {
142
141
  this._renderedNodesInFrustum = [];
143
142
  this._fadingNodes = new Map;
144
143
  this._fadingNodesInFrustum = [];
144
+ this._fadingOpaqueSegments = [];
145
145
  this.layerLock = new Lock();
146
146
  this.terrainLock = new Lock();
147
147
  this._heightFactor = 1.0;
@@ -191,7 +191,7 @@ export class Planet extends RenderNode {
191
191
  this._renderScreenNodesPASS = this._renderScreenNodesPASSNoAtmos;
192
192
  this._renderScreenNodesWithHeightPASS = this._renderScreenNodesWithHeightPASSNoAtmos;
193
193
  this._atmosphereEnabled = options.atmosphereEnabled || false;
194
- this._atmosphereMaxMinOpacity = new Float32Array([1.0, 0.41]);
194
+ this._atmosphereMaxMinOpacity = new Float32Array([0.95, 0.28]);
195
195
  this.solidTextureOne = null;
196
196
  this.solidTextureTwo = null;
197
197
  this._nightTextureSrc = options.nightTextureSrc || null;
@@ -208,6 +208,9 @@ export class Planet extends RenderNode {
208
208
  return this._maxGridSize;
209
209
  }
210
210
  getNorthFrameRotation(cartesian) {
211
+ return this.getFrameRotation(cartesian);
212
+ }
213
+ getFrameRotation(cartesian) {
211
214
  return this.ellipsoid.getNorthFrameRotation(cartesian);
212
215
  }
213
216
  set atmosphereMaxOpacity(opacity) {
@@ -261,8 +264,12 @@ export class Planet extends RenderNode {
261
264
  getLayers() {
262
265
  return this.layers;
263
266
  }
267
+ get sun() {
268
+ if (this.renderer && this.renderer.controls.sun)
269
+ return this.renderer.controls.sun;
270
+ }
264
271
  get sunPos() {
265
- return this.renderer.controls.sun.sunlight.getPosition();
272
+ return this.sun.sunlight.getPosition();
266
273
  }
267
274
  /**
268
275
  * Add the given control to the renderer of the planet scene.
@@ -485,7 +492,6 @@ export class Planet extends RenderNode {
485
492
  h.addProgram(shaders.drawnode_heightPicking(), true);
486
493
  this.renderer.addPickingCallback(this, this._renderColorPickingFramebufferPASS);
487
494
  this.renderer.addDepthCallback(this, this._renderDepthFramebufferPASS);
488
- this.renderer.addDistanceCallback(this, this._renderDistanceFramebufferPASS);
489
495
  }
490
496
  _onLayerLoadend(layer) {
491
497
  this.events.dispatch(this.events.layerloadend, layer);
@@ -552,7 +558,6 @@ export class Planet extends RenderNode {
552
558
  this._initializeShaders();
553
559
  this._initializeAtmosphere();
554
560
  this._updateVisibleLayers();
555
- this.renderer.addPickingCallback(this, this._frustumEntityCollectionPickingCallback);
556
561
  // loading Earth night glowing texture
557
562
  if (this._nightTextureSrc) {
558
563
  let img = new Image();
@@ -720,6 +725,18 @@ export class Planet extends RenderNode {
720
725
  */
721
726
  _sortLayers() {
722
727
  this.visibleVectorLayers.sort((a, b) => (a.getZIndex() - b.getZIndex()) || (a.getHeight() - b.getHeight()));
728
+ let grouped = { 0: [] };
729
+ for (const vi of this.visibleVectorLayers) {
730
+ if (!grouped[vi.depthOrder]) {
731
+ grouped[vi.depthOrder] = [];
732
+ }
733
+ grouped[vi.depthOrder].push(vi);
734
+ }
735
+ this._visibleVectorLayersByDepthOrder.length = 0;
736
+ this._visibleVectorLayersByDepthOrder = [];
737
+ this._visibleVectorLayersByDepthOrder = Object.keys(grouped)
738
+ .sort((a, b) => Number(a) - Number(b))
739
+ .map(key => grouped[Number(key)]);
723
740
  this._visibleTileLayerSlices = [];
724
741
  this._visibleTileLayerSlices.length = 0;
725
742
  if (this.visibleTileLayers.length) {
@@ -857,9 +874,6 @@ export class Planet extends RenderNode {
857
874
  }
858
875
  _globalPreDraw() {
859
876
  let cam = this.camera;
860
- // Might be it's better to replace it in setTerrain,
861
- // but we have to be sure that setTerrain exists with renderer insttance
862
- this.renderer.__useDistanceFramebuffer__ = !this.terrain.isEmpty;
863
877
  this._distBeforeMemClear += this._prevCamEye.distance(cam.eye);
864
878
  this._prevCamEye.copy(cam.eye);
865
879
  cam.checkFly();
@@ -887,7 +901,7 @@ export class Planet extends RenderNode {
887
901
  this._collectRenderNodes(this.camera);
888
902
  }
889
903
  this._skipPreRender = true;
890
- this.transformLights();
904
+ //this.transformLights();
891
905
  // creates terrain normal maps
892
906
  this._normalMapCreator.frame();
893
907
  // Creating geoImages textures.
@@ -902,7 +916,9 @@ export class Planet extends RenderNode {
902
916
  // Collect entity collections from vector layers
903
917
  this._collectVectorLayerCollections();
904
918
  }
905
- this.drawEntityCollections(this._frustumEntityCollections);
919
+ for (let i = 0; i < this._visibleEntityCollections.length; i++) {
920
+ this.drawEntityCollections(this._visibleEntityCollections[i], i);
921
+ }
906
922
  }
907
923
  /**
908
924
  * Render node callback.
@@ -954,7 +970,7 @@ export class Planet extends RenderNode {
954
970
  h.programs.drawnode_screen_wl.activate();
955
971
  sh = h.programs.drawnode_screen_wl._program;
956
972
  shu = sh.uniforms;
957
- gl.uniform3fv(shu.lightsPositions, this._lightsPositions);
973
+ gl.uniform3fv(shu.lightPosition, this._lightPosition);
958
974
  gl.uniformMatrix4fv(shu.viewMatrix, false, cam.getViewMatrix());
959
975
  gl.uniformMatrix4fv(shu.projectionMatrix, false, cam.getProjectionMatrix());
960
976
  if (this.baseLayer) {
@@ -1002,7 +1018,7 @@ export class Planet extends RenderNode {
1002
1018
  h.programs.drawnode_screen_wl.activate();
1003
1019
  sh = h.programs.drawnode_screen_wl._program;
1004
1020
  shu = sh.uniforms;
1005
- gl.uniform3fv(shu.lightsPositions, this._lightsPositions);
1021
+ gl.uniform3fv(shu.lightPosition, this._lightPosition);
1006
1022
  gl.uniformMatrix4fv(shu.viewMatrix, false, cam.getViewMatrix());
1007
1023
  gl.uniformMatrix4fv(shu.projectionMatrix, false, cam.getProjectionMatrix());
1008
1024
  if (this.baseLayer) {
@@ -1068,21 +1084,30 @@ export class Planet extends RenderNode {
1068
1084
  let transparentSegments = [];
1069
1085
  let isEq = this.terrain.equalizeVertices;
1070
1086
  let i = renderedNodes.length;
1087
+ //
1088
+ // Collect fading opaque segments, because we need them in the framebuffer passes,
1089
+ // as the segments with equalized sides, which means that there are no gaps
1090
+ // between currently rendered neighbours
1091
+ //
1092
+ this._fadingOpaqueSegments = [];
1071
1093
  if (cam.slope > 0.8 || !this.terrain || this.terrain.isEmpty /*|| cam.getAltitude() > 10000*/) {
1072
1094
  while (i--) {
1073
1095
  let ri = renderedNodes[i];
1074
1096
  let s = ri.segment;
1075
- this._renderingFadingNodesNoDepth(nodes, sh, ri, sl[0], 0);
1097
+ this._renderingFadingNodesNoDepth(nodes, sh, ri, sl[0], 0, this._fadingOpaqueSegments);
1076
1098
  isEq && s.equalize();
1077
1099
  s.readyToEngage && s.engage();
1078
1100
  s.screenRendering(sh, sl[0], 0);
1079
1101
  }
1080
1102
  }
1081
1103
  else {
1104
+ //
1105
+ // Render opaque segments on the first pass, remove transparent ones into second pass
1106
+ //
1082
1107
  while (i--) {
1083
1108
  let ri = renderedNodes[i];
1084
1109
  let s = ri.segment;
1085
- this._renderingFadingNodes(nodes, sh, ri, sl[0], 0, transparentSegments);
1110
+ this._renderingFadingNodes(nodes, sh, ri, sl[0], 0, transparentSegments, this._fadingOpaqueSegments);
1086
1111
  if (s._transitionOpacity < 1) {
1087
1112
  transparentSegments.push(s);
1088
1113
  }
@@ -1092,6 +1117,9 @@ export class Planet extends RenderNode {
1092
1117
  s.screenRendering(sh, sl[0], 0);
1093
1118
  }
1094
1119
  }
1120
+ //
1121
+ // Render transparent segments
1122
+ //
1095
1123
  for (let j = 0; j < transparentSegments.length; j++) {
1096
1124
  let tj = transparentSegments[j];
1097
1125
  isEq && tj.equalize();
@@ -1132,29 +1160,6 @@ export class Planet extends RenderNode {
1132
1160
  gl.disable(gl.POLYGON_OFFSET_FILL);
1133
1161
  gl.enable(gl.CULL_FACE);
1134
1162
  }
1135
- _renderDistanceFramebufferPASS() {
1136
- if (!this.terrain.isEmpty) {
1137
- let sh;
1138
- let renderer = this.renderer;
1139
- let h = renderer.handler;
1140
- let gl = h.gl;
1141
- let cam = renderer.activeCamera;
1142
- h.programs.drawnode_heightPicking.activate();
1143
- sh = h.programs.drawnode_heightPicking._program;
1144
- let shu = sh.uniforms;
1145
- gl.uniformMatrix4fv(shu.viewMatrix, false, cam.getViewMatrix());
1146
- gl.uniformMatrix4fv(shu.projectionMatrix, false, cam.getProjectionMatrix());
1147
- gl.uniform3fv(shu.eyePositionHigh, cam.eyeHigh);
1148
- gl.uniform3fv(shu.eyePositionLow, cam.eyeLow);
1149
- // drawing planet nodes
1150
- let rn = this._renderedNodesInFrustum[cam.currentFrustumIndex];
1151
- let sl = this._visibleTileLayerSlices;
1152
- let i = rn.length;
1153
- while (i--) {
1154
- rn[i].segment.heightPickingRendering(sh, sl[0]);
1155
- }
1156
- }
1157
- }
1158
1163
  _renderColorPickingFramebufferPASS() {
1159
1164
  let sh;
1160
1165
  let renderer = this.renderer;
@@ -1174,7 +1179,12 @@ export class Planet extends RenderNode {
1174
1179
  let sl = this._visibleTileLayerSlices;
1175
1180
  let i = rn.length;
1176
1181
  while (i--) {
1177
- rn[i].segment.colorPickingRendering(sh, sl[0], 0);
1182
+ if (rn[i].segment._transitionOpacity >= 1) {
1183
+ rn[i].segment.colorPickingRendering(sh, sl[0], 0);
1184
+ }
1185
+ }
1186
+ for (let i = 0; i < this._fadingOpaqueSegments.length; ++i) {
1187
+ this._fadingOpaqueSegments[i].colorPickingRendering(sh, sl[0], 0);
1178
1188
  }
1179
1189
  // Here is set blending for transparent overlays
1180
1190
  renderer.enableBlendDefault();
@@ -1203,31 +1213,43 @@ export class Planet extends RenderNode {
1203
1213
  gl.uniformMatrix4fv(shu.projectionMatrix, false, cam.getProjectionMatrix());
1204
1214
  gl.uniform3fv(shu.eyePositionHigh, cam.eyeHigh);
1205
1215
  gl.uniform3fv(shu.eyePositionLow, cam.eyeLow);
1206
- gl.uniform3fv(shu.frustumPickingColor, cam.frustum._pickingColorU);
1216
+ gl.uniform1f(shu.frustumPickingColor, cam.frustumColorIndex);
1207
1217
  // drawing planet nodes
1208
1218
  let rn = this._renderedNodesInFrustum[cam.getCurrentFrustum()], sl = this._visibleTileLayerSlices;
1209
1219
  let i = rn.length;
1210
1220
  while (i--) {
1211
- rn[i].segment.depthRendering(sh, sl[0]);
1221
+ if (rn[i].segment._transitionOpacity >= 1) {
1222
+ rn[i].segment.depthRendering(sh, sl[0]);
1223
+ }
1224
+ }
1225
+ for (let i = 0; i < this._fadingOpaqueSegments.length; ++i) {
1226
+ this._fadingOpaqueSegments[i].depthRendering(sh, sl[0]);
1212
1227
  }
1213
1228
  gl.enable(gl.BLEND);
1214
1229
  }
1215
1230
  _collectVectorLayerCollections() {
1216
- this._frustumEntityCollections.length = 0;
1217
- this._frustumEntityCollections = [];
1218
- let i = this.visibleVectorLayers.length;
1219
- while (i--) {
1220
- let vi = this.visibleVectorLayers[i];
1221
- if (vi._fading && vi._refreshFadingOpacity()) {
1222
- this.visibleVectorLayers.splice(i, 1);
1231
+ let k = this._visibleVectorLayersByDepthOrder.length;
1232
+ this._visibleEntityCollections.length = 0;
1233
+ this._visibleEntityCollections = new Array(k);
1234
+ for (let i = 0; i < this._visibleEntityCollections.length; i++) {
1235
+ this._visibleEntityCollections[i] = [];
1236
+ }
1237
+ while (k--) {
1238
+ let group = this._visibleVectorLayersByDepthOrder[k];
1239
+ let j = group.length;
1240
+ while (j--) {
1241
+ let vi = group[j];
1242
+ if (vi._fading && vi._refreshFadingOpacity()) {
1243
+ group.splice(j, 1);
1244
+ if (group.length === 0) {
1245
+ this._visibleVectorLayersByDepthOrder.splice(k, 1);
1246
+ }
1247
+ }
1248
+ vi.collectVisibleCollections(this._visibleEntityCollections[k]);
1249
+ vi.update();
1223
1250
  }
1224
- vi.collectVisibleCollections(this._frustumEntityCollections);
1225
- vi.update();
1226
1251
  }
1227
1252
  }
1228
- _frustumEntityCollectionPickingCallback() {
1229
- this.drawPickingEntityCollections(this._frustumEntityCollections);
1230
- }
1231
1253
  /**
1232
1254
  * Starts clear memory thread.
1233
1255
  * @public
@@ -1358,34 +1380,11 @@ export class Planet extends RenderNode {
1358
1380
  * @returns {number | undefined} -
1359
1381
  */
1360
1382
  getDistanceFromPixel(px) {
1361
- if (this.terrain.isEmpty) {
1362
- return this.getDistanceFromPixelEllipsoid(px) || 0;
1363
- }
1364
- else {
1365
- let r = this.renderer;
1366
- let cnv = r.handler.canvas;
1367
- let spx = px.x / cnv.width;
1368
- let spy = (cnv.height - px.y) / cnv.height;
1369
- _tempPickingPix_[0] = _tempPickingPix_[1] = _tempPickingPix_[2] = 0.0;
1370
- let dist = 0;
1371
- r.readDistanceColor(spx, spy, _tempPickingPix_);
1372
- dist = decodeFloatFromRGBAArr(_tempPickingPix_);
1373
- if (!(_tempPickingPix_[0] || _tempPickingPix_[1] || _tempPickingPix_[2])) {
1374
- dist = this.getDistanceFromPixelEllipsoid(px) || 0;
1375
- }
1376
- else if (dist < DEPTH_DISTANCE) {
1377
- r.screenDepthFramebuffer.activate();
1378
- //if (r.screenDepthFramebuffer.isComplete()) {
1379
- r.screenDepthFramebuffer.readPixels(_tempDepthColor_, spx, spy);
1380
- let screenPos = new Vec4(spx * 2.0 - 1.0, spy * 2.0 - 1.0, (_tempDepthColor_[0] / 255.0) * 2.0 - 1.0, 1.0 * 2.0 - 1.0);
1381
- let viewPosition = this.camera.frustums[0].inverseProjectionMatrix.mulVec4(screenPos);
1382
- let dir = px.direction || r.activeCamera.unproject(px.x, px.y);
1383
- dist = -(viewPosition.z / viewPosition.w) / dir.dot(r.activeCamera.getForward());
1384
- //}
1385
- r.screenDepthFramebuffer.deactivate();
1386
- }
1387
- return dist;
1388
- }
1383
+ // if (this.terrain!.isEmpty) {
1384
+ // return this.getDistanceFromPixelEllipsoid(px) || 0;
1385
+ // } else {
1386
+ return this.renderer.getDistanceFromPixel(px) || this.getDistanceFromPixelEllipsoid(px) || 0;
1387
+ //}
1389
1388
  }
1390
1389
  /**
1391
1390
  * Sets camera to the planet geographical extent.
@@ -1415,6 +1414,29 @@ export class Planet extends RenderNode {
1415
1414
  * @returns {Extent} -
1416
1415
  */
1417
1416
  getViewExtent() {
1417
+ if (this.renderer) {
1418
+ let w = this.renderer.handler.getWidth(), h = this.renderer.handler.getHeight();
1419
+ let extent = [
1420
+ this.getLonLatFromPixelTerrain(new Vec2(0, 0)),
1421
+ this.getLonLatFromPixelTerrain(new Vec2(w, 0)),
1422
+ this.getLonLatFromPixelTerrain(new Vec2(w, h)),
1423
+ this.getLonLatFromPixelTerrain(new Vec2(0, h))
1424
+ ];
1425
+ if (extent[0] && extent[1] && extent[2] && extent[3]) {
1426
+ let min_lon = extent[0].lon, min_lat = extent[2].lat, max_lon = extent[1].lon, max_lat = extent[0].lat;
1427
+ for (let i = 0; i < extent.length; i++) {
1428
+ if (extent[i].lon > max_lon)
1429
+ max_lon = extent[i].lon;
1430
+ if (extent[i].lat > max_lat)
1431
+ max_lat = extent[i].lat;
1432
+ if (extent[i].lon < min_lon)
1433
+ min_lon = extent[i].lon;
1434
+ if (extent[i].lat < min_lat)
1435
+ min_lat = extent[i].lat;
1436
+ }
1437
+ return new Extent(new LonLat(min_lon, min_lat), new LonLat(max_lon, max_lat));
1438
+ }
1439
+ }
1418
1440
  return this._viewExtent;
1419
1441
  }
1420
1442
  /**
@@ -2,6 +2,8 @@ import { BaseNode } from "./BaseNode";
2
2
  import { Renderer } from "../renderer/Renderer";
3
3
  import { LightSource } from "../light/LightSource";
4
4
  import { EntityCollection } from "../entity/EntityCollection";
5
+ import { Quat } from "../math/Quat";
6
+ import { Vec3 } from "../math/Vec3";
5
7
  /**
6
8
  * Render node is a logical part of a render mechanism. Represents scene rendering.
7
9
  * For example one scene node for rendering the Earth, another one for rendering the Moon, another node for rendering stars etc.
@@ -37,19 +39,19 @@ declare class RenderNode extends BaseNode {
37
39
  * @public
38
40
  * @type {Array.<LightSource>}
39
41
  */
40
- _lights: LightSource[];
41
- _lightsNames: string[];
42
- _lightsPositions: number[];
43
- _lightsParamsv: number[];
44
- _lightsParamsf: number[];
42
+ _lightPosition: Float32Array;
43
+ _lightParams: Float32Array;
44
+ _lightShininess: number;
45
45
  /**
46
46
  * Entity collection array.
47
47
  * @public
48
48
  * @type {Array.<EntityCollection>}
49
49
  */
50
50
  entityCollections: EntityCollection[];
51
+ protected _entityCollectionsByDepthOrder: EntityCollection[][];
51
52
  protected _pickingId: number;
52
53
  constructor(name?: string);
54
+ getFrameRotation(cartesian: Vec3): Quat;
53
55
  /**
54
56
  * Adds node to the current hierarchy.
55
57
  * @public
@@ -73,13 +75,14 @@ declare class RenderNode extends BaseNode {
73
75
  * @param {boolean} [isHidden] - If it's true that this collection has specific rendering.
74
76
  * @returns {RenderNode} -
75
77
  */
76
- addEntityCollection(entityCollection: EntityCollection, isHidden?: boolean): RenderNode;
78
+ addEntityCollection(entityCollection: EntityCollection, isHidden?: boolean): void;
77
79
  /**
78
80
  * Removes entity collection.
79
81
  * @public
80
82
  * @param {EntityCollection} entityCollection - Entity collection for remove.
81
83
  */
82
84
  removeEntityCollection(entityCollection: EntityCollection): void;
85
+ updateEntityCollectionsDepthOrder(): void;
83
86
  /**
84
87
  * Adds point light source.
85
88
  * @public
@@ -87,19 +90,6 @@ declare class RenderNode extends BaseNode {
87
90
  * @returns {RenderNode}
88
91
  */
89
92
  addLight(light: LightSource): RenderNode;
90
- /**
91
- * Gets light object by its name.
92
- * @public
93
- * @param {string} name - Point light name.
94
- * @returns {LightSource}
95
- */
96
- getLightByName(name: string): LightSource | undefined;
97
- /**
98
- * Removes light source.
99
- * @public
100
- * @param {LightSource} light - Light source object.
101
- */
102
- removeLight(light: LightSource): void;
103
93
  /**
104
94
  * Calls render frame node's callback. Used in renderer.
105
95
  * @public
@@ -128,17 +118,12 @@ declare class RenderNode extends BaseNode {
128
118
  * @param {Number} mode - Draw mode, such as gl.TRIANGLES, gl.TRIANGLE_STRIP, gl.LINES etc.
129
119
  */
130
120
  setDrawMode(mode: number): void;
131
- /**
132
- * IMPORTANT: This function have to be called manually in each render node frame callback, before drawing scene geometry.
133
- * @public
134
- */
135
- transformLights(): void;
136
121
  updateBillboardsTexCoords(): void;
137
122
  frame(): void;
138
123
  preFrame(): void;
139
124
  protected _preDrawNodes(): void;
140
125
  protected _drawNodes(): void;
141
- drawEntityCollections(ec: EntityCollection[]): void;
126
+ drawEntityCollections(ec: EntityCollection[], depthOrder?: number): void;
142
127
  /**
143
128
  * Draw entity collections picking frame.
144
129
  * @public