Browse Source

Merge branch 'master' of http://192.168.0.115:3000/4dkankan/4dkankan_bim

rindy 2 years ago
parent
commit
a4414c8aa2

+ 393 - 156
public/static/lib/potree/potree.js

@@ -793,7 +793,7 @@
         intersectOnObjs:false,
         intersectWhenHover:true,
 
-
+        notAdditiveBlending:false, //点云是否使用普通的blend, 否则会曝光过渡
         precision:2  // 两位小数
     };
      
@@ -63893,19 +63893,7 @@ void main() {
                 if(prop.scale){
                     model.scale.set(prop.scale,prop.scale,prop.scale);
                 }
-                 
-                
-                if(prop.isFirstLoad){
-                    modelEditing = model;
-                    //MergeEditor.setModelBtmHeight(model, 0) //默认离地高度为0
-                    viewer.addEventListener('global_mousemove', moveModel); 
-                    viewer.addEventListener('global_click', confirmPos, 3);
-                }else {
-                    //MergeEditor.setModelBtmHeight(model, prop.bottom || 0) //默认离地高度为0
-                    modelEditing = null;
-                }
-                
-                
+                  
                 if(model.isPointcloud){
                     model.renderOrder = Potree.config.renderOrders.model;  //same as glb
                 }
@@ -63971,9 +63959,37 @@ void main() {
                 
                 MergeEditor.getBoundCenter(model); //初始化
                 model.lastMatrixWorld = model.matrixWorld.clone();
-                done(model);
+                
+                done(model); // 先发送成功,因为2d界面会随机执行changePosition等初始化,然后这边再将模型移到中心地面上
+                
+                
+                if(prop.isFirstLoad){
+                    
+                    MergeEditor.moveBoundCenterTo(model, new Vector3(0,0,0));  
+                    MergeEditor.setModelBtmHeight(model, 0); //初始加载设置离地高度为0
+                    
+                    if(prop.mode != 'single'){//如果不是模型展示页,模型会随着鼠标位置移动
+                        viewer.addEventListener('global_mousemove', moveModel); 
+                        viewer.addEventListener('global_click', confirmPos, 3);
+                        modelEditing = model;
+                    }
+                    model.dispatchEvent("position_changed"); 
+                }else {
+                    //MergeEditor.setModelBtmHeight(model, prop.bottom || 0) //默认离地高度为0
+                    modelEditing = null;
+                }
+                
+                
+                
+                
             };
             
+            
+            
+            
+            
+            
+            
             if(prop.type == 'glb'){
                 
                 
@@ -71846,7 +71862,7 @@ void main() {
 
     			let node = stack.pop();
 
-    			if (node instanceof PointCloudTree) {
+    			if (node instanceof PointCloudTree) { 
     				octrees.push(node);
     				continue;
     			}
@@ -72385,12 +72401,15 @@ void main() {
                 
                 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,深度会错乱。 
                 }else {
                     gl.blendFunc(gl.SRC_ALPHA, gl.ONE); //AdditiveBlending   原本
-                }
+                    gl.disable(gl.DEPTH_TEST);
+                    gl.depthMask(false);
+                } 
+    			
     			
-    			gl.depthMask(false);
-    			gl.disable(gl.DEPTH_TEST);
     		} else {
     			gl.disable(gl.BLEND);
     			gl.depthMask(true);
@@ -72733,11 +72752,42 @@ void main() {
     		// camera.matrixWorldInverse.invert(camera.matrixWorld);
 
     		const traversalResult = this.traverse(scene);
-
-
+            
+            //排序
+            if(Potree.settings.notAdditiveBlending){//add 
+                
+                traversalResult.octrees.forEach(tree=>{
+                    if(tree.material.opacity==1){
+                        tree._z = Infinity; //不透明的先渲染
+                    }else {
+                        let center = tree.boundCenter ? tree.boundCenter.clone() : tree.boundingBox.getCenter(tree.boundCenter).applyMatrix4(tree.matrixWorld); 
+                        center.project(camera); 
+                        tree._z = center.z; 
+                    }
+                });   
+                     
+                traversalResult.octrees.sort((tree1,tree2)=>{ 
+                    return tree2._z - tree1._z //降序  (-1 朝外)。 离屏幕近的后渲染
+                });
+            }
+            
+            
+            
+            
     		// RENDER
     		for (const octree of traversalResult.octrees) {
     			let nodes = octree.visibleNodes;
+                
+                
+                
+                /* nodes.sort((node1,node2)=>{//姑且
+                    
+                    let center = node.getBoundingSphere().center.clone().applyMatrix4(octree.matrixWorld)
+                    return  
+                    
+                    
+                }) */
+                
     			this.renderOctree(octree, nodes, camera, target, params);
     		}
 
@@ -74989,7 +75039,7 @@ void main() {
                     percent = 0;
                     hasPlayedTime += e.delta;
                     transitionRatio = startTransitionRatio;
-                    console.log('延迟开始'); 
+                    //console.log('延迟开始') 
                     if(hasPlayedTime > startDelay){
                         tStart = performance.now(); 
                     }
@@ -75024,7 +75074,7 @@ void main() {
                         this.pause();
                     }else { 
                         hasStoppedTime += e.delta;
-                        console.log('延迟结束'); 
+                        //console.log('延迟结束') 
                     }
                     
     			}
@@ -78445,7 +78495,7 @@ void main() {
             
             viewer.setCameraLayers(o.camera, ['measure']);
     		
-            if(o.screenshot){ //抗锯齿
+            if(o.screenshot && this.viewer.ssaaRenderPass.enabled){ //抗锯齿
                 this.viewer.ssaaRenderPass.sampleLevel = 4;
                 this.viewer.composer.render(this.scene, o.camera );  
                 /* viewer.scene.measurements.forEach(e=>{ //隐藏除了label以外的
@@ -80112,7 +80162,7 @@ void main() {
                 this.dom = $('<div name="compass"></div>');
                 $(viewer.renderArea).append(this.dom);
             } 
-            this.dom.css({ display:"none",  position:"absolute",right:"2%",top: "4%",width:width+"px",height:height+"px", "z-index":100,"pointer-events":"none" });
+            this.dom.css({ display:"none",  position:"absolute",right:"1%",top: "60px",width:width+"px",height:height+"px", "z-index":100,"pointer-events":"none" });
 
             let child = $("<div class='dirText north'><span>"+/* (config.lang=='zh'? */'北'/* :'N') */+"</span></div><div class='center'></div>");
             this.dom.append(child);  
@@ -80174,7 +80224,7 @@ void main() {
             }
             
             this.dom.find(".center")[0].appendChild(this.renderer.domElement);
-            
+            this.renderer.domElement.style.width = this.renderer.domElement.style.height = '100%';
             
             
             this.camera = new PerspectiveCamera;
@@ -80222,7 +80272,7 @@ void main() {
                 set(1,color1); set(5,color1);set(6,color1);
                 set(2,mid); set(3,mid);set(7,mid);
                 set(4,color2); set(8,color2);set(9,color2);
-                geometry.addAttribute("color", new BufferAttribute(new Float32Array(colors), 3));  
+                geometry.setAttribute("color", new BufferAttribute(new Float32Array(colors), 3));  
             };
             var blue1 = [1/255,238/255,245/255]; //逐渐变深
             var blue2 = [20/255,146/255,170/255];
@@ -80332,7 +80382,14 @@ void main() {
              var dir = this.viewport.view.direction;  //相机朝向
              this.camera.position.copy(dir.multiplyScalar(radius).negate());  //相机绕着指南针中心(000)转动
         } 
-        
+
+        changeViewport(viewport){
+            this.viewport = viewport;
+            this.update(); //因相机更新了
+        }
+
+
+
         render(){
             this.renderer.render(this.scene, this.camera);
         }
@@ -80353,12 +80410,13 @@ void main() {
              
         }
         
+        
+        
         setDomPos(){
             if(!this.viewport)return
             let right = this.viewport.left + this.viewport.width;
-            this.dom.css({'right':((1-right)*100 + 2) + '%'});
-            
-            //this.dom.css({'right':'none','left':config.isMobile? "1%" : "2%"})
+            this.dom.css({'right':((1-right)*100 + 1) + '%'});
+             
         }
         
     }
@@ -80848,7 +80906,10 @@ void main() {
                     } 
                     if(Potree.settings.intersectOnObjs){// model也要渲染到rtEDL
                         camera.layers.set(Potree.config.renderLayers.model);
+                        viewer.objs.traverse(e=>{if(e.material)e._OlddepthWrite = e.material.depthWrite, e.material.depthWrite = true;}); //否则半透明的mesh无法遮住测量线
                         viewer.renderer.render(viewer.scene.scene, camera);
+                        viewer.objs.traverse(e=>{if(e.material)e.material.depthWrite = e._OlddepthWrite;});
+                        //缺点:半透明的model 就算完全透明, 也会遮住测量线
                     }
                     //test
                     /* {
@@ -80913,14 +80974,12 @@ void main() {
                 }else {
                     //渲染点云 (直接用rtEDL上的会失去抗锯齿)
                     
-                    let prop =   {
-                            shadowMaps:  lights.length > 0 ? [this.shadowMap] : null,
-                            clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)) 
-                        };
-                    if(Potree.settings.editType == 'merge'){//add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
-                        prop.depthTest = prop.depthWrite = true;
-                        prop.notAdditiveBlending = true;
-                    } 
+                    let prop = {
+                        shadowMaps:  lights.length > 0 ? [this.shadowMap] : null,
+                        clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)) ,
+                        notAdditiveBlending: Potree.settings.notAdditiveBlending//add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
+                    };
+                     
                     viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null , prop);  
                 }
             }        
@@ -81527,15 +81586,9 @@ void main() {
             };
             
             let endPosition = new Vector3().copy(info.position);
-    	 
-            const startPosition = this.position.clone();
-    		const startTarget = this.getPivot();
-            let startQuaternion = math.getQuaFromPosAim(startPosition,startTarget);
-            
-    		let endTarget = null, endQuaternion ;
-            
-            
-            
+            let startPosition = this.position.clone();
+    		let startQuaternion, endQuaternion, endTarget = null ;
+             
             
     		if(info.target ){
     			endTarget = new Vector3().copy(info.target);  
@@ -81544,7 +81597,14 @@ void main() {
                 endQuaternion = info.quaternion.clone();
             }
              
-             
+            if(endQuaternion){
+                startQuaternion = new Quaternion().setFromEuler(this.rotation);
+                /*  const startTarget = this.getPivot();
+                let startQuaternion = math.getQuaFromPosAim(startPosition,startTarget) */
+                
+            }
+            
+            
     		if(!info.duration){
     			this.position.copy(endPosition);
                 this.restrictPos();
@@ -85672,7 +85732,7 @@ void main() {
                 
                 // check for a click  
                 
-                if(pressDistance < Potree.config.clickMaxDragDis && pressTime<Potree.config.clickMaxPressTime){
+                if(pressDistance < Potree.config.clickMaxDragDis && pressTime<Potree.config.clickMaxPressTime && !e.unableClick){
                     let clickElement;
                     if(this.hoveredElements){
                         clickElement = this.hoveredElements.find(e=>e.object._listeners['click']); 
@@ -85846,12 +85906,15 @@ void main() {
             //点云模式,对没加载出的点云不准确。 尤其是需要修改相机位置时,因临时修改并不能使点云加载。
         }
 
-        getIntersect(viewport,   onlyGetIntersect, pickWindowSize, dontIntersect, usePointcloud, prop={}){
+
+
+        getIntersect(viewport,   onlyGetIntersect, pickWindowSize, dontIntersect, usePointcloud, prop={}){// usePointcloud:必须使用点云
             let intersectPoint;  
             let camera = viewport.camera;
             let raycaster; 
-            if(Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.pointcloud.hasDepthTex && !usePointcloud && !this.isMeasuring && viewport == viewer.mainViewport ){
-                
+            
+            
+            let getByDepthTex = ()=>{
                 /* if(prop.point){
                     raycaster = new THREE.Raycaster() 
                     var dir = new THREE.Vector3().subVectors(prop.point, camera.position).normalize()
@@ -85866,8 +85929,9 @@ void main() {
                     intersect = Utils.getIntersect(camera, [viewer.images360.cube], this.pointer, raycaster); 
                 } 
                 intersectPoint = viewer.images360.depthSampler.sample(intersect, prop.pano, !!prop.point);  //可能不准确, 因pano可能未加载depthTex
-                 
-            }else {
+            };
+            
+            let getByCloud = ()=>{
                 if(prop.point){ 
                     prop.cameraPos && camera.position.copy(prop.cameraPos);
                     camera.lookAt(prop.point);
@@ -85894,6 +85958,19 @@ void main() {
                     this.pointer.copy(prop.pointer);
                     this.mouse.copy(prop.mouse);
                 } 
+                
+                
+            };
+            
+            let canUseDepthTex = Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.pointcloud.hasDepthTex  && viewport == viewer.mainViewport && !usePointcloud; 
+            
+            if(canUseDepthTex && !this.isMeasuring){
+                getByDepthTex();
+            }else {
+                getByCloud(); 
+                if(!intersectPoint && canUseDepthTex  ){//得不到的话再使用 getByDepthTex 得一次
+                    getByDepthTex();
+                }
             }
               
             //console.log(viewport.name , intersectPoint &&  intersectPoint.location )
@@ -86053,9 +86130,7 @@ void main() {
                     
                     
                 } else {
-                    
-                    
-                    
+                     
                     if (this.logMessages) console.log(this.constructor.name + ': drag: ');
 
                     let dragConsumed = false; 
@@ -87777,6 +87852,7 @@ void main() {
             
              
             let marker = new Mesh(planeGeo$1, getMarerMat() ); 
+                marker.name = 'marker_'+this.id;
                 marker.up.set(0,0,1);
                 marker.lookAt(marker.up); 
                 marker.scale.set(2,2,2); 
@@ -91630,7 +91706,7 @@ void main() {
 
             viewer.addEventListener("global_mousemove", (e) => { 
                 if(!Potree.settings.unableNavigate && Potree.settings.ifShowMarker && e.hoverViewport == viewer.mainViewport){//如果不显示marker,就在点击时再更新
-                    this.updateClosestPano(e.intersectPoint);
+                    this.updateClosestPano(e.intersect);
                 }
     		});
             
@@ -91711,7 +91787,7 @@ void main() {
                     },
                     set:  (mode)=> {
                         latestRequestMode = mode;
-                        console.warn('Request setMode: ' + mode);  
+                        //console.warn('Request setMode: ' + mode)  
                                        
                         if(mode != displayMode){ 
                             let config = Potree.config.displayMode[mode];
@@ -91879,7 +91955,7 @@ void main() {
                              
                              
                             this.dispatchEvent({type:'endChangeMode',mode});  
-                            console.log('setModeSuccess: ' + mode);       
+                            //console.log('setModeSuccess: ' + mode)       
                         }else {
                             
                             //this.dispatchEvent({type:'endChangeMode',mode})    
@@ -93434,7 +93510,7 @@ void main() {
             } */
              
             if(!Potree.settings.ifShowMarker){//不显示marker的时候mousemove没更新鼠标最近点所以更新
-                this.updateClosestPano(viewer.inputHandler.intersectPoint);
+                this.updateClosestPano(viewer.inputHandler.intersect);
             }
             //console.log('flyToPanoClosestToMouse',this.closestPano)
             
@@ -93624,36 +93700,42 @@ void main() {
 
 
         updateClosestPano(intersect, state) {//hover到的pano   大多数时候是null 
-            /* if(this.isAtPano() ){ 
-                 filterFuncs.push(Images360.filters.not(this.currentPano));
-                
-                //当静止在漫游点时closestPano只限制在每个漫游点附近,而在观看整个模型时,范围夸大,识别为离鼠标最近的漫游点。 (故而要排除flying时)
-     			filterFuncs.push(Images360.filters.inFloorDirection(this.position, viewer.scene.view.direction, .25))//许钟文改
-                filterFuncs.push(Images360.filters.isCloseEnoughTo(intersect, 0.35));
-                filterFuncs.push(Images360.filters.isEnabled())  
-            }else{
-    			 
-            } */
             
-            
-            var pano;
-            if(this.isAtPano() ){
+            /* 
+            var pano
+            if(this.isAtPano() ){  //为什么之前Panorama要加这个限制?
                 if(intersect instanceof Panorama){
-                    pano = state ? intersect : null;
-                }else {
+                    pano = state ? intersect : null
+                }else{
                     return 
                 }
-            }else {
+            }else{
                 if(this.flying)return; 
                 var filterFuncs = [];
-                intersect = intersect && intersect.location;
+                intersect = intersect && intersect.location
                 if(!intersect)return
-                let sortFuncs = Potree.settings.editType != 'pano'? [Images360.sortFunctions.floorDisSquaredToPoint(intersect)] : [Images360.sortFunctions.disSquaredToPoint(intersect)]; 
+                let sortFuncs = Potree.settings.editType != 'pano'? [Images360.sortFunctions.floorDisSquaredToPoint(intersect)] : [Images360.sortFunctions.disSquaredToPoint(intersect)] 
                 pano = Common.find(this.panos,  filterFuncs, sortFuncs);
             }
+             */
             
             
-            
+            var pano;
+             
+            if(intersect instanceof Panorama){
+                pano = state ? intersect : null;
+            }else {
+                if(this.isAtPano()){
+                    return
+                }else {
+                    if(this.flying)return; 
+                    var filterFuncs = [];
+                    intersect = intersect && intersect.location;
+                    if(!intersect)return
+                    let sortFuncs = Potree.settings.editType != 'pano'? [Images360.sortFunctions.floorDisSquaredToPoint(intersect)] : [Images360.sortFunctions.disSquaredToPoint(intersect)]; 
+                    pano = Common.find(this.panos,  filterFuncs, sortFuncs);
+                }
+            }
             
             if (pano != this.closestPano) {
                 pano && (this.isPanoHover = !0);
@@ -117923,7 +118005,7 @@ ENDSEC
                 };
                 let mouseUp = (e)=>{
                      
-                    viewer.outlinePass.edgeStrength =  this.selected.isPointcloud ? edgeStrengths.pointcloud : edgeStrengths.glb;
+                    this.updateEdgeStrength();
                      
                 };
                 this.transformControls.addEventListener('mouseDown',mouseDown);
@@ -117947,7 +118029,9 @@ ENDSEC
             
             
             viewer.addEventListener('global_single_click',(e)=>{
-                if( viewer.scene.cameraAnimations.some(c=>c.onUpdate) //正在播放
+                if(
+                    this.noNeedSelection  //如模型查看页
+                    || viewer.scene.cameraAnimations.some(c=>c.onUpdate) //正在播放
                     || e.drag && e.drag.notPressMouse   //在加测量线
                     || viewer.mainViewport.view.isFlying() //有其他校准
                     || this.split           //分屏中
@@ -118081,10 +118165,9 @@ ENDSEC
                 viewer.addEventListener('global_drop', (e)=>{
                     dragInfo = null;
                     this.clearTranCursor();
-                     
-                    if(this.selected/*  && this.selected.isPointcloud */){ 
-                        viewer.outlinePass.edgeStrength = this.selected.isPointcloud ? edgeStrengths.pointcloud : edgeStrengths.glb;
-                    } 
+                      
+                    this.updateEdgeStrength();
+                      
                     
                 });
             
@@ -118138,12 +118221,14 @@ ENDSEC
             this.transformControls2.view = viewer.viewports[1].view;
             this.transformControls2.camera = viewer.viewports[1].camera;
             this.transformControls2._gizmo.hideAxis = {translate:['x','y'], rotate:['x','y','z'] };
-                
-            viewer.compass.viewport = viewer.viewports[0];
-            viewer.compass.setDomPos();
-            this.secondCompass.viewport = viewer.viewports[1];
+            
+
+            this.secondCompass.changeViewport(viewer.viewports[0]);
             this.secondCompass.setDomPos();
-            this.secondCompass.setDisplay(true);
+            this.secondCompass.setDisplay(true);   
+            viewer.compass.changeViewport(viewer.viewports[1]);
+            viewer.compass.setDomPos();
+            
         },
         
         leaveSplit(){
@@ -118161,7 +118246,9 @@ ENDSEC
             this.transformControls._gizmo.hideAxis = {};
             viewer.setObjectLayers(this.transformControls, 'sceneObjects' );  //恢复
             
-            viewer.compass.viewport = viewer.viewports[0];//恢复
+            
+            viewer.compass.changeViewport(viewer.viewports[0]); //恢复 
+            viewer.compass.setDomPos();
             this.secondCompass.setDisplay(false);
             
              
@@ -118222,7 +118309,11 @@ ENDSEC
             if(state){
                 if(this.selected){
                     if(this.selected == model) return
-                    else this.selectModel(this.selected, false, fitBound, by2d);
+                    else {
+                        let transToolAttached = !!this.transformControls.object;
+                        this.selectModel(this.selected, false, fitBound, by2d);
+                        transToolAttached && this.transformControls.attach(model);
+                    }
                 }
                 this.selected = model;
                  
@@ -118231,14 +118322,14 @@ ENDSEC
                
                 this.showModelOutline(model);
                 
-                if(model.isPointcloud){
-                    viewer.outlinePass.edgeStrength = edgeStrengths.pointcloud;
-                }else {
-                    viewer.outlinePass.edgeStrength = edgeStrengths.glb;
-                }
+                
+                
+                this.updateEdgeStrength();
+                
                 //console.log('selectModel', model)
                 
-            }else { 
+            }else {
+                if(this.selected != model)return //model本来就没选中,不需要处理(防止2d先选中新的再取消旧的)
                 this.showModelOutline(model, false);
                  
                 this.selected = null;
@@ -118280,7 +118371,14 @@ ENDSEC
             }
         },
         
-        
+        updateEdgeStrength(){
+            if(!this.selected)return
+            if(this.selected.isPointcloud){
+                viewer.outlinePass.edgeStrength = edgeStrengths.pointcloud;// / this.selected.material.opacity  
+            }else {
+                viewer.outlinePass.edgeStrength = edgeStrengths.glb;
+            }  
+        },
         focusOn(objects, duration = 400, fitBound=true, dontLookUp){  
             if(!(objects instanceof Array)){
                 objects = [objects];
@@ -118426,7 +118524,7 @@ ENDSEC
     let w$2 = 200/1.43;
     let maxPX = 1366*1024; //ipad pro.  大于这个分辨率的就直接用devicePixelRatio, 如macbook也是
     const width2dPX = Math.round(window.devicePixelRatio >= 2 ? ( window.screen.width * window.screen.height >= maxPX ? window.devicePixelRatio/1.2 : window.devicePixelRatio/1.5)*w$2 : w$2);  //触屏或高分辨率的可能要放大些。但在手机上不能太大
-    console.log('width2dPX', width2dPX);
+    //console.log('width2dPX', width2dPX)
 
 
 
@@ -125710,6 +125808,8 @@ ENDSEC
     	this.renderTargetBlurBuffer2.texture.generateMipmaps = false; */
 
     	this.edgeDetectionMaterial = this.getEdgeDetectionMaterial(this.edgeStrength);
+         
+        
     	this.renderTargetEdgeBuffer1 = new WebGLRenderTarget( resx, resy, pars );
     	this.renderTargetEdgeBuffer1.texture.name = "OutlinePass.edge1";
     	this.renderTargetEdgeBuffer1.texture.generateMipmaps = false;
@@ -125998,8 +126098,19 @@ ENDSEC
                 //renderer.setRenderTarget(this.renderTargetMaskBuffer)
                 //renderer.clear()
                 //renderer.render( scene, camera/* , this.renderTargetMaskBuffer, true */ );
+                
+                viewer.scene.pointclouds.forEach(e=>{  //先将点云透明度变为1,因为点云透明度莫名其妙会影响其r值
+                    e.material._oldOpa = e.material.opacity;
+                    e.material.opacity = 1;
+                });
+                
                 render2(this.renderTargetMaskBuffer);
                 
+                viewer.scene.pointclouds.forEach(e=>{//恢复
+                    e.material.opacity = e.material._oldOpa;
+                    delete e.material._oldOpa;
+                });
+                
                 viewports.forEach((e)=>{e.beforeRender = e.oldBeforeRender;});  
                 
     			this.changeVisibilityOfNonSelectedObjects( true , scenes);
@@ -126018,7 +126129,7 @@ ENDSEC
     			this.edgeDetectionMaterial.uniforms[ "maskTexture" ].value = this.renderTargetMaskBuffer.texture;//this.renderTargetMaskDownSampleBuffer.texture;
     			this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new Vector2$1(this.resolution.x, this.resolution.y );//new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );
     			//this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new THREE.Vector2(this.renderTargetMaskBuffer.width, this.renderTargetMaskBuffer.height)//new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );
-                this.edgeDetectionMaterial.uniforms[ "thickness" ].value = this.edgeStrength;
+                this.edgeDetectionMaterial.uniforms[ "edgeStrength" ].value = this.edgeStrength;
                 
                 this.edgeDetectionMaterial.uniforms[ "visibleEdgeColor" ].value = this.visibleEdgeColor;//this.tempPulseColor1;
     			this.edgeDetectionMaterial.uniforms[ "hiddenEdgeColor" ].value = this.hiddenEdgeColor; //this.tempPulseColor2;
@@ -126028,6 +126139,7 @@ ENDSEC
                 let buffer = readBuffer;
                 if ( this.renderToScreen ) {
                     this.quad.material.transparent = true;
+                    
                     buffer = null; 
                     renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );  
                     render2(null,false);
@@ -126042,7 +126154,7 @@ ENDSEC
                     renderer.clear();
                 } 
                 
-                
+             
                 renderer.setRenderTarget(buffer/* this.renderTargetEdgeBuffer1 */);
                 
                 renderer.render( this.scene,  this.camera/* , this.renderTargetEdgeBuffer1, true  */);
@@ -126127,17 +126239,18 @@ ENDSEC
 
     				'}'
     			].join( '\n' )
-
+                //scene.overrideMaterial
+                //为什么画出来红色通道不为0,且depthTest似乎会改变红色通道的值
     		} );
 
     	},
 
-    	getEdgeDetectionMaterial: function (thickness) {
+    	getEdgeDetectionMaterial: function (edgeStrength) {
 
     		return new ShaderMaterial( {
                 
     			uniforms: {
-                    "thickness": { value: thickness }, 
+                    "edgeStrength": { value: edgeStrength }, 
     				"maskTexture": { value: null },
     				"texSize": { value: new Vector2$1( 10, 10 ) },
     				"visibleEdgeColor": { value: new Vector3( 1.0, 1.0, 1.0 ) },
@@ -126175,30 +126288,33 @@ ENDSEC
     					gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\
     				}" */
                     fragmentShader:
-    				"varying vec2 vUv;\
-				uniform sampler2D maskTexture;\
-                uniform float thickness;\
-				uniform vec2 texSize;\
-				uniform vec3 visibleEdgeColor;\
-				uniform vec3 hiddenEdgeColor;\
-				\
-				void main() {\n\
-					vec2 invSize = 1.0 / texSize;\
-					vec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\
-					vec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\
-					vec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\
-					vec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\
-					vec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\
-					float diff1 = (c1.r - c2.r)*0.5;\
-					float diff2 = (c3.r - c4.r)*0.5;\
-					float d = length( vec2(diff1, diff2) ) * thickness;\
-					float a1 = min(c1.g, c2.g);\
-					float a2 = min(c3.g, c4.g);\
-					float visibilityFactor = min(a1, a2);\
-					vec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\
-					gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\
-				}"
+    				`varying vec2 vUv;
+				uniform sampler2D maskTexture;
+                uniform float edgeStrength;
+				uniform vec2 texSize;
+				uniform vec3 visibleEdgeColor;
+				uniform vec3 hiddenEdgeColor;
+				
+				void main() { 
+                    const float thickness = 1.0;
+                    vec2 invSize = thickness / texSize;
+					vec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);
+					vec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);
+					vec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);
+					vec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);
+					vec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);
+					float diff1 = (c1.r - c2.r)*0.5;  //检测边缘,
+					float diff2 = (c3.r - c4.r)*0.5;
+					float d = length( vec2(diff1, diff2) ) * edgeStrength;
+					float a1 = min(c1.g, c2.g);
+					float a2 = min(c3.g, c4.g);
+					float visibilityFactor = min(a1, a2);
+					vec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;
+					//gl_FragColor = vec4(0.0,1.0,0.0,1.0); 
+                    gl_FragColor = vec4(edgeColor, 1.0) * vec4(d); 
+				}`
     		} );
+            //为什么vec4(0.0,1.0,1.0,1.0);  显示出来的是rgb(109,255,255) ? 几乎只有绿色通道会影响红色通道
 
     	},
 
@@ -126395,7 +126511,7 @@ ENDSEC
            
             
              
-            console.log('create viewer');
+            //console.log('create viewer')
             
             this.navigateMode = 'free'; // 'panorama'; 'free'自由模式是只显示点云或者未进入到漫游点, 
             this.isEdit = true;
@@ -129134,22 +129250,33 @@ ENDSEC
                     }));
                 }
 
-                
-                view.render || this.clear(params);  
-                pRenderer.clearTargets(params);
-
-                //先渲染不透明的model:
-                if(this.objs.children.length){
-                    this.renderer.setRenderTarget(params.target||null);
-                    this.setCameraLayers(params.camera,  ['model'] );//先渲染模型后渲染点云,否则半透明的点云的blend没有混合模型的部分(但模型为何可以混合点云的部分?估计还是PotreeRenderer有问题)
-                    /* this.objs.children.forEach(e=>{
-                        this.updateVisible(e, 'renderOpa', e.opacity == 1)  
-                    }) */
-                    this.renderer.render(this.scene.scene, params.camera); 
-                }
-               
-                if(!view.noPointcloud ){
+                if(!view.render){
+                    this.clear(params); 
+                    pRenderer.clearTargets(params);
+                    
                     
+                    //先渲染不透明的model:
+                    /* if(this.objs.children.length){
+                        this.renderer.setRenderTarget(params.target||null)
+                        this.setCameraLayers(params.camera,  ['model'] )//先渲染模型后渲染点云,否则半透明的点云的blend没有混合模型的部分(但模型为何可以混合点云的部分?估计还是PotreeRenderer有问题)
+                        
+                        this.renderer.render(this.scene.scene, params.camera); 
+                    }  */
+                        
+                    
+                    
+                    if(Potree.settings.notAdditiveBlending){
+                        params.renderBeforeCloud = true;
+                        this.renderOverlay1(params);   
+                        //view.render || this.renderOverlay(params)  
+                    }   
+                    
+                }
+                /* view.render || this.clear(params)  
+                pRenderer.clearTargets(params); */
+
+     
+                if(!view.noPointcloud ){ 
                     //if(!params.target){ 
                         //params.width = width; params.height = height;
                         
@@ -129157,8 +129284,7 @@ ENDSEC
                     if(view.render){
                         params.noBG = true;
                     }
-                    
-                    
+                     
                     
                     view.beforeRender && view.beforeRender();
                     
@@ -129172,11 +129298,24 @@ ENDSEC
                     pRenderer.render(params); 
                     
                 } 
-                
+                    
 
+                if(!view.render){     
+                    //view.render || this.renderOverlay(params) 
+                    if(Potree.settings.notAdditiveBlending){
+                        params.renderBeforeCloud = false;
+                        this.renderOverlay1(params); 
+                        this.renderOverlay2(params);  
+                    }else { 
+                        /* view.render ||  */this.renderOverlay(params);                 
+                    }
+                        
+                }    
+                     
+               
                  
-                view.render || this.renderOverlay(params); 
                
+                
                   
                 
                 view.afterRender && view.afterRender(); 
@@ -129209,15 +129348,84 @@ ENDSEC
             
     	}
     	
+        /* 
+            关于透明度:
+            由于点云和mesh是分开渲染的,且材质很不一样,所以透明和blend有冲突
+            
+            1 如果点云的blend是AdditiveBlending,也就是普通的叠加模式。
+                则半透明点云的depthTest和depthWrite都为false
+                这时候mesh要后渲染,且depthWrite不能为false(除非depthTest也为false),否则将被点云遮住。
+            2 如果点云的blend是普通型
+                则半透明点云的depthTest和depthWrite都为true。(为何depthWrite不能像mesh一样为false, 否则点云自身透明会错乱,可能因为太多points了)
+                这时候若mesh全部先渲染,则 透过depthWrite为false的半透明mesh看不透明点云,mesh会完全被点云遮住。但是透明的物体就是depthWrite要为false,否则也会完全遮住点云
+                 
+                即使是后渲染半透明的mesh,若透过点云看mesh,mesh会完全被点云遮住(为什么之前遇到过 透过点云看mesh,点云会显示不出)
+                
+                最终选择是先渲染不透明的mesh,然后点云,然后透明的mesh。虽然点云对mesh透明会失效。 
        
-
+        */
 
         renderOverlay(params){
+            this.renderOverlay1(params);
+            this.renderOverlay2(params);
+            /* let camera = params.camera ? params.camera : this.scene.getActiveCamera();
+            
+            this.reticule.updateAtViewports(params.viewport)
+            this.renderer.setRenderTarget(params.target||null)
+            
+             //为什么要在点云之后渲染,否则透明失效 、 会被点云覆盖 
+            let cameraLayers
+
+            if(params.cameraLayers) cameraLayers = params.cameraLayers
+            else{
+                if(params.isMap)cameraLayers = ['bothMapAndScene']
+                else cameraLayers = ['sceneObjects',    'model',   'bothMapAndScene' ];
+            }
+            
+            
+       
+            if(cameraLayers.length){
+                this.setCameraLayers(camera,  cameraLayers, params.extraEnableLayers) //透明贴图层 skybox 、reticule marker 不能遮住测量线
+                 
+                this.renderer.render(this.scene.scene, camera);  
+            }
+              
+            this.dispatchEvent({type: "render.pass.scene", viewer: viewer});
+        
+        
+            
+        
+            //清除深度 !!!!
+            this.renderer.clearDepth(); 
+
+            //this.transformationTool.update();
+            
+             
+            if(!params.magnifier){ 
+                //测量线 
+                this.dispatchEvent({type: "render.pass.perspective_overlay", camera, screenshot:params.screenshot});
+                
+                if(!params.screenshot && !params.isMap){
+                    this.setCameraLayers(camera, ['magnifier']) //magnifier 遮住测量线 
+                    this.renderer.render(this.scene.scene, camera);
+                }
+            } 
+            
+            if(!params.isMap) {
+                this.setCameraLayers(camera, ['volume','transformationTool'])  
+                this.renderer.render(this.clippingTool.sceneVolume, camera);
+                this.renderer.render(this.transformationTool.scene, camera);
+            } */
              
+        }
+        
+        
+        
+        renderOverlay1(params){
             let camera = params.camera ? params.camera : this.scene.getActiveCamera();
             
             this.reticule.updateAtViewports(params.viewport);
-            
+            this.renderer.setRenderTarget(params.target||null);
             
              //为什么要在点云之后渲染,否则透明失效 、 会被点云覆盖 
             let cameraLayers;
@@ -129225,22 +129433,45 @@ ENDSEC
             if(params.cameraLayers) cameraLayers = params.cameraLayers;
             else {
                 if(params.isMap)cameraLayers = ['bothMapAndScene'];
-                else cameraLayers = ['sceneObjects', /*  'model', */ 'bothMapAndScene' ];
+                else cameraLayers = ['sceneObjects',   'model',  'bothMapAndScene' ];
             }
             
             
        
             if(cameraLayers.length){
                 this.setCameraLayers(camera,  cameraLayers, params.extraEnableLayers); //透明贴图层 skybox 、reticule marker 不能遮住测量线
-                 
+                
+                if('renderBeforeCloud' in params){
+                    this.scene.scene.traverse((object)=>{
+                        if(object.material){  
+                            this.updateVisible(object, 'renderOpa', 
+                                (params.renderBeforeCloud && (object.material.opacity<1 || !object.material.depthTest) || (!params.renderBeforeCloud) && (object.material.opacity==1 && object.material.depthTest))? false:true); 
+                            //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。  depthTest==false的也最后渲染
+                        } 
+                    });//ground的材质中opacity为1,所以被当做不透明了
+                }
+                
+                
                 this.renderer.render(this.scene.scene, camera);  
+                 
+                if('renderBeforeCloud' in params){
+                    this.scene.scene.traverse((object)=>{
+                        if(object.material){  
+                            this.updateVisible(object, 'renderOpa',  true); //恢复 
+                        } 
+                    });
+                }
             }
               
             this.dispatchEvent({type: "render.pass.scene", viewer: viewer});
         
+          
+        }
         
-            
         
+        
+        renderOverlay2(params){
+            let camera = params.camera ? params.camera : this.scene.getActiveCamera();
             //清除深度 !!!!
             this.renderer.clearDepth(); 
 
@@ -129262,8 +129493,12 @@ ENDSEC
                 this.renderer.render(this.clippingTool.sceneVolume, camera);
                 this.renderer.render(this.transformationTool.scene, camera);
             }
-             
+        
+        
         }
+        
+        
+        
           /* renderDefault(){//测试 ios15.4.1
             //let pRenderer = this.getPRenderer();
             //this.clear()
@@ -131449,6 +131684,8 @@ ENDSEC
     async function loadFile(path, callback, onError){
         if(Potree.fileServer){
             Potree.fileServer.get(path).then(data=>{ 
+                if(data.data)data = data.data;
+                if(data.data)data = data.data; //融合页面getdataset需要查找两次data
                 callback && callback(data);
             }).catch(onError); 
         }else {

File diff suppressed because it is too large
+ 1 - 1
public/static/lib/potree/potree.js.map


+ 3 - 3
src/pages/LaserBim.vue

@@ -75,7 +75,7 @@ const highlighted = computed(() => {
     }
 })
 
-let getView = ()=>{
+const getView = ()=>{
     let camera = sourceApp.viewer.mainViewport.camera
     return {
         position : camera.position,
@@ -85,7 +85,7 @@ let getView = ()=>{
 } 
 
 const initConvertView = (noNeedBindEvent) => {
-    if(sourceApp && targetApp ){//存在且和当前不同
+    if(sourceApp && targetApp ){
         views.init(sourceApp, targetApp , sourceApp.viewer.inputHandler.domElement, 'laser', getView(), 
                     sourceApp.viewer.images360.panos.slice(0,2).map(e=>e.position), )
     }
@@ -154,7 +154,7 @@ const onLoadTarget = () => {
 }
 
 
-views.addEventListener('sendCameraData',(e)=>{ 
+views.addEventListener('sendCameraData',(e)=>{ //同步右侧数据
     sourceApp.viewer.mainViewport.view.position.copy(e.data.position)
     sourceApp.viewer.mainViewport.view.lookAt(e.data.target)
     

+ 11 - 3
src/utils/ConvertViews.js

@@ -73,6 +73,12 @@ export default class ConvertViews extends THREE.EventDispatcher{
     bindCamEvent(){//传递到另一边的dom 
         this.lockCamera(true)
         
+        
+        /* this.viewer.addEventListener(this.targetApp.Glodon.Bimface.Viewer.Viewer3DEvent.MouseClicked,(e)=>{
+            console.log('MouseClicked',e)
+        }); */
+        
+        
         let getEvent = (type, e)=>{
             return new MouseEvent(type, {
                 bubbles: false,//?
@@ -88,18 +94,20 @@ export default class ConvertViews extends THREE.EventDispatcher{
         }  
         
         let dom1 = this.viewer.getDomElement() 
+        //let pointerDownPos = new THREE.Vector2
         dom1.addEventListener('mousedown',(e)=>{
             let event = getEvent('mousedown', e)
             this.sourceDom.dispatchEvent(event)  
+            pointerDownPos.set(e.clientX,e.clientY)
         })
         dom1.addEventListener('mousemove',(e)=>{
             let event = getEvent('mousemove', e)
             this.sourceDom.dispatchEvent(event)  
         })
-        dom1.addEventListener('mouseup',(e)=>{
-            
+        dom1.addEventListener('mouseup',(e)=>{  
             let event = getEvent('mouseup', e)
-            this.sourceApp.dispatchEvent(event)   //mouseup 在laser中加在window上的
+            event.unableClick = true //最好禁止右侧点击行走。否则和点击效果冲突
+            this.sourceApp.dispatchEvent(event)   //mouseup 在laser中加在window上的 
         })
         dom1.addEventListener('mousewheel',(e)=>{
             let event = getEvent('mousewheel', e)