@openglobus/og 0.15.3 → 0.15.5

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 (71) hide show
  1. package/README.md +3 -7
  2. package/css/og.css +24 -15
  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 +1 -1
  9. package/src/og/Globe.js +4 -0
  10. package/src/og/LonLat.js +207 -193
  11. package/src/og/Object3d.js +1 -1
  12. package/src/og/camera/Camera.js +4 -16
  13. package/src/og/camera/PlanetCamera.js +12 -6
  14. package/src/og/control/DebugInfo.js +263 -165
  15. package/src/og/control/KeyboardNavigation.js +153 -169
  16. package/src/og/control/MouseNavigation.js +0 -20
  17. package/src/og/control/RulerSwitcher.js +4 -1
  18. package/src/og/control/SimpleNavigation.js +123 -128
  19. package/src/og/control/heightRuler/HeightRuler.js +12 -0
  20. package/src/og/control/heightRuler/HeightRulerScene.js +224 -0
  21. package/src/og/control/heightRuler/HeightRulerSwitcher.js +15 -0
  22. package/src/og/control/index.js +2 -0
  23. package/src/og/control/ruler/RulerScene.js +106 -79
  24. package/src/og/ellipsoid/Ellipsoid.js +20 -3
  25. package/src/og/entity/Entity.js +6 -6
  26. package/src/og/entity/EntityCollection.js +4 -0
  27. package/src/og/entity/GeoObjectHandler.js +3 -0
  28. package/src/og/layer/BaseGeoImage.js +152 -16
  29. package/src/og/layer/GeoImage.js +0 -91
  30. package/src/og/layer/GeoTexture2d.js +54 -143
  31. package/src/og/layer/GeoVideo.js +6 -107
  32. package/src/og/layer/Material.js +1 -1
  33. package/src/og/layer/Vector.js +8 -6
  34. package/src/og/layer/XYZ.js +2 -2
  35. package/src/og/quadTree/EntityCollectionNode.js +8 -2
  36. package/src/og/renderer/Renderer.js +91 -94
  37. package/src/og/renderer/RendererEvents.js +39 -23
  38. package/src/og/scene/BaseNode.js +113 -113
  39. package/src/og/scene/Planet.js +20 -13
  40. package/src/og/scene/RenderNode.js +42 -9
  41. package/src/og/segment/Segment.js +38 -45
  42. package/src/og/shaders/geoObject.js +12 -10
  43. package/src/og/shaders/pickingMask.js +1 -1
  44. package/src/og/utils/GeoImageCreator.js +61 -21
  45. package/src/og/utils/VectorTileCreator.js +32 -49
  46. package/src/og/webgl/Framebuffer.js +5 -0
  47. package/types/LonLat.d.ts +8 -0
  48. package/types/camera/PlanetCamera.d.ts +1 -1
  49. package/types/control/DebugInfo.d.ts +4 -0
  50. package/types/control/SimpleNavigation.d.ts +1 -0
  51. package/types/control/heightRuler/HeightRuler.d.ts +6 -0
  52. package/types/control/heightRuler/HeightRulerScene.d.ts +23 -0
  53. package/types/control/index.d.ts +2 -1
  54. package/types/control/ruler/RulerScene.d.ts +8 -5
  55. package/types/control/selection/SelectionScene.d.ts +0 -1
  56. package/types/ellipsoid/Ellipsoid.d.ts +13 -1
  57. package/types/entity/EntityCollection.d.ts +1 -0
  58. package/types/layer/BaseGeoImage.d.ts +17 -3
  59. package/types/layer/GeoImage.d.ts +0 -8
  60. package/types/layer/GeoTexture2d.d.ts +0 -2
  61. package/types/layer/GeoVideo.d.ts +0 -8
  62. package/types/layer/XYZ.d.ts +1 -1
  63. package/types/renderer/Renderer.d.ts +12 -3
  64. package/types/scene/Axes.d.ts +1 -1
  65. package/types/scene/BaseNode.d.ts +2 -2
  66. package/types/scene/Planet.d.ts +0 -5
  67. package/types/scene/RenderNode.d.ts +16 -9
  68. package/types/scene/SkyBox.d.ts +1 -1
  69. package/types/segment/Segment.d.ts +2 -3
  70. package/types/utils/VectorTileCreator.d.ts +1 -3
  71. package/types/webgl/Framebuffer.d.ts +1 -0
@@ -44,7 +44,7 @@ class XYZ extends Layer {
44
44
  * @param {string} name - Layer name.
45
45
  * @param {*} options
46
46
  */
47
- constructor(name, options) {
47
+ constructor(name, options = {}) {
48
48
  super(name, options);
49
49
 
50
50
  this.events.registerNames(EVENT_NAMES);
@@ -316,7 +316,7 @@ class XYZ extends Layer {
316
316
  clearMaterial(material) {
317
317
  if (material.isReady && material.textureExists) {
318
318
  !material.texture.default &&
319
- material.segment.handler.gl.deleteTexture(material.texture);
319
+ material.segment.handler.gl.deleteTexture(material.texture);
320
320
  material.texture = null;
321
321
 
322
322
  if (material.image) {
@@ -282,9 +282,15 @@ class EntityCollectionNode {
282
282
  }
283
283
 
284
284
  alignEntityToTheGround(entity, segment) {
285
- var res = new Vec3();
285
+ let res = new Vec3();
286
286
  segment.getEntityTerrainPoint(entity, res);
287
- entity._setCartesian3vSilent(res.addA(res.normal().scale((Number(this.layer.relativeToGround) && entity._altitude) || 0.0)));
287
+ let alt = (Number(this.layer.relativeToGround) && entity._altitude) || 0.0;
288
+ if (alt) {
289
+ let n = this.layer._planet.ellipsoid.getSurfaceNormal3v(res);
290
+ entity._setCartesian3vSilent(res.addA(n.scale(alt)));
291
+ } else {
292
+ entity._setCartesian3vSilent(res);
293
+ }
288
294
  }
289
295
 
290
296
  isVisible() {
@@ -61,8 +61,7 @@ let __distanceCallbackCounter__ = 0;
61
61
  let __resizeTimeout;
62
62
 
63
63
  class Renderer {
64
- constructor(handler, params) {
65
- params = params || {};
64
+ constructor(handler, params = {}) {
66
65
 
67
66
  /**
68
67
  * Div element with WebGL canvas. Assigned in Globe class.
@@ -139,7 +138,7 @@ class Renderer {
139
138
  * @public
140
139
  * @type {Object}
141
140
  */
142
- this.colorObjects = {};
141
+ this.colorObjects = new Map();
143
142
 
144
143
  /**
145
144
  * Color picking objects rendering queue.
@@ -214,11 +213,6 @@ class Renderer {
214
213
 
215
214
  this._entityCollections = [];
216
215
 
217
- if (params.autoActivate || isEmpty(params.autoActivate)) {
218
- this.initialize();
219
- this.start();
220
- }
221
-
222
216
  this._currentOutput = "screen";
223
217
 
224
218
  this._fnScreenFrame = null;
@@ -226,6 +220,11 @@ class Renderer {
226
220
  this.labelWorker = new LabelWorker(4);
227
221
 
228
222
  this.__useDistanceFramebuffer__ = true;
223
+
224
+ if (params.autoActivate || isEmpty(params.autoActivate)) {
225
+ this.initialize();
226
+ this.start();
227
+ }
229
228
  }
230
229
 
231
230
  /**
@@ -239,9 +238,7 @@ class Renderer {
239
238
  addDepthCallback(sender, callback) {
240
239
  var id = __depthCallbackCounter__++;
241
240
  this._depthCallbacks.push({
242
- id: id,
243
- callback: callback,
244
- sender: sender
241
+ id: id, callback: callback, sender: sender
245
242
  });
246
243
  return id;
247
244
  }
@@ -258,9 +255,7 @@ class Renderer {
258
255
  addDistanceCallback(sender, callback) {
259
256
  var id = __distanceCallbackCounter__++;
260
257
  this._distanceCallbacks.push({
261
- id: id,
262
- callback: callback,
263
- sender: sender
258
+ id: id, callback: callback, sender: sender
264
259
  });
265
260
  return id;
266
261
  }
@@ -284,9 +279,7 @@ class Renderer {
284
279
  addPickingCallback(sender, callback) {
285
280
  var id = __pickingCallbackCounter__++;
286
281
  this._pickingCallbacks.push({
287
- id: id,
288
- callback: callback,
289
- sender: sender
282
+ id: id, callback: callback, sender: sender
290
283
  });
291
284
  return id;
292
285
  }
@@ -304,8 +297,16 @@ class Renderer {
304
297
  }
305
298
  }
306
299
 
307
- getPickingObjectByColor(r, g, b) {
308
- return this.colorObjects[r + "_" + g + "_" + b];
300
+ getPickingObject(r, g, b) {
301
+ return this.colorObjects.get(`${r}_${g}_${b}`);
302
+ }
303
+
304
+ getPickingObjectArr(arr) {
305
+ return this.colorObjects.get(`${arr[0]}_${arr[1]}_${arr[2]}`);
306
+ }
307
+
308
+ getPickingObject3v(vec) {
309
+ return this.colorObjects.get(`${vec.x}_${vec.y}_${vec.z}`);
309
310
  }
310
311
 
311
312
  /**
@@ -317,11 +318,11 @@ class Renderer {
317
318
  if (!obj._pickingColor || obj._pickingColor.isZero()) {
318
319
  let r = 0, g = 0, b = 0;
319
320
  let str = "0_0_0";
320
- while (!(r || g || b) || this.colorObjects[str]) {
321
+ while (!(r || g || b) || this.colorObjects.has(str)) {
321
322
  r = randomi(1, 255);
322
323
  g = randomi(1, 255);
323
324
  b = randomi(1, 255);
324
- str = r + "_" + g + "_" + b;
325
+ str = `${r}_${g}_${b}`;
325
326
  }
326
327
 
327
328
  if (!obj._pickingColor) {
@@ -332,7 +333,7 @@ class Renderer {
332
333
 
333
334
  obj._pickingColorU = new Float32Array([r / 255, g / 255, b / 255]);
334
335
 
335
- this.colorObjects[str] = obj;
336
+ this.colorObjects.set(str, obj);
336
337
  }
337
338
  }
338
339
 
@@ -345,8 +346,7 @@ class Renderer {
345
346
  if (!obj._pickingColor.isZero()) {
346
347
  var c = obj._pickingColor;
347
348
  if (!c.isZero()) {
348
- this.colorObjects[c.x + "_" + c.y + "_" + c.z] = null;
349
- delete this.colorObjects[c.x + "_" + c.y + "_" + c.z];
349
+ this.colorObjects.delete(`${c.x}_${c.y}_${c.z}`);
350
350
  c.x = c.y = c.z = 0;
351
351
  }
352
352
  }
@@ -417,21 +417,17 @@ class Renderer {
417
417
  this._initialized = true;
418
418
  }
419
419
 
420
- var that = this;
421
-
422
420
  this.billboardsTextureAtlas.assignHandler(this.handler);
423
421
  this.geoObjectsTextureAtlas.assignHandler(this.handler);
424
422
 
425
423
  this.fontAtlas.assignHandler(this.handler);
426
424
 
427
- this.handler.setFrameCallback(function () {
428
- that.draw();
425
+ this.handler.setFrameCallback(() => {
426
+ this.draw();
429
427
  });
430
428
 
431
429
  this.activeCamera = new Camera(this, {
432
- eye: new Vec3(0, 0, 0),
433
- look: new Vec3(0, 0, -1),
434
- up: new Vec3(0, 1, 0)
430
+ eye: new Vec3(0, 0, 0), look: new Vec3(0, 0, -1), up: new Vec3(0, 1, 0)
435
431
  });
436
432
 
437
433
  this.events.initialize();
@@ -444,10 +440,7 @@ class Renderer {
444
440
  this.handler.addProgram(screenFrame());
445
441
 
446
442
  this.pickingFramebuffer = new Framebuffer(this.handler, {
447
- width: 640,
448
- height: 480,
449
- depthComponent: "DEPTH_STENCIL",
450
- renderbufferTarget: "DEPTH_STENCIL_ATTACHMENT"
443
+ width: 640, height: 480, depthComponent: "DEPTH_STENCIL", renderbufferTarget: "DEPTH_STENCIL_ATTACHMENT"
451
444
  }).init();
452
445
 
453
446
  this._tempPickingPix_ = new Uint8Array(this.pickingFramebuffer.width * this.pickingFramebuffer.height * 4);
@@ -495,10 +488,7 @@ class Renderer {
495
488
  this.handler.addPrograms([depth()]);
496
489
 
497
490
  this.sceneFramebuffer = new Multisample(this.handler, {
498
- size: 1,
499
- msaa: this._msaa,
500
- internalFormat: this._internalFormat,
501
- filter: "LINEAR"
491
+ size: 1, msaa: this._msaa, internalFormat: this._internalFormat, filter: "LINEAR"
502
492
  }).init();
503
493
 
504
494
  this.blitFramebuffer = new Framebuffer(this.handler, {
@@ -537,11 +527,7 @@ class Renderer {
537
527
  }, 320);
538
528
  };
539
529
 
540
- this.screenFramePositionBuffer = this.handler.createArrayBuffer(
541
- new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]),
542
- 2,
543
- 4
544
- );
530
+ this.screenFramePositionBuffer = this.handler.createArrayBuffer(new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), 2, 4);
545
531
 
546
532
  let temp = this.controls;
547
533
  this.controls = {};
@@ -656,11 +642,7 @@ class Renderer {
656
642
 
657
643
  getMaxMSAA(internalFormat) {
658
644
  var gl = this.handler.gl;
659
- let samples = gl.getInternalformatParameter(
660
- gl.RENDERBUFFER,
661
- gl[internalFormat],
662
- gl.SAMPLES
663
- );
645
+ let samples = gl.getInternalformatParameter(gl.RENDERBUFFER, gl[internalFormat], gl.SAMPLES);
664
646
  return samples[0];
665
647
  }
666
648
 
@@ -680,7 +662,40 @@ class Renderer {
680
662
  * @public
681
663
  * @param {Array<og.EntityCollection>} ec - Entity collection array.
682
664
  */
683
- _drawEntityCollections() {
665
+ _drawOpaqueEntityCollections() {
666
+ let ec = this._entityCollections;
667
+
668
+ if (ec.length) {
669
+ let gl = this.handler.gl;
670
+ gl.enable(gl.BLEND);
671
+ gl.blendEquation(gl.FUNC_ADD);
672
+ gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE);
673
+
674
+ //geoObject
675
+ let i = ec.length;
676
+ while (i--) {
677
+ let eci = ec[i];
678
+ if (ec[i]._fadingOpacity) {
679
+ eci.events.dispatch(eci.events.draw, eci);
680
+ ec[i].geoObjectHandler.draw();
681
+ }
682
+ }
683
+
684
+ // pointClouds pass
685
+ i = ec.length;
686
+ while (i--) {
687
+ ec[i]._fadingOpacity && ec[i].pointCloudHandler.draw();
688
+ }
689
+ }
690
+ }
691
+
692
+
693
+ /**
694
+ * Draws entity collections.
695
+ * @public
696
+ * @param {Array<og.EntityCollection>} ec - Entity collection array.
697
+ */
698
+ _drawTransparentEntityCollections() {
684
699
  let ec = this._entityCollections;
685
700
 
686
701
  if (ec.length) {
@@ -694,18 +709,14 @@ class Renderer {
694
709
  gl.activeTexture(gl.TEXTURE0);
695
710
  gl.bindTexture(gl.TEXTURE_2D, this.billboardsTextureAtlas.texture);
696
711
 
697
- var i = ec.length;
712
+ let i = ec.length;
698
713
  while (i--) {
699
714
  var eci = ec[i];
700
- if (eci._fadingOpacity) {
701
- // first begin draw event
702
- eci.events.dispatch(eci.events.draw, eci);
703
- eci.billboardHandler.draw();
704
- }
715
+ eci._fadingOpacity && eci.billboardHandler.draw();
705
716
  }
706
717
 
707
718
  // labels pass
708
- var fa = this.fontAtlas.atlasesArr;
719
+ let fa = this.fontAtlas.atlasesArr;
709
720
  for (i = 0; i < fa.length; i++) {
710
721
  gl.activeTexture(gl.TEXTURE0 + i);
711
722
  gl.bindTexture(gl.TEXTURE_2D, fa[i].texture);
@@ -716,12 +727,6 @@ class Renderer {
716
727
  ec[i]._fadingOpacity && ec[i].labelHandler.draw();
717
728
  }
718
729
 
719
- //geoObject
720
- i = ec.length;
721
- while (i--) {
722
- ec[i]._fadingOpacity && ec[i].geoObjectHandler.draw();
723
- }
724
-
725
730
  // rays
726
731
  i = ec.length;
727
732
  while (i--) {
@@ -734,29 +739,19 @@ class Renderer {
734
739
  ec[i]._fadingOpacity && ec[i].polylineHandler.draw();
735
740
  }
736
741
 
737
- // pointClouds pass
738
- i = ec.length;
739
- while (i--) {
740
- if (ec[i]._fadingOpacity) {
741
- ec[i].pointCloudHandler.draw();
742
- }
743
- }
744
-
745
742
  // Strip pass
746
743
  i = ec.length;
747
744
  while (i--) {
748
- if (ec[i]._fadingOpacity) {
749
- ec[i].stripHandler.draw();
750
- // post draw event
751
- eci.events.dispatch(eci.events.drawend, eci);
752
- }
745
+ ec[i]._fadingOpacity && ec[i].stripHandler.draw();
753
746
  }
754
-
755
- this._entityCollections.length = 0;
756
- this._entityCollections = [];
757
747
  }
758
748
  }
759
749
 
750
+ _clearEntityCollectionQueue() {
751
+ this._entityCollections.length = 0;
752
+ this._entityCollections = [];
753
+ }
754
+
760
755
  /**
761
756
  * Draw nodes.
762
757
  * @public
@@ -770,8 +765,7 @@ class Renderer {
770
765
  let sceneFramebuffer = this.sceneFramebuffer;
771
766
  sceneFramebuffer.activate();
772
767
 
773
- let h = this.handler,
774
- gl = h.gl;
768
+ let h = this.handler, gl = h.gl;
775
769
 
776
770
  gl.enable(gl.BLEND);
777
771
  gl.blendEquation(gl.FUNC_ADD);
@@ -789,15 +783,25 @@ class Renderer {
789
783
  // Rendering scene nodes and entityCollections
790
784
  let rn = this._renderNodesArr;
791
785
  let k = frustums.length;
786
+
792
787
  while (k--) {
793
788
  this.activeCamera.setCurrentFrustum(k);
794
789
  gl.clear(gl.DEPTH_BUFFER_BIT);
790
+
795
791
  let i = rn.length;
792
+ while (i--) {
793
+ rn[i].preDrawNode();
794
+ }
795
+
796
+ this._drawOpaqueEntityCollections();
797
+
798
+ i = rn.length;
796
799
  while (i--) {
797
800
  rn[i].drawNode();
798
801
  }
799
802
 
800
- this._drawEntityCollections();
803
+ this._drawTransparentEntityCollections();
804
+ this._clearEntityCollectionQueue();
801
805
 
802
806
  if (pointerEvent) {
803
807
  this._drawPickingBuffer();
@@ -832,9 +836,7 @@ class Renderer {
832
836
  _screenFrameMSAA() {
833
837
  var h = this.handler;
834
838
 
835
- var sh = h.programs.toneMapping,
836
- p = sh._program,
837
- gl = h.gl;
839
+ var sh = h.programs.toneMapping, p = sh._program, gl = h.gl;
838
840
 
839
841
  gl.disable(gl.DEPTH_TEST);
840
842
 
@@ -873,9 +875,7 @@ class Renderer {
873
875
  _screenFrameNoMSAA() {
874
876
 
875
877
  let h = this.handler;
876
- let sh = h.programs.screenFrame,
877
- p = sh._program,
878
- gl = h.gl;
878
+ let sh = h.programs.screenFrame, p = sh._program, gl = h.gl;
879
879
 
880
880
  gl.disable(gl.DEPTH_TEST);
881
881
  sh.activate();
@@ -910,8 +910,7 @@ class Renderer {
910
910
  //
911
911
  h.programs.pickingMask.activate();
912
912
  let sh = h.programs.pickingMask._program;
913
- let shu = sh.uniforms,
914
- sha = sh.attributes;
913
+ let shu = sh.uniforms, sha = sh.attributes;
915
914
 
916
915
  let /*ts = this.events.touchState,*/
917
916
  ms = this.events.mouseState;
@@ -941,8 +940,7 @@ class Renderer {
941
940
  gl.disable(gl.BLEND);
942
941
 
943
942
  let dp = this._pickingCallbacks;
944
- let i = dp.length;
945
- while (i--) {
943
+ for (let i = 0, len = dp.length; i < len; i++) {
946
944
  /**
947
945
  * This callback renders picking frame.
948
946
  * @callback og.Renderer~pickingCallback
@@ -1017,8 +1015,7 @@ class Renderer {
1017
1015
  //
1018
1016
  // PASS to depth visualization
1019
1017
  this.screenDepthFramebuffer.activate();
1020
- var sh = h.programs.depth,
1021
- p = sh._program;
1018
+ var sh = h.programs.depth, p = sh._program;
1022
1019
 
1023
1020
  gl = h.gl;
1024
1021
 
@@ -16,12 +16,19 @@ const LB_M = 0b0001;
16
16
  const RB_M = 0b0010;
17
17
  const MB_M = 0b0100;
18
18
 
19
+ let __skipFrames__ = 0;
20
+ const MAX_SKIP_FRAMES_ON_BLACK = 15;
21
+
22
+ const ISBLACK = (c) => !(c[0] || c[1] || c[2]);
23
+ const NOTBLACK = (c) => c[0] || c[1] || c[2];
24
+
19
25
  /**
20
26
  * Stores current picking rgb color.
21
27
  * @private
22
28
  * @type {Array.<number>} - (exactly 3 entries)
23
29
  */
24
30
  let _currPickingColor = new Uint8Array(4);
31
+ let _tempCurrPickingColor = new Uint8Array(4);
25
32
 
26
33
  /**
27
34
  * Stores previous picked rgb color.
@@ -612,34 +619,44 @@ class RendererEvents extends Events {
612
619
  if (!(ms.leftButtonHold || ms.rightButtonHold || ms.middleButtonHold)) {
613
620
 
614
621
  let r = this.renderer;
615
- let o = r.colorObjects;
616
622
  let c = _currPickingColor,
617
- p = _prevPickingColor;
623
+ p = _prevPickingColor,
624
+ t = _tempCurrPickingColor;
625
+
626
+ if (ts.x || ts.y) {
627
+ r.readPickingColor(ts.nx, 1 - ts.ny, t);
628
+ } else {
629
+ r.readPickingColor(ms.nx, 1 - ms.ny, t);
630
+ }
631
+
632
+ // current is black
633
+ if (ISBLACK(t) && __skipFrames__++ < MAX_SKIP_FRAMES_ON_BLACK) {
634
+ return;
635
+ }
636
+ __skipFrames__ = 0;
618
637
 
619
638
  p[0] = c[0];
620
639
  p[1] = c[1];
621
640
  p[2] = c[2];
622
641
 
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
- }
642
+ c[0] = t[0];
643
+ c[1] = t[1];
644
+ c[2] = t[2];
628
645
 
629
646
  ms.pickingObject = null;
630
647
  ts.pickingObject = null;
631
648
 
632
- let co = o && o[c[0] + "_" + c[1] + "_" + c[2]];
649
+ let co = r.getPickingObjectArr(c);
633
650
 
634
651
  ms.pickingObject = co;
635
652
  ts.pickingObject = co;
636
653
 
637
- //object changed
638
- if (c[0] != p[0] || c[1] != p[1] || c[2] != p[2]) {
654
+ //object is changed
655
+ if (c[0] !== p[0] || c[1] !== p[1] || c[2] !== p[2]) {
639
656
 
640
- //current black
641
- if (!(c[0] || c[1] || c[2])) {
642
- let po = o[p[0] + "_" + p[1] + "_" + p[2]];
657
+ //current is black
658
+ if (ISBLACK(c)) {
659
+ let po = r.getPickingObjectArr(p);
643
660
  if (po) {
644
661
  let pe = po.rendererEvents;
645
662
  ms.pickingObject = po;
@@ -648,11 +665,11 @@ class RendererEvents extends Events {
648
665
  pe && pe.dispatch(pe.touchleave, ts);
649
666
  }
650
667
  } else {
651
- //current not black
668
+ //current ia not black
652
669
 
653
- //previous not black
654
- if (p[0] || p[1] || p[2]) {
655
- let po = o[p[0] + "_" + p[1] + "_" + p[2]];
670
+ //previous is not black
671
+ if (NOTBLACK(p)) {
672
+ let po = r.getPickingObjectArr(p);
656
673
  if (po) {
657
674
  let pe = po.rendererEvents;
658
675
  ms.pickingObject = po;
@@ -844,9 +861,9 @@ class RendererEvents extends Events {
844
861
  * @private
845
862
  */
846
863
  handleTouchEvents() {
847
- var ts = this.touchState;
864
+ let ts = this.touchState;
848
865
 
849
- var tpo = ts.pickingObject,
866
+ let tpo = ts.pickingObject,
850
867
  tpe = null;
851
868
 
852
869
  if (ts.touchCancel) {
@@ -855,15 +872,14 @@ class RendererEvents extends Events {
855
872
  }
856
873
 
857
874
  if (ts.touchStart) {
858
- var r = this.renderer;
875
+ let r = this.renderer;
859
876
 
860
877
  r.pickingFramebuffer.activate();
861
878
  r.pickingFramebuffer.readPixels(_currPickingColor, ts.nx, 1.0 - ts.ny, 1);
862
879
  r.pickingFramebuffer.deactivate();
863
880
 
864
- var o = r.colorObjects;
865
- var c = _currPickingColor;
866
- var co = o[c[0] + "_" + c[1] + "_" + c[2]];
881
+ let c = _currPickingColor;
882
+ let co = r.getPickingObjectArr(c);
867
883
  tpo = ts.pickingObject = co;
868
884
  if (tpo) {
869
885
  tpe = tpo.rendererEvents;