util.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { defaults } from 'mol-util';
  7. import { Structure } from 'mol-model/structure';
  8. import { VisualQuality } from 'mol-geo/geometry/geometry';
  9. export interface VisualUpdateState {
  10. updateTransform: boolean
  11. updateMatrix: boolean
  12. updateColor: boolean
  13. updateSize: boolean
  14. createGeometry: boolean
  15. createNew: boolean
  16. }
  17. export namespace VisualUpdateState {
  18. export function create(): VisualUpdateState {
  19. return {
  20. updateTransform: false,
  21. updateMatrix: false,
  22. updateColor: false,
  23. updateSize: false,
  24. createGeometry: false,
  25. createNew: false,
  26. }
  27. }
  28. export function reset(state: VisualUpdateState) {
  29. state.updateTransform = false
  30. state.updateMatrix = false
  31. state.updateColor = false
  32. state.updateSize = false
  33. state.createGeometry = false
  34. state.createNew = false
  35. }
  36. }
  37. //
  38. export interface QualityProps {
  39. quality: VisualQuality
  40. detail: number
  41. radialSegments: number
  42. linearSegments: number
  43. resolution: number
  44. }
  45. export function getQualityProps(props: Partial<QualityProps>, data?: any) {
  46. let quality = defaults(props.quality, 'auto' as VisualQuality)
  47. let detail = defaults(props.detail, 1)
  48. let radialSegments = defaults(props.radialSegments, 12)
  49. let linearSegments = defaults(props.linearSegments, 8)
  50. let resolution = defaults(props.resolution, 2)
  51. if (quality === 'auto' && data instanceof Structure) {
  52. let score = data.elementCount
  53. if (data.isCoarse) score *= 10
  54. if (score > 500_000) {
  55. quality = 'lowest'
  56. } else if (score > 300_000) {
  57. quality = 'lower'
  58. } else if (score > 100_000) {
  59. quality = 'low'
  60. } else if (score > 30_000) {
  61. quality = 'medium'
  62. } else if (score > 2_000) {
  63. quality = 'high'
  64. } else {
  65. quality = 'higher'
  66. }
  67. }
  68. switch (quality) {
  69. case 'highest':
  70. detail = 3
  71. radialSegments = 36
  72. linearSegments = 18
  73. resolution = 0.3
  74. break
  75. case 'higher':
  76. detail = 3
  77. radialSegments = 28
  78. linearSegments = 14
  79. resolution = 0.5
  80. break
  81. case 'high':
  82. detail = 2
  83. radialSegments = 20
  84. linearSegments = 10
  85. resolution = 1.0
  86. break
  87. case 'medium':
  88. detail = 1
  89. radialSegments = 12
  90. linearSegments = 8
  91. resolution = 2.0
  92. break
  93. case 'low':
  94. detail = 0
  95. radialSegments = 8
  96. linearSegments = 3
  97. resolution = 3
  98. break
  99. case 'lower':
  100. detail = 0
  101. radialSegments = 4
  102. linearSegments = 2
  103. resolution = 5
  104. break
  105. case 'lowest':
  106. detail = 0
  107. radialSegments = 2
  108. linearSegments = 1
  109. resolution = 8
  110. break
  111. case 'custom':
  112. // use defaults or given props as set above
  113. break
  114. }
  115. return {
  116. detail,
  117. radialSegments,
  118. linearSegments,
  119. resolution
  120. }
  121. }