import * as THREE from "../../../../../libs/three.js/build/three.module.js"; import browser from '../../../utils/browser.js' import {settings,config} from '../../../settings.js' let {ModelManagerEvents,PanoSizeClass} = Potree.defines export default class QualityManager { constructor(e, t, i) { this.maxNavPanoSize = -1; this.maxZoomPanoSize = -1; this.devicePixelDensity = e; this.deviceScreenSize = t; this.clientBandwidth = i; this.panoSizeClassMap = {}; this.useHighResolutionPanos = !0; //是否能够使用2k及以上图 this.useUltraHighResolutionPanos = !1; this.modelHasUltraHighPanos = !1; this.qualityManager = this; //this.init() viewer.addEventListener('allLoaded',this.init.bind(this),{importance:10}) } init(e ) { //var metadata = store.getters['scene/metadata'] ;//有时候请求不到 //if(metadata.sceneSource == 11 || metadata.sceneScheme == 12){ /* if(config.tileClass == '1k'){ this.useHighResolutionPanos = false //xzw add 只加载1k } */ /* let resolution = '6k' if (resolution.indexOf('/') != -1) { resolution = resolution.split('/')[1] } Potree.settings.tileClass = parseInt(resolution) * 1024 */ let maxTileClass = 0 viewer.scene.pointclouds.forEach(e=>{ maxTileClass = Math.max(maxTileClass, e.tileClass) }) Potree.settings.tileClass = maxTileClass this.maxRenderTargetSize = browser.isMobile() ? 2048 : maxTileClass this.maxRenderTargetSize = Math.min( viewer.renderer.capabilities.maxCubemapSize, this.maxRenderTargetSize)//部分系统老浏览器只能2048 this.buildPanoSizeClassMap(this.devicePixelDensity, this.deviceScreenSize, this.clientBandwidth); this.ultraHighSize = this.getPanoSize(PanoSizeClass.ULTRAHIGH); this.highSize = this.getPanoSize(PanoSizeClass.HIGH); this.standardSize = this.getPanoSize(PanoSizeClass.STANDARD); this.baseSize = this.getPanoSize(PanoSizeClass.BASE); config.tiling.maxZoomPanoQuality && this.ultraHighSize <= config.tiling.maxZoomPanoQuality && (config.tiling.allowUltraHighResolution = !0); this.highQualityThreshold = browser.valueFromHash("threshold2k", config.windowHeightHighQualityThreshold); this.updateMaximums(); //e.on(ModelManagerEvents.ActiveModelChanged, this.onModelChanged.bind(this)); } updateFromModel(e) { //this.updateHighResolutionSettings(e) this.updateUltraHighResolutionSettings(e) } /* updateHighResolutionSettings(e) { this.useHighResolutionPanos = !0 this.updateMaximums() } */ updateUltraHighResolutionSettings(e) { if (config.tiling.allowUltraHighResolution && this.modelHasUltraHighPanos) { this.useUltraHighResolutionPanos = !0; } else { this.useUltraHighResolutionPanos = !1; } this.updateMaximums(); } enableUltraHighQualityMode() { this.modelHasUltraHighPanos = !0; this.updateUltraHighResolutionSettings(null); } ultraHighQualityModeEnabled() { return this.modelHasUltraHighPanos } onModelChanged(e) { this.updateFromModel(e.model), this.updateMaximums() } updateMaximums() { this.maxNavPanoSize = config.tiling.maxNavPanoQuality || this.detectMaxNavPanoSize(), this.maxZoomPanoSize = config.tiling.maxZoomPanoQuality || this.detectMaxZoomPanoSize(), this.maxZoomPanoSize < this.maxNavPanoSize && (this.maxNavPanoSize = this.maxZoomPanoSize) } buildPanoSizeClassMap() { this.panoSizeClassMap[PanoSizeClass.BASE] = 512, this.panoSizeClassMap[PanoSizeClass.STANDARD] = 1024, this.panoSizeClassMap[PanoSizeClass.HIGH] = 2048, this.panoSizeClassMap[PanoSizeClass.ULTRAHIGH] = Math.max(4096, Potree.settings.tileClass) } getPanoSize(e) { return this.panoSizeClassMap[e] } getMaxPossiblePanoSize() { return this.getPanoSize(PanoSizeClass.ULTRAHIGH) } getMaxPanoSize() { return this.maxZoomPanoSize } getMaxNavPanoSize() { return this.maxNavPanoSize } getMaxZoomPanoSize() { return this.maxZoomPanoSize } detectMaxNavPanoSizeClass() { //return this.useHighResolutionPanos ? browser.isMobile() ? PanoSizeClass.STANDARD : window.innerHeight < this.highQualityThreshold ? PanoSizeClass.STANDARD : PanoSizeClass.HIGH : PanoSizeClass.STANDARD /* if(config.name == 'decor'){ return PanoSizeClass.STANDARD } return PanoSizeClass.HIGH */ switch(Potree.settings.navTileClass){ case 1024: return PanoSizeClass.STANDARD; break; case 2048: default: return PanoSizeClass.HIGH; } } detectMaxNavPanoSize() { var e = this.detectMaxNavPanoSizeClass(); return this.getPanoSize(e) } detectMaxZoomPanoSize() { //获取当前zoomRenderTarget应下载的最高级别 //若是有三个级别,每次只需要加载到当前的zoomLevel;而两级时因为有zoomed来判断是使用基本贴图还是zoomRenderTarget,所以只需要返回最大的即可 if(this.zoomLevelResolution){//有三个级别 if(this.zoomLevelResolution == '4k' && this.useUltraHighResolutionPanos){ return this.getPanoSize(PanoSizeClass.ULTRAHIGH); }else if(this.zoomLevelResolution == '1k' || !this.useHighResolutionPanos){ return this.getPanoSize(PanoSizeClass.STANDARD); }else{ return this.getPanoSize(PanoSizeClass.HIGH); } }else{ if (this.useHighResolutionPanos) { /* if (browser.isMobile()) {//手机版如果要2k的将这里去掉 if (settings.tiling.mobileHighQualityOverride) { return this.getPanoSize(PanoSizeClass.HIGH); } else { return this.getPanoSize(PanoSizeClass.STANDARD); } } else */if (this.useUltraHighResolutionPanos ) { return this.getPanoSize(PanoSizeClass.ULTRAHIGH); } else { return this.getPanoSize(PanoSizeClass.HIGH); } } else { return this.getPanoSize(PanoSizeClass.STANDARD); } } } }