commonShadowLightPropertyGridComponent.tsx 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import * as React from "react";
  2. import { Observable } from "babylonjs/Misc/observable";
  3. import { IShadowLight } from "babylonjs/Lights/shadowLight";
  4. import { PropertyChangedEvent } from "../../../../propertyChangedEvent";
  5. import { LineContainerComponent } from "../../../lineContainerComponent";
  6. import { CheckBoxLineComponent } from "../../../lines/checkBoxLineComponent";
  7. import { FloatLineComponent } from "../../../lines/floatLineComponent";
  8. import { LockObject } from "../lockObject";
  9. import { GlobalState } from '../../../../globalState';
  10. import { OptionsLineComponent } from '../../../lines/optionsLineComponent';
  11. import { ShadowGenerator } from 'babylonjs/Lights/Shadows/shadowGenerator';
  12. import { SliderLineComponent } from '../../../lines/sliderLineComponent';
  13. interface ICommonShadowLightPropertyGridComponentProps {
  14. globalState: GlobalState,
  15. light: IShadowLight,
  16. lockObject: LockObject,
  17. onPropertyChangedObservable?: Observable<PropertyChangedEvent>
  18. }
  19. export class CommonShadowLightPropertyGridComponent extends React.Component<ICommonShadowLightPropertyGridComponentProps> {
  20. constructor(props: ICommonShadowLightPropertyGridComponentProps) {
  21. super(props);
  22. }
  23. render() {
  24. const light = this.props.light;
  25. const generator = light.getShadowGenerator() as ShadowGenerator || null;
  26. var blurModeOptions = [
  27. { label: "None", value: ShadowGenerator.FILTER_NONE },
  28. { label: "PCF", value: ShadowGenerator.FILTER_PCF },
  29. { label: "PCSS", value: ShadowGenerator.FILTER_PCSS },
  30. { label: "Poisson", value: ShadowGenerator.FILTER_POISSONSAMPLING },
  31. { label: "Exponential", value: ShadowGenerator.FILTER_EXPONENTIALSHADOWMAP },
  32. { label: "Blurred exponential", value: ShadowGenerator.FILTER_BLUREXPONENTIALSHADOWMAP },
  33. { label: "Close exponential", value: ShadowGenerator.FILTER_CLOSEEXPONENTIALSHADOWMAP },
  34. { label: "Blurred close exponential", value: ShadowGenerator.FILTER_BLURCLOSEEXPONENTIALSHADOWMAP },
  35. ];
  36. var filteringQualityOptions = [
  37. { label: "Low", value: ShadowGenerator.QUALITY_LOW },
  38. { label: "Medium", value: ShadowGenerator.QUALITY_MEDIUM },
  39. { label: "High", value: ShadowGenerator.QUALITY_HIGH }
  40. ];
  41. let filter = generator ? generator.filter : 0;
  42. return (
  43. <div>
  44. <LineContainerComponent globalState={this.props.globalState} title="SHADOWS">
  45. <CheckBoxLineComponent label="Shadows enabled" target={light} propertyName="shadowEnabled" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  46. <FloatLineComponent lockObject={this.props.lockObject} label="Shadows near plane" target={light} propertyName="shadowMinZ" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  47. <FloatLineComponent lockObject={this.props.lockObject} label="Shadows far plane" target={light} propertyName="shadowMaxZ" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  48. </LineContainerComponent>
  49. {
  50. generator !== null &&
  51. <LineContainerComponent globalState={this.props.globalState} title="SHADOW GENERATOR">
  52. <FloatLineComponent lockObject={this.props.lockObject} label="Bias" target={generator} propertyName="bias" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  53. <FloatLineComponent lockObject={this.props.lockObject} label="Normal bias" target={generator} propertyName="normalBias" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  54. <SliderLineComponent label="Darkness" target={generator} minimum={0} maximum={1} step={0.01} propertyName="darkness" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  55. <CheckBoxLineComponent label="Allow transparent shadows" target={generator} propertyName="transparencyShadow" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  56. <OptionsLineComponent label="Filter" options={blurModeOptions}
  57. onSelect={() => {
  58. this.forceUpdate();
  59. }}
  60. target={generator} propertyName="filter" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  61. {
  62. (filter === ShadowGenerator.FILTER_PCF || filter === ShadowGenerator.FILTER_PCSS) &&
  63. <OptionsLineComponent label="Filtering quality" options={filteringQualityOptions}
  64. onSelect={() => {
  65. this.forceUpdate();
  66. }}
  67. target={generator} propertyName="filteringQuality" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  68. }
  69. {
  70. (filter === ShadowGenerator.FILTER_PCSS) &&
  71. <SliderLineComponent label="Penumbra ratio" minimum={0} maximum={0.5} step={0.001} target={generator} propertyName="contactHardeningLightSizeUVRatio" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  72. }
  73. {
  74. (filter === ShadowGenerator.FILTER_BLUREXPONENTIALSHADOWMAP || filter === ShadowGenerator.FILTER_BLURCLOSEEXPONENTIALSHADOWMAP) &&
  75. <CheckBoxLineComponent label="Use kernel blur" target={generator} propertyName="useKernelBlur"
  76. onValueChanged={() => this.forceUpdate()}
  77. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  78. }
  79. {
  80. (filter === ShadowGenerator.FILTER_BLUREXPONENTIALSHADOWMAP || filter === ShadowGenerator.FILTER_BLURCLOSEEXPONENTIALSHADOWMAP) &&
  81. !generator.useKernelBlur &&
  82. <SliderLineComponent label="Blur box offset" target={generator} propertyName="blurBoxOffset" minimum={1} maximum={64} step={1} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />}
  83. {
  84. (filter === ShadowGenerator.FILTER_BLUREXPONENTIALSHADOWMAP || filter === ShadowGenerator.FILTER_BLURCLOSEEXPONENTIALSHADOWMAP) &&
  85. generator.useKernelBlur &&
  86. <SliderLineComponent label="Blur kernel" target={generator} propertyName="blurKernel" minimum={1} maximum={64} step={1} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  87. }
  88. {
  89. (filter === ShadowGenerator.FILTER_BLUREXPONENTIALSHADOWMAP || filter === ShadowGenerator.FILTER_EXPONENTIALSHADOWMAP) &&
  90. <FloatLineComponent lockObject={this.props.lockObject} label="Depth scale" target={generator} propertyName="depthScale" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  91. }
  92. {
  93. (filter === ShadowGenerator.FILTER_BLUREXPONENTIALSHADOWMAP || filter === ShadowGenerator.FILTER_EXPONENTIALSHADOWMAP) &&
  94. <SliderLineComponent label="Blur scale" target={generator} propertyName="blurScale" minimum={1} maximum={4} step={1} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  95. }
  96. </LineContainerComponent>
  97. }
  98. </div>
  99. );
  100. }
  101. }