xzw 1 tahun lalu
induk
melakukan
a4b0dcbf0b

+ 1 - 1
src/custom/materials/DepthBasicMaterial.js

@@ -26,7 +26,7 @@ export default class DepthBasicMaterial extends THREE.ShaderMaterial{
             //-------add:-----
             replaceColor : {type:'v3', value: o.replaceColor ?  new THREE.Color(o.replaceColor) : null},
             beReplacedRed : {type:'f', value: o.beReplacedRed}, 
-            
+            mapScale:  { type: 'f', value:  o.mapScale || 1 },  //0-1
         }  
      
         super({ 

+ 1 - 1
src/custom/modules/panos/DepthImageSampler.js

@@ -11,7 +11,7 @@ class DepthImageSampler extends THREE.EventDispatcher{
         super()
         var canvas = document.createElement("canvas");
         this.canvas = canvas
-        this.context = canvas.getContext("2d")  
+        this.context = canvas.getContext("2d", {willReadFrequently: true})  
         this.imgDatas = []
         
         /* document.getElementsByTagName('body')[0].appendChild(canvas);

+ 3 - 3
src/custom/objects/Magnifier.js

@@ -149,8 +149,8 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
         this.add(this.overlayMesh)
         
         this.position.set(-1000,-1000,-100000)//令它看不见
-        this.mesh.renderOrder = 10;
-        this.overlayMesh.renderOrder = 11;
+        this.mesh.renderOrder = Potree.config.renderOrders.magnifier;
+        this.overlayMesh.renderOrder = Potree.config.renderOrders.magnifier+1;
         this.aimPos
         Potree.Utils.setObjectLayers(this, 'magnifier' )
         //viewer.inputHandler.addInputListener(this)
@@ -226,7 +226,7 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
         viewer.scene.view.addEventListener('flyingDone',()=>{
             if(!this.visible)return
             let pickWindowSize = 100
-            let intersect = viewer.inputHandler.getIntersect(viewer.mainViewport, viewer.mainViewport.camera, true, pickWindowSize )
+            let intersect = viewer.inputHandler.getIntersect({viewport:viewer.mainViewport,  usePointcloud:true, pickWindowSize} );
             this.update(intersect && intersect.location)
         })
     }

+ 1 - 1
src/custom/objects/Reticule.js

@@ -30,7 +30,7 @@ export default class Reticule extends THREE.Mesh{
         this.crosshairTex.anisotropy = 4 
         this.forbitTex.anisotropy = 4 
         //this.layers.set(0/* RenderLayers.RETICULE */);
-        this.renderOrder = 100
+        this.renderOrder = Potree.config.renderOrders.reticule
         this.layers.set(Potree.config.renderLayers.marker);
         
         

+ 30 - 11
src/custom/objects/tool/Measure.js

@@ -39,7 +39,7 @@ const textSizeRatio = math.linearClamp(window.innerWidth * window.innerHeight ,
  
 
 const markerSizeInfo = {
-    minSize : 30*2 ,  maxSize : 65*2,   nearBound : 0.2, farBound : 4,
+    minSize : 30*2 ,  maxSize : 60*2,   nearBound : 0.2, farBound : 4,
 }
 const labelSizeInfo = {width2d:190}
 const mainLabelProp = { 
@@ -50,7 +50,8 @@ const mainLabelProp = {
     textBorderThick:3,
     fontsize: 15 * textSizeRatio,  
     borderRadius : 12, margin:{x:20,y:4},
-    renderOrder : 8, pickOrder:8, 
+    renderOrder : Potree.config.renderOrders.measureLabel, 
+    pickOrder:Potree.config.renderOrders.measureLabel, 
     disToLine:-0.15,
     
     useDepth : true , 
@@ -68,7 +69,8 @@ const subLabelProp = {
     backgroundColor: {r: 255, g: 255, b: 255, a:config.measure.default.opacity},
     textColor: {r: 0.3, g: 0.3, b:0.3, a: 1.0},
     fontsize:15 * textSizeRatio,   borderRadius : 12,  margin:{x:20,y:4},
-    renderOrder : 7, pickOrder:7, 
+    renderOrder : Potree.config.renderOrders.measureLabelSub, 
+    pickOrder:Potree.config.renderOrders.measureLabelSub, 
 }
 
 
@@ -284,14 +286,15 @@ export class Measure extends ctrlPolygon{
 
           
             if(this.showDistances || this.labelText){ // edge labels
-                let edgeLabel = this.edgeLabels[index];
-                let distance = this.labelText || point.distanceTo(nextPoint)
-                edgeLabel.shouldVisi = (this.labelText || distance>0) && (index < lastIndex || this.isRect || this.closed && !this.isNew ) 
+                let edgeLabel = this.edgeLabels[index]; 
+                let distance = point.distanceTo(nextPoint)
+                let text = this.labelText || distance
+                edgeLabel.shouldVisi = distance>0 && (index < lastIndex || this.isRect || this.closed && !this.isNew ) 
                 /* this.closed || */edgeLabel.setVisible(edgeLabel.shouldVisi)  
                 if(edgeLabel.shouldVisi){
                     this.lineDir = new THREE.Vector3().subVectors(point,nextPoint).normalize() //[point,nextPoint]
                     
-                    setEdgeLabel(edgeLabel,point,nextPoint,distance)
+                    setEdgeLabel(edgeLabel,point,nextPoint,text)
                     
                 }
                 
@@ -429,12 +432,16 @@ export class Measure extends ctrlPolygon{
         if(this.measureType != 'MulDistance_shape')marker.posShift = new THREE.Vector3(0.2,0,0);//使箭头中心对准端点位置(因贴图里箭头不在中心,如果单纯改贴图会导致raycaster热区偏移,所以修改mesh位置)
          
         Potree.Utils.setObjectLayers(marker, 'measure' )
-        marker.pickOrder = marker.renderOrder = 6 
+        marker.pickOrder = marker.renderOrder = Potree.config.renderOrders.measureMarker;
+        
         marker.markerSelectStates = {} 
         marker.addEventListener('startDragging',(e)=>{
+            console.log('marker startdragging')
             viewer.inputHandler.dispatchEvent( {type: 'measuring',v:true, cause:'startDragging', situation:'dragging', object:this})
         })
         marker.addEventListener('drop',(e)=>{
+            console.log('marker drop')
+            this.lastDropTime = Date.now()
             viewer.inputHandler.dispatchEvent({type: 'measuring',  v:false, cause:'stopDragging', situation:'dragging', object:this}  )
             
             if(Potree.settings.adsorption){
@@ -462,7 +469,9 @@ export class Measure extends ctrlPolygon{
                 edge.removeEventListener('addHoverEvent', addHoverEvent);
                 
                 //2023.10.25add: 
-                edge.addEventListener('click',()=>{
+                edge.addEventListener('click',()=>{ 
+                    let now = Date.now()
+                    if(now-this.lastDropTime < 50)return ;//点击到marker了
                     if(!this.isNew) this.focus()
                 })
             }
@@ -572,6 +581,14 @@ export class Measure extends ctrlPolygon{
                 marker.material = this.getMarkerMaterial('default')
             } 
         } 
+        
+        
+        if(absoluteState){
+            marker.renderOrder = marker.pickOrder = Potree.config.renderOrders.measureMarker+1
+        }else{
+            marker.renderOrder = marker.pickOrder = Potree.config.renderOrders.measureMarker
+        }
+        
          
         marker.selected = absoluteState
         
@@ -883,7 +900,7 @@ export class Measure extends ctrlPolygon{
             edgeLabel.addEventListener('mouseleave',()=>{
                 this.setSelected(false, 'edgeLabel')
             })  
-            edgeLabel.addEventListener('click',()=>{
+            edgeLabel.addEventListener('click',()=>{ 
                 if(!this.isNew) this.focus()
             })
             //edgeLabel.sprite.material.opacity = config.measure.default.opacity
@@ -952,6 +969,7 @@ export class Measure extends ctrlPolygon{
                 replaceColor:new THREE.Color(Potree.config.measure.highlight.color),
                 beReplacedRed: 0.184,  //0.18431372
                 mapColorReplace:true,
+                mapScale:0.7
             })),
             markerMats['select_circle_' + color] = new DepthBasicMaterial($.extend({},lineDepthInfo,{ 
                 transparent: !0,
@@ -960,7 +978,8 @@ export class Measure extends ctrlPolygon{
                 //useDepth:true ,
                 replaceColor:  new THREE.Color(Potree.config.measure.highlight.color) ,
                 beReplacedRed: 0.184,   //0.18431372
-                mapColorReplace:true
+                mapColorReplace:true,
+                mapScale:0.7
             })) 
             markerMats['default_arrow_' + color] = new DepthBasicMaterial($.extend({},lineDepthInfo,{ 
                 transparent: !0,

+ 27 - 14
src/custom/objects/tool/MeasuringTool.js

@@ -182,26 +182,39 @@ export class MeasuringTool extends THREE.EventDispatcher{
                 beReplacedRed: 0.184, 
                 mapColorReplace:true,
             }), sizeInfo:   {
-                width2d:30,
-            }, name:"sorptionSign"} )
-            viewer.scene.scene.add(this.sorptionSign)  
+                width2d:44,
+            }, name:"sorptionSign", renderOrder : Potree.config.renderOrders.sorptionSign} )
+            
+            this.scene.add(this.sorptionSign) 
+            Potree.Utils.setObjectLayers(this.sorptionSign, 'measure' )            
             this.sorptionSign.visible = false
-            const minShowTime = 5e3;//改变位置后至少显示这么久才消失
-            let canFade
-            let fade = ()=>{
-                canFade = true
-            } 
+            
+            const showTime = {min:1000, max:3000 }; 
+            let canFade, timer1, timer2
+            
             viewer.addEventListener('findAdsorption',(e)=>{
-                clearTimeout(timer)
-                this.sorptionSign.visible = true
-                this.sorptionSign.position.copy(e.intersect.location)
-                canFade = false
-                timer = setTimeout(fade,minShowTime)
+                clearTimeout(timer1),clearTimeout(timer2)
+                
+                if(e.intersect){
+                    this.sorptionSign.visible = true
+                    this.sorptionSign.position.copy(e.intersect.location)
+                    this.sorptionSign.waitUpdate() 
+                    canFade = false
+                    timer1 = setTimeout(()=>{
+                        canFade = true
+                    } ,showTime.min)
+                    timer2 = setTimeout(()=>{
+                        this.sorptionSign.visible = false
+                        viewer.dispatchEvent('content_changed')
+                    } ,showTime.max)
+                }else{
+                    this.sorptionSign.visible = false
+                }
             })
             viewer.addEventListener('camera_changed',(e)=>{//minShowTime后移动镜头就消失
                 canFade && (this.sorptionSign.visible = false)
             })
-            //Potree.Utils.setObjectLayers(this.sorptionSign, 'measure' )
+            
        
         }
         

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

@@ -1,5 +1,6 @@
  
 import * as THREE from "../../libs/three.js/build/three.module.js";
+import {config, settings} from "./settings.js";
 import math from "./utils/math.js";
 import browser from "./utils/browser.js"; 
 import cameraLight from "./utils/cameraLight.js";

+ 16 - 3
src/custom/settings.js

@@ -181,7 +181,7 @@ const config = {//配置参数   不可修改
         lineWidth: 3,
        
         textColor: "#000000", //"#FFFFFF"
-        adsorptMinDis:30,
+        adsorptMinDis:40,
     },
     material:{//初始化
         pointSize: 0.1,  
@@ -238,7 +238,19 @@ const config = {//配置参数   不可修改
     },
     
     renderOrders:{ //会影响到绘制、pick时的顺序。
-        model:10
+        lines:5,
+        reticule:5,
+        measureMarker: 6,
+        measureLabelSub: 7,
+        measureLabel: 8,
+        sorptionSign:10,
+        model:10,
+        
+        
+        magnifier:50,
+        
+        
+        
     }, 
     siteModel:{
         names:{
@@ -445,7 +457,8 @@ let settings = {//设置   可修改
   
  
 settings.isLocalhost = settings.prefix.includes('localhost')
-
+Potree.config = config
+Potree.settings = settings
 console.log('2023-1')
  
 export {config, settings}

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

@@ -46,7 +46,7 @@ var LineDraw = {
         
         
         var line = new THREE.LineSegments(new THREE.BufferGeometry, mat);
-		line.renderOrder = o.renderOrder || 4
+		line.renderOrder = o.renderOrder || Potree.config.renderOrders.lines
   
         this.moveLine(line, posArr)
         
@@ -117,7 +117,7 @@ var LineDraw = {
         
         
 		line.scale.set( 1, 1, 1 );
-		line.renderOrder = 5;
+		line.renderOrder = Potree.config.renderOrders.lines;
         if(o.renderOrderShift){
             line.renderOrder += o.renderOrderShift
         }

+ 17 - 9
src/materials/shaders/depthBasic.fs

@@ -1,6 +1,6 @@
 varying vec2 vUv;
 uniform float opacity;
-
+uniform float mapScale;
 uniform vec3 baseColor;
 
 #if defined use_map
@@ -42,16 +42,24 @@ uniform vec3 baseColor;
   
 vec4 getMapColor(vec4 color){
     #if defined use_map
-        
-        vec4 mapColor = texture2D(map, vUv); 
-        
+        vec4 mapColor;
+        if(mapScale == 1.0){
+            mapColor = texture2D(map, vUv) * color;  
+        }else{
+            vec2 uv = (vUv - 0.5) / mapScale + 0.5; 
+            if(uv.x > 1.0 || uv.y > 1.0 || uv.x < 0.0 || uv.y < 0.0){
+                //color = vec4(0.0,0.0,0.0,0.0);
+                discard;
+            }else{
+                mapColor = texture2D(map, uv) * color; 
+            }
+             
+        }
+         
         #if defined mapColorReplace
-            //主要为了测量线marker。 假设此图中仅有两种颜色,另一种是白色
-           
+            //主要为了测量线marker。 假设此图中仅有两种颜色,另一种是白色 
             const vec3 mapAnotherColor = vec3(1.0,1.0,1.0);
-            //uniform vec4 replaceColor;//新的颜色 
-            
-               
+              
             if(mapColor.r < beReplacedRed){//要被取代的颜色
                 mapColor = vec4(replaceColor, mapColor.a);
             }/*else if(mapColor.r>mapTextColotR){

+ 7 - 5
src/navigation/InputHandlerNew.js

@@ -885,13 +885,15 @@ export class InputHandler extends THREE.EventDispatcher {
                     object: min[0].object,
                     adsorption:true
                 }
-                console.log('找到吸附点', min[0].pos3d, min[0].object.uuid)
+                //console.log('找到吸附点', min[0].pos3d, min[0].object.uuid)
+                
                 
-                viewer.dispatchEvent({
-                    type:'findAdsorption',
-                    intersect
-                })
             } 
+            viewer.dispatchEvent({
+                type:'findAdsorption',
+                intersect
+            })
+              
         } 
         
         if(!intersect){