Переглянути джерело

screenshot use canvas directly

xzw 1 рік тому
батько
коміт
a745a65f54

+ 1 - 1
src/custom/materials/postprocessing/EffectComposer.js

@@ -179,7 +179,7 @@ Object.assign(  EffectComposer.prototype, {
 
         scaleRatio = scaleRatio || this.scaleRatio || 1;
         //console.log('setSize', width * scaleRatio, height * scaleRatio)
-        let maxTexWidth = 8192
+        let maxTexWidth = 4096
         let w = width * scaleRatio
         let h = height * scaleRatio
         if(w > maxTexWidth || h > maxTexWidth){ //超出会崩溃

+ 91 - 42
src/custom/viewer/ViewerNew.js

@@ -430,7 +430,7 @@ export class Viewer extends ViewerBase{
                  
                  
                 
-                this.fxaaPass = new ShaderPass( FXAAShader );  
+                /* this.fxaaPass = new ShaderPass( FXAAShader );  
                 this.fxaaPass.readTarget = true //add 
                 this.fxaaPass.setSize = function(width, height){
                     this.material.uniforms[ 'resolution' ].value.x = 1 / ( width )  ;
@@ -438,7 +438,7 @@ export class Viewer extends ViewerBase{
                 } 
                 this.fxaaPass.renderToScreen = true;
                 
-				this.composer.addPass( this.fxaaPass ); 
+				this.composer.addPass( this.fxaaPass );  */
                 //抗锯齿截图 效果时而好时而不好,文字比较模糊
                 
                 
@@ -3188,17 +3188,9 @@ export class Viewer extends ViewerBase{
         
        
         
-        if(params_.screenshot){ //抗锯齿
-            /* params_.target.viewport.set(0, 0, params_.target.width, params_.target.height);  
-            //scissorTest && params_.target.scissor.set(left, bottom, width, height); 
-            params_.target.scissorTest = false 
-            this.renderer.setRenderTarget(params_.target) 
-            this.composer.render();  
-            this.renderer.setRenderTarget(params_.target) //本想再画一层标签,但是viewport总是出错  */
-            
-            this.composer.render();  
-            
-        }  
+        /* if(params_.screenshot){ //抗锯齿 
+            this.composer.render();   
+        } */  
         
         
         this.renderer.setRenderTarget(null)
@@ -3416,7 +3408,7 @@ export class Viewer extends ViewerBase{
         
         Potree.settings.useRTPoint = !(SiteModel.editing && SiteModel.selected && SiteModel.selected.buildType == 'room' )//空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
         
-        Potree.settings.pointEnableRT = this.scene.measurements.length > 0 || !Potree.settings.useRTPoint 
+        Potree.settings.pointEnableRT = !this.screenshoting && (this.scene.measurements.length > 0 || !Potree.settings.useRTPoint )
         
          
         if(vrActive){
@@ -3491,8 +3483,16 @@ export class Viewer extends ViewerBase{
             
             this.needRender = true
             
-            let { dataUrl  } = viewerMaster.makeScreenshot( new THREE.Vector2(width,height), null, compressRatio    );
-           
+            if(info.useRenderTarget){
+                //离屏渲染 有抗锯齿问题、在手机上速度慢
+                var { dataUrl  } = viewerMaster.makeScreenshot( new THREE.Vector2(width,height), null, compressRatio    );
+                
+            }else{
+                //直接渲染 会改变canvas大小
+                let canvas = this.renderArea.getElementsByTagName('canvas')[0] 
+                this.render({  screenshot : true,   width , height,   resize :true  }); //需要resize
+                var dataUrl = canvas.toDataURL('image/jpeg',compressRatio) 
+            }
             
             
             if(!Potree.settings.isOfficial){
@@ -3505,8 +3505,8 @@ export class Viewer extends ViewerBase{
                 
                 oldStates.viewports.forEach(old=>{//恢复相机
                     var viewport = viewports.find(v=>v.name == old.name);
-                    viewport.left = old.left;
-                    viewport.width = old.width;
+                    viewport.left = old.left; viewport.bottom = old.bottom;
+                    viewport.width = old.width; viewport.height = old.height
                     viewport.view.copy(old.view) 
                     viewport.view.applyToCamera(viewport.camera);  
                      
@@ -3526,18 +3526,26 @@ export class Viewer extends ViewerBase{
                  
                 finishDeferred.resolve({dataUrl, pose})
                
-                console.log('screenshot done: '+sid)
-            }
-            
-            {//恢复:
-                
+               
                 setTimeout(()=>{
                     if(!this.screenshoting){
-                        //otree.settings.pointNoLimit = false  
+                        //Potree.settings.pointNoLimit = false  
                         Potree.settings.pointDensity = 'high'
+                        console.warn('恢复pointDensity') 
+                        /* if(viewer.scene.pointclouds[0].material.oldSize_ ){
+                            viewer.scene.pointclouds[0].material.size = viewer.scene.pointclouds[0].material.oldSize_ 
+                            viewer.scene.pointclouds[0].material.oldSize_ = null   
+                        } */                        
                     }
-                },100) //延迟:避免连续多次截图时释放点云
+                },500) //延迟:避免连续多次截图时释放点云
                 this.screenshoting = false
+               
+                console.log('screenshot done: '+sid)
+            }
+            
+            {//恢复:
+                
+                 
                 
                 if(info.type == 'measure'){
                     this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e, 'screenshot',true))
@@ -3556,9 +3564,13 @@ export class Viewer extends ViewerBase{
                     
                     if(oldStates.attachedToViewer != this.mapViewer.attachedToViewer){
                         if(info.type == 'measure'){
-                            this.mapViewer.attachToMainViewer(false ) 
+                            this.mapViewer.attachToMainViewer(false )   
                         } 
                     }
+                    if(this.mapViewer.splitDir != oldStates.oldSplitDir){
+                        this.mapViewer.changeSplitScreenDir(oldStates.oldSplitDir)
+                    }
+                    
                     
                     
                     mapViewport.camera.zoom = oldStates.mapZoom
@@ -3629,29 +3641,65 @@ export class Viewer extends ViewerBase{
         
         
         let waitPointLoad = (done)=>{ 
-            done = done || screenshot 
-            let maxTime = 4000;
+            let finish
+                done = done || screenshot 
+            let dealDone = ()=>{
+                //viewer.removeEventListener('overPointBudget',decreaseLevel)      
+                finish || done()
+                finish = true
+            }
+            let decreaseLevel = ()=>{ //降点云level
+                let levels = viewer.scene.pointclouds[0].visibleNodes.map(e=>e.getLevel()) 
+                //console.log(levels)
+                let actMaxLevel = Math.max.apply(null, levels) //实际加载到的最高的node level
+                console.warn('decreaseLevel, 新maxLevel', actMaxLevel - 1, '原maxlevel', viewer.scene.pointclouds[0].maxLevel, 'numVisiblePoints', Potree.numVisiblePoints) 
+                /* viewer.scene.pointclouds[0].maxLevel = actMaxLevel - 1
+                viewer.scene.pointclouds[0].material.oldSize_ = viewer.scene.pointclouds[0].material.size
+                viewer.scene.pointclouds[0].material.size *= 1.5 */
+            }
+            if(Potree.settings.displayMode == 'showPointCloud'){
+                viewer.updateScreenSize({forceUpdateSize:true, width, height})//需要先setSize才能加载范围内的点云
+            }
+            
+            
+            let maxTime = 3000
             setTimeout(()=>{
-                if(Potree.pointsLoading){//如果还在加载
-                    let finish
+                if(Potree.pointsLoading && Potree.settings.displayMode == 'showPointCloud'){//如果还在加载 
                     
-                    viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确)
-                        finish || done() 
-                        finish = true
+                    viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确) 
+                        if(!finish)console.warn('加载完毕', ' numVisiblePoints', Potree.numVisiblePoints)                         
+                        dealDone()
                     },{once:true})
-                    
-                    setTimeout(()=>{//超时不候
-                        finish || done() 
-                        finish = true
+                    let lastNumVisiblePoints  
+                    /* { //perspective的不需要,远处加载不完也没大碍
+                        setTimeout(()=>{//超时不候 
+                            if(!finish ){
+                                console.warn('加载时间达最长限制的50%,降level, numVisiblePoints', Potree.numVisiblePoints)  
+                                lastNumVisiblePoints = Potree.numVisiblePoints      
+                                decreaseLevel() //加载时间过长 
+                            } 
+                        },maxTime*0.5)
+                        setTimeout(()=>{// 第一次降有可能没效果,因为大部分level不是最高的
+                            console.warn('加载时间达最长限制的60%,numVisiblePoints', Potree.numVisiblePoints)        
+                            if(!finish && (Potree.numVisiblePoints - lastNumVisiblePoints) > -20000  ){ //没怎么降
+                                console.warn('加载时间达最长限制的60%,降level, numVisiblePoints', Potree.numVisiblePoints)        
+                                decreaseLevel() //加载时间过长
+                            } 
+                        },maxTime*0.6)
+                    } */
+                    setTimeout(()=>{//超时不候 
+                        if(!finish)console.warn('超时, numVisiblePoints', Potree.numVisiblePoints)  
+                        dealDone()
                     },maxTime)
                 }else{
-                    done() 
+                    dealDone()
                 } 
             },200)//先加载一段时间
+            
+            
+             
         }
         
-        
-         
             
         let waitPointsTime = Potree.settings.displayMode == 'showPointCloud' ? 300 : 0 //等点云加载  
         
@@ -3663,7 +3711,8 @@ export class Viewer extends ViewerBase{
             
             //因为分屏后位置才最终确定,才能确定是否显示出floorplan所以先分屏
             if(Potree.settings.floorplanEnable){ 
-                this.mapViewer.attachToMainViewer(true, 'measure', 0.5  ) 
+                oldStates.oldSplitDir = this.mapViewer.splitDir
+                this.mapViewer.attachToMainViewer(true, 'measure', 0.5 ,  {dir:'leftRight'} ) 
             }  
             viewer.updateScreenSize({forceUpdateSize:true, width, height}) //更新viewports相机透视 使focusOnObject在此窗口大小下
              
@@ -3696,7 +3745,7 @@ export class Viewer extends ViewerBase{
                 
                 //console.log('currentFloor', this.modules.SiteModel.currentFloor, 'currentDataset', this.atDatasets )    
                  
-                let floorplanShowed = this.mapViewer.mapLayer.maps.some(e => e.name.includes('floorplan') && e.objectGroup.visible)
+                let floorplanShowed = this.mapViewer.mapLayer.maps.some(e => e.name.includes('floorplan') && e.objectGroup.visible)//如果没有floorplan展示就不分屏(如果focus时飞出数据集从而不展示怎么办。尤其是俯瞰比较长的线时容易这样,或许要根据其所在数据集强制显示)
                 if(!floorplanShowed && this.mapViewer.attachedToViewer){ 
                     this.mapViewer.attachToMainViewer(false) //取消分屏
                     viewer.updateScreenSize({forceUpdateSize:true, width, height}) //更新viewports相机透视