color.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /**
  2. * Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Color } from '../mol-util/color';
  7. import { Location } from '../mol-model/location';
  8. import { ColorType, ColorTypeDirect, ColorTypeGrid, ColorTypeLocation } from '../mol-geo/geometry/color-data';
  9. import { CarbohydrateSymbolColorThemeProvider } from './color/carbohydrate-symbol';
  10. import { UniformColorThemeProvider } from './color/uniform';
  11. import { deepEqual } from '../mol-util';
  12. import { ParamDefinition as PD } from '../mol-util/param-definition';
  13. import { ThemeDataContext, ThemeRegistry, ThemeProvider } from './theme';
  14. import { ChainIdColorThemeProvider } from './color/chain-id';
  15. import { ElementIndexColorThemeProvider } from './color/element-index';
  16. import { ElementSymbolColorThemeProvider } from './color/element-symbol';
  17. import { MoleculeTypeColorThemeProvider } from './color/molecule-type';
  18. import { PolymerIdColorThemeProvider } from './color/polymer-id';
  19. import { PolymerIndexColorThemeProvider } from './color/polymer-index';
  20. import { ResidueNameColorThemeProvider } from './color/residue-name';
  21. import { SecondaryStructureColorThemeProvider } from './color/secondary-structure';
  22. import { SequenceIdColorThemeProvider } from './color/sequence-id';
  23. import { ShapeGroupColorThemeProvider } from './color/shape-group';
  24. import { UnitIndexColorThemeProvider } from './color/unit-index';
  25. import { ScaleLegend, TableLegend } from '../mol-util/legend';
  26. import { UncertaintyColorThemeProvider } from './color/uncertainty';
  27. import { EntitySourceColorThemeProvider } from './color/entity-source';
  28. import { IllustrativeColorThemeProvider } from './color/illustrative';
  29. import { HydrophobicityColorThemeProvider } from './color/hydrophobicity';
  30. import { TrajectoryIndexColorThemeProvider } from './color/trajectory-index';
  31. import { OccupancyColorThemeProvider } from './color/occupancy';
  32. import { OperatorNameColorThemeProvider } from './color/operator-name';
  33. import { OperatorHklColorThemeProvider } from './color/operator-hkl';
  34. import { PartialChargeColorThemeProvider } from './color/partial-charge';
  35. import { AtomIdColorThemeProvider } from './color/atom-id';
  36. import { EntityIdColorThemeProvider } from './color/entity-id';
  37. import { Texture, TextureFilter } from '../mol-gl/webgl/texture';
  38. import { VolumeValueColorThemeProvider } from './color/volume-value';
  39. import { Vec3, Vec4 } from '../mol-math/linear-algebra';
  40. import { ModelIndexColorThemeProvider } from './color/model-index';
  41. import { StructureIndexColorThemeProvider } from './color/structure-index';
  42. import { VolumeSegmentColorThemeProvider } from './color/volume-segment';
  43. import { ExternalVolumeColorThemeProvider } from './color/external-volume';
  44. import { ColorThemeCategory } from './color/categories';
  45. export type LocationColor = (location: Location, isSecondary: boolean) => Color
  46. export interface ColorVolume {
  47. colors: Texture
  48. dimension: Vec3
  49. transform: Vec4
  50. }
  51. export { ColorTheme };
  52. type ColorThemeShared<P extends PD.Params, G extends ColorType> = {
  53. readonly factory: ColorTheme.Factory<P, G>
  54. readonly props: Readonly<PD.Values<P>>
  55. /**
  56. * if palette is defined, 24bit RGB color value normalized to interval [0, 1]
  57. * is used as index to the colors
  58. */
  59. readonly palette?: Readonly<ColorTheme.Palette>
  60. readonly preferSmoothing?: boolean
  61. readonly contextHash?: number
  62. readonly description?: string
  63. readonly legend?: Readonly<ScaleLegend | TableLegend>
  64. }
  65. type ColorThemeLocation<P extends PD.Params> = {
  66. readonly granularity: ColorTypeLocation
  67. readonly color: LocationColor
  68. } & ColorThemeShared<P, ColorTypeLocation>
  69. type ColorThemeGrid<P extends PD.Params> = {
  70. readonly granularity: ColorTypeGrid
  71. readonly grid: ColorVolume
  72. } & ColorThemeShared<P, ColorTypeGrid>
  73. type ColorThemeDirect<P extends PD.Params> = {
  74. readonly granularity: ColorTypeDirect
  75. } & ColorThemeShared<P, ColorTypeDirect>
  76. type ColorTheme<P extends PD.Params, G extends ColorType = ColorTypeLocation> =
  77. G extends ColorTypeLocation ? ColorThemeLocation<P> :
  78. G extends ColorTypeGrid ? ColorThemeGrid<P> :
  79. G extends ColorTypeDirect ? ColorThemeDirect<P> : never
  80. namespace ColorTheme {
  81. export const Category = ColorThemeCategory;
  82. export interface Palette {
  83. filter?: TextureFilter,
  84. colors: Color[]
  85. }
  86. export const PaletteScale = (1 << 24) - 1;
  87. export type Props = { [k: string]: any }
  88. export type Factory<P extends PD.Params, G extends ColorType> = (ctx: ThemeDataContext, props: PD.Values<P>) => ColorTheme<P, G>
  89. export const EmptyFactory = () => Empty;
  90. const EmptyColor = Color(0xCCCCCC);
  91. export const Empty: ColorTheme<{}> = {
  92. factory: EmptyFactory,
  93. granularity: 'uniform',
  94. color: () => EmptyColor,
  95. props: {}
  96. };
  97. export function areEqual(themeA: ColorTheme<any, any>, themeB: ColorTheme<any, any>) {
  98. return themeA.contextHash === themeB.contextHash && themeA.factory === themeB.factory && deepEqual(themeA.props, themeB.props);
  99. }
  100. export interface Provider<P extends PD.Params = any, Id extends string = string, G extends ColorType = ColorType> extends ThemeProvider<ColorTheme<P, G>, P, Id, G> { }
  101. export const EmptyProvider: Provider<{}> = { name: '', label: '', category: '', factory: EmptyFactory, getParams: () => ({}), defaultValues: {}, isApplicable: () => true };
  102. export type Registry = ThemeRegistry<ColorTheme<any, any>>
  103. export function createRegistry() {
  104. return new ThemeRegistry(BuiltIn as { [k: string]: Provider<any, any, any> }, EmptyProvider);
  105. }
  106. export const BuiltIn = {
  107. 'atom-id': AtomIdColorThemeProvider,
  108. 'carbohydrate-symbol': CarbohydrateSymbolColorThemeProvider,
  109. 'chain-id': ChainIdColorThemeProvider,
  110. 'element-index': ElementIndexColorThemeProvider,
  111. 'element-symbol': ElementSymbolColorThemeProvider,
  112. 'entity-id': EntityIdColorThemeProvider,
  113. 'entity-source': EntitySourceColorThemeProvider,
  114. 'hydrophobicity': HydrophobicityColorThemeProvider,
  115. 'illustrative': IllustrativeColorThemeProvider,
  116. 'model-index': ModelIndexColorThemeProvider,
  117. 'molecule-type': MoleculeTypeColorThemeProvider,
  118. 'occupancy': OccupancyColorThemeProvider,
  119. 'operator-hkl': OperatorHklColorThemeProvider,
  120. 'operator-name': OperatorNameColorThemeProvider,
  121. 'partial-charge': PartialChargeColorThemeProvider,
  122. 'polymer-id': PolymerIdColorThemeProvider,
  123. 'polymer-index': PolymerIndexColorThemeProvider,
  124. 'residue-name': ResidueNameColorThemeProvider,
  125. 'secondary-structure': SecondaryStructureColorThemeProvider,
  126. 'sequence-id': SequenceIdColorThemeProvider,
  127. 'shape-group': ShapeGroupColorThemeProvider,
  128. 'structure-index': StructureIndexColorThemeProvider,
  129. 'trajectory-index': TrajectoryIndexColorThemeProvider,
  130. 'uncertainty': UncertaintyColorThemeProvider,
  131. 'unit-index': UnitIndexColorThemeProvider,
  132. 'uniform': UniformColorThemeProvider,
  133. 'volume-segment': VolumeSegmentColorThemeProvider,
  134. 'volume-value': VolumeValueColorThemeProvider,
  135. 'external-volume': ExternalVolumeColorThemeProvider,
  136. };
  137. type _BuiltIn = typeof BuiltIn
  138. export type BuiltIn = keyof _BuiltIn
  139. export type ParamValues<C extends ColorTheme.Provider<any>> = C extends ColorTheme.Provider<infer P> ? PD.Values<P> : never
  140. export type BuiltInParams<T extends BuiltIn> = Partial<ParamValues<_BuiltIn[T]>>
  141. }
  142. export function ColorThemeProvider<P extends PD.Params, Id extends string>(p: ColorTheme.Provider<P, Id>): ColorTheme.Provider<P, Id> { return p; }