Selaa lähdekoodia

修改了maginifier的pointbudge

xzw 3 vuotta sitten
vanhempi
commit
d766e333d7

+ 1 - 1
src/PotreeRenderer.js

@@ -1334,7 +1334,7 @@ export class Renderer {
 			}
 
 
-			shader.setUniform1f("size", material.usePanoMap ? Potree.config.material.absolutePanoramaSize * window.devicePixelRatio : material.size);//usePanoMap时控制在不大不小的范围内感觉较好,考虑到有的点云稀疏,用大一点的点
+			shader.setUniform1f("size", material.usePanoMap ? Potree.config.material.absolutePanoramaSize * Math.min(window.devicePixelRatio,2) : material.size);//usePanoMap时控制在不大不小的范围内感觉较好,考虑到有的点云稀疏,用大一点的点
 			shader.setUniform1f("maxSize", material.uniforms.maxSize.value);
 			shader.setUniform1f("minSize", material.uniforms.minSize.value);
 

+ 3 - 0
src/materials/PointCloudMaterial.js

@@ -640,6 +640,9 @@ export class PointCloudMaterial extends THREE.RawShaderMaterial {
 	}
 
 	set pointSizeType (value) {
+        
+        if(typeof value == 'string' )value = PointSizeType[value]
+        
 		if (this._pointSizeType !== value) {
 			this._pointSizeType = value;
 			this.updateShaderSource();

+ 1 - 1
src/materials/shaders/pointcloud.vs

@@ -749,7 +749,7 @@ float getPointSize(){
 	#elif defined adaptive_point_size
 		if(uUseOrthographicCamera) {
 			float worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation();
-			pointSize = (worldSpaceSize / uOrthoWidth) * resolution2.x;    //uScreenWidth;
+			pointSize = (worldSpaceSize / uOrthoWidth) * resolution.x;    //uScreenWidth;
 		} else {
 			float worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation();
 			pointSize = worldSpaceSize * projFactor;

+ 6 - 3
src/modules/Images360/Images360.js

@@ -326,9 +326,9 @@ export class Images360 extends EventDispatcher{
                             camera.far = viewer.farWhenShowPano  //修改far
                             Potree.settings.pointDensity = 'panorama'
                             
-                            /*viewer.scene.pointclouds.forEach(e=>{//全景时透明度为1
-                                e.material.opacity = 1  
-                            })*/ //直接在potreeRender里判断了
+                            viewer.scene.pointclouds.forEach(e=>{
+                                e.material.pointSizeType = 'FIXED'   
+                            })
                             
                             
                         }else{
@@ -336,6 +336,9 @@ export class Images360 extends EventDispatcher{
                             Potree.settings.pointDensity = Potree.settings.UserPointDensity   
 
                             //Potree.sdk && Potree.sdk.scene.changePointOpacity() 
+                            viewer.scene.pointclouds.forEach(e=>{
+                                e.material.pointSizeType = Potree.config.material.pointSizeType
+                            })
                             
                         }  
                         camera.updateProjectionMatrix() 

+ 4 - 3
src/modules/Images360/Panorama.js

@@ -9,8 +9,9 @@ import {TextSprite} from '../../TextSprite'
 var texLoader = new THREE.TextureLoader()
 
 const labelProp = {
-    sizeInfo: {minSize : 120 ,  maxSize : 200,   nearBound : 0.8, farBound : 10},
-    backgroundColor:{r: 255, g: 255, b: 255, a: 0.2 },
+    sizeInfo: {minSize : 200 ,  maxSize : 250,   nearBound : 0.8, farBound : 10},
+    backgroundColor:{r: 255, g: 255, b: 255, a: 0.4 },
+    textColor:{r: 0, g: 0, b: 0, a: 1 }, 
     borderRadius: 15,
     renderOrder:10
 }
@@ -480,7 +481,7 @@ Panorama.prototype.loadTiledPano = function() {
                     
                     this.addEventListener(PanoramaEvents.TileLoaded, function(ev/* t, i, n */) {//每张加载完时
                        
-                        console.log('tileLoaded', 'id:'+this.id,  'size:'+ev.size, 'index:'+ev.index )
+                        //console.log('tileLoaded', 'id:'+this.id,  'size:'+ev.size, 'index:'+ev.index )
                         
                         
                         var r = this.getWaitDeferred(ev.size).deferred;

+ 25 - 20
src/modules/Images360/tile/PanoRenderer.js

@@ -311,7 +311,7 @@ class PanoRenderer extends EventDispatcher{
             if(i){
                 this.uploadTile(e, !1)//提交
             }else{
-                if(this.shoulPushToFrontOfQueue(e)){
+                if(this.shoulPushToFrontOfQueue(e)){//如果是512的优先
                     this.forceQueue.push(e)
                 }else{
                     if(t && this.direction){
@@ -321,12 +321,7 @@ class PanoRenderer extends EventDispatcher{
                 e.uploadQueued = !0 
                 this.uploadInterval || this.uploadIntervalCancelled || this.refreshUploadInterval(0)
             }
-            
-            
-            
-            /* i ? this.uploadTile(e, !1) : (this.shoulPushToFrontOfQueue(e) ? this.forceQueue.push(e) : t && this.direction ? TilePrioritizer.insertSortedPanoTile(r, e, n.pano, this.direction) : r.push(e),
-                e.uploadQueued = !0,
-                this.uploadInterval || this.uploadIntervalCancelled || this.refreshUploadInterval(0)) */
+             
         }
     }
 
@@ -389,15 +384,18 @@ class PanoRenderer extends EventDispatcher{
         }
     }
 
-
-    updateUploadQueue(e, t) {
-        e || (e = 1);
+        
+    updateUploadQueue(maxNPF,maxPF/* e, t */) {//参数是 maxNonBaseUploadsPerFrame and maxBaseUploadsPerFrame, 优先上传512
+        maxNPF || (maxNPF = 1);
         for (var i = 0, n = 0;;) {
-            if (n >= t || i >= e)
+            let old = this.forceQueue.slice(0)
+           
+            if (n >= maxPF || i >= maxNPF)
                 break;
             var r = this.getNextFromUploadQueue();
             if (!r)
                 break;
+            //r.panoSize <2048 && console.log('panoId', r.panoId, 'panoSize', r.panoSize , old)
             0 !== r.level ? i++ : n++
             if (!(r.panoSize > this.qualityManager.getMaxNavPanoSize()) || this.zoomingActive) {
                 var o = this.getActiveRenderTargetDescriptor(r.panoId);
@@ -797,12 +795,12 @@ PanoRenderer.prototype.renderPanoTiles = function () {
         for (var a = 0; a < TileUtils.FACES_PER_PANO; a++) {
             var s = this.getTileTree(panoId, a);
             e.length = 0 
-            s.breadthFirst({//获取所有node?
+            s.breadthFirst({//获取所有node?  85个
                 saveVisited: e
             });
             for (var l = 0; l < e.length; l++) {
                 var c = e[l];
-                this.queueTileUpload(c.tile, !1, r || 0 === l && n)//???
+                this.queueTileUpload(c.tile, !1, r || 0 === l && n)//为什么第0个会直接uploadTile??
             }
         }
         this.updateDirection(i)
@@ -895,10 +893,10 @@ PanoRenderer.prototype.uploadTile = function () {//重写
         
         if (p) {
              
-            if(failHistory[''+id+ panoSize+ tileIndex]){
+             if(failHistory[''+id+ panoSize+ tileIndex]){
                 console.log('uploadTile retry',id, panoSize, tileIndex)
             } 
-            console.log('uploadTile 成功', id, panoSize, tileIndex) 
+            /*console.log('uploadTile 成功', id, panoSize, tileIndex) */  
 
             var C = tileX * tileSize,
                 I = tileY * tileSize,
@@ -935,8 +933,13 @@ PanoRenderer.prototype.uploadTile = function () {//重写
             this.setUploaded(info, !0);
             this.addCoverageForNode(info.node);
         } else {
-            console.log('uploadTile  失败', id, panoSize, tileIndex)
+            //console.log('uploadTile  失败', id, panoSize, tileIndex)
+            if(panoSize == 512){
+                console.log("512 失败!!!!!!!!!!!!!")
+            } 
             failHistory[''+id+ panoSize+ tileIndex] = true; 
+            
+            
             this.setUploaded(info, !1);
             
             //发现如果不预加载512,512很可能在1024加载了之后才加载,然后g = true,就不会发送TileRenderSuccess,导致该pano一直loading。但现在应该很难出现这种情况
@@ -1170,10 +1173,12 @@ PanoRenderer.prototype.copyCubeMap = function() {//将texture渲染到zoomRender
 
 
 
-
-
-
-
+/* 
+forceQueue在tiledownloader和panorenderer都有。
+forceQueue 的应该就是优先下载的吧,按理说一定要先下载完才能下载后面的在 
+在panoRenderer中 uploadQueues 是候补队列 ,在tileDownloader里priorityQueue是候补队列
+tiledownloader下载完成会触发tiledownloader开始uploadTile.
+ */
 
 
 export default PanoRenderer

+ 44 - 12
src/modules/Images360/tile/TileDownloader.js

@@ -11,6 +11,14 @@ import {
 } from '../../../utils/request'
 import { EventDispatcher } from "../../../EventDispatcher.js";
 
+
+
+window.downloaded = {}
+window.startdownloads = [];
+
+
+
+
 class TileDownloader extends EventDispatcher{
     constructor( ) {
         super()
@@ -154,8 +162,19 @@ class TileDownloader extends EventDispatcher{
 
             for (var n = 0, r = 0; n < i && e.length > 0; r++) {
                 var o = e.shift();
-                o && (this.startDownload(o),
-                    n++)
+                
+                
+                if(o){
+                    //add 为了防止1024的在512前下载完,这里强行等待512下载完毕再开始下载
+                    if(o.panoSize > 512 && !this.isPanoDownloaded(o.pano, 512) ){
+                        //console.log('512的还没下载好呢!')
+                        break;//一般512的都是连续下载的,所以后面就都不是512了直接中断 
+                    }
+                    
+                    this.startDownload(o)
+                    n++
+                }
+                
             }
         }
     }
@@ -182,6 +201,9 @@ class TileDownloader extends EventDispatcher{
 
     startDownload(e) {//开始下载啦
         //console.log('startDownload')
+        
+        startdownloads.push(e)
+        
         e.status = DownloadStatus.Downloading;
         var t = this.getTileUrl(e/* e.pano.id, e.panoSize, e.tileSize, e.tileIndex, e.pano.alignmentType */);//xzw add alignmentType
         if(!t)return;
@@ -209,15 +231,25 @@ class TileDownloader extends EventDispatcher{
                 tileY: e.tileY,
                 direction: e.direction
             };
+            
+            downloaded[e.pano.id] || (downloaded[e.pano.id]={512:[],1024:[],2048:[]})
+            downloaded[e.pano.id][e.panoSize] || (downloaded[e.pano.id][e.panoSize] = [])
+            downloaded[e.pano.id][e.panoSize].push(e)
+            if(e.panoSize != 512 && downloaded[e.pano.id][512].length<6){
+                console.warn('没下完')
+            }
+            
+            
+            
             e.image = t,
-                this.dispatchEvent({type:TileDownloaderEvents.TileDownloadSuccess, desc:n} ),
-                this.isPanoDownloaded(e.pano, e.panoSize) && (n = {
-                        panoId: e.pano.id,
-                        tileSize: e.tileSize,
-                        panoSize: e.panoSize
-                    },
-                    this.dispatchEvent({type:TileDownloaderEvents.PanoDownloadComplete, desc:n}),
-                    i && i.onLoad && i.onLoad(e.pano, e.panoSize))
+            this.dispatchEvent({type:TileDownloaderEvents.TileDownloadSuccess, desc:n} ) 
+            this.isPanoDownloaded(e.pano, e.panoSize) && (n = {
+                    panoId: e.pano.id,
+                    tileSize: e.tileSize,
+                    panoSize: e.panoSize
+                },
+                this.dispatchEvent({type:TileDownloaderEvents.PanoDownloadComplete, desc:n}),
+                i && i.onLoad && i.onLoad(e.pano, e.panoSize))
         //}
     }
 
@@ -340,9 +372,9 @@ TileDownloader.prototype.forceQueueTilesForPano = function() {//根据条件开
         for (var A = 0; A < e.length; A++){
             this.forceQueue.push(e[A]);         //装载
         }
-        if(e.length){
+        /* if(e.length){
             console.log(e)
-        }
+        } */
         
         this.setStatusForAllDescriptors(this.forceQueue, DownloadStatus.ForceQueued);
         this.clearFromQueue(this.priorityQueue, DownloadStatus.ForceQueued, !1);

+ 27 - 17
src/modules/Images360/tile/TilePrioritizer.js

@@ -202,7 +202,7 @@ TilePrioritizer.insertSortedPanoTile = function (e, t, pano, dir) {
 };
 
 
-TilePrioritizer.prototype.filterAndPrioritize = function () {//挑选出优先加载的  (有点复杂,没看很懂)
+TilePrioritizer.prototype.filterAndPrioritize = function () {//挑选出优先加载的 pano和tile (有点复杂,没看很懂)
     var e = [],
         t = [],
         i = [];
@@ -234,49 +234,59 @@ TilePrioritizer.prototype.filterAndPrioritize = function () {//挑选出优先
             c = this.highSize //2048
             ,
             h = this.ultraHighSize; //4096
-        this.queueTilesForPano(queue, tileDownloader, this.priorityCriteria.pano, s);
-        if (this.priorityCriteria.upcomingPanos) {//即将走到的,之前用于导览路线
+            
+            
+        this.queueTilesForPano(queue, tileDownloader, this.priorityCriteria.pano, s);  //把当前pano的512下载了
+        
+        
+        if (this.priorityCriteria.upcomingPanos) {// 添加即将走到的点(之前用于导览路线)512 tiles
             this.queueTilesForPanos(queue, this.priorityCriteria.upcomingPanos, tileDownloader, s, TilePrioritizer.MAX_UPCOMING_PANOS_TOADD);
         }
         i.length = 0;
-        if (this.canDownloadSize(l)) {//l没超过最大size限制的话
+        
+        //把当前pano角度范围内的tile按照分辨率从低到高加入队列
+        
+        if (this.canDownloadSize(l)) {//1024如果在限制范围内的话
             this.queueTilesInDirectionForPano(i, tileDownloader, this.priorityCriteria.pano, l, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDirs, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
-        }
-
-        TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDirs);
+        } 
+        TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDirs); //排序
         TilePrioritizer.appendQueue(queue, i);
+        
+        //添加邻近点t 512的tiles
         this.queueTilesForPanos(queue, t, tileDownloader, s, TilePrioritizer.MAX_SCORED_PANOS_TOADD);
         i.length = 0;
         
         
         //NARROW    :
-        if (this.canDownloadSize(c)) {
+        if (this.canDownloadSize(c)) {//2048
             this.queueTilesInDirectionForPano(i, tileDownloader, this.priorityCriteria.pano, c, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDirs, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
         }
 
-        if (this.canDownloadSize(h)) {
+        if (this.canDownloadSize(h)) {//4096
             this.queueTilesInDirectionForPano(i, tileDownloader, this.priorityCriteria.pano, h, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDirs, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
-        }
-
-        TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDirs);
+        } 
+        TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDirs);//排序
         TilePrioritizer.appendQueue(queue, i);
         i.length = 0;
 
-        if (this.canDownloadSize(l)) {
+        if (this.canDownloadSize(l)) {//1024
             this.queueTilesInDirectionForPano(i, tileDownloader, this.priorityCriteria.pano, l, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDirs, TilePrioritizer.DIRECTIONAL_FOV);
         }
 
-        if (this.canDownloadSize(c)) {
+        if (this.canDownloadSize(c)) {//2048
             this.queueTilesInDirectionForPano(i, tileDownloader, this.priorityCriteria.pano, c, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDirs, TilePrioritizer.DIRECTIONAL_FOV);
         }
 
-        if (this.canDownloadSize(h)) {
+        if (this.canDownloadSize(h)) {//4096
             this.queueTilesInDirectionForPano(i, tileDownloader, this.priorityCriteria.pano, h, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDirs, TilePrioritizer.DIRECTIONAL_FOV);
         }
 
-        TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDirs);
+        TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDirs);//排序
         TilePrioritizer.appendQueue(queue, i);
-        this.queueTilesForPanos(queue, e, tileDownloader, s);
+        
+        
+        
+        this.queueTilesForPanos(queue, e, tileDownloader, s); // 如果前面有populateNeighborPanos的话,这步就是加neibour
     }
 }()
 TilePrioritizer.prototype.queueTilesInDirectionForPano = function () {

+ 7 - 3
src/settings.js

@@ -96,10 +96,14 @@ const config = {//配置参数   不可修改
     
     
     pointDensity:{
-        panorama:{//显示全景时的漫游。因为点只能显示1个像素的大小,所以必须很密集,但又要限制点的数量
+        magnifier:{  
             maxLevelPercent: 1,
-            pointBudget :   0.25*1000*1000,  //点云总最大数
+            pointBudget : 8*1000*1000, 
         },
+        panorama:{//显示全景时的漫游。因为点只能显示1个像素的大小,所以必须很密集,但又要限制点的数量
+            maxLevelPercent: 1,
+            pointBudget : browser.isMobile ?  0.1*1000*1000 :  0.25*1000*1000,  //点云总最大数
+        }, 
         fourViewports:{//分四屏时防止卡顿
             maxLevelPercent: 0.5,  
             pointBudget :0.25*1000*1000, // 只要限制这个就足够 (为什么分屏focus区域不同会闪烁,navvis不会)(navvis:maxLevel:5,pointBudget:1*1000*1000)
@@ -172,7 +176,7 @@ const config = {//配置参数   不可修改
         minSize: 0.1,
         maxSize: 10000,
         pointSizeType: 'ATTENUATED', //'ADAPTIVE'//'ADAPTIVE' \ FIXED //ADAPTIVE的在小房间里大小会不太匹配,但在远景似乎更好
-        absolutePanoramaSize: 0.005,//全景漫游时的size
+        absolutePanoramaSize: 2 ,//全景漫游时的size  是fixed的模式
         //ADAPTIVE : 字会失真扭曲
         //'ATTENUATED' 往旁边看有缝隙、点在浮动
         //navvis的shader在哪里 为什么不会抖动

+ 1 - 1
src/start.js

@@ -191,7 +191,7 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
                     
                     material.minSize =  config.minSize
                     material.maxSize =  config.maxSize   
-                    material.pointSizeType = Potree.PointSizeType[config.pointSizeType]//Potree.PointSizeType.ADAPTIVE;//FIXED
+                    material.pointSizeType = config.pointSizeType //Potree.PointSizeType[config.pointSizeType]//Potree.PointSizeType.ADAPTIVE;//FIXED
                     pointcloud.changePointSize(config.pointSize)  //material.size =  config.pointSize;
                     pointcloud.changePointOpacity(1)
                     material.shape = Potree.PointShape.SQUARE; 

+ 2 - 2
src/utils.js

@@ -1248,12 +1248,12 @@ Utils.QuaternionFactory = {
     
 }
  
- 
+  
 Utils.datasetPosTransform = function(o={}){  
     let pointcloud = o.pointcloud || viewer.scene.pointclouds.find(e=>e.dataset_id == o.datasetId)
-    let tranMatrix = o.fromDataset ? pointcloud.transformMatrix : pointcloud.transformInvMatrix
     
     if(pointcloud){ 
+        let tranMatrix = o.fromDataset ? pointcloud.transformMatrix : pointcloud.transformInvMatrix
         return (new THREE.Vector3).copy(o.position).applyMatrix4(tranMatrix)
         
     }else{

+ 34 - 4
src/utils/Magnifier.js

@@ -34,6 +34,29 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
         })
         this.viewport.setResolution(this.width, this.height,0,0)
         
+        {//使放大镜里的pointDensity是'magnifier', 最高质量。
+            let density
+            let sizeType
+            this.viewport.beforeRender = ()=>{
+                density = Potree.settings.pointDensity 
+                Potree.settings.pointDensity = 'magnifier' 
+                 
+                viewer.scene.pointclouds.forEach(e=>{//因为全景模式的pointSizeType是fixed所以要还原下
+                    sizeType = e.material.pointSizeType  
+                    e.material.pointSizeType = Potree.config.material.pointSizeType  
+                })
+            };
+            this.viewport.afterRender = ()=>{
+                Potree.settings.pointDensity = density
+                
+                viewer.scene.pointclouds.forEach(e=>{
+                    e.material.pointSizeType = sizeType
+                })
+            } 
+        }
+        
+        
+        
         
         this.renderTarget = new THREE.WebGLRenderTarget(this.width,this.height, { 
             minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter,
@@ -89,9 +112,12 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
         viewer.setObjectLayers(this, 'magnifier' )
         //viewer.inputHandler.addInputListener(this)
         
+        
+        
+        
         viewer.addEventListener('camera_changed',(e)=>{ // 平移、滚轮时更新
-            if(e.viewport == viewer.mainViewport) this.update()
-        })
+            if(e.viewport == viewer.mainViewport) this.update() //不过intersectPoint没更新 
+        }) 
             
 
         
@@ -135,6 +161,10 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
          
         this.addEventListener("setEnable",(e)=>{
             viewer.updateVisible(this, "enable", e.value) //界面开关
+            /* if(Potree.settings.displayMode == 'showPanos') && e.value){
+                Potree.settings.pointDensity = 'magnifier'
+            }else if() */
+            
         })
          
          
@@ -156,7 +186,7 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
     
     
     update(aimPos){//相机靠近 navvis的做法
-        
+        var dontRender = this.dontRender || !(aimPos instanceof THREE.Vector3)
         aimPos = aimPos instanceof THREE.Vector3 ?  aimPos : this.aimPos
         if(!aimPos  || !this.visible)return
         
@@ -201,7 +231,7 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
         })
         this.scale.set(scale, scale, scale); 
  
-        if(!this.dontRender){
+        if(!dontRender){
             this.waitRender = true
         } 
     

+ 2 - 4
src/viewer/View.js

@@ -39,10 +39,8 @@ export class View{
     }
      
     set rotation(rotation){
-        if(rotation.order != "ZXY")rotation.reorder("ZXY")
-        this.pitch = rotation.x - Math.PI / 2;
-        this.yaw = rotation.z
-        
+        //因为 rotation的y不一定是0 , 所以不能直接逆着写。
+        this.direction = new THREE.Vector3(0,0,-1).applyEuler(rotation)
     }
     
    

+ 10 - 9
src/viewer/map/Map.js

@@ -552,19 +552,21 @@ proj4.defs("EPSG:3857", "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +
 export class TiledMapOpenStreetMap extends TiledMapBase{
     constructor(mapLayer, tileColor){
         super('map', mapLayer, tileColor, /* "EPSG:4550" */  "EPSG:3857"  ) //EPSG projection
-        this.baseUrl = "https://wprd03.is.autonavi.com/appmaptile?style=7&x=${x}&y=${y}&z=${z}",
+        //this.baseUrl = "https://wprd03.is.autonavi.com/appmaptile?style=7&x=${x}&y=${y}&z=${z}",
         //this.baseUrl = "https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x=${x}&y=${y}&z=${z}" //最高只到18 level
+        this.baseUrl = "https://wprd04.is.autonavi.com/appmaptile?lang=zh_cn&style=7&x=${x}&y=${y}&z=${z}"    //最高只到19
+        
         this.attribution = "© PopSmart,  © 高德地图",
         this.tileSizePx = 256
         this.mapSizeM = 40075017
-        this.maxDepth = 20
+        this.maxDepth = 19//20
         this.bias = 0.5 
          
-      
+  
             
     }
     
-    getTileUrl(t, e, n){
+    getTileUrl(t, e, n){ 
         return this.baseUrl.replace(/\${z}/, t.toString(10)).replace(/\${x}/, e.toString(10)).replace(/\${y}/, n.toString(10))
     }
      
@@ -586,14 +588,13 @@ export class TiledMapFromEntity extends TiledMapBase{
         super('floorplan', mapLayer, tileColor,  "NAVVIS:TMERC"   /* "EPSG:3857"  *//* "WGS84" */)  //直接就是本地坐标,没有projec 
         
          
-        var entity = this.fillFromData(data) 
-         
-        this.tiledMapEntity = entity
-        //c.RestService = s,
+        let entity = this.tiledMapEntity = this.fillFromData(data)  
+        let time = entity.updateTime || entity.createTime  
+          
         this.tileSizePx = entity.tileSizePx,
         this.mapSizeM = entity.mapSizeM,
         this.maxDepth = entity.maxDepth;
-        this.postStamp = entity.updateTime ? entity.updateTime.replace(/[^0-9]/ig,'') : (new Date).getTime()   
+        this.postStamp = time ? time.replace(/[^0-9]/ig,'') : (new Date).getTime()   
         //this.projection = n.crsLocal,
         this.zIndex = 0, 
         this.tilePresenceMap = this.decodeBitStream(this.tiledMapEntity.quadtree) //包含tile分裂信息,如果写错了会造成tile显示不全

+ 14 - 4
src/viewer/viewer.js

@@ -471,8 +471,16 @@ export class Viewer extends ViewerBase{
                 },
                 set: (density)=>{
                     if(density && density != pointDensity){  
+                        let pointBudget;
                         var config = Potree.config.pointDensity[density];
-                        viewer.setPointBudget(config.pointBudget );
+                        
+                        if(this.magnifier.visible){//放大镜打开时不要切换pointBudget,否则点云会闪烁。这时使用最高密度。
+                            pointBudget = Potree.config.pointDensity['magnifier'].pointBudget
+                        }else{
+                            pointBudget = config.pointBudget
+                        }
+                        
+                        viewer.setPointBudget(pointBudget );
                         //Potree.maxPointLevel = config.maxLevel
                         
                         pointDensity = density
@@ -559,14 +567,14 @@ export class Viewer extends ViewerBase{
     
     
     setPointLevel(){
-        
-        var config = Potree.config.pointDensity[Potree.settings.pointDensity];
+        var pointDensity = Potree.settings.pointDensity
+        var config = Potree.config.pointDensity[pointDensity];
         this.scene.pointclouds.forEach(e=>{
             if(this.testingMaxLevel){
                 e.maxLevel = 12;//先加载到最大的直到测试完毕。由于5个level为一组来加载,所以如果写4最高能加载到5,如果写5最高能加载到下一个级别的最高也就是10
                 //console.log('maxLevel: '+e.maxLevel +  ' testingMaxLevel中 '  )                                
             }else{
-                let percent = (Potree.settings.displayMode == 'showPanos') ? config.maxLevelPercent :  (Potree.settings.UserDensityPercent == void 0 ? config.maxLevelPercent : Potree.settings.UserDensityPercent)
+                let percent = (pointDensity == 'panorama' || 'magnifier') ? config.maxLevelPercent :  (Potree.settings.UserDensityPercent == void 0 ? config.maxLevelPercent : Potree.settings.UserDensityPercent)
                 e.maxLevel = Math.round( percent * e.nodeMaxLevel); 
                 console.log('maxLevel: '+e.maxLevel +  ',   density : '+Potree.settings.pointDensity,  ",  percent :"+percent);
                 
@@ -2535,6 +2543,8 @@ export class Viewer extends ViewerBase{
                 }
                 
                 this.renderOverlay(params) 
+                
+                view.afterRender && view.afterRender(view)
             }