浏览代码

fix: Merge branch 'master' of http://192.168.0.115:3000/bill/fuse-code

bill 3 年之前
父节点
当前提交
18a15f3aaf

+ 67 - 43
public/lib/potree/potree.js

@@ -731,7 +731,7 @@
         webSite:'testdata',//'data', //不同环境对应的静态文件的地址不同
         
         isLocal:false, //是否本地 局域网版本
-        
+        libsUrl:'../libs/',
         displayMode:'',
         isTest :browser.urlHasValue('test'),
         prefix: getPrefix(),
@@ -63785,17 +63785,22 @@ void main() {
         Potree.addModel = function(prop, done, onprogress){ //加载模型
             let isFirstLoad = !prop.position; //在编辑时用户添加的
         
-            let loadDone = (model)=>{
-                modelEditing = model;
+            let loadDone = (model)=>{ 
                 if(isFirstLoad){
+                    modelEditing = model;
                     MergeEditor.setModelBtmHeight(model, 0); //默认离地高度为0
                     viewer.addEventListener('global_mousemove', moveModel); 
                     viewer.addEventListener('global_click', confirmPos, 3);
+                }else {
+                    modelEditing = null;
                 }
                 model.updateMatrixWorld();
                 viewer.updateModelBound();
                 
-                done(modelEditing);
+                
+                model.boundCenter = model.boundingBox.getCenter(new Vector3);
+                
+                done(model);
             };
         
             if(prop.type == 'laser'){
@@ -63803,14 +63808,15 @@ void main() {
                     pointcloud.matrixAutoUpdate = true;
                     pointcloud.initialPosition = pointcloud.position.clone();
                     
-                     
                     pointcloud.pos1MatrixInvert = new Matrix4().setPosition(pointcloud.initialPosition).invert();
+                    
                     let maintainBtmZ = ()=>{
-                        MergeEditor.setModelBtmHeight(object);
+                        MergeEditor.setModelBtmHeight(pointcloud);
                         updateMatrix();
                     };
                     let updateMatrix = ()=>{ 
                         setMatrix(pointcloud); 
+                        pointcloud.dispatchEvent('transformChanged');
                     };
                     pointcloud.addEventListener('position_changed', updateMatrix );  
                     pointcloud.addEventListener("orientation_changed", maintainBtmZ );
@@ -63858,6 +63864,8 @@ void main() {
                     let updateBound = ()=>{ 
                         object.updateMatrixWorld();
                         viewer.updateModelBound();
+                        object.dispatchEvent('transformChanged');
+                        
                     };  
                     let maintainBtmZ = ()=>{
                         MergeEditor.setModelBtmHeight(object);
@@ -83748,13 +83756,13 @@ void main() {
         return Math.acos(MathLight.dot(e, t))
     };
 
-    var cameraLight$1 = {
+    var cameraLight = {
         clampVFOV: function(currentFov, maxHFov, width, height) {//限制currentFov, 使之造成的横向fov不大于指定值maxHFov
-            var r = cameraLight$1.getHFOVFromVFOV(currentFov, width, height);
-            return r > maxHFov ? cameraLight$1.getVFOVFromHFOV(maxHFov, width, height) : currentFov
+            var r = cameraLight.getHFOVFromVFOV(currentFov, width, height);
+            return r > maxHFov ? cameraLight.getVFOVFromHFOV(maxHFov, width, height) : currentFov
         },
         getHFOVForCamera: function(camera,  getRad) {
-            return cameraLight$1.getHFOVByScreenPrecent(camera.fov, camera.aspect, getRad)
+            return cameraLight.getHFOVByScreenPrecent(camera.fov, camera.aspect, getRad)
         }, 
         //add
         getHFOVByScreenPrecent: function(fov, percent, getRad) { //当fov为占比百分百时,percent代表在屏幕上从中心到边缘的占比
@@ -84044,7 +84052,7 @@ void main() {
                             }  */
                             let lastIntersect = viewport.lastIntersect ? (viewport.lastIntersect.location || viewport.lastIntersect) : viewer.bound.center;  //该viewport的最近一次鼠标和点云的交点
                             let speed = camera.position.distanceTo(lastIntersect);   
-                            let fov = cameraLight$1.getHFOVForCamera(camera, true);
+                            let fov = cameraLight.getHFOVForCamera(camera, true);
                             let ratio = speed  * Math.tan(fov/2); 
                             this.translationDelta.x -= e.drag.pointerDelta.x  * ratio;
                             this.translationDelta.z -= e.drag.pointerDelta.y  * ratio; 
@@ -85476,6 +85484,11 @@ void main() {
             } 
             
             if(e.onlyGetIntersect){ 
+                if(Potree.settings.intersectOnObjs){
+                    this.hoveredElements = this.getHoveredElements(); //应该不用发送mouseover事件吧
+                    return this.getWholeIntersect()
+                }
+             
                 return intersectPoint
             }
             e.preventDefault();
@@ -93019,7 +93032,7 @@ void main() {
                     if(ifNeighbour){//点云模式下未加载的点云会判断为true
                         let dir = new Vector3().subVectors(pano1.position,pano0.position).normalize();
                         let dis = pano1.position.distanceTo(pano0.position);
-                        let hfov = cameraLight$1.getHFOVForCamera(viewer.mainViewport.camera , true  );
+                        let hfov = cameraLight.getHFOVForCamera(viewer.mainViewport.camera , true  );
                         let max = Math.cos(MathUtils.degToRad(10));
                         let min = Math.cos(MathUtils.degToRad(80));
                         if(this.getDirection().dot(dir) < MathUtils.clamp(Math.cos(hfov/2/* THREE.Math.degToRad(40) */) * dis / 10, min, max )){//距离越远要求和视线角度越接近
@@ -93265,7 +93278,7 @@ void main() {
                 if(camera.aspect > aspect){//视野更宽则用bound的纵向来决定
                     dis = /* size.y */o.boundSphere.radius/* / 2  *// MathUtils.degToRad(camera.fov / 2);
                 }else {
-                    let hfov = cameraLight$1.getHFOVForCamera(camera , true  );
+                    let hfov = cameraLight.getHFOVForCamera(camera , true  );
                     dis = /* size.x */ o.boundSphere.radius /* / 2 */ /  (hfov / 2); 
                 } 
                  
@@ -105643,7 +105656,7 @@ ENDSEC
 
     var GLTFLoader = ( function () {
 
-    	function GLTFLoader( manager, renderer ) {
+    	function GLTFLoader( manager, renderer, urlPrefix) {
      
     		Loader.call( this, manager );
 
@@ -105658,9 +105671,9 @@ ENDSEC
             this.meshoptDecoder = MeshoptDecoder;
             this.ddsLoader = new DDSLoader; //这个没测过
             
-            //路径相对于index.html
-            this.dracoLoader.setDecoderPath(  '../libs/three.js/loaders/draco/'  /* 'static/lib/three.js/loaders/draco/' */); //这两个路径可以自己改。在laser的环境也要放一份这个路径
-            this.ktx2Loader.setTranscoderPath('../libs/three.js/loaders/ktx/'  /* 'static/lib/three.js/loaders/ktx/' */ ).detectSupport( renderer );
+            //路径相对于index.html  
+            this.dracoLoader.setDecoderPath( urlPrefix + 'three.js/loaders/draco/'   /* '../libs/three.js/loaders/draco/'  */ /* 'static/lib/three.js/loaders/draco/' */); //这两个路径可以自己改。在laser的环境也要放一份这个路径
+            this.ktx2Loader.setTranscoderPath(urlPrefix + 'three.js/loaders/ktx/' /* '../libs/three.js/loaders/ktx/'  */ /* 'static/lib/three.js/loaders/ktx/' */ ).detectSupport( renderer );
         
             //------------
 
@@ -114962,11 +114975,18 @@ ENDSEC
                 }
                 this.selected = model;
                 MergeEditor.focusOnSelect(model);  
-                viewer.outlinePass.selectedObjects = [pointcloud];
+                viewer.outlinePass.selectedObjects = [model];
             }else { 
                 viewer.outlinePass.selectedObjects = [];
             } 
             
+            
+            if(model.isPointcloud){
+                viewer.outlinePass.edgeStrength = 4;
+            }else {
+                viewer.outlinePass.edgeStrength = 100;
+            }
+            
             if(by2d && model){
                 model.dispatchEvent({type:'changeSelect', selected : state});
             }
@@ -115002,11 +115022,11 @@ ENDSEC
             else model.btmHeight = z;
             
             model.updateMatrixWorld();
-            let boundingBox2 = model.boundingBox.clone().applyMatrix4(object.matrixWorld);
+            let boundingBox2 = model.boundingBox.clone().applyMatrix4(model.matrixWorld);
             let size = boundingBox2.getSize(new Vector3);
             let center = boundingBox2.getCenter(new Vector3);
             
-            object.position.z = z + size.z / 2 - center.z; 
+            model.position.z = z + size.z / 2 - center.z; 
         }
     };
 
@@ -122174,7 +122194,7 @@ ENDSEC
     	this.edgeGlow = 0.0;
     	this.usePatternTexture = false;
     	//this.edgeThickness = 1.0;
-    	this.edgeStrength = 3.0;
+    	this.edgeStrength =  50;
     	this.downSampleRatio = 1;//2;  // 抗锯齿  值越低renderTarget size越大,抗锯齿越强,线条可越细(或许可以把模糊化去掉?)
     	this.pulsePeriod = 0;
 
@@ -122511,10 +122531,12 @@ ENDSEC
     			this.edgeDetectionMaterial.uniforms[ "maskTexture" ].value = this.renderTargetMaskBuffer.texture;//this.renderTargetMaskDownSampleBuffer.texture;
     			this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new Vector2$1(this.resolution.x, this.resolution.y );//new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );
     			//this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new THREE.Vector2(this.renderTargetMaskBuffer.width, this.renderTargetMaskBuffer.height)//new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );
+                this.edgeDetectionMaterial.uniforms[ "thickness" ].value = this.edgeStrength;
+                
                 this.edgeDetectionMaterial.uniforms[ "visibleEdgeColor" ].value = this.visibleEdgeColor;//this.tempPulseColor1;
     			this.edgeDetectionMaterial.uniforms[ "hiddenEdgeColor" ].value = this.hiddenEdgeColor; //this.tempPulseColor2;
-    			
-                renderer.setRenderTarget(this.renderTargetEdgeBuffer1);
+    			renderer.setClearColor( 0x000000, 0 );
+                renderer.setRenderTarget(readBuffer/* this.renderTargetEdgeBuffer1 */);
                 renderer.clear();
                 renderer.render( this.scene,  this.camera/* , this.renderTargetEdgeBuffer1, true  */);
                 
@@ -122539,8 +122561,8 @@ ENDSEC
     			renderer.render( this.scene, this.camera, this.renderTargetEdgeBuffer2, true );
                 */  
 
-                
-    			// Blend it additively over the input texture
+                //这次删掉
+    			/* // Blend it additively over the input texture
     			this.quad.material = this.overlayMaterial;
     			//this.overlayMaterial.uniforms[ "maskTexture" ].value = this.renderTargetMaskBuffer.texture;
     			this.overlayMaterial.uniforms[ "edgeTexture1" ].value = this.renderTargetEdgeBuffer1.texture;
@@ -122549,7 +122571,7 @@ ENDSEC
     			this.overlayMaterial.uniforms[ "edgeStrength" ].value = this.edgeStrength;
     			//this.overlayMaterial.uniforms[ "edgeGlow" ].value = this.edgeGlow;
     			//this.overlayMaterial.uniforms[ "usePatternTexture" ].value = this.usePatternTexture;
-
+               
 
     			if ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST ); 
     			//renderer.render( this.scene,  camera, readBuffer, false );
@@ -122557,10 +122579,10 @@ ENDSEC
                 //改:清空readBuffer, 仅绘制出outline的部分 
                 
                 renderer.setClearColor( 0x000000, 0 );
-                renderer.setRenderTarget(readBuffer);
-                renderer.clear();
-                renderer.render(  this.scene,  this.camera/* , readBuffer, true  */);
-               
+                renderer.setRenderTarget(readBuffer)
+                renderer.clear()
+                renderer.render(  this.scene,  this.camera );
+                */
 
     			renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );
     			renderer.autoClear = oldAutoClear;
@@ -123385,7 +123407,7 @@ ENDSEC
                 loaders = {
                     objLoader : new OBJLoader( manager ),
                     mtlLoader : new MTLLoader( manager ),
-                    glbLoader : new GLTFLoader(undefined, this.renderer)
+                    glbLoader : new GLTFLoader(undefined, this.renderer, Potree.settings.libsUrl )
                  
                 };
                 //add test
@@ -126288,7 +126310,7 @@ ENDSEC
                 if(camera.aspect > aspect){//视野更宽则用bound的纵向来决定
                     dis = boundSize.y/2/ Math.tan(MathUtils.degToRad(camera.fov / 2)) + boundSize.z/2; 
                 }else {
-                    let hfov = cameraLight$1.getHFOVForCamera(camera, true);
+                    let hfov = cameraLight.getHFOVForCamera(camera, true);
                     dis = boundSize.x/2 / Math.tan(hfov / 2) + boundSize.z/2;
                 }
                 dis = Math.max(0.1,dis);
@@ -127083,17 +127105,19 @@ ENDSEC
                 this.objs.add(object); 
                 object.boundingBox = boundingBox;
                 
-                if(fileInfo.transform.rotation){
-                    object.rotation.fromArray(fileInfo.transform.rotation); 
-                }   
-                if(fileInfo.transform.position){     
-                    object.position.fromArray(fileInfo.transform.position);
-                }
-                if(fileInfo.transform.scale){
-                    object.position.fromArray(fileInfo.transform.scale);
-                }   
-
-
+                let setTransfrom = (name)=>{
+                    let value = fileInfo.transform[name];
+                    if(value instanceof Array){
+                        object[name].fromArray(value);
+                    }else {
+                        object[name].copy(value);
+                    }
+                }; 
+                setTransfrom('position');
+                setTransfrom('rotation');
+                setTransfrom('scale');
+                
+                
                 
                 if(fileInfo.moveWithPointcloud){
                     object.updateMatrix();

文件差异内容过多而无法显示
+ 1 - 1
public/lib/potree/potree.js.map


文件差异内容过多而无法显示
+ 52 - 0
public/lib/three.js/loaders/draco/draco_decoder.js


二进制
public/lib/three.js/loaders/draco/draco_decoder.wasm


文件差异内容过多而无法显示
+ 104 - 0
public/lib/three.js/loaders/draco/draco_wasm_wrapper.js


文件差异内容过多而无法显示
+ 21 - 0
public/lib/three.js/loaders/ktx/basis_transcoder.js


二进制
public/lib/three.js/loaders/ktx/basis_transcoder.wasm


+ 86 - 14
src/sdk/cover/index.js

@@ -7,10 +7,51 @@ export const enter = (dom) => {
     
     Potree.settings.isOfficial = true //标记为正式、非测试版本 
     //Potree.fileServer = axios 
+    Potree.settings.libsUrl = '../lib/'
+    
+    
     Potree.mergeEditStart(dom)
     let MergeEditor = viewer.modules.MergeEditor
     
+    let getPositionByScreen = (pos2d)=>{//通过屏幕坐标获取真实坐标
+        let worldPos, localPos, modelId,  intersect
+        let Handler = viewer.inputHandler
+        
+        if (pos2d && pos2d.inDrag) { 
+            //不使用当前鼠标所在位置的intersect,单独算
+            pos2d.clientX = pos2d.x
+            pos2d.clientY = pos2d.y
+            pos2d.onlyGetIntersect = true
+            pos2d.whichPointcloud = true
+            intersect = Handler.onMouseMove(pos2d)
+            
+        } else {
+            intersect = Handler.intersect
+        }
 
+        if (intersect && intersect.location) {
+            worldPos = intersect.location.clone()
+            modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
+            localPos = Potree.Utils.datasetPosTransform({ toDataset: true, datasetId:modelId, position })
+        } else return null
+        
+        return { worldPos, modelId, localPos }
+    }
+    
+    let getScreenByPosition = (pos3d, modelId)=>{//通过模型局部坐标获取屏幕坐标 
+        let isLocal = modelId != void 0 
+        pos3d = new THREE.Vector3().copy(pos3d)
+        let worldPos = isLocal ? Utils.datasetPosTransform({ fromDataset: true, dataset_id: modelId, position:pos3d}) : pos3d
+       
+        var viewport = viewer.mainViewport
+        var camera = viewport.camera
+        var dom = viewer.renderArea
+        //console.log('getScreenByPoint ' + pos3d.toArray())
+        return Potree.Utils.getPos2d(worldPos, camera, dom, viewport)
+    }
+    
+    
+    
     let addModel = (props)=> { 
         let bus = mitt()  
         console.log('addModel',props)
@@ -31,7 +72,16 @@ export const enter = (dom) => {
             model.addEventListener('changeSelect',(e)=>{
                 bus.emit('changeSelect',e.selected)
             }) 
-            model.addEventListener('positionChanged',(e)=>{
+            model.addEventListener('transformChanged',(e)=>{
+                bus.emit('transformChanged', {
+                    position : model.position.clone(),
+                    scale: model.scale.x,
+                    rotation: model.rotation.clone(),
+                    bottom: model.btmHeight
+                })
+            })
+            
+            /* model.addEventListener('positionChanged',(e)=>{
                 bus.emit('positionChanged', e.position) //点云不是直接使用
             })
             model.addEventListener('scaleChanged',(e)=>{
@@ -42,50 +92,72 @@ export const enter = (dom) => {
             })
             model.addEventListener('bottomChanged',(e)=>{
                 bus.emit('bottomChanged', model.btmHeight)
-            })
+            }) */
             bus.emit('loadDone')
             console.log('loadDone' )
         }
         let progressFun = (progress)=>{
             bus.emit('loadProgress',progress)
         }
+        if(props.type == "glb"){////////////////////////////test
+            props.url = '/lib/potree/resources/models/glb/coffeemat.glb'  
+        }
         Potree.addModel(props,  done , progressFun)
         
         
         
         return { 
             bus,
+            changeShow(show){ 
+                if(model){
+                    viewer.updateVisible(model, 'changeShow', show)
+                } 
+            },
             changeSelect(state){
-                MergeEditor.selectModel(model, state, true)
+                if(model){
+                    MergeEditor.selectModel(model, state, true)
+                }
             },
             changeScale(s){
-                model.scale.set(s,s,s)
-                model.dispatchEvent("scale_changed")
+                if(model){
+                    model.scale.set(s,s,s)
+                    model.dispatchEvent("scale_changed")
+                }
             },
             changeOpacity(opacity){
-                model.travese(e=>e.material.opacity = opacity)
+                model && model.travese(e=>e.material.opacity = opacity)
             },
             changeBottom(z){
-                MergeEditor.setModelBtmHeight(z)
+                model && MergeEditor.setModelBtmHeight(model,z)
             },
             enterRotateMode(){
-                viewer.transformObject(model);
-                viewer.transformationTool.setModeEnable('rotate',true)
-                viewer.transformationTool.setModeEnable('translation',false)
+                if(model){
+                    viewer.transformObject(model);
+                    viewer.transformationTool.setModeEnable('rotate',true)
+                    viewer.transformationTool.setModeEnable('translation',false)
+                }
             }, 
             enterMoveMode(){
-                viewer.transformObject(model);
-                viewer.transformationTool.setModeEnable('rotate',false)
-                viewer.transformationTool.setModeEnable('translation',true)
+                if(model){
+                    viewer.transformObject(model);
+                    viewer.transformationTool.setModeEnable('rotate',false)
+                    viewer.transformationTool.setModeEnable('translation',true)
+                }
             },
+            
             /* leaveRotateMode(){
                 
             } */
         } 
     } 
+     
+    
       
      
-    return {addModel}
+    return {
+        addModel, getPositionByScreen, 
+        getScreenByPosition
+    }
 }
 
 export default enter