@openglobus/og 0.15.1 → 0.15.3

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 (146) hide show
  1. package/README.md +10 -4
  2. package/css/og.css +44 -45
  3. package/dist/@openglobus/og.css +1 -1
  4. package/dist/@openglobus/og.esm.js +2 -2
  5. package/dist/@openglobus/og.esm.js.map +1 -1
  6. package/dist/@openglobus/og.umd.js +2 -2
  7. package/dist/@openglobus/og.umd.js.map +1 -1
  8. package/package.json +12 -12
  9. package/src/og/Clock.js +1 -1
  10. package/src/og/Events.js +1 -1
  11. package/src/og/Extent.js +1 -1
  12. package/src/og/Globe.js +3 -5
  13. package/src/og/Popup.js +38 -63
  14. package/src/og/astro/earth.js +2 -2
  15. package/src/og/astro/rotation.js +2 -2
  16. package/src/og/bv/Box.js +1 -0
  17. package/src/og/bv/index.js +1 -1
  18. package/src/og/camera/Camera.js +4 -4
  19. package/src/og/camera/PlanetCamera.js +26 -6
  20. package/src/og/camera/index.js +1 -1
  21. package/src/og/control/Atmosphere.js +3 -8
  22. package/src/og/control/CompassButton.js +4 -5
  23. package/src/og/control/EarthCoordinates.js +3 -2
  24. package/src/og/control/EarthNavigation.js +0 -1
  25. package/src/og/control/GeoImageDragControl.js +2 -2
  26. package/src/og/control/KeyboardNavigation.js +3 -2
  27. package/src/og/control/LayerAnimation.js +2 -2
  28. package/src/og/control/LayerSwitcher.js +5 -4
  29. package/src/og/control/Lighting.js +106 -35
  30. package/src/og/control/MouseNavigation.js +4 -4
  31. package/src/og/control/MouseWheelZoomControl.js +2 -2
  32. package/src/og/control/RulerSwitcher.js +4 -3
  33. package/src/og/control/ScaleControl.js +2 -2
  34. package/src/og/control/ShowFps.js +2 -1
  35. package/src/og/control/SimpleNavigation.js +2 -1
  36. package/src/og/control/SimpleSkyBackground.js +2 -2
  37. package/src/og/control/Sun.js +8 -1
  38. package/src/og/control/ToggleWireframe.js +2 -1
  39. package/src/og/control/TouchNavigation.js +4 -3
  40. package/src/og/control/ZoomControl.js +6 -5
  41. package/src/og/control/index.js +10 -10
  42. package/src/og/control/ruler/RulerScene.js +19 -11
  43. package/src/og/control/selection/Selection.js +1 -1
  44. package/src/og/control/selection/SelectionScene.js +5 -8
  45. package/src/og/control/timeline/TimelineControl.js +3 -4
  46. package/src/og/control/timeline/TimelineModel.js +2 -2
  47. package/src/og/control/timeline/TimelineView.js +10 -5
  48. package/src/og/control/visibleExtent/Segment.js +5 -5
  49. package/src/og/control/visibleExtent/VisibleExtent.js +1 -1
  50. package/src/og/ellipsoid/Ellipsoid.js +3 -3
  51. package/src/og/entity/BaseBillboard.js +2 -2
  52. package/src/og/entity/BillboardHandler.js +10 -2
  53. package/src/og/entity/Entity.js +10 -51
  54. package/src/og/entity/EntityCollection.js +3 -20
  55. package/src/og/entity/GeoObject.js +2 -4
  56. package/src/og/entity/GeoObjectHandler.js +12 -11
  57. package/src/og/entity/Geometry.js +2 -2
  58. package/src/og/entity/GeometryHandler.js +2 -2
  59. package/src/og/entity/Label.js +2 -2
  60. package/src/og/entity/LabelHandler.js +7 -5
  61. package/src/og/entity/Polyline.js +8 -7
  62. package/src/og/entity/Ray.js +1 -2
  63. package/src/og/entity/RayHandler.js +4 -0
  64. package/src/og/entity/Strip.js +8 -5
  65. package/src/og/entity/index.js +1 -1
  66. package/src/og/index.core.js +4 -4
  67. package/src/og/index.js +4 -4
  68. package/src/og/index.webgl.js +3 -3
  69. package/src/og/layer/BaseGeoImage.js +2 -2
  70. package/src/og/layer/GeoImage.js +2 -2
  71. package/src/og/layer/GeoTexture2d.js +1 -1
  72. package/src/og/layer/Layer.js +3 -3
  73. package/src/og/layer/Vector.js +7 -11
  74. package/src/og/layer/WMS.js +2 -1
  75. package/src/og/layer/XYZ.js +2 -4
  76. package/src/og/math/Line3.js +0 -1
  77. package/src/og/math/Plane.js +0 -1
  78. package/src/og/math/Ray.js +0 -1
  79. package/src/og/math/Vec2.js +62 -62
  80. package/src/og/math/Vec3.js +1 -1
  81. package/src/og/math/Vec4.js +1 -1
  82. package/src/og/math/index.js +1 -1
  83. package/src/og/proj/EPSG3857.js +1 -1
  84. package/src/og/proj/EPSG4326.js +1 -1
  85. package/src/og/quadTree/EarthQuadTreeStrategy.js +4 -4
  86. package/src/og/quadTree/MarsQuadTreeStrategy.js +4 -4
  87. package/src/og/quadTree/Node.js +1 -1
  88. package/src/og/quadTree/Wgs84QuadTreeStrategy.js +4 -4
  89. package/src/og/quadTree/index.js +2 -2
  90. package/src/og/renderer/Renderer.js +196 -77
  91. package/src/og/renderer/RendererEvents.js +35 -10
  92. package/src/og/scene/Axes.js +2 -2
  93. package/src/og/scene/Planet.js +47 -75
  94. package/src/og/scene/RenderNode.js +2 -13
  95. package/src/og/scene/SkyBox.js +1 -1
  96. package/src/og/scene/index.js +2 -2
  97. package/src/og/segment/Segment.js +5 -5
  98. package/src/og/segment/SegmentLonLatWgs84.js +2 -3
  99. package/src/og/shaders/drawnode.js +5 -1
  100. package/src/og/shaders/geoObject.js +2 -6
  101. package/src/og/shaders/pickingMask.js +31 -0
  102. package/src/og/shaders/polyline.js +212 -212
  103. package/src/og/terrain/BilTerrain.js +4 -4
  104. package/src/og/terrain/GlobusTerrain.js +7 -7
  105. package/src/og/terrain/MapboxTerrain.js +2 -2
  106. package/src/og/terrain/index.js +2 -2
  107. package/src/og/ui/Button.js +5 -4
  108. package/src/og/ui/Dialog.js +3 -6
  109. package/src/og/ui/Slider.js +29 -3
  110. package/src/og/ui/View.js +5 -5
  111. package/src/og/ui/icons.js +3 -0
  112. package/src/og/utils/FontAtlas.js +2 -2
  113. package/src/og/utils/GeoImageCreator.js +0 -1
  114. package/src/og/utils/NormalMapCreator.js +6 -5
  115. package/src/og/utils/TerrainWorker.js +1 -1
  116. package/src/og/utils/VectorTileCreator.js +4 -4
  117. package/src/og/utils/shared.js +1 -1
  118. package/src/og/webgl/Framebuffer.js +3 -1
  119. package/src/og/webgl/Handler.js +77 -62
  120. package/src/og/webgl/Multisample.js +18 -7
  121. package/src/og/webgl/Program.js +2 -2
  122. package/src/og/webgl/index.js +2 -2
  123. package/types/Popup.d.ts +8 -21
  124. package/types/camera/PlanetCamera.d.ts +1 -0
  125. package/types/control/Sun.d.ts +1 -0
  126. package/types/control/ruler/RulerScene.d.ts +4 -3
  127. package/types/entity/Entity.d.ts +2 -19
  128. package/types/entity/EntityCollection.d.ts +0 -7
  129. package/types/math/Vec2.d.ts +95 -95
  130. package/types/renderer/Renderer.d.ts +28 -16
  131. package/types/scene/Planet.d.ts +2 -7
  132. package/types/shaders/pickingMask.d.ts +2 -0
  133. package/types/ui/Slider.d.ts +3 -0
  134. package/types/ui/View.d.ts +1 -0
  135. package/types/ui/icons.d.ts +1 -0
  136. package/types/webgl/Framebuffer.d.ts +1 -0
  137. package/types/webgl/Handler.d.ts +3 -2
  138. package/src/og/entity/ShapeHandler.js +0 -99
  139. package/src/og/shaders/shape.js +0 -135
  140. package/src/og/shapes/BaseShape.js +0 -557
  141. package/src/og/shapes/Icosphere.js +0 -179
  142. package/src/og/shapes/Sphere.js +0 -100
  143. package/types/entity/ShapeHandler.d.ts +0 -22
  144. package/types/shaders/shape.d.ts +0 -4
  145. package/types/shapes/BaseShape.d.ts +0 -250
  146. package/types/shapes/Sphere.d.ts +0 -41
@@ -4,7 +4,7 @@
4
4
 
5
5
  "use strict";
6
6
 
7
- import { Units, Proj } from "./Proj.js";
7
+ import { Proj, Units } from "./Proj.js";
8
8
 
9
9
  /**
10
10
  * EPSG:3857 projection object.
@@ -4,7 +4,7 @@
4
4
 
5
5
  "use strict";
6
6
 
7
- import { Units, Proj } from "./Proj.js";
7
+ import { Proj, Units } from "./Proj.js";
8
8
 
9
9
  /**
10
10
  * EPSG:4326 projection object.
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
- import { QuadTreeStrategy } from "./QuadTreeStrategy.js"
2
+ import { Extent } from "../Extent.js";
3
3
  import * as mercator from "../mercator.js";
4
+ import { Node } from "../quadTree/Node.js";
5
+ import * as quadTree from "../quadTree/quadTree.js";
4
6
  import { Segment } from "../segment/Segment.js";
5
7
  import { SegmentLonLat } from "../segment/SegmentLonLat.js";
6
- import * as quadTree from "../quadTree/quadTree.js";
7
- import { Extent } from "../Extent.js";
8
- import { Node } from "../quadTree/Node.js";
8
+ import { QuadTreeStrategy } from "./QuadTreeStrategy.js";
9
9
 
10
10
  export class EarthQuadTreeStrategy extends QuadTreeStrategy {
11
11
  constructor(options = {}) {
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
- import { QuadTreeStrategy } from "./QuadTreeStrategy.js"
3
- import { SegmentLonLatWgs84 } from "../segment/SegmentLonLatWgs84.js";
4
- import * as quadTree from "../quadTree/quadTree.js";
5
2
  import { Extent } from "../Extent.js";
6
- import { Node } from "../quadTree/Node.js";
7
3
  import { EPSG4326 } from "../proj/EPSG4326.js";
4
+ import { Node } from "../quadTree/Node.js";
5
+ import * as quadTree from "../quadTree/quadTree.js";
6
+ import { SegmentLonLatWgs84 } from "../segment/SegmentLonLatWgs84.js";
7
+ import { QuadTreeStrategy } from "./QuadTreeStrategy.js";
8
8
 
9
9
 
10
10
  export class MarsQuadTreeStrategy extends QuadTreeStrategy {
@@ -787,4 +787,4 @@ class Node {
787
787
  }
788
788
  }
789
789
 
790
- export { Node };
790
+ export { Node };
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
- import { QuadTreeStrategy } from "./QuadTreeStrategy.js"
3
- import { SegmentLonLatWgs84 } from "../segment/SegmentLonLatWgs84.js";
4
- import * as quadTree from "../quadTree/quadTree.js";
5
2
  import { Extent } from "../Extent.js";
6
- import { Node } from "../quadTree/Node.js";
7
3
  import { EPSG4326 } from "../proj/EPSG4326.js";
4
+ import { Node } from "../quadTree/Node.js";
5
+ import * as quadTree from "../quadTree/quadTree.js";
6
+ import { SegmentLonLatWgs84 } from "../segment/SegmentLonLatWgs84.js";
7
+ import { QuadTreeStrategy } from "./QuadTreeStrategy.js";
8
8
 
9
9
  export class Wgs84QuadTreeStrategy extends QuadTreeStrategy {
10
10
  constructor(options = {}) {
@@ -1,7 +1,7 @@
1
1
  import { EarthQuadTreeStrategy } from "./EarthQuadTreeStrategy.js";
2
2
  import { MarsQuadTreeStrategy } from "./MarsQuadTreeStrategy.js";
3
- import { Wgs84QuadTreeStrategy } from "./Wgs84QuadTreeStrategy.js";
4
3
  import { QuadTreeStrategy } from "./QuadTreeStrategy.js";
4
+ import { Wgs84QuadTreeStrategy } from "./Wgs84QuadTreeStrategy.js";
5
5
 
6
6
  const quadTreeStrategyType = {
7
7
  earth: EarthQuadTreeStrategy,
@@ -9,4 +9,4 @@ const quadTreeStrategyType = {
9
9
  wgs84: Wgs84QuadTreeStrategy
10
10
  }
11
11
 
12
- export { quadTreeStrategyType, QuadTreeStrategy, Wgs84QuadTreeStrategy, MarsQuadTreeStrategy, EarthQuadTreeStrategy };
12
+ export { quadTreeStrategyType, QuadTreeStrategy, Wgs84QuadTreeStrategy, MarsQuadTreeStrategy, EarthQuadTreeStrategy };
@@ -1,29 +1,28 @@
1
1
  "use strict";
2
2
 
3
+ import * as arial from "../arial.js";
3
4
  import { Camera } from "../camera/Camera.js";
4
- import { Framebuffer, Multisample } from "../webgl/index.js";
5
+ import { cons } from "../cons.js";
6
+ import { depth } from "../shaders/depth.js";
7
+ import { LabelWorker } from "../entity/LabelWorker.js";
8
+ import { input } from "../input/input.js";
5
9
  import { randomi } from "../math.js";
6
- import { RendererEvents } from "./RendererEvents.js";
7
10
  import { Vec2 } from "../math/Vec2.js";
8
11
  import { Vec3 } from "../math/Vec3.js";
9
- import { cons } from "../cons.js";
10
- import { input } from "../input/input.js";
11
- import { isEmpty } from "../utils/shared.js";
12
- import { toneMapping } from "../shaders/toneMapping.js";
12
+ import { pickingMask } from "../shaders/pickingMask.js";
13
13
  import { screenFrame } from "../shaders/screenFrame.js";
14
+ import { toneMapping } from "../shaders/toneMapping.js";
14
15
  import { FontAtlas } from "../utils/FontAtlas.js";
16
+ import { isEmpty } from "../utils/shared.js";
15
17
  import { TextureAtlas } from "../utils/TextureAtlas.js";
16
- import * as arial from "../arial.js";
17
- import { depth } from "../shaders/depth.js";
18
- import { LabelWorker } from "../entity/LabelWorker.js";
18
+ import { Framebuffer, Multisample } from "../webgl/index.js";
19
+ import { RendererEvents } from "./RendererEvents.js";
19
20
 
20
21
  let __pickingCallbackCounter__ = 0;
21
22
 
22
23
  let __depthCallbackCounter__ = 0;
23
24
 
24
- const DIFFUSE = 0;
25
- const NORMAL = 1;
26
- const POSITION = 2;
25
+ let __distanceCallbackCounter__ = 0;
27
26
 
28
27
  /**
29
28
  * Represents high level WebGL context interface that starts WebGL handler working in real time.
@@ -155,6 +154,21 @@ class Renderer {
155
154
  */
156
155
  this.pickingFramebuffer = null;
157
156
 
157
+ this._tempPickingPix_ = null;
158
+
159
+ /**
160
+ * @public
161
+ * @type {Framebuffer}
162
+ */
163
+ this.distanceFramebuffer = null;
164
+
165
+ /**
166
+ * @type {Array.<Renderer~distanceCallback>}
167
+ */
168
+ this._distanceCallbacks = [];
169
+
170
+ this._tempDistancePix_ = null;
171
+
158
172
  /**
159
173
  * Depth objects rendering queue.
160
174
  * @type {Array.<Renderer~depthCallback>}
@@ -163,7 +177,8 @@ class Renderer {
163
177
 
164
178
  this.depthFramebuffer = null;
165
179
 
166
- this._msaa = params.msaa || 4;
180
+ let urlParams = new URLSearchParams(location.search);
181
+ this._msaa = Number(urlParams.get('og_msaa') || params.msaa || 4);
167
182
  this._internalFormat = "RGBA16F";
168
183
  this._format = "RGBA";
169
184
  this._type = "FLOAT";
@@ -174,21 +189,6 @@ class Renderer {
174
189
 
175
190
  this.toneMappingFramebuffer = null;
176
191
 
177
- /**
178
- * Stores current picking rgb color.
179
- * @private
180
- * @type {Array.<number>} - (exactly 3 entries)
181
- */
182
- this._currPickingColor = new Uint8Array(4);
183
-
184
- /**
185
- * Stores previous picked rgb color.
186
- * @private
187
- * @type {Array.<number>} - (exactly 3 entries)
188
- */
189
- this._prevPickingColor = new Uint8Array(4);
190
- this._tempPickingColor_ = new Uint8Array(4);
191
-
192
192
  this._initialized = false;
193
193
 
194
194
  /**
@@ -224,6 +224,8 @@ class Renderer {
224
224
  this._fnScreenFrame = null;
225
225
 
226
226
  this.labelWorker = new LabelWorker(4);
227
+
228
+ this.__useDistanceFramebuffer__ = true;
227
229
  }
228
230
 
229
231
  /**
@@ -253,6 +255,26 @@ class Renderer {
253
255
  }
254
256
  }
255
257
 
258
+ addDistanceCallback(sender, callback) {
259
+ var id = __distanceCallbackCounter__++;
260
+ this._distanceCallbacks.push({
261
+ id: id,
262
+ callback: callback,
263
+ sender: sender
264
+ });
265
+ return id;
266
+ }
267
+
268
+ removeDistanceCallback(id) {
269
+ for (var i = 0; i < this._distanceCallbacks.length; i++) {
270
+ if (id === this._distanceCallbacks[i].id) {
271
+ this._distanceCallbacks.splice(i, 1);
272
+ break;
273
+ }
274
+ }
275
+ }
276
+
277
+
256
278
  /**
257
279
  * Adds picking rendering callback function.
258
280
  * @param {object} sender - Callback context.
@@ -293,10 +315,8 @@ class Renderer {
293
315
  */
294
316
  assignPickingColor(obj) {
295
317
  if (!obj._pickingColor || obj._pickingColor.isZero()) {
296
- var r = 0,
297
- g = 0,
298
- b = 0;
299
- var str = "0_0_0";
318
+ let r = 0, g = 0, b = 0;
319
+ let str = "0_0_0";
300
320
  while (!(r || g || b) || this.colorObjects[str]) {
301
321
  r = randomi(1, 255);
302
322
  g = randomi(1, 255);
@@ -425,9 +445,19 @@ class Renderer {
425
445
 
426
446
  this.pickingFramebuffer = new Framebuffer(this.handler, {
427
447
  width: 640,
428
- height: 480
448
+ height: 480,
449
+ depthComponent: "DEPTH_STENCIL",
450
+ renderbufferTarget: "DEPTH_STENCIL_ATTACHMENT"
451
+ }).init();
452
+
453
+ this._tempPickingPix_ = new Uint8Array(this.pickingFramebuffer.width * this.pickingFramebuffer.height * 4);
454
+
455
+ this.distanceFramebuffer = new Framebuffer(this.handler, {
456
+ width: 320, height: 240
429
457
  }).init();
430
458
 
459
+ this._tempDistancePix_ = new Uint8Array(this.distanceFramebuffer.width * this.distanceFramebuffer.height * 4);
460
+
431
461
  this.depthFramebuffer = new Framebuffer(this.handler, {
432
462
  size: 2,
433
463
  internalFormat: ["RGBA", "DEPTH_COMPONENT24"],
@@ -450,6 +480,7 @@ class Renderer {
450
480
  this.screenTexture = {
451
481
  screen: this.sceneFramebuffer.textures[0],
452
482
  picking: this.pickingFramebuffer.textures[0],
483
+ distance: this.distanceFramebuffer.textures[0],
453
484
  depth: this.screenDepthFramebuffer.textures[0]
454
485
  };
455
486
  } else {
@@ -488,11 +519,14 @@ class Renderer {
488
519
  this.screenTexture = {
489
520
  screen: this.toneMappingFramebuffer.textures[0],
490
521
  picking: this.pickingFramebuffer.textures[0],
522
+ distance: this.distanceFramebuffer.textures[0],
491
523
  depth: this.screenDepthFramebuffer.textures[0],
492
524
  frustum: this.depthFramebuffer.textures[0]
493
525
  };
494
526
  }
495
527
 
528
+ this.handler.addProgram(pickingMask());
529
+
496
530
  this.handler.ONCANVASRESIZE = () => {
497
531
  this._resizeStart();
498
532
  this.events.dispatch(this.events.resize, this.handler.canvas);
@@ -518,6 +552,8 @@ class Renderer {
518
552
  this.outputTexture = this.screenTexture.screen;
519
553
 
520
554
  this.fontAtlas.initFont("arial", arial.data, arial.image);
555
+
556
+ this._pickingMaskCoordinatesBuffer = this.handler.createArrayBuffer(new Float32Array([0, 0]), 2, 1);
521
557
  }
522
558
 
523
559
  resize() {
@@ -553,11 +589,13 @@ class Renderer {
553
589
  if (this.handler.gl.type === "webgl") {
554
590
  this.screenTexture.screen = this.sceneFramebuffer.textures[0];
555
591
  this.screenTexture.picking = this.pickingFramebuffer.textures[0];
592
+ this.screenTexture.distance = this.distanceFramebuffer.textures[0];
556
593
  this.screenTexture.depth = this.screenDepthFramebuffer.textures[0];
557
594
  this.screenTexture.frustum = this.depthFramebuffer.textures[0];
558
595
  } else {
559
596
  this.screenTexture.screen = this.toneMappingFramebuffer.textures[0];
560
597
  this.screenTexture.picking = this.pickingFramebuffer.textures[0];
598
+ this.screenTexture.distance = this.distanceFramebuffer.textures[0];
561
599
  this.screenTexture.depth = this.screenDepthFramebuffer.textures[0];
562
600
  this.screenTexture.frustum = this.depthFramebuffer.textures[0];
563
601
  }
@@ -646,12 +684,11 @@ class Renderer {
646
684
  let ec = this._entityCollections;
647
685
 
648
686
  if (ec.length) {
649
- var gl = this.handler.gl;
687
+ let gl = this.handler.gl;
650
688
 
651
689
  gl.enable(gl.BLEND);
652
690
  gl.blendEquation(gl.FUNC_ADD);
653
691
  gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE);
654
- gl.disable(gl.CULL_FACE);
655
692
 
656
693
  // billboards pass
657
694
  gl.activeTexture(gl.TEXTURE0);
@@ -697,8 +734,6 @@ class Renderer {
697
734
  ec[i]._fadingOpacity && ec[i].polylineHandler.draw();
698
735
  }
699
736
 
700
- gl.enable(gl.CULL_FACE);
701
-
702
737
  // pointClouds pass
703
738
  i = ec.length;
704
739
  while (i--) {
@@ -707,15 +742,6 @@ class Renderer {
707
742
  }
708
743
  }
709
744
 
710
- // shapes pass
711
- i = ec.length;
712
- while (i--) {
713
- eci = ec[i];
714
- if (eci._fadingOpacity) {
715
- eci.shapeHandler.draw();
716
- }
717
- }
718
-
719
745
  // Strip pass
720
746
  i = ec.length;
721
747
  while (i--) {
@@ -747,10 +773,11 @@ class Renderer {
747
773
  let h = this.handler,
748
774
  gl = h.gl;
749
775
 
750
- gl.blendEquation(gl.FUNC_ADD);
751
- gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
752
776
  gl.enable(gl.BLEND);
753
- gl.clearColor(0.0, 0.0, 0.0, 0.0);
777
+ gl.blendEquation(gl.FUNC_ADD);
778
+ gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE);
779
+
780
+ gl.clearColor(0.0, 0.0, 0.0, 1.0);
754
781
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
755
782
 
756
783
  e.dispatch(e.draw, this);
@@ -773,7 +800,8 @@ class Renderer {
773
800
  this._drawEntityCollections();
774
801
 
775
802
  if (pointerEvent) {
776
- this._drawPickingBuffer(k);
803
+ this._drawPickingBuffer();
804
+ this.__useDistanceFramebuffer__ && this._drawDistanceBuffer();
777
805
  }
778
806
  }
779
807
 
@@ -786,7 +814,8 @@ class Renderer {
786
814
  if (h.isWebGl2()) {
787
815
  this._drawDepthBuffer();
788
816
  }
789
- this._readPickingColor();
817
+ this._readPickingBuffer();
818
+ this.__useDistanceFramebuffer__ && this._readDistanceBuffer();
790
819
  }
791
820
 
792
821
  // Tone mapping followed by rendering on the screen
@@ -843,8 +872,8 @@ class Renderer {
843
872
 
844
873
  _screenFrameNoMSAA() {
845
874
 
846
- var h = this.handler;
847
- var sh = h.programs.screenFrame,
875
+ let h = this.handler;
876
+ let sh = h.programs.screenFrame,
848
877
  p = sh._program,
849
878
  gl = h.gl;
850
879
 
@@ -863,20 +892,53 @@ class Renderer {
863
892
  * Draw picking objects framebuffer.
864
893
  * @private
865
894
  */
866
- _drawPickingBuffer(frustumIndex) {
895
+ _drawPickingBuffer() {
867
896
  this.pickingFramebuffer.activate();
868
897
 
869
- var h = this.handler;
870
- var gl = h.gl;
898
+ let h = this.handler;
899
+ let gl = h.gl;
871
900
 
872
901
  if (this.activeCamera.isFirstPass) {
873
902
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
874
- gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
903
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
875
904
  } else {
876
- gl.clear(gl.DEPTH_BUFFER_BIT);
905
+ gl.clear(gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
877
906
  }
878
907
 
879
- gl.disable(h.gl.BLEND);
908
+ //
909
+ // draw picking mask
910
+ //
911
+ h.programs.pickingMask.activate();
912
+ let sh = h.programs.pickingMask._program;
913
+ let shu = sh.uniforms,
914
+ sha = sh.attributes;
915
+
916
+ let /*ts = this.events.touchState,*/
917
+ ms = this.events.mouseState;
918
+
919
+ gl.disable(gl.DEPTH_TEST);
920
+
921
+ gl.enable(gl.STENCIL_TEST);
922
+ gl.colorMask(false, false, false, false);
923
+ gl.stencilFunc(gl.ALWAYS, 2, 0xFF);
924
+ gl.stencilOp(gl.REPLACE, gl.ZERO, gl.REPLACE);
925
+
926
+ gl.uniform2f(shu.offset, (ms.nx - 0.5) * 2, (0.5 - ms.ny) * 2);
927
+
928
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._pickingMaskCoordinatesBuffer);
929
+ gl.vertexAttribPointer(sha.coordinates, this._pickingMaskCoordinatesBuffer.itemSize, gl.FLOAT, false, 0, 0);
930
+ gl.drawArrays(gl.POINTS, 0, this._pickingMaskCoordinatesBuffer.numItems);
931
+
932
+ gl.enable(gl.DEPTH_TEST);
933
+
934
+ //
935
+ // draw picking scenes
936
+ //
937
+ gl.colorMask(true, true, true, true);
938
+ gl.stencilFunc(gl.EQUAL, 2, 0xFF);
939
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
940
+
941
+ gl.disable(gl.BLEND);
880
942
 
881
943
  let dp = this._pickingCallbacks;
882
944
  let i = dp.length;
@@ -888,9 +950,47 @@ class Renderer {
888
950
  dp[i].callback.call(dp[i].sender);
889
951
  }
890
952
 
953
+ gl.enable(gl.BLEND);
954
+
955
+ gl.disable(gl.STENCIL_TEST);
956
+
891
957
  this.pickingFramebuffer.deactivate();
892
958
  }
893
959
 
960
+ /**
961
+ * Draw picking objects framebuffer.
962
+ * @private
963
+ */
964
+ _drawDistanceBuffer() {
965
+ this.distanceFramebuffer.activate();
966
+
967
+ let h = this.handler;
968
+ let gl = h.gl;
969
+
970
+ if (this.activeCamera.isFirstPass) {
971
+ gl.clearColor(0.0, 0.0, 0.0, 1.0);
972
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
973
+ } else {
974
+ gl.clear(gl.DEPTH_BUFFER_BIT);
975
+ }
976
+
977
+ gl.disable(gl.BLEND);
978
+
979
+ let dp = this._distanceCallbacks;
980
+ let i = dp.length;
981
+ while (i--) {
982
+ /**
983
+ * This callback renders distance frame.
984
+ * @callback og.Renderer~distanceCallback
985
+ */
986
+ dp[i].callback.call(dp[i].sender);
987
+ }
988
+
989
+ gl.enable(gl.BLEND);
990
+
991
+ this.distanceFramebuffer.deactivate();
992
+ }
993
+
894
994
  _drawDepthBuffer() {
895
995
  this.depthFramebuffer.activate();
896
996
 
@@ -936,26 +1036,45 @@ class Renderer {
936
1036
  this.screenDepthFramebuffer.deactivate();
937
1037
  }
938
1038
 
939
- _readPickingColor() {
940
- var ms = this.events.mouseState;
941
- var ts = this.events.touchState;
1039
+ _readPickingBuffer() {
1040
+ this.pickingFramebuffer.activate();
1041
+ this.pickingFramebuffer.readAllPixels(this._tempPickingPix_);
1042
+ this.pickingFramebuffer.deactivate();
1043
+ }
1044
+
1045
+ _readDistanceBuffer() {
1046
+ this.distanceFramebuffer.activate();
1047
+ this.distanceFramebuffer.readAllPixels(this._tempDistancePix_);
1048
+ this.distanceFramebuffer.deactivate();
1049
+ }
942
1050
 
943
- if (!(ms.leftButtonHold || ms.rightButtonHold || ms.middleButtonHold)) {
944
- this._prevPickingColor[0] = this._currPickingColor[0];
945
- this._prevPickingColor[1] = this._currPickingColor[1];
946
- this._prevPickingColor[2] = this._currPickingColor[2];
1051
+ readPickingColor(x, y, outColor) {
1052
+ let w = this.pickingFramebuffer.width;
1053
+ let h = this.pickingFramebuffer.height;
947
1054
 
948
- var pc = this._currPickingColor;
949
- if (ts.x || ts.y) {
950
- this.pickingFramebuffer.activate();
951
- this.pickingFramebuffer.readPixels(pc, ts.nx, 1.0 - ts.ny);
952
- this.pickingFramebuffer.deactivate();
953
- } else {
954
- this.pickingFramebuffer.activate();
955
- this.pickingFramebuffer.readPixels(pc, ms.nx, 1.0 - ms.ny);
956
- this.pickingFramebuffer.deactivate();
957
- }
958
- }
1055
+ x = Math.round(x * w);
1056
+ y = Math.round(y * h);
1057
+
1058
+ let ind = (y * w + x) * 4;
1059
+
1060
+ outColor[0] = this._tempPickingPix_[ind];
1061
+ outColor[1] = this._tempPickingPix_[ind + 1];
1062
+ outColor[2] = this._tempPickingPix_[ind + 2];
1063
+ }
1064
+
1065
+ readDistanceColor(x, y, outColor) {
1066
+
1067
+ let w = this.distanceFramebuffer.width;
1068
+ let h = this.distanceFramebuffer.height;
1069
+
1070
+ x = Math.round(x * w);
1071
+ y = Math.round(y * h);
1072
+
1073
+ let ind = (y * w + x) * 4;
1074
+
1075
+ outColor[0] = this._tempDistancePix_[ind];
1076
+ outColor[1] = this._tempDistancePix_[ind + 1];
1077
+ outColor[2] = this._tempDistancePix_[ind + 2];
959
1078
  }
960
1079
 
961
1080
  /**
@@ -16,6 +16,20 @@ const LB_M = 0b0001;
16
16
  const RB_M = 0b0010;
17
17
  const MB_M = 0b0100;
18
18
 
19
+ /**
20
+ * Stores current picking rgb color.
21
+ * @private
22
+ * @type {Array.<number>} - (exactly 3 entries)
23
+ */
24
+ let _currPickingColor = new Uint8Array(4);
25
+
26
+ /**
27
+ * Stores previous picked rgb color.
28
+ * @private
29
+ * @type {Array.<number>} - (exactly 3 entries)
30
+ */
31
+ let _prevPickingColor = new Uint8Array(4);
32
+
19
33
  /**
20
34
  * Renderer events handler.
21
35
  * @class
@@ -231,10 +245,11 @@ class RendererEvents extends Events {
231
245
  this.touchState.x,
232
246
  this.touchState.y
233
247
  );
234
- this.entityPickingEvents();
248
+
235
249
  this._keyboardHandler.handleEvents();
236
250
  this.handleMouseEvents();
237
251
  this.handleTouchEvents();
252
+ this.entityPickingEvents();
238
253
  }
239
254
  }
240
255
 
@@ -591,27 +606,37 @@ class RendererEvents extends Events {
591
606
  * @private
592
607
  */
593
608
  entityPickingEvents() {
594
- var ts = this.touchState,
609
+ let ts = this.touchState,
595
610
  ms = this.mouseState;
596
611
 
597
612
  if (!(ms.leftButtonHold || ms.rightButtonHold || ms.middleButtonHold)) {
598
- var r = this.renderer;
599
613
 
600
- var o = r.colorObjects;
614
+ let r = this.renderer;
615
+ let o = r.colorObjects;
616
+ let c = _currPickingColor,
617
+ p = _prevPickingColor;
601
618
 
602
- var c = r._currPickingColor,
603
- p = r._prevPickingColor;
619
+ p[0] = c[0];
620
+ p[1] = c[1];
621
+ p[2] = c[2];
622
+
623
+ if (ts.x || ts.y) {
624
+ r.readPickingColor(ts.nx, 1 - ts.ny, c);
625
+ } else {
626
+ r.readPickingColor(ms.nx, 1 - ms.ny, c);
627
+ }
604
628
 
605
629
  ms.pickingObject = null;
606
630
  ts.pickingObject = null;
607
631
 
608
- var co = o && o[c[0] + "_" + c[1] + "_" + c[2]];
632
+ let co = o && o[c[0] + "_" + c[1] + "_" + c[2]];
609
633
 
610
634
  ms.pickingObject = co;
611
635
  ts.pickingObject = co;
612
636
 
613
637
  //object changed
614
638
  if (c[0] != p[0] || c[1] != p[1] || c[2] != p[2]) {
639
+
615
640
  //current black
616
641
  if (!(c[0] || c[1] || c[2])) {
617
642
  let po = o[p[0] + "_" + p[1] + "_" + p[2]];
@@ -638,7 +663,7 @@ class RendererEvents extends Events {
638
663
  }
639
664
 
640
665
  if (co) {
641
- var ce = co.rendererEvents;
666
+ let ce = co.rendererEvents;
642
667
  ms.pickingObject = co;
643
668
  ce && ce.dispatch(ce.mouseenter, ms);
644
669
  ts.pickingObject = co;
@@ -833,11 +858,11 @@ class RendererEvents extends Events {
833
858
  var r = this.renderer;
834
859
 
835
860
  r.pickingFramebuffer.activate();
836
- r.pickingFramebuffer.readPixels(r._currPickingColor, ts.nx, 1.0 - ts.ny, 1);
861
+ r.pickingFramebuffer.readPixels(_currPickingColor, ts.nx, 1.0 - ts.ny, 1);
837
862
  r.pickingFramebuffer.deactivate();
838
863
 
839
864
  var o = r.colorObjects;
840
- var c = r._currPickingColor;
865
+ var c = _currPickingColor;
841
866
  var co = o[c[0] + "_" + c[1] + "_" + c[2]];
842
867
  tpo = ts.pickingObject = co;
843
868
  if (tpo) {
@@ -4,8 +4,8 @@
4
4
 
5
5
  'use strict';
6
6
 
7
- import { RenderNode } from './RenderNode.js';
8
7
  import { Program } from '../webgl/Program.js';
8
+ import { RenderNode } from './RenderNode.js';
9
9
 
10
10
  class Axes extends RenderNode {
11
11
  constructor(size) {
@@ -75,4 +75,4 @@ class Axes extends RenderNode {
75
75
  }
76
76
  }
77
77
 
78
- export { Axes };
78
+ export { Axes };