commonMaterialPropertyGridComponent.tsx 8.5 KB

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