xzw 1 gadu atpakaļ
vecāks
revīzija
1785ad0e54

+ 3 - 1
libs/gaussian/gaussian-splats-3d.module.js

@@ -11787,5 +11787,7 @@ class DropInViewer extends THREE.Group {
 
 
 }
 }
 
 
-export { AbortablePromise, CompressedPlyParser, DropInViewer, KSplatLoader, Utils as LoaderUtils, LogLevel, OrbitControls, PlyLoader, PlyParser, RenderMode, SceneFormat, SceneRevealMode, SplatBuffer, SplatBufferGenerator, SplatLoader, SplatParser, SplatPartitioner, Viewer, WebXRMode };
+export { AbortablePromise, CompressedPlyParser, DropInViewer, KSplatLoader, Utils as LoaderUtils, LogLevel, OrbitControls, PlyLoader, PlyParser, RenderMode, SceneFormat, SceneRevealMode, SplatBuffer, SplatBufferGenerator, SplatLoader, SplatParser, SplatPartitioner, Viewer, WebXRMode
+    ,Raycaster //add
+ };
 //# sourceMappingURL=gaussian-splats-3d.module.js.map
 //# sourceMappingURL=gaussian-splats-3d.module.js.map

+ 3 - 3
libs/three.js/3dtiles/three-loader-3dtiles.esm.js

@@ -9,7 +9,7 @@ import MeshBasicMaterial  from '../../../src/custom/materials/BasicMaterial.js'
 let globalThis = window //add 有的app没有globalThis. 2023.1
 let globalThis = window //add 有的app没有globalThis. 2023.1
 
 
 let rtcCenterGlobal = false//默认false,也就是scale.z要乘以-1
 let rtcCenterGlobal = false//默认false,也就是scale.z要乘以-1
-
+ 
 
 
 /*! *****************************************************************************
 /*! *****************************************************************************
 
 
@@ -9649,9 +9649,9 @@ class TileHeader {
 
 
   _updateBoundingVolume(header) {
   _updateBoundingVolume(header) {
     let computedTransform  
     let computedTransform  
-    if(header.id == 'root_0' || !header.id){
+    /* if(header.id == 'root_0' || !header.id){
         console.log('root_0')  
         console.log('root_0')  
-    }  
+    }  */ 
     if(!this.tileset.lastRootTransform){//没事过后会因_updateTransform重算
     if(!this.tileset.lastRootTransform){//没事过后会因_updateTransform重算
         computedTransform = new Matrix4(this.tileset.modelMatrix).multiplyRight(this.computedTransform);  //add
         computedTransform = new Matrix4(this.tileset.modelMatrix).multiplyRight(this.computedTransform);  //add
     }else{
     }else{

+ 20 - 15
libs/three.js/loaders/GLTFLoader.js

@@ -739,7 +739,7 @@ class GLTFMaterialsEmissiveStrengthExtension {
 	extendMaterialParams( materialIndex, materialParams ) {
 	extendMaterialParams( materialIndex, materialParams ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials; //xzw change
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0]; //xzw change
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 
 
@@ -778,7 +778,7 @@ class GLTFMaterialsClearcoatExtension {
 	getMaterialType( materialIndex ) {
 	getMaterialType( materialIndex ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials;
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 
 
@@ -789,7 +789,7 @@ class GLTFMaterialsClearcoatExtension {
 	extendMaterialParams( materialIndex, materialParams ) {
 	extendMaterialParams( materialIndex, materialParams ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ]; //曾因这里报错加了一句  || parser.json.materials; 但是加载的图会先变白
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0]; //曾因这里报错加了一句  || parser.json.materials; 但是加载的图会先变白
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 
 
@@ -862,7 +862,7 @@ class GLTFMaterialsIridescenceExtension {
 	getMaterialType( materialIndex ) {
 	getMaterialType( materialIndex ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];;
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 
 
@@ -873,7 +873,7 @@ class GLTFMaterialsIridescenceExtension {
 	extendMaterialParams( materialIndex, materialParams ) {
 	extendMaterialParams( materialIndex, materialParams ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 
 
@@ -950,7 +950,7 @@ class GLTFMaterialsSheenExtension {
 	getMaterialType( materialIndex ) {
 	getMaterialType( materialIndex ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];;
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 
 
@@ -961,7 +961,7 @@ class GLTFMaterialsSheenExtension {
 	extendMaterialParams( materialIndex, materialParams ) {
 	extendMaterialParams( materialIndex, materialParams ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];;
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 
 
@@ -1025,7 +1025,7 @@ class GLTFMaterialsTransmissionExtension {
 	getMaterialType( materialIndex ) {
 	getMaterialType( materialIndex ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];;
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 
 
@@ -1036,7 +1036,7 @@ class GLTFMaterialsTransmissionExtension {
 	extendMaterialParams( materialIndex, materialParams ) {
 	extendMaterialParams( materialIndex, materialParams ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];;
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 
 
@@ -1083,7 +1083,7 @@ class GLTFMaterialsVolumeExtension {
 	getMaterialType( materialIndex ) {
 	getMaterialType( materialIndex ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];;
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 
 
@@ -1142,7 +1142,7 @@ class GLTFMaterialsIorExtension {
 	getMaterialType( materialIndex ) {
 	getMaterialType( materialIndex ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];;
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 
 
@@ -1188,7 +1188,7 @@ class GLTFMaterialsSpecularExtension {
 	getMaterialType( materialIndex ) {
 	getMaterialType( materialIndex ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];;
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
 
 
@@ -1199,7 +1199,7 @@ class GLTFMaterialsSpecularExtension {
 	extendMaterialParams( materialIndex, materialParams ) {
 	extendMaterialParams( materialIndex, materialParams ) {
 
 
 		const parser = this.parser;
 		const parser = this.parser;
-		const materialDef = parser.json.materials[ materialIndex ];
+		const materialDef = parser.json.materials[ materialIndex ] || parser.json.materials[0];;
 
 
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 		if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
 
 
@@ -3554,11 +3554,16 @@ class GLTFParser {
 		const parser = this;
 		const parser = this;
 		const json = this.json;
 		const json = this.json;
 		const extensions = this.extensions;
 		const extensions = this.extensions;
-		const materialDef = json.materials[ materialIndex ];
+		let materialDef = json.materials[ materialIndex ];
+
+        if(!materialDef){
+            console.error('gltf材质数据有问题, 可能引起一些列错误')  //add
+            materialDef = json.materials[0] || {}
+        }
 
 
 		let materialType;
 		let materialType;
 		const materialParams = {};
 		const materialParams = {};
-		const materialExtensions = materialDef.extensions || {};
+		const materialExtensions = materialDef.extensions || {}; 
 
 
 		const pending = [];
 		const pending = [];
 
 

+ 4 - 4
src/ExtendPointCloudOctree.js

@@ -81,7 +81,7 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
             this.nodeMaxLevel = level 
             this.nodeMaxLevel = level 
             //viewer.dispatchEvent({type:'updateNodeMaxLevel', pointcloud: this, nodeMaxLevel:level}) 
             //viewer.dispatchEvent({type:'updateNodeMaxLevel', pointcloud: this, nodeMaxLevel:level}) 
              
              
-             console.log('updateNodeMaxLevel ' + this.dataset_id + " : "+ this.nodeMaxLevel)                
+            Potree.settings.isOfficial || console.log('updateNodeMaxLevel ' + this.dataset_id + " : "+ this.nodeMaxLevel)                
               
               
             setTimeout(()=>{
             setTimeout(()=>{
                this.setPointLevel()//重新计算    延迟是因为testNodeMax会变回旧的
                this.setPointLevel()//重新计算    延迟是因为testNodeMax会变回旧的
@@ -593,11 +593,11 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
                     this.temp.sizeFitToLevel[str] = size
                     this.temp.sizeFitToLevel[str] = size
                 }
                 }
             }else{ 
             }else{ 
-            
-                /* let base = 0.007; */ let base = this.material.spacing / Math.pow(2,  nodeMaxLevel) //点云大小在level为0时设置为spacing,每长一级,大小就除以2
+                let base = 0.015 
+                //let base = this.material.spacing / Math.pow(2,  nodeMaxLevel) //在保证最高级别大小刚好的情况下,不改变level降低后的大小
                 //base的数值理论上应该是右侧算出来的,但发现有的场景nodeMaxLevel和nodeMaxLevelPredict差别较大的点云显示也过大,而直接换成固定值反而可以适应所有场景。该固定值来源于 getHighestNodeSpacing 最小值,修改了下。(会不会是我们的相机其实该值是固定的,根据该值算出的spacing才是有误差的? 如果换了相机是否要改值?)
                 //base的数值理论上应该是右侧算出来的,但发现有的场景nodeMaxLevel和nodeMaxLevelPredict差别较大的点云显示也过大,而直接换成固定值反而可以适应所有场景。该固定值来源于 getHighestNodeSpacing 最小值,修改了下。(会不会是我们的相机其实该值是固定的,根据该值算出的spacing才是有误差的? 如果换了相机是否要改值?)
                 //2022-12-21又换回非固定值。因为有的场景如SS-t-t01myDqnfE的两个数据集密集程度差别很大,应该将稀疏点云的大小设置的大些。 但是这样的缺点是两个数据集因相接处有大有小无法融合。
                 //2022-12-21又换回非固定值。因为有的场景如SS-t-t01myDqnfE的两个数据集密集程度差别很大,应该将稀疏点云的大小设置的大些。 但是这样的缺点是两个数据集因相接处有大有小无法融合。
-                size = base * 20 * num_ /* * window.devicePixelRatio  */
+                size = base * 20 * num_ 
             } 
             } 
             
             
         }  
         }  

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 69 - 6
src/Potree.js


+ 2 - 2
src/PotreeRendererNew.js

@@ -725,7 +725,7 @@ export class Renderer {
 
 
 
 
 	renderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params) {
 	renderNodes(octree, nodes, visibilityTextureData, camera, target, shader, params) {
-
+ 
 		viewer.addTimeMark('renderNodes','start')
 		viewer.addTimeMark('renderNodes','start')
 
 
 		let gl = this.gl;
 		let gl = this.gl;
@@ -1198,7 +1198,7 @@ export class Renderer {
 
 
 	renderOctree(octrees, nodes, camera, target, params = {}){
 	renderOctree(octrees, nodes, camera, target, params = {}){
         viewer.addTimeMark('renderOctree','start') 
         viewer.addTimeMark('renderOctree','start') 
-       
+
         let octree
         let octree
         if(octrees instanceof Array){
         if(octrees instanceof Array){
             octree = octrees[0];
             octree = octrees[0];

+ 7 - 4
src/custom/mergeStartTest.js

@@ -213,7 +213,7 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
                         
                         
                     Potree.loadPanos(dataset.id, (data) => { 
                     Potree.loadPanos(dataset.id, (data) => { 
                         //console.log('loadPanos',dataset.sceneCode, dataset.id, data)
                         //console.log('loadPanos',dataset.sceneCode, dataset.id, data)
-                        viewer.images360.addPanoData(data, dataset.id )
+                        viewer.images360.addPanoData(data, pointcloud )
                         panosLoaded ++; 
                         panosLoaded ++; 
                         if(panosLoaded == datasetLength){
                         if(panosLoaded == datasetLength){
                             panosLoadDone() 
                             panosLoadDone() 
@@ -323,6 +323,8 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
              
              
          
          
     let tilesetUrls = [   
     let tilesetUrls = [   
+    
+    
         'https://4dkk.4dage.com/scene_view_data/SG-t-Wm2b883yI4z/images/3dtiles/tileset.json',
         'https://4dkk.4dage.com/scene_view_data/SG-t-Wm2b883yI4z/images/3dtiles/tileset.json',
     
     
     
     
@@ -510,11 +512,12 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
                 },callback,onprogress)  */  
                 },callback,onprogress)  */  
                      
                      
                 //var path = `${Potree.resourcePath}/models/obj/28M/`
                 //var path = `${Potree.resourcePath}/models/obj/28M/`
-                var path = `${Potree.resourcePath}/models/obj/`
+                var path = `${Potree.resourcePath}/models/obj/monitor_12M/`
+                
                 viewer.loadModel({
                 viewer.loadModel({
                     name, 
                     name, 
-                    objurl: path+ 'chuizi.obj' /* 'GW1H.obj' */,  //解析时间4.392s
-                    //mtlurl: path+'GW1H.mtl',    
+                    objurl: path+ 'archmodels95_043.obj', //chuizi.obj' /* 'GW1H.obj' */,  //解析时间4.392s
+                    mtlurl: path+ 'archmodels95_043.mtl',    
                     transform : { 
                     transform : { 
                         rotation : [0,  0,   0],
                         rotation : [0,  0,   0],
                         position : [0,0,0]  
                         position : [0,0,0]  

+ 3 - 2
src/custom/modules/mergeModel/MergeEditor.js

@@ -528,7 +528,7 @@ let MergeEditor = {
      
      
     
     
     showModelOutline(model, state){ 
     showModelOutline(model, state){ 
-        if(Potree.settings.mergeType2){//高斯很卡
+        if(Potree.settings.mergeType2 || model ? model.fileType == '3dgs' : this.boxHelper.visible  ){//高斯很卡
             if(state !== false ){
             if(state !== false ){
                 this.updateBoxHelper(model) 
                 this.updateBoxHelper(model) 
                 Potree.Utils.updateVisible(this.boxHelper,'unselect',true)
                 Potree.Utils.updateVisible(this.boxHelper,'unselect',true)
@@ -789,6 +789,7 @@ let MergeEditor = {
 
 
         
         
         viewer.objs.children.forEach(e=>{
         viewer.objs.children.forEach(e=>{
+            if(!e.visible)return
             if(e.fileType == 'glb' || e.fileType == 'obj'){
             if(e.fileType == 'glb' || e.fileType == 'obj'){
                 e.traverse((mesh)=>{
                 e.traverse((mesh)=>{
                     if(mesh.geometry){
                     if(mesh.geometry){
@@ -810,7 +811,7 @@ let MergeEditor = {
         /* let min = 0.1, max = 6, minP = 100, maxP = 1000000; 
         /* let min = 0.1, max = 6, minP = 100, maxP = 1000000; 
         let ratio = Math.round(math.linearClamp(score, minP, maxP, max, min ));  */
         let ratio = Math.round(math.linearClamp(score, minP, maxP, max, min ));  */
 	    let rest = maxMemory - objWeight - tiles3DWeight         
 	    let rest = maxMemory - objWeight - tiles3DWeight         
-        Potree.pointBudget = Math.max(30000, Math.round(rest/eachVisiCPointWeight)) 
+        Potree.pointBudget = THREE.Math.clamp(Math.round(rest/eachVisiCPointWeight), Potree.config.pointDensity.low.pointBudget,   1.5*Potree.config.pointDensity.high.pointBudget) 
         
         
         //获取3dTiles的内存限制 
         //获取3dTiles的内存限制 
         let tiles3DMaxMemory = maxMemory - Math.round(objWeight + laserWeight)
         let tiles3DMaxMemory = maxMemory - Math.round(objWeight + laserWeight)

+ 5 - 7
src/custom/modules/panos/DepthImageSampler.js

@@ -45,14 +45,14 @@ class DepthImageSampler extends THREE.EventDispatcher{
             return
             return
         }
         }
         Potree.timeCollect.depthSamChangeImg.start = true  //不过在刚启动时得到的用时较大
         Potree.timeCollect.depthSamChangeImg.start = true  //不过在刚启动时得到的用时较大
-        try{
-            viewer.addTimeMark('depthSamChangeImg','start')
+        try{ 
+            viewer.addTimeMark('depthSamChangeImg','start') 
             this.canvas.width = img.width 
             this.canvas.width = img.width 
             this.canvas.height = img.height 
             this.canvas.height = img.height 
             this.context.drawImage(img, 0, 0) 
             this.context.drawImage(img, 0, 0) 
             let o = this.context.getImageData(0, 0, img.width , img.height )
             let o = this.context.getImageData(0, 0, img.width , img.height )
             let data = o && o.data;     //getImageData 1px时 : pc chrome 耗时0.01毫秒左右(排除第一次的50) , 但firefox: 4。但换贴图之后就多达5甚至几十  
             let data = o && o.data;     //getImageData 1px时 : pc chrome 耗时0.01毫秒左右(排除第一次的50) , 但firefox: 4。但换贴图之后就多达5甚至几十  
-            //console.log('changeImg',pano.id ) 
+            //console.log('changeImg', pano.id, !!data ) 
             //this.img = img
             //this.img = img
             if(!data){
             if(!data){
                 console.error('getImageData 得不到?!why!')
                 console.error('getImageData 得不到?!why!')
@@ -65,12 +65,10 @@ class DepthImageSampler extends THREE.EventDispatcher{
                 this.imgDatas.splice(this.imgDatas.indexOf(old), 1)//推出使用时间最早的一个非nearPano
                 this.imgDatas.splice(this.imgDatas.indexOf(old), 1)//推出使用时间最早的一个非nearPano
             } 
             } 
             this.imgDatas.push({pano, data})
             this.imgDatas.push({pano, data})
-            
-            
-            
+             
             this.dispatchEvent({type:'changeImg',pano})
             this.dispatchEvent({type:'changeImg',pano})
             viewer.addTimeMark('depthSamChangeImg','end') //耗时chrome 25ms,firefox: 38ms, iphoneX:33ms
             viewer.addTimeMark('depthSamChangeImg','end') //耗时chrome 25ms,firefox: 38ms, iphoneX:33ms
-            
+          
         }catch(e){
         }catch(e){
             console.error(e ) //内存不足  Failed to execute 'getImageData' on 'CanvasRenderingContext2D': Out of memory at ImageData creation
             console.error(e ) //内存不足  Failed to execute 'getImageData' on 'CanvasRenderingContext2D': Out of memory at ImageData creation
             return false
             return false

+ 55 - 25
src/custom/modules/panos/Images360.js

@@ -77,10 +77,26 @@ export class Images360 extends THREE.EventDispatcher{
             viewer.scene.scene.add(this.cube)
             viewer.scene.scene.add(this.cube)
             
             
             
             
-            if(Potree.settings.mergeType2){
+            if(Potree.settings.mergeType2 && Potree.settings.modelSkybox){
                 this.materialInside = new ModelTextureMaterial( )
                 this.materialInside = new ModelTextureMaterial( )
                 this.materialInside.dontChangeDepth = true //chunk本身深度是对的,不用深度图,否则过渡会有很多裂痕
                 this.materialInside.dontChangeDepth = true //chunk本身深度是对的,不用深度图,否则过渡会有很多裂痕
                 this.cube.material.defines.depth_background = '' //skybox的深度改得向后一些, 避免盖住chunk,造成坑坑洼洼
                 this.cube.material.defines.depth_background = '' //skybox的深度改得向后一些, 避免盖住chunk,造成坑坑洼洼
+            
+                this.addEventListener('endChangeMode',(e)=>{ 
+                    if( this.currentPano?.pointcloud?.is4dkkModel){
+                        let model = this.currentPano.pointcloud
+                        if(model.fileType == '3dTiles'){ 
+                            viewer.setAllTilesets(model, (child)=>{
+                                child.runtime.limit2lowestDepth(e.mode == 'showPanos')
+                                child.runtime.getTileset().tiles.forEach(e=>{ 
+                                    this.judgeModelMat(e.tileContent)  
+                                }) 
+                            }) 
+                        }else{
+                            this.judgeModelMat(model)
+                        }
+                    }
+                }) 
             }
             }
         }
         }
         if(Potree.settings.testCube){
         if(Potree.settings.testCube){
@@ -162,8 +178,9 @@ export class Images360 extends THREE.EventDispatcher{
             if(e.clickElement ||
             if(e.clickElement ||
                 Potree.settings.unableNavigate || this.flying  || !e.isTouch && e.button != THREE.MOUSE.LEFT || e.drag &&  e.drag.object //拖拽结束时不算
                 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 == '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
-                || Potree.settings.mergeType2 && Potree.settings.displayMode == 'showPointCloud'
+               //||   Potree.settings.editType == 'merge' && !e.intersectPoint || viewer.inputHandler.hoveredElements[0] && viewer.inputHandler.hoveredElements[0].isModel && e.intersectPoint.distance > viewer.inputHandler.hoveredElements[0].distance
+               || Potree.settings.editType == 'merge' && !Potree.settings.mergeType2
+               || Potree.settings.mergeType2 && Potree.settings.displayMode == 'showPointCloud'
             )  return 
             )  return 
              
              
             if(Potree.settings.editType != 'pano' && Potree.settings.editType != 'merge'){
             if(Potree.settings.editType != 'pano' && Potree.settings.editType != 'merge'){
@@ -325,10 +342,19 @@ export class Images360 extends THREE.EventDispatcher{
                                     Potree.settings.displayMode = mode 
                                     Potree.settings.displayMode = mode 
                                 }
                                 }
                                 viewer.mainViewport.view.removeEventListener('flyingDone', f)
                                 viewer.mainViewport.view.removeEventListener('flyingDone', f)
+                                viewer.mainViewport.view.removeEventListener('flyCancel', f)
                             } 
                             } 
                             viewer.mainViewport.view.addEventListener('flyingDone', f) //once
                             viewer.mainViewport.view.addEventListener('flyingDone', f) //once
+                            viewer.mainViewport.view.addEventListener('flyCancel', f)
+                            
+                            
                             return
                             return
-                        } 
+                            
+                        }   
+                        
+                        
+                        
+                        
                         
                         
                         if(this.isAtPano() && !this.latestToPano){ 
                         if(this.isAtPano() && !this.latestToPano){ 
                             config2 = config.atPano 
                             config2 = config.atPano 
@@ -343,7 +369,7 @@ export class Images360 extends THREE.EventDispatcher{
                                     this.removeEventListener('flyToPanoDone',wait) 
                                     this.removeEventListener('flyToPanoDone',wait) 
                                     setTimeout(()=>{
                                     setTimeout(()=>{
                                         if(this.latestRequestMode == mode ){
                                         if(this.latestRequestMode == mode ){
-                                            Potree.settings.displayMode = mode 
+                                            Potree.settings.displayMode = mode  //被打断,重新执行
                                         } 
                                         } 
                                     },e.makeIt ? 1 : 50) 
                                     },e.makeIt ? 1 : 50) 
                                 }
                                 }
@@ -426,22 +452,7 @@ export class Images360 extends THREE.EventDispatcher{
                             this.resetHighMap()
                             this.resetHighMap()
                             this.hideHighMap() 
                             this.hideHighMap() 
                         }
                         }
-                        
-                        
-                        if(Potree.settings.mergeType2 && this.currentPano.pointcloud.is4dkkModel){
-                            if(this.currentPano.pointcloud.fileType == '3dTiles'){
-                                viewer.model4dkk.runtime.limit2lowestDepth(mode == 'showPanos')
-                                viewer.model4dkk.runtime.getTileset().tiles.forEach(e=>{
-                                    let mesh = e.tileContent.children[0]
-                                    mesh.material = mode == 'showPanos' ? this.materialInside : mesh.materialOutside
-                                    Potree.Utils.setObjectLayers(mesh,  mode == 'showPanos' ? 'skybox' : 'model' )
-                                })
-                                
-                            }else{
-                                
-                            }
-                        }
-                        
+                         
                         
                         
                         /* viewer.dispatchEvent({
                         /* viewer.dispatchEvent({
                             type: "enableChangePos",
                             type: "enableChangePos",
@@ -599,6 +610,24 @@ export class Images360 extends THREE.EventDispatcher{
 	}; 
 	}; 
     
     
     
     
+    
+    judgeModelMat(object){
+        if(!(Potree.settings.mergeType2 && Potree.settings.modelSkybox))return
+        object.traverse(mesh=>{
+            if(mesh.material){
+                if(!mesh.materialOutside){
+                    mesh.materialOutside = mesh.material
+                }
+
+                mesh.material = Potree.settings.displayMode == 'showPanos' ? this.materialInside : mesh.materialOutside 
+                Potree.Utils.setObjectLayers(mesh,  Potree.settings.displayMode == 'showPanos' ? 'skybox' : 'model' ) //为了渲染到rtEDL
+                 
+            }
+        })
+    }
+    
+    
+    
     updateDepthTex(pano){ 
     updateDepthTex(pano){ 
         if(this.currentPano != pano || !pano.depthTex)return 
         if(this.currentPano != pano || !pano.depthTex)return 
         //this.depthSampler.changeImg(pano.depthTex.image);  //pick sampler要飞到了才能切换图,而skybox贴图是随着全景图切换而切换的
         //this.depthSampler.changeImg(pano.depthTex.image);  //pick sampler要飞到了才能切换图,而skybox贴图是随着全景图切换而切换的
@@ -675,6 +704,7 @@ export class Images360 extends THREE.EventDispatcher{
 
 
     setProjectedPanos(o={}){//设置cube和点云的材质贴图
     setProjectedPanos(o={}){//设置cube和点云的材质贴图
         this.cube.material.setProjectedPanos(o.pano0, o.pano1, o.progress)
         this.cube.material.setProjectedPanos(o.pano0, o.pano1, o.progress)
+        this.materialInside && this.materialInside.setProjectedPanos(o.pano0, o.pano1, o.progress)
         if(o.ifPointcloud){
         if(o.ifPointcloud){
             viewer.scene.pointclouds.forEach(e=>{
             viewer.scene.pointclouds.forEach(e=>{
                 e.material.setProjectedPanos(o.pano0, o.pano1, o.progress, o.easeInOutRatio)
                 e.material.setProjectedPanos(o.pano0, o.pano1, o.progress, o.easeInOutRatio)
@@ -725,10 +755,10 @@ export class Images360 extends THREE.EventDispatcher{
         
         
          
          
         
         
-        if(this.latestToPano && this.latestToPano != toPano && (//还在飞
+        if(!toPano.canCancelLast && this.latestToPano && this.latestToPano != toPano && (//还在飞
             this.latestToPano.pano != this.currentPano || !this.isAtPano())){//如果旧的toPano只在pano旋转镜头,就直接取消旧的,继续执行 
             this.latestToPano.pano != this.currentPano || !this.isAtPano())){//如果旧的toPano只在pano旋转镜头,就直接取消旧的,继续执行 
             return done(false) 
             return done(false) 
-        }
+        } 
          
          
         if(this.currentPano == toPano.pano && this.isAtPano() && !toPano.target && !toPano.quaternion  ){
         if(this.currentPano == toPano.pano && this.isAtPano() && !toPano.target && !toPano.quaternion  ){
             //已在该pano
             //已在该pano
@@ -2496,7 +2526,7 @@ export class Images360 extends THREE.EventDispatcher{
         //data[0].file_id = '00019'
         //data[0].file_id = '00019'
          
          
         if(data.data) data = data.data 
         if(data.data) data = data.data 
-        if(data.length == 0)console.error(pointcloud.dataset_id + ' 没有漫游点') 
+        //if(data.length == 0)console.error(pointcloud.dataset_id + ' 没有漫游点') 
         //data = data.sort(function(a,b){return a.id-b.id})
         //data = data.sort(function(a,b){return a.id-b.id})
         
         
         data.forEach((info)=>{  
         data.forEach((info)=>{  
@@ -2517,7 +2547,7 @@ export class Images360 extends THREE.EventDispatcher{
             pano.label2 && Potree.Utils.setObjectLayers(pano.label2, 'bothMapAndScene') 
             pano.label2 && Potree.Utils.setObjectLayers(pano.label2, 'bothMapAndScene') 
             
             
             if(Potree.settings.editType == 'pano'){
             if(Potree.settings.editType == 'pano'){
-                Potree.settings.datasetsPanos[datasetId].panos.push(pano);
+                Potree.settings.datasetsPanos[pointcloud.dataset_id].panos.push(pano);
             }
             }
         })   
         })   
     }
     }

+ 10 - 5
src/custom/modules/panos/Panorama.js

@@ -108,9 +108,10 @@ class Panorama extends THREE.EventDispatcher{
             this.pointcloud.panos.push(this)
             this.pointcloud.panos.push(this)
             this.sid = this.pointcloud.dataset_id + '|' + this.uuid  //不会更改的标记  用于entity.panos里的标记
             this.sid = this.pointcloud.dataset_id + '|' + this.uuid  //不会更改的标记  用于entity.panos里的标记
             
             
-            
+            delete o.pointcloud
             this.panosData = o
             this.panosData = o
             
             
+            
             //数据中原本的位置朝向
             //数据中原本的位置朝向
             this.dataPosition = new THREE.Vector3().copy(o.pose.translation) 
             this.dataPosition = new THREE.Vector3().copy(o.pose.translation) 
             this.dataQuaternion = new THREE.Quaternion().copy(o.pose.rotation) 
             this.dataQuaternion = new THREE.Quaternion().copy(o.pose.rotation) 
@@ -378,12 +379,16 @@ class Panorama extends THREE.EventDispatcher{
             //有可能被点云遮住吗。 
             //有可能被点云遮住吗。 
          
          
         } 
         } 
-        return  new DepthBasicMaterial({opacity: markerOpacitys.default, side: THREE.DoubleSide , map:markerTex.default ,transparent:true, 
+        let mat = new DepthBasicMaterial({opacity: markerOpacitys.default, side: THREE.DoubleSide , map:markerTex.default ,transparent:true, 
             clipDistance: 2,  occlusionDistance:1,  //不能设置太短,因为过渡时深度不准确 
             clipDistance: 2,  occlusionDistance:1,  //不能设置太短,因为过渡时深度不准确 
-            useDepth:  !!(Potree.settings.useDepthTex && this.pointcloud.hasDepthTex),
-            autoDepthTest:true
+            useDepth:  !!( Potree.settings.useDepthTex && this.pointcloud.hasDepthTex || Potree.settings.modelSkybox && this.pointcloud.is4dkkModel ),
+            autoDepthTest: true,  
             //改为DepthBasicMaterial是因为原Basic的材质在有深度图时过渡会先隐藏后出现。 注:没有深度图时全景模式的marker无法遮挡
             //改为DepthBasicMaterial是因为原Basic的材质在有深度图时过渡会先隐藏后出现。 注:没有深度图时全景模式的marker无法遮挡
-        })    
+        })
+        mat.mapTransparent = true
+                 
+        return  mat
+       
     }
     }
     
     
     
     

+ 2 - 2
src/custom/modules/volumeCompute/Prism.js

@@ -13,8 +13,8 @@ let areaPlaneMats = {
  
  
 export class Prism extends Measure{
 export class Prism extends Measure{
     constructor(args){
     constructor(args){
-        super(args)
-        this.isPrism = true 
+        args.isPrism = true 
+        super(args) 
         this.volumeInfo = {}
         this.volumeInfo = {}
         this.needsCompute = true
         this.needsCompute = true
         /*this.createPrismLines(new THREE.Color('#FFF') )
         /*this.createPrismLines(new THREE.Color('#FFF') )

+ 5 - 12
src/custom/modules/volumeCompute/VolumeComputer.js

@@ -27,14 +27,7 @@ const Shaders = {
         uniform vec2 boundZ;
         uniform vec2 boundZ;
         varying float heightPercent; 
         varying float heightPercent; 
         
         
-
-        float round(float number){
-            return floor(number + 0.5);
-        }
-            
-               
-             
-        
+  
         
         
         void main() 
         void main() 
         {      
         {      
@@ -569,10 +562,10 @@ export default class VolumeComputer extends THREE.EventDispatcher{
             horizonZ = prism.horizonZ
             horizonZ = prism.horizonZ
             zMin = prism.zMin
             zMin = prism.zMin
             zMax = prism.zMax
             zMax = prism.zMax
-            bound = new THREE.Box3
-            for(let i=0;i<prism.points.length;i++){
+            bound = new THREE.Box3().copy(prism.prismBound)
+            /* for(let i=0;i<prism.points.length;i++){
                 bound.expandByPoint(prism.points[i])
                 bound.expandByPoint(prism.points[i])
-            }
+            } */
         }else{
         }else{
             zMin = this.computingObject.model.clipBound.min.z
             zMin = this.computingObject.model.clipBound.min.z
             zMax = this.computingObject.model.clipBound.max.z
             zMax = this.computingObject.model.clipBound.max.z
@@ -601,7 +594,7 @@ export default class VolumeComputer extends THREE.EventDispatcher{
         bound.getCenter(center)
         bound.getCenter(center)
         bound.getSize(boundSize) 
         bound.getSize(boundSize) 
         
         
-        this.boundSizeZero = boundSize.x<=0 ||boundSize.y<=0 || boundSize.z<=0 //prism的问题
+        this.boundSizeZero = boundSize.x<=0 ||boundSize.y<=0 || this.computingObject.model && boundSize.z<=0 //prism的问题
         if(this.boundSizeZero){
         if(this.boundSizeZero){
             computeDone({highest:0,lowest:0,Vupper:0,Vlower:0}, deferred )
             computeDone({highest:0,lowest:0,Vupper:0,Vlower:0}, deferred )
             return computeFinish('finish', true)
             return computeFinish('finish', true)

+ 2 - 2
src/custom/objects/TextSprite.js

@@ -222,13 +222,13 @@ export class TextSprite extends THREE.Object3D{
  
  
         
         
         
         
-        let y = margin.y
+        let y = margin.y + expand 
         for (let i = 0; i < this.text.length; i++) {
         for (let i = 0; i < this.text.length; i++) {
             //let actualHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent // 当前文本字符串在这个字体下用的实际高度
             //let actualHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent // 当前文本字符串在这个字体下用的实际高度
 
 
             //文字y向距离从textBaseline向上算
             //文字y向距离从textBaseline向上算
             let actualBoundingBoxAscent = infos[i].actualBoundingBoxAscent == void 0 ? this.fontsize * r * 0.8 : infos[i].actualBoundingBoxAscent //有的流览器没有。只能大概给一个
             let actualBoundingBoxAscent = infos[i].actualBoundingBoxAscent == void 0 ? this.fontsize * r * 0.8 : infos[i].actualBoundingBoxAscent //有的流览器没有。只能大概给一个
-            y += actualBoundingBoxAscent + expand + this.textBorderThick
+            y += actualBoundingBoxAscent + this.textBorderThick
             //console.log(actualBoundingBoxAscent)
             //console.log(actualBoundingBoxAscent)
 
 
             //console.log(this.text, 'y' , y, 'actualBoundingBoxAscent', metrics.actualBoundingBoxAscent,'expand',expand )
             //console.log(this.text, 'y' , y, 'actualBoundingBoxAscent', metrics.actualBoundingBoxAscent,'expand',expand )

+ 3 - 3
src/custom/potree.shim.js

@@ -238,9 +238,9 @@ Utils.getMousePointCloudIntersection = function(viewport, mouse, pointer, camera
     if(result != 'unsupport')return result
     if(result != 'unsupport')return result
       */
       */
     
     
+     
     
     
-    
-    if(!pointclouds || pointclouds.length == 0)return
+    if(!pointclouds || pointclouds.filter(e=>Potree.Utils.getObjVisiByReason(e, 'datasetSelection')).length == 0)return
     //console.log('getMousePointCloudIntersection')
     //console.log('getMousePointCloudIntersection')
     let renderer = viewer.renderer;
     let renderer = viewer.renderer;
     
     
@@ -347,7 +347,7 @@ Utils.getMousePointCloudIntersection = function(viewport, mouse, pointer, camera
 
 
     let allPointclouds = [] 
     let allPointclouds = [] 
     for(let pointcloud of pointclouds){ 
     for(let pointcloud of pointclouds){ 
-        
+         
         let point = pointcloud.pick(viewer, viewport, camera, ray, pickParams );
         let point = pointcloud.pick(viewer, viewport, camera, ray, pickParams );
         
         
       
       

+ 1 - 1
src/custom/settings.js

@@ -96,7 +96,7 @@ const config = {//配置参数   不可修改
         cameraHeight : 1000,  //最高  ,注意(如sitemodel)其他的物体不能超过这个高度
         cameraHeight : 1000,  //最高  ,注意(如sitemodel)其他的物体不能超过这个高度
     },
     },
     minNodeSize:30, // perspectiveCamera允许加载的node的最小可见像素宽度。越大越省性能
     minNodeSize:30, // perspectiveCamera允许加载的node的最小可见像素宽度。越大越省性能
-    tiles3DMaxMemory: 100,//M. 最大支持3dTiles的内存大小 超出会崩溃。  改太小太大都会卡,太大崩溃
+    tiles3DMaxMemory: 300,//M. 最大支持3dTiles的内存大小 超出会崩溃。  改太小太大都会卡,太大崩溃
     pointDensity:{
     pointDensity:{
         magnifier:{  
         magnifier:{  
             maxLevelPercent: 1,
             maxLevelPercent: 1,

+ 12 - 11
src/custom/start.js

@@ -249,7 +249,7 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
                     Potree.settings.UserPointDensity = 'high'//'middle' 
                     Potree.settings.UserPointDensity = 'high'//'middle' 
                 }                                            
                 }                                            
                  
                  
-                Potree.Log('loadPointCloudDone  点云加载完毕', {font:[null, 10]})  
+                Potree.Log('loadPointCloudDone  点云加载完毕' )  
             }      
             }      
              
              
             
             
@@ -433,7 +433,7 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
             pointcloud.updateMatrixWorld()
             pointcloud.updateMatrixWorld()
             
             
             
             
-            Potree.Log(`点云${pointcloud.dataset_id}(${pointcloud.name})旋转值:${pointcloud.orientationUser}, 位置${math.toPrecision(pointcloud.translateUser.toArray(),3)}, 经纬度 ${dataset.location}, spacing ${pointcloud.material.spacing}`,  {font:[null, 13]} )
+            Potree.Log(`点云${pointcloud.dataset_id}(${pointcloud.name})旋转值:${pointcloud.orientationUser}, 位置${math.toPrecision(pointcloud.translateUser.toArray(),3)}, 经纬度 ${dataset.location}, spacing ${pointcloud.material.spacing}`,{font:{color:"#f49",fontSize:13}} )
              
              
         }
         }
         
         
@@ -449,12 +449,13 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
          
          
         {//拿初始数据集作为基准。它的位置要放到000
         {//拿初始数据集作为基准。它的位置要放到000
             var locationLonLat = originDataset.location.slice(0,2) 
             var locationLonLat = originDataset.location.slice(0,2) 
-            
-            if(window.AMapWith84){//需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差.    navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
+            Potree.setLonlat(locationLonLat[0], locationLonLat[1])
+            /* if(window.AMapWith84){//需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差.    navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
                 locationLonLat = AMapWith84.wgs84ToAMap({x:locationLonLat[0], y:locationLonLat[1]})
                 locationLonLat = AMapWith84.wgs84ToAMap({x:locationLonLat[0], y:locationLonLat[1]})
                 locationLonLat = [locationLonLat.x,locationLonLat.y] 
                 locationLonLat = [locationLonLat.x,locationLonLat.y] 
             }  
             }  
             
             
+            
             proj4.defs("LOCAL", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //高德坐标系
             proj4.defs("LOCAL", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //高德坐标系
             proj4.defs("LOCAL_MAP", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //地图和本地一样
             proj4.defs("LOCAL_MAP", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //地图和本地一样
             proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
             proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
@@ -504,7 +505,7 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
                 for(let f in viewer.transform){
                 for(let f in viewer.transform){
                     change(viewer.transform[f]) 
                     change(viewer.transform[f]) 
                 }  
                 }  
-            } 
+            }  */
             
             
             
             
             
             
@@ -577,7 +578,7 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
             }else{
             }else{
                 let pointcloud = viewer.scene.pointclouds.find(p => p.dataset_id == dataset.id)
                 let pointcloud = viewer.scene.pointclouds.find(p => p.dataset_id == dataset.id)
                 if(!pointcloud){
                 if(!pointcloud){
-                    Potree.Log('数据集id变了,自动使用第一个',   {font:['#500'  ]} )
+                    Potree.Log('数据集id变了,自动使用第一个',   {font: {color:'#500' }} )
                     pointcloud = viewer.scene.pointclouds[0]
                     pointcloud = viewer.scene.pointclouds[0]
                 }
                 }
                 //先归零 
                 //先归零 
@@ -751,7 +752,7 @@ export function panoEditStart(dom, number, fileServer){
         viewer.updateModelBound()
         viewer.updateModelBound()
         let {boundSize, center} = viewer.bound
         let {boundSize, center} = viewer.bound
        
        
-        Potree.Log(`中心点: ${math.toPrecision(center.toArray(),2)}, boundSize: ${math.toPrecision(boundSize.toArray(),2)} ` , {font:[null, 12]} )
+        Potree.Log(`中心点: ${math.toPrecision(center.toArray(),2)}, boundSize: ${math.toPrecision(boundSize.toArray(),2)} `  )
           
           
         viewer.scene.view.setView({ 
         viewer.scene.view.setView({ 
             position: center.clone().add(new THREE.Vector3(10,5,10)), 
             position: center.clone().add(new THREE.Vector3(10,5,10)), 
@@ -894,7 +895,7 @@ export function mergeEditStart(dom, mapDom){
     }
     }
     
     
     Potree.settings.sizeFitToLevel = true//当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2
     Potree.settings.sizeFitToLevel = true//当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2
-    Potree.loadPointCloudScene = function(url, type, id, title, done, onError){//对应4dkk的场景码
+    Potree.loadPointCloudScene = function(url, type, id, title, done, onError, prefix){//对应4dkk的场景码
         let dataset 
         let dataset 
         let loadCloud = ({cloudPath, sceneName, sceneCode, timeStamp, color } )=>{
         let loadCloud = ({cloudPath, sceneName, sceneCode, timeStamp, color } )=>{
             
             
@@ -932,7 +933,7 @@ export function mergeEditStart(dom, mapDom){
                         Potree.settings.UserPointDensity = 'high'//'middle' 
                         Potree.settings.UserPointDensity = 'high'//'middle' 
                     }
                     }
                      
                      
-                    Potree.Log('loadPointCloudDone  点云加载完毕',  {font:[null,10] })    
+                    Potree.Log(' 点云加载完毕', sceneName, sceneCode )    
                 } 
                 } 
                     
                     
                
                
@@ -953,7 +954,7 @@ export function mergeEditStart(dom, mapDom){
                 let cloudPath = `${Potree.settings.urls.prefix1}/${originDataset.webBin}`  //webBin添加原因:每次裁剪之类的操作会换路径,因为oss文件缓存太严重,更新慢
                 let cloudPath = `${Potree.settings.urls.prefix1}/${originDataset.webBin}`  //webBin添加原因:每次裁剪之类的操作会换路径,因为oss文件缓存太严重,更新慢
                 dataset = originDataset
                 dataset = originDataset
                 loadCloud({cloudPath, sceneName:originDataset.sceneName, sceneCode, timeStamp, color:originDataset.color})
                 loadCloud({cloudPath, sceneName:originDataset.sceneName, sceneCode, timeStamp, color:originDataset.color})
-            }, sceneCode, onError)
+            }, sceneCode, onError, prefix)
         
         
         }else{//las or ply  直接用url
         }else{//las or ply  直接用url
             let name = type + '|' + id + '|' + title
             let name = type + '|' + id + '|' + title
@@ -1286,7 +1287,7 @@ export function mergeEditStart(dom, mapDom){
                 }
                 }
                 
                 
                 
                 
-            }, onError)
+            }, onError, prop.prefix)
         
         
              
              
             
             

+ 4 - 1
src/custom/utils/Common.js

@@ -243,11 +243,14 @@ var Common = {
         return str.replace(reg, e);
         return str.replace(reg, e);
     }, 
     }, 
       
       
-    dealURL(url){
+    dealURL(url){ 
         let urlNew = this.replaceAll(url, "\\+", "%2B");// 浏览器似乎不支持访问带+的地址
         let urlNew = this.replaceAll(url, "\\+", "%2B");// 浏览器似乎不支持访问带+的地址
         
         
         urlNew = this.replaceAll(urlNew, "/.//", "/") //去除双斜杠(/.//)
         urlNew = this.replaceAll(urlNew, "/.//", "/") //去除双斜杠(/.//)
          
          
+          
+        //urlNew = encodeURIComponent(url)
+         
         return urlNew
         return urlNew
     },
     },
     
     

+ 59 - 37
src/custom/viewer/ViewerNew.js

@@ -216,7 +216,11 @@ export class Viewer extends ViewerBase{
         this.fakeMeasure = {};
         this.fakeMeasure = {};
          
          
          
          
-       
+       setTimeout(()=>{
+           if(!Potree.settings.isWebgl2 && !Potree.browser.urlHasValue('webgl1')){
+               console.warn('不支持webgl2')
+           }
+       },3000)
         
         
          
          
             
             
@@ -3218,7 +3222,7 @@ export class Viewer extends ViewerBase{
         let viewports = params_.viewports || this.viewports
         let viewports = params_.viewports || this.viewports
         
         
          
          
-		 
+		let renderer = params_.renderer || this.renderer
         viewer.addTimeMark('renderDefault','start')
         viewer.addTimeMark('renderDefault','start')
         
         
         //console.log('render', viewports.map(e=>e.name).join(','))
         //console.log('render', viewports.map(e=>e.name).join(','))
@@ -3228,7 +3232,7 @@ export class Viewer extends ViewerBase{
             renderSize =  new THREE.Vector2(params_.target.width, params_.target.height) //是画布大小
             renderSize =  new THREE.Vector2(params_.target.width, params_.target.height) //是画布大小
             //可能需要viewer.setSize
             //可能需要viewer.setSize
         }else{
         }else{
-            renderSize = this.renderer.getSize(new THREE.Vector2()); //是client大小
+            renderSize = renderer.getSize(new THREE.Vector2()); //是client大小
         }
         }
            
            
         
         
@@ -3269,7 +3273,7 @@ export class Viewer extends ViewerBase{
                     params_.target.viewport.set(left, bottom, width, height);  
                     params_.target.viewport.set(left, bottom, width, height);  
                     scissorTest && params_.target.scissor.set(left, bottom, width, height); 
                     scissorTest && params_.target.scissor.set(left, bottom, width, height); 
                     params_.target.scissorTest = scissorTest
                     params_.target.scissorTest = scissorTest
-                    this.renderer.setRenderTarget(params_.target)
+                    renderer.setRenderTarget(params_.target)
                 }else{    
                 }else{    
                     /* if(viewports.length == 1 && left == 0 && bottom == 0){
                     /* if(viewports.length == 1 && left == 0 && bottom == 0){
                         left = 1 , width-=1   //这种情况下渲染也会有问题,只有鼠标的地方刷新 估计是pick那影响的
                         left = 1 , width-=1   //这种情况下渲染也会有问题,只有鼠标的地方刷新 估计是pick那影响的
@@ -3280,15 +3284,15 @@ export class Viewer extends ViewerBase{
                     } */   
                     } */   
                     if(viewport.forViewOffset){ //分块渲染,渲染时的camera还是原来的,但加载点云时的camera是分块中的
                     if(viewport.forViewOffset){ //分块渲染,渲染时的camera还是原来的,但加载点云时的camera是分块中的
                         viewport.forViewOffset.camera.setViewOffset(renderSize.x, renderSize.y, left, renderSize.y - bottom - height, width, height)
                         viewport.forViewOffset.camera.setViewOffset(renderSize.x, renderSize.y, left, renderSize.y - bottom - height, width, height)
-                        this.renderer.setViewport(0,0,renderSize.x, renderSize.y)
+                        renderer.setViewport(0,0,renderSize.x, renderSize.y)
                         viewport.resolution.copy(viewport.forViewOffset.originViewport.resolution)
                         viewport.resolution.copy(viewport.forViewOffset.originViewport.resolution)
                         viewport.resolution2.copy(viewport.forViewOffset.originViewport.resolution2) //后续渲染都当做原先的viewport
                         viewport.resolution2.copy(viewport.forViewOffset.originViewport.resolution2) //后续渲染都当做原先的viewport
                     }else{
                     }else{
-                        this.renderer.setViewport(left, bottom, width, height) //规定视口,影响图形变换(画布的使用范围) 
+                        renderer.setViewport(left, bottom, width, height) //规定视口,影响图形变换(画布的使用范围) 
                     }
                     }
                     //scissorTest && console.log('setScissor', left, bottom, width, height)
                     //scissorTest && console.log('setScissor', left, bottom, width, height)
-                    scissorTest && this.renderer.setScissor( left, bottom, width, height );//规定渲染范围
-                    this.renderer.setScissorTest( scissorTest );//开启WebGL剪裁测试功能,如果不开启,.setScissor方法设置的范围不起作用 | width==1且height==1时开启会只有鼠标的地方刷新,很奇怪
+                    scissorTest && renderer.setScissor( left, bottom, width, height );//规定渲染范围
+                    renderer.setScissorTest( scissorTest );//开启WebGL剪裁测试功能,如果不开启,.setScissor方法设置的范围不起作用 | width==1且height==1时开启会只有鼠标的地方刷新,很奇怪
                     
                     
                 } 
                 } 
             } 
             } 
@@ -3304,7 +3308,7 @@ export class Viewer extends ViewerBase{
             
             
             if(viewport.render){ 
             if(viewport.render){ 
                 if(!viewport.render($.extend({}, params, {
                 if(!viewport.render($.extend({}, params, {
-                    renderer:this.renderer,   clear:this.clear.bind(this), resize:null,
+                    renderer,   clear:params.clear || this.clear.bind(this), resize:null,
                     renderBG:this.renderBG.bind(this),  force:true  //viewer content_change时map也直接渲染吧     //!viewport.noPointcloud //如果要渲染点云,必须也一直渲染地图,否则地图会被覆盖(点云目前未能获取是否改变,也可能有其他动态物体,所以还是一直渲染的好)
                     renderBG:this.renderBG.bind(this),  force:true  //viewer content_change时map也直接渲染吧     //!viewport.noPointcloud //如果要渲染点云,必须也一直渲染地图,否则地图会被覆盖(点云目前未能获取是否改变,也可能有其他动态物体,所以还是一直渲染的好)
                 }))) continue//return
                 }))) continue//return
             }else{ 
             }else{ 
@@ -3332,7 +3336,7 @@ export class Viewer extends ViewerBase{
             
             
                 
                 
                  
                  
-                pRenderer.render(params);  //渲染点云 skybox
+                pRenderer.render(params); //渲染点云 skybox
                 
                 
             } 
             } 
                  
                  
@@ -3458,7 +3462,7 @@ export class Viewer extends ViewerBase{
         
         
     }
     }
      
      
-    renderOverlay1(params){ 
+    renderOverlay1(params){//渲染主要的mesh
         let camera = params.camera ? params.camera : this.scene.getActiveCamera();
         let camera = params.camera ? params.camera : this.scene.getActiveCamera();
         let renderer = params.renderer || this.renderer
         let renderer = params.renderer || this.renderer
         this.reticule.updateAtViewports(params.viewport)
         this.reticule.updateAtViewports(params.viewport)
@@ -3486,9 +3490,9 @@ export class Viewer extends ViewerBase{
             if('renderBeforeCloud' in params){
             if('renderBeforeCloud' in params){
                 this.scene.scene.traverse((object)=>{
                 this.scene.scene.traverse((object)=>{
                     if(object.material){  
                     if(object.material){  
-                        Potree.Utils.updateVisible(object, 'renderOpa', 
-                            (params.renderBeforeCloud && (object.material.opacity<1 || !object.material.depthTest) || (!params.renderBeforeCloud) && (object.material.opacity==1 && object.material.depthTest))? false:true) 
-                        //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。  depthTest==false的也最后渲染
+                        let transparent = object.material.opacity<1 || object.material.mapTransparent || !object.material.depthTest
+                        Potree.Utils.updateVisible(object, 'renderOpa',  params.renderBeforeCloud != transparent)  
+                        //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。  depthTest==false的也最后渲染。 mapTransparent是手动加的,代表确定该贴图含有透明部分,即使opacity为1
                     } 
                     } 
                 })//ground的材质中opacity为1,所以被当做不透明了
                 })//ground的材质中opacity为1,所以被当做不透明了
             }
             }
@@ -3512,7 +3516,7 @@ export class Viewer extends ViewerBase{
     
     
     
     
     
     
-    renderOverlay2(params){
+    renderOverlay2(params){//渲染剩余部分
         let renderer = params.renderer || this.renderer
         let renderer = params.renderer || this.renderer
         let camera = params.camera ? params.camera : this.scene.getActiveCamera();
         let camera = params.camera ? params.camera : this.scene.getActiveCamera();
         //清除深度 !!!!
         //清除深度 !!!!
@@ -4718,13 +4722,17 @@ export class Viewer extends ViewerBase{
     addTimeMark(name, type){
     addTimeMark(name, type){
         let record = Potree.timeCollect[name] 
         let record = Potree.timeCollect[name] 
         let needRecord = record && record.start && record.measures.length < record.minCount
         let needRecord = record && record.start && record.measures.length < record.minCount
-             
+          
         if(needRecord || Potree.measureTimings){
         if(needRecord || Potree.measureTimings){
             performance.mark(name+"-"+type)
             performance.mark(name+"-"+type)
+             
             if(type == 'end'){
             if(type == 'end'){
                 let measure = performance.measure(name,name+"-start",name+"-end");
                 let measure = performance.measure(name,name+"-start",name+"-end");
-                
-                if(needRecord){ 
+                  
+                if(needRecord){
+                    if(!measure){ //有出现过手机的depthSamChangeImg得不到measure,可能是因为时间太长在resolveTimings被清除了?   iphone8 plus ios14.1 型号MQ8F2CH/A    
+                        return //console.log('未能得到performance.measure',name)
+                    }  
                     record.measures.push( measure.duration ) 
                     record.measures.push( measure.duration ) 
                     record.sum += measure.duration;
                     record.sum += measure.duration;
                     record.ave = record.sum / record.measures.length;  
                     record.ave = record.sum / record.measures.length;  
@@ -4754,7 +4762,7 @@ export class Viewer extends ViewerBase{
             this.toggle = timestamp;
             this.toggle = timestamp;
         }
         }
         let duration = timestamp - this.toggle;
         let duration = timestamp - this.toggle;
-        if(duration > 1000.0){
+        if(duration > 4000.0){
             if(log){
             if(log){
                 let measures = performance.getEntriesByType("measure");
                 let measures = performance.getEntriesByType("measure");
                 for(let i in this.fakeMeasure){
                 for(let i in this.fakeMeasure){
@@ -5200,7 +5208,7 @@ export class Viewer extends ViewerBase{
         
         
         fileInfo_.loadCostTime = Date.now() - fileInfo_.loadStartTime
         fileInfo_.loadCostTime = Date.now() - fileInfo_.loadStartTime
         /* let weight = Math.round((total / 1024 / 1024) * 100) / 100;*/
         /* let weight = Math.round((total / 1024 / 1024) * 100) / 100;*/
-        console.log( '加载完毕:', Common.getNameFromURL(fileInfo_.url),  '耗时(ms)', fileInfo_.loadCostTime, /* 模型数据量:' + weight + 'M' */)
+        console.log( '加载完毕:', fileInfo_.name, Common.getNameFromURL(fileInfo_.url), '耗时(ms)', fileInfo_.loadCostTime, /* 模型数据量:' + weight + 'M' */)
           
           
            
            
         if(fileInfo_.fileType == '3dTiles'){
         if(fileInfo_.fileType == '3dTiles'){
@@ -5260,7 +5268,7 @@ export class Viewer extends ViewerBase{
                 }
                 }
                 
                 
                 //中心点居然没用。可能是漏用了什么信息,也许这和LVBADUI_qp是散的有关。
                 //中心点居然没用。可能是漏用了什么信息,也许这和LVBADUI_qp是散的有关。
-                console.log('3d tiles json',json)
+                //console.log('3d tiles json',json)
                 
                 
                 json.root.refine = 'ADD';
                 json.root.refine = 'ADD';
                 json.refine = 'ADD';
                 json.refine = 'ADD';
@@ -5350,7 +5358,7 @@ export class Viewer extends ViewerBase{
     
     
     
     
     async loadModel(fileInfo, done, onProgress_, onError){ 
     async loadModel(fileInfo, done, onProgress_, onError){ 
-        console.log('开始加载',  Common.getNameFromURL(fileInfo.url) )
+        console.log('开始加载', fileInfo.name, Common.getNameFromURL(fileInfo.url) )
     
     
         let boundingBox = new THREE.Box3()
         let boundingBox = new THREE.Box3()
         /* if(!Potree.settings.boundAddObjs){
         /* if(!Potree.settings.boundAddObjs){
@@ -5445,7 +5453,7 @@ export class Viewer extends ViewerBase{
                     updateTime: fileInfo.updateTime, //加后缀防止缓存
                     updateTime: fileInfo.updateTime, //加后缀防止缓存
                 },  
                 },  
             })  
             })  
-            console.log(result)
+            //console.log(result)
             result.model.runtime = result.runtime
             result.model.runtime = result.runtime
  
  
                
                
@@ -5454,13 +5462,16 @@ export class Viewer extends ViewerBase{
             tileset.addEventListener('endTileLoading', function (data) {//Tileset3D
             tileset.addEventListener('endTileLoading', function (data) {//Tileset3D
                 if (data.loadingCount == 0 && !loaded) {
                 if (data.loadingCount == 0 && !loaded) {
                     loaded = true; 
                     loaded = true; 
-                    console.log('loaded!!!!!!!!!!!!!')
+                    //console.log('loaded!!!!!!!!!!!!!')
                 }
                 }
             });
             });
             tileset.addEventListener('tileLoaded',(e)=>{ //每一个tile加载完要更改透明度
             tileset.addEventListener('tileLoaded',(e)=>{ //每一个tile加载完要更改透明度
                 let opacity = result.model.parent == this.objs ?  result.model.opacity : result.model.parent.opacity//最多两层
                 let opacity = result.model.parent == this.objs ?  result.model.opacity : result.model.parent.opacity//最多两层
-                MergeEditor.changeOpacity(e.tileContent,opacity)
+                MergeEditor.changeOpacity(e.tileContent,  opacity)
+                viewer.images360.judgeModelMat(e.tileContent)
                 //set Layers ?
                 //set Layers ?
+                Potree.Utils.setObjectLayers(e.tileContent, Potree.settings.showObjectsOnMap ? 'bothMapAndScene' : 'model')  
+           
             })
             })
             
             
             { 
             { 
@@ -5482,7 +5493,7 @@ export class Viewer extends ViewerBase{
                 if(v != visi){
                 if(v != visi){
                     tileset.nextForceUpdate = true
                     tileset.nextForceUpdate = true
                     v = visi
                     v = visi
-                }
+                } 
             }
             }
             loadDone(result.model/* , null, fileInfo.url */) 
             loadDone(result.model/* , null, fileInfo.url */) 
             
             
@@ -5518,20 +5529,28 @@ export class Viewer extends ViewerBase{
                   'streamView': true
                   'streamView': true
                 })
                 })
                 .then(() => {
                 .then(() => {
-                    gsViewer.start(); 
-                    /* gsViewer.splatMesh.rotation.x = -2.365929590263301
-                    gsViewer.splatMesh.position.z = 5 */
+                    gsViewer.start();  
                     gsViewer.splatMesh.updateMatrix()
                     gsViewer.splatMesh.updateMatrix()
                     gsViewer.splatMesh.updateMatrixWorld()
                     gsViewer.splatMesh.updateMatrixWorld()
-                    gsViewer.splatMesh.visible = false
-                    //viewer.mainViewport.view.setView({position: new THREE.Vector3(-4.980,  -5.3879,  5.4503095), quaternion:new THREE.Quaternion(0.5750,-0.2809,-0.3372,0.6903)})
-                
+                 
                     gsViewer.splatMesh.onSplatTreeReadyCallback = ()=>{ 
                     gsViewer.splatMesh.onSplatTreeReadyCallback = ()=>{ 
                         loadDone(gsViewer.splatMesh)
                         loadDone(gsViewer.splatMesh)
                         let {sceneMax,sceneMin} = gsViewer.splatMesh.splatTree.subTrees[0]
                         let {sceneMax,sceneMin} = gsViewer.splatMesh.splatTree.subTrees[0]
                         gsViewer.splatMesh.boundingBox.min.copy(sceneMin)
                         gsViewer.splatMesh.boundingBox.min.copy(sceneMin)
                         gsViewer.splatMesh.boundingBox.max.copy(sceneMax) 
                         gsViewer.splatMesh.boundingBox.max.copy(sceneMax) 
-                    } 
+                    }
+                    let selfRaycaster = new GaussianSplats3D.Raycaster
+                    gsViewer.splatMesh.raycast = function(raycaster, intersects ){//重写
+                        let hits = []
+                        selfRaycaster.ray.setParameters(raycaster.ray.origin, raycaster.ray.direction)
+                        selfRaycaster.intersectSplatMesh(gsViewer.splatMesh, hits) 
+                        hits.forEach(e=>{
+                            e.object = gsViewer.splatMesh
+                            e.point = e.origin
+                            delete e.origin
+                        })
+                        intersects.push(...hits)
+                    } //问题:感觉normal不准
                 });
                 });
             
             
         
         
@@ -5542,7 +5561,7 @@ export class Viewer extends ViewerBase{
                     gsViewer.update()
                     gsViewer.update()
                 
                 
                     if(gsViewer.initialized && gsViewer.splatRenderReady){
                     if(gsViewer.initialized && gsViewer.splatRenderReady){
-                        gsViewer.splatMesh.visible = true
+                        
                     } 
                     } 
                 }
                 }
             })
             })
@@ -5568,10 +5587,13 @@ export class Viewer extends ViewerBase{
         }
         }
     }
     }
     
     
+     
     
     
-    
-    setAllTilesets(fun){//让所有tileset执行fun。    objs.children中的3dtiles最多两层tileset
-        this.objs.children.forEach(e=>{
+    setAllTilesets(){//让所有tileset执行fun。    objs里每个model最多两层tileset
+        let models = arguments.length == 2 ? [arguments[0]] : this.objs.children //如果要设定某个model的tileset,就传第一个参数
+        let fun = arguments[1] || arguments[0]
+        
+        models.forEach(e=>{
             if(e.fileType == '3dTiles'){
             if(e.fileType == '3dTiles'){
                 e.traverse(child=>{
                 e.traverse(child=>{
                     if(child.runtime){
                     if(child.runtime){

+ 51 - 7
src/custom/viewer/map/MapViewer.js

@@ -21,6 +21,8 @@ import {config } from "../../settings.js";
 import CopyShader from '../../materials/postprocessing/CopyShader.js'
 import CopyShader from '../../materials/postprocessing/CopyShader.js'
 import {ShaderPass} from '../../materials/postprocessing/ShaderPass.js' 
 import {ShaderPass} from '../../materials/postprocessing/ShaderPass.js' 
 
 
+import {Renderer} from "../../../PotreeRendererNew.js"; 
+
 /* const mapHeight = -1000;//要比点云低。最低
 /* const mapHeight = -1000;//要比点云低。最低
 const cameraHeight = 1000;  //最高 */
 const cameraHeight = 1000;  //最高 */
 const panosHeight = config.map.mapHeight + 100 //要比点云低  (marker)
 const panosHeight = config.map.mapHeight + 100 //要比点云低  (marker)
@@ -246,6 +248,7 @@ export class MapViewer extends ViewerBase{
         
         
         viewport.addEventListener('resize',()=>{
         viewport.addEventListener('resize',()=>{
             this.copyBuffer.setSize(viewport.resolution2.x, viewport.resolution2.y)
             this.copyBuffer.setSize(viewport.resolution2.x, viewport.resolution2.y)
+            //this.cloudBuffer && this.cloudBuffer.setSize(viewport.resolution2.x, viewport.resolution2.y)
         })
         })
         this.viewports = [viewport]
         this.viewports = [viewport]
         
         
@@ -760,20 +763,20 @@ export class MapViewer extends ViewerBase{
         
         
         params.clear ? params.clear(params) : this.clear(params); 
         params.clear ? params.clear(params) : this.clear(params); 
         this.copyPass.render(null,null, null,renderer, params.target||null, this.copyBuffer) //拷贝地图背景
         this.copyPass.render(null,null, null,renderer, params.target||null, this.copyBuffer) //拷贝地图背景
-        renderer.clearDepth(); //防止地图遮挡其他物体
-        
-        
+        renderer.clearDepth(); //防止地图遮挡其他物体  
+         
+       
         
         
-        //绘制其他物体
+         //绘制其他物体
         Potree.Utils.setCameraLayers(this.camera, ['mapObjects'  , 'bothMapAndScene', 'light'  ])
         Potree.Utils.setCameraLayers(this.camera, ['mapObjects'  , 'bothMapAndScene', 'light'  ])
         viewer.dispatchEvent({type: "render.begin",  viewer: this, viewport:this.viewports[0], params }); 
         viewer.dispatchEvent({type: "render.begin",  viewer: this, viewport:this.viewports[0], params }); 
         
         
-        this.attachedToViewer || renderer.render(viewer.scene.scene, this.camera); //类同renderOverlay
+        this.attachedToViewer || this.renderCloud || renderer.render(viewer.scene.scene, this.camera); //类同renderOverlay
         renderer.render(this.scene, this.camera);
         renderer.render(this.scene, this.camera);
         if(!this.attachedToViewer && this.renderMeasure){//在未attach到主页面时也要渲染测量线
         if(!this.attachedToViewer && this.renderMeasure){//在未attach到主页面时也要渲染测量线
-            viewer.dispatchEvent({type: "render.pass.perspective_overlay", camera:this.camera, /* screenshot:params.screenshot, */viewport:this.viewports[0], renderer});
+            viewer.dispatchEvent({type: "render.pass.perspective_overlay", camera:this.camera, viewport:this.viewports[0], renderer});
         }
         }
-             
+               
            
            
         renderer.setRenderTarget(null)
         renderer.setRenderTarget(null)
     
     
@@ -791,7 +794,48 @@ export class MapViewer extends ViewerBase{
     }
     }
     
     
     
     
+    setRenderCloud(options={}){//使利用viewer的渲染来渲染点云   (如果点云不旋转其实也可以贴floorplan……)
+        this.renderPointcloud = true;
+        this.viewports[0].noPointcloud = false;
+        this.viewports[0].background = 'none' //防止renderBG绘制skybox
+         
+        let oldMapRender = this.render ,
+            oldMapClear = this.clear
+            
      
      
+        let pRenderer = new Renderer(this.renderer); //必须重新创建一个点云渲染器,否则和旧的webgl冲突
+ 
+        this.render = (params={})=>{
+            if(!this.visible && !this.attachedToViewer || !this.needRender && !params.force){  //注意:mapViewer.needRender的权重高于它的viewport的needRender,也就是说,当attachedToViewer时,viewer即使needRender, mapViewer也不一定会渲染。
+                return 
+            }  
+            if(!options.renderMeasure){
+                viewer.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e,'renderCloudAtMap',false))
+            }
+            
+            viewer.renderDefault({
+                viewports: this.viewports,
+                camera: this.camera,
+                renderer: this.renderer,
+                render: oldMapRender,
+                clear: oldMapClear,
+                pRenderer 
+            }) 
+            viewer.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e,'renderCloudAtMap',true))
+        } 
+    }  
+    
+    //本来想用mainViewer渲染点云在target上再贴过来的,但是失败了,可能因为不同的renderer不能互通。
+    /* setRenderCloud(){
+        this.renderCloud = true
+        
+        this.cloudBuffer = new THREE.WebGLRenderTarget( 300, 200 ,  {
+            minFilter: THREE.LinearFilter,
+			magFilter: THREE.LinearFilter,
+			format: THREE.RGBAFormat,
+			//stencilBuffer: false, 
+        });
+    } */
     
     
 }
 }
 /* 
 /* 

+ 9 - 6
src/custom/viewer/viewerBase.js

@@ -47,13 +47,17 @@ export class ViewerBase extends THREE.EventDispatcher{
         }; 
         }; 
 
 
         let canvas = document.createElement("canvas");
         let canvas = document.createElement("canvas");
-                                                             
-
-        let context = canvas.getContext('webgl2', contextAttributes );   //不用webgl2是因为有的写法在webgl2不支持 如gl_FragDepthEXT 
-        if(context){
+                                     
+        let webglVer = (Potree.browser.urlHasValue('webgl1') || !window.WebGL2RenderingContext) ? 'webgl' : 'webgl2' //遇到有设备(iphone8 plus ios14.1 型号MQ8F2CH/A)直接获取webgl2后会点云和全景图闪烁,WebGL2RenderingContext和得到的context是undefined。但是为何4dkk不会闪烁
+        
+        let context = canvas.getContext(webglVer, contextAttributes );
+ 
+        if(context && webglVer == 'webgl2' ){
             Potree.settings.isWebgl2 = true
             Potree.settings.isWebgl2 = true
         } 
         } 
 
 
+        
+
         this.renderer = new THREE.WebGLRenderer({ 
         this.renderer = new THREE.WebGLRenderer({ 
             premultipliedAlpha: false, 
             premultipliedAlpha: false, 
             canvas: canvas,
             canvas: canvas,
@@ -77,9 +81,8 @@ export class ViewerBase extends THREE.EventDispatcher{
 
 
         // NOTE: If extension errors occur, pass the string into this.renderer.extensions.get(x) before enabling
         // NOTE: If extension errors occur, pass the string into this.renderer.extensions.get(x) before enabling
         // enable frag_depth extension for the interpolation shader, if available
         // enable frag_depth extension for the interpolation shader, if available
-        let gl = this.renderer.getContext();
+        let gl = this.renderer.getContext(); 
         
         
-         
         gl.getExtension('EXT_frag_depth');
         gl.getExtension('EXT_frag_depth');
         gl.getExtension('WEBGL_depth_texture');
         gl.getExtension('WEBGL_depth_texture');
         gl.getExtension('WEBGL_color_buffer_float'); 	// Enable explicitly for more portability, EXT_color_buffer_float is the proper name in WebGL 2
         gl.getExtension('WEBGL_color_buffer_float'); 	// Enable explicitly for more portability, EXT_color_buffer_float is the proper name in WebGL 2

+ 14 - 2
src/materials/ExtendEyeDomeLightingMaterial.js

@@ -3,6 +3,9 @@
 import * as THREE from "../../libs/three.js/build/three.module.js";
 import * as THREE from "../../libs/three.js/build/three.module.js";
 import {Shaders} from "../../build/shaders/shaders.js";
 import {Shaders} from "../../build/shaders/shaders.js";
 import {EyeDomeLightingMaterial} from './EyeDomeLightingMaterial.js'
 import {EyeDomeLightingMaterial} from './EyeDomeLightingMaterial.js'
+import Common from '../custom/utils/Common.js'
+
+
 //
 //
 // Algorithm by Christian Boucheny
 // Algorithm by Christian Boucheny
 // shader code taken and adapted from CloudCompare
 // shader code taken and adapted from CloudCompare
@@ -21,8 +24,17 @@ export class ExtendEyeDomeLightingMaterial extends EyeDomeLightingMaterial{
 		delete this.uniforms.screenHeight
 		delete this.uniforms.screenHeight
         this.uniforms.resolution = { type: 'v2',  value: new THREE.Vector2()}  
         this.uniforms.resolution = { type: 'v2',  value: new THREE.Vector2()}  
         this.uniforms.useEDL = { type: 'i',  value: 1 } 
         this.uniforms.useEDL = { type: 'i',  value: 1 } 
-        this.vertexShader = this.getDefines() + Shaders['edl_new.vs'] //改
-        this.fragmentShader = this.getDefines() + Shaders['edl_new.fs'] //改
+        
+        let defines = this.getDefines()  
+        let {vs,fs} = Common.changeShaderToWebgl2(
+            defines + Shaders['edl_new.vs'], defines + Shaders['edl_new.fs'], 'RawShaderMaterial'
+        )
+        this.glslVersion = '300 es'
+        this.vertexShader = vs
+        this.fragmentShader = fs 
+        
+        /* this.vertexShader = this.getDefines() + Shaders['edl_new.vs'] //改
+        this.fragmentShader = this.getDefines() + Shaders['edl_new.fs'] //改 */
 		 
 		 
 	} 
 	} 
 	
 	

+ 22 - 11
src/navigation/InputHandlerNew.js

@@ -858,6 +858,7 @@ export class InputHandler extends THREE.EventDispatcher {
         }
         }
         
         
         let getByCloud = ()=>{
         let getByCloud = ()=>{
+
             let pointer, mouse
             let pointer, mouse
             if(point){//指定了目标点,而非只是用pointer所在位置
             if(point){//指定了目标点,而非只是用pointer所在位置
              
              
@@ -914,12 +915,13 @@ export class InputHandler extends THREE.EventDispatcher {
         
         
         
         
         if(!intersect){
         if(!intersect){
-            
+             
             let canUseDepthTex = (Potree.settings.displayMode == 'showPanos' || useDepthTex)
             let canUseDepthTex = (Potree.settings.displayMode == 'showPanos' || useDepthTex)
                 && viewer.images360.currentPano.pointcloud.hasDepthTex && viewport == viewer.mainViewport && !usePointcloud 
                 && viewer.images360.currentPano.pointcloud.hasDepthTex && viewport == viewer.mainViewport && !usePointcloud 
             
             
             
             
             if(canUseDepthTex)getByDepthTex()
             if(canUseDepthTex)getByDepthTex()
+            else if(Potree.settings.mergeType2 && Potree.settings.displayMode == 'showPanos' && !viewer.images360.currentPano.pointcloud.isPointcloud){} //融合页面进入非点云的场景的全景模式不用pick
             else getByCloud() 
             else getByCloud() 
             /* if(canUseDepthTex && this.measuring.length){
             /* if(canUseDepthTex && this.measuring.length){
                 getByDepthTex()
                 getByDepthTex()
@@ -933,7 +935,7 @@ export class InputHandler extends THREE.EventDispatcher {
             //console.log(viewport.name , intersectPoint &&  intersectPoint.location )
             //console.log(viewport.name , intersectPoint &&  intersectPoint.location )
         
         
            
            
-            
+             
             if(Potree.settings.intersectOnObjs && !dontIntersect){
             if(Potree.settings.intersectOnObjs && !dontIntersect){
                 if(point){
                 if(point){
                     raycaster = new THREE.Raycaster() 
                     raycaster = new THREE.Raycaster() 
@@ -948,15 +950,24 @@ export class InputHandler extends THREE.EventDispatcher {
                 
                 
                 
                 
                 if(allElements[0]){
                 if(allElements[0]){
-                    let quaternion = new THREE.Quaternion
-                    let nor = allElements[0].face && allElements[0].face.normal
-                    nor && allElements[0].oriObject.matrixWorld.decompose( new THREE.Vector3, quaternion, new THREE.Vector3 ) 
-            
+                    let normal 
+                    if(allElements[0].object.fileType == '3dgs' ){
+                        normal = allElements[0].normal
+                    }else{ 
+                        let nor = allElements[0].face && allElements[0].face.normal 
+                        if(nor){
+                            let quaternion = new THREE.Quaternion
+                            allElements[0].oriObject.matrixWorld.decompose( new THREE.Vector3, quaternion, new THREE.Vector3 ) 
+                            normal = nor.applyQuaternion(quaternion) 
+                        }
+                    }
+                    
+                    
                     intersectOnModel = {//模拟点云的intersectPoint的结构写法
                     intersectOnModel = {//模拟点云的intersectPoint的结构写法
                         hoveredElement : allElements[0] ,
                         hoveredElement : allElements[0] ,
                         location: allElements[0].point,
                         location: allElements[0].point,
                         //point: {normal: allElements[0].face.normal },
                         //point: {normal: allElements[0].face.normal },
-                        normal: nor && nor.applyQuaternion(quaternion),
+                        normal,
                         distance: allElements[0].distance,
                         distance: allElements[0].distance,
                         object: allElements[0].object
                         object: allElements[0].object
                     } 
                     } 
@@ -1429,10 +1440,10 @@ export class InputHandler extends THREE.EventDispatcher {
 
 
         
         
         //raycaster.layers.enableAll()//add
         //raycaster.layers.enableAll()//add
-        Potree.Utils.setCameraLayers(raycaster,   //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)
-            ['sceneObjects','mapObjects','measure',  'transformationTool', 'model', 'bothMapAndScene'],
-            this.hoverViewport && this.hoverViewport.extraEnableLayers
-        )
+        let layers = ['sceneObjects','mapObjects','measure',  'transformationTool', 'model', 'bothMapAndScene'] //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)
+        if(Potree.settings.mergeType2 && Potree.settings.modelSkybox && Potree.settings.displayMode == 'showPanos' && !viewer.images360.currentPano.pointcloud.hasDepthTex) layers.push('skybox')//model变成skybox了
+        Potree.Utils.setCameraLayers(raycaster, layers,  this.hoverViewport && this.hoverViewport.extraEnableLayers)
+             
         //this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()
         //this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()
         
         
         viewer.dispatchEvent( {type:'raycaster',  viewport: this.hoverViewport, raycaster, viewer:this.viewer, interactables })//add
         viewer.dispatchEvent( {type:'raycaster',  viewport: this.hoverViewport, raycaster, viewer:this.viewer, interactables })//add

+ 17 - 17
src/viewer/EDLRendererNew.js

@@ -204,10 +204,10 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
         let target = params.target || null
         let target = params.target || null
         
         
         const resolution = (rtEDL && Potree.settings.useRTPoint) ? new THREE.Vector2(rtEDL.width,rtEDL.height) : params.target ? new THREE.Vector2(params.target.width, params.target.height ) : params.viewport ? params.viewport.resolution2 : this.viewer.renderer.getSize(new THREE.Vector2());//截图时需要用target的大小
         const resolution = (rtEDL && Potree.settings.useRTPoint) ? new THREE.Vector2(rtEDL.width,rtEDL.height) : params.target ? new THREE.Vector2(params.target.width, params.target.height ) : params.viewport ? params.viewport.resolution2 : this.viewer.renderer.getSize(new THREE.Vector2());//截图时需要用target的大小
+        let renderer = params.renderer || viewer.renderer 
+        let pRenderer = params.pRenderer || viewer.pRenderer
         
         
-        
-        
-        viewer.renderer.setRenderTarget(target);
+        renderer.setRenderTarget(target);
         
         
         //viewer.dispatchEvent({type: "render.pass.begin",viewer: viewer});
         //viewer.dispatchEvent({type: "render.pass.begin",viewer: viewer});
 	 
 	 
@@ -224,22 +224,22 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
                  
                  
                 Potree.Utils.setCameraLayers(camera, ['skybox'])
                 Potree.Utils.setCameraLayers(camera, ['skybox'])
             
             
-                if((Potree.settings.displayMode == 'showPanos' )&& viewer.images360.currentPano.pointcloud.hasDepthTex && rtEDL){//渲染深度图
+                if((Potree.settings.displayMode == 'showPanos' ) && (viewer.images360.currentPano.pointcloud.hasDepthTex || Potree.settings.modelSkybox && viewer.images360.currentPano.pointcloud.is4dkkModel) && rtEDL){//渲染深度图
                      
                      
-                    viewer.renderer.setRenderTarget(rtEDL) //将带有深度图的skybox画在rtEDL一下,这样就不需要绘制后边的点云了
-                    viewer.renderer.render(viewer.scene.scene, camera);
-                    viewer.renderer.setRenderTarget(target);
+                    renderer.setRenderTarget(rtEDL) //将带有深度图的skybox画在rtEDL一下,这样就不需要绘制后边的点云了
+                    renderer.render(viewer.scene.scene, camera);
+                    renderer.setRenderTarget(target);
                     
                     
                     if(Potree.settings.useRTskybox){//直接使用rtEDL,但是会失去抗锯齿,不知在skybox上需要抗锯齿吗
                     if(Potree.settings.useRTskybox){//直接使用rtEDL,但是会失去抗锯齿,不知在skybox上需要抗锯齿吗
                         this.recoverToScreenMat.uniforms.depthTex.value = rtEDL.depthTexture
                         this.recoverToScreenMat.uniforms.depthTex.value = rtEDL.depthTexture
                         this.recoverToScreenMat.uniforms.tDiffuse.value = rtEDL.texture  
                         this.recoverToScreenMat.uniforms.tDiffuse.value = rtEDL.texture  
-                        Utils.screenPass.render(viewer.renderer, this.recoverToScreenMat, target);  
+                        Utils.screenPass.render(renderer, this.recoverToScreenMat, target);  
                     }else{
                     }else{
-                        viewer.renderer.render(viewer.scene.scene, camera);
+                        renderer.render(viewer.scene.scene, camera);
                     }
                     }
                     
                     
                 }else{
                 }else{
-                    viewer.renderer.render(viewer.scene.scene, camera);
+                    renderer.render(viewer.scene.scene, camera);
                 }     
                 }     
                 if(Potree.settings.displayMode == 'showPanos' ){
                 if(Potree.settings.displayMode == 'showPanos' ){
                     if(Potree.settings.fastTran && viewer.images360.fastTranMaskPass.enabled){
                     if(Potree.settings.fastTran && viewer.images360.fastTranMaskPass.enabled){
@@ -291,10 +291,10 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
 
 
              
              
             if(rtEDL ){ //借用rtEDL存储深度信息  
             if(rtEDL ){ //借用rtEDL存储深度信息  
-                viewer.renderer.setRenderTarget( rtEDL );
+                renderer.setRenderTarget( rtEDL );
                 
                 
                 if(visiblePointClouds2.length>0){  //渲染scenePointCloud到rtEDL
                 if(visiblePointClouds2.length>0){  //渲染scenePointCloud到rtEDL
-                    viewer.pRenderer.render(viewer.scene.scenePointCloud, camera,  rtEDL, {
+                    pRenderer.render(viewer.scene.scenePointCloud, camera,  rtEDL, {
                         shadowMaps:  lights.length > 0 ? [this.shadowMap] : null,
                         shadowMaps:  lights.length > 0 ? [this.shadowMap] : null,
                         clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),
                         clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)),
                         transparent: true,   //如果点云透明需要透明
                         transparent: true,   //如果点云透明需要透明
@@ -304,7 +304,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
                 if(Potree.settings.intersectOnObjs){// model也要渲染到rtEDL
                 if(Potree.settings.intersectOnObjs){// model也要渲染到rtEDL
                     Potree.Utils.setCameraLayers(camera, ['model','light'])  
                     Potree.Utils.setCameraLayers(camera, ['model','light'])  
                     viewer.objs.traverse(e=>{if(e.material)e._OlddepthWrite = e.material.depthWrite, e.material.depthWrite = true}) //否则半透明的mesh无法遮住测量线
                     viewer.objs.traverse(e=>{if(e.material)e._OlddepthWrite = e.material.depthWrite, e.material.depthWrite = true}) //否则半透明的mesh无法遮住测量线
-                    viewer.renderer.render(viewer.scene.scene, camera);
+                    renderer.render(viewer.scene.scene, camera);
                     viewer.objs.traverse(e=>{if(e.material)e.material.depthWrite = e._OlddepthWrite})
                     viewer.objs.traverse(e=>{if(e.material)e.material.depthWrite = e._OlddepthWrite})
                     //缺点:半透明的model 就算完全透明, 也会遮住测量线
                     //缺点:半透明的model 就算完全透明, 也会遮住测量线
                 }  
                 }  
@@ -314,7 +314,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
          
          
         //渲染到rtEDL完毕
         //渲染到rtEDL完毕
 		viewer.dispatchEvent({type: "render.pass.scene", viewer: viewer });
 		viewer.dispatchEvent({type: "render.pass.scene", viewer: viewer });
-		viewer.renderer.setRenderTarget( target );
+		renderer.setRenderTarget( target );
         
         
         if(!params.magnifier)visiblePointClouds2.forEach(e=>{//放大镜显示点云
         if(!params.magnifier)visiblePointClouds2.forEach(e=>{//放大镜显示点云
             e.visible = e.oldVisi
             e.visible = e.oldVisi
@@ -338,7 +338,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
                 uniforms.uEDLColor.value = rtEDL.texture; 
                 uniforms.uEDLColor.value = rtEDL.texture; 
                 uniforms.opacity.value = viewer.edlOpacity; // HACK 
                 uniforms.opacity.value = viewer.edlOpacity; // HACK 
                  
                  
-                Utils.screenPass.render(viewer.renderer, this.edlMaterial, target);  //相当于一个描边后期特效。 缺点: 因为target上的没有抗锯齿,所以点云在晃动镜头时会不稳定地闪烁1px位置。优点:比不打开edl少绘制一次点云,更流畅了?!
+                Utils.screenPass.render(renderer, this.edlMaterial, target);  //相当于一个描边后期特效。 缺点: 因为target上的没有抗锯齿,所以点云在晃动镜头时会不稳定地闪烁1px位置。优点:比不打开edl少绘制一次点云,更流畅了?!
             }else if(Potree.settings.useRTPoint && rtEDL){ 
             }else if(Potree.settings.useRTPoint && rtEDL){ 
             
             
                 this.recoverToScreenMat.uniforms.tDiffuse.value = rtEDL.texture; 
                 this.recoverToScreenMat.uniforms.tDiffuse.value = rtEDL.texture; 
@@ -346,7 +346,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
                     this.recoverToScreenMat.uniforms.depthTex.value = rtEDL.depthTexture; 
                     this.recoverToScreenMat.uniforms.depthTex.value = rtEDL.depthTexture; 
                 }
                 }
                   
                   
-                Utils.screenPass.render(viewer.renderer, this.recoverToScreenMat, target/* , Potree.settings.useFxaa && viewer.composer2 */);
+                Utils.screenPass.render(renderer, this.recoverToScreenMat, target/* , Potree.settings.useFxaa && viewer.composer2 */);
                 
                 
                 params.drawedModelOnRT = Potree.settings.intersectOnObjs
                 params.drawedModelOnRT = Potree.settings.intersectOnObjs
             }else{
             }else{
@@ -358,7 +358,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
                     notAdditiveBlending: Potree.settings.notAdditiveBlending//add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
                     notAdditiveBlending: Potree.settings.notAdditiveBlending//add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
                 }
                 }
                  
                  
-                viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null , prop);  
+                pRenderer.render(viewer.scene.scenePointCloud, camera, null , prop);  
                 
                 
             }
             }
         }        
         }        

+ 10 - 3
src/viewer/ExtendView.js

@@ -287,14 +287,17 @@ class ExtendView extends View {
                     
                     
                 }), info.duration, posDone , 0, info.Easing ? easing[info.Easing] : easing.easeInOutSine ,null, this.FlyTransition, ()=>{
                 }), info.duration, posDone , 0, info.Easing ? easing[info.Easing] : easing.easeInOutSine ,null, this.FlyTransition, ()=>{
                     //中途取消 
                     //中途取消 
-                    if(endTarget ){
+                    if(rotWaitDone ){
                         /* endPosition = new THREE.Vector3().copy(this.position)//更改旋转的endQuaternion 
                         /* endPosition = new THREE.Vector3().copy(this.position)//更改旋转的endQuaternion 
                         endQuaternion = math.getQuaFromPosAim(endPosition,endTarget)  */
                         endQuaternion = math.getQuaFromPosAim(endPosition,endTarget)  */
                         //直接改变endQuaternion会突变,所以还是cancel吧
                         //直接改变endQuaternion会突变,所以还是cancel吧
                         this.cancelFlying('rotate')
                         this.cancelFlying('rotate')
-                    } 
+                    }else{
+                        this.dispatchEvent('flyCancel')
+                    }
                     posWaitDone = false 
                     posWaitDone = false 
                     info.cancelFun && info.cancelFun()
                     info.cancelFun && info.cancelFun()
+                    
                 }, info.ignoreFirstFrame);  
                 }, info.ignoreFirstFrame);  
             } 
             } 
             
             
@@ -317,11 +320,15 @@ class ExtendView extends View {
                     //中途取消
                     //中途取消
                     rotWaitDone = false
                     rotWaitDone = false
                     info.cancelFun && info.cancelFun()
                     info.cancelFun && info.cancelFun()
+                    this.dispatchEvent('flyCancel')
                 }, info.ignoreFirstFrame); 
                 }, info.ignoreFirstFrame); 
                   
                   
             }      
             }      
          
          
-            
+            if(!posWaitDone && !rotWaitDone){//已经到达目标
+                info.onUpdate && info.onUpdate(1)
+                done()
+            }
             
             
            /*  transitions.start(lerp.vector(this.position, endPosition, (pos, progress)=>{
            /*  transitions.start(lerp.vector(this.position, endPosition, (pos, progress)=>{
 				let t = progress 
 				let t = progress