Browse Source

截图等待点云加载完

xzw 1 year ago
parent
commit
a3a204c89b
5 changed files with 60 additions and 16 deletions
  1. 1 1
      src/Potree.js
  2. 17 4
      src/custom/potree.shim.js
  3. 9 5
      src/custom/settings.js
  4. 32 5
      src/custom/viewer/ViewerNew.js
  5. 1 1
      src/viewer/EDLRendererNew.js

+ 1 - 1
src/Potree.js

@@ -111,7 +111,7 @@ console.log('Potree ' + version.major + '.' + version.minor + version.suffix);
 export let pointBudget = 1 * 1000 * 1000;
 export let framenumber = 0;
 export let numNodesLoading = 0;
-export let maxNodesLoading = 4;
+export let maxNodesLoading =  4; 
 
 export const debug = {};
 

+ 17 - 4
src/custom/potree.shim.js

@@ -1201,8 +1201,8 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
 		let maxLevel = pointcloud.maxLevel == void 0 ? Infinity : pointcloud.maxLevel;
 		let level = node.getLevel();
 		let visible = insideFrustum;
-		visible = visible && !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget);
-		visible = visible && !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget); // pointcloud.pointBudget一直是Infinity
+		visible = visible && (Potree.settings.pointNoLimit || !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget));
+		visible = visible && (Potree.settings.pointNoLimit || !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget)); // pointcloud.pointBudget一直是Infinity
 		visible = visible && level <= maxLevel; //< 改为 <=
 		//visible = visible || node.getLevel() <= 2;
 
@@ -1314,7 +1314,7 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
 			lowestSpacing = Math.min(lowestSpacing, node.geometryNode.spacing);
 		}
 
-		if (numVisiblePoints + node.getNumPoints() > Potree.pointBudget) {
+		if (!Potree.settings.pointNoLimit && numVisiblePoints + node.getNumPoints() > Potree.pointBudget) {
 			break;
 		}
 
@@ -1477,11 +1477,24 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
         for (let i = 0; i < Math.min(maxNodesLoading, unloadedGeometry.length); i++) {
             unloadedGeometry[i].node.load(unloadedGeometry[i].pointcloud.pcoGeometry); 
         }   
+        if(!Potree.pointsLoading){
+            Potree.pointsLoading = true
+            console.log('startLoad')
+            viewer.dispatchEvent('startLoadPoints')
+        }  
+    }else{
+        if(Potree.pointsLoading){
+            Potree.pointsLoading = false
+            console.log('load done!')
+            setTimeout(()=>{
+                Potree.pointsLoading || viewer.dispatchEvent('pointsLoaded')
+            },50)
+            
+        } 
     }
     
     
     
-    
     //add:
     Potree.numVisiblePoints = numVisiblePoints
    

+ 9 - 5
src/custom/settings.js

@@ -129,21 +129,25 @@ const config = {//配置参数   不可修改
             maxLevelPercent: 0.4, //最小为0
             percentByUser:true, //如果用户定义了percent,使用用户的
             pointBudget : browser.isMobile() ? 1*1000*1000 : 2*1000*1000, 
-            minNodeSize :  40 / window.devicePixelRatio ,
+            minNodeSize :  50 / window.devicePixelRatio ,
         }, 
         middle:{//balanced  //不同场景相同级别所产生的numVisibleNodes和numVisiblePoints不同,如果分层比较细,可能要到level8才能看清,那么level5看到的点就很大且很少,如隧道t-e2Kb2iU
             maxLevelPercent: 0.7,
             percentByUser:true,
             pointBudget: browser.isMobile() ? 2.0*1000*1000 : 3.5*1000*1000, 
-            minNodeSize :  30 / window.devicePixelRatio ,
+            minNodeSize :  40 / window.devicePixelRatio ,
         },
         high:{//highQuality
             maxLevelPercent: 1, 
             percentByUser:true,
-            pointBudget:browser.isMobile() ? 3*1000*1000 : 6*1000*1000,  //原本最高是8,但是大部分电脑都太卡了,降
-            minNodeSize :   20 / window.devicePixelRatio  , //手机上因为像素点小,远一点的时候更需要加载密集的点云。(没事,有pointBudget限制着,会先从近处加载高级node,再远就不加载了)
+            pointBudget:browser.isMobile() ? 4*1000*1000 : 6*1000*1000,  //原本最高是8,但是大部分电脑都太卡了,降
+            minNodeSize :   40 / window.devicePixelRatio  , //手机上因为像素点小,远一点的时候更需要加载密集的点云。(没事,有pointBudget限制着,会先从近处加载高级node,再远就不加载了)
+        },
+        screenshot:{
+            maxLevelPercent: 1,  
+            pointBudget: 8*1000*1000,
+            minNodeSize :   40 / window.devicePixelRatio  ,  
         }
-       
  
         //数值由testLevelSteps得来,其中nodeMaxLevel为2时,low和middle的都是1,如果真有这么低的点云就单独处理下。
         //多个viewport尽量保证pointBudget一样,或者pointBudget不能太低于所需,否则会反复加载了又清除

+ 32 - 5
src/custom/viewer/ViewerNew.js

@@ -384,7 +384,7 @@ export class Viewer extends ViewerBase{
                 */ 
                  
                 this.composer = new EffectComposer( this.renderer );  
-                this.composer.scaleRatio = 4 //将底图和测量线绘制在一张高倍贴图上,for测量线不模糊
+                this.composer.scaleRatio = 2 //将底图和测量线绘制在一张高倍贴图上,for测量线不模糊
                 this.composer.readTarget = true  //把底图和测量线一起fxaa 
                 const renderPass = new RenderPass();
                 
@@ -3297,6 +3297,14 @@ export class Viewer extends ViewerBase{
             }
             
             {//恢复:
+                setTimeout(()=>{
+                    if(!this.screenshoting){
+                        Potree.settings.pointNoLimit = false  
+                        Potree.settings.pointDensity = 'high'
+                    }
+                },100) //延迟:避免连续多次截图时释放点云
+                this.screenshoting = false
+                
                 
                 if(info.type == 'measure'){
                     this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e, 'screenshot',true))
@@ -3409,7 +3417,9 @@ export class Viewer extends ViewerBase{
         Potree.Utils.updateVisible(this.reticule, 'screenshot', false)//令reticule不可见 
                                 
         
-        
+        //Potree.settings.pointNoLimit = true //使点云加载不受 pointBudget限制, 但缓存还是会有一个最大限制
+        Potree.settings.pointDensity = 'screenshot'
+            
         
         
         if(info.type == 'measure'){//要截图双屏 
@@ -3440,6 +3450,7 @@ export class Viewer extends ViewerBase{
             }
             
             let {promise}= this.focusOnObject(info.measurement, 'measure', 0,     {basePanoSize:1024}  )//注意:不同角度截图 得到三维的会不一样,因为focusOnObject是根据方向的
+            
             promise.done(()=>{  
                 //console.log('promise.done') 
                 //根据当前位置更新floorplan显示
@@ -3464,15 +3475,31 @@ export class Viewer extends ViewerBase{
                 
             })
             
-        }else{
-            screenshot()
+        }else{ 
+            //viewer.dispatchEvent('content_changed')
+            setTimeout(()=>{
+                if(Potree.pointsLoading){//如果还在加载
+                    viewer.addEventListener('pointsLoaded',()=>{
+                        screenshot() 
+                    },{once:true})
+                }else{
+                    screenshot() 
+                } 
+            },300)//先加载一段时间
+            
+            
+            
+            
+            
+            
+            
         }            
          
          /*
             测量线的截图因为要调用分屏的,会改变画面
             但是普通截图的话,不会改变画面
          */
- 
+        this.screenshoting = true
         return {getImagePromise:getImageDeferred.promise(), finishPromise:finishDeferred.promise()}
         
         

+ 1 - 1
src/viewer/EDLRendererNew.js

@@ -202,7 +202,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
         
         let target = params.target || null
         
-		const resolution = (rtEDL && Potree.settings.useRTPoint) ? new THREE.Vector2(rtEDL.width,rtEDL.height) : params.viewport ? params.viewport.resolution2 : this.viewer.renderer.getSize(new THREE.Vector2());//突然发现mobile用resolution2点云会放大
+		const resolution = (rtEDL && Potree.settings.useRTPoint) ? new THREE.Vector2(rtEDL.width,rtEDL.height) : params.target ? new THREE.Vector2(params.target.width, params.target.height ) : params.viewport ? params.viewport.resolution2 : this.viewer.renderer.getSize(new THREE.Vector2());//突然发现mobile用resolution2点云会放大