QualityManager.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import * as THREE from "../../../../../libs/three.js/build/three.module.js";
  2. import browser from '../../../utils/browser.js'
  3. import {settings,config} from '../../../settings.js'
  4. let {ModelManagerEvents,PanoSizeClass} = Potree.defines
  5. export default class QualityManager {
  6. constructor(e, t, i) {
  7. this.maxNavPanoSize = -1;
  8. this.maxZoomPanoSize = -1;
  9. this.devicePixelDensity = e;
  10. this.deviceScreenSize = t;
  11. this.clientBandwidth = i;
  12. this.panoSizeClassMap = {};
  13. this.useHighResolutionPanos = !0; //是否能够使用2k及以上图
  14. this.useUltraHighResolutionPanos = !1;
  15. this.modelHasUltraHighPanos = !1;
  16. this.qualityManager = this;
  17. //this.init()
  18. viewer.addEventListener('allLoaded',this.init.bind(this),{importance:10})
  19. }
  20. init(e ) {
  21. //var metadata = store.getters['scene/metadata'] ;//有时候请求不到
  22. //if(metadata.sceneSource == 11 || metadata.sceneScheme == 12){
  23. /* if(config.tileClass == '1k'){
  24. this.useHighResolutionPanos = false //xzw add 只加载1k
  25. } */
  26. /* let resolution = '6k'
  27. if (resolution.indexOf('/') != -1) {
  28. resolution = resolution.split('/')[1]
  29. }
  30. Potree.settings.tileClass = parseInt(resolution) * 1024 */
  31. let maxTileClass = 0
  32. viewer.scene.pointclouds.forEach(e=>{
  33. maxTileClass = Math.max(maxTileClass, e.tileClass)
  34. })
  35. Potree.settings.tileClass = maxTileClass
  36. this.maxRenderTargetSize = browser.isMobile() ? 2048 : maxTileClass
  37. this.maxRenderTargetSize = Math.min( viewer.renderer.capabilities.maxCubemapSize, this.maxRenderTargetSize)//部分系统老浏览器只能2048
  38. this.buildPanoSizeClassMap(this.devicePixelDensity, this.deviceScreenSize, this.clientBandwidth);
  39. this.ultraHighSize = this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  40. this.highSize = this.getPanoSize(PanoSizeClass.HIGH);
  41. this.standardSize = this.getPanoSize(PanoSizeClass.STANDARD);
  42. this.baseSize = this.getPanoSize(PanoSizeClass.BASE);
  43. config.tiling.maxZoomPanoQuality && this.ultraHighSize <= config.tiling.maxZoomPanoQuality && (config.tiling.allowUltraHighResolution = !0);
  44. this.highQualityThreshold = browser.valueFromHash("threshold2k", config.windowHeightHighQualityThreshold);
  45. this.updateMaximums();
  46. //e.on(ModelManagerEvents.ActiveModelChanged, this.onModelChanged.bind(this));
  47. }
  48. updateFromModel(e) {
  49. //this.updateHighResolutionSettings(e)
  50. this.updateUltraHighResolutionSettings(e)
  51. }
  52. /* updateHighResolutionSettings(e) {
  53. this.useHighResolutionPanos = !0
  54. this.updateMaximums()
  55. } */
  56. updateUltraHighResolutionSettings(e) {
  57. if (config.tiling.allowUltraHighResolution && this.modelHasUltraHighPanos) {
  58. this.useUltraHighResolutionPanos = !0;
  59. } else {
  60. this.useUltraHighResolutionPanos = !1;
  61. }
  62. this.updateMaximums();
  63. }
  64. enableUltraHighQualityMode() {
  65. this.modelHasUltraHighPanos = !0;
  66. this.updateUltraHighResolutionSettings(null);
  67. }
  68. ultraHighQualityModeEnabled() {
  69. return this.modelHasUltraHighPanos
  70. }
  71. onModelChanged(e) {
  72. this.updateFromModel(e.model),
  73. this.updateMaximums()
  74. }
  75. updateMaximums() {
  76. this.maxNavPanoSize = config.tiling.maxNavPanoQuality || this.detectMaxNavPanoSize(),
  77. this.maxZoomPanoSize = config.tiling.maxZoomPanoQuality || this.detectMaxZoomPanoSize(),
  78. this.maxZoomPanoSize < this.maxNavPanoSize && (this.maxNavPanoSize = this.maxZoomPanoSize)
  79. }
  80. buildPanoSizeClassMap() {
  81. this.panoSizeClassMap[PanoSizeClass.BASE] = 512,
  82. this.panoSizeClassMap[PanoSizeClass.STANDARD] = 1024,
  83. this.panoSizeClassMap[PanoSizeClass.HIGH] = 2048,
  84. this.panoSizeClassMap[PanoSizeClass.ULTRAHIGH] = Math.max(4096, Potree.settings.tileClass)
  85. }
  86. getPanoSize(e) {
  87. return this.panoSizeClassMap[e]
  88. }
  89. getMaxPossiblePanoSize() {
  90. return this.getPanoSize(PanoSizeClass.ULTRAHIGH)
  91. }
  92. getMaxPanoSize() {
  93. return this.maxZoomPanoSize
  94. }
  95. getMaxNavPanoSize() {
  96. return this.maxNavPanoSize
  97. }
  98. getMaxZoomPanoSize() {
  99. return this.maxZoomPanoSize
  100. }
  101. detectMaxNavPanoSizeClass() {
  102. //return this.useHighResolutionPanos ? browser.isMobile() ? PanoSizeClass.STANDARD : window.innerHeight < this.highQualityThreshold ? PanoSizeClass.STANDARD : PanoSizeClass.HIGH : PanoSizeClass.STANDARD
  103. /* if(config.name == 'decor'){
  104. return PanoSizeClass.STANDARD
  105. }
  106. return PanoSizeClass.HIGH */
  107. switch(Potree.settings.navTileClass){
  108. case 1024:
  109. return PanoSizeClass.STANDARD;
  110. break;
  111. case 2048:
  112. default:
  113. return PanoSizeClass.HIGH;
  114. }
  115. }
  116. detectMaxNavPanoSize() {
  117. var e = this.detectMaxNavPanoSizeClass();
  118. return this.getPanoSize(e)
  119. }
  120. detectMaxZoomPanoSize() { //获取当前zoomRenderTarget应下载的最高级别
  121. //若是有三个级别,每次只需要加载到当前的zoomLevel;而两级时因为有zoomed来判断是使用基本贴图还是zoomRenderTarget,所以只需要返回最大的即可
  122. if(this.zoomLevelResolution){//有三个级别
  123. if(this.zoomLevelResolution == '4k' && this.useUltraHighResolutionPanos){
  124. return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  125. }else if(this.zoomLevelResolution == '1k' || !this.useHighResolutionPanos){
  126. return this.getPanoSize(PanoSizeClass.STANDARD);
  127. }else{
  128. return this.getPanoSize(PanoSizeClass.HIGH);
  129. }
  130. }else{
  131. if (this.useHighResolutionPanos) {
  132. /* if (browser.isMobile()) {//手机版如果要2k的将这里去掉
  133. if (settings.tiling.mobileHighQualityOverride) {
  134. return this.getPanoSize(PanoSizeClass.HIGH);
  135. } else {
  136. return this.getPanoSize(PanoSizeClass.STANDARD);
  137. }
  138. } else */if (this.useUltraHighResolutionPanos ) {
  139. return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  140. } else {
  141. return this.getPanoSize(PanoSizeClass.HIGH);
  142. }
  143. } else {
  144. return this.getPanoSize(PanoSizeClass.STANDARD);
  145. }
  146. }
  147. }
  148. }