@openglobus/og 0.11.6 → 0.12.1

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 (213) hide show
  1. package/css/og.css +5 -2
  2. package/package.json +12 -12
  3. package/src/og/Globe.js +25 -10
  4. package/src/og/Popup.js +3 -2
  5. package/src/og/camera/Camera.js +70 -79
  6. package/src/og/camera/PlanetCamera.js +33 -33
  7. package/src/og/control/DebugInfo.js +2 -2
  8. package/src/og/control/EarthNavigation.js +26 -17
  9. package/src/og/control/Lighting.js +74 -64
  10. package/src/og/control/MouseNavigation.js +30 -29
  11. package/src/og/control/MouseWheelZoomControl.js +257 -0
  12. package/src/og/control/Sun.js +3 -3
  13. package/src/og/control/index.js +2 -0
  14. package/src/og/control/visibleExtent/Segment.js +1862 -0
  15. package/src/og/control/visibleExtent/VisibleExtent.js +80 -0
  16. package/src/og/control/visibleExtent/drawnode.js +751 -0
  17. package/src/og/ellipsoid/Ellipsoid.js +1 -1
  18. package/src/og/entity/BaseBillboard.js +67 -76
  19. package/src/og/entity/BillboardHandler.js +15 -8
  20. package/src/og/entity/Entity.js +742 -742
  21. package/src/og/entity/GeoObjectHandler.js +102 -117
  22. package/src/og/entity/Label.js +45 -48
  23. package/src/og/entity/LabelHandler.js +24 -23
  24. package/src/og/entity/LabelWorker.js +21 -16
  25. package/src/og/layer/CanvasTiles.js +8 -12
  26. package/src/og/layer/GeoImage.js +2 -10
  27. package/src/og/layer/GeoTexture2d.js +2 -10
  28. package/src/og/layer/GeoVideo.js +2 -10
  29. package/src/og/layer/Layer.js +23 -32
  30. package/src/og/layer/Material.js +1 -1
  31. package/src/og/layer/WMS.js +0 -2
  32. package/src/og/layer/XYZ.js +31 -33
  33. package/src/og/math/Vec3.js +18 -2
  34. package/src/og/quadTree/Node.js +52 -111
  35. package/src/og/quadTree/quadTree.js +1 -1
  36. package/src/og/renderer/Renderer.js +85 -122
  37. package/src/og/renderer/RendererEvents.js +44 -22
  38. package/src/og/scene/Planet.js +179 -198
  39. package/src/og/segment/Segment.js +99 -268
  40. package/src/og/segment/Slice.js +45 -0
  41. package/src/og/shaders/drawnode.js +174 -360
  42. package/src/og/shaders/toneMapping.js +1 -0
  43. package/src/og/shapes/BaseShape.js +1 -1
  44. package/src/og/terrain/EmptyTerrain.js +3 -2
  45. package/src/og/terrain/GlobusTerrain.js +2 -0
  46. package/src/og/utils/FontAtlas.js +6 -2
  47. package/src/og/utils/GeoImageCreator.js +5 -1
  48. package/src/og/utils/Loader.js +1 -1
  49. package/src/og/utils/PlainSegmentWorker.js +0 -13
  50. package/src/og/utils/TextureAtlas.js +2 -2
  51. package/src/og/utils/VectorTileCreator.js +1 -3
  52. package/src/og/utils/shared.js +1 -1
  53. package/src/og/webgl/Handler.js +156 -118
  54. package/types/Clock.d.ts +0 -94
  55. package/types/Deferred.d.ts +0 -6
  56. package/types/Events.d.ts +0 -77
  57. package/types/Extent.d.ts +0 -166
  58. package/types/Globe.d.ts +0 -82
  59. package/types/ImageCanvas.d.ts +0 -123
  60. package/types/Lock.d.ts +0 -12
  61. package/types/LonLat.d.ts +0 -108
  62. package/types/Popup.d.ts +0 -42
  63. package/types/QueueArray.d.ts +0 -19
  64. package/types/Rectangle.d.ts +0 -80
  65. package/types/Stack.d.ts +0 -19
  66. package/types/ajax.d.ts +0 -24
  67. package/types/arial.d.ts +0 -48
  68. package/types/astro/astro.d.ts +0 -38
  69. package/types/astro/earth.d.ts +0 -7
  70. package/types/astro/jd.d.ts +0 -254
  71. package/types/bv/Box.d.ts +0 -30
  72. package/types/bv/Sphere.d.ts +0 -38
  73. package/types/bv/index.d.ts +0 -3
  74. package/types/camera/Camera.d.ts +0 -312
  75. package/types/camera/Frustum.d.ts +0 -133
  76. package/types/camera/PlanetCamera.d.ts +0 -218
  77. package/types/camera/index.d.ts +0 -3
  78. package/types/cons.d.ts +0 -40
  79. package/types/control/CompassButton.d.ts +0 -17
  80. package/types/control/Control.d.ts +0 -104
  81. package/types/control/DebugInfo.d.ts +0 -15
  82. package/types/control/EarthCoordinates.d.ts +0 -47
  83. package/types/control/EarthNavigation.d.ts +0 -42
  84. package/types/control/GeoImageDragControl.d.ts +0 -6
  85. package/types/control/KeyboardNavigation.d.ts +0 -21
  86. package/types/control/LayerSwitcher.d.ts +0 -21
  87. package/types/control/Lighting.d.ts +0 -16
  88. package/types/control/MouseNavigation.d.ts +0 -47
  89. package/types/control/ScaleControl.d.ts +0 -22
  90. package/types/control/ShowFps.d.ts +0 -11
  91. package/types/control/SimpleNavigation.d.ts +0 -25
  92. package/types/control/Sun.d.ts +0 -50
  93. package/types/control/ToggleWireframe.d.ts +0 -12
  94. package/types/control/TouchNavigation.d.ts +0 -48
  95. package/types/control/ZoomControl.d.ts +0 -27
  96. package/types/control/index.d.ts +0 -17
  97. package/types/ellipsoid/Ellipsoid.d.ts +0 -146
  98. package/types/ellipsoid/index.d.ts +0 -3
  99. package/types/ellipsoid/wgs84.d.ts +0 -6
  100. package/types/entity/BaseBillboard.d.ts +0 -215
  101. package/types/entity/Billboard.d.ts +0 -94
  102. package/types/entity/BillboardHandler.d.ts +0 -78
  103. package/types/entity/Entity.d.ts +0 -348
  104. package/types/entity/EntityCollection.d.ts +0 -317
  105. package/types/entity/GeoObject.d.ts +0 -111
  106. package/types/entity/GeoObjectHandler.d.ts +0 -77
  107. package/types/entity/Geometry.d.ts +0 -74
  108. package/types/entity/GeometryHandler.d.ts +0 -76
  109. package/types/entity/Label.d.ts +0 -189
  110. package/types/entity/LabelHandler.d.ts +0 -31
  111. package/types/entity/LabelWorker.d.ts +0 -9
  112. package/types/entity/PointCloud.d.ts +0 -174
  113. package/types/entity/PointCloudHandler.d.ts +0 -38
  114. package/types/entity/Polyline.d.ts +0 -306
  115. package/types/entity/PolylineHandler.d.ts +0 -18
  116. package/types/entity/Ray.d.ts +0 -124
  117. package/types/entity/RayHandler.d.ts +0 -67
  118. package/types/entity/ShapeHandler.d.ts +0 -22
  119. package/types/entity/Strip.d.ts +0 -119
  120. package/types/entity/StripHandler.d.ts +0 -38
  121. package/types/entity/index.d.ts +0 -8
  122. package/types/index.core.d.ts +0 -65
  123. package/types/index.d.ts +0 -45
  124. package/types/index.webgl.d.ts +0 -7
  125. package/types/input/KeyboardHandler.d.ts +0 -10
  126. package/types/input/MouseHandler.d.ts +0 -5
  127. package/types/input/TouchHandler.d.ts +0 -5
  128. package/types/input/input.d.ts +0 -34
  129. package/types/layer/BaseGeoImage.d.ts +0 -94
  130. package/types/layer/CanvasTiles.d.ts +0 -68
  131. package/types/layer/GeoImage.d.ts +0 -52
  132. package/types/layer/GeoTexture2d.d.ts +0 -8
  133. package/types/layer/GeoVideo.d.ts +0 -55
  134. package/types/layer/KML.d.ts +0 -63
  135. package/types/layer/Layer.d.ts +0 -326
  136. package/types/layer/Material.d.ts +0 -45
  137. package/types/layer/Vector.d.ts +0 -208
  138. package/types/layer/WMS.d.ts +0 -63
  139. package/types/layer/XYZ.d.ts +0 -120
  140. package/types/layer/index.d.ts +0 -10
  141. package/types/light/LightSource.d.ts +0 -178
  142. package/types/math/Line2.d.ts +0 -11
  143. package/types/math/Line3.d.ts +0 -10
  144. package/types/math/Mat3.d.ts +0 -65
  145. package/types/math/Mat4.d.ts +0 -176
  146. package/types/math/Plane.d.ts +0 -18
  147. package/types/math/Quat.d.ts +0 -379
  148. package/types/math/Ray.d.ts +0 -82
  149. package/types/math/Vec2.d.ts +0 -309
  150. package/types/math/Vec3.d.ts +0 -460
  151. package/types/math/Vec4.d.ts +0 -162
  152. package/types/math/coder.d.ts +0 -43
  153. package/types/math/index.d.ts +0 -11
  154. package/types/math.d.ts +0 -261
  155. package/types/mercator.d.ts +0 -92
  156. package/types/proj/EPSG3857.d.ts +0 -6
  157. package/types/proj/EPSG4326.d.ts +0 -6
  158. package/types/proj/Proj.d.ts +0 -42
  159. package/types/quadTree/EntityCollectionNode.d.ts +0 -34
  160. package/types/quadTree/Node.d.ts +0 -61
  161. package/types/quadTree/quadTree.d.ts +0 -40
  162. package/types/renderer/Renderer.d.ts +0 -300
  163. package/types/renderer/RendererEvents.d.ts +0 -233
  164. package/types/res/images.d.ts +0 -3
  165. package/types/scene/Axes.d.ts +0 -11
  166. package/types/scene/BaseNode.d.ts +0 -60
  167. package/types/scene/Planet.d.ts +0 -577
  168. package/types/scene/RenderNode.d.ts +0 -142
  169. package/types/scene/SkyBox.d.ts +0 -10
  170. package/types/scene/index.d.ts +0 -4
  171. package/types/segment/Segment.d.ts +0 -279
  172. package/types/segment/SegmentLonLat.d.ts +0 -16
  173. package/types/segment/segmentHelper.d.ts +0 -13
  174. package/types/shaders/billboard.d.ts +0 -3
  175. package/types/shaders/depth.d.ts +0 -2
  176. package/types/shaders/drawnode.d.ts +0 -7
  177. package/types/shaders/geoObject.d.ts +0 -3
  178. package/types/shaders/label.d.ts +0 -4
  179. package/types/shaders/pointCloud.d.ts +0 -2
  180. package/types/shaders/polyline.d.ts +0 -3
  181. package/types/shaders/ray.d.ts +0 -2
  182. package/types/shaders/screenFrame.d.ts +0 -2
  183. package/types/shaders/shape.d.ts +0 -4
  184. package/types/shaders/skybox.d.ts +0 -2
  185. package/types/shaders/toneMapping.d.ts +0 -2
  186. package/types/shapes/BaseShape.d.ts +0 -250
  187. package/types/shapes/Sphere.d.ts +0 -41
  188. package/types/terrain/BilTerrain.d.ts +0 -7
  189. package/types/terrain/EmptyTerrain.d.ts +0 -72
  190. package/types/terrain/Geoid.d.ts +0 -26
  191. package/types/terrain/GlobusTerrain.d.ts +0 -116
  192. package/types/terrain/MapboxTerrain.d.ts +0 -7
  193. package/types/terrain/index.d.ts +0 -5
  194. package/types/utils/FontAtlas.d.ts +0 -14
  195. package/types/utils/GeoImageCreator.d.ts +0 -30
  196. package/types/utils/ImagesCacheManager.d.ts +0 -10
  197. package/types/utils/Loader.d.ts +0 -25
  198. package/types/utils/NormalMapCreator.d.ts +0 -39
  199. package/types/utils/PlainSegmentWorker.d.ts +0 -10
  200. package/types/utils/TerrainWorker.d.ts +0 -9
  201. package/types/utils/TextureAtlas.d.ts +0 -111
  202. package/types/utils/VectorTileCreator.d.ts +0 -16
  203. package/types/utils/colorTable.d.ts +0 -143
  204. package/types/utils/earcut.d.ts +0 -6
  205. package/types/utils/shared.d.ts +0 -231
  206. package/types/webgl/Framebuffer.d.ts +0 -135
  207. package/types/webgl/Handler.d.ts +0 -397
  208. package/types/webgl/Multisample.d.ts +0 -89
  209. package/types/webgl/Program.d.ts +0 -161
  210. package/types/webgl/ProgramController.d.ts +0 -89
  211. package/types/webgl/callbacks.d.ts +0 -1
  212. package/types/webgl/index.d.ts +0 -6
  213. package/types/webgl/types.d.ts +0 -2
@@ -4,6 +4,7 @@
4
4
 
5
5
  "use strict";
6
6
 
7
+ import * as utils from "../utils/shared.js";
7
8
  import * as shaders from "../shaders/drawnode.js";
8
9
  import * as math from "../math.js";
9
10
  import * as mercator from "../mercator.js";
@@ -31,14 +32,16 @@ import { wgs84 } from "../ellipsoid/wgs84.js";
31
32
  import { NIGHT, SPECULAR } from "../res/images.js";
32
33
  import { Geoid } from "../terrain/Geoid.js";
33
34
  import { isUndef } from "../utils/shared.js";
35
+ import { MAX_RENDERED_NODES } from "../quadTree/quadTree.js";
34
36
 
35
- const MAX_LOD = 0.9;
36
- const MIN_LOD = 0.75;
37
+ const CUR_LOD_SIZE = 250; //px
38
+ const MIN_LOD_SIZE = 312; //px
39
+ const MAX_LOD_SIZE = 190; //px
37
40
 
38
41
  let _tempPickingPix_ = new Uint8Array(4),
39
42
  _tempDepthColor_ = new Uint8Array(4);
40
43
 
41
- const DEPTH_DISTANCE = 11;
44
+ const DEPTH_DISTANCE = 11;//m
42
45
 
43
46
  /**
44
47
  * Maximum created nodes count. The more nodes count the more memory usage.
@@ -48,6 +51,8 @@ const DEPTH_DISTANCE = 11;
48
51
  */
49
52
  const MAX_NODES = 200;
50
53
 
54
+ const HORIZON_TANGENT = 0.81;
55
+
51
56
  const EVENT_NAMES = [
52
57
  /**
53
58
  * Triggered before globe frame begins to render.
@@ -93,7 +98,7 @@ const EVENT_NAMES = [
93
98
  * @param {string} [options.name="Earth"] - Planet name(Earth by default)
94
99
  * @param {Ellipsoid} [options.ellipsoid] - Planet ellipsoid(WGS84 by default)
95
100
  * @param {Number} [options.maxGridSize=128] - Segment maximal grid size
96
- * @param {Number} [options.maxEqualZoomAltitude=850000.0] - Maximal altitude since segments on the screen bacame the same zoom level
101
+ * @param {Number} [options.maxEqualZoomAltitude=15000000.0] - Maximal altitude since segments on the screen bacame the same zoom level
97
102
  * @param {Number} [options.minEqualZoomAltitude=10000.0] - Minimal altitude since segments on the screen bacame the same zoom level
98
103
  * @param {Number} [options.minEqualZoomCameraSlope=0.8] - Minimal camera slope above te globe where segments on the screen bacame the same zoom level
99
104
  * @fires og.scene.Planet#draw
@@ -107,6 +112,13 @@ export class Planet extends RenderNode {
107
112
  constructor(options = {}) {
108
113
  super(options.name);
109
114
 
115
+ this._cameraFrustums = options.frustums || [
116
+ [1, 100 + 0.075],
117
+ [100, 1000 + 0.075],
118
+ [1000, 1e6 + 10000],
119
+ [1e6, 1e9]
120
+ ];
121
+
110
122
  /**
111
123
  * @public
112
124
  * @type {Ellipsoid}
@@ -180,7 +192,7 @@ export class Planet extends RenderNode {
180
192
  this._minAltitude = options.minAltitude;
181
193
  this._maxAltitude = options.maxAltitude;
182
194
 
183
- this.maxEqualZoomAltitude = options.maxEqualZoomAltitude || 850000.0;
195
+ this.maxEqualZoomAltitude = options.maxEqualZoomAltitude || 15000000.0;
184
196
  this.minEqualZoomAltitude = options.minEqualZoomAltitude || 10000.0;
185
197
  this.minEqualZoomCameraSlope = options.minEqualZoomCameraSlope || 0.8;
186
198
 
@@ -335,6 +347,16 @@ export class Planet extends RenderNode {
335
347
  */
336
348
  this._specularTexture = null;
337
349
 
350
+ //TODO: replace to a function
351
+ let a = utils.createColorRGB(options.ambient, new Vec3(0.2, 0.2, 0.2));
352
+ let d = utils.createColorRGB(options.diffuse, new Vec3(0.8, 0.8, 0.8));
353
+ let s = utils.createColorRGB(options.specular, new Vec3(0.0003, 0.0003, 0.0003));
354
+ let shininess = options.shininess || 20.0;
355
+
356
+ this._ambient = new Float32Array([a.x, a.y, a.z]);
357
+ this._diffuse = new Float32Array([d.x, d.y, d.z]);
358
+ this._specular = new Float32Array([s.x, s.y, s.z, shininess]);
359
+
338
360
  /**
339
361
  * True for rendering night glowing texture.
340
362
  * @protected
@@ -367,18 +389,12 @@ export class Planet extends RenderNode {
367
389
  * @public
368
390
  * @type {number}
369
391
  */
370
- this._lodRatio = MAX_LOD;
371
- this._maxLodRatio = MAX_LOD;
372
- this._minLodRatio = MIN_LOD;
373
-
374
- this._diffuseMaterialArr = new Float32Array(this.SLICE_SIZE_3 + 3);
375
- this._ambientMaterialArr = new Float32Array(this.SLICE_SIZE_3 + 3);
376
- this._specularMaterialArr = new Float32Array(this.SLICE_SIZE_4 + 4);
377
-
378
- this._tileOffsetArr = new Float32Array(this.SLICE_SIZE_4);
379
- this._visibleExtentOffsetArr = new Float32Array(this.SLICE_SIZE_4);
380
- this._transparentColorArr = new Float32Array(this.SLICE_SIZE_4);
381
- this._pickingColorArr = new Float32Array(this.SLICE_SIZE_3);
392
+ this._lodSize = CUR_LOD_SIZE;
393
+ this._curLodSize = CUR_LOD_SIZE;
394
+ this._minLodSize = MIN_LOD_SIZE;
395
+ this._maxLodSize = MAX_LOD_SIZE;
396
+
397
+ this._pickingColorArr = new Float32Array(this.SLICE_SIZE_4);
382
398
  this._samplerArr = new Int32Array(this.SLICE_SIZE);
383
399
  this._pickingMaskArr = new Int32Array(this.SLICE_SIZE);
384
400
 
@@ -393,11 +409,11 @@ export class Planet extends RenderNode {
393
409
 
394
410
  this._normalMapCreator = null;
395
411
 
396
- this._terrainWorker = new TerrainWorker(2);
412
+ this._terrainWorker = new TerrainWorker(3);
397
413
 
398
- this._plainSegmentWorker = new PlainSegmentWorker(2);
414
+ this._plainSegmentWorker = new PlainSegmentWorker(4);
399
415
 
400
- this._tileLoader = new Loader(14);
416
+ this._tileLoader = new Loader(options.loadingBatchSize || 12);
401
417
 
402
418
  this._memKey = new Key();
403
419
 
@@ -429,11 +445,14 @@ export class Planet extends RenderNode {
429
445
  control.addTo(this.renderer);
430
446
  }
431
447
 
432
- setRatioLod(maxLod, minLod) {
433
- this._maxLodRatio = maxLod;
434
- if (minLod) {
435
- this._minLodRatio = minLod;
436
- }
448
+ get lodSize() {
449
+ return this._lodSize;
450
+ }
451
+
452
+ setLodSize(currentLodSize, minLodSize, maxLodSize) {
453
+ this._maxLodSize = maxLodSize || this._maxLodSize;
454
+ this._minLodSize = minLodSize || this._minLodSize;
455
+ this._curLodSize = currentLodSize || this._curLodSize;
437
456
  this._renderCompletedActivated = false;
438
457
  }
439
458
 
@@ -619,11 +638,8 @@ export class Planet extends RenderNode {
619
638
  var h = this.renderer.handler;
620
639
 
621
640
  h.addProgram(shaders.drawnode_screen_nl(), true);
622
-
623
641
  //h.addProgram(shaders.drawnode_screen_wl(), true);
624
-
625
642
  h.addProgram(shaders.drawnode_screen_wl_webgl2(), true);
626
-
627
643
  h.addProgram(shaders.drawnode_colorPicking(), true);
628
644
  h.addProgram(shaders.drawnode_depth(), true);
629
645
  h.addProgram(shaders.drawnode_heightPicking(), true);
@@ -716,6 +732,7 @@ export class Planet extends RenderNode {
716
732
  this.transparentTexture = this.renderer.handler.transparentTexture;
717
733
 
718
734
  this.camera = this.renderer.activeCamera = new PlanetCamera(this, {
735
+ frustums: this._cameraFrustums,
719
736
  eye: new Vec3(0, 0, 28000000),
720
737
  look: new Vec3(0, 0, 0),
721
738
  up: new Vec3(0, 1, 0),
@@ -731,31 +748,13 @@ export class Planet extends RenderNode {
731
748
  }
732
749
 
733
750
  // Creating quad trees nodes
734
- this._quadTree = new Node(
735
- Segment,
736
- this,
737
- quadTree.NW,
738
- null,
739
- 0,
740
- 0,
751
+ this._quadTree = new Node(Segment, this, quadTree.NW, null, 0, 0,
741
752
  Extent.createFromArray([-20037508.34, -20037508.34, 20037508.34, 20037508.34])
742
753
  );
743
- this._quadTreeNorth = new Node(
744
- SegmentLonLat,
745
- this,
746
- quadTree.NW,
747
- null,
748
- 0,
749
- 0,
754
+ this._quadTreeNorth = new Node(SegmentLonLat, this, quadTree.NW, null, 0, 0,
750
755
  Extent.createFromArray([-180, mercator.MAX_LAT, 180, 90])
751
756
  );
752
- this._quadTreeSouth = new Node(
753
- SegmentLonLat,
754
- this,
755
- quadTree.NW,
756
- null,
757
- 0,
758
- 0,
757
+ this._quadTreeSouth = new Node(SegmentLonLat, this, quadTree.NW, null, 0, 0,
759
758
  Extent.createFromArray([-180, -90, 180, mercator.MIN_LAT])
760
759
  );
761
760
 
@@ -771,7 +770,7 @@ export class Planet extends RenderNode {
771
770
  // loading Earth night glowing texture
772
771
  if (this._useNightTexture) {
773
772
  createImageBitmap(NIGHT).then(
774
- (e) => (this._nightTexture = this.renderer.handler.createTexture(e))
773
+ (e) => (this._nightTexture = this.renderer.handler.createTextureDefault(e))
775
774
  );
776
775
  }
777
776
 
@@ -816,35 +815,65 @@ export class Planet extends RenderNode {
816
815
  }
817
816
 
818
817
  _preRender() {
818
+ // Zoom 0
819
819
  this._quadTree.createChildrenNodes();
820
- this._quadTree.segment.createPlainSegment();
820
+ this._quadTree.segment.createPlainSegment();
821
+
822
+ // Zoom 1
823
+ for (let i = 0; i < this._quadTree.nodes.length; i++) {
824
+ this._quadTree.nodes[i].segment.createPlainSegment();
825
+ }
826
+
827
+ // same for poles
828
+ this._quadTreeNorth.createChildrenNodes();
829
+ this._quadTreeNorth.segment.createPlainSegment();
830
+
831
+ for (let i = 0; i < this._quadTreeNorth.nodes.length; i++) {
832
+ this._quadTreeNorth.nodes[i].segment.createPlainSegment();
833
+ }
834
+
835
+ this._quadTreeSouth.createChildrenNodes();
836
+ this._quadTreeSouth.segment.createPlainSegment();
837
+
838
+ for (let i = 0; i < this._quadTreeSouth.nodes.length; i++) {
839
+ this._quadTreeSouth.nodes[i].segment.createPlainSegment();
840
+ }
841
+
842
+ this._preLoad();
843
+ }
844
+
845
+ _preLoad() {
846
+ this._skipPreRender = false;
847
+
848
+ // Zoom 0
849
+ this._quadTree.segment.passReady = true;
821
850
  this._quadTree.renderNode(true);
822
851
  this._normalMapCreator.drawSingle(this._quadTree.segment);
823
852
 
853
+ // Zoom 1
824
854
  for (let i = 0; i < this._quadTree.nodes.length; i++) {
825
- this._quadTree.nodes[i].segment.createPlainSegment();
855
+ this._quadTree.nodes[i].segment.passReady = true;
826
856
  this._quadTree.nodes[i].renderNode(true);
827
857
  this._normalMapCreator.drawSingle(this._quadTree.nodes[i].segment);
828
858
  }
829
859
 
830
- this._quadTreeNorth.createChildrenNodes();
831
- this._quadTreeNorth.segment.createPlainSegment();
860
+ // Same for poles
861
+ this._quadTreeNorth.segment.passReady = true;
832
862
  this._quadTreeNorth.renderNode(true);
833
863
  this._normalMapCreator.drawSingle(this._quadTreeNorth.segment);
834
864
 
835
865
  for (let i = 0; i < this._quadTreeNorth.nodes.length; i++) {
836
- this._quadTreeNorth.nodes[i].segment.createPlainSegment();
866
+ this._quadTreeNorth.nodes[i].segment.passReady = true;
837
867
  this._quadTreeNorth.nodes[i].renderNode(true);
838
868
  this._normalMapCreator.drawSingle(this._quadTreeNorth.nodes[i].segment);
839
869
  }
840
870
 
841
- this._quadTreeSouth.createChildrenNodes();
842
- this._quadTreeSouth.segment.createPlainSegment();
871
+ this._quadTreeSouth.segment.passReady = true;
843
872
  this._quadTreeSouth.renderNode(true);
844
873
  this._normalMapCreator.drawSingle(this._quadTreeSouth.segment);
845
874
 
846
875
  for (let i = 0; i < this._quadTreeSouth.nodes.length; i++) {
847
- this._quadTreeSouth.nodes[i].segment.createPlainSegment();
876
+ this._quadTreeSouth.nodes[i].segment.passReady = true;
848
877
  this._quadTreeSouth.nodes[i].renderNode(true);
849
878
  this._normalMapCreator.drawSingle(this._quadTreeSouth.nodes[i].segment);
850
879
  }
@@ -925,6 +954,9 @@ export class Planet extends RenderNode {
925
954
  if (li._attribution.length) {
926
955
  html += "<li>" + li._attribution + "</li>";
927
956
  }
957
+
958
+ this._preLoad();
959
+
928
960
  } else if (li._fading && li._fadingOpacity > 0) {
929
961
  if (li.hasImageryTiles()) {
930
962
  this.visibleTileLayers.push(li);
@@ -998,16 +1030,10 @@ export class Planet extends RenderNode {
998
1030
  _collectRenderNodes() {
999
1031
  let cam = this.camera;
1000
1032
 
1001
- this._lodRatio = math.lerp(
1002
- cam.slope < 0.0 ? 0.0 : cam.slope,
1003
- this._maxLodRatio,
1004
- this._minLodRatio
1005
- );
1033
+ this._lodSize = math.lerp(cam.slope < 0.0 ? 0.0 : cam.slope, this._curLodSize, this._minLodSize);
1006
1034
 
1007
1035
  cam._insideSegment = null;
1008
1036
 
1009
- this._nodeCounterError_ = 0;
1010
-
1011
1037
  // clear first
1012
1038
  this._clearRenderedNodeList();
1013
1039
 
@@ -1022,11 +1048,11 @@ export class Planet extends RenderNode {
1022
1048
 
1023
1049
  this._quadTree.renderTree(cam, 0, null);
1024
1050
 
1025
- if (
1026
- cam.slope > this.minEqualZoomCameraSlope &&
1051
+ if (cam.slope > this.minEqualZoomCameraSlope &&
1027
1052
  cam._lonLat.height < this.maxEqualZoomAltitude &&
1028
1053
  cam._lonLat.height > this.minEqualZoomAltitude
1029
1054
  ) {
1055
+
1030
1056
  this.minCurrZoom = this.maxCurrZoom;
1031
1057
 
1032
1058
  let temp = this._renderedNodes,
@@ -1043,7 +1069,8 @@ export class Planet extends RenderNode {
1043
1069
 
1044
1070
  for (var i = 0, len = temp.length; i < len; i++) {
1045
1071
  var ri = temp[i];
1046
- if (ri.segment.tileZoom === this.maxCurrZoom) {
1072
+ let ht = ri.segment.centerNormal.dot(cam._b);
1073
+ if (ri.segment.tileZoom === this.maxCurrZoom || ht < HORIZON_TANGENT) {
1047
1074
  this._renderedNodes.push(ri);
1048
1075
  let k = 0,
1049
1076
  inFrustum = ri.inFrustum;
@@ -1147,12 +1174,12 @@ export class Planet extends RenderNode {
1147
1174
  this._vectorTileCreator.frame();
1148
1175
  }
1149
1176
 
1150
- gl.blendEquation(gl.FUNC_ADD);
1151
1177
 
1152
- gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
1178
+ gl.enable(gl.CULL_FACE);
1153
1179
 
1154
1180
  gl.enable(gl.BLEND);
1155
- gl.enable(gl.CULL_FACE);
1181
+ gl.blendEquation(gl.FUNC_ADD);
1182
+ gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
1156
1183
 
1157
1184
  if (this.lightEnabled) {
1158
1185
  h.programs.drawnode_screen_wl.activate();
@@ -1165,13 +1192,14 @@ export class Planet extends RenderNode {
1165
1192
  gl.uniformMatrix4fv(shu.viewMatrix, false, cam.getViewMatrix());
1166
1193
  gl.uniformMatrix4fv(shu.projectionMatrix, false, cam.getProjectionMatrix());
1167
1194
 
1195
+ gl.uniform3fv(shu.diffuse, this._diffuse);
1196
+ gl.uniform3fv(shu.ambient, this._ambient);
1197
+ gl.uniform4fv(shu.specular, this._specular);
1198
+
1168
1199
  // bind night glowing material
1169
1200
  gl.activeTexture(gl.TEXTURE0 + this.SLICE_SIZE);
1170
- gl.bindTexture(
1171
- gl.TEXTURE_2D,
1172
- (this.camera._lonLat.height > 329958.0 &&
1173
- (this._nightTexture || this.transparentTexture)) ||
1174
- this.transparentTexture
1201
+ gl.bindTexture(gl.TEXTURE_2D,
1202
+ (this.camera._lonLat.height > 329958.0 && (this._nightTexture || this.transparentTexture)) || this.transparentTexture
1175
1203
  );
1176
1204
  gl.uniform1i(shu.nightTexture, this.SLICE_SIZE);
1177
1205
 
@@ -1180,34 +1208,6 @@ export class Planet extends RenderNode {
1180
1208
  gl.bindTexture(gl.TEXTURE_2D, this._specularTexture || this.transparentTexture);
1181
1209
  gl.uniform1i(shu.specularTexture, this.SLICE_SIZE + 1);
1182
1210
 
1183
- var b = this.baseLayer;
1184
- if (b) {
1185
- this._diffuseMaterialArr[0] = b.diffuse.x;
1186
- this._diffuseMaterialArr[1] = b.diffuse.y;
1187
- this._diffuseMaterialArr[2] = b.diffuse.z;
1188
-
1189
- this._ambientMaterialArr[0] = b.ambient.x;
1190
- this._ambientMaterialArr[1] = b.ambient.y;
1191
- this._ambientMaterialArr[2] = b.ambient.z;
1192
-
1193
- this._specularMaterialArr[0] = b.specular.x;
1194
- this._specularMaterialArr[1] = b.specular.y;
1195
- this._specularMaterialArr[2] = b.specular.z;
1196
- this._specularMaterialArr[3] = b.shininess;
1197
- } else {
1198
- this._diffuseMaterialArr[0] = 0.89;
1199
- this._diffuseMaterialArr[1] = 0.9;
1200
- this._diffuseMaterialArr[2] = 0.83;
1201
-
1202
- this._ambientMaterialArr[0] = 0.0;
1203
- this._ambientMaterialArr[1] = 0.0;
1204
- this._ambientMaterialArr[2] = 0.0;
1205
-
1206
- this._specularMaterialArr[0] = 0.0003;
1207
- this._specularMaterialArr[1] = 0.00012;
1208
- this._specularMaterialArr[2] = 0.00001;
1209
- this._specularMaterialArr[3] = 20.0;
1210
- }
1211
1211
  } else {
1212
1212
  h.programs.drawnode_screen_nl.activate();
1213
1213
  sh = h.programs.drawnode_screen_nl._program;
@@ -1266,63 +1266,45 @@ export class Planet extends RenderNode {
1266
1266
  * @protected
1267
1267
  */
1268
1268
  _renderHeightPickingFramebufferPASS() {
1269
- this._heightPickingFramebuffer.activate();
1269
+ if (!this.terrain.isEmpty) {
1270
1270
 
1271
- let sh;
1272
- let renderer = this.renderer;
1273
- let h = renderer.handler;
1274
- let gl = h.gl;
1275
- let cam = renderer.activeCamera;
1276
- let frustumIndex = cam.getCurrentFrustum();
1277
-
1278
- if (frustumIndex === cam.FARTHEST_FRUSTUM_INDEX) {
1279
- gl.clearColor(0.0, 0.0, 0.0, 1.0);
1280
- gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
1281
- } else {
1282
- gl.clear(gl.DEPTH_BUFFER_BIT);
1283
- }
1271
+ this._heightPickingFramebuffer.activate();
1284
1272
 
1285
- gl.enable(gl.CULL_FACE);
1286
- gl.blendEquation(gl.FUNC_ADD);
1287
- gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
1288
- gl.enable(gl.BLEND);
1273
+ let sh;
1274
+ let renderer = this.renderer;
1275
+ let h = renderer.handler;
1276
+ let gl = h.gl;
1277
+ let cam = renderer.activeCamera;
1278
+ let frustumIndex = cam.getCurrentFrustum();
1289
1279
 
1290
- h.programs.drawnode_heightPicking.activate();
1291
- sh = h.programs.drawnode_heightPicking._program;
1292
- let shu = sh.uniforms;
1280
+ if (frustumIndex === cam.FARTHEST_FRUSTUM_INDEX) {
1281
+ gl.clearColor(0.0, 0.0, 0.0, 1.0);
1282
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
1283
+ } else {
1284
+ gl.clear(gl.DEPTH_BUFFER_BIT);
1285
+ }
1293
1286
 
1294
- gl.uniformMatrix4fv(shu.viewMatrix, false, renderer.activeCamera.getViewMatrix());
1295
- gl.uniformMatrix4fv(
1296
- shu.projectionMatrix,
1297
- false,
1298
- renderer.activeCamera.getProjectionMatrix()
1299
- );
1287
+ h.programs.drawnode_heightPicking.activate();
1288
+ sh = h.programs.drawnode_heightPicking._program;
1289
+ let shu = sh.uniforms;
1300
1290
 
1301
- gl.uniform3fv(shu.eyePositionHigh, cam.eyeHigh);
1302
- gl.uniform3fv(shu.eyePositionLow, cam.eyeLow);
1291
+ gl.uniformMatrix4fv(shu.viewMatrix, false, renderer.activeCamera.getViewMatrix());
1292
+ gl.uniformMatrix4fv(shu.projectionMatrix, false, renderer.activeCamera.getProjectionMatrix());
1303
1293
 
1304
- // drawing planet nodes
1305
- var rn = this._renderedNodesInFrustum[frustumIndex],
1306
- sl = this._visibleTileLayerSlices;
1294
+ gl.uniform3fv(shu.eyePositionHigh, cam.eyeHigh);
1295
+ gl.uniform3fv(shu.eyePositionLow, cam.eyeLow);
1307
1296
 
1308
- let i = rn.length;
1309
- while (i--) {
1310
- rn[i].segment.heightPickingRendering(sh, sl[0], 0);
1311
- }
1297
+ // drawing planet nodes
1298
+ var rn = this._renderedNodesInFrustum[frustumIndex],
1299
+ sl = this._visibleTileLayerSlices;
1312
1300
 
1313
- //gl.enable(gl.POLYGON_OFFSET_FILL);
1314
- for (let j = 1, len = sl.length; j < len; j++) {
1315
- i = rn.length;
1316
- //gl.polygonOffset(0, -j);
1301
+ let i = rn.length;
1317
1302
  while (i--) {
1318
- rn[i].segment.heightPickingRendering(sh, sl[j], j, this.transparentTexture, true);
1303
+ rn[i].segment.heightPickingRendering(sh, sl[0]);
1319
1304
  }
1320
- }
1321
- //gl.disable(gl.POLYGON_OFFSET_FILL);
1322
1305
 
1323
- gl.disable(gl.BLEND);
1324
-
1325
- this._heightPickingFramebuffer.deactivate();
1306
+ this._heightPickingFramebuffer.deactivate();
1307
+ }
1326
1308
  }
1327
1309
 
1328
1310
  /**
@@ -1385,6 +1367,7 @@ export class Planet extends RenderNode {
1385
1367
  let cam = renderer.activeCamera;
1386
1368
 
1387
1369
  gl.disable(gl.BLEND);
1370
+ gl.disable(gl.POLYGON_OFFSET_FILL);
1388
1371
 
1389
1372
  gl.uniformMatrix4fv(shu.viewMatrix, false, cam.getViewMatrix());
1390
1373
  gl.uniformMatrix4fv(shu.projectionMatrix, false, cam.getProjectionMatrix());
@@ -1400,16 +1383,7 @@ export class Planet extends RenderNode {
1400
1383
 
1401
1384
  let i = rn.length;
1402
1385
  while (i--) {
1403
- rn[i].segment.depthRendering(sh, sl[0], 0);
1404
- }
1405
-
1406
- gl.enable(gl.POLYGON_OFFSET_FILL);
1407
- for (let j = 1, len = sl.length; j < len; j++) {
1408
- i = rn.length;
1409
- gl.polygonOffset(0, -j);
1410
- while (i--) {
1411
- rn[i].segment.depthRendering(sh, sl[j], j, this.transparentTexture, true);
1412
- }
1386
+ rn[i].segment.depthRendering(sh, sl[0]);
1413
1387
  }
1414
1388
  }
1415
1389
 
@@ -1509,12 +1483,11 @@ export class Planet extends RenderNode {
1509
1483
  * Returns 3d cartesian coordinates on the relief planet by mouse cursor
1510
1484
  * position or null if mouse cursor is outside the planet.
1511
1485
  * @public
1512
- * @param {Boolean} [force=false] - Force framebuffer rendering.
1513
1486
  * @returns {Vec3} -
1514
1487
  */
1515
- getCartesianFromMouseTerrain(force) {
1488
+ getCartesianFromMouseTerrain() {
1516
1489
  var ms = this.renderer.events.mouseState;
1517
- var distance = this.getDistanceFromPixel(ms, force);
1490
+ var distance = this.getDistanceFromPixel(ms);
1518
1491
  if (distance) {
1519
1492
  return ms.direction.scaleTo(distance).addA(this.renderer.activeCamera.eye);
1520
1493
  }
@@ -1529,8 +1502,8 @@ export class Planet extends RenderNode {
1529
1502
  * @param {Boolean} [force=false] - Force framebuffer rendering.
1530
1503
  * @returns {Vec3} -
1531
1504
  */
1532
- getCartesianFromPixelTerrain(px, force) {
1533
- var distance = this.getDistanceFromPixel(px, force);
1505
+ getCartesianFromPixelTerrain(px) {
1506
+ var distance = this.getDistanceFromPixel(px);
1534
1507
  if (distance) {
1535
1508
  var direction = px.direction || this.renderer.activeCamera.unproject(px.x, px.y);
1536
1509
  return direction.scaleTo(distance).addA(this.renderer.activeCamera.eye);
@@ -1601,40 +1574,48 @@ export class Planet extends RenderNode {
1601
1574
  * @returns {number} -
1602
1575
  */
1603
1576
  getDistanceFromPixel(px) {
1604
- let r = this.renderer,
1605
- cnv = this.renderer.handler.canvas;
1606
-
1607
- let spx = px.x / cnv.width,
1608
- spy = (cnv.height - px.y) / cnv.height;
1609
-
1610
- // HEIGHT
1611
- this._heightPickingFramebuffer.activate();
1612
- this._heightPickingFramebuffer.readPixels(_tempPickingPix_, spx, spy);
1613
- this._heightPickingFramebuffer.deactivate();
1614
-
1615
- let dist = decodeFloatFromRGBAArr(_tempPickingPix_);
1616
-
1617
- if (!(_tempPickingPix_[0] || _tempPickingPix_[1] || _tempPickingPix_[2])) {
1618
- dist = this.getDistanceFromPixelEllipsoid(px) || 0;
1619
- } else if (dist < DEPTH_DISTANCE) {
1620
- r.screenDepthFramebuffer.activate();
1621
- r.screenDepthFramebuffer.readPixels(_tempDepthColor_, spx, spy, 0);
1622
- r.screenDepthFramebuffer.deactivate();
1623
-
1624
- let screenPos = new Vec4(
1625
- spx * 2.0 - 1.0,
1626
- spy * 2.0 - 1.0,
1627
- (_tempDepthColor_[0] / 255.0) * 2.0 - 1.0,
1628
- 1.0 * 2.0 - 1.0
1629
- );
1630
- let viewPosition = this.camera.frustums[0]._inverseProjectionMatrix.mulVec4(screenPos);
1631
- let dir = px.direction || this.renderer.activeCamera.unproject(px.x, px.y);
1632
- dist =
1633
- -(viewPosition.z / viewPosition.w) /
1634
- dir.dot(this.renderer.activeCamera.getForward());
1635
- }
1577
+ if (this.terrain.isEmpty) {
1578
+ return this.getDistanceFromPixelEllipsoid(px) || 0;
1579
+ } else {
1580
+
1581
+ let r = this.renderer,
1582
+ cnv = this.renderer.handler.canvas;
1583
+
1584
+ let spx = px.x / cnv.width,
1585
+ spy = (cnv.height - px.y) / cnv.height;
1636
1586
 
1637
- return dist;
1587
+ _tempPickingPix_[0] = _tempPickingPix_[1] = _tempPickingPix_[2] = 0.0;
1588
+
1589
+ let dist = 0;
1590
+
1591
+ // HEIGHT
1592
+ this._heightPickingFramebuffer.activate();
1593
+ if (this._heightPickingFramebuffer.isComplete()) {
1594
+ this._heightPickingFramebuffer.readPixels(_tempPickingPix_, spx, spy);
1595
+ dist = decodeFloatFromRGBAArr(_tempPickingPix_);
1596
+ }
1597
+ this._heightPickingFramebuffer.deactivate();
1598
+
1599
+ if (!(_tempPickingPix_[0] || _tempPickingPix_[1] || _tempPickingPix_[2])) {
1600
+ dist = this.getDistanceFromPixelEllipsoid(px) || 0;
1601
+ } else if (dist < DEPTH_DISTANCE) {
1602
+ r.screenDepthFramebuffer.activate();
1603
+ if (r.screenDepthFramebuffer.isComplete()) {
1604
+ r.screenDepthFramebuffer.readPixels(_tempDepthColor_, spx, spy);
1605
+ let screenPos = new Vec4(
1606
+ spx * 2.0 - 1.0,
1607
+ spy * 2.0 - 1.0,
1608
+ (_tempDepthColor_[0] / 255.0) * 2.0 - 1.0,
1609
+ 1.0 * 2.0 - 1.0
1610
+ );
1611
+ let viewPosition = this.camera.frustums[0]._inverseProjectionMatrix.mulVec4(screenPos);
1612
+ let dir = px.direction || this.renderer.activeCamera.unproject(px.x, px.y);
1613
+ dist = -(viewPosition.z / viewPosition.w) / dir.dot(this.renderer.activeCamera.getForward());
1614
+ }
1615
+ r.screenDepthFramebuffer.deactivate();
1616
+ }
1617
+ return dist;
1618
+ }
1638
1619
  }
1639
1620
 
1640
1621
  /**