xzw 1 år sedan
förälder
incheckning
d021fc74e4

+ 9 - 5
src/ExtendPointCloudOctree.js

@@ -185,7 +185,7 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
             } 
             this.changePointOpacity()
         //}   
-        viewer.dispatchEvent('content_changed')  
+        viewer.dealBeforeRender || viewer.dispatchEvent('content_changed')  
     }
     
     //预测可能的nodeMaxLevel:
@@ -541,6 +541,9 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
     // 设置点大小
     changePointSize(num, sizeFitToLevel) {
         let size, nodeMaxLevel
+        
+        let dontRender = viewer.dealBeforeRender
+         
         if(this.material.pointSizeType != PointSizeType.ATTENUATED){
             num && (size = num / Potree.config.material.realPointSize / 1.3)
         }else{
@@ -591,20 +594,22 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
                 this.material.size = size
             }
         }
-        viewer.dispatchEvent('content_changed')     
+        dontRender || viewer.dispatchEvent('content_changed')     
          
     }  
     
     
     
     // 设置点透明度
-    changePointOpacity(num, canMoreThanOne) {
+    changePointOpacity(num, canMoreThanOne ) {
         //num:0-1   navvis用的是亮度
         if (num == void 0) {
             num = this.temp.pointOpacity
         } else {
             this.temp.pointOpacity = num
         }
+        let dontRender = viewer.dealBeforeRender //在执行beforeRender时更改的话不要发送content_changed 尤其分屏
+        
         
         if(Potree.settings.notAdditiveBlending){ 
             return this.material.opacity = num
@@ -651,8 +656,7 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
             this.material.opacity = opacity
         }
         
-        
-        viewer.dispatchEvent('content_changed') 
+        dontRender || viewer.dispatchEvent('content_changed') 
     } 
      
 

+ 1 - 0
src/Potree.js

@@ -180,6 +180,7 @@ export async function loadFile(path, params , callback, onError){
             callback && callback(data)    
             return data 
         }catch(e){
+            console.log('loadFile出错', e)
             onError && onError(e)
         }
           

+ 1 - 1
src/custom/modules/CameraAnimation/CameraAnimation.js

@@ -304,7 +304,7 @@ export class CameraAnimation extends THREE.EventDispatcher{
         positions.forEach(e=>e.z *= -1)  //因为得到的rotation是camera的,作用在物体上要反向,所以这里反向一下
         
 		//geometry.computeBoundingSphere();//? 
-		const line = LineDraw.createFatLine( positions, {material:getLineMat('frustum')})
+		const line = LineDraw.createFatLine( positions, {mat:getLineMat('frustum')})
          
         //line.scale.set(20, 20, 20); 
         line.visible = false

+ 5 - 2
src/custom/objects/Reticule.js

@@ -115,7 +115,8 @@ export default class Reticule extends THREE.Mesh{
         
         this.hidden = !0 
         transitions.start(lerp.property(this.material , "opacity", 0, ()=>{//progress
-            viewer.dispatchEvent('content_changed')
+            this.dispatchEvent({type:'update' })
+            //viewer.dispatchEvent('content_changed')
         }), duration,()=>{//done
             this.dispatchEvent({type:'update', visible:false})
         })  
@@ -136,7 +137,9 @@ export default class Reticule extends THREE.Mesh{
         
         if(this.material.opacity <= 0){
             transitions.start(lerp.property(this.material, "opacity", defaultOpacity, ()=>{//progress
-                viewer.dispatchEvent('content_changed')
+                this.dispatchEvent({type:'update' })
+                
+                //viewer.dispatchEvent('content_changed')
             }), duration,()=>{//done
                 this.dispatchEvent({type:'update', visible:false})
             }) 

+ 1 - 1
src/custom/potree.shim.js

@@ -1926,7 +1926,7 @@ LRU.prototype.freeMemory = function(){
     } 
     let memoryRatio = browser.isMobile() ? 2 : 5;
     //改成navvis的,使用pointBudget,否则四屏点云闪烁。 (似乎要比updateVisiblede的node时限制要宽些,作为缓存继续存着。否则会闪烁)
-    let max =  viewer.viewports.length * memoryRatio * Potree.pointBudget 
+    let max = THREE.Math.clamp( viewer.viewports.length * memoryRatio * Potree.pointBudget, 1e6, 40e6)
        
     for (; this.numPoints > max;  ) { 
         var node = this.getLRUItem();

+ 1 - 1
src/custom/settings.js

@@ -100,7 +100,7 @@ const config = {//配置参数   不可修改
         magnifier:{  
             maxLevelPercent: 1,
             pointBudget : 8*1000*1000,  
-        },
+        }, 
         panorama:{//显示全景时的漫游。因为点只能显示1个像素的大小,所以必须很密集,但又要限制点的数量
             maxLevelPercent: 0.6,
             pointBudget : /* 4*1000*1000// */browser.isMobile() ?  0.1*1000*1000 :  0.4*1000*1000,  //点云总最大数

+ 3 - 3
src/custom/utils/DrawUtil.js

@@ -55,7 +55,7 @@ var LineDraw = {
     
 	moveLine: function (line, posArr) {
         if(posArr.length == 0)return
-        posArr = dealPosArr(posArr)
+        if(!line.uncontinuous)posArr = dealPosArr(posArr)
         let position = []
         posArr.forEach(e=>position.push(e.x,e.y,e.z))
         line.geometry.setAttribute('position', new THREE.Float32BufferAttribute(/* new Float32Array( */position/* ) */, 3));
@@ -112,7 +112,7 @@ var LineDraw = {
 		var matLine = o.mat || this.createFatLineMat(o);
 		var line = new Line2( geometry, matLine );
 		//line.computeLineDistances();
-         
+        line.uncontinuous = o.uncontinuous //线不连续,由线段组成
 		line.scale.set( 1, 1, 1 );
 		line.renderOrder = 2;
         
@@ -127,7 +127,7 @@ var LineDraw = {
 	moveFatLine: function(line, posArr){
 		var geometry = line.geometry;
         var positions = [];
-        posArr = dealPosArr(posArr)
+        line.uncontinuous || (posArr = dealPosArr(posArr))
         posArr.forEach(e=>{positions.push(...e.toArray())})
          
 		 

+ 9 - 6
src/custom/utils/SplitScreen4Views.js

@@ -65,6 +65,9 @@ SplitScreen4Views.split = function(o={}){
     viewer.setLimitFar(false) 
     viewer.mapViewer.attachToMainViewer(true,'split4Screens','dontSet') 
     
+    viewer.renderer.clear() //clear back的viewport左边的1px宽的部分,因setScissor的bug
+    
+    
     let viewports = this.splitStart(viewportProps)
     
     //覆盖在map上、点云等其他物体之下的一层背景
@@ -124,7 +127,9 @@ SplitScreen4Views.split = function(o={}){
         }  */ 
     }) 
     
-    let beforeRender = function(){
+    let beforeRender = function(){ 
+        viewer.dealBeforeRender = true  //使不全部渲染
+        
         viewer.scene.pointclouds.forEach(e=>{ 
             if(this.name == "MainView"){ 
                 e.material.activeAttributeName = matBefore.colorType // 'rgba'
@@ -152,11 +157,9 @@ SplitScreen4Views.split = function(o={}){
                 }else{
                     Potree.Utils.updateVisible(pano.marker, 'showOnMap', false, 1, 'cancel'  ) 
                 }
-            })
- 
-
-            
-        })  
+            }) 
+        }) 
+        viewer.dealBeforeRender = false           
     }    
     viewports.forEach(viewport=>{viewport.beforeRender = beforeRender})
      

+ 58 - 7
src/custom/viewer/ViewerNew.js

@@ -659,13 +659,21 @@ export class Viewer extends ViewerBase{
         }
         
         
-        this.reticule.addEventListener('update',(e)=>{
+        /* this.reticule.addEventListener('update',(e)=>{
             this.needRender = true 
             if(this.mapViewer && this.mapViewer.attachedToViewer)this.mapViewer.needRender = true  //分屏时mapViewer也有reticule
+        }) */
+        
+        this.reticule.addEventListener('update',(e)=>{  
+            this.reticule.hoverViewport && (this.reticule.hoverViewport.needRender = true)
+            this.lazyRenderViewports()
+            if(this.mapViewer && this.mapViewer.attachedToViewer &&
+                 (this.mapViewer.viewports[0].needRender || this.needRender ) ) this.mapViewer.needRender = true  //分屏时mapViewer也有reticule
         })
         
+         
         this.addEventListener('pointcloud_changed',(e)=>{
-            this.needRender = true
+            this.lazyRenderViewports()
         })
         
         
@@ -832,6 +840,42 @@ export class Viewer extends ViewerBase{
         
 	}
     
+    lazyRenderViewports(updateCount){
+        //本来要写this.needRender = true的, 但在分四个屏时防止太卡而排队render
+        let viewports = this.viewports
+        if(viewports.length == 1 || this.needRender){
+            return this.needRender = true
+        }
+        
+          
+        const maxWaitTime = 200
+        
+        let now = Date.now()  
+       
+        let count = 1 
+          
+        viewports.forEach(e=>{ 
+            if(now - e.lastRenderTime  > maxWaitTime){
+                e.needRender = true 
+            }
+        }) 
+        
+        let useCount = viewports.filter(e=>e.needRender).length 
+        //console.log('useCount', useCount)
+         
+        let list = viewports.filter(e=>!e.needRender).sort((a,b)=>a.lastRenderTime - b.lastRenderTime)
+     
+        if(useCount < count){ 
+            list.slice(0, count - useCount).forEach(e=>{
+                e.needRender = true
+            })   
+        }else if(list[0] && now - list[0].lastRenderTime  > maxWaitTime){
+            list[0].needRender = true
+        } 
+         
+         
+    }
+    
     
      
     
@@ -3055,13 +3099,20 @@ export class Viewer extends ViewerBase{
                 }
                 if(width == 0 || height == 0)return
                 
-                let scissorTest = view.width<1 || view.height<1
+                let scissorTest =  view.width<1 || view.height<1  
                 if(params_.target){
                     params_.target.viewport.set(left, bottom, width, height);  
                     scissorTest && params_.target.scissor.set(left, bottom, width, height); 
                     params_.target.scissorTest = scissorTest
                     this.renderer.setRenderTarget(params_.target)
-                }else{        
+                }else{    
+                    /* if(viewports.length == 1 && left == 0 && bottom == 0){
+                        left = 1 , width-=1   //这种情况下渲染也会有问题,只有鼠标的地方刷新
+                    } */
+                    if(scissorTest && left == 0 && bottom == 0){
+                        left = 1 , width-=1 
+                    }
+                    
                     this.renderer.setViewport(left, bottom, width, height) //规定视口,影响图形变换(画布的使用范围) 
                     scissorTest && this.renderer.setScissor( left, bottom, width, height );//规定渲染范围
                     this.renderer.setScissorTest( scissorTest );//开启WebGL剪裁测试功能,如果不开启,.setScissor方法设置的范围不起作用 | width==1且height==1时开启会只有鼠标的地方刷新,很奇怪
@@ -3075,8 +3126,8 @@ export class Viewer extends ViewerBase{
              
             viewer.dispatchEvent({type: "render.begin",  viewer: viewer, viewport:view, params });
              
-           
-            view.beforeRender && view.beforeRender()
+          
+            view.beforeRender && view.beforeRender()  
             
             if(view.render){ 
                 if(!view.render($.extend({}, params, {
@@ -3115,7 +3166,7 @@ export class Viewer extends ViewerBase{
 
             this.dispatchEvent({type: "render.end",  viewer: this, viewport:view  }); 
             view.needRender = false
-             
+            view.lastRenderTime = Date.now()
         })
         
         

+ 2 - 2
src/custom/viewer/map/MapViewer.js

@@ -82,9 +82,9 @@ export class MapViewer extends ViewerBase{
         }) 
          
         //viewer.addEventListener("global_mousemove", this.updateWhenAtViewer.bind(this))  //鼠标移动时reticule也动,所以直接就needRender
-        viewer.reticule.addEventListener('update',(e)=>{
+        /* viewer.reticule.addEventListener('update',(e)=>{
             if(this.attachedToViewer)this.needRender = true 
-        })
+        }) */
          
         
         viewer.scene.addEventListener("360_images_added", this.addPanos.bind(this))