xzw 8 месяцев назад
Родитель
Сommit
3bc9d16aa4
2 измененных файлов с 128 добавлено и 98 удалено
  1. 127 97
      public/lib/potree/potree.js
  2. 1 1
      public/lib/potree/potree.js.map

+ 127 - 97
public/lib/potree/potree.js

@@ -20457,6 +20457,13 @@
 	        visibleNodes.push(node);
 	        /* level >= minLevel && */
 	        pointcloud.visibleNodes.push(node);
+	        if (Potree.sortNodesDis) {
+	          //add
+	          var nodePos = node.getBoundingSphere().center;
+	          var toCam = new Vector3().subVectors(nodePos, camObjPos);
+	          toCam.projectOnVector(camObjDir);
+	          node.disSqToCamZ_ = toCam.lengthSq();
+	        }
 	        if (node._transformVersion === undefined) {
 	          node._transformVersion = -1;
 	        }
@@ -20609,6 +20616,15 @@
 
 	  //add:
 	  Potree.numVisiblePoints = numVisiblePoints;
+	  if (Potree.sortNodesDis) {
+	    //let s = performance.now() 
+	    for (var _pointcloud7 of pointclouds) {
+	      _pointcloud7.visibleNodes.sort((a, b) => {
+	        return b.disSqToCamZ_ - a.disSqToCamZ_;
+	      });
+	    }
+	    //console.log(performance.now() - s)
+	  }
 	  return {
 	    visibleNodes: visibleNodes,
 	    numVisiblePoints: numVisiblePoints,
@@ -20693,10 +20709,10 @@
 	    }
 	    {
 	      // DEPTH PASS
-	      for (var _pointcloud7 of visiblePointClouds) {
-	        var octreeSize = _pointcloud7.pcoGeometry.boundingBox.getSize(new Vector3()).x;
-	        var material = originalMaterials.get(_pointcloud7);
-	        var _depthMaterial = this.depthMaterials.get(_pointcloud7);
+	      for (var _pointcloud8 of visiblePointClouds) {
+	        var octreeSize = _pointcloud8.pcoGeometry.boundingBox.getSize(new Vector3()).x;
+	        var material = originalMaterials.get(_pointcloud8);
+	        var _depthMaterial = this.depthMaterials.get(_pointcloud8);
 	        _depthMaterial.size = material.size;
 	        _depthMaterial.minSize = material.minSize;
 	        _depthMaterial.maxSize = material.maxSize;
@@ -20708,7 +20724,7 @@
 	        _depthMaterial.screenHeight = height;
 	        _depthMaterial.uniforms.visibleNodes.value = material.visibleNodesTexture;
 	        _depthMaterial.uniforms.octreeSize.value = octreeSize;
-	        _depthMaterial.spacing = _pointcloud7.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());
+	        _depthMaterial.spacing = _pointcloud8.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());
 	        _depthMaterial.classification = material.classification;
 	        _depthMaterial.uniforms.classificationLUT.value.image.data = material.uniforms.classificationLUT.value.image.data;
 	        _depthMaterial.classificationTexture.needsUpdate = true;
@@ -20720,7 +20736,7 @@
 	        _depthMaterial.clipMethod = material.clipMethod;
 	        _depthMaterial.setClipBoxes(material.clipBoxes);
 	        _depthMaterial.setClipPolygons(material.clipPolygons);
-	        _pointcloud7.material = _depthMaterial;
+	        _pointcloud8.material = _depthMaterial;
 	      }
 	      viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, params.rtEDL || this.rtDepth, {
 	        clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume)
@@ -20728,10 +20744,10 @@
 	    }
 	    {
 	      // ATTRIBUTE PASS
-	      for (var _pointcloud8 of visiblePointClouds) {
-	        var _octreeSize = _pointcloud8.pcoGeometry.boundingBox.getSize(new Vector3()).x;
-	        var _material = originalMaterials.get(_pointcloud8);
-	        var _attributeMaterial = this.attributeMaterials.get(_pointcloud8);
+	      for (var _pointcloud9 of visiblePointClouds) {
+	        var _octreeSize = _pointcloud9.pcoGeometry.boundingBox.getSize(new Vector3()).x;
+	        var _material = originalMaterials.get(_pointcloud9);
+	        var _attributeMaterial = this.attributeMaterials.get(_pointcloud9);
 	        _attributeMaterial.size = _material.size;
 	        _attributeMaterial.minSize = _material.minSize;
 	        _attributeMaterial.maxSize = _material.maxSize;
@@ -20744,7 +20760,7 @@
 	        _attributeMaterial.shape = PointShape.CIRCLE;
 	        _attributeMaterial.uniforms.visibleNodes.value = _material.visibleNodesTexture;
 	        _attributeMaterial.uniforms.octreeSize.value = _octreeSize;
-	        _attributeMaterial.spacing = _pointcloud8.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());
+	        _attributeMaterial.spacing = _pointcloud9.pcoGeometry.spacing; // * Math.max(...pointcloud.scale.toArray());
 	        _attributeMaterial.classification = _material.classification;
 	        _attributeMaterial.uniforms.classificationLUT.value.image.data = _material.uniforms.classificationLUT.value.image.data;
 	        _attributeMaterial.classificationTexture.needsUpdate = true;
@@ -20775,7 +20791,7 @@
 	        _attributeMaterial.clipMethod = _material.clipMethod;
 	        _attributeMaterial.setClipBoxes(_material.clipBoxes);
 	        _attributeMaterial.setClipPolygons(_material.clipPolygons);
-	        _pointcloud8.material = _attributeMaterial;
+	        _pointcloud9.material = _attributeMaterial;
 	      }
 	      var gl = this.gl;
 
@@ -20788,8 +20804,8 @@
 	        depthWrite: false
 	      });
 	    }
-	    for (var [_pointcloud9, _material2] of originalMaterials) {
-	      _pointcloud9.material = _material2;
+	    for (var [_pointcloud10, _material2] of originalMaterials) {
+	      _pointcloud10.material = _material2;
 	    }
 	    if (viewer.background === "skybox") {
 	      viewer.renderer.setClearColor(0x000000, 0);
@@ -33981,9 +33997,17 @@
 	      if (params.notAdditiveBlending) {
 	        gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); //NormalBlending 
 	        /* gl.enable(gl.DEPTH_TEST);
-	        gl.depthMask(true); //如果不开启depthWrite, 深度会错乱。  */ //无解
-	        gl.disable(gl.DEPTH_TEST);
-	        gl.depthMask(true);
+	         gl.depthMask(true); //如果不开启depthWrite, 深度会错乱。  */ //无解
+	        /* gl.disable(gl.DEPTH_TEST);
+	        gl.depthMask(true);  //depthWrite */
+	        gl.enable(gl.DEPTH_TEST);
+	        gl.depthMask(false);
+	        /* gl.enable(gl.DEPTH_TEST);
+	        gl.depthMask(true); */
+
+	        /* 几种选择:
+	         1 都开启: 当opacity很小时发黑且遮住其他透明物体 
+	         2 开启depthTest关闭depthWrite 自己深度错乱,前排挡不住后排 */
 	      } else {
 	        gl.blendFunc(gl.SRC_ALPHA, gl.ONE); //AdditiveBlending   原本
 	        gl.disable(gl.DEPTH_TEST);
@@ -41603,9 +41627,7 @@
 	        this.setSelected(false, 'edgeLabel');
 	      });
 	      edgeLabel.addEventListener('click', e => {
-	        //setTimeout(()=>{
-	        this.isNew || viewer.measuringTool.isAdding || e.button == MOUSE.LEFT || viewer.focusOnObject(this, 'measure');
-	        //},1)//延时是因为(点右键)刚结束绘制会触发
+	        this.isNew || viewer.measuringTool.isAdding || e.button == MOUSE.LEFT && viewer.focusOnObject(this, 'measure');
 	      });
 	    }
 	    edgeLabel.visible = false;
@@ -42301,8 +42323,7 @@
 	        this.edge.addEventListener('mouseleave', mouseleave);
 	        this.edge.addEventListener('click', e => {
 	          var now = Date.now();
-	          if (now - this.lastDropTime < 100 || this.isNew || e.button !== MOUSE.LEFT) return; //防止拖拽marker时误触导致focus, 以及点到marker不focus
-
+	          if (now - this.lastDropTime < 100 || this.isNew || e.button !== MOUSE.LEFT) return;
 	          if (this.addOrRemovePoint) {
 	            viewer.measuringTool.history.beforeChange(this);
 	            var prevIndex = Math.floor(e.hoveredElement.faceIndex / 2); //端点1(可能是最后一个)
@@ -57634,18 +57655,16 @@
 	      if (rtEDL) {
 	        //借用rtEDL存储深度信息  
 	        renderer.setRenderTarget(rtEDL);
-	        if (visiblePointClouds2.length > 0) {
-	          //渲染scenePointCloud到rtEDL
-	          pRenderer.render(viewer.scene.scenePointCloud, camera, rtEDL, {
-	            shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
-	            clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume$1),
-	            transparent: true,
-	            //如果点云透明需要透明
-	            notAdditiveBlending: Potree.settings.notAdditiveBlending
-	          });
-	        }
-	        if (Potree.settings.intersectOnObjs) {
+	        var renderModel = renderBeforeCloud => {
 	          // model也要渲染到rtEDL
+	          if (!Potree.settings.intersectOnObjs) return;
+	          viewer.objs.traverse(object => {
+	            if (object.material) {
+	              var transparent = object.material.opacity < 1 || object.material.mapTransparent || !object.material.depthTest || !object.material.depthWrite; //不写入深度的往往最后来比较
+	              Potree.Utils.updateVisible(object, 'renderOpa', renderBeforeCloud != transparent);
+	              //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。  depthTest==false的也最后渲染。 mapTransparent是手动加的,代表确定该贴图含有透明部分,即使opacity为1
+	            }
+	          }); //ground的材质中opacity为1,所以被当做不透明了
 	          Potree.Utils.setCameraLayers(camera, ['model', 'light']);
 	          viewer.objs.traverse(e => {
 	            if (e.material) e._OlddepthWrite = e.material.depthWrite, e.material.depthWrite = true;
@@ -57655,7 +57674,19 @@
 	            if (e.material) e.material.depthWrite = e._OlddepthWrite;
 	          });
 	          //缺点:半透明的model 就算完全透明, 也会遮住测量线
+	        };
+	        renderModel(true);
+	        if (visiblePointClouds2.length > 0) {
+	          //渲染scenePointCloud到rtEDL
+	          pRenderer.render(viewer.scene.scenePointCloud, camera, rtEDL, {
+	            shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
+	            clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume$1),
+	            transparent: true,
+	            //如果点云透明需要透明
+	            notAdditiveBlending: Potree.settings.notAdditiveBlending
+	          });
 	        }
+	        renderModel(false);
 	      }
 	    }
 
@@ -57669,42 +57700,44 @@
 	      //放大镜显示点云
 	      e.visible = e.oldVisi;
 	    });
-	    if (showPointClouds) {
+	    {
 	      //绘制点云到画布
 	      if (useEDL) {
 	        //设置edlMaterial  //Features.EXT_DEPTH不支持的话不会到这一块
-
-	        var uniforms = this.edlMaterial.uniforms;
-	        uniforms.resolution.value.copy(resolution);
-	        uniforms.edlStrength.value = viewer.edlStrength;
-	        uniforms.radius.value = viewer.edlRadius;
-	        uniforms.useEDL.value = 1; //add
-
-	        var proj = camera.projectionMatrix;
-	        var projArray = new Float32Array(16);
-	        projArray.set(proj.elements);
-	        uniforms.uProj.value = projArray;
-	        uniforms.uEDLColor.value = rtEDL.texture;
-	        uniforms.opacity.value = viewer.edlOpacity; // HACK 
-
-	        Utils.screenPass.render(renderer, this.edlMaterial, target); //相当于一个描边后期特效。 缺点: 因为target上的没有抗锯齿,所以点云在晃动镜头时会不稳定地闪烁1px位置。优点:比不打开edl少绘制一次点云,更流畅了?!
+	        if (showPointClouds) {
+	          var uniforms = this.edlMaterial.uniforms;
+	          uniforms.resolution.value.copy(resolution);
+	          uniforms.edlStrength.value = viewer.edlStrength;
+	          uniforms.radius.value = viewer.edlRadius;
+	          uniforms.useEDL.value = 1; //add
+
+	          var proj = camera.projectionMatrix;
+	          var projArray = new Float32Array(16);
+	          projArray.set(proj.elements);
+	          uniforms.uProj.value = projArray;
+	          uniforms.uEDLColor.value = rtEDL.texture;
+	          uniforms.opacity.value = viewer.edlOpacity; // HACK 
+
+	          Utils.screenPass.render(renderer, this.edlMaterial, target); //相当于一个描边后期特效。 缺点: 因为target上的没有抗锯齿,所以点云在晃动镜头时会不稳定地闪烁1px位置。优点:比不打开edl少绘制一次点云,更流畅了?!
+	        }
 	      } else if (Potree.settings.useRTPoint && rtEDL && visiblePointClouds2.every(e => e.material.opacity >= 1)) {
-	        //半透明点云在clearAlpha为非1的状态下截图 或 在useRTPoints时绘制到屏幕上透明度不对,亮度变低 。 只能在半透明时关闭一下useRTPoint
+	        //半透明点云在clearAlpha为非1的状态下截图 或 在useRTPoints时绘制到屏幕上透明度不对,亮度变低 。还会遮住别的半透明物体。 只能在半透明时关闭一下useRTPoint
 	        this.recoverToScreenMat.uniforms.tDiffuse.value = rtEDL.texture;
 	        if (this.recoverToScreenMat.defines.useDepth) {
 	          this.recoverToScreenMat.uniforms.depthTex.value = rtEDL.depthTexture;
 	        }
-	        Utils.screenPass.render(renderer, this.recoverToScreenMat, target /* , Potree.settings.useFxaa && viewer.composer2 */);
 	        params.drawedModelOnRT = Potree.settings.intersectOnObjs;
+	        Utils.screenPass.render(renderer, this.recoverToScreenMat, target /* , Potree.settings.useFxaa && viewer.composer2 */);
 	      } else {
 	        //渲染点云 (直接用rtEDL上的会失去抗锯齿, 导致频闪、密集时出现条纹,  自己写抗锯齿也要渲染好几次。另外透明度也要处理下) 
-
-	        var prop = {
-	          shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
-	          clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume$1),
-	          notAdditiveBlending: Potree.settings.notAdditiveBlending //add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
-	        };
-	        pRenderer.render(viewer.scene.scenePointCloud, camera, null, prop);
+	        if (showPointClouds) {
+	          var prop = {
+	            shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
+	            clipSpheres: viewer.scene.volumes.filter(v => v instanceof SphereVolume$1),
+	            notAdditiveBlending: Potree.settings.notAdditiveBlending //add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
+	          };
+	          pRenderer.render(viewer.scene.scenePointCloud, camera, null, prop);
+	        }
 	      }
 	    }
 	    visiblePointClouds2.forEach(e => {
@@ -70271,6 +70304,7 @@
 	    return models.find(e => e.dataset_id == id);
 	  },
 	  changeModelPointCount(object, type) {
+	    if (object.fileType == '3dTiles' || object.isPointcloud) return;
 	    var posCount, texArea;
 	    if (type == 'add') {
 	      var o = viewer.getObjectPointCount(object);
@@ -70290,9 +70324,8 @@
 	            this.updateMemoryUsage()
 	        },{once:true})  
 	    }) */
-	    if (model.fileType != '3dTiles') {
-	      this.changeModelPointCount(model, 'add');
-	    }
+
+	    this.changeModelPointCount(model, 'add');
 	    this.updateMemoryUsage();
 	  },
 	  removeModel(model) {
@@ -70325,9 +70358,7 @@
 	        }
 	      });
 	    }
-	    if (model.fileType != '3dTiles') {
-	      this.changeModelPointCount(model, 'sub');
-	    }
+	    this.changeModelPointCount(model, 'sub');
 	    this.updateMemoryUsage();
 	  },
 	  selectModel(model) {
@@ -83382,39 +83413,6 @@
 	      viewer: viewer
 	    });
 	  }
-	  createHackMesh() {
-	    //为了防止无depthTex的全景在pick点云时画面中仅有一个材质时会黑屏,所以在镜头前再加一个mesh。具体bug表现见bug记录。 
-	    if (this.scene.pointclouds.every(e => e.hasDepthTex) || viewer.images360.panos.length == 0) return;
-	    var mesh = new Mesh(viewer.images360.panos[0].marker.geometry, new MeshBasicMaterial({
-	      color: "#F00",
-	      side: 2 /* ,depthTest:false */
-	    }));
-	    Potree.Utils.updateVisible(mesh, 'show', false);
-	    this.images360.node.add(mesh);
-	    var updatePos = () => {
-	      var dir = this.mainViewport.view.direction;
-	      var radius = this.images360.cube.scale.length();
-	      mesh.position.copy(this.mainViewport.view.position).add(dir.multiplyScalar(radius)); //放置skybox之外
-	    };
-	    this.addEventListener('camera_changed', e => {
-	      var _e$changeInfo, _e$changeInfo2;
-	      if (e.viewport.name == 'MainView' && Potree.settings.displayMode == 'showPanos' && !this.images360.currentPano.depthTex && ((_e$changeInfo = e.changeInfo) !== null && _e$changeInfo !== void 0 && _e$changeInfo.positionChanged || (_e$changeInfo2 = e.changeInfo) !== null && _e$changeInfo2 !== void 0 && _e$changeInfo2.quaternionChanged)) {
-	        updatePos();
-	      }
-	    });
-	    var judge = () => {
-	      var _this$images360$curre;
-	      if (!((_this$images360$curre = this.images360.currentPano) !== null && _this$images360$curre !== void 0 && _this$images360$curre.depthTex) && Potree.settings.displayMode == 'showPanos') {
-	        Potree.Utils.updateVisible(mesh, 'show', true);
-	      } else {
-	        Potree.Utils.updateVisible(mesh, 'show', false);
-	      }
-	    };
-	    this.images360.addEventListener('flyToPanoDone', judge);
-	    this.images360.addEventListener('endChangeMode', judge);
-
-	    //不知道如果用点云计算非当前视角下的block会不会黑闪,如热点遮挡计算
-	  }
 	  renderOverlay2(params) {
 	    //渲染剩余部分
 	    var renderer = params.renderer || this.renderer;
@@ -85155,7 +85153,39 @@
 	    var r = result[0];
 	    return r && r.score > 1 ? result[0].item : null;
 	  }
+	  createHackMesh() {
+	    //为了防止无depthTex的全景在pick点云时画面中仅有一个材质时会黑屏,所以在镜头前再加一个mesh。具体bug表现见bug记录。 
+	    if (this.scene.pointclouds.every(e => e.hasDepthTex) || viewer.images360.panos.length == 0) return;
+	    var mesh = new Mesh(viewer.images360.panos[0].marker.geometry, new MeshBasicMaterial({
+	      color: "#F00",
+	      side: 2 /* ,depthTest:false */
+	    }));
+	    Potree.Utils.updateVisible(mesh, 'show', false);
+	    this.images360.node.add(mesh);
+	    var updatePos = () => {
+	      var dir = this.mainViewport.view.direction;
+	      var radius = this.images360.cube.scale.length();
+	      mesh.position.copy(this.mainViewport.view.position).add(dir.multiplyScalar(radius)); //放置skybox之外
+	    };
+	    this.addEventListener('camera_changed', e => {
+	      var _e$changeInfo, _e$changeInfo2;
+	      if (e.viewport.name == 'MainView' && Potree.settings.displayMode == 'showPanos' && !this.images360.currentPano.depthTex && ((_e$changeInfo = e.changeInfo) !== null && _e$changeInfo !== void 0 && _e$changeInfo.positionChanged || (_e$changeInfo2 = e.changeInfo) !== null && _e$changeInfo2 !== void 0 && _e$changeInfo2.quaternionChanged)) {
+	        updatePos();
+	      }
+	    });
+	    var judge = () => {
+	      var _this$images360$curre;
+	      if (!((_this$images360$curre = this.images360.currentPano) !== null && _this$images360$curre !== void 0 && _this$images360$curre.depthTex) && Potree.settings.displayMode == 'showPanos') {
+	        Potree.Utils.updateVisible(mesh, 'show', true);
+	      } else {
+	        Potree.Utils.updateVisible(mesh, 'show', false);
+	      }
+	    };
+	    this.images360.addEventListener('flyToPanoDone', judge);
+	    this.images360.addEventListener('endChangeMode', judge);
 
+	    //不知道如果用点云计算非当前视角下的block会不会黑闪,如热点遮挡计算
+	  }
 	  /*  createRoomEv(){ 
 	      
 	      const environment = new RoomEnvironment();

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
public/lib/potree/potree.js.map