|
@@ -62548,7 +62548,7 @@ float getPointSize(){
|
|
|
if(uUseOrthographicCamera){
|
|
|
//pointSize = size * 100.0; //加个乘数
|
|
|
|
|
|
- pointSize = size / uOrthoWidth * resolution.x; //改成近似adaptive_point_size根据窗口缩放
|
|
|
+ pointSize = size / uOrthoWidth * resolution.x * 2.0; //改成近似adaptive_point_size根据窗口缩放
|
|
|
maxSize_ = 6.0; //for panoEditor, when zoom in, need more details, rather than always same size
|
|
|
|
|
|
}else{ //近大远小,模拟真实mesh,边缘放大
|
|
@@ -74161,11 +74161,10 @@ void main()
|
|
|
let maxLevel = pointcloud.maxLevel == void 0 ? Infinity : pointcloud.maxLevel;
|
|
|
let level = node.getLevel();
|
|
|
let visible = insideFrustum;
|
|
|
- visible = visible && (Potree.settings.pointNoLimit || !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget));
|
|
|
- visible = visible && (Potree.settings.pointNoLimit || !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget)); // pointcloud.pointBudget一直是Infinity
|
|
|
+ visible = visible && !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget);
|
|
|
+ visible = visible && !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget); // pointcloud.pointBudget一直是Infinity
|
|
|
visible = visible && level <= maxLevel; //< 改为 <=
|
|
|
- //visible = visible || node.getLevel() <= 2;
|
|
|
-
|
|
|
+ //visible = visible || node.getLevel() <= 2;
|
|
|
|
|
|
let intersectBox = (clipBox)=>{
|
|
|
|
|
@@ -74275,9 +74274,13 @@ void main()
|
|
|
}
|
|
|
|
|
|
if (!Potree.settings.pointNoLimit && numVisiblePoints + node.getNumPoints() > Potree.pointBudget) {
|
|
|
+ Potree.overPointBudget = true;
|
|
|
+ viewer.dispatchEvent('overPointBudget');
|
|
|
break;
|
|
|
}
|
|
|
-
|
|
|
+ Potree.overPointBudget = false;
|
|
|
+
|
|
|
+
|
|
|
if (!visible) {
|
|
|
continue;
|
|
|
}
|
|
@@ -74430,22 +74433,22 @@ void main()
|
|
|
unloadedGeometry[i].node.load(unloadedGeometry[i].pointcloud.pcoGeometry);
|
|
|
} */
|
|
|
|
|
|
- let maxNodesLoading = Common$1.getBestCount('unloadedGeometry', viewer.lastFrameChanged?1:3, 6, 4, 15 /* , true */ );//dur在iphoneX中静止有7,pc是2 //!lastFrameChanged静止时加速下载
|
|
|
+ let maxNodesLoading = Common$1.getBestCount('unloadedGeometry', viewer.lastFrameChanged?1:3, 10, 4, 15 /* , true */ );//dur在iphoneX中静止有7,pc是2 //!lastFrameChanged静止时加速下载
|
|
|
//THREE.Math.clamp(Math.round(9 - dur), 1, 6 )
|
|
|
-
|
|
|
+ //console.log('unloadedGeometry',unloadedGeometry.length, 'maxNodesLoading',maxNodesLoading)
|
|
|
//主要在手机端有效果。不改之前在展示的点云较多时前进会卡。
|
|
|
for (let i = 0; i < Math.min(maxNodesLoading, unloadedGeometry.length); i++) {
|
|
|
unloadedGeometry[i].node.load(unloadedGeometry[i].pointcloud.pcoGeometry);
|
|
|
}
|
|
|
if(!Potree.pointsLoading){
|
|
|
Potree.pointsLoading = true;
|
|
|
- console.log('startLoad');
|
|
|
+ //console.log('startLoad')
|
|
|
viewer.dispatchEvent('startLoadPoints');
|
|
|
}
|
|
|
}else {
|
|
|
if(Potree.pointsLoading){
|
|
|
Potree.pointsLoading = false;
|
|
|
- console.log('load done!');
|
|
|
+ //console.log('load done!')
|
|
|
setTimeout(()=>{
|
|
|
Potree.pointsLoading || viewer.dispatchEvent('pointsLoaded');
|
|
|
},50);
|
|
@@ -75420,10 +75423,10 @@ void main()
|
|
|
pointBudget:browser.isMobile() ? 4*1000*1000 : 6*1000*1000, //原本最高是8,但是大部分电脑都太卡了,降
|
|
|
minNodeSize : 40 / window.devicePixelRatio , //手机上因为像素点小,远一点的时候更需要加载密集的点云。(没事,有pointBudget限制着,会先从近处加载高级node,再远就不加载了)
|
|
|
},
|
|
|
- screenshot:{
|
|
|
- maxLevelPercent: 1,
|
|
|
+ screenshot:{ //调试:bdvt10002_202309041033308810
|
|
|
+ maxLevelPercent: 1,
|
|
|
pointBudget: 8*1000*1000,
|
|
|
- minNodeSize : 40 / window.devicePixelRatio ,
|
|
|
+ minNodeSize: 30 / window.devicePixelRatio ,
|
|
|
}
|
|
|
|
|
|
//数值由testLevelSteps得来,其中nodeMaxLevel为2时,low和middle的都是1,如果真有这么低的点云就单独处理下。
|
|
@@ -76611,7 +76614,7 @@ void main()
|
|
|
}
|
|
|
num_ = num_ / (Potree.config.material.realPointSize / Potree.config.material.pointSize); //兼容
|
|
|
|
|
|
- num_ = Math.pow(num_, 1.05) * 6;
|
|
|
+ num_ = Math.pow(num_, 1.05) * 5;
|
|
|
|
|
|
|
|
|
nodeMaxLevel = this.testMaxNodeCount >= Potree.config.testNodeCount1 ? this.nodeMaxLevel : this.nodeMaxLevelPredict.max; //防止刚开始因nodeMaxLevel没涨完,导致过大的点云突然出现
|
|
@@ -98216,7 +98219,14 @@ ENDSEC
|
|
|
if(viewer.scene.pointclouds.some(e=>e.panos.length == 0)){
|
|
|
//console.warn('存在数据集没有pano');
|
|
|
viewer.hasNoPanoDataset = true;
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* let floorList = this.panos.sort(a,b=>a.floorPosition.z - b.floorPosition.z)
|
|
|
+ let midH = floorList[Math.floor(this.panos.length/2)]
|
|
|
+ midH && (this.floorHeight = midH.floorPosition.z)
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
@@ -137248,8 +137258,7 @@ ENDSEC
|
|
|
};
|
|
|
|
|
|
let screenshot = ()=>{
|
|
|
- let pose;
|
|
|
-
|
|
|
+ let pose;
|
|
|
useMap && (viewer.mapViewer.needRender = true);
|
|
|
|
|
|
this.needRender = true;
|
|
@@ -137288,19 +137297,26 @@ ENDSEC
|
|
|
updateCamera();
|
|
|
|
|
|
finishDeferred.resolve({dataUrl, pose});
|
|
|
-
|
|
|
- console.log('screenshot done: '+sid);
|
|
|
- };
|
|
|
-
|
|
|
- {//恢复:
|
|
|
+
|
|
|
setTimeout(()=>{
|
|
|
if(!this.screenshoting){
|
|
|
- Potree.settings.pointNoLimit = false;
|
|
|
+ //Potree.settings.pointNoLimit = false
|
|
|
Potree.settings.pointDensity = 'high';
|
|
|
+ console.log('恢复pointDensity');
|
|
|
+ if(viewer.scene.pointclouds[0].material.oldSize_ ){
|
|
|
+ viewer.scene.pointclouds[0].material.size = viewer.scene.pointclouds[0].material.oldSize_;
|
|
|
+ viewer.scene.pointclouds[0].material.oldSize_ = null;
|
|
|
+ }
|
|
|
}
|
|
|
- },100); //延迟:避免连续多次截图时释放点云
|
|
|
+ },500); //延迟:避免连续多次截图时释放点云
|
|
|
this.screenshoting = false;
|
|
|
|
|
|
+ console.log('screenshot done: '+sid);
|
|
|
+ };
|
|
|
+
|
|
|
+ {//恢复:
|
|
|
+
|
|
|
+
|
|
|
|
|
|
if(info.type == 'measure'){
|
|
|
this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e, 'screenshot',true));
|
|
@@ -137414,8 +137430,77 @@ ENDSEC
|
|
|
|
|
|
|
|
|
//Potree.settings.pointNoLimit = true //使点云加载不受 pointBudget限制, 但缓存还是会有一个最大限制
|
|
|
- Potree.settings.pointDensity = 'screenshot';
|
|
|
+ Potree.settings.pointDensity = 'screenshot'; //提高pointBudget
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ let waitPointLoad = (done)=>{
|
|
|
+ let finish;
|
|
|
+ let dealDone = ()=>{
|
|
|
+ viewer.removeEventListener('overPointBudget',decreaseLevel);
|
|
|
+ finish || done();
|
|
|
+ finish = true;
|
|
|
+ };
|
|
|
+ done = done || screenshot;
|
|
|
+
|
|
|
+
|
|
|
+ //是否是俯视或仰视的视角,这样看马路等平面的话尽量每处点云level都一致不要密度不同:
|
|
|
+ let floorplanView = viewer.mainViewport.camera.type == 'OrthographicCamera';
|
|
|
+ if(!floorplanView){
|
|
|
+ let pano = this.images360.findNearestPano();
|
|
|
+ let dis = pano.position.distanceTo(this.mainViewport.camera.position);
|
|
|
+ if(dis > 3) floorplanView = true; //离远一点的平视希望也是全部加载好。勉强只能这么写
|
|
|
+ console.log('floorplanView',floorplanView);
|
|
|
+ }
|
|
|
+
|
|
|
+ let maxTime = floorplanView ? 10000 : 2000; //注意交通一般要截图两次,先截带测量线的
|
|
|
+ setTimeout(()=>{
|
|
|
+ if(Potree.pointsLoading && Potree.settings.displayMode == 'showPointCloud'){//如果还在加载
|
|
|
+ viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确)
|
|
|
+ if(!finish)console.log('加载完毕', ' numVisiblePoints', Potree.numVisiblePoints);
|
|
|
+ dealDone();
|
|
|
+ },{once:true});
|
|
|
+ let lastNumVisiblePoints;
|
|
|
+ if(floorplanView){ //perspective的不需要,远处加载不完也没大碍
|
|
|
+ setTimeout(()=>{//超时不候
|
|
|
+ if(!finish /* && Potree.numVisiblePoints > Potree.pointBudget * 0.7 */){
|
|
|
+ console.log('加载时间达最长限制的40%,降level, numVisiblePoints', Potree.numVisiblePoints);
|
|
|
+ lastNumVisiblePoints = Potree.numVisiblePoints;
|
|
|
+ decreaseLevel(); //加载时间过长
|
|
|
+ }
|
|
|
+ },maxTime*0.4);
|
|
|
+ setTimeout(()=>{// 第一次降有可能没效果,因为大部分level不是最高的
|
|
|
+ if(!finish && (Potree.numVisiblePoints - lastNumVisiblePoints) > -10000 ){ //没怎么降
|
|
|
+ console.log('加载时间达最长限制的50%,降level, numVisiblePoints', Potree.numVisiblePoints);
|
|
|
+ decreaseLevel(); //加载时间过长
|
|
|
+ }
|
|
|
+ },maxTime*0.5);
|
|
|
+ }
|
|
|
+ setTimeout(()=>{//超时不候
|
|
|
+ if(!finish)console.log('超时, numVisiblePoints', Potree.numVisiblePoints);
|
|
|
+ dealDone();
|
|
|
+ },maxTime);
|
|
|
+ }else {
|
|
|
+ dealDone();
|
|
|
+ }
|
|
|
+ },200);//先加载一段时间
|
|
|
+
|
|
|
+
|
|
|
+ let decreaseLevel = ()=>{ //降点云level
|
|
|
+ let levels = viewer.scene.pointclouds[0].visibleNodes.map(e=>e.getLevel());
|
|
|
+ console.log(levels);
|
|
|
+ let actMaxLevel = Math.max.apply(null, levels); //实际加载到的最高的node level
|
|
|
+ console.log('decreaseLevel, 新maxLevel', actMaxLevel - 1, '原maxlevel', viewer.scene.pointclouds[0].maxLevel, 'numVisiblePoints', Potree.numVisiblePoints);
|
|
|
+ viewer.scene.pointclouds[0].maxLevel = actMaxLevel - 1;
|
|
|
+ viewer.scene.pointclouds[0].material.oldSize_ = viewer.scene.pointclouds[0].material.size;
|
|
|
+ viewer.scene.pointclouds[0].material.size *= 1.5;
|
|
|
+ };
|
|
|
|
|
|
+ viewer.addEventListener('overPointBudget',decreaseLevel ); //因超出budget而无法加载的话
|
|
|
+
|
|
|
+
|
|
|
+ };
|
|
|
|
|
|
|
|
|
if(info.type == 'measure'){//要截图双屏
|
|
@@ -137471,22 +137556,8 @@ ENDSEC
|
|
|
|
|
|
});
|
|
|
|
|
|
- }else {
|
|
|
- //viewer.dispatchEvent('content_changed')
|
|
|
- setTimeout(()=>{
|
|
|
- if(Potree.pointsLoading){//如果还在加载
|
|
|
- viewer.addEventListener('pointsLoaded',()=>{
|
|
|
- screenshot();
|
|
|
- },{once:true});
|
|
|
- }else {
|
|
|
- screenshot();
|
|
|
- }
|
|
|
- },300);//先加载一段时间
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ }else {
|
|
|
+ waitPointLoad();
|
|
|
|
|
|
|
|
|
}
|
|
@@ -139538,7 +139609,7 @@ ENDSEC
|
|
|
let pointBudget = 1 * 1000 * 1000;
|
|
|
let framenumber = 0;
|
|
|
let numNodesLoading = 0;
|
|
|
- let maxNodesLoading = 4;
|
|
|
+ let maxNodesLoading = 6;
|
|
|
|
|
|
const debug = {};
|
|
|
|