util.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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/base';
  9. export interface VisualUpdateState {
  10. updateTransform: boolean
  11. updateMatrix: boolean
  12. updateColor: boolean
  13. updateSize: boolean
  14. createGeometry: boolean
  15. createNew: boolean
  16. /** holds contextual info, is not reset */
  17. info: { [k: string]: unknown }
  18. }
  19. export namespace VisualUpdateState {
  20. export function create(): VisualUpdateState {
  21. return {
  22. updateTransform: false,
  23. updateMatrix: false,
  24. updateColor: false,
  25. updateSize: false,
  26. createGeometry: false,
  27. createNew: false,
  28. info: {}
  29. }
  30. }
  31. export function reset(state: VisualUpdateState) {
  32. state.updateTransform = false
  33. state.updateMatrix = false
  34. state.updateColor = false
  35. state.updateSize = false
  36. state.createGeometry = false
  37. state.createNew = false
  38. }
  39. }
  40. //
  41. export interface QualityProps {
  42. quality: VisualQuality
  43. detail: number
  44. radialSegments: number
  45. linearSegments: number
  46. resolution: number
  47. doubleSided: boolean
  48. }
  49. export function getStructureQuality(structure: Structure): VisualQuality {
  50. let score = structure.elementCount
  51. if (structure.isCoarse) score *= 10
  52. if (score > 500_000) {
  53. return 'lowest'
  54. } else if (score > 200_000) {
  55. return 'lower'
  56. } else if (score > 60_000) {
  57. return 'low'
  58. } else if (score > 20_000) {
  59. return 'medium'
  60. } else if (score > 2_000) {
  61. return 'high'
  62. } else {
  63. return 'higher'
  64. }
  65. }
  66. export function getQualityProps(props: Partial<QualityProps>, data?: any) {
  67. let quality = defaults(props.quality, 'auto' as VisualQuality)
  68. let detail = defaults(props.detail, 1)
  69. let radialSegments = defaults(props.radialSegments, 12)
  70. let linearSegments = defaults(props.linearSegments, 8)
  71. let resolution = defaults(props.resolution, 2)
  72. let doubleSided = defaults(props.doubleSided, true)
  73. if (quality === 'auto' && data instanceof Structure) {
  74. quality = getStructureQuality(data.root)
  75. }
  76. switch (quality) {
  77. case 'highest':
  78. detail = 3
  79. radialSegments = 36
  80. linearSegments = 18
  81. resolution = 0.1
  82. doubleSided = true
  83. break
  84. case 'higher':
  85. detail = 3
  86. radialSegments = 28
  87. linearSegments = 14
  88. resolution = 0.3
  89. doubleSided = true
  90. break
  91. case 'high':
  92. detail = 2
  93. radialSegments = 20
  94. linearSegments = 10
  95. resolution = 0.5
  96. doubleSided = true
  97. break
  98. case 'medium':
  99. detail = 1
  100. radialSegments = 12
  101. linearSegments = 8
  102. resolution = 1
  103. doubleSided = true
  104. break
  105. case 'low':
  106. detail = 0
  107. radialSegments = 8
  108. linearSegments = 3
  109. resolution = 2
  110. doubleSided = false
  111. break
  112. case 'lower':
  113. detail = 0
  114. radialSegments = 4
  115. linearSegments = 2
  116. resolution = 4
  117. doubleSided = false
  118. break
  119. case 'lowest':
  120. detail = 0
  121. radialSegments = 2
  122. linearSegments = 1
  123. resolution = 8
  124. doubleSided = false
  125. break
  126. case 'custom':
  127. // use defaults or given props as set above
  128. break
  129. }
  130. return {
  131. detail,
  132. radialSegments,
  133. linearSegments,
  134. resolution,
  135. doubleSided
  136. }
  137. }