simple-settings.tsx 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /**
  2. * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. * @author David Sehnal <david.sehnal@gmail.com>
  6. */
  7. import * as React from 'react';
  8. import { Canvas3DParams } from '../../../mol-canvas3d/canvas3d';
  9. import { PluginCommands } from '../../command';
  10. import { ColorNames } from '../../../mol-util/color/names';
  11. import { ParameterControls } from '../controls/parameters';
  12. import { ParamDefinition as PD } from '../../../mol-util/param-definition';
  13. import { PluginUIComponent } from '../base';
  14. import { Color } from '../../../mol-util/color';
  15. const SimpleSettingsParams = {
  16. spin: Canvas3DParams.trackball.params.spin,
  17. camera: Canvas3DParams.cameraMode,
  18. background: PD.MappedStatic('white', {
  19. 'white': PD.EmptyGroup(),
  20. 'black': PD.EmptyGroup(),
  21. 'transparent': PD.EmptyGroup(),
  22. 'custom': PD.Group({ color: PD.Color(Color(0xFCFBF9), { description: 'Custom background color' }) }, { isFlat: true })
  23. }, { description: 'Background of the 3D canvas' }),
  24. renderStyle: PD.Select('glossy', [['toon', 'Toon'], ['matte', 'Matte'], ['glossy', 'Glossy'], ['metallic', 'Metallic']], { description: 'Style in which the 3D scene is rendered' }),
  25. occlusion: PD.Boolean(false, { description: 'Darken occluded crevices with the ambient occlusion effect' }),
  26. outline: PD.Boolean(false, { description: 'Draw outline around 3D objects' }),
  27. fog: PD.Boolean(false, { description: 'Show fog in the distance' }),
  28. };
  29. export class SimpleSettingsControl extends PluginUIComponent {
  30. setSettings = (p: { param: PD.Base<any>, name: keyof typeof SimpleSettingsParams | string, value: any }) => {
  31. if (p.name === 'spin') {
  32. if (!this.plugin.canvas3d) return;
  33. const trackball = this.plugin.canvas3d.props.trackball;
  34. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: { trackball: { ...trackball, spin: p.value } } });
  35. } else if (p.name === 'camera') {
  36. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: { cameraMode: p.value }});
  37. } else if (p.name === 'background') {
  38. if (!this.plugin.canvas3d) return;
  39. const renderer = this.plugin.canvas3d.props.renderer;
  40. const color: typeof SimpleSettingsParams['background']['defaultValue'] = p.value;
  41. if (color.name === 'white') {
  42. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: { renderer: { ...renderer, backgroundColor: ColorNames.white, transparentBackground: false } } });
  43. } else if (color.name === 'black') {
  44. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: { renderer: { ...renderer, backgroundColor: ColorNames.black, transparentBackground: false } } });
  45. } else if (color.name === 'transparent') {
  46. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: { renderer: { ...renderer, backgroundColor: ColorNames.white, transparentBackground: true } } });
  47. } else {
  48. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: { renderer: { ...renderer, backgroundColor: color.params.color, transparentBackground: false } } });
  49. }
  50. } else if (p.name === 'renderStyle') {
  51. if (!this.plugin.canvas3d) return;
  52. const renderer = this.plugin.canvas3d.props.renderer;
  53. if (p.value === 'toon') {
  54. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: {
  55. renderer: { ...renderer, lightIntensity: 0, ambientIntensity: 1, roughness: 0.4, metalness: 0 }
  56. } });
  57. } else if (p.value === 'matte') {
  58. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: {
  59. renderer: { ...renderer, lightIntensity: 0.6, ambientIntensity: 0.4, roughness: 1, metalness: 0 }
  60. } });
  61. } else if (p.value === 'glossy') {
  62. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: {
  63. renderer: { ...renderer, lightIntensity: 0.6, ambientIntensity: 0.4, roughness: 0.4, metalness: 0 }
  64. } });
  65. } else if (p.value === 'metallic') {
  66. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: {
  67. renderer: { ...renderer, lightIntensity: 0.6, ambientIntensity: 0.4, roughness: 0.6, metalness: 0.4 }
  68. } });
  69. }
  70. } else if (p.name === 'occlusion') {
  71. if (!this.plugin.canvas3d) return;
  72. const postprocessing = this.plugin.canvas3d.props.postprocessing;
  73. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: {
  74. postprocessing: { ...postprocessing, occlusionEnable: p.value, occlusionBias: 0.5, occlusionRadius: 64 },
  75. } });
  76. } else if (p.name === 'outline') {
  77. if (!this.plugin.canvas3d) return;
  78. const postprocessing = this.plugin.canvas3d.props.postprocessing;
  79. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: {
  80. postprocessing: { ...postprocessing, outlineEnable: p.value },
  81. } });
  82. } else if (p.name === 'fog') {;
  83. PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, { settings: {
  84. cameraFog: p.value ? 50 : 1,
  85. } });
  86. }
  87. }
  88. get values () {
  89. const renderer = this.plugin.canvas3d?.props.renderer;
  90. let renderStyle = 'custom'
  91. let background: typeof SimpleSettingsParams['background']['defaultValue'] = { name: 'white', params: { } }
  92. if (renderer) {
  93. if (renderer.lightIntensity === 0 && renderer.ambientIntensity === 1 && renderer.roughness === 0.4 && renderer.metalness === 0) {
  94. renderStyle = 'toon'
  95. } else if (renderer.lightIntensity === 0.6 && renderer.ambientIntensity === 0.4) {
  96. if (renderer.roughness === 1 && renderer.metalness === 0) {
  97. renderStyle = 'matte'
  98. } else if (renderer.roughness === 0.4 && renderer.metalness === 0) {
  99. renderStyle = 'glossy'
  100. } else if (renderer.roughness === 0.6 && renderer.metalness === 0.4) {
  101. renderStyle = 'metallic'
  102. }
  103. }
  104. if (renderer.backgroundColor === ColorNames.white && !renderer.transparentBackground) {
  105. background = { name: 'white', params: { } }
  106. } else if (renderer.backgroundColor === ColorNames.black && !renderer.transparentBackground) {
  107. background = { name: 'black', params: { } }
  108. } else if (renderer.backgroundColor === ColorNames.white && renderer.transparentBackground) {
  109. background = { name: 'transparent', params: { } }
  110. } else {
  111. background = { name: 'custom', params: { color: renderer.backgroundColor } }
  112. }
  113. }
  114. return {
  115. spin: !!this.plugin.canvas3d?.props.trackball.spin,
  116. camera: this.plugin.canvas3d?.props.cameraMode,
  117. background,
  118. renderStyle,
  119. occlusion: this.plugin.canvas3d?.props.postprocessing.occlusionEnable,
  120. outline: this.plugin.canvas3d?.props.postprocessing.outlineEnable,
  121. fog: this.plugin.canvas3d ? this.plugin.canvas3d.props.cameraFog > 1 : false
  122. }
  123. }
  124. componentDidMount() {
  125. this.subscribe(this.plugin.events.canvas3d.settingsUpdated, () => this.forceUpdate());
  126. }
  127. render() {
  128. return <ParameterControls params={SimpleSettingsParams} values={this.values} onChange={this.setSettings} />
  129. }
  130. }