xzw 1 年之前
父節點
當前提交
a15948305f

+ 11 - 9
libs/three.js/lines/LineMaterial.js

@@ -870,7 +870,13 @@ class LineMaterial extends ShaderMaterial {
                 
             },
             render:(e)=>{//before render  如果有大于两个viewport的话,不同viewport用不同的depthTex
-                this.updateDepthParams(e)
+                this.useDepth && this.updateDepthParams(e)
+                
+                var viewport = e.viewport || viewer.mainViewport;
+                if(viewport != this.lastViewport){              //当mapViewer要渲染测量线后,就需要变viewport
+                    this.events.setSize({viewport})
+                }
+                this.lastViewport = viewport
             } 
         }
             
@@ -879,8 +885,9 @@ class LineMaterial extends ShaderMaterial {
         let viewport = viewer.mainViewport; 
         this.events.setSize({viewport})  
         
-        viewer.addEventListener('resize', this.events.setSize)  
-       
+        viewer.addEventListener('resize', this.events.setSize)   
+        viewer.addEventListener("render.begin",  this.events.render)   
+            
         
 	}
     
@@ -899,12 +906,7 @@ class LineMaterial extends ShaderMaterial {
             this.setRealDepth(value) 
             this.useDepth_ = value 
              
-            if(value){
-                viewer.addEventListener("render.begin",  this.events.render)   
-                this.updateDepthParams() 
-            }else{
-                viewer.removeEventListener("render.begin",  this.events.render)   
-            }
+            
         }
         
     } 

+ 9 - 2
src/custom/modules/clipModel/Clip.js

@@ -286,8 +286,15 @@ var Clip = {
     },
     
     initViews(){
-        if(this.views)return
-        
+        if(this.views){
+            
+            this.views.top.pitch = -Math.PI
+            this.views.top.yaw = 0
+            this.views.front.pitch = 0
+            this.views.front.yaw = 0        //--还原for bugID 44757
+            
+            return
+        }
         
         this.views = {}
         this.cameras = {}

+ 4 - 2
src/custom/objects/Sprite.js

@@ -164,8 +164,10 @@ export default class Sprite extends THREE.Mesh{
                     Potree.Utils.updateVisible(this, 'unableCompute', !!state)
                 }
                 
+                let renderer = e.viewer ? e.viewer.renderer : e.renderer
+                let r1 = Potree.Utils.getPos2d(center,   e.viewport,  renderer.domElement.parentElement, renderer); 
                 
-                let r1 = Potree.Utils.getPos2d(center,   e.viewport,  viewer.renderArea, viewer.renderer); 
+                //let r1 = Potree.Utils.getPos2d(center,   e.viewport,  viewer.renderArea, viewer.renderer); 
                 if(!r1.trueSide)return  setVisi(false);// 但这句会使realVisible为false从而无法更新//console.error('!r1.trueSide') //中心点如果在背面直接不渲染了
                     
                 let r2, point2
@@ -174,7 +176,7 @@ export default class Sprite extends THREE.Mesh{
                 while(p2State != 'got' && p2StateHistory.length<10){ 
                     point2 = center.clone().add(this.root.lineDir.clone().multiplyScalar(len));
                      
-                    r2 = Potree.Utils.getPos2d(point2, e.viewport , viewer.renderArea, viewer.renderer  );  
+                    r2 = Potree.Utils.getPos2d(point2, e.viewport , renderer.domElement.parentElement, renderer );  
                     if(!r2.trueSide){ //很少遇到点2在背面的
                         if(!p2StateHistory.includes('tooLong-reverse')){
                             p2State = 'tooLong-reverse'  //先尝试反向

+ 2 - 2
src/custom/objects/tool/MeasuringTool.js

@@ -669,9 +669,9 @@ export class MeasuringTool extends THREE.EventDispatcher{
             this.viewer.composer.render(this.scene, o.camera );  
         }else{ */
         
-            viewer.dispatchEvent({type: "render.begin2" , name:'measure', viewport:o.viewport  })
+            viewer.dispatchEvent({type: "render.begin2" , name:'measure', viewport:o.viewport, renderer:o.renderer  })
             renderer.render(this.scene, o.camera );
-        //}
+        //} 
 	}
     
     

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

@@ -3914,7 +3914,7 @@ export class Viewer extends ViewerBase{
             
             let {promise} = this.focusOnObject(info.measurement, 'measure', 0, {
                 basePanoSize:1024,  gotoBestView:true,
-                minMapWidth: THREE.Math.clamp(Math.min(viewer.bound.boundSize.x,  viewer.bound.boundSize.y) / (8/* this.mapViewer.mapLayer.maps.find(e=>e.name == 'map').disabled  ? 6 : 3*/),  2, 25)           //有地图的话为了显示出名字需要更大范围
+               //minMapWidth: THREE.Math.clamp(Math.min(viewer.bound.boundSize.x,  viewer.bound.boundSize.y) / (20/* this.mapViewer.mapLayer.maps.find(e=>e.name == 'map').disabled  ? 6 : 3*/),  2, 25)           //有地图的话为了显示出名字需要更大范围
             })//注意:不同角度截图 得到三维的会不一样,因为focusOnObject是根据方向的
             promise.done(()=>{  
                 //console.log('promise.done') 
@@ -4140,7 +4140,9 @@ export class Viewer extends ViewerBase{
                 }
                 let boundSizeOri = boundOri.getSize(new THREE.Vector3)
                  
-                let boundSizeMap = boundSizeOri.clone().multiplyScalar(o.boundExpandRatio || 1.5)
+                let boundSizeMap = boundSizeOri.clone().multiplyScalar(o.boundExpandRatio || math.linearClamp(Math.max(boundSizeOri.x, boundSizeOri.y) , [0.5, 30], [2.5, 1.2]))//为了能同时看清测量线和地图,当测量线较短时,扩大margin,防止地图过度放大
+                
+                
                 boundSizeMap.x = Math.max(minBound.x, boundSizeMap.x )
                 boundSizeMap.y = Math.max(minBound.y, boundSizeMap.y )
                 this.mapViewer.moveTo(target.clone(), boundSizeMap, duration, o.margin, null,  done)
@@ -4210,6 +4212,7 @@ export class Viewer extends ViewerBase{
                     let hfov = cameraLight.getHFOVForCamera(camera, true);
                     dis = boundSize.x/2 / Math.tan(hfov / 2) + boundSize.z/2
                 }
+                dis += camera.near
             }
             dis = Math.max(0.1,dis)
             

+ 18 - 3
src/custom/viewer/map/MapViewer.js

@@ -41,7 +41,8 @@ export class MapViewer extends ViewerBase{
     constructor(dom){
         super(dom, {
             clearColor: Potree.config.mapBG,
-            name: 'mapViewer',  //antialias:true
+            name: 'mapViewer',  
+            antialias:true
         })
         this.visible = true
         this.initScene()
@@ -52,7 +53,7 @@ export class MapViewer extends ViewerBase{
         this.mapLayer.sceneGroup.position.setZ(Potree.config.map.mapHeight)
         this.mapRatio = 0.5 
         this.splitDir = 'leftRight'
-        
+        this.renderMeasure = false
         
         //因context的preserveDrawingBuffer为false之后,canvas渲染多个viewport时会自动clear,所以若不渲染就会是空的。所以没有变化时就直接拷贝buffer好了。
         this.copyPass = new ShaderPass( CopyShader );
@@ -600,7 +601,7 @@ export class MapViewer extends ViewerBase{
             this.viewports[0].height = 1;
             this.viewports[0].left = 0;
             
-            this.inputHandler.unregisterInteractiveScene(viewer.measuringTool.scene);
+            this.renderMeasure || this.inputHandler.unregisterInteractiveScene(viewer.measuringTool.scene);
             this.inputHandler.unregisterInteractiveScene(viewer.scene.scene);
             viewer.viewports = [viewer.mainViewport]
             this.updateScreenSize({forceUpdateSize:true}) //更新相机projectionMatrix
@@ -625,6 +626,16 @@ export class MapViewer extends ViewerBase{
         this.needRender = true
     }
     
+    
+    setDrawMeasure(draw){ 
+        this.renderMeasure = !!draw
+        if(draw){
+            this.inputHandler.registerInteractiveScene(viewer.measuringTool.scene);
+        }else{
+            this.inputHandler.unregisterInteractiveScene(viewer.measuringTool.scene);
+        }
+    }
+    
     changeSplitScreenDir(dir, mapRatio){//左右 | 上下
         //if(!dir || dir == this.dir)return 
         if(dir )this.splitDir = dir
@@ -759,6 +770,10 @@ export class MapViewer extends ViewerBase{
         renderer.render(this.scene, this.camera);
         this.attachedToViewer || renderer.render(viewer.scene.scene, this.camera); //类同renderOverlay
         
+        if(!this.attachedToViewer && this.renderMeasure){//在未attach到主页面时也要渲染测量线
+            viewer.dispatchEvent({type: "render.pass.perspective_overlay", camera:this.camera, /* screenshot:params.screenshot, */viewport:this.viewports[0], renderer});
+        }
+             
            
         renderer.setRenderTarget(null)