nodeMaterialPropertyGridComponent.tsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. interface INodeMaterialPropertyGridComponentProps {
  20. globalState: GlobalState;
  21. material: NodeMaterial;
  22. lockObject: LockObject;
  23. onSelectionChangedObservable?: Observable<any>;
  24. onPropertyChangedObservable?: Observable<PropertyChangedEvent>;
  25. }
  26. export class NodeMaterialPropertyGridComponent extends React.Component<INodeMaterialPropertyGridComponentProps> {
  27. private _onDebugSelectionChangeObservable = new Observable<BaseTexture>();
  28. constructor(props: INodeMaterialPropertyGridComponentProps) {
  29. super(props);
  30. }
  31. edit() {
  32. this.props.material.edit();
  33. }
  34. renderTextures() {
  35. const material = this.props.material;
  36. const onDebugSelectionChangeObservable = this._onDebugSelectionChangeObservable;
  37. let textureBlocks = material.getTextureBlocks();
  38. if (!textureBlocks || textureBlocks.length === 0) {
  39. return null;
  40. }
  41. return (
  42. <LineContainerComponent globalState={this.props.globalState} title="TEXTURES">
  43. {
  44. textureBlocks.map((textureBlock, i) => {
  45. return (
  46. <TextureLinkLineComponent label={textureBlock.name} key={textureBlock.texture!.uniqueId + i} texture={textureBlock.texture} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={onDebugSelectionChangeObservable} />
  47. )
  48. })
  49. }
  50. </LineContainerComponent>
  51. );
  52. }
  53. renderInputValues() {
  54. let configurableInputBlocks = this.props.material.getInputBlocks().filter(block => {
  55. return block.visibleInInspector && block.isUniform && !block.isSystemValue
  56. }).sort( (a, b) => {
  57. return a.name.localeCompare(b.name);
  58. });
  59. if (configurableInputBlocks.length === 0) {
  60. return null;
  61. }
  62. return (
  63. <LineContainerComponent globalState={this.props.globalState} title="INPUTS">
  64. {
  65. configurableInputBlocks.map(block => {
  66. switch (block.type) {
  67. case NodeMaterialBlockConnectionPointTypes.Float:
  68. return (
  69. <FloatLineComponent key={block.name} lockObject={this.props.lockObject} label={block.name} target={block} propertyName="value"
  70. onPropertyChangedObservable={this.props.onPropertyChangedObservable}
  71. />
  72. )
  73. case NodeMaterialBlockConnectionPointTypes.Color3:
  74. case NodeMaterialBlockConnectionPointTypes.Color4:
  75. return (
  76. <Color3LineComponent key={block.name} label={block.name} target={block} propertyName="value"
  77. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  78. )
  79. case NodeMaterialBlockConnectionPointTypes.Vector2:
  80. return (
  81. <Vector2LineComponent key={block.name} label={block.name} target={block} propertyName="value"
  82. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  83. )
  84. case NodeMaterialBlockConnectionPointTypes.Vector3:
  85. return (
  86. <Vector3LineComponent key={block.name} label={block.name} target={block} propertyName="value"
  87. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  88. )
  89. case NodeMaterialBlockConnectionPointTypes.Vector4:
  90. return (
  91. <Vector4LineComponent key={block.name} label={block.name} target={block} propertyName="value"
  92. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  93. )
  94. }
  95. return null;
  96. })
  97. }
  98. </LineContainerComponent>
  99. );
  100. }
  101. render() {
  102. const material = this.props.material;
  103. return (
  104. <div className="pane">
  105. <CommonMaterialPropertyGridComponent globalState={this.props.globalState} lockObject={this.props.lockObject} material={material} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  106. <LineContainerComponent globalState={this.props.globalState} title="CONFIGURATION">
  107. <CheckBoxLineComponent label="Ignore alpha" target={material} propertyName="ignoreAlpha" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  108. <ButtonLineComponent label="Edit" onClick={() => this.edit()} />
  109. </LineContainerComponent>
  110. {
  111. this.renderInputValues()
  112. }
  113. {
  114. this.renderTextures()
  115. }
  116. </div>
  117. );
  118. }
  119. }