瀏覽代碼

updateCube

xzw 3 年之前
父節點
當前提交
a919b2e240
共有 54 個文件被更改,包括 1000 次插入389 次删除
  1. 2 0
      gulpfile.js
  2. 4 1
      libs/three.js/lines/LineMaterial.js
  3. 二進制
      note/images360.updateCube笔记.jpg
  4. 2 2
      src/Features.js
  5. 3 3
      src/PointCloudOctree.js
  6. 9 5
      src/Potree.js
  7. 1 1
      src/PotreeRenderer.js
  8. 1 1
      src/defines.js
  9. 14 6
      src/materials/DepthBasicMaterial.js
  10. 22 29
      src/materials/ModelTextureMaterial.js
  11. 4 4
      src/modules/CameraAnimation/CameraAnimation.js
  12. 483 101
      src/modules/Images360/Images360.js
  13. 42 24
      src/modules/Images360/Panorama.js
  14. 5 5
      src/modules/Images360/tile/PanoRenderer.js
  15. 3 3
      src/modules/Images360/tile/QualityManager.js
  16. 23 16
      src/modules/Images360/tile/TileDownloader.js
  17. 19 7
      src/modules/Images360/tile/TilePrioritizer.js
  18. 2 2
      src/modules/Images360/tile/TileUtils.js
  19. 5 5
      src/modules/clipModel/Clip.js
  20. 23 4
      src/modules/datasetAlignment/Alignment.js
  21. 8 7
      src/modules/panoEdit/panoEditor.js
  22. 4 4
      src/modules/siteModel/BuildingBox.js
  23. 4 4
      src/modules/siteModel/SiteModel.js
  24. 21 9
      src/navigation/FirstPersonControls.js
  25. 10 9
      src/navigation/InputHandler.js
  26. 1 1
      src/objects/Axis.js
  27. 3 3
      src/objects/Magnifier.js
  28. 1 1
      src/objects/TextSprite.js
  29. 4 4
      src/objects/tool/CurveCtrl.js
  30. 1 1
      src/objects/tool/HandleSprite.js
  31. 1 1
      src/objects/tool/HandleSvg.js
  32. 4 4
      src/objects/tool/Measure.js
  33. 1 1
      src/objects/tool/MeasuringTool.js
  34. 9 2
      src/objects/tool/TransformationTool.js
  35. 1 1
      src/objects/tool/ctrlPolygon.js
  36. 5 5
      src/objects/tool/mapClipBox.js
  37. 12 7
      src/settings.js
  38. 29 9
      src/start.js
  39. 11 3
      src/utils/Common.js
  40. 1 1
      src/utils/CursorDeal.js
  41. 1 1
      src/utils/DrawUtil.js
  42. 1 1
      src/utils/cameraLight.js
  43. 2 2
      src/utils/request.js
  44. 1 1
      src/utils/searchRings.js
  45. 1 1
      src/viewer/EDLRenderer.js
  46. 15 1
      src/viewer/Scene.js
  47. 3 3
      src/viewer/View.js
  48. 1 1
      src/viewer/Viewport.js
  49. 5 5
      src/viewer/map/MapViewer.js
  50. 16 0
      src/viewer/sidebar.html
  51. 62 20
      src/viewer/sidebar.js
  52. 77 49
      src/viewer/viewer.js
  53. 1 1
      src/viewer/viewerBase.js
  54. 16 7
      改bug的历史.txt

+ 2 - 0
gulpfile.js

@@ -22,6 +22,7 @@ let paths = {
 	html: [
 		"src/viewer/potree.css",
 		"src/viewer/sidebar.html",
+        "src/viewer/sidebar2.html",
 		"src/viewer/profile.html"
 	],
 	resources: [
@@ -89,6 +90,7 @@ let shaders = [
 gulp.task('webserver', gulp.series(async function() {
 	server = connect.server({
 		port: 1234,
+        host:'192.168.0.113',
 		https: false,
 	});
 }));

+ 4 - 1
libs/three.js/lines/LineMaterial.js

@@ -563,7 +563,10 @@ class LineMaterial extends ShaderMaterial {
 
 		this.isLineMaterial = true;
         this.lineWidth_ = 0
-        this.supportExtDepth = parameters.supportExtDepth
+        this.supportExtDepth = parameters.supportExtDepth 
+        this.depthTestWhenPick = false //pick时是否识别点云等
+        
+        
         if(parameters.color){
             this.color = new Color(parameters.color)  
         }

二進制
note/images360.updateCube笔记.jpg


+ 2 - 2
src/Features.js

@@ -1,5 +1,5 @@
 
-import browser from './utils/browser'
+import browser from './utils/browser.js'
 
 
 
@@ -82,7 +82,7 @@ export const Features = (function () {
                     }
                 }
 
-                return  gl.getExtension('EXT_frag_depth');
+                return  gl.getExtension('EXT_frag_depth'); //shader中的GL_EXT_frag_depth需要判断一下detectIOS吗。。
             }
         },
         

+ 3 - 3
src/PointCloudOctree.js

@@ -6,10 +6,10 @@ import {PointCloudOctreeGeometryNode} from "./PointCloudOctreeGeometry.js";
 import {Utils} from "./utils.js";
 import {PointCloudMaterial} from "./materials/PointCloudMaterial.js";
 import math from "./utils/math.js";
-import Common from './utils/Common'
+import Common from './utils/Common.js'
 import {MeshDraw} from "./utils/DrawUtil.js";
 import searchRings from "./utils/searchRings.js";
-import {TextSprite} from './objects/TextSprite'
+import {TextSprite} from './objects/TextSprite.js'
 import {PointSizeType } from "./defines.js";
  
 
@@ -141,7 +141,7 @@ export class PointCloudOctree extends PointCloudTree {
     
 		//this.pointBudget = Infinity;
 		this.pcoGeometry = geometry;
-		this.boundingBox = this.pcoGeometry.boundingBox;
+		this.boundingBox = this.pcoGeometry.tightBoundingBox//this.pcoGeometry.boundingBox;  //boundingBox是正方体,所以换掉
 		this.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());
 		this.material = material || new PointCloudMaterial();
 		this.visiblePointsTarget = 2 * 1000 * 1000;

+ 9 - 5
src/Potree.js

@@ -166,8 +166,10 @@ export async function loadDatasets(callback){//之后直接把path写进来
     if(Potree.fileServer){
         path = `/laser/dataset/${Potree.settings.number}/getDataSet` 
     }else{
-        path = `${Potree.settings.urls.prefix2}/indoor/${Potree.settings.number}/api/datasets`
-          
+        //path = `${Potree.settings.urls.prefix2}/indoor/${Potree.settings.number}/api/datasets`
+        //现在只能加载得了本地的了
+        path = `${Potree.scriptPath}/data/${Potree.settings.number}/getDataSet.json`
+        
     }
     return loadFile(path, callback)
     
@@ -223,9 +225,11 @@ export async function loadPanos(datasetId, callback){
     let query = `?datasetId=${datasetId}`                  //`?lat=${center.lat}&lon=${center.lon}&radius=200000`
     if(Potree.fileServer){
         path = `/laser/filter/${Potree.settings.number}/query` + query
-    }else{ 
-        path = `${Potree.settings.urls.prefix2}/indoor/${Potree.settings.number}/api/images/filter` + 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`
+
+         
     }
     return loadFile(path, callback) 
     

+ 1 - 1
src/PotreeRenderer.js

@@ -1533,7 +1533,7 @@ export class Renderer {
         
         
         
-        
+        //gl.bindTexture(gl.TEXTURE_2D, null); //add
         
         
         

+ 1 - 1
src/defines.js

@@ -1,6 +1,6 @@
 import * as THREE from "../libs/three.js/build/three.module.js";
 import {Enum} from "./Enum.js";
-import math from "./utils/math";
+import math from "./utils/math.js";
 
 export const CameraMode = {
 	ORTHOGRAPHIC: 0,

+ 14 - 6
src/materials/DepthBasicMaterial.js

@@ -14,7 +14,7 @@ export default class DepthBasicMaterial extends THREE.ShaderMaterial{
 			nearPlane:     { type: 'f', 	value: 0.1 },
 			farPlane:      { type: 'f', 	value: 10000 }, 
 			depthTexture:   { type: 't', 	value: null }, 
-			opacity:        { type: 'f',	value: o.opacity == void 0 ? 1 : o.opacity },
+			opacity:        { type: 'f',	value: 1  },
 			map:             { type: 't', 	value: o.map }, 
             baseColor:     {type:'v3',      value: o.color ?  new THREE.Color(o.color) :  new THREE.Color("#ffffff")},
             backColor:     {type:'v3',      value: o.backColor ?  new THREE.Color(o.backColor) :  new THREE.Color("#ddd")},
@@ -27,8 +27,7 @@ export default class DepthBasicMaterial extends THREE.ShaderMaterial{
         
         let defines = {};
         if(o.useDepth && Features.EXT_DEPTH.isSupported())defines.useDepth = ''
-        if(o.map)defines.use_map = ''
-         
+        if(o.map)defines.use_map = '' 
         super({ 
             uniforms,
             vertexShader: Shaders['depthBasic.vs'],   
@@ -38,8 +37,10 @@ export default class DepthBasicMaterial extends THREE.ShaderMaterial{
             transparent: o.transparent == void 0 ?  true : o.transparent,
             side: o.side || 0 /* THREE.DoubleSide */,
             defines, 
-        } )
-        
+        })
+        if(o.opacity != void 0){
+            this.opacity = o.opacity
+        }
        
         if(o.useDepth && Features.EXT_DEPTH.isSupported()) this.useDepth_ = true
         
@@ -103,7 +104,7 @@ export default class DepthBasicMaterial extends THREE.ShaderMaterial{
     
     get useDepth(){
         return this.useDepth_
-    }
+    } 
     
     set useDepth(value){//如果不支持 EXT_DEPTH 的话会失效
         if(this.useDepth_ != value){
@@ -119,6 +120,13 @@ export default class DepthBasicMaterial extends THREE.ShaderMaterial{
     } 
     
     
+    get opacity(){
+        return this.uniforms.opacity.value
+    }
+    set opacity(o){
+        this.uniforms && (this.uniforms.opacity.value = o)
+    }
+    
     /* dispose(){ 
         super.dispose()
         viewer.depthBasic

+ 22 - 29
src/materials/ModelTextureMaterial.js

@@ -1,4 +1,6 @@
 import * as THREE from "../../libs/three.js/build/three.module.js";
+import Common from '../utils/Common.js'
+
 const prefixVertex ="precision highp float;\nprecision highp int;\n\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\n"
 const prefixFragment ="precision highp float;\nprecision highp int;\n\nuniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"
  
@@ -276,9 +278,7 @@ export default class ModelTextureMaterial extends THREE.RawShaderMaterial {
 	constructor( ){ 
     
         let defines = {}
-        if(Potree.settings.hasDepthTex){
-            defines.hasDepthTex = '' 
-        } 
+         
        
         
         super({
@@ -289,19 +289,7 @@ export default class ModelTextureMaterial extends THREE.RawShaderMaterial {
 			name: "ModelTextureMaterial",
             defines
         })
-        
-        
-        /* var defines = parameters.defines || {}
-        defines.Not_Cube = "";
-        parameters.defines = defines; 
-		
- 
-		super(Object.assign()({
-			fragmentShader: shaders[matName].fragmentShader,
-			vertexShader: shaders[matName].vertexShader,
-			uniforms: THREE.UniformsUtils.clone(shaders[matName].uniforms),
-			name: "ModelTextureMaterial"
-		}, parameters));*/
+    
         
             
         let setSize = (e)=>{ 
@@ -318,8 +306,10 @@ export default class ModelTextureMaterial extends THREE.RawShaderMaterial {
         viewer.addEventListener('resize',(e)=>{
             setSize(e)     
         }) 
-
-        /* if(this.supportExtDepth) */{
+        
+        
+        //var supportExtDepth = !!Features.EXT_DEPTH.isSupported()  
+        {
          
             //add
             
@@ -327,13 +317,8 @@ export default class ModelTextureMaterial extends THREE.RawShaderMaterial {
                 //this.uniforms.projectionMatrix.value.copy(e.camera.projectionMatrix) 
                 this.uniforms.inverseProjectionMatrix.value.copy(e.camera.projectionMatrixInverse)
             })   
-     
-        
-            /* viewer.addEventListener("render.begin", (e)=>{//before render  如果有大于两个viewport的话,不同viewport用不同的depthTex
-                if(e.viewport.camera.isPerspectiveCamera) this.updateDepthParams(e)
-            }) */ 
 
-        }
+        } 
 
         
 		//-------------------------------------
@@ -378,8 +363,8 @@ export default class ModelTextureMaterial extends THREE.RawShaderMaterial {
         this.updateDepthTex(pano1)
         
         
-        console.log('setProjectedPanos', pano0.id, pano1&&pano1.id)
-        //this.needsUpdate = true;
+        //console.log('setProjectedPanos', pano0&&pano0.id, pano1&&pano1.id)
+        this.needsUpdate = true;
  	}
     
     
@@ -389,14 +374,22 @@ export default class ModelTextureMaterial extends THREE.RawShaderMaterial {
         //console.log('updateDepthTex', pano.id,  this.pano0 && this.pano0.id,  this.pano1 && this.pano1.id)
         this.uniforms.depthMap0.value = this.pano0 && this.pano0.depthTex 
         this.uniforms.depthMap1.value = this.pano1 && this.pano1.depthTex 
-       
+        this.updateDepthTexEnable()
     }
     
-    EnableDepthTex(){//开启DepthTex
+    updateDepthTexEnable(){
+        let hasDepthTex = this.pano0 && this.pano1 && this.pano0.pointcloud.hasDepthTex && this.pano1.pointcloud.hasDepthTex  //暂时不知道一个有图一个没图怎么写所以
+        
+        Common.addOrRemoveDefine(this, 'hasDepthTex', hasDepthTex?'add':'remove' )
+        
+        
+    }
+    
+    /* EnableDepthTex(){//开启DepthTex
         if(this.defines['hasDepthTex']){
             return 
         }
         this.defines['hasDepthTex'] = ''
         this.needsUpdate = true;
-    }
+    } */
 }

+ 4 - 4
src/modules/CameraAnimation/CameraAnimation.js

@@ -1,10 +1,10 @@
 
 import * as THREE from "../../../libs/three.js/build/three.module.js"; 
 import { Utils } from "../../utils.js";
-import math  from "../../utils/math";
-import {LineDraw} from "../../utils/DrawUtil"; 
-import CurveCtrl from  "../../objects/tool/CurveCtrl";
-import HandleSvg from  "../../objects/tool/HandleSvg";
+import math  from "../../utils/math.js";
+import {LineDraw} from "../../utils/DrawUtil.js"; 
+import CurveCtrl from  "../../objects/tool/CurveCtrl.js";
+import HandleSvg from  "../../objects/tool/HandleSvg.js";
 import {/* transitions,*/ easing,  lerp} from '../../utils/transitions.js'
  
 

+ 483 - 101
src/modules/Images360/Images360.js

@@ -5,17 +5,17 @@ import ModelTextureMaterial from "../../materials/ModelTextureMaterial.js";
 import Common from "../../utils/Common.js";
 import math from "../../utils/math.js";
 import cameraLight from "../../utils/cameraLight.js";
-import {MeshDraw } from '../../utils/DrawUtil'
+import {MeshDraw } from '../../utils/DrawUtil.js'
 import Panorama from "./Panorama.js";
-import browser from '../../utils/browser' 
-import QualityManager from './tile/QualityManager' 
-import TileDownloader from './tile/TileDownloader'
-import PanoRenderer from './tile/PanoRenderer' 
-import TilePrioritizer from './tile/TilePrioritizer'
-import { PanoSizeClass,Vectors,GLCubeFaces, PanoramaEvents} from '../../defines'
+import browser from '../../utils/browser.js' 
+import QualityManager from './tile/QualityManager.js' 
+import TileDownloader from './tile/TileDownloader.js'
+import PanoRenderer from './tile/PanoRenderer.js' 
+import TilePrioritizer from './tile/TilePrioritizer.js'
+import { PanoSizeClass,Vectors,GLCubeFaces, PanoramaEvents} from '../../defines.js'
  
 import {transitions, easing, lerp} from "../../utils/transitions.js";
-import DepthImageSampler from './DepthImageSampler'
+import DepthImageSampler from './DepthImageSampler.js'
 
 
  
@@ -38,7 +38,7 @@ let previousView = {
 const HighMapCubeWidth = 1
  
  
-const directionFactor = 100 //原先10,几乎只往距离近的走了;设置太大楼梯上不去
+const directionFactor = 200 //原先10,几乎只往距离近的走了;设置太大楼梯上不去
  
  
 export class Images360 extends THREE.EventDispatcher{
@@ -143,10 +143,11 @@ export class Images360 extends THREE.EventDispatcher{
         let click = (e) => {//不用"mouseup" 是因为 mouseup有drag object时也会触发 
             if(Potree.settings.unableNavigate || this.flying  || !e.isTouch && e.button != THREE.MOUSE.LEFT || e.drag &&  e.drag.object //拖拽结束时不算
                || Potree.settings.editType == 'pano' && viewer.modules.PanoEditor.activeViewName != 'mainView'
+                ||   Potree.settings.editType == 'merge' && !e.intersectPoint || viewer.inputHandler.hoveredElements[0] && viewer.inputHandler.hoveredElements[0].isModel && e.intersectPoint.distance > viewer.inputHandler.hoveredElements[0].distance
             )  return 
             
             
-            if(Potree.settings.editType != 'pano'){
+            if(Potree.settings.editType != 'pano' && Potree.settings.editType != 'merge'){
                 if( e.hoverViewport == viewer.mapViewer.viewports[0]){
                     return viewer.mapViewer.dispatchEvent(e/* {type:'global_click',e } */) 
                 }
@@ -193,28 +194,28 @@ export class Images360 extends THREE.EventDispatcher{
             this.elUnfocus = elUnfocus;
             this.domRoot.appendChild(elUnfocus[0]);
             
-            
-            
-            let elHide = $("<input type='button' value='隐藏点云'></input>")
-            elHide.css({
-                position : "absolute",
-                right : '40%',
-                bottom: '20px',
-                zIndex: "10000",
-                fontSize:'1em'  ,color:"black",
-                width : '100px',
-                background:'rgba(255,255,255,0.8)',
-            }) 
-            this.domRoot.appendChild(elHide[0]);
-            elHide.on("click", (e) => { 
-                let visi = viewer.getObjVisiByReason(viewer.scene.pointclouds[0], 'force')
-                viewer.scene.pointclouds.forEach(e=>{ 
-                    viewer.updateVisible(e, 'force', !visi) 
-                })
-                elHide.val(!visi ? "隐藏点云" : "显示点云")  
-            });
-            
-            
+            if(Potree.settings.editType != 'merge'){
+            
+                let elHide = $("<input type='button' value='隐藏点云'></input>")
+                elHide.css({
+                    position : "absolute",
+                    right : '40%',
+                    bottom: '20px',
+                    zIndex: "10000",
+                    fontSize:'1em'  ,color:"black",
+                    width : '100px',
+                    background:'rgba(255,255,255,0.8)',
+                }) 
+                this.domRoot.appendChild(elHide[0]);
+                elHide.on("click", (e) => { 
+                    let visi = viewer.getObjVisiByReason(viewer.scene.pointclouds[0], 'force')
+                    viewer.scene.pointclouds.forEach(e=>{ 
+                        viewer.updateVisible(e, 'force', !visi) 
+                    })
+                    elHide.val(!visi ? "隐藏点云" : "显示点云")  
+                });
+                
+            }
             
             let elDisplayModel = $("<input type='button' value='>>全景'></input>")
             elDisplayModel.css({
@@ -229,7 +230,8 @@ export class Images360 extends THREE.EventDispatcher{
             
             this.domRoot.appendChild(elDisplayModel[0]);
             elDisplayModel.on("click", (e) => { 
-                Potree.settings.displayMode =  Potree.settings.displayMode == 'showPointCloud' ? 'showPanos' : 'showPointCloud'
+                if(Potree.settings.displayMode == 'showPointCloud' && this.panos.length == 0)return
+                Potree.settings.displayMode = Potree.settings.displayMode == 'showPointCloud' ? 'showPanos' : 'showPointCloud'
             });
  
             this.elDisplayModel = elDisplayModel
@@ -297,10 +299,8 @@ export class Images360 extends THREE.EventDispatcher{
                         }
                         
                         
-                        
-                        if(config2.showSkybox || config2.pointUsePanoTex){
-                            //this.currentPano.loadDepthImg()
-                            //this.updateDepthTex()
+                            
+                        if(config2.showSkybox || config2.pointUsePanoTex){ 
                             let wait = ()=> {
                                 setTimeout( ()=>{
                                     if(latestRequestMode == mode ){
@@ -309,18 +309,16 @@ export class Images360 extends THREE.EventDispatcher{
                                 },1)
                                 this.removeEventListener('loadedDepthImg', wait)
                             }
-                            if(!this.currentPano.depthTex && Potree.settings.hasDepthTex){
+                            if(!this.currentPano.depthTex && this.currentPano.pointcloud.hasDepthTex){
                                 this.addEventListener('loadedDepthImg', wait)           
                                 return this.currentPano.loadDepthImg()
                             } 
-                            //this.updateDepthTex()
-                            
+                            //this.updateDepthTex()  
                             if(this.checkAndWaitForPanoLoad(this.currentPano,  this.basePanoSize, wait)){
                                 return
-                            } 
-                             
+                            }  
                         } 
-
+                        
                          
                         
                         viewer.scene.pointclouds.forEach(e=>{
@@ -399,7 +397,7 @@ export class Images360 extends THREE.EventDispatcher{
                         
                         
                         if(this.elDisplayModel){
-                            this.elDisplayModel.value = mode == 'showPointCloud' ? ">>全景" : '>>点云'
+                            this.elDisplayModel.val( mode == 'showPointCloud' ? ">>全景" : '>>点云')
                         }
                          
                         /* this.panos.forEach(e=>{
@@ -503,10 +501,12 @@ export class Images360 extends THREE.EventDispatcher{
 	}; 
     
     
-    updateDepthTex(pano){
+    updateDepthTex(pano){ 
         if(this.currentPano != pano || !pano.depthTex)return 
         //this.depthSampler.changeImg(pano.depthTex.image);  //pick sampler要飞到了才能切换图,而skybox贴图是随着全景图切换而切换的
-        this.cube.material.updateDepthTex(pano)  //确保一下
+        this.cube.material.updateDepthTex(pano)  //确保一下 
+        
+        
     }
     
     findNearestPano(pos){
@@ -622,14 +622,14 @@ export class Images360 extends THREE.EventDispatcher{
         /* if(!this.currentPano){
             return this.focusPano(toPano) 
         } */
-        //console.log('flyToPano:', toPano.pano.id)
+        
         let done = (makeIt)=>{
             //console.log('flyToPano done ', toPano.pano.id, makeIt ) 
             if(makeIt || toPano.dealDoneWhenCancel) {
-                toPano.callback && toPano.callback()  
+                toPano.callback && toPano.callback() 
+                this.flying = false
+                this.updateClosestPano(this.closestPano,false) //飞行结束后取消点击漫游点时得到的closestPano
             }
-            this.flying = false
-            this.updateClosestPano(this.closestPano,false) //飞行结束后取消点击漫游点时得到的closestPano
             //this.dispatchEvent('cameraMoveDone')
             toPano.deferred && toPano.deferred.resolve(makeIt)  //测量线截图时发现,resolve需要写在flying=false 后才行。
         }
@@ -657,26 +657,28 @@ export class Images360 extends THREE.EventDispatcher{
         
         this.nextPano = pano
         //不飞的话是否不要执行这段?
-        if(config.atPano.showSkybox || config.atPano.pointUsePanoTex){ 
+        
+        {
             let wait = ()=> {
                 setTimeout( ()=>{ 
                     this.flyToPano(toPano) 
                 },1)
                 this.removeEventListener('loadedDepthImg', wait)
             }
-            if(!pano.depthTex && Potree.settings.hasDepthTex){
+            if(!pano.depthTex && pano.pointcloud.hasDepthTex){ //需要用到depthTex计算neighbour
                 this.addEventListener('loadedDepthImg', wait)           
                 return pano.loadDepthImg()
-            } 
-            this.updateCube(this.currentPano, toPano.pano)
+            }
             
-            if(this.checkAndWaitForPanoLoad(pano, toPano.basePanoSize || this.basePanoSize,  wait)){
-                return
+            if(config.atPano.showSkybox || config.atPano.pointUsePanoTex){ 
+                 
+                this.updateCube(this.currentPano, toPano.pano)
+                
+                if(this.checkAndWaitForPanoLoad(pano, toPano.basePanoSize || this.basePanoSize,  wait)){
+                    return
+                }  
             } 
-            
-            
-        } 
-        
+        }
 		 
         this.cube.visible = config.atPano.showSkybox 
         /* this.cube.visible && this.cube.material.setProjectedPanos(this.currentPano, pano, 0)
@@ -699,7 +701,7 @@ export class Images360 extends THREE.EventDispatcher{
                 viewer.updateVisible(e, 'displayMode', true) 
             })
         }            
-         
+        
         if(config.transition.showSkybox || config.transition.pointUsePanoTex){
             this.setProjectedPanos({
                 progress:0,
@@ -749,6 +751,8 @@ export class Images360 extends THREE.EventDispatcher{
                     //this.updateCube(this.currentPano)
                     this.updateDepthTex(this.currentPano)
                     
+                    
+                    
                 }, onUpdate:(progress)=>{ 
                     this.cube.material.uniforms.progress.value = progress 
                     
@@ -772,7 +776,7 @@ export class Images360 extends THREE.EventDispatcher{
             fly()
         }
        
-    
+        //console.log('flyToPano:', toPano.pano.id) 
     }
 
 
@@ -919,6 +923,9 @@ export class Images360 extends THREE.EventDispatcher{
 
 
     updateCube(pano0, pano1){
+        
+        if(!viewer.scene.pointclouds.some(e=>!e.hasDepthTex))   return this.updateCube2(pano0, pano1) //都hasDepthTex的话
+        
         if(Potree.settings.displayMode != 'showPanos')return
         
        
@@ -1260,14 +1267,15 @@ export class Images360 extends THREE.EventDispatcher{
     } */
     
     
-    updateCube2(pano0, pano1){//增加细分的版本,且垂直方向上取中位数
+    
+    updateCube3(pano0, pano1){//增加细分的版本,且垂直方向上取中位数... 侧边只有一条
         if(Potree.settings.displayMode != 'showPanos' || pano0 == pano1
             ||  this.cubePanos.includes(pano0) && this.cubePanos.includes(pano1) 
         ) return
         
         this.cubePanos = [pano0, pano1]
         
-        console.log('updateCube',pano0.id, pano1&&pano1.id)
+        //console.log('updateCube',pano0.id, pano1&&pano1.id)
         
         let f = (bound, size)=>{
             size = size || bound.getSize(new THREE.Vector3) 
@@ -1279,30 +1287,19 @@ export class Images360 extends THREE.EventDispatcher{
         }
         
         
-        //this.cube.geometry.dispose();
+        this.cube.geometry.dispose();
         
         if(pano1){//过渡
-           // if(this.update111)return
-           // this.update111 = true  
-            this.cube.geometry.dispose();
-            
-           // this.cube.geometry = new THREE.BoxBufferGeometry(1,1,1,1);//new THREE.SphereBufferGeometry(1,10,10)
-            //this.cube.scale.set(20,10,20);
-           /// this.cube.position.copy(pano1.position)
-            
            
-            //f(pano0.pointcloud.bound) 
     
-            //return 
-
-
-            const half = Potree.settings.hasDepthTex ? ( browser.isMobile() ? 3 : 6 ) : (browser.isMobile() ? 2 : 3)  //自行输入  (点云计算的慢,还不准) 
+            const half = pano0.pointcloud.hasDepthTex && pano0.pointcloud.hasDepthTex ? ( browser.isMobile() ? 3 : 6 ) : (browser.isMobile() ? 2 : 3)  //自行输入  (点云计算的慢,还不准) 
             let count1 = 2*half//偶数个 dir 个数
+            
             //奇数个的好处:在窄空间内能探测到最远距离,坏处是前方有尖角。偶数个的坏处就是可能检测距离太近。
             let panoIndex = 0
             
             let getIntersect = (pano, dir, origin)=>{
-                if(Potree.settings.hasDepthTex && pano){
+                if(pano && pano.pointcloud.hasDepthTex ){
                     return this.depthSampler.sample( {dir }, pano, true )
                 }else{
                     origin = origin || pano.position
@@ -1336,7 +1333,7 @@ export class Images360 extends THREE.EventDispatcher{
                     return projectLen
                 }) 
                 disArr.sort((a,b)=>{return b-a}); //从大到小
-                console.log(pano ? pano.id : 'side','disArr', disArr)
+                //console.log(pano ? pano.id : 'side','disArr', disArr)
                 let dis = disArr[Math.floor(count2/2-0.5)] //对半、取前(中位数)
                  
                  
@@ -1374,8 +1371,8 @@ export class Images360 extends THREE.EventDispatcher{
                     let min = pano.position.z + 1  
                     maxZ = Math.max(min,maxZ)
                     pano.ceilZ = maxZ
-                    console.log(pano.id, 'maxZ:',maxZ )
-                    console.log(pano.id, 'minZ:',minZ )
+                    //console.log(pano.id, 'maxZ:',maxZ )
+                    //console.log(pano.id, 'minZ:',minZ )
                 }
                 [maxZ, minZ ].forEach(z=>{  
                     posArr.push(pano.position.clone().setZ(z))
@@ -1387,7 +1384,7 @@ export class Images360 extends THREE.EventDispatcher{
                 //在画面上线条从左往右数
                 let dirs = []; 
                 for(let i=0;i<count1;i++){ 
-                    dirs.push(getDir(Math.PI/2-i*angle, vec))
+                    dirs.push(getDir(Math.PI/2-i*angle, vec))//正的在左边
                 } 
                  
                 
@@ -1459,18 +1456,59 @@ export class Images360 extends THREE.EventDispatcher{
                 let sideMaxZ = (pano0.ceilZ + pano1.ceilZ)/2
                 let sideMinZ = (pano0.floorPosition.z+pano1.floorPosition.z)/2;
                 
-                let sideDis = [Math.min(sideDis0[0] , sideDis1[1]),  Math.min(sideDis0[1] , sideDis1[0])]//[(sideDis0[0] + sideDis1[1])/2,  (sideDis0[1] + sideDis1[0])/2];
+                let sideDis_ = [(sideDis0[0] + sideDis1[1])/2,  (sideDis0[1] + sideDis1[0])/2];
+                let sideDis = [Math.min(sideDis0[0] , sideDis1[1]),  Math.min(sideDis0[1] , sideDis1[0])]//
                 
                 let mid = new THREE.Vector3().addVectors(pano0.position, pano1.position).multiplyScalar(0.5)
-                
                 let sideDirs = [getDir(-Math.PI/2, vec), getDir(Math.PI/2, vec)]
-                sideDirs.forEach((dir_ ,index)=>{
-                    let dis = getFar(dir_, null, mid);
-                    dir_.multiplyScalar( Math.max(dis, sideDis[index]) );  
-                    [sideMaxZ,sideMinZ].forEach(z=>{  
-                        posArr.push(mid.clone().setZ(z).add(dir_))
+                
+                if(pano0.pointcloud.hasDepthTex && pano0.pointcloud.hasDepthTex){
+                    let panos = [pano0,pano1]
+                    let vecs = [vec.negate(), vec]
+                    let axis = [[-1,1],[1,-1]]
+                    let dis2d = new THREE.Vector2().subVectors(pano0.position, pano1.position).length()//水平上的距离
+                    let angles = [THREE.Math.degToRad(45), THREE.Math.degToRad(60)] 
+                    sideDirs.forEach((dir, index0)=>{
+                        let disToSides = []
+                        panos.forEach((pano,index)=>{ 
+                            let dirs = [getDir(axis[index0][index]*angles[0], vecs[index]), getDir(axis[index0][index]*angles[1], vecs[index])];//一侧的若干角度
+                            dirs.forEach((dir_,i)=>{
+                                let dis1 = getFar(dir_, pano);
+                                //dir_.multiplyScalar( dis1 );
+                                let disToPano2d = dis1 * Math.cos(angles[i])
+                                if(disToPano2d<dis2d){//超过的话都到另一半pano的半圆了,不计入
+                                    let disToSide = dis1 * Math.sin(angles[i]) 
+                                    disToSides.push(disToSide)
+                                }
+                            }) 
+                        })
+                        let disToSide 
+                        if(disToSides.length){
+                            disToSides.sort((a,b)=>{return b-a});//从大到小
+                            disToSide = disToSides[0]
+                            console.log('disToSides', index0, disToSides)
+                        }else{
+                            disToSide = sideDis[index0]
+                        }
+                        dir.multiplyScalar( disToSide );
+                        
+                        [sideMaxZ,sideMinZ].forEach(z=>{  
+                            posArr.push(mid.clone().setZ(z).add(dir)) //是直接使用最长dis的那个intersect点好还是mid
+                        })
                     })
-                })
+                    
+                }else{
+                    
+                    sideDirs.forEach((dir_ ,index)=>{
+                        let dis = getFar(dir_, null, mid);
+                        dir_.multiplyScalar( /* sideDis_[index] */  Math.max(dis, sideDis[index])  );  
+                        
+                        
+                        [sideMaxZ,sideMinZ].forEach(z=>{  
+                            posArr.push(mid.clone().setZ(z).add(dir_))
+                        })
+                    })
+                }
             }
             
             let posArr = [];
@@ -1498,7 +1536,346 @@ export class Images360 extends THREE.EventDispatcher{
             this.cube.geometry = new THREE.BoxBufferGeometry(1,1,1,1)
             f(pano0.pointcloud.bound) 
         }
-    }  
+    } 
+    
+    
+    
+    
+    updateCube2(pano0, pano1){//增加细分的版本,且垂直方向上取中位数  侧边多条
+        if(Potree.settings.displayMode != 'showPanos' || pano0 == pano1
+            ||  this.cubePanos.includes(pano0) && this.cubePanos.includes(pano1) 
+        ) return
+        
+        this.cubePanos = [pano0, pano1]
+        
+        //console.log('updateCube',pano0.id, pano1&&pano1.id)
+        
+        let useBound = (bound, size)=>{
+           
+            size = size || bound.getSize(new THREE.Vector3) 
+            let center = bound.getCenter(new THREE.Vector3)
+            size.max(new THREE.Vector3(HighMapCubeWidth,HighMapCubeWidth,HighMapCubeWidth))
+            this.cube.geometry = new THREE.BoxBufferGeometry(1,1,1,1)
+            this.cube.scale.copy(size)  
+            this.cube.position.copy(center)  
+        }
+        
+        
+        this.cube.geometry.dispose();
+        
+        if(pano1){//过渡  
+            
+            if(pano0.pointcloud != pano1.pointcloud){ //距离太远的数据集,过渡会畸变。所以扩大skybox
+                let dis = pano0.position.distanceTo(pano1.position)
+                if(dis > 100){
+                    let bound = pano0.pointcloud.bound.clone().union(pano1.pointcloud.bound)
+                    let size = bound.getSize(new THREE.Vector3) 
+                    let max = Math.max(size.x, size.y, size.z)
+                    size.set(max,max,max)
+                    return useBound(bound, size)
+                }
+            }
+                
+             
+            const half = pano0.pointcloud.hasDepthTex && pano0.pointcloud.hasDepthTex ?  6  : (browser.isMobile() ? 2 : 3)  //自行输入  (点云计算的慢,还不准) 
+            let count1 = 2*half//偶数个 每个pano向 外dir 个数 
+            //奇数个的好处:在窄空间内能探测到最远距离,坏处是前方有尖角。偶数个的坏处就是可能检测距离太近。
+            
+            //let panoIndex = 0
+            
+            let getIntersect = (pano, dir, origin)=>{
+                if(pano && pano.pointcloud.hasDepthTex ){
+                    return this.depthSampler.sample( {dir }, pano, true )
+                }else{
+                    origin = origin || pano.position
+                    return viewer.inputHandler.getIntersect(viewer.inputHandler.hoverViewport, true, null, null, true, {
+                        point: origin.clone().add(dir),
+                        cameraPos: origin
+                    })
+                }
+            } 
+            let getDir = (angle_, vec)=>{ //旋转获得水平向量
+                let rotMat = new THREE.Matrix4().makeRotationZ(angle_)
+                return vec.clone().applyMatrix4(rotMat) 
+            }
+            let getFar = (dir, pano, origin)=>{//获取在这个方向上和墙体intersect的距离  
+                //在垂直方向上分出多个方向,取一个最可能的接近真实的距离
+                let dirs_ = [
+                    //注意:角度太大会碰到天花板或地板,越远越容易碰到, 在地下停车场就会伸展不开。 户外时需要更多向上的方向,所以上方向多一个
+                    dir.clone().setZ(Math.tan(THREE.Math.degToRad(30))).normalize(), 
+                    dir.clone().setZ(Math.tan(THREE.Math.degToRad(7))).normalize(), 
+                    dir.clone(),            // 水平方向
+                    dir.clone().setZ(-Math.tan(THREE.Math.degToRad(5))).normalize(), 
+                    //dir.clone().setZ(-Math.tan(THREE.Math.degToRad(30))).normalize(), 
+                ]; 
+                
+                let max = 50
+                let count2 = dirs_.length
+                let disArr = dirs_.map((dir_, i) =>{   
+                    let intersect = getIntersect(pano, dir_, origin) 
+                    let projectLen = intersect && intersect.distance ? dir_.dot(dir)*intersect.distance : max; //得到project在dir的长度 
+                    return projectLen //得水平距离
+                }) 
+                disArr.sort((a,b)=>{return b-a}); //从大到小
+                //console.log(pano ? pano.id : 'side','disArr', disArr)
+                let dis = disArr[Math.floor(count2/2-0.5)] //对半、取前(中位数) 
+                return dis
+            }
+
+            let sideCount = []
+            
+            let addPos = (pano, vec )=>{//添加这个pano这一侧向外半圆的顶点
+                //添加pano位置对应的最高点最低点:
+                let minZ, maxZ
+                minZ = pano.floorPosition.z
+                 
+                if(pano.ceilZ != void 0){
+                    maxZ = pano.ceilZ
+                }else{//天花板高度值
+                    //用三个间隔120度散开,和中心垂直线成一定夹角的三个向量去求 最高高度 (不求平均的原因:万一是0不好算)
+                    let rotMat = new THREE.Matrix4().makeRotationX(THREE.Math.degToRad(40))// 角度不能小于天花板中空的半径,大概就是0.2*Math.PI=36度
+                    let dir1 = new THREE.Vector3(0,0,1).applyMatrix4(rotMat)
+                    let rotMat1 = new THREE.Matrix4().makeRotationZ(Math.PI*2 / 3);
+                    let rotMat2 = new THREE.Matrix4().makeRotationZ(-Math.PI*2 / 3);
+                    
+                    let dir2 = dir1.clone().applyMatrix4(rotMat1)
+                    let dir3 = dir1.clone().applyMatrix4(rotMat2)
+                    let skyHeight = 50
+                    let zs = [dir1,dir2,dir3].map(dir_=>{ 
+                        let intersect = getIntersect(pano, dir_) 
+                        let z = intersect ? intersect.location.z : pano.position.z+skyHeight //没有intersect代表可能是天空
+                        return z 
+                    })
+                    zs.sort((a,b)=>{return b-a});//得最大值  (不用中位数的原因:在屋檐处,如果仅有一个intersect是天空,因到了室外所以也用天空高度)
+                    maxZ = zs[0]
+                    
+                    let min = pano.position.z + 1  // 防止意外太低
+                    maxZ = Math.max(min,maxZ)
+                    pano.ceilZ = maxZ
+                    //console.log(pano.id, 'maxZ:',maxZ )
+                    //console.log(pano.id, 'minZ:',minZ )
+                }
+                [maxZ, minZ ].forEach(z=>{  
+                    posArr.push(pano.position.clone().setZ(z))
+                })
+                
+                
+                
+                //在画面上线条从左往右数
+                const angle = Math.PI/(count1-1)  
+                const dirs = [];  //平分这半边180度
+                for(let i=0;i<count1;i++){ 
+                    dirs.push(getDir(Math.PI/2-i*angle, vec))//正的在左边
+                } 
+                 
+                
+                
+                // let sideDis = []
+                dirs.forEach((dir, index)=>{
+                    let dis = getFar(dir, pano);
+                    // if(index == 0 || index == count1-1){
+                        // sideDis.push(dis)
+                    // }
+                    dir.multiplyScalar( dis ); 
+                    
+                    [maxZ,minZ].forEach(z=>{  
+                        posArr.push(pano.position.clone().setZ(z).add(dir))  //获取到外墙点
+                    })
+                        
+                     
+                }); 
+                 
+                //panoIndex ++
+                //return sideDis;
+            }
+            
+            
+            
+            let addSide = ()=>{//两个漫游点间两边各加一些侧线 
+                //中点处的
+                let midMaxZ = (pano0.ceilZ + pano1.ceilZ)/2
+                let midMinZ = (pano0.floorPosition.z+pano1.floorPosition.z)/2;
+                let mid = new THREE.Vector3().addVectors(pano0.position, pano1.position).multiplyScalar(0.5)
+                
+                /* let sideDis_ = [(sideDis0[0] + sideDis1[1])/2,  (sideDis0[1] + sideDis1[0])/2];
+                let sideDis = [Math.min(sideDis0[0] , sideDis1[1]),  Math.min(sideDis0[1] , sideDis1[0])]//
+                 */
+                
+                
+                if(pano0.pointcloud.hasDepthTex && pano0.pointcloud.hasDepthTex){
+                    let panos = [pano0,pano1]
+                    let vecs = [vec.clone().negate(), vec]
+                    let axis = [[-1,1],[1,-1]]
+                    let dis2d = new THREE.Vector2().subVectors(pano0.position, pano1.position).length()//水平上的距离
+                    let angles = [THREE.Math.degToRad(40), THREE.Math.degToRad(70)] //正的在左边  尽量能够平分中间这段墙体
+                    axis.forEach((axis_, index0)=>{
+                        let disToSides = []
+                        let accordingPano = index0 == 0 ? pano0 : pano1; //根据离该点在vec方向上的距离顺序来存顶点
+                        panos.forEach((pano,index)=>{ 
+                            let dirs = [getDir(axis_[index]*angles[0], vecs[index]), getDir(axis_[index]*angles[1], vecs[index])];//一侧的若干角度
+                            
+                            dirs.forEach((dir_,i)=>{
+                                let dis1 = getFar(dir_, pano);
+                                
+                                let disToPano2d = dis1 * Math.cos(angles[i])
+                                if(disToPano2d<dis2d){//超过的话都到另一半pano的半圆了,不计入
+                                    let disToSide = dis1 * Math.sin(angles[i]) 
+                                     
+                                    if(pano != accordingPano){
+                                        disToPano2d = dis2d - disToPano2d //反一下
+                                    } 
+                                    
+                                    dir_.multiplyScalar( dis1 );
+                                    disToSides.push({disToSide,disToPano2d, pano, dir_})
+                                }
+                            }) 
+                        })
+                         
+                        
+                        sideCount[index0] = disToSides.length //记录侧边个数
+                        
+                        if(disToSides.length){
+                            //disToSides.sort((a,b)=>{return b-a});//从大到小
+                            //由距离accordingPano的近到远:
+                            disToSides.sort((a,b)=>{return a.disToPano2d-b.disToPano2d})
+                             
+                            //console.log('disToSides', index0, disToSides)
+                            
+                            
+                            disToSides.forEach(e=>{//求z
+                                let ratio = e.disToPano2d / dis2d
+                                let r = accordingPano == pano0 ? (1-ratio) : ratio
+                                let sideMaxZ_ = pano0.ceilZ * r + pano1.ceilZ * (1-r);
+                                let sideMinZ_ = pano0.floorPosition.z * r + pano1.floorPosition.z * (1-r);
+                                [sideMaxZ_,sideMinZ_].forEach(z=>{  
+                                    posArr.push(e.pano.position.clone().setZ(z).add(e.dir_)) //是直接使用最长dis的那个intersect点好还是mid
+                                })
+                                
+                            }) 
+                            
+                        }  
+                    })
+                    
+                }else{
+                    //这段针对点云时,仅测试才会执行到
+                    sideCount = [1,1]
+                    let sideDirs = [getDir(Math.PI/2, vec), getDir(-Math.PI/2, vec)]
+                    sideDirs.forEach((dir_ ,index)=>{
+                        let dis = getFar(dir_, null, mid); //直接从中点求两侧的距离
+                        dir_.multiplyScalar(  /* Math.max( */dis/* , sideDis[index]) */  );   
+                        [midMaxZ,midMinZ].forEach(z=>{  
+                            posArr.push(mid.clone().setZ(z).add(dir_))
+                        })
+                    }) 
+                } 
+                
+                
+                //中心:
+                [midMaxZ,midMinZ].forEach(z=>{  
+                    posArr.push(mid.clone().setZ(z))
+                })
+            }
+            
+            
+            
+            
+            //positions存放顺序:pano的每边的 zMax和zMin 、count1个dir的点 ;侧边的点 ;连接处顶底的中点
+            let addFaces = ()=>{
+                
+                let getPI = function(index, posType, panoIndex){//获取顶点序号
+                    return 2 + (count1*2 + 2 ) * panoIndex + index*2 + (posType == 'top' ? 0 : 1)
+                }
+                let getSidePI = function(index, posType, panoIndex){//获取侧边顶点序号 
+                    if(panoIndex == 1) index += sideCount[0] 
+                    return getPI(index, posType, 2)-2
+                }
+                let getPanoPI = function(posType, panoIndex){//获取pano处对应的点序号
+                    return getPI(-1, posType, panoIndex)
+                }
+                let topCenter = posArr.length-2;        //最后添加的两个中心点
+                let btmCenter = posArr.length-1;
+                
+                for(let i=0;i<2;i++){ 
+                    for(let index=1; index<count1; index++){
+                        //pano外侧半圆围墙
+                        faceArr.push([getPI(index,'top',i), getPI(index-1,'btm',i), getPI(index-1,'top',i)],//加入一块四方面 
+                                    [getPI(index,'top',i), getPI(index,'btm',i), getPI(index-1,'btm',i)])
+                                     
+                        faceArr.push([getPI(index,'top',i), getPI(index-1,'top',i), getPanoPI('top',i)])//天花板扇形
+                        faceArr.push([getPI(index,'btm',i), getPI(index-1,'btm',i), getPanoPI('btm',i)])//地板扇形    
+                                    
+                    } 
+                    
+                    let j = (i + 1) % 2; //另一个pano
+                      
+                     
+                    //侧边  
+                    
+                    for(let u=0; u<=sideCount[i]; u++){
+                        //侧边每个四方的左上右上左下右下四个点
+                        let pLT = u == 0 ? getPI(0,'top',i) : getSidePI(u-1, 'top',i)
+                        let pRT = u == sideCount[i] ? getPI(count1-1,'top',j) : getSidePI(u, 'top',i)
+                        let pLB = u == 0 ? getPI(0,'btm',i) : getSidePI(u-1, 'btm',i)
+                        let pRB = u == sideCount[i] ? getPI(count1-1,'btm',j) : getSidePI(u, 'btm',i)
+                        
+                        faceArr.push([pLT,pLB,pRB],[pLT,pRB,pRT])//外侧四方面 
+                        faceArr.push([pLT,topCenter,pRT] ,[pLB,btmCenter,pRB] )//顶部和底部到整体中心的扇形(由于点的顺序是根据和两个pano的距离,因此到中心的夹角并没按顺序排列,所以可能会重叠)
+                        
+                        if(i==0){//只需要算一次
+                            //顶部和底部中心与两个pano边构成的三角形
+                            if(u == 0){
+                                faceArr.push([pLT,getPI(count1-1,'top',i),topCenter],
+                                    [pLB,getPI(count1-1,'btm',i),btmCenter],
+                                ) 
+                            }
+                            //不能用else 因为当length==0时u==0也==sideCount[i],此时就是要两个面
+                            if(u == sideCount[i]){
+                                faceArr.push([pRT,getPI(0,'top',j),topCenter],
+                                    [pRB,getPI(0,'btm',j),btmCenter],
+                                )
+                            }
+                        }
+                        
+                    }   
+                    
+                }
+                
+            }
+            
+            
+            
+            
+            let posArr = [];
+            let faceArr = [] 
+            
+            
+            
+            //两点连线的水平向量
+            let vec = new THREE.Vector3().subVectors(pano0.position, pano1.position).setZ(0).normalize()
+             
+            /* let sideDis0 =  */addPos(pano0, vec)
+            /* let sideDis1 =  */addPos(pano1, vec.clone().negate())
+            addSide()
+            addFaces()
+           
+            //MeshDraw.updateGeometry(this.cube.geometry, posArr, faceArr)
+            let geo = MeshDraw.createGeometry(posArr, faceArr)
+            this.cube.geometry = geo
+            this.cube.scale.set(1,1,1);
+            this.cube.position.set(0,0,0)
+              
+         
+            //this.cube.scale.set(100,100,100);
+            //this.cube.position.copy(pano1.position).multiplyScalar(-100)   
+        }else{ 
+            
+            useBound(pano0.pointcloud.bound) 
+        }
+    } 
+
+
+
+    
     /* 
         注: 修改skybox,若不准的话,会遮住其他mesh,比如marker。尤其在没有深度贴图时。
         
@@ -1516,7 +1893,7 @@ export class Images360 extends THREE.EventDispatcher{
         if (!this.flying) {  
             
             console.log('bump')
-            let distance = Potree.settings.displayMode == 'showPanos' ? 0.4 : 0.2;//感觉点云模式比全景模式更明显,所以降低
+            let distance = Potree.settings.displayMode == 'showPanos' ? 0.3 : 0.2;//感觉点云模式比全景模式更明显,所以降低
             let currentPos = this.position.clone()
             let endPosition = new THREE.Vector3().addVectors(this.position, direction.clone().multiplyScalar(distance)) 
             
@@ -1672,16 +2049,16 @@ export class Images360 extends THREE.EventDispatcher{
                 } 
             } */
         ]; 
-        /* if(viewer.inputHandler.intersectPoint){//方便上楼
+        if(viewer.inputHandler.intersectPoint){//方便上, 考虑panos之间的角度差
             let pos1 = this.currentPano.floorPosition
-            let vec1 = new THREE.Vector3().sub(viewer.inputHandler.intersectPoint.location, pos1 ).normalize()//应该只有atPano时才会执行到这吧? 
+            let vec1 = new THREE.Vector3().subVectors(viewer.inputHandler.intersectPoint.location, pos1 ).normalize()//应该只有atPano时才会执行到这吧? 
             list.push(  function(pano) { 
                 var pos2 = pano.floorPosition; 
                 var vec2 = pos2.clone().sub(pos1).normalize();
-                 console.log('direction2', pano.id, vec2.dot(vec1) * directionFactor * 1  );
+                //console.log('direction2', pano.id, vec2.dot(vec1) * directionFactor * 1  );
                 return vec2.dot(vec1) * directionFactor * 1  
             })
-        } */
+        } 
          
         this.findRankedByScore(t,request,list,panoSet);
         
@@ -1737,9 +2114,9 @@ export class Images360 extends THREE.EventDispatcher{
                     ifNeighbour = false
                 }
             }else{
-                //使用点云判断
+                //使用点云判断(有深度贴图时不会执行到这)
                 ifNeighbour = !viewer.inputHandler.ifBlockedByIntersect(pano1.position, margin, true, pano0.position)
-                
+                console.log('使用点云判断')
                 if(ifNeighbour){//点云模式下未加载的点云会判断为true
                     let dir = new THREE.Vector3().subVectors(pano1.position,pano0.position).normalize()
                     let dis = pano1.position.distanceTo(pano0.position)
@@ -2352,7 +2729,12 @@ export class Images360 extends THREE.EventDispatcher{
             
             /* pano.mesh.layers.set(Potree.config.renderLayers.marker)
             pano.marker.layers.set(Potree.config.renderLayers.marker)  */
-         
+            
+            
+            pano.addEventListener('dispose',(e)=>{
+                if(this.closestPano == pano) this.closestPano = null
+            })
+            
             this.panos.push(pano);
             if(Potree.settings.editType == 'pano'){
                 Potree.settings.datasetsPanos[datasetId].panos.push(pano);
@@ -2536,7 +2918,7 @@ Images360.filters = {
 Images360.scoreFunctions = {
    direction: function(curPos, dir, ifLog) {
         return function(pano) { 
-            var pos1 = pano.floorPosition  //pano.position 改为权重放在marker上,这样对有斜坡的更准确,如上楼
+            var pos1 = /* pano.floorPosition */  pano.position         //旧:改为权重放在marker上,这样对有斜坡的更准确,如上楼, 但这样近距离的pano角度就会向下了,以致于走不到
             var n = pos1.clone().sub(curPos).normalize();
             //ifLog && console.log('direction', pano.id, n.dot(dir) * directionFactor )
             return n.dot(dir) * directionFactor  

+ 42 - 24
src/modules/Images360/Panorama.js

@@ -1,9 +1,11 @@
 import * as THREE from "../../../libs/three.js/build/three.module.js";
 import {transitions, easing, lerp} from '../../utils/transitions.js'
-import TileUtils from './tile/TileUtils'
-import { PanoRendererEvents, PanoramaEvents, PanoSizeClass} from '../../defines'
-import math from '../../utils/math' 
-import {TextSprite} from '../../objects/TextSprite'
+import TileUtils from './tile/TileUtils.js'
+import { PanoRendererEvents, PanoramaEvents, PanoSizeClass} from '../../defines.js'
+import math from '../../utils/math.js' 
+import {TextSprite} from '../../objects/TextSprite.js'
+import DepthBasicMaterial from "../../materials/DepthBasicMaterial.js";
+
 
 var texLoader = new THREE.TextureLoader()
 
@@ -18,23 +20,22 @@ const labelProp = {
 let standardMarkerMat 
 let markerTex
 let getMarerMat = function(){
-    if(!standardMarkerMat) {
+    if(!markerTex) {
         markerTex = {
             default:texLoader.load( Potree.resourcePath+'/textures/marker.png' ),
             ring:texLoader.load( Potree.resourcePath+'/textures/marker2.png' )
         }
         markerTex.default.anisotropy = 4 // 各向异性过滤 .防止倾斜模糊
-        markerTex.ring.anisotropy = 4 
-        standardMarkerMat = new THREE.MeshBasicMaterial({opacity:0.7, side: THREE.DoubleSide , map:markerTex.default ,transparent:true, 
-            depthTest: Potree.settings.hasDepthTex ? true : false
-            
-        })
-        //有可能被点云遮住吗。
-        
-        
-        //等深度图出来后,改为depthTest:true, 这样两种模式都可以看到遮挡
+        markerTex.ring.anisotropy = 4  
+        //有可能被点云遮住吗。 
+     
     }
-    return standardMarkerMat.clone()
+    return  new DepthBasicMaterial({opacity:0.7, side: THREE.DoubleSide , map:markerTex.default ,transparent:true, 
+        clipDistance: 2,  occlusionDistance:1,  //不能设置太短,因为过渡时深度不准确
+        //depthTest: !!Potree.settings.hasDepthTex,
+        useDepth:  !!Potree.settings.hasDepthTex
+        //改为DepthBasicMaterial是因为原Basic的材质过渡时会先隐藏后出现
+    })    
 }
 //显示全景图时marker没有被遮挡,如果需要,要换成depthBasicMaterial  或者直接把skybox的深度修改(拿到深度贴图后更如此)
 let planeGeo = new THREE.PlaneBufferGeometry(0.2,0.2);
@@ -229,9 +230,10 @@ class Panorama extends THREE.EventDispatcher{
 
  
     loadDepthImg(){ 
-        if(this.depthTex || this.depthTexLoading || !Potree.settings.hasDepthTex)return
+        if(!this.pointcloud.hasDepthTex || this.depthTex || this.depthTexLoading)return
         this.depthTexLoading = true
-        let src = `${Potree.scriptPath}/data/${Potree.settings.number}/depthMap/${this.originID}.png`
+        let src = Potree.settings.number == 'SS-t-7DUfWAUZ3V' ?  `${Potree.scriptPath}/data/${Potree.settings.number}/depthMap/${this.originID}.png`
+                : `https://laser-oss.4dkankan.com/testdata/${Potree.settings.number}/data/${Potree.settings.number}/depthmap/${this.originID}.png`
         let texture = texLoader.load( src, ()=>{
             this.depthTex = texture
             this.images360.dispatchEvent({type:'loadedDepthImg', pano:this})
@@ -276,7 +278,7 @@ class Panorama extends THREE.EventDispatcher{
             this.panoMatrix = new THREE.Matrix4().makeRotationFromQuaternion(this.quaternion) 
             this.oriPanoMatrix = this.panoMatrix.clone()
             
-            this.oriPanoMatrix2 = new THREE.Matrix4().makeRotationFromQuaternion(this.quaternion2) 
+            if(this.quaternion2)this.oriPanoMatrix2 = new THREE.Matrix4().makeRotationFromQuaternion(this.quaternion2) 
         
             
             //console.log(this.quaternion)
@@ -333,9 +335,11 @@ class Panorama extends THREE.EventDispatcher{
         this.setPosition(position, floorPosition) 
         this.panoMatrix = new THREE.Matrix4().multiplyMatrices(this.pointcloud.rotateMatrix, this.oriPanoMatrix  ) 
         //this.panoMatrix2 =  Potree.Utils.datasetRotTransform({fromDataset:true, pointcloud:this.pointcloud,  matrix:this.oriPanoMatrix, getMatrix:true}) //和上一行结果一样
-        //quaternion也变下 
-        this.panoMatrix2 = new THREE.Matrix4().multiplyMatrices(this.pointcloud.rotateMatrix, this.oriPanoMatrix2  )//供DepthImageSampler使用 
-        this.panoMatrix2Inverse = this.panoMatrix2.clone().invert();     
+        //quaternion也变下
+        if(this.oriPanoMatrix2){ 
+            this.panoMatrix2 = new THREE.Matrix4().multiplyMatrices(this.pointcloud.rotateMatrix, this.oriPanoMatrix2  )//供DepthImageSampler使用 
+            this.panoMatrix2Inverse = this.panoMatrix2.clone().invert(); 
+        }        
         this.dispatchEvent('rePos')
     }
     
@@ -344,14 +348,14 @@ class Panorama extends THREE.EventDispatcher{
         this.floorPosition = floorPosition
         //this.mesh.position.copy(this.position)
         this.marker.position.copy(this.floorPosition) 
-        this.marker.position.z+=0.1//会被点云遮住
+        this.marker.position.z+=0.04//会被点云遮住
         if(this.label){ 
             if(Potree.settings.editType == 'pano'){
                 this.label.position.copy(this.position)
             }else{
                 this.label.position.copy(this.floorPosition)
             } 
-            this.label.position.z+=0.2
+            this.label.position.z+=0.14
             this.label.update()
         }
         
@@ -571,7 +575,21 @@ class Panorama extends THREE.EventDispatcher{
         }
     }
     
-    
+    dispose(){
+        
+        let i = viewer.images360.panos.indexOf(this);
+        if(i==-1)return
+        
+        this.marker.parent.remove(this.marker)
+        
+        
+        this.removeTextLabel()
+        if(this.depthTex) this.depthTex.dispose()
+        viewer.images360.panos.splice(i,1);
+        
+        this.dispatchEvent('dispose')
+        //删除tile贴图、depthTex等以后再写
+    }
     
 };
 

+ 5 - 5
src/modules/Images360/tile/PanoRenderer.js

@@ -1,14 +1,14 @@
  
-import {PanoSizeClass, PanoRendererEvents , Vectors,SceneRendererEvents,TileDownloaderEvents, GLCubeFaces} from '../../../defines'
+import {PanoSizeClass, PanoRendererEvents , Vectors,SceneRendererEvents,TileDownloaderEvents, GLCubeFaces} from '../../../defines.js'
  
 import {Shaders} from "../../../../build/shaders/shaders.js";
-import TileTree from './TileTree'
-import TilePrioritizer from './TilePrioritizer'
+import TileTree from './TileTree.js'
+import TilePrioritizer from './TilePrioritizer.js'
 import TileUtils from './TileUtils' 
-import {settings,config} from '../../../settings'
+import {settings,config} from '../../../settings.js'
 /* import config from '../../config' */
 import * as THREE from "../../../../libs/three.js/build/three.module.js"; 
-import math from '../../../utils/math' 
+import math from '../../../utils/math.js' 
 
 function createDescriptor() {
     var e = {

+ 3 - 3
src/modules/Images360/tile/QualityManager.js

@@ -1,9 +1,9 @@
 
 import * as THREE from "../../../../libs/three.js/build/three.module.js";
  
-import browser from '../../../utils/browser' 
-import {settings,config} from '../../../settings'
-import {ModelManagerEvents,PanoSizeClass} from '../../../defines'
+import browser from '../../../utils/browser.js' 
+import {settings,config} from '../../../settings.js'
+import {ModelManagerEvents,PanoSizeClass} from '../../../defines.js'
 
 
 

+ 23 - 16
src/modules/Images360/tile/TileDownloader.js

@@ -1,14 +1,14 @@
-import {TileDownloaderEvents, DownloadStatus} from '../../../defines'
+import {TileDownloaderEvents, DownloadStatus} from '../../../defines.js'
 import * as THREE from "../../../../libs/three.js/build/three.module.js";
  
-import TilePrioritizer from './TilePrioritizer'
-import TileUtils from './TileUtils'
+import TilePrioritizer from './TilePrioritizer.js'
+import TileUtils from './TileUtils.js'
  
  
-import {settings, config} from '../../../settings' 
+import {settings, config} from '../../../settings.js' 
 import {
     http
-} from '../../../utils/request' 
+} from '../../../utils/request.js' 
 
 
 
@@ -57,13 +57,15 @@ class TileDownloader extends THREE.EventDispatcher{
     }
   
     start() { 
-        viewer.updateVisible(this,'pano', true ) 
+        this.downloadCubeTex = true 
+        //viewer.updateVisible(this,'pano', true ) 
         this.judgeStart()
     }
 
     stop() {
-        viewer.updateVisible(this,'pano', false )
-        this.judgeStart()
+        this.downloadCubeTex = false
+        //viewer.updateVisible(this,'pano', false )
+        //this.judgeStart()
     }
 
     judgeStart(){//add
@@ -88,15 +90,20 @@ class TileDownloader extends THREE.EventDispatcher{
                 .bind(this), e)
     }
 
-    update() {
-        var e = this.forceQueue.length > 0;
-        this.processQueueForDownloading(this.forceQueue);
-        if (this.processPriorityQueue) {
-            this.queuePrioritizedTilesForPanos(this.panos);
-            this.priorityQueue.length > 0 && (e = !0);
-            this.processQueueForDownloading(this.priorityQueue);
+    update() { 
+        if(this.downloadCubeTex){ //可以下载贴图
+            var e = this.forceQueue.length > 0;
+            this.processQueueForDownloading(this.forceQueue);
+            if (this.processPriorityQueue) {
+                this.queuePrioritizedTilesForPanos(this.panos);
+                this.priorityQueue.length > 0 && (e = !0);
+                this.processQueueForDownloading(this.priorityQueue);
+            }
+            return e 
+        }else{//仅下载depthTex
+            this.tilePrioritizer.filterDepthTex(this.panos)
         }
-        return e
+        
     }
 
     

+ 19 - 7
src/modules/Images360/tile/TilePrioritizer.js

@@ -1,10 +1,10 @@
  
-import {DownloadStatus} from '../../../defines'
-import {Images360} from '../Images360'
-import TileUtils from './TileUtils'
-import cameraLight from '../../../utils/cameraLight'
-import math from '../../../utils/math'
-import Common from '../../../utils/Common' 
+import {DownloadStatus} from '../../../defines.js'
+import {Images360} from '../Images360.js'
+import TileUtils from './TileUtils.js'
+import cameraLight from '../../../utils/cameraLight.js'
+import math from '../../../utils/math.js'
+import Common from '../../../utils/Common.js' 
 import * as THREE from "../../../../libs/three.js/build/three.module.js";
 
 
@@ -202,6 +202,18 @@ TilePrioritizer.insertSortedPanoTile = function (e, t, pano, dir) {
 };
 
 
+
+TilePrioritizer.prototype.filterDepthTex = function (panos ) {//仅下载depthTex
+    let cameraDirLocals = this.priorityCriteria.cameraDirs.vectorForward
+    let t = [] 
+    //获得视野范围内的邻近点位序列t
+    this.populateScoredPanos(this.priorityCriteria.pano, panos, t, cameraDirLocals , TilePrioritizer.MAX_SCORED_PANOS_TOCONSIDER);
+    
+    t.forEach(p=>p.loadDepthImg()) 
+}
+
+
+
 TilePrioritizer.prototype.filterAndPrioritize = function () {//挑选出优先加载的 pano和tile (有点复杂,没看很懂)
     var e = [],
         t = [],
@@ -225,7 +237,7 @@ TilePrioritizer.prototype.filterAndPrioritize = function () {//挑选出优先
         //获得视野范围内的邻近点位序列t
         this.populateScoredPanos(this.priorityCriteria.pano, panos, t, cameraDirLocals , TilePrioritizer.MAX_SCORED_PANOS_TOCONSIDER);
         
-        t.forEach(p=>p.loadDepthImg())
+        t.forEach(p=>p.loadDepthImg()) //add
         
         var s = this.baseSize //512
             ,

+ 2 - 2
src/modules/Images360/tile/TileUtils.js

@@ -1,5 +1,5 @@
-import {GLCubeFaces} from '../../../defines'
-import MathLight from '../../../utils/MathLight'
+import {GLCubeFaces} from '../../../defines.js'
+import MathLight from '../../../utils/MathLight.js'
 import * as THREE from "../../../../libs/three.js/build/three.module.js";
 
 

+ 5 - 5
src/modules/clipModel/Clip.js

@@ -1,10 +1,10 @@
 import * as THREE from "../../../libs/three.js/build/three.module.js";
-import {BoxVolume} from '../../objects/tool/Volume'
+import {BoxVolume} from '../../objects/tool/Volume.js'
 import {  ClipTask, ClipMethod} from "../../defines.js"
-import {mapClipBox} from '../../objects/tool/mapClipBox'
-import Common from '../../utils/Common'
-import math from '../../utils/math' 
-import {Images360} from '../Images360/Images360' 
+import {mapClipBox} from '../../objects/tool/mapClipBox.js'
+import Common from '../../utils/Common.js'
+import math from '../../utils/math.js' 
+import {Images360} from '../Images360/Images360.js' 
 
 const defaultBoxWidth = 6;  //navvis:  10
                             //navvis position: si {x: 0, y: 0, z: 0}

+ 23 - 4
src/modules/datasetAlignment/Alignment.js

@@ -1,7 +1,7 @@
 
 import * as THREE from "../../../libs/three.js/build/three.module.js";
-import SplitScreen from "../../utils/SplitScreen"
-import math from "../../utils/math"
+import SplitScreen from "../../utils/SplitScreen.js"
+import math from "../../utils/math.js"
  
 
 var Alignment = {
@@ -88,14 +88,18 @@ var Alignment = {
                         
                         rotateInfo.pointclouds.forEach(cloud=>{
                             
-                            let centerNoTranfrom = Potree.Utils.datasetPosTransform({ toDataset: true, pointcloud:cloud, position: center }) //中心点在数据集中的位置
+                           /*  let centerNoTranfrom = Potree.Utils.datasetPosTransform({ toDataset: true, pointcloud:cloud, position: center }) //中心点在数据集中的位置
                             Alignment.rotate(cloud, null, diffAngle)
                              
                             let centerNow = Potree.Utils.datasetPosTransform({ fromDataset: true, pointcloud:cloud, position: centerNoTranfrom }) //中心点的现在位置
                             let shift = new THREE.Vector3().subVectors( center, centerNow); //偏移量
                             Alignment.translate(cloud,shift)   //使center还保留在原位
                             //let centerNow1 = Potree.Utils.datasetPosTransform({ fromDataset: true, pointcloud:rotateInfo.pointcloud, position: centerNoTranfrom }) //中心点的现在位置
+                                 */
+                                 
+                            Alignment.rotateAround(center, cloud, null, diffAngle)   
                                 
+                                 
                         })
                         
                         
@@ -109,6 +113,7 @@ var Alignment = {
                         rotateInfo = {
                             orientationUser : e.pointclouds[0].orientationUser,
                             vecStart : new THREE.Vector3().subVectors(e.intersectStart, center).setZ(0),
+                            //pointclouds: e.pointclouds
                             pointcloud: e.pointclouds[0]
                         }  
                     }else{ 
@@ -227,7 +232,21 @@ var Alignment = {
 
 
     },
-    rotate:function(pointcloud, deg, angle){//假设点云位移position后0,0,0就是它的中心了(根据navvis观察这样做是绕同一个点旋转的)
+    
+    
+    rotateAround(center, pointcloud, deg, angle){//绕center点转动
+        var angle = angle != void 0 ? angle : THREE.Math.degToRad(deg) 
+        let vec1 = new THREE.Vector3().subVectors(pointcloud.translateUser, center);
+        let rotMatrix = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0,0,1), angle)
+        let vec2 = vec1.clone().applyMatrix4(rotMatrix) //将到旋转中心的偏差也转动
+        let vec3 = new THREE.Vector3().subVectors(vec2,vec1); //这个就是多出来的一步translateUser
+        this.rotate(pointcloud, deg, angle) 
+        this.translate(pointcloud, vec3)
+        //绕点转动就是比普通转动多一步移动到相对center的某个位置。 1 初始点云移动到自己的position; 2 移动一个vec1  3绕原点旋转 4再移动一个原本的translateUser。 绘制出来后发现移动量就是第二步vec旋转后的偏移
+    },
+    
+    
+    rotate:function(pointcloud, deg, angle){//绕各自中心转动(各自的position)   假设点云位移position后0,0,0就是它的中心了(根据navvis观察这样做是绕同一个点旋转的)
         var angle = angle != void 0 ? angle : THREE.Math.degToRad(deg)   //正逆负顺
         pointcloud.orientationUser += angle
         Alignment.setMatrix(pointcloud)

+ 8 - 7
src/modules/panoEdit/panoEditor.js

@@ -1,12 +1,12 @@
 
 import * as THREE from "../../../libs/three.js/build/three.module.js";
  
-import math from "../../utils/math"
-import Common from '../../utils/Common'
-import {LineDraw, MeshDraw} from "../../utils/DrawUtil";
+import math from "../../utils/math.js"
+import Common from '../../utils/Common.js'
+import {LineDraw, MeshDraw} from "../../utils/DrawUtil.js";
 import {View} from "../../viewer/View.js";
 import Viewport from "../../viewer/Viewport.js";
-import Sprite from "../../objects/Sprite";
+import Sprite from "../../objects/Sprite.js";
 import {transitions, easing, lerp} from '../../utils/transitions.js'
 
 
@@ -993,7 +993,7 @@ class PanoEditor extends THREE.EventDispatcher{
                     }
                 }
                 
-                return {
+                return Object.assign({},  pano.panosData,  {
                     uuid: pano.uuid, 
                     pose:{
                         translation: dealData(pano.position.clone().negate()),
@@ -1001,8 +1001,8 @@ class PanoEditor extends THREE.EventDispatcher{
                     },
                     visibles,
                     
-                    subgroup: 0,group: 1,
-                }
+                    //subgroup: 0,group: 1, "id_view":..
+                })
             })
             
             sweepLocations[datasetId] = {sweepLocations:data}
@@ -1029,6 +1029,7 @@ class PanoEditor extends THREE.EventDispatcher{
             }
         }
         
+        console.log(sweepLocations)
         return sweepLocations
     }
 }

+ 4 - 4
src/modules/siteModel/BuildingBox.js

@@ -1,9 +1,9 @@
 
 import * as THREE from "../../../libs/three.js/build/three.module.js";
-import {ctrlPolygon} from '../../objects/tool/ctrlPolygon'
-import {LineDraw, MeshDraw } from "../../utils/DrawUtil";  
-import math  from "../../utils/math";
-import Sprite from '../../objects/Sprite'
+import {ctrlPolygon} from '../../objects/tool/ctrlPolygon.js'
+import {LineDraw, MeshDraw } from "../../utils/DrawUtil.js";  
+import math  from "../../utils/math.js";
+import Sprite from '../../objects/Sprite.js'
 /* import {config} from '../settings' */
 import searchRings from "../../utils/searchRings.js";
 import DepthBasicMaterial from "../../materials/DepthBasicMaterial.js";

+ 4 - 4
src/modules/siteModel/SiteModel.js

@@ -1,9 +1,9 @@
 import * as THREE from "../../../libs/three.js/build/three.module.js";
-import SplitScreen from "../../utils/SplitScreen"
-import {BuildingBox} from "./BuildingBox"
+import SplitScreen from "../../utils/SplitScreen.js"
+import {BuildingBox} from "./BuildingBox.js"
 import Common from "../../utils/Common.js";
-import {Images360} from '../Images360/Images360'
-import {KeyCodes} from '../../KeyCodes' 
+import {Images360} from '../Images360/Images360.js'
+import {KeyCodes} from '../../KeyCodes.js' 
 import {config } from "../../settings.js";
 import math from "../../utils/math.js";
 const minFloorHeight = 0.5

+ 21 - 9
src/navigation/FirstPersonControls.js

@@ -109,8 +109,8 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                 
                 
                 let view = this.scene.view;
-                if(Potree.settings.rotAroundPoint && e.intersectPoint &&  !viewer.images360.isAtPano()){//定点旋转:   以当前intersect的点为target旋转,不改点在屏幕中的位置
-                    let distance = camera.position.distanceTo(e.intersectPoint.location) 
+                if(Potree.settings.rotAroundPoint && this.intersectStart && !viewport.unableChangePos && !viewer.images360.isAtPano() && !this.viewer.inputHandler.pressedKeys[17]){//定点旋转:   以当前intersect的点为target旋转,不改点在屏幕中的位置
+                    let distance = camera.position.distanceTo(this.intersectStart.location)                                               //不按下ctrl的话                 
                       
                     //按照orbitControl的方式旋转:
                     let rotationSpeed = 2.5;  
@@ -122,12 +122,13 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                     //先更新一下相机:    
                     this.update() 
                     view.applyToCamera(camera)
+                    
                     //然后得到新的相机角度下,原先点在屏幕中的位置所对应的3d点现在的坐标。只需要平移一下新旧坐标差值即可。
-                    let newPointerDir = viewer.inputHandler.getMouseDirection(this.pointerStart).direction.clone().multiplyScalar(distance)
+                    let newPointerDir = viewer.inputHandler.getMouseDirection(this.intersectStart.pointer).direction.clone().multiplyScalar(distance)
                     let pivot = new THREE.Vector3().addVectors(camera.position, newPointerDir)  //新的3d点
                      
-                    let moveVec = new THREE.Vector3().subVectors(pivot, e.intersectPoint.location)
-                    
+                    let moveVec = new THREE.Vector3().subVectors(pivot, this.intersectStart.location)
+                     
                     this.translationWorldDelta.copy(moveVec.negate()) 
                     //立即更新下,防止因update和此drag频率不同而打滑。
                     this.update()
@@ -180,11 +181,12 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                     let moveVec = Utils.getOrthoCameraMoveVec(e.drag.pointerDelta, camera )//最近一次移动向量
                   
                     let pointclouds;
-                    let handleState = window.viewer.modules.Alignment.handleState
+                    let Alignment = window.viewer.modules.Alignment
+                    let handleState = Alignment.handleState
                     
                     let a = e.buttons === Buttons.LEFT && viewport.alignment && handleState && viewport.alignment[handleState] 
                     if(Potree.settings.editType == 'pano'){//右键平移视图、左键操作点云 
-                        let PanoEditor = viewer.modules.PanoEditor
+                        let PanoEditor = window.viewer.modules.PanoEditor
                              
                         if(a && PanoEditor.selectedPano){
                             if(!PanoEditor.selectedGroup || !PanoEditor.checkIfAllLinked({group:PanoEditor.selectedGroup}) ){
@@ -202,7 +204,13 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                             return PanoEditor.rotateSideCamera(e.drag.pointerDelta.x)
                         }
                     }else{ 
-                        pointclouds = a && e.drag.intersectStart.pointcloud && [e.drag.intersectStart.pointcloud]
+                        /* if(Alignment.selectedClouds && Alignment.selectedClouds.length){
+                            pointclouds = a && e.drag.intersectStart.pointclouds && Common.getMixedSet(Alignment.selectedClouds, e.drag.intersectStart.pointclouds).length && Alignment.selectedClouds
+                            
+                        }else{ */
+                            pointclouds = a && e.drag.intersectStart.pointcloud && [e.drag.intersectStart.pointcloud]
+                        //}
+                        
                     }
                       
                     if(pointclouds){
@@ -307,6 +315,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
 		let drop = e => {
             if(!this.enabled)return    
 			this.dispatchEvent({type: 'end'});
+            
 		};
 
 
@@ -418,7 +427,10 @@ export class FirstPersonControls extends THREE.EventDispatcher {
         }
         let prepareRotate = (e)=>{ 
             this.pointerDragStart = e.pointer.clone()  
-            this.pointerStart = e.intersectPoint && e.intersectPoint.location && e.intersectPoint.location.clone().project(e.dragViewport.camera) //intersect点在屏幕中的位置
+            this.intersectStart = e.intersectPoint && e.intersectPoint.location && {
+                location : e.intersectPoint.location,
+                pointer :  e.intersectPoint.location.clone().project(e.dragViewport.camera) //intersect点在屏幕中的位置
+            }
             //console.log('prepareRotate' )
         }
         let preparePan = (e)=>{//触屏的pan点云    还是会偏移

+ 10 - 9
src/navigation/InputHandler.js

@@ -714,7 +714,7 @@ export class InputHandler extends THREE.EventDispatcher {
         let intersectPoint  
         let camera = viewport.camera
         
-        if(Potree.settings.hasDepthTex && !usePointcloud && !this.isMeasuring && viewport == viewer.mainViewport && Potree.settings.displayMode == 'showPanos'){
+        if(Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.pointcloud.hasDepthTex && !usePointcloud && !this.isMeasuring && viewport == viewer.mainViewport ){
             let raycaster 
             /* if(prop.point){
                 raycaster = new THREE.Raycaster() 
@@ -731,16 +731,15 @@ export class InputHandler extends THREE.EventDispatcher {
             intersectPoint = viewer.images360.depthSampler.sample(intersect, null, !!prop.point) 
              
         }else{
-            if(prop.point){
-                /* oldView = viewport.view.clone()
-                viewport.view.position.copy(raycaster.ray.origin)
-                viewport.view. */
+            if(prop.point){ 
                 prop.cameraPos && camera.position.copy(prop.cameraPos)
                 camera.lookAt(prop.point)
                 camera.updateMatrixWorld()
+                prop.pointer = this.pointer.clone()
+                prop.mouse = this.mouse.clone()
                 this.pointer.set(0,0)   //画布中心
                 this.mouse.set(Math.round(viewport.resolution.x/2), Math.round(viewport.resolution.y/2))
-            }
+            } 
                 
             intersectPoint = (viewport.noPointcloud || dontIntersectPointcloud)? null : Utils.getMousePointCloudIntersection(
                 viewport,
@@ -755,8 +754,9 @@ export class InputHandler extends THREE.EventDispatcher {
             //恢复
             if(prop.point){
                 viewport.view.applyToCamera(camera)
-                camera.updateMatrixWorld()
-            }
+                this.pointer.copy(prop.pointer)
+                this.mouse.copy(prop.mouse)
+            } 
         }
         
         
@@ -834,6 +834,7 @@ export class InputHandler extends THREE.EventDispatcher {
             let dontIntersectPointcloud =  this.drag && viewport.alignment && Potree.settings.editType == 'pano' || viewer.images360.flying // flying 时可能卡顿
             //console.log('dontIntersectPointcloud',dontIntersectPointcloud)
             intersectPoint = this.getIntersect(viewport,  e.onlyGetIntersect, e.pickWindowSize, dontIntersectPointcloud, e.whichPointcloud) //数据集多的时候卡顿
+            //console.log('intersectPoint', intersectPoint)
         } 
         
         if(e.onlyGetIntersect){ 
@@ -1188,7 +1189,7 @@ export class InputHandler extends THREE.EventDispatcher {
             intersections = intersections.filter(e=>{
                 let material = e.object.material
                 
-                return (material.depthTest == false || material.depthWrite == false) && !material.depthTestWhenPick
+                return (material.depthTest == false || material.depthWrite == false) && !material.useDepth  //!material.depthTestWhenPick
                  || e.distance < this.intersectPoint.distance
             }) 
         }

+ 1 - 1
src/objects/Axis.js

@@ -1,7 +1,7 @@
 
 
 import * as THREE from "../../libs/three.js/build/three.module.js"; 
-import {MeshDraw,LineDraw} from '../utils/DrawUtil'
+import {MeshDraw,LineDraw} from '../utils/DrawUtil.js'
  
 /*  
 

+ 3 - 3
src/objects/Magnifier.js

@@ -1,8 +1,8 @@
 
 import * as THREE from "../../libs/three.js/build/three.module.js";
-import math from '../utils/math'
-import browser from '../utils/browser'
-import Viewport from '../viewer/Viewport'
+import math from '../utils/math.js'
+import browser from '../utils/browser.js'
+import Viewport from '../viewer/Viewport.js'
  
 const texLoader = new THREE.TextureLoader() 
 const circleGeo = new THREE.CircleGeometry(1.45,100);

+ 1 - 1
src/objects/TextSprite.js

@@ -5,7 +5,7 @@
 //  */
 
 import * as THREE from "../../libs/three.js/build/three.module.js";
-import Sprite from './Sprite' 
+import Sprite from './Sprite.js' 
 
 
 //可能还是要用html写,因为要加按钮和图片

+ 4 - 4
src/objects/tool/CurveCtrl.js

@@ -2,10 +2,10 @@
 
  
 import * as THREE from "../../../libs/three.js/build/three.module.js";
-import {LineDraw} from "../../utils/DrawUtil";
-import math  from "../../utils/math";
-import HandleSvg from  "./HandleSvg";
-import HandleSprite from  "./HandleSprite";
+import {LineDraw} from "../../utils/DrawUtil.js";
+import math  from "../../utils/math.js";
+import HandleSvg from  "./HandleSvg.js";
+import HandleSprite from  "./HandleSprite.js";
 
 const sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(0.08,0.08,3,2), new THREE.MeshBasicMaterial({color:'#f88'}))
 

+ 1 - 1
src/objects/tool/HandleSprite.js

@@ -1,5 +1,5 @@
 import * as THREE from "../../../libs/three.js/build/three.module.js";
-import Sprite from  "../Sprite";
+import Sprite from  "../Sprite.js";
 /* 
 两种拖拽方式:
 1 只依附在点云上

+ 1 - 1
src/objects/tool/HandleSvg.js

@@ -1,5 +1,5 @@
 
-import math  from "../../utils/math";
+import math  from "../../utils/math.js";
  
 import * as THREE from "../../../libs/three.js/build/three.module.js";
 

+ 4 - 4
src/objects/tool/Measure.js

@@ -3,13 +3,13 @@ import * as THREE from "../../../libs/three.js/build/three.module.js";
 import {TextSprite} from "../TextSprite.js"; 
 import {Utils} from "../../utils.js";
 import  Label  from "../Label.js";
-import {LineDraw} from "../../utils/DrawUtil";
+import {LineDraw} from "../../utils/DrawUtil.js";
 import math from "../../utils/math.js"; 
 import DepthBasicMaterial from "../../materials/DepthBasicMaterial.js";
-import Sprite from '../Sprite'
-import {config} from '../../settings'
+import Sprite from '../Sprite.js'
+import {config} from '../../settings.js'
 
-import {ctrlPolygon} from './ctrlPolygon'
+import {ctrlPolygon} from './ctrlPolygon.js'
 
  
 let texLoader = new THREE.TextureLoader()  

+ 1 - 1
src/objects/tool/MeasuringTool.js

@@ -4,7 +4,7 @@ import {Measure} from "./Measure.js";
 import {Utils} from "../../utils.js"; 
 import math from "../../utils/math.js";
 import {CameraMode} from "../../defines.js"; 
-import {TextSprite} from '../TextSprite'
+import {TextSprite} from '../TextSprite.js'
 
  
  

+ 9 - 2
src/objects/tool/TransformationTool.js

@@ -643,13 +643,20 @@ export class TransformationTool {
 				let diff = new THREE.Vector3().subVectors(iOnLine, drag.pivot);
 				let diffScale = new THREE.Vector3(...handle.alignment).multiplyScalar(diff.length() * direction * dragDirection);
 				let diffPosition = diff.clone().multiplyScalar(0.5);
-
+   
+ 
+ 
 				for (let selection of this.selection) {
-					selection.scale.add(diffScale);
+                    //xzw 改:否则不跟手
+                    let diffScale_ = diffScale.clone().divide(selection.boundingBox.getSize(new THREE.Vector3))
+					selection.scale.add(diffScale_);
+                    //selection.scale.add(diffScale);
 					selection.scale.x = Math.max(0.1, selection.scale.x);
 					selection.scale.y = Math.max(0.1, selection.scale.y);
 					selection.scale.z = Math.max(0.1, selection.scale.z);
 					selection.position.add(diffPosition);
+                    
+                    
 					selection.dispatchEvent({
 						type: "position_changed",
 						object: selection

+ 1 - 1
src/objects/tool/ctrlPolygon.js

@@ -1,5 +1,5 @@
 import * as THREE from "../../../libs/three.js/build/three.module.js";
-import {LineDraw, MeshDraw} from "../../utils/DrawUtil";
+import {LineDraw, MeshDraw} from "../../utils/DrawUtil.js";
 import math from "../../utils/math.js";
 
 

+ 5 - 5
src/objects/tool/mapClipBox.js

@@ -1,11 +1,11 @@
 
 import * as THREE from "../../../libs/three.js/build/three.module.js";
-import {ctrlPolygon} from './ctrlPolygon'
-import {LineDraw } from "../../utils/DrawUtil";
-import Sprite from '../../objects/Sprite'
-import {config} from '../../settings'
+import {ctrlPolygon} from './ctrlPolygon.js'
+import {LineDraw } from "../../utils/DrawUtil.js";
+import Sprite from '../../objects/Sprite.js'
+import {config} from '../../settings.js'
 
-import math from "../../utils/math";
+import math from "../../utils/math.js";
 let texLoader = new THREE.TextureLoader() 
 
 let color = new THREE.Color(config.clip.color)

+ 12 - 7
src/settings.js

@@ -1,5 +1,5 @@
 //xzw add  
-import browser from './utils/browser'
+import browser from './utils/browser.js'
 
 const config = {//配置参数   不可修改
     displayMode:{ 
@@ -69,6 +69,8 @@ const config = {//配置参数   不可修改
         prefix: 'https://laser-oss.4dkankan.com',//oss
         prefix2: 'https://testlaser.4dkankan.com',
         prefix3: 'https://4dkk.4dage.com',
+        prefix4: 'https://uat-laser.4dkankan.com/',//test.4dkankan
+        
     },
      
     /* transitionsTime:{
@@ -78,9 +80,9 @@ const config = {//配置参数   不可修改
         flyOut:1000,
     } */
     transitionsTime:{
-        flyMinTime : 500,  // 毫秒/米
-        flytimeDistanceMultiplier:150,
-        panoToPanoMax: 2000, 
+        flyMinTime : 500 /* * 3 */,  // 毫秒/米
+        flytimeDistanceMultiplier: 150/* * 3  */,
+        panoToPanoMax: 2000/*  * 3 */, 
         flyIn:1000,
         flyOut:1000
     }
@@ -177,7 +179,7 @@ const config = {//配置参数   不可修改
     },
     material:{//初始化
         pointSize: 0.1,  
-        realPointSize : 0.4,//实际上的ui滑动条默认大小(兼容旧的版本)
+        realPointSize : 0.1,//实际上的ui滑动条默认大小(兼容旧的版本)
         minSize: 0.1,
         maxSize: 10000,
         pointSizeType: 'ATTENUATED', //'ADAPTIVE'//'ADAPTIVE' \ FIXED //ADAPTIVE的在小房间里大小会不太匹配,但在远景似乎更好
@@ -354,7 +356,7 @@ let settings = {//设置   可修改
     number: '', //场景序号
     originDatasetId:'',//场景原本的数据集id,应该就是数据集第一个吧
     isOfficial:false,
-    webSite:'data', //不同环境对应的静态文件的地址不同
+    webSite:'testdata',//'data', //不同环境对应的静态文件的地址不同
     
     isLocal:false, //是否本地 局域网版本
     
@@ -403,10 +405,13 @@ let settings = {//设置   可修改
     urls  : $.extend({}, config.urls), 
     
     
-    //hasDepthTex: true,//SS-t-7DUfWAUZ3V  使用深度贴图,得到的intersect更准确和稳定
+    hasDepthTex: true,//使用深度贴图,但不代表一定有(得到的intersect更快速准确和稳定)   SS-t-7DUfWAUZ3V  
     
     //panoEdit:
     datasetsPanos:{}
+    
+    //mergeModel:
+    
 }
 
  

+ 29 - 9
src/start.js

@@ -1,11 +1,11 @@
 import * as THREE from "../libs/three.js/build/three.module.js";
-import {settings, config} from './settings' 
-import math from './utils/math' 
-import browser from './utils/browser' 
+import {settings, config} from './settings.js' 
+import math from './utils/math.js' 
+import browser from './utils/browser.js' 
 import './extensions/three.shim.js' 
  
 
-import {Utils} from "../src/utils.js"
+import {Utils} from "./utils.js"
  
 
 var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
@@ -17,7 +17,7 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
     }
      */ 
     Potree.settings.number = number || 't-o5YMR13'// 't-iksBApb'// 写在viewer前
-    Potree.fileServer = fileServer
+    Potree.fileServer = fileServer 
     webSite && (Potree.settings.webSite = webSite)
     
     
@@ -192,6 +192,7 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
                     let config = Potree.config.material
                     let material = pointcloud.material; 
                     
+                    pointcloud.hasDepthTex = Potree.settings.hasDepthTex && (!!dataset.has_depth  ||  Potree.settings.isLocalhost && Potree.settings.number == 'SS-t-7DUfWAUZ3V') //test   
                     material.minSize =  config.minSize
                     material.maxSize =  config.maxSize   
                     material.pointSizeType = config.pointSizeType //Potree.PointSizeType[config.pointSizeType]//Potree.PointSizeType.ADAPTIVE;//FIXED
@@ -274,6 +275,23 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
        */
         
     }
+    
+    
+    if(Potree.settings.isLocalhost){
+        let before = {}
+        viewer.inputHandler.addEventListener('keydown',e=>{ //测试的代码
+            if(e.event.key == 't'){
+                viewer.images360.cube.visible = true
+                viewer.images360.cube.material.wireframe = true
+            }else if(e.event.key == 'y'){
+                viewer.images360.cube.material.wireframe = false
+                viewer.images360.cube.visible = Potree.settings.displayMode == 'showPanos'
+            }                
+        }) 
+        
+    }  
+    
+    
 }
  
  
@@ -299,14 +317,14 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
 //=======================================================================
 
 
-var panoEditStart = function(dom, mapDom, number, fileServer, webSite){
+var panoEditStart = function(dom, number, fileServer, webSite){
     Potree.settings.editType = 'pano'
-    
+    Potree.settings.number = number 
     
     Potree.settings.unableNavigate = true
     
     
-    let viewer = new Potree.Viewer(dom , mapDom); 
+    let viewer = new Potree.Viewer(dom); 
     let Alignment = viewer.modules.Alignment
 	viewer.setEDLEnabled(false);
     viewer.setFOV(config.view.fov); 
@@ -385,7 +403,9 @@ var panoEditStart = function(dom, mapDom, number, fileServer, webSite){
        
        
         panoData.forEach((pano, index)=>{
-            let cloudPath = `${Potree.scriptPath}/data/panoEdit/uuidcloud/${pano.uuid}/cloud.js`
+            //let cloudPath = `${Potree.scriptPath}/data/panoEdit/uuidcloud/${pano.uuid}/cloud.js` 
+            let cloudPath = `https://laser-oss.4dkankan.com/testdata/${Potree.settings.number}/data/bundle_${Potree.settings.number}/building/uuidcloud/${pano.uuid}/cloud.js`
+            
             let name = datasetId + '-'+pano.uuid
             let timeStamp = 0
             pano.index = index //注意:index不等于uuid,因为有的uuid缺失。但是visibles中存的是下标! 

+ 11 - 3
src/utils/Common.js

@@ -274,10 +274,18 @@ var Common = {
            groups.push(items) 
         }
     },
-    
-     
      
-    
+    addOrRemoveDefine(material, defineName, type, value=''){ 
+        let defines = material.defines
+        if(type == 'add'){
+            if(defines[defineName] != void 0 && defines[defineName] == value)return
+            defines[defineName] = value
+        }else{
+            if(defines[defineName] != void 0)return;
+            delete defines[defineName] 
+        }
+        material.needsUpdate = true;
+    }
 }  
 
 

+ 1 - 1
src/utils/CursorDeal.js

@@ -1,5 +1,5 @@
 
-import Common from './Common' 
+import Common from './Common.js' 
 
 
 //处理cursor优先级

+ 1 - 1
src/utils/DrawUtil.js

@@ -1,7 +1,7 @@
 
  
 import * as THREE from "../../libs/three.js/build/three.module.js";
-import math from './math';
+import math from './math.js';
 import {Line2} from "../../libs/three.js/lines/Line2.js";
 import {LineGeometry} from "../../libs/three.js/lines/LineGeometry.js";
 import {LineMaterial} from "../../libs/three.js/lines/LineMaterial.js";

+ 1 - 1
src/utils/cameraLight.js

@@ -1,4 +1,4 @@
-import MathLight from './MathLight'
+import MathLight from './MathLight.js'
 
 var cameraLight = {
     clampVFOV: function(currentFov, maxHFov, width, height) {//限制currentFov, 使之造成的横向fov不大于指定值maxHFov

+ 2 - 2
src/utils/request.js

@@ -13,8 +13,8 @@
 
  
  
-import browser from "./browser"
-import { base64ToBlob } from "./file"
+import browser from "./browser.js"
+import { base64ToBlob } from "./file.js"
 //import { $alert, $confirm, $loginTips } from "@/components/shared/message"
 //import { $waiting } from "@/components/shared/loading"
 //import { checkLogin } from "@/api"

+ 1 - 1
src/utils/searchRings.js

@@ -1,5 +1,5 @@
 import * as THREE from "../../libs/three.js/build/three.module.js";
-import math from "./math";
+import math from "./math.js";
 
 var points = [];
 var lines = [];

+ 1 - 1
src/viewer/EDLRenderer.js

@@ -4,7 +4,7 @@ import {PointCloudSM} from "../utils/PointCloudSM.js";
 import {EyeDomeLightingMaterial} from "../materials/EyeDomeLightingMaterial.js";
 import {SphereVolume} from "../objects/tool/Volume.js";
 import {Utils} from "../utils.js";
-import {copyShader} from '../materials/shaders/otherShaders'
+import {copyShader} from '../materials/shaders/otherShaders.js'
 import {Features} from "../Features.js";
 
 export class EDLRenderer{//Eye-Dome Lighting 眼罩照明

+ 15 - 1
src/viewer/Scene.js

@@ -4,7 +4,7 @@ import {Annotation} from "../Annotation.js";
 import {CameraMode} from "../defines.js";
 import {View} from "./View.js";
 import {Utils} from "../utils.js"; 
-import Axis from '../objects/Axis'
+import Axis from '../objects/Axis.js'
 
 export class Scene extends THREE.EventDispatcher{
 
@@ -143,6 +143,20 @@ export class Scene extends THREE.EventDispatcher{
 		});
 	}
 
+    //add:
+    removePointCloud (pointcloud) {
+        let index = this.pointclouds.indexOf(pointcloud);
+        if(index == -1)return
+        this.pointclouds.splice(index, 1)
+        this.scenePointCloud.remove(pointcloud);
+      
+        pointcloud.panos.forEach(pano=>{ 
+            pano.dispose()  
+        })
+        
+        
+    }
+    
 	addVolume (volume) {
 		this.volumes.push(volume);
 		this.dispatchEvent({

+ 3 - 3
src/viewer/View.js

@@ -1,7 +1,7 @@
 import * as THREE from "../../libs/three.js/build/three.module.js";
 import {transitions, easing, lerp} from '../utils/transitions.js'
 import math from '../utils/math.js'
-import Common from '../utils/Common' 
+import Common from '../utils/Common.js' 
 
 let sid = 0
  
@@ -30,7 +30,7 @@ export class View extends THREE.EventDispatcher{
          
         camera.updateMatrix();
         camera.updateMatrixWorld();
-        camera.matrixWorldInverse.copy(camera.matrixWorld).invert();
+        //camera.matrixWorldInverse.copy(camera.matrixWorld).invert();
            
         
     }
@@ -104,7 +104,7 @@ export class View extends THREE.EventDispatcher{
 		
 	}
 
-	lookAt(t){
+	lookAt(t){//setPivot
 		let V;
 		if(arguments.length === 1){
 			V = new THREE.Vector3().subVectors(t, this.position);

+ 1 - 1
src/viewer/Viewport.js

@@ -2,7 +2,7 @@
 
 
 import * as THREE from "../../libs/three.js/build/three.module.js";
-import Common from '../utils/Common'
+import Common from '../utils/Common.js'
 
 export default class Viewport{
     

+ 5 - 5
src/viewer/map/MapViewer.js

@@ -1,15 +1,15 @@
 
 import * as THREE from "../../../libs/three.js/build/three.module.js";
-import {MapLayer} from './Map'
-import {FirstPersonControls} from '../../navigation/FirstPersonControls'
+import {MapLayer} from './Map.js'
+import {FirstPersonControls} from '../../navigation/FirstPersonControls.js'
 import {View} from "../View.js";
 import Viewport from "../Viewport.js"; 
 import {InputHandler} from "../../navigation/InputHandler.js";
 import {ViewerBase} from "../viewerBase.js"
 import math from "../../utils/math.js";
-//import CursorDeal from '../utils/CursorDeal' 
-import {Images360} from '../../modules/Images360/Images360'
-import Common from '../../utils/Common' 
+//import CursorDeal from '../utils/CursorDeal.js' 
+import {Images360} from '../../modules/Images360/Images360.js'
+import Common from '../../utils/Common.js' 
 import {transitions, easing, lerp} from "../../utils/transitions.js";
 import {config } from "../../settings.js";
 /* var centerCross = new THREE.Mesh(new THREE.SphereGeometry(1, 4, 4),new THREE.MeshBasicMaterial({

+ 16 - 0
src/viewer/sidebar.html

@@ -338,6 +338,22 @@ Thanks to all the companies and institutions funding Potree:
             <button name="save">保存</button> 
             
         </div>
+        
+        
+        
+        <h3 class="accordion-header ui-widget"><span>多元融合</span></h3>
+        <div id="mergeModel"  class="accordion-content ui-widget pv-menu-list">
+            <li name="laser">
+                laser<button name='operation'>添加</button>  
+            </li>
+            <li name="4dkk">
+                4dkk<button name='operation'>添加</button>  
+            </li>
+            <li name="obj">
+                obj<button name='operation'>添加</button>  
+            </li>
+        </div>
+        
 	</div>
 
 	<div>

+ 62 - 20
src/viewer/sidebar.js

@@ -48,26 +48,32 @@ export class Sidebar{
 	}
 
 	init(){
-
-		this.initAccordion();
-		this.initAppearance();
-		this.initToolbar();
-		this.initScene();
-		this.initNavigation();
-		this.initFilters();
-		this.initClippingTool();
-		this.initSettings();
-        //add
-        
-        if(Potree.settings.editType != 'pano'){
-            this.initAlignment();
-            this.initClipModel();
-            this.initSiteModel()
-            this.initParitcle()
-                
+        if(Potree.settings.editType == 'merge'){
+            this.initMergeBar() 
         }else{
-            this.initPanosEdit()
+            this.initAccordion();
+            this.initAppearance();
+            this.initToolbar();
+            this.initScene();
+            this.initNavigation();
+            this.initFilters();
+            this.initClippingTool();
+            this.initSettings();
+            
+            if(Potree.settings.editType != 'pano'){
+                this.initAlignment();
+                this.initClipModel();
+                this.initSiteModel()
+                this.initParitcle()
+                 
+            }else{
+                this.initPanosEdit()
+            }
+            
         }
+         
+        
+        
         
         
         
@@ -127,6 +133,44 @@ export class Sidebar{
         
     }
     
+    
+    initMergeBar(){//多元融合模块
+        var pannel = $('#mergeModel');
+        var buttons = pannel.find('button')
+        
+        let loading = false;
+        
+        pannel.find('li button').on('click',(e)=>{
+            if(loading)return console.log('还在加载', loading)
+            let $elem = $(e.target)
+            
+                
+            let parent = $elem.parent()
+            let name = parent.attr('name')
+            
+            if($elem.attr('name') == 'select'){ 
+                return Potree.selectModel(name)
+            }
+            
+            if($elem.text() == '添加'){ 
+                Potree.addModel(name,()=>{
+                    loading = false 
+                    $elem.text('删除')
+                })
+                loading = name
+                
+            }else{
+                Potree.removeModel(name)
+                $elem.text('添加')
+            }
+            
+            
+        })
+    }
+    
+    
+    
+    
     addAlignmentButton(pointcloud){
         var pannel = $('#alignment li[name="selectPointCloud"]>div');
         var option = $(` <input name="${pointcloud.name}" class="editCheckbox" type="checkbox" >
@@ -250,8 +294,6 @@ export class Sidebar{
     
     
     
-    
-    
 	initToolbar(){
 
 		// ANGLE

+ 77 - 49
src/viewer/viewer.js

@@ -35,10 +35,10 @@ import { ClassificationScheme } from "../materials/ClassificationScheme.js";
 import { VRButton } from '../../libs/three.js/extra/VRButton.js';
 import {transitions, easing, lerp} from '../utils/transitions.js'
 import JSON5 from "../../libs/json5-2.1.3/json5.mjs";
-import CursorDeal from '../utils/CursorDeal'
-import Common from '../utils/Common'
+import CursorDeal from '../utils/CursorDeal.js'
+import Common from '../utils/Common.js'
 
-import {Clip} from '../modules/clipModel/Clip'
+import {Clip} from '../modules/clipModel/Clip.js'
 import {Alignment} from "../modules/datasetAlignment/Alignment.js";
 import {SiteModel} from "../modules/siteModel/SiteModel.js";
 import {Images360} from "../modules/Images360/Images360.js";
@@ -51,25 +51,25 @@ import Reticule from "../objects/Reticule.js";
 import Viewport from "./Viewport.js"
 import {ViewerBase} from "./viewerBase.js"
  
-import SplitScreen from '../utils/SplitScreen'
+import SplitScreen from '../utils/SplitScreen.js'
 import cameraLight from "../utils/cameraLight.js";
 import math from "../utils/math.js";
  
-import {UoMService}  from '../utils/UnitConvert'
-import {RouteGuider}  from '../modules/route/RouteGuider'
-import ParticleEditor from '../modules/Particles/ParticleEditor'
-import CamAniEditor from '../modules/CameraAnimation/CamAniEditor'
-import {MeshDraw}  from '../utils/DrawUtil'
-import PanoEditor  from '../modules/panoEdit/panoEditor'
+import {UoMService}  from '../utils/UnitConvert.js'
+import {RouteGuider}  from '../modules/route/RouteGuider.js'
+import ParticleEditor from '../modules/Particles/ParticleEditor.js'
+import CamAniEditor from '../modules/CameraAnimation/CamAniEditor.js'
+import {MeshDraw}  from '../utils/DrawUtil.js'
+import PanoEditor  from '../modules/panoEdit/panoEditor.js'
 
 import {OBJLoader} from "../../libs/three.js/loaders/OBJLoader.js";
 import {MTLLoader} from "../../libs/three.js/loaders/MTLLoader.js";
 
-import SSAARenderPass from "../materials/postprocessing/SSAARenderPass"
-import EffectComposer from '../materials/postprocessing/EffectComposer'
-import {ShaderPass} from '../materials/postprocessing/ShaderPass'
-import RenderPass from '../materials/postprocessing/RenderPass'
-import FXAAShader from "../materials/postprocessing/FXAAShader"
+import SSAARenderPass from "../materials/postprocessing/SSAARenderPass.js"
+import EffectComposer from '../materials/postprocessing/EffectComposer.js'
+import {ShaderPass} from '../materials/postprocessing/ShaderPass.js'
+import RenderPass from '../materials/postprocessing/RenderPass.js'
+import FXAAShader from "../materials/postprocessing/FXAAShader.js"
  
 
 
@@ -85,8 +85,8 @@ export class Viewer extends ViewerBase{
         window.viewer = this
         
         
-        
-        if(Potree.settings.editType == "pano"){
+         
+        if(Potree.settings.editType == "pano" || Potree.settings.editType == "merge"){
             this.modules = { 
                 Alignment, 
                 PanoEditor,
@@ -115,6 +115,9 @@ export class Viewer extends ViewerBase{
         this.visible = true
         this.fpVisiDatasets = []
         this.atDatasets = []
+        this.objs = new THREE.Object3D
+        
+        
         //this.lastPos = new THREE.Vector3(Infinity,Infinity,Infinity) 
 		//-------------
         
@@ -185,7 +188,7 @@ export class Viewer extends ViewerBase{
                 //add
                 {
                     
-                    if(!mapArea){
+                    if(!mapArea && Potree.settings.editType != 'merge'){
                         $(domElement).append($("<div id='potree_labels'></div>"))
                         
                         mapArea = $("<div id='mapGaode'></div>")
@@ -196,7 +199,7 @@ export class Viewer extends ViewerBase{
                 }
                  
              
-                let domRoot = this.renderer.domElement.parentElement; 
+               /*  let domRoot = this.renderer.domElement.parentElement; 
                 let elAttach = $("<input type='button' value='test'></input>");
                 elAttach.css({
                     position : "absolute",
@@ -210,7 +213,7 @@ export class Viewer extends ViewerBase{
                 elAttach.on("click", () => {
                     window.buttonFunction &&  window.buttonFunction()
                 }); 
-                domRoot.appendChild(elAttach[0]);
+                domRoot.appendChild(elAttach[0]); */
                 
                     
                 
@@ -409,7 +412,7 @@ export class Viewer extends ViewerBase{
                 this.scene.scene.add(this.reticule)
                 
                 
-                if(Potree.settings.editType != "pano"){
+                if(Potree.settings.editType != "pano" && Potree.settings.editType != 'merge'){
                     this.mapViewer = new MapViewer(mapArea/* $('#mapGaode')[0] */)
                 }
                 
@@ -502,6 +505,8 @@ export class Viewer extends ViewerBase{
             CursorDeal.init(this, this.mapViewer ? [this, this.mapViewer] : [this])//ADD
             if(Potree.settings.editType == "pano"){
                 this.modules.PanoEditor.init()
+            }else if(Potree.settings.editType == "merge"){
+            
             }else{
                 this.modules.SiteModel.init()
                 this.modules.ParticleEditor.init()
@@ -511,6 +516,9 @@ export class Viewer extends ViewerBase{
             
             
             this.images360 = new Images360(this);
+            
+            this.scene.scene.add(this.objs);
+            
             //-----------
             
             
@@ -610,7 +618,7 @@ export class Viewer extends ViewerBase{
         
         
         
-        if(Potree.settings.editType != 'pano'){
+        if(Potree.settings.editType != 'pano' && Potree.settings.editType != 'merge'){
             
             
             
@@ -685,7 +693,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')this.updateFpVisiDatasets()
+                    if(Potree.settings.editType != 'pano' && Potree.settings.editType != 'merge')this.updateFpVisiDatasets()
                     this.dispatchEvent({type:'pointcloudAtChange',pointclouds:at}) 
                 }
                 force = false 
@@ -1764,7 +1772,7 @@ export class Viewer extends ViewerBase{
 
 		let viewer = this;
 		let sidebarContainer = $('#potree_sidebar_container');
-		sidebarContainer.load(new URL(Potree.scriptPath + '/sidebar.html').href, () => {
+		sidebarContainer.load(new URL(Potree.scriptPath + '/' + Potree.settings.sidebar || 'sidebar.html').href, () => {
 			sidebarContainer.css('width', '300px');
 			sidebarContainer.css('height', '100%');
 
@@ -2411,7 +2419,7 @@ export class Viewer extends ViewerBase{
         transitions.update(delta);
         this.transformationTool.update();
         
-        if(Potree.settings.editType != 'pano'){
+        if(Potree.settings.editType != 'pano' && Potree.settings.editType != 'merge'){
             this.modules.ParticleEditor.update(delta) 
             this.mapViewer.update(delta)            
         }
@@ -3869,6 +3877,14 @@ export class Viewer extends ViewerBase{
 
     updateModelBound(){
         this.bound = Utils.computePointcloudsBound(this.scene.pointclouds) 
+        if(Potree.settings.boundAddObjs){//加上obj的bound 
+            this.objs.children.forEach(e=>{ 
+                this.bound.boundingBox.union(e.boundingBox)
+            })
+            this.bound.boundingBox.getSize(this.bound.size)
+            this.bound.boundingBox.getCenter(this.bound.center)
+        }
+        
         viewer.farWhenShowPano = this.bound.boundSize.length() * 10//全景漫游时要能看到整个skybox 原本*2的但对于距离特远的数据集需要乘大一些否则会黑面
         
         
@@ -3986,12 +4002,6 @@ export class Viewer extends ViewerBase{
     
     
     
-    
-    
-    
-    
-    
-    
     //调试时显示transformControl来调节object
     transformObject(object){
         if(!object.boundingBox){
@@ -4081,9 +4091,12 @@ export class Viewer extends ViewerBase{
     
 
 
-    loadObj(fileInfo){//加水管2
+    loadObj(fileInfo, done, onProgress_){//加水管2
         let boundingBox = new THREE.Box3()
-            boundingBox.min.set(-1,-1,-1); boundingBox.max.set(1,1,1)
+        if(!Potree.settings.boundAddObjs){
+           boundingBox.min.set(-1,-1,-1); boundingBox.max.set(1,1,1) 
+        } 
+            
              
         let manager = new THREE.LoadingManager();
         /* manager.onProgress = function ( item, loaded, total ) {
@@ -4094,7 +4107,10 @@ export class Viewer extends ViewerBase{
             if ( xhr.lengthComputable ) {
                 let percentComplete = xhr.loaded / xhr.total * 100;
                 console.log( Math.round(percentComplete, 2) + '% downloaded' );
-            }
+                
+                onProgress_ && onProgress_(percentComplete)
+            } 
+            
         };
         let onError = function ( xhr ) {};
 
@@ -4108,30 +4124,37 @@ export class Viewer extends ViewerBase{
         MtlLoader.load( fileInfo.mtlurl , (materials)=>{ 
             materials.preload(); 
         
-            Objloader.setMaterials( materials ).load(fileInfo.objurl, (object)=>{ 
-         
-                object.traverse( function ( child ) {
+            Objloader.setMaterials( materials ).load(fileInfo.objurl, (object)=>{   
+            
+                object.traverse( ( child )=>{
                     if ( child instanceof THREE.Mesh ) {
+                        if(Potree.settings.boundAddObjs){
+                            child.geometry.computeBoundingBox()
+                            boundingBox.union(child.geometry.boundingBox)
+                        }
                         //child.material.map = texture;
                         child.material.roughness = 0.6 
                         child.material.metalness = 0.3 
                     }
                 } );
  
-                this.obj = object; 
-                this.scene.scene.add(object);
-                 
+               
+                object.name = fileInfo.name != void 0 ? fileInfo.name : 'obj'
+                this.objs.add(object) 
                 object.boundingBox = boundingBox
+                if(Potree.settings.boundAddObjs){
+                    this.updateModelBound()
+                }
                 object.rotation.fromArray(fileInfo.transform.rotation)
                 object.position.fromArray(fileInfo.transform.position)
                  
-                 
-                object.updateMatrix();
-                object.matrixAutoUpdate = false
-                object.matrix.premultiply(viewer.scene.pointclouds[0].transformMatrix) //默认跟随第一个数据集
-                object.matrixWorldNeedsUpdate = true 
-                
-                
+                if(fileInfo.moveWithPointcloud){
+                    object.updateMatrix();
+                    object.matrixAutoUpdate = false
+                    object.matrix.premultiply(viewer.scene.pointclouds[0].transformMatrix) //默认跟随第一个数据集
+                    object.matrixWorldNeedsUpdate = true 
+                }
+                done && done(object)
 
                 /* viewer.onGUILoaded(() => {
                     // Add entries to object list in sidebar
@@ -4149,13 +4172,18 @@ export class Viewer extends ViewerBase{
                     //tree.jstree("open_node", parentNode);
                 }); */
 
-            }, onProgress, onError );
+            } , onProgress, /*onError */ );
         });
         
          
     }
     
-    
+    removeObj(object){
+        this.objs.remove(object);
+        if(Potree.settings.boundAddObjs){
+            this.updateModelBound()
+        }
+    }
     
         
     addFire(){   

+ 1 - 1
src/viewer/viewerBase.js

@@ -1,7 +1,7 @@
 
 import * as THREE from "../../libs/three.js/build/three.module.js"; 
 
-import Common from '../utils/Common'
+import Common from '../utils/Common.js'
  
 
 export class ViewerBase extends THREE.EventDispatcher{

+ 16 - 7
改bug的历史.txt

@@ -1,7 +1,21 @@
 
 
 
+2022.7.22
 
+似乎会出 贴图碎片加载。 黑块
+
+又警告[.WebGL-000020FC00B72900] GL_INVALID_OPERATION: Must have element array buffer bound.
+
+不使用getIntersect 中改变相机的操作 就不会。  现在在hasDepthTex时还蛮流畅的
+
+但即使不改变该相机也会,所以应该是pick时render出问题。可能没还原状态。 可之前经常要用到pick
+
+即使不更改geometry,只pick,也会出现,但频率降低。  完全不使用getIntersect但过渡前摆动鼠标也会, 旧代码偶现
+
+找不到原因,暂时只能保证有深度图时不执行点云pick
+
+但没有深度图的依然存在这个问题,且过渡后会黑屏闪烁一下 
 
 2022.7.8
 
@@ -16,12 +30,7 @@
 是因为Common.intervalTool.isWaiting延时了并没有立即执行!
 
 
-
-
-
-
-
-
+ 
 
 
 
@@ -279,5 +288,5 @@ tiledownloader下载完成会触发tiledownloader开始uploadTile.
 
 
 
-
+