commonMaterialPropertyGridComponent.tsx 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import * as React from "react";
  2. import { Observable } from "babylonjs/Misc/observable";
  3. import { Material } from "babylonjs/Materials/material";
  4. import { PBRMaterial } from "babylonjs/Materials/PBR/pbrMaterial";
  5. import { Constants } from "babylonjs/Engines/constants";
  6. import { Engine } from "babylonjs/Engines/engine";
  7. import { PropertyChangedEvent } from "../../../../propertyChangedEvent";
  8. import { CheckBoxLineComponent } from "../../../lines/checkBoxLineComponent";
  9. import { SliderLineComponent } from "../../../lines/sliderLineComponent";
  10. import { LineContainerComponent } from "../../../lineContainerComponent";
  11. import { TextLineComponent } from "../../../../../sharedUiComponents/lines/textLineComponent";
  12. import { OptionsLineComponent, Null_Value } from "../../../lines/optionsLineComponent";
  13. import { LockObject } from "../lockObject";
  14. import { GlobalState } from '../../../../globalState';
  15. import { CustomPropertyGridComponent } from '../customPropertyGridComponent';
  16. import { ButtonLineComponent } from '../../../../../sharedUiComponents/lines/buttonLineComponent';
  17. import { TextInputLineComponent } from '../../../lines/textInputLineComponent';
  18. import { AnimationGridComponent } from '../animations/animationPropertyGridComponent';
  19. interface ICommonMaterialPropertyGridComponentProps {
  20. globalState: GlobalState;
  21. material: Material;
  22. lockObject: LockObject;
  23. onPropertyChangedObservable?: Observable<PropertyChangedEvent>;
  24. }
  25. export class CommonMaterialPropertyGridComponent extends React.Component<ICommonMaterialPropertyGridComponentProps> {
  26. constructor(props: ICommonMaterialPropertyGridComponentProps) {
  27. super(props);
  28. }
  29. render() {
  30. const material = this.props.material;
  31. material.depthFunction = material.depthFunction ?? 0;
  32. var orientationOptions = [
  33. { label: "Clockwise", value: Material.ClockWiseSideOrientation },
  34. { label: "Counterclockwise", value: Material.CounterClockWiseSideOrientation }
  35. ];
  36. var transparencyModeOptions = [
  37. { label: "<Not Defined>", value: Null_Value },
  38. { label: "Opaque", value: PBRMaterial.PBRMATERIAL_OPAQUE },
  39. { label: "Alpha test", value: PBRMaterial.PBRMATERIAL_ALPHATEST },
  40. { label: "Alpha blend", value: PBRMaterial.PBRMATERIAL_ALPHABLEND },
  41. { label: "Alpha blend and test", value: PBRMaterial.PBRMATERIAL_ALPHATESTANDBLEND },
  42. ];
  43. var alphaModeOptions = [
  44. { label: "Combine", value: Constants.ALPHA_COMBINE },
  45. { label: "One one", value: Constants.ALPHA_ONEONE },
  46. { label: "Add", value: Constants.ALPHA_ADD },
  47. { label: "Subtract", value: Constants.ALPHA_SUBTRACT },
  48. { label: "Multiply", value: Constants.ALPHA_MULTIPLY },
  49. { label: "Maximized", value: Constants.ALPHA_MAXIMIZED },
  50. { label: "Pre-multiplied", value: Constants.ALPHA_PREMULTIPLIED },
  51. ];
  52. var depthfunctionOptions = [
  53. { label: "<Engine Default>", value: 0 },
  54. { label: "Never", value: Engine.NEVER },
  55. { label: "Always", value: Engine.ALWAYS },
  56. { label: "Equal", value: Engine.EQUAL },
  57. { label: "Less", value: Engine.LESS },
  58. { label: "Less or equal", value: Engine.LEQUAL },
  59. { label: "Greater", value: Engine.GREATER },
  60. { label: "Greater or equal", value: Engine.GEQUAL },
  61. { label: "Not equal", value: Engine.NOTEQUAL },
  62. ];
  63. return (
  64. <div>
  65. <CustomPropertyGridComponent globalState={this.props.globalState} target={material}
  66. lockObject={this.props.lockObject}
  67. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  68. <LineContainerComponent globalState={this.props.globalState} title="GENERAL">
  69. <TextLineComponent label="ID" value={material.id} />
  70. <TextInputLineComponent lockObject={this.props.lockObject} label="Name" target={material} propertyName="name" onPropertyChangedObservable={this.props.onPropertyChangedObservable}/>
  71. <TextLineComponent label="Unique ID" value={material.uniqueId.toString()} />
  72. <TextLineComponent label="Class" value={material.getClassName()} />
  73. <CheckBoxLineComponent label="Backface culling" target={material} propertyName="backFaceCulling" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  74. <OptionsLineComponent label="Orientation" options={orientationOptions} target={material} propertyName="sideOrientation" onPropertyChangedObservable={this.props.onPropertyChangedObservable} onSelect={(value) => this.setState({ mode: value })} />
  75. <CheckBoxLineComponent label="Disable lighting" target={material} propertyName="disableLighting" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  76. <CheckBoxLineComponent label="Disable color write" target={material} propertyName="disableColorWrite" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  77. <CheckBoxLineComponent label="Disable depth write" target={material} propertyName="disableDepthWrite" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  78. <OptionsLineComponent label="Depth function" options={depthfunctionOptions} target={material} propertyName="depthFunction" onPropertyChangedObservable={this.props.onPropertyChangedObservable} onSelect={(value) => this.setState({ depthFunction: value })} />
  79. <CheckBoxLineComponent label="Need depth pre-pass" target={material} propertyName="needDepthPrePass" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  80. <CheckBoxLineComponent label="Wireframe" target={material} propertyName="wireframe" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  81. <CheckBoxLineComponent label="Point cloud" target={material} propertyName="pointsCloud" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  82. <SliderLineComponent label="Point size" target={material} propertyName="pointSize" minimum={0} maximum={100} step={0.1} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  83. <SliderLineComponent label="Z-offset" target={material} propertyName="zOffset" minimum={-10} maximum={10} step={0.1} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  84. <ButtonLineComponent label="Dispose" onClick={() => {
  85. material.dispose();
  86. this.props.globalState.onSelectionChangedObservable.notifyObservers(null);
  87. }} />
  88. </LineContainerComponent>
  89. <LineContainerComponent globalState={this.props.globalState} title="TRANSPARENCY">
  90. <SliderLineComponent label="Alpha" target={material} propertyName="alpha" minimum={0} maximum={1} step={0.01} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  91. {
  92. (material as any).transparencyMode !== undefined &&
  93. <OptionsLineComponent allowNullValue={true} label="Transparency mode" options={transparencyModeOptions} target={material} propertyName="transparencyMode" onPropertyChangedObservable={this.props.onPropertyChangedObservable} onSelect={(value) => this.setState({ transparencyMode: value })} />
  94. }
  95. <OptionsLineComponent label="Alpha mode" options={alphaModeOptions} target={material} propertyName="alphaMode" onPropertyChangedObservable={this.props.onPropertyChangedObservable} onSelect={(value) => this.setState({ alphaMode: value })} />
  96. {
  97. (material as any).diffuseTexture &&
  98. <CheckBoxLineComponent label="Diffuse texture has alpha" target={(material as any).diffuseTexture} propertyName="hasAlpha" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  99. }
  100. {
  101. (material as any).useAlphaFromDiffuseTexture !== undefined &&
  102. <CheckBoxLineComponent label="Use alpha from diffuse texture" target={material} propertyName="useAlphaFromDiffuseTexture" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  103. }
  104. {
  105. (material as any).albedoTexture &&
  106. <CheckBoxLineComponent label="Albedo texture has alpha" target={(material as any).albedoTexture} propertyName="hasAlpha" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  107. }
  108. {
  109. (material as any).useAlphaFromAlbedoTexture !== undefined &&
  110. <CheckBoxLineComponent label="Use alpha from albedo texture" target={material} propertyName="useAlphaFromAlbedoTexture" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  111. }
  112. <CheckBoxLineComponent label="Separate culling pass" target={material} propertyName="separateCullingPass" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  113. </LineContainerComponent>
  114. <AnimationGridComponent globalState={this.props.globalState} animatable={material} scene={material.getScene()} lockObject={this.props.lockObject} />
  115. </div>
  116. );
  117. }
  118. }