|
@@ -430,7 +430,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
|
|
|
- this.fxaaPass = new ShaderPass( FXAAShader );
|
|
|
+ /* this.fxaaPass = new ShaderPass( FXAAShader );
|
|
|
this.fxaaPass.readTarget = true //add
|
|
|
this.fxaaPass.setSize = function(width, height){
|
|
|
this.material.uniforms[ 'resolution' ].value.x = 1 / ( width ) ;
|
|
@@ -438,7 +438,7 @@ export class Viewer extends ViewerBase{
|
|
|
}
|
|
|
this.fxaaPass.renderToScreen = true;
|
|
|
|
|
|
- this.composer.addPass( this.fxaaPass );
|
|
|
+ this.composer.addPass( this.fxaaPass ); */
|
|
|
//抗锯齿截图 效果时而好时而不好,文字比较模糊
|
|
|
|
|
|
|
|
@@ -3188,17 +3188,9 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
|
|
|
- if(params_.screenshot){ //抗锯齿
|
|
|
- /* params_.target.viewport.set(0, 0, params_.target.width, params_.target.height);
|
|
|
- //scissorTest && params_.target.scissor.set(left, bottom, width, height);
|
|
|
- params_.target.scissorTest = false
|
|
|
- this.renderer.setRenderTarget(params_.target)
|
|
|
- this.composer.render();
|
|
|
- this.renderer.setRenderTarget(params_.target) //本想再画一层标签,但是viewport总是出错 */
|
|
|
-
|
|
|
- this.composer.render();
|
|
|
-
|
|
|
- }
|
|
|
+ /* if(params_.screenshot){ //抗锯齿
|
|
|
+ this.composer.render();
|
|
|
+ } */
|
|
|
|
|
|
|
|
|
this.renderer.setRenderTarget(null)
|
|
@@ -3416,7 +3408,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
Potree.settings.useRTPoint = !(SiteModel.editing && SiteModel.selected && SiteModel.selected.buildType == 'room' )//空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
|
|
|
|
|
|
- Potree.settings.pointEnableRT = this.scene.measurements.length > 0 || !Potree.settings.useRTPoint
|
|
|
+ Potree.settings.pointEnableRT = !this.screenshoting && (this.scene.measurements.length > 0 || !Potree.settings.useRTPoint )
|
|
|
|
|
|
|
|
|
if(vrActive){
|
|
@@ -3491,8 +3483,16 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
this.needRender = true
|
|
|
|
|
|
- let { dataUrl } = viewerMaster.makeScreenshot( new THREE.Vector2(width,height), null, compressRatio );
|
|
|
-
|
|
|
+ if(info.useRenderTarget){
|
|
|
+ //离屏渲染 有抗锯齿问题、在手机上速度慢
|
|
|
+ var { dataUrl } = viewerMaster.makeScreenshot( new THREE.Vector2(width,height), null, compressRatio );
|
|
|
+
|
|
|
+ }else{
|
|
|
+ //直接渲染 会改变canvas大小
|
|
|
+ let canvas = this.renderArea.getElementsByTagName('canvas')[0]
|
|
|
+ this.render({ screenshot : true, width , height, resize :true }); //需要resize
|
|
|
+ var dataUrl = canvas.toDataURL('image/jpeg',compressRatio)
|
|
|
+ }
|
|
|
|
|
|
|
|
|
if(!Potree.settings.isOfficial){
|
|
@@ -3505,8 +3505,8 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
oldStates.viewports.forEach(old=>{//恢复相机
|
|
|
var viewport = viewports.find(v=>v.name == old.name);
|
|
|
- viewport.left = old.left;
|
|
|
- viewport.width = old.width;
|
|
|
+ viewport.left = old.left; viewport.bottom = old.bottom;
|
|
|
+ viewport.width = old.width; viewport.height = old.height
|
|
|
viewport.view.copy(old.view)
|
|
|
viewport.view.applyToCamera(viewport.camera);
|
|
|
|
|
@@ -3526,18 +3526,26 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
finishDeferred.resolve({dataUrl, pose})
|
|
|
|
|
|
- console.log('screenshot done: '+sid)
|
|
|
- }
|
|
|
-
|
|
|
- {//恢复:
|
|
|
-
|
|
|
+
|
|
|
setTimeout(()=>{
|
|
|
if(!this.screenshoting){
|
|
|
- //otree.settings.pointNoLimit = false
|
|
|
+ //Potree.settings.pointNoLimit = false
|
|
|
Potree.settings.pointDensity = 'high'
|
|
|
+ console.warn('恢复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))
|
|
@@ -3556,9 +3564,13 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
if(oldStates.attachedToViewer != this.mapViewer.attachedToViewer){
|
|
|
if(info.type == 'measure'){
|
|
|
- this.mapViewer.attachToMainViewer(false )
|
|
|
+ this.mapViewer.attachToMainViewer(false )
|
|
|
}
|
|
|
}
|
|
|
+ if(this.mapViewer.splitDir != oldStates.oldSplitDir){
|
|
|
+ this.mapViewer.changeSplitScreenDir(oldStates.oldSplitDir)
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
|
|
|
mapViewport.camera.zoom = oldStates.mapZoom
|
|
@@ -3629,29 +3641,65 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
let waitPointLoad = (done)=>{
|
|
|
- done = done || screenshot
|
|
|
- let maxTime = 4000;
|
|
|
+ let finish
|
|
|
+ done = done || screenshot
|
|
|
+ let dealDone = ()=>{
|
|
|
+ //viewer.removeEventListener('overPointBudget',decreaseLevel)
|
|
|
+ finish || done()
|
|
|
+ finish = true
|
|
|
+ }
|
|
|
+ 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.warn('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 */
|
|
|
+ }
|
|
|
+ if(Potree.settings.displayMode == 'showPointCloud'){
|
|
|
+ viewer.updateScreenSize({forceUpdateSize:true, width, height})//需要先setSize才能加载范围内的点云
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ let maxTime = 3000
|
|
|
setTimeout(()=>{
|
|
|
- if(Potree.pointsLoading){//如果还在加载
|
|
|
- let finish
|
|
|
+ if(Potree.pointsLoading && Potree.settings.displayMode == 'showPointCloud'){//如果还在加载
|
|
|
|
|
|
- viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确)
|
|
|
- finish || done()
|
|
|
- finish = true
|
|
|
+ viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确)
|
|
|
+ if(!finish)console.warn('加载完毕', ' numVisiblePoints', Potree.numVisiblePoints)
|
|
|
+ dealDone()
|
|
|
},{once:true})
|
|
|
-
|
|
|
- setTimeout(()=>{//超时不候
|
|
|
- finish || done()
|
|
|
- finish = true
|
|
|
+ let lastNumVisiblePoints
|
|
|
+ /* { //perspective的不需要,远处加载不完也没大碍
|
|
|
+ setTimeout(()=>{//超时不候
|
|
|
+ if(!finish ){
|
|
|
+ console.warn('加载时间达最长限制的50%,降level, numVisiblePoints', Potree.numVisiblePoints)
|
|
|
+ lastNumVisiblePoints = Potree.numVisiblePoints
|
|
|
+ decreaseLevel() //加载时间过长
|
|
|
+ }
|
|
|
+ },maxTime*0.5)
|
|
|
+ setTimeout(()=>{// 第一次降有可能没效果,因为大部分level不是最高的
|
|
|
+ console.warn('加载时间达最长限制的60%,numVisiblePoints', Potree.numVisiblePoints)
|
|
|
+ if(!finish && (Potree.numVisiblePoints - lastNumVisiblePoints) > -20000 ){ //没怎么降
|
|
|
+ console.warn('加载时间达最长限制的60%,降level, numVisiblePoints', Potree.numVisiblePoints)
|
|
|
+ decreaseLevel() //加载时间过长
|
|
|
+ }
|
|
|
+ },maxTime*0.6)
|
|
|
+ } */
|
|
|
+ setTimeout(()=>{//超时不候
|
|
|
+ if(!finish)console.warn('超时, numVisiblePoints', Potree.numVisiblePoints)
|
|
|
+ dealDone()
|
|
|
},maxTime)
|
|
|
}else{
|
|
|
- done()
|
|
|
+ dealDone()
|
|
|
}
|
|
|
},200)//先加载一段时间
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
|
|
|
let waitPointsTime = Potree.settings.displayMode == 'showPointCloud' ? 300 : 0 //等点云加载
|
|
|
|
|
@@ -3663,7 +3711,8 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
//因为分屏后位置才最终确定,才能确定是否显示出floorplan所以先分屏
|
|
|
if(Potree.settings.floorplanEnable){
|
|
|
- this.mapViewer.attachToMainViewer(true, 'measure', 0.5 )
|
|
|
+ oldStates.oldSplitDir = this.mapViewer.splitDir
|
|
|
+ this.mapViewer.attachToMainViewer(true, 'measure', 0.5 , {dir:'leftRight'} )
|
|
|
}
|
|
|
viewer.updateScreenSize({forceUpdateSize:true, width, height}) //更新viewports相机透视 使focusOnObject在此窗口大小下
|
|
|
|
|
@@ -3696,7 +3745,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
//console.log('currentFloor', this.modules.SiteModel.currentFloor, 'currentDataset', this.atDatasets )
|
|
|
|
|
|
- let floorplanShowed = this.mapViewer.mapLayer.maps.some(e => e.name.includes('floorplan') && e.objectGroup.visible)
|
|
|
+ let floorplanShowed = this.mapViewer.mapLayer.maps.some(e => e.name.includes('floorplan') && e.objectGroup.visible)//如果没有floorplan展示就不分屏(如果focus时飞出数据集从而不展示怎么办。尤其是俯瞰比较长的线时容易这样,或许要根据其所在数据集强制显示)
|
|
|
if(!floorplanShowed && this.mapViewer.attachedToViewer){
|
|
|
this.mapViewer.attachToMainViewer(false) //取消分屏
|
|
|
viewer.updateScreenSize({forceUpdateSize:true, width, height}) //更新viewports相机透视
|