nodeMaterialPropertyGridComponent.tsx 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import * as React from "react";
  2. import { Observable } from "babylonjs/Misc/observable";
  3. import { NodeMaterial } from "babylonjs/Materials/Node/nodeMaterial";
  4. import { PropertyChangedEvent } from "../../../../propertyChangedEvent";
  5. import { LineContainerComponent } from "../../../lineContainerComponent";
  6. import { CommonMaterialPropertyGridComponent } from "./commonMaterialPropertyGridComponent";
  7. import { LockObject } from "../lockObject";
  8. import { GlobalState } from '../../../../globalState';
  9. import { ButtonLineComponent } from '../../../lines/buttonLineComponent';
  10. import { CheckBoxLineComponent } from '../../../lines/checkBoxLineComponent';
  11. import { FloatLineComponent } from '../../../lines/floatLineComponent';
  12. import { Color3LineComponent } from '../../../lines/color3LineComponent';
  13. import { Vector3LineComponent } from '../../../lines/vector3LineComponent';
  14. import { Vector4LineComponent } from '../../../lines/vector4LineComponent';
  15. import { Vector2LineComponent } from '../../../lines/vector2LineComponent';
  16. import { NodeMaterialBlockConnectionPointTypes } from 'babylonjs/Materials/Node/nodeMaterialBlockConnectionPointTypes';
  17. import { BaseTexture } from 'babylonjs/Materials/Textures/baseTexture';
  18. import { TextureLinkLineComponent } from '../../../lines/textureLinkLineComponent';
  19. import { SliderLineComponent } from '../../../lines/sliderLineComponent';
  20. interface INodeMaterialPropertyGridComponentProps {
  21. globalState: GlobalState;
  22. material: NodeMaterial;
  23. lockObject: LockObject;
  24. onSelectionChangedObservable?: Observable<any>;
  25. onPropertyChangedObservable?: Observable<PropertyChangedEvent>;
  26. }
  27. export class NodeMaterialPropertyGridComponent extends React.Component<INodeMaterialPropertyGridComponentProps> {
  28. private _onDebugSelectionChangeObservable = new Observable<BaseTexture>();
  29. constructor(props: INodeMaterialPropertyGridComponentProps) {
  30. super(props);
  31. }
  32. edit() {
  33. this.props.material.edit();
  34. }
  35. renderTextures() {
  36. const material = this.props.material;
  37. const onDebugSelectionChangeObservable = this._onDebugSelectionChangeObservable;
  38. let textureBlocks = material.getTextureBlocks();
  39. if (!textureBlocks || textureBlocks.length === 0) {
  40. return null;
  41. }
  42. return (
  43. <LineContainerComponent globalState={this.props.globalState} title="TEXTURES">
  44. {
  45. textureBlocks.map((textureBlock, i) => {
  46. return (
  47. <TextureLinkLineComponent label={textureBlock.name} key={textureBlock.texture!.uniqueId + i} texture={textureBlock.texture} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={onDebugSelectionChangeObservable} />
  48. )
  49. })
  50. }
  51. </LineContainerComponent>
  52. );
  53. }
  54. renderInputValues() {
  55. let configurableInputBlocks = this.props.material.getInputBlocks().filter(block => {
  56. return block.visibleInInspector && block.isUniform && !block.isSystemValue
  57. }).sort( (a, b) => {
  58. return a.name.localeCompare(b.name);
  59. });
  60. if (configurableInputBlocks.length === 0) {
  61. return null;
  62. }
  63. return (
  64. <LineContainerComponent globalState={this.props.globalState} title="INPUTS">
  65. {
  66. configurableInputBlocks.map(block => {
  67. switch (block.type) {
  68. case NodeMaterialBlockConnectionPointTypes.Float:
  69. let cantDisplaySlider = (isNaN(block.min) || isNaN(block.max) || block.min === block.max);
  70. return (
  71. <>
  72. {
  73. cantDisplaySlider &&
  74. <FloatLineComponent key={block.name} lockObject={this.props.lockObject} label={block.name} target={block} propertyName="value"
  75. onPropertyChangedObservable={this.props.onPropertyChangedObservable}
  76. />
  77. }
  78. {
  79. !cantDisplaySlider &&
  80. <SliderLineComponent key={block.name} label={block.name} target={block} propertyName="value" step={0.1} minimum={block.min} maximum={block.max} onPropertyChangedObservable={this.props.onPropertyChangedObservable}/>
  81. }
  82. </>
  83. );
  84. return (
  85. <FloatLineComponent key={block.name} lockObject={this.props.lockObject} label={block.name} target={block} propertyName="value"
  86. onPropertyChangedObservable={this.props.onPropertyChangedObservable}
  87. />
  88. )
  89. case NodeMaterialBlockConnectionPointTypes.Color3:
  90. case NodeMaterialBlockConnectionPointTypes.Color4:
  91. return (
  92. <Color3LineComponent key={block.name} label={block.name} target={block} propertyName="value"
  93. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  94. )
  95. case NodeMaterialBlockConnectionPointTypes.Vector2:
  96. return (
  97. <Vector2LineComponent key={block.name} label={block.name} target={block} propertyName="value"
  98. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  99. )
  100. case NodeMaterialBlockConnectionPointTypes.Vector3:
  101. return (
  102. <Vector3LineComponent key={block.name} label={block.name} target={block} propertyName="value"
  103. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  104. )
  105. case NodeMaterialBlockConnectionPointTypes.Vector4:
  106. return (
  107. <Vector4LineComponent key={block.name} label={block.name} target={block} propertyName="value"
  108. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  109. )
  110. }
  111. return null;
  112. })
  113. }
  114. </LineContainerComponent>
  115. );
  116. }
  117. render() {
  118. const material = this.props.material;
  119. return (
  120. <div className="pane">
  121. <CommonMaterialPropertyGridComponent globalState={this.props.globalState} lockObject={this.props.lockObject} material={material} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  122. <LineContainerComponent globalState={this.props.globalState} title="CONFIGURATION">
  123. <CheckBoxLineComponent label="Ignore alpha" target={material} propertyName="ignoreAlpha" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  124. <ButtonLineComponent label="Edit" onClick={() => this.edit()} />
  125. </LineContainerComponent>
  126. {
  127. this.renderInputValues()
  128. }
  129. {
  130. this.renderTextures()
  131. }
  132. </div>
  133. );
  134. }
  135. }