Prechádzať zdrojové kódy

Merge branch 'master' of http://192.168.0.115:3000/bill/fuse-code

bill 2 rokov pred
rodič
commit
5253f93c90

+ 110 - 60
public/lib/potree/potree.js

@@ -63651,8 +63651,10 @@ void main() {
         var transformPointcloud = (pointcloud )=>{ //初始化位置  
             viewer.sidebar && viewer.sidebar.addAlignmentButton(pointcloud); 
              
-            let orientation = pointcloud.panos[0].dataRotation.z;
-            let location = pointcloud.panos[0].dataPosition.clone().negate();
+            let orientation =  pointcloud.panos[0].dataRotation.z + Math.PI;
+            
+            let location = pointcloud.panos[0].dataPosition.clone();//.negate()
+            
             Alignment.rotate(pointcloud, null,  orientation  );   
             Alignment.translate(pointcloud, location );  
             
@@ -63692,7 +63694,7 @@ void main() {
                     material.minSize =  config.minSize;
                     material.maxSize =  config.maxSize;   
                     material.pointSizeType = /* 'ADAPTIVE'// */config.pointSizeType; //Potree.PointSizeType[config.pointSizeType]//Potree.PointSizeType.ADAPTIVE;//FIXED
-                    pointcloud.changePointSize( 0.2 /* config.realPointSize  */   );  //material.size =  config.pointSize;
+                    pointcloud.changePointSize( 0.1 /* config.realPointSize  */   );  //material.size =  config.pointSize;
                     pointcloud.changePointOpacity(1);
                     material.shape = Potree.PointShape.SQUARE; 
                     pointcloud.color = config.pointColor;  
@@ -69899,10 +69901,15 @@ void main() {
             } else {
                 this.temp.pointOpacity = num;
             }
-             
+            
+            if(Potree.settings.editType == 'merge'){ //not AdditiveBlending
+                return this.material.opacity = num
+            }
+          
             if (num == 1) {
                 this.material.opacity = 1;
-            } else {
+            } else { 
+
                 let str = (Potree.settings.sizeFitToLevel?'sizeFit:':'')+ (canMoreThanOne ? 'canMoreThanOne:':'') +this.temp.pointOpacity+':'+this.maxLevel+':'+this.nodeMaxLevel;
                 let value = this.temp.opacity[str];  //储存。防止每次渲染(反复切换density)都要算。
                 if(value){
@@ -72375,7 +72382,13 @@ void main() {
 
     		if (transparent){
     			gl.enable(gl.BLEND);
-    			gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
+                
+                if(params.notAdditiveBlending){
+                    gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); //NormalBlending 
+                }else {
+                    gl.blendFunc(gl.SRC_ALPHA, gl.ONE); //AdditiveBlending   原本
+                }
+    			
     			gl.depthMask(false);
     			gl.disable(gl.DEPTH_TEST);
     		} else {
@@ -78335,7 +78348,7 @@ void main() {
             let click = (e)=>{//一旦点击就立刻增加两marker  
             
                 if(ifAtWrongPlace(e))return  
-                
+                if(e.clickElement)return  //如点击label时focusOnObject
                  
                 
                 if(e.button === MOUSE.RIGHT)return 
@@ -80078,26 +80091,28 @@ void main() {
 
     class Compass extends EventDispatcher{
         
-        constructor(dom){
+        constructor(dom, viewport){
             super();
             this.angle = 0;
+            this.show = false; 
             if(dom){
                 this.dom = $(dom);
             }
-           
+            
+            this.viewport = viewport;
             this.init();
-            this.show = false; 
-
+            
 
+            
 
         }
         init(){ 
             var width = 100, height = 100;
             if(!this.dom){ 
-                this.dom = $('<div id="compass"></div>');
-                $("#potree_render_area").append(this.dom);
+                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);  
@@ -80159,7 +80174,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;
@@ -80173,11 +80188,13 @@ void main() {
             this.createCompass();
               
             viewer.addEventListener('camera_changed', e => {
-                if (e.viewport.name == 'MainView' && (e.changeInfo.positionChanged || e.changeInfo.quaternionChanged)) {
+                if (e.viewport == this.viewport && (e.changeInfo.positionChanged || e.changeInfo.quaternionChanged)) {
                      this.update();
                 } 
             });
             
+            this.setDomPos();
+            if(this.viewport)this.setDisplay(true);
         }   
             
             
@@ -80261,8 +80278,8 @@ void main() {
         }
         
         update(quaternion){
-            //if(!this.show)return;
-            if(!quaternion) quaternion = viewer.mainViewport.camera.quaternion.clone();
+            if(!this.show)return;
+            if(!quaternion) quaternion = this.viewport.camera.quaternion.clone();
             this.updateCamera(quaternion);
             this.updateLabel(quaternion);
             this.render();
@@ -80270,39 +80287,39 @@ void main() {
         }
         
         
-        updateLabel(quaternion){//更新北标签
+        /*updateLabel(quaternion){//更新北标签
               
             var dir = viewer.mainViewport.view.direction;
-            var oriDir = initDir.clone();  //指南针最初始时的北方向
-            var extraQua; 
-            /* if(objects.player.mode == "transitioning"){//当transitioning时,相机的quaternion不是用control的lookAt算出来,而是直接由一个quaternion过渡到另一个,这样相机将会是歪的,投影面也就不会是原先的水平面。
+            var oriDir = initDir.clone()  //指南针最初始时的北方向
+            var extraQua 
+            if(objects.player.mode == "transitioning"){//当transitioning时,相机的quaternion不是用control的lookAt算出来,而是直接由一个quaternion过渡到另一个,这样相机将会是歪的,投影面也就不会是原先的水平面。
                 var tempCamera = new THREE.Camera();   //借用camera的lookAt算出如果正视同样的target, quaternion会是什么值。 将它乘以当前相机quaternion,得到的就是相机歪的旋转值。
                 tempCamera.position.copy(this.camera.position); 
                 tempCamera.lookAt(tempCamera.position.clone().add(dir)) 
                 var q = tempCamera.quaternion.inverse()
                 extraQua = q.premultiply(quaternion) //歪掉的额外旋转值
                 
-            }  */
+            }  
              
             //北标签的方向为指南针轮盘方向,也就是要将camera的方向投影到水平面上。 但是如果相机歪了,看到的世界都会歪一定角度,投影面也要歪一定角度。
-            var up = new Vector3(0,0,1); //投影水平面的法线,也是相机的摆正的up方向
-            extraQua && up.applyQuaternion(extraQua);
-            dir.projectOnPlane(up);   //将方向投影到水平面上; 如果相机不是正视(extraQua不为0001),就要将水平面也转动 
-            oriDir.projectOnPlane(up);//为什么initDir投影了和没有投影angle结果一样 
-            var angle = dir.angleTo(oriDir);
-            if(dir.cross(oriDir).y > 0)angle = -angle;
+            var up = new THREE.Vector3(0,0,1) //投影水平面的法线,也是相机的摆正的up方向
+            extraQua && up.applyQuaternion(extraQua)
+            dir.projectOnPlane(up)   //将方向投影到水平面上; 如果相机不是正视(extraQua不为0001),就要将水平面也转动 
+            oriDir.projectOnPlane(up)//为什么initDir投影了和没有投影angle结果一样 
+            var angle = dir.angleTo(oriDir)
+            if(dir.cross(oriDir).y > 0)angle = -angle
              
-            var deg = this.angle - 90 + MathUtils.radToDeg(angle); //因为css写的样式初始是指向右方,和initDir差了90°,所以减去。
+            var deg = this.angle - 90 + THREE.Math.radToDeg(angle) //因为css写的样式初始是指向右方,和initDir差了90°,所以减去。
             
             
-            this.dom.find(".dirText").css( "transform","rotate("+deg+"deg)" );
-            this.dom.find(".dirText span").css("transform","rotate("+(-deg)+"deg)");
-        }
+            this.dom.find(".dirText").css( "transform","rotate("+deg+"deg)" )
+            this.dom.find(".dirText span").css("transform","rotate("+(-deg)+"deg)")
+        } */
         
 
 
         updateLabel(quaternion){//更新北标签
-            let deg = MathUtils.radToDeg(viewer.mainViewport.view.yaw) - 90;
+            let deg = MathUtils.radToDeg(this.viewport.view.yaw) - 90;
             this.dom.find(".dirText").css( "transform","rotate("+deg+"deg)" );
             this.dom.find(".dirText span").css("transform","rotate("+(-deg)+"deg)");
         }
@@ -80312,12 +80329,14 @@ void main() {
              const radius = 5;  //相机距离
               
              this.camera.quaternion.copy(quaternion);
-             var dir = viewer.mainViewport.view.direction;  //相机朝向
+             var dir = this.viewport.view.direction;  //相机朝向
              this.camera.position.copy(dir.multiplyScalar(radius).negate());  //相机绕着指南针中心(000)转动
         } 
+        
         render(){
             this.renderer.render(this.scene, this.camera);
         }
+        
         setDisplay(state){
             this.show = !!state;
             if(this.show){
@@ -80334,8 +80353,12 @@ void main() {
              
         }
         
-        setDomLeft(){
-            this.dom.css({'right':'none','left':config.isMobile? "1%" : "2%"});
+        setDomPos(){
+            if(!this.viewport)return
+            let right = this.viewport.left + this.viewport.width;
+            this.dom.css({'right':((1-right)*100 + 1) + '%'});
+            
+            //this.dom.css({'right':'none','left':config.isMobile? "1%" : "2%"})
         }
         
     }
@@ -80889,10 +80912,16 @@ void main() {
                     Utils.screenPass.render(viewer.renderer, this.edlMaterial, params.target);
                 }else {
                     //渲染点云 (直接用rtEDL上的会失去抗锯齿)
-                    viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null , {
-                        shadowMaps:  lights.length > 0 ? [this.shadowMap] : null,
-                        clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume))
-                    });  
+                    
+                    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;
+                    } 
+                    viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null , prop);  
                 }
             }        
               
@@ -117905,6 +117934,13 @@ ENDSEC
                 
             }
             
+            
+            {
+                
+                this.secondCompass = new Compass(null);
+                
+            }
+            
             viewer.setControls(viewer.orbitControls);
             //viewer.mainViewport.view.fixZWhenPan = true
             viewer.orbitControls.constantlyForward = true;
@@ -118102,9 +118138,12 @@ 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.setDomPos();
+            this.secondCompass.setDisplay(true);
         },
         
         leaveSplit(){
@@ -118122,6 +118161,9 @@ ENDSEC
             this.transformControls._gizmo.hideAxis = {};
             viewer.setObjectLayers(this.transformControls, 'sceneObjects' );  //恢复
             
+            viewer.compass.viewport = viewer.viewports[0];//恢复
+            viewer.compass.setDomPos();
+            this.secondCompass.setDisplay(false);
             
              
         },
@@ -122980,7 +123022,7 @@ ENDSEC
         
         exportSavingData(){//输出漫游点新的坐标和朝向、以及连接信息
             let sweepLocations = {};
-
+            let rotQua = new Quaternion().setFromAxisAngle(new Vector3(0,0,1), Math.PI);
             for(let datasetId in Potree.settings.datasetsPanos ) {
                 let {panos} = Potree.settings.datasetsPanos[datasetId];
                 let data = panos.map(pano=>{
@@ -122994,8 +123036,8 @@ ENDSEC
                     return Object.assign({},  pano.panosData,  {
                         uuid: pano.uuid, 
                         pose:{
-                            translation: dealData(pano.position.clone().negate()),
-                            rotation: dealData(new Quaternion().setFromRotationMatrix(pano.panoMatrix)  ),
+                            translation: dealData(pano.position.clone()/* .negate() */),
+                            rotation: dealData(new Quaternion().setFromRotationMatrix(pano.panoMatrix).premultiply(rotQua)  ),
                         },
                         visibles,
                         
@@ -125877,9 +125919,7 @@ ENDSEC
     	render: function (scenes, camera, viewports,  renderer, writeBuffer, readBuffer,  maskActive, renderFun ) {
             if(!(scenes instanceof Array))scenes = [scenes];
             
-            if(this.edgeStrength == 0){
-                console.log('this.edgeStrength == 0');
-            }
+            
             
     		if ( this.selectedObjects.length > 0 && this.edgeStrength > 0) {
                 
@@ -126678,7 +126718,7 @@ ENDSEC
                     }); 
                     this.viewports = [this.mainViewport];
                     
-                    Potree.settings.showCompass && (this.compass = new Compass(Potree.settings.compassDom));
+                    Potree.settings.showCompass && (this.compass = new Compass(Potree.settings.compassDom, this.mainViewport));
                     this.magnifier = new Magnifier(this);
                     this.reticule = new Reticule(this); 
                     this.scene.scene.add(this.magnifier); 
@@ -129094,7 +129134,21 @@ ENDSEC
                         renderOverlay: this.renderOverlay.bind(this),  force:!view.noPointcloud //如果要渲染点云,必须也一直渲染地图,否则地图会被覆盖(点云目前未能获取是否改变,也可能有其他动态物体,所以还是一直渲染的好)
                     }));
                 }
+
                 
+                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(!params.target){ 
@@ -129115,8 +129169,7 @@ ENDSEC
                     params.backgroundColor = view.backgroundColor;
                     params.backgroundOpacity = view.backgroundOpacity;
                     
-                    view.render || this.clear(params);  
-                    pRenderer.clearTargets(params);
+                    
                     pRenderer.render(params); 
                     
                 } 
@@ -129173,19 +129226,15 @@ 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(this.outlinePass.selectedObjects.some(e=>e.isModel).length){ 
-                    this.composer.render(this.scene.scene, camera);  
-                }else{ */
-                    this.renderer.render(this.scene.scene, camera); 
-                //} 
-                
+                this.renderer.render(this.scene.scene, camera);  
             }
               
             this.dispatchEvent({type: "render.pass.scene", viewer: viewer});
@@ -130503,6 +130552,7 @@ ENDSEC
             let fileType =  fileInfo.objurl ? 'obj' : 'glb';
             let loadDone = (object, total, url)=>{
                 //object.scale.set(1,1,1);//先获取原始的大小时的boundingBox
+                object.opacity = 1; //初始化 记录
                 object.updateMatrixWorld();
                 let weight = Math.round((total / 1024 / 1024) * 100) / 100;
                 if(fileInfo.id != void 0)object.dataset_id = fileInfo.id;

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1 - 1
public/lib/potree/potree.js.map


+ 3 - 1
src/sdk/cover/index.js

@@ -543,6 +543,7 @@ export const enter = (dom, isLocal) => {
                 if(!props.isFirstLoad){
                     model.visible = false//先不显示,防止卡顿
                 }
+                
                 props.opacity < 100 && result.changeOpacity(props.opacity) 
                 
                 model.addEventListener('changeSelect',(e)=>{
@@ -642,10 +643,11 @@ export const enter = (dom, isLocal) => {
                     
                     if(model){
                         if(model.isPointcloud){
-                            setOp(model)  
+                            setOp(model)   
                         }else{
                             model.traverse(e=>e.material && setOp(e, opacity))
                         }
+                        model.opacity = opacity//记录在最外层
                     }
                      
                 },