xzw 2 years ago
parent
commit
2443c1aa4b

+ 8 - 26
src/Potree.js

@@ -244,36 +244,18 @@ export async function loadMapEntity(datasetId, force){
     
 }
  
-export async function loadPanos(datasetId, callback){
+export async function loadPanos( callback){
     var path 
     //let query = `?datasetId=${datasetId}`                  //`?lat=${center.lat}&lon=${center.lon}&radius=200000`
     if(Potree.fileServer){
-        path = `/laser/filter/${Potree.settings.number}/query` 
-    }else{
-        //path = `${Potree.settings.urls.prefix2}/indoor/${Potree.settings.number}/api/images/filter` + query
-        //path = `${Potree.scriptPath}/data/${Potree.settings.number}/panos-${datasetId}.json`
-        path = `${Potree.settings.urls.prefix}/laser/filter/${Potree.settings.number}/query` 
-       
-         
-    }
-    return loadFile(path, {datasetId:datasetId}, callback) 
-    
-}
-
-
-export async function loadPanosInfo(callback){ 
-    var path 
-    if(Potree.fileServer){
-        
-    }else{
-        path = `${Potree.scriptPath}/data/panoEdit/vision_edit.txt`
-          
-    }
-    return loadFile(path, null, callback)
+        path = `vision.json` 
+    } 
+    return loadFile(path, { }, callback) 
     
 }
 
 
+ 
 
 //site_model
 /* {
@@ -350,10 +332,10 @@ export function Log(){
 
  
 
-export function loadPointCloud(path, name, sceneCode, timeStamp, callback, onError){
+export function loadPointCloud(path,  timeStamp, callback, onError){
 	let loaded = function(e){
-		e.pointcloud.name = name;
-        e.pointcloud.sceneCode = sceneCode //对应4dkk的场景码
+		e.pointcloud.name = Potree.settings.number;
+        //e.pointcloud.sceneCode = sceneCode //对应4dkk的场景码
         
 		callback(e);
 	};

+ 5 - 5
src/custom/materials/ModelTextureMaterial.js

@@ -364,14 +364,14 @@ export default class ModelTextureMaterial extends THREE.RawShaderMaterial {
         
         
         if(pano0){
-            this.uniforms.pano0Map.value = pano0.getSkyboxTexture();//pano0.texture
+            this.uniforms.pano0Map.value = pano0.skyboxTex ; 
             this.uniforms.pano0Position.value.copy(pano0.position)
             this.uniforms.pano0Matrix.value.copy(pano0.panoMatrix/* pano0.mesh.matrixWorld */ ); 
             //pano1.ensureSkyboxReadyForRender();
         }
         
 		
-		this.uniforms.pano1Map.value = pano1.getSkyboxTexture()//pano1.texture;
+		this.uniforms.pano1Map.value = pano1.skyboxTex  
 		this.uniforms.pano1Position.value.copy(pano1.position)
 		this.uniforms.pano1Matrix.value.copy(pano1.panoMatrix /* pano1.mesh.matrixWorld */ );
         
@@ -390,18 +390,18 @@ export default class ModelTextureMaterial extends THREE.RawShaderMaterial {
     
     
     
-    updateDepthTex(pano){
+    updateDepthTex(pano, extra){
         if( !Potree.settings.useDepthTex || !pano || !pano.depthTex || pano!=this.pano0 && pano!=this.pano1)return
         //console.log('updateDepthTex', pano.id,  this.pano0 && this.pano0.id,  this.pano1 && this.pano1.id)
         
          
         if(this.pano0){ 
-            this.uniforms.depthMap0.value = this.pano0.depthTex 
+            this.uniforms.depthMap0.value = this.pano0.entered ? this.pano0.depthTex : null;   //dispose了就不要赋值否则dispose会失败
             this.uniforms.cameraHeight0.value = this.pano0.floorPosition.distanceTo(this.pano0.position)
             this.uniforms.ceilHeight0.value = this.pano0.getCeilHeight() - this.pano0.position.z  
         }
         if(this.pano1){ 
-            this.uniforms.depthMap1.value = this.pano1.depthTex 
+            this.uniforms.depthMap1.value = this.pano1.entered ? this.pano1.depthTex : null;
             this.uniforms.cameraHeight1.value = this.pano1.floorPosition.distanceTo(this.pano1.position)
             this.uniforms.ceilHeight1.value = this.pano1.getCeilHeight() - this.pano1.position.z  
         } 

+ 42 - 34
src/custom/modules/panos/Images360.js

@@ -306,22 +306,28 @@ export class Images360 extends THREE.EventDispatcher{
                             
                         if(config2.showSkybox || config2.pointUsePanoTex){ 
                             let wait = (e)=> {
+                                viewer.ifAllLoaded()                                         
                                 if(e.pano && e.pano != this.currentPano)return//loadedDepthImg
                                 setTimeout( ()=>{
                                     if(this.latestRequestMode == mode ){
                                         Potree.settings.displayMode = mode 
                                     }
-                                },1)
-                                this.removeEventListener('loadedDepthImg', wait)
+                                },1) 
                             }
                             if(!this.currentPano.depthTex && this.currentPano.pointcloud.hasDepthTex){
-                                this.addEventListener('loadedDepthImg', wait)           
+                                this.addEventListener('loadedDepthImg', wait, {once:true})  
+                                pano.waitForLoad()                                 
                                 return this.currentPano.loadDepthImg()
                             } 
                             //this.updateDepthTex()  
-                            if(this.checkAndWaitForPanoLoad(this.currentPano,  this.basePanoSize, wait)){
+                            /* if(this.checkAndWaitForPanoLoad(this.currentPano,  this.basePanoSize, wait)){
                                 return
-                            }  
+                            } */ 
+                            if(!this.currentPano.skyboxTex){
+                                pano.waitForLoad() 
+                                this.addEventListener('loadedTex', wait, {once:true})     
+                                this.currentPano.loadTex()
+                            }                            
                         } 
                         
                          
@@ -358,8 +364,8 @@ export class Images360 extends THREE.EventDispatcher{
                         
                         }else{
                             this.smoothZoomTo(1)
-                            this.resetHighMap()
-                            this.hideHighMap() 
+                             
+                            
                         }
                         
                         
@@ -667,19 +673,19 @@ export class Images360 extends THREE.EventDispatcher{
         
         {//不飞的话是否不要执行这段?
             
-            let wait = (e)=> {
+            let wait = (e)=> { 
+                viewer.ifAllLoaded() 
                 if(e.pano && this.latestToPano && e.pano != this.latestToPano.pano)return//loadedDepthImg
                 if(this.latestToPano != toPano)return /* Potree.Log('已经取消') *///如果取消了
                 setTimeout(()=>{ 
                     if(this.latestToPano != toPano)return
                     this.flyToPano(toPano) 
-                },1)
-                this.removeEventListener('loadedDepthImg', wait)
-                this.removeEventListener('loadedTex', wait)
+                },1)  
             }
             if(!pano.depthTex && pano.pointcloud.hasDepthTex){ //点云模式也要加载depthTex,因获取neighbour需要用到
                 //console.log('等待加载depthtex')
-                this.addEventListener('loadedDepthImg', wait)           
+                this.addEventListener('loadedDepthImg', wait, {once:true}) 
+                pano.waitForLoad() 
                 return pano.loadDepthImg()
             }
             
@@ -690,8 +696,9 @@ export class Images360 extends THREE.EventDispatcher{
                 }
                 
                 if(!pano.skyboxTex){
+                    pano.waitForLoad() 
                     this.addEventListener('loadedTex', wait, {once:true})     
-                    this.loadTex()
+                    pano.loadTex()
                 }
                 /* if(this.checkAndWaitForPanoLoad(pano, toPano.basePanoSize || this.basePanoSize,  wait )){
                     return
@@ -828,11 +835,7 @@ export class Images360 extends THREE.EventDispatcher{
  
 
     beforeFlyToPano(toPano){
-        if(this.currentPano != toPano.pano) {
-            if(Potree.settings.displayMode == 'showPanos'){
-                this.resetHighMap() 
-            }
-            
+        if(this.currentPano != toPano.pano) {  
             this.smoothZoomTo(toPano.zoomLevel || 1, toPano.duration / 2);  
         } 
     }
@@ -1414,11 +1417,11 @@ export class Images360 extends THREE.EventDispatcher{
                         
      
     
-    addPanoData(data, datasetId ){//加载漫游点
+    addPanoData(data ){//加载漫游点
         //data[0].file_id = '00019'
          
-        if(data.data) data = data.data 
-        if(data.length == 0)console.error(datasetId + ' 没有漫游点') 
+        data = data.sweepLocations
+        if(data.length == 0)console.error( '没有漫游点') 
         //data = data.sort(function(a,b){return a.id-b.id})
         
         data.forEach((info)=>{  
@@ -1432,9 +1435,7 @@ export class Images360 extends THREE.EventDispatcher{
             })
             
             this.panos.push(pano);
-            if(Potree.settings.editType == 'pano'){
-                Potree.settings.datasetsPanos[datasetId].panos.push(pano);
-            }
+            
         })   
     }
     
@@ -1473,19 +1474,25 @@ export class Images360 extends THREE.EventDispatcher{
 
     update(){
         
-        let nearPanos
-        
+     
+        if(!this.currentPano)return
         
         Potree.Common.intervalTool.isWaiting('filterDepthTex', ()=>{ 
         
             var s = [Images360.filters.not(this.currentPano )],
-            l = [Images360.scoreFunctions.distanceSquared(this.currentPano ), Images360.scoreFunctions.direction(this.position, this.getDirection())],
-            nearPanos = Common.sortByScore(this.panos, s, l);  
-        
-            this.tilePrioritizer.filterDepthTex(this.panos)//下载深度图
+            l = [Images360.scoreFunctions.distanceSquared(this.currentPano ), Images360.scoreFunctions.direction(this.position, this.getDirection())] 
+            this.nearPanos = Common.sortByScore(this.panos, s, l).map(e=>e.item);  
+        
+            //下载深度图 
+            let depTexDlCount = browser.isMobile() ? 1 : 2; 
+            let loadingCount = this.nearPanos.filter(p=>p.depthTexLoading).length;
+            if(loadingCount<depTexDlCount){
+                this.nearPanos.filter(p=>!p.depthTex).slice(0, depTexDlCount-loadingCount).forEach(p=>p.loadDepthImg());  
+            }
+            
         }, 77)
         
-        this.getNeighbours(nearPanos)
+        this.getNeighbours(this.nearPanos)
         
     }
 
@@ -1501,9 +1508,9 @@ export class Images360 extends THREE.EventDispatcher{
 Images360.prototype.getNeighbours = function(){ //逐渐自动获取neighbours。 200个点差不多在半分钟内算完
     let lastIndex   //标记上次查询到哪,防止重新sortByScore
     return function(nearPanos){
-        if(!this.currentPano || viewer.mainViewport.view.isFlying() || viewer.lastFrameChanged){
+        if(!this.currentPano || viewer.mainViewport.view.isFlying() || viewer.lastFrameChanged || viewer.inputHandler.drag /* interacted */){ //拖拽时不更新,否则移动端卡
             return lastIndex = 0; 
-        } 
+        }
         if(!nearPanos)return; 
         //let startTime = Date.now()
         
@@ -1515,8 +1522,9 @@ Images360.prototype.getNeighbours = function(){ //逐渐自动获取neighbours
         let changeTexCount = ()=>{
             changeCount ++;
         }
+        let median = Math.max(10, Potree.timeCollect.depthSampler.median) 
         let ifOverTime = ()=>{ 
-            let is = changeCount * Potree.timeCollect.depthSampler.median  +    getCount * 0.01 > maxWaitDur//不换贴图也要一丢丢计算时间 
+            let is = changeCount * median  +  getCount * 0.01 > maxWaitDur//不换贴图也要一丢丢计算时间 
             /* if(is){
                 console.log(1)
             } */

+ 29 - 23
src/custom/modules/panos/Panorama.js

@@ -5,7 +5,7 @@ import math from '../../utils/math.js'
 import {TextSprite} from '../../objects/TextSprite.js'
 import DepthBasicMaterial from "../../materials/DepthBasicMaterial.js"; 
 
-let { } = Potree.defines
+let { PanoramaEvents } = Potree.defines
 var texLoader = new THREE.TextureLoader()
 
 
@@ -98,17 +98,18 @@ class Panorama extends THREE.EventDispatcher{
             0       pointcloudVisi(隐藏了数据集)       unvisible
          */ 
          
-      
-        this.originPosition = new THREE.Vector3().fromArray(o.dataset_location) 
-        this.originFloorPosition = new THREE.Vector3().fromArray(o.dataset_floor_location)
+        this.panosData = o
+           
+        this.originPosition = new THREE.Vector3().copy(o.pose.translation) 
+        this.originFloorPosition = new THREE.Vector3().copy(o.puck)
         
-        this.originID = parseInt(o.file_id)//"file_id":"00022"对应是原本的4dkk的id --来自vision.txt
+        this.originID = parseInt(o.id)// uuid  "file_id":"00022"对应是原本的4dkk的id --来自vision.txt
          
-        this.pointcloud = viewer.scene.pointclouds.find(e=>e.dataset_id == o.dataset_id) || viewer.scene.pointclouds[0]
+        this.pointcloud = viewer.scene.pointclouds[0]
         this.pointcloud.panos.push(this)
         
         //this.sid = this.pointcloud.sceneCode + '|' + this.originID  //不会更改的标记
-        this.sid = this.pointcloud.dataset_id + '|' + this.originID  //不会更改的标记
+        this.sid = this.originID  //不会更改的标记
         //全景图和Cube的水平采样起始坐标相差90度 
         
 
@@ -120,11 +121,8 @@ class Panorama extends THREE.EventDispatcher{
             this.quaternion = new THREE.Quaternion(quaternion.x, -quaternion.z, quaternion.y, quaternion.w) //转化坐标
                 
         }else{ */
-        
-            
-            var qua = o.dataset_orientation 
-            qua = [qua[1], qua[2], qua[3], qua[0]] 
-            this.quaternion = new THREE.Quaternion().fromArray(qua)
+         
+            this.quaternion = new THREE.Quaternion().copy(o.pose.rotation) 
             this.quaternion4dkk = math.convertVisionQuaternion(this.quaternion)//4dkk内使用的quaternion 
             this.quaternion2 = this.quaternion.clone()
             this.quaternion = new THREE.Quaternion().multiplyQuaternions(this.quaternion,  rot90);//全景图和Cube的水平采样起始坐标相差90度,cubeTex转90度
@@ -144,7 +142,7 @@ class Panorama extends THREE.EventDispatcher{
          
         this.rotation = new THREE.Euler().setFromQuaternion(this.quaternion) 
         this.build()
-        this.transformByPointcloud() //初始化位移
+        this.setPosition(this.originPosition, this.originFloorPosition )//this.transformByPointcloud() //初始化位移
         
          
         
@@ -183,10 +181,18 @@ class Panorama extends THREE.EventDispatcher{
         //如果当前在全景模式且在这个点,需要切换显示吗? 目前用不到 
     }
 
+
+    waitForLoad(){
+        viewer.waitForLoad(pano, function() {//发送loading
+            return pano.depthTex && pano.skyboxTex
+        });
+    }
+
+
     loadTex(){ 
         if(this.skyboxTex || this.texLoading)return
         this.texLoading = true
-        let src =  `${Potree.settings.urls.prefix1}\${this.id}.jpg`   //`server\test\SS-t-P1d6CwREny2\${this.id}.jpg`    //`${Potree.settings.urls.prefix1}/${Potree.settings.webSite}/${this.pointcloud.sceneCode}/data/${this.pointcloud.sceneCode}/depthmap/${this.originID}.png`
+        let src =  `${Potree.settings.urls.prefix1}/images/${this.originID}.jpg`  //`server\test\SS-t-P1d6CwREny2\${this.id}.jpg`    //`${Potree.settings.urls.prefix1}/${Potree.settings.webSite}/${this.pointcloud.sceneCode}/data/${this.pointcloud.sceneCode}/depthmap/${this.originID}.png`
         //console.log('开始下载depthImg', this.id)
         let texture = texLoader.load( src, ()=>{
             this.skyboxTex = texture
@@ -211,7 +217,7 @@ class Panorama extends THREE.EventDispatcher{
         this.depthTexLoading = true
         let src = //Potree.settings.number == 'SS-t-7DUfWAUZ3V' ?  `${Potree.scriptPath}/data/${Potree.settings.number}/depthMap/${this.originID}.png` :
                  //`${Potree.settings.urls.prefix1}/${Potree.settings.webSite}/${this.pointcloud.sceneCode}/data/${this.pointcloud.sceneCode}/depthmap/${this.originID}.png`
-                 `server\test\SS-t-P1d6CwREny2\depthmap\${this.id}.png`
+                 `${Potree.settings.urls.prefix1}/depthmap/${this.originID}.png`
         
         //console.log('开始下载depthImg', this.id)
         let texture = texLoader.load( src, ()=>{
@@ -241,10 +247,7 @@ class Panorama extends THREE.EventDispatcher{
             this.oriPanoMatrix = this.panoMatrix.clone()
             
             if(this.quaternion2)this.oriPanoMatrix2 = new THREE.Matrix4().makeRotationFromQuaternion(this.quaternion2) 
-        
-            
-            //console.log(this.quaternion)
-            //this.quaternion = quaternion
+         
         } 
          
         let marker = new THREE.Mesh(planeGeo, this.getMarkerMat() ) 
@@ -264,12 +267,14 @@ class Panorama extends THREE.EventDispatcher{
          
         marker.addEventListener('mouseover', this.hoverOn.bind(this));  
         marker.addEventListener('mouseleave', this.hoverOff.bind(this)); 
+        
+        
     }
     
     
     
     
-    transformByPointcloud(){
+    /* transformByPointcloud(){
         
         let position = this.originPosition.clone().applyMatrix4(this.pointcloud.transformMatrix);//也可以用datasetPosTransform算
         let floorPosition = this.originFloorPosition.clone().applyMatrix4(this.pointcloud.transformMatrix);
@@ -282,7 +287,7 @@ class Panorama extends THREE.EventDispatcher{
             this.panoMatrix2Inverse = this.panoMatrix2.clone().invert(); 
         }        
         this.dispatchEvent('rePos')
-    }
+    } */
     
     setPosition(position, floorPosition){
         this.position = position
@@ -362,7 +367,7 @@ class Panorama extends THREE.EventDispatcher{
      
     
     enter(){ 
-       
+        this.entered = true
         viewer.dispatchEvent({type:PanoramaEvents.Enter,  oldPano:old, newPano:this  }  )
         old = this 
         //console.log("enter pano "+ this.id)
@@ -370,7 +375,8 @@ class Panorama extends THREE.EventDispatcher{
 
     exit(){   
         
-        //console.log("exit pano "+ this.id)
+        this.depthTex && this.depthTex.dispose()  //贴图不使用后先dispose,下次到该点时会自动还原
+        this.entered = false //add
         
         viewer.dispatchEvent({type:PanoramaEvents.Exit, pano:this}); 
     }

+ 72 - 204
src/custom/start.js

@@ -11,23 +11,12 @@ import "./potree.shim.js"
  
 
 export function start(dom, mapDom, number ){ //t-Zvd3w0m
-    /* {
-        let obj = JSON.parse(localStorage.getItem('setting'))
-        for(let i in obj){
-            console.log(i + ': ' +  obj[i])
-        }
-    }
-     */ 
-    Potree.settings.number = number || 't-o5YMR13'// 't-iksBApb'// 写在viewer前
- 
     
-    if(browser.urlHasValue('google'))Potree.settings.mapCompany = 'google' 
+    Potree.settings.number = number || 't-o5YMR13'// 't-iksBApb'// 写在viewer前
+  
     if(browser.urlHasValue('timing'))Potree.measureTimings = 1
     
-    let viewer = new Potree.Viewer(dom , mapDom);
-    
-    
-  
+    let viewer = new Potree.Viewer(dom , mapDom); 
 	viewer.setEDLEnabled(false);
     viewer.setFOV(Potree.config.view.fov); 
      
@@ -49,187 +38,90 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
         }
     }  
 
-    Potree.loadDatasetsCallback = function(data, ifReload){
-        if(!data || data.length == 0)return console.error('getDataSet加载的数据为空')
-           
-        Potree.datasetData = data
-        viewer.transform = null
-        var datasetLength = data.length 
-        var pointcloudLoaded = 0
-        var panosLoaded = 0
-        var pointcloudLoadDone = function(){//点云cloud.js加载完毕后 
-        }
+    {
+            
+        var cloudPath = //`${Potree.settings.urls.prefix1}/${dataset.webBin}`  //webBin添加原因:每次裁剪之类的操作会换路径,因为oss文件缓存太严重,更新慢
+                        `${Potree.settings.urls.prefix1}/webcloud/cloud.js` 
         
          
-        var panosLoadDone = function(){   
-             
-            viewer.images360.loadDone() 
-            viewer.scene.add360Images(viewer.images360); 
-            viewer.mapViewer.addListener(viewer.images360)
-            
-            viewer.updateModelBound() //需等pano加载完
-          
-            let {boundSize, center} = viewer.bound
-           
+        var timeStamp = 0   //var timeStamp = dataset.updateTime ? dataset.updateTime.replace(/[^0-9]/ig,'') : '';  //每重算一次后缀随updateTime更新一次 
+ 
+        Potree.loadPointCloud(cloudPath, timeStamp, e => {
+            let scene = viewer.scene;
+            let pointcloud = e.pointcloud; 
+            let config = Potree.config.material
+            let material = pointcloud.material; 
              
-            if(!Potree.settings.isOfficial){
-                Potree.loadMapEntity('all') //加载floorplan 
-            }
+            //pointcloud.datasetData = dataset
+            //pointcloud.dataset_id = dataset.id;//供漫游点找到属于的dataset点云
+            pointcloud.hasDepthTex = Potree.settings.useDepthTex && (!!dataset.has_depth  ||  Potree.settings.isLocalhost && Potree.settings.number == 'SS-t-7DUfWAUZ3V') //test   
+            material.minSize =  config.minSize
+            material.maxSize =  config.maxSize   
+            material.pointSizeType =/*   Potree.settings.isOfficial ?   */ config.pointSizeType    /* : 'ADAPTIVE'    */   //Potree.PointSizeType[config.pointSizeType]//Potree.PointSizeType.ADAPTIVE;//FIXED
+            pointcloud.changePointSize(config.realPointSize)  //material.size =  config.pointSize;
+            pointcloud.changePointOpacity(1)
+            material.shape = Potree.PointShape.SQUARE; 
+            //pointcloud.color = pointcloud.material.color = dataset.color  
+            pointcloud.timeStamp = timeStamp 
+            //transformPointcloud(pointcloud,dataset)
+            scene.addPointCloud(pointcloud);
             
-            
-            if(!ifReload){    
-                viewer.dispatchEvent({type:'loadPointCloudDone'})
-            
-                if(!Potree.settings.UserPointDensity){
-                    Potree.settings.UserPointDensity = 'high'//'middle' 
-                }                                            
-                 
-                Potree.Log('loadPointCloudDone  点云加载完毕', {font:[null, 10]})  
-            }      
              
-            
-            {//初始位置 
-               
-                var panoId = browser.urlHasValue('pano',true);
-                if(panoId !== ''){
-                    var pos
-                    var pano = viewer.images360.panos.find(e=>e.id==panoId);
-                    if(pano){
-                        viewer.images360.focusPano({
-                            pano,
-                            duration:0, 
-                            callback:()=>{/* Potree.settings.displayMode = 'showPanos' */}
-                        })
-                          
-                    }
-                }else{//考虑到多数据集距离很远,或者像隧道那种场景,要使视野范围内一定能看到点云,最好初始点设置在漫游点上
-                    
-                    let {boundSize, center} = viewer.bound
-                    
-                    let pano = viewer.images360.findNearestPano(center)
-                     
-                    pano && viewer.images360.flyToPano({
-                        pano,  duration:0,
-                        target : viewer.images360.bound.center.setZ(pano.position.z)    //平视中心区域(但也不能保证这个方向一定能看到点云密集区,如果在边缘的话)  
-                    }) 
-                } 
-            }
-            
-            
-            
-            viewer.addVideo()//addFire()
-            
-            console.log('allLoaded')
-            viewer.dispatchEvent('allLoaded')
-        }
-        
-        /* var transformPointcloud = (pointcloud, dataset)=>{
-            var locationLonLat = dataset.location.slice(0,2)
-            
-            
-            //当只有一个dataset时,无论如何transform 点云和漫游点都能对应上。
-            var location = viewer.transform.lonlatToLocal.forward(locationLonLat)  //transform.inverse()
-            //初始化位置 
-            
-            viewer.sidebar && viewer.sidebar.addAlignmentButton(pointcloud) 
              
-            pointcloud.updateMatrixWorld()
-            
-            
-            Potree.Log(`点云${pointcloud.dataset_id}(${pointcloud.name})旋转值:${pointcloud.orientationUser}, 位置${math.toPrecision(pointcloud.translateUser.toArray(),3)}, 经纬度 ${locationLonLat}, spacing ${pointcloud.material.spacing}`,  {font:[null, 13]} )
-            
-            
              
-        } */
-        
-        if(!Potree.settings.originDatasetId)Potree.settings.originDatasetId = data[0].id
-        var originDataset =  data.find(e=>e.id == Potree.settings.originDatasetId)  
         
-         
-         
-        
-        data.forEach((dataset,index)=>{  
-            if(!ifReload){
-                var datasetCode = dataset.sceneCode || dataset.name //对应4dkk的场景码
-                var cloudPath = //`${Potree.settings.urls.prefix1}/${dataset.webBin}`  //webBin添加原因:每次裁剪之类的操作会换路径,因为oss文件缓存太严重,更新慢
-                `${Potree.settings.urls.prefix1}/webcloud/cloud.js` 
-                
+            Potree.loadPanos( (data) => { 
+                //console.log('loadPanos',dataset.sceneCode, dataset.id, data)
+                viewer.images360.addPanoData(data  ) 
+                viewer.images360.loadDone() 
+                viewer.scene.add360Images(viewer.images360); 
+               
+                viewer.updateModelBound() //需等pano加载完
+              
+                let {boundSize, center} = viewer.bound
                  
-                var timeStamp = dataset.updateTime ? dataset.updateTime.replace(/[^0-9]/ig,'') : '';  //每重算一次后缀随updateTime更新一次 
-                //console.warn(dataset.name, 'timeStamp', timeStamp)
-                Potree.loadPointCloud(cloudPath, dataset.name ,datasetCode, timeStamp, e => {
-                    let scene = viewer.scene;
-                    let pointcloud = e.pointcloud; 
-                    let config = Potree.config.material
-                    let material = pointcloud.material; 
-                    
-                    
-                    pointcloud.datasetData = dataset
-                    pointcloud.dataset_id = dataset.id;//供漫游点找到属于的dataset点云
-                    pointcloud.hasDepthTex = Potree.settings.useDepthTex && (!!dataset.has_depth  ||  Potree.settings.isLocalhost && Potree.settings.number == 'SS-t-7DUfWAUZ3V') //test   
-                    material.minSize =  config.minSize
-                    material.maxSize =  config.maxSize   
-                    material.pointSizeType =/*   Potree.settings.isOfficial ?   */ config.pointSizeType    /* : 'ADAPTIVE'    */   //Potree.PointSizeType[config.pointSizeType]//Potree.PointSizeType.ADAPTIVE;//FIXED
-                    pointcloud.changePointSize(config.realPointSize)  //material.size =  config.pointSize;
-                    pointcloud.changePointOpacity(1)
-                    material.shape = Potree.PointShape.SQUARE; 
-                    pointcloud.color = pointcloud.material.color = dataset.color  
-                    pointcloud.timeStamp = timeStamp 
-                    //transformPointcloud(pointcloud,dataset)
-                    scene.addPointCloud(pointcloud);
-                    
-                    if(!Potree.settings.isOfficial){ 
-                        Potree.settings.floorplanEnables[dataset.id] = true
-                        Potree.settings.floorplanType[dataset.id] = 'default'
-                    }
-                    
-                    
-                    pointcloudLoaded ++;
-                    if(pointcloudLoaded == datasetLength)pointcloudLoadDone()
-                    
-                    
+                viewer.dispatchEvent({type:'loadPointCloudDone'})
+            
+                if(!Potree.settings.UserPointDensity){
+                    Potree.settings.UserPointDensity = 'high'//'middle' 
+                }  
                 
-                    Potree.loadPanos(dataset.id, (data) => { 
-                        //console.log('loadPanos',dataset.sceneCode, dataset.id, data)
-                        viewer.images360.addPanoData(data, dataset.id )
-                        panosLoaded ++; 
-                        if(panosLoaded == datasetLength){
-                            panosLoadDone() 
-                        } 
-                    })
-                })
-            }else{
-                let pointcloud = viewer.scene.pointclouds.find(p => p.dataset_id == dataset.id)
-                if(!pointcloud){
-                    Potree.Log('数据集id变了,自动使用第一个',   {font:['#500'  ]} )
-                    pointcloud = viewer.scene.pointclouds[0]
+                {//初始位置 
+                   
+                    var panoId = browser.urlHasValue('pano',true);
+                    if(panoId !== ''){
+                        var pos
+                        var pano = viewer.images360.panos.find(e=>e.id==panoId);
+                        if(pano){
+                            viewer.images360.focusPano({
+                                pano,
+                                duration:0, 
+                                callback:()=>{/* Potree.settings.displayMode = 'showPanos' */}
+                            })
+                              
+                        }
+                    }else{//考虑到多数据集距离很远,或者像隧道那种场景,要使视野范围内一定能看到点云,最好初始点设置在漫游点上
+                        
+                        let {boundSize, center} = viewer.bound
+                        
+                        let pano = viewer.images360.findNearestPano(center)
+                         
+                        pano && viewer.images360.flyToPano({
+                            pano,  duration:0,
+                            target : viewer.images360.bound.center.setZ(pano.position.z)    //平视中心区域(但也不能保证这个方向一定能看到点云密集区,如果在边缘的话)  
+                        }) 
+                    } 
                 }
-                /* //先归零 
-                Alignment.translate(pointcloud,  pointcloud.translateUser.clone().negate())
-                Alignment.rotate(pointcloud, null,  - pointcloud.orientationUser) */
-                
-                //transformPointcloud(pointcloud, dataset)
                  
-            } 
+                console.log('allLoaded')
+                viewer.dispatchEvent('allLoaded')
+            }) 
                 
-        })
-        
-        if(ifReload){ 
-            
-            //loadDone()
-        }
-        
+        }) 
         
     } 
     
-    
-    
-    number && Potree.loadDatasets(Potree.loadDatasetsCallback) 
      
-     
-
-         
-
     window.THREE = THREE
     
     
@@ -248,10 +140,7 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
         
     }  
     
-    
-    
-    
-    
+     
     //--------------------------------
     /* if(!number){
         Potree.settings.boundAddObjs = true
@@ -278,32 +167,11 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
  
  
  
+  
  
  
  
  
- 
- 
- 
- 
-window.buttonFunction = function(){
-     
-    viewer.scene.pointclouds.forEach(e=>e.predictNodeMaxLevel()) 
-}
- 
-  
-window.testTransform = function(locationLonLat, location1, location2){
-    proj4.defs("NAVVIS:test", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15));
-    
-    let transform = proj4("WGS84", "NAVVIS:test"); //这个ok  navvis里也是这两种转换 见proj4Factory
-    if(location1){//经纬度
-        return transform.forward(location1) 
-    }else{
-        return transform.inverse(location2) 
-    }            
-        
-}  
- 
 var changeLog = ()=>{  
          
     var textarea = document.createElement('textarea');

+ 10 - 34
src/custom/viewer/ViewerNew.js

@@ -9,8 +9,7 @@ import {Renderer} from "../../PotreeRendererNew.js";
 //import {PotreeRenderer} from "../viewer/PotreeRenderer.js";
 import {EDLRenderer} from "../../viewer/EDLRendererNew.js";
 import {HQSplatRenderer} from "../../viewer/HQSplatRenderer.js";
-import {MapViewer} from "./map/MapViewer.js";
-                                                                 
+                                                                
 import {NavigationCube} from '../../viewer/NavigationCube.js'
   
 //import {MapView} from "../viewer/map.js"; 
@@ -604,7 +603,7 @@ export class Viewer extends ViewerBase{
         
         this.reticule.addEventListener('update',(e)=>{
             this.needRender = true 
-            if(this.mapViewer && this.mapViewer.attachedToViewer)this.mapViewer.needRender = true  //分屏时mapViewer也有reticule
+            //if(this.mapViewer && this.mapViewer.attachedToViewer)this.mapViewer.needRender = true  //分屏时mapViewer也有reticule
         })
         
         this.addEventListener('pointcloud_changed',(e)=>{
@@ -908,7 +907,7 @@ export class Viewer extends ViewerBase{
                 if(Common.getDifferenceSet(at, this.atDatasets).length){
                     //console.log('atDatasets', at) 
                     this.atDatasets = at
-                    if(Potree.settings.editType != 'pano' && Potree.settings.editType != 'merge')this.updateFpVisiDatasets()
+                     
                     this.dispatchEvent({type:'pointcloudAtChange',pointclouds:at}) 
                 }
                 force = false 
@@ -993,7 +992,7 @@ export class Viewer extends ViewerBase{
     
      
     
- 
+    /* 
     findPointcloudsAtFloor(entity){//找当前楼层需要显示哪些数据集。
         //数据集的belongToEntity 在这个entity内(否则会出现点击数据集飞过去平面图却不显示)。or 如果数据集有漫游点的话,需要包含>20%的漫游点。   (防止重叠体积很大但其实一个漫游点都不包含)
         //重叠体积>50%   或   包含>50%的漫游点 
@@ -1063,19 +1062,12 @@ export class Viewer extends ViewerBase{
             var visi = visiClouds.includes(pointcloud) 
             if(floorplan){
                 Potree.Utils.updateVisible(floorplan.objectGroup, 'buildingChange', visi)  
-            }/* else if(!visi){   
-                let changeVisi = (e)=>{
-                    Potree.Utils.updateVisible(e.floorplan.objectGroup, 'buildingChange', this.fpVisiDatasets.includes(pointcloud)) 
-                    viewer.mapViewer.mapLayer.removeEventListener('floorplanLoaded',  changeVisi)
-                    console.log('updateCadVisibles加载后更改显示',e)
-                } 
-                viewer.mapViewer.mapLayer.addEventListener('floorplanLoaded',  changeVisi)
-            } */  
+            } 
             //已经添加了全局的  floorplanLoaded后会updateCadVisibles,这段就删了
         })
         viewer.mapViewer.mapLayer.needUpdate = true  //可能需要更新加载的level程度
         viewer.mapViewer.needRender = true //若上句不触发加载也要立即重新绘制
-    }
+    } */
 
 
      
@@ -2497,24 +2489,9 @@ export class Viewer extends ViewerBase{
 
 		this.updateAnnotations();
 
-        
-		if(this.mapView){
-			this.mapView.update(delta);
-			if(this.mapView.sceneProjection){
-				$( "#potree_map_toggle" ).css("display", "block");
-				
-			}
-		}
-
+       
 		
-        this.transformationTool.update();
-        
- 	
-        if(Potree.settings.editType != 'pano' && Potree.settings.editType != 'merge'){
-            this.modules.ParticleEditor.update(delta) 
-            this.mapViewer.update(delta)     //地图更新       
-        }
-    
+        this.transformationTool.update(); 
 		this.dispatchEvent({ type: 'update', delta: delta, timestamp: timestamp});  //在有sidebar时耗高cpu,占本update函数80%
          
 		 
@@ -3164,10 +3141,9 @@ export class Viewer extends ViewerBase{
 	render(params={}){//add params 
         viewer.addTimeMark('render','start')
         const vrActive = this.renderer.xr.isPresenting;
-        let SiteModel = viewer.modules.SiteModel 
-        
+         
         
-        Potree.settings.useRTPoint = !(SiteModel.editing && SiteModel.selected && SiteModel.selected.buildType == 'room' )//空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
+        Potree.settings.useRTPoint = true//!(SiteModel.editing && SiteModel.selected && SiteModel.selected.buildType == 'room' )//空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
         
         Potree.settings.pointEnableRT = this.scene.measurements.length > 0 || !Potree.settings.useRTPoint