propertyTabComponent.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import * as React from "react";
  2. import { GlobalState } from '../../globalState';
  3. import { Nullable } from 'babylonjs/types';
  4. import { DefaultNodeModel } from '../../components/diagram/defaultNodeModel';
  5. import { ButtonLineComponent } from '../../sharedComponents/buttonLineComponent';
  6. import { LineContainerComponent } from '../../sharedComponents/lineContainerComponent';
  7. import { StringTools } from '../../stringTools';
  8. import { FileButtonLineComponent } from '../../sharedComponents/fileButtonLineComponent';
  9. import { Tools } from 'babylonjs/Misc/tools';
  10. require("./propertyTab.scss");
  11. interface IPropertyTabComponentProps {
  12. globalState: GlobalState;
  13. }
  14. export class PropertyTabComponent extends React.Component<IPropertyTabComponentProps, { currentNode: Nullable<DefaultNodeModel> }> {
  15. constructor(props: IPropertyTabComponentProps) {
  16. super(props)
  17. this.state = { currentNode: null };
  18. }
  19. componentWillMount() {
  20. this.props.globalState.onSelectionChangedObservable.add(block => {
  21. this.setState({ currentNode: block });
  22. });
  23. }
  24. load(file: File) {
  25. Tools.ReadFile(file, (data) => {
  26. let decoder = new TextDecoder("utf-8");
  27. let serializationObject = JSON.parse(decoder.decode(data));
  28. this.props.globalState.nodeMaterial!.loadFromSerialization(serializationObject, "");
  29. this.props.globalState.onResetRequiredObservable.notifyObservers();
  30. }, undefined, true);
  31. }
  32. render() {
  33. if (this.state.currentNode) {
  34. return (
  35. <div id="propertyTab">
  36. <div id="header">
  37. <img id="logo" src="https://www.babylonjs.com/Assets/logo-babylonjs-social-twitter.png" />
  38. <div id="title">
  39. NODE MATERIAL EDITOR
  40. </div>
  41. </div>
  42. {this.state.currentNode.renderProperties(this.props.globalState)}
  43. </div>
  44. );
  45. }
  46. return (
  47. <div id="propertyTab">
  48. <div id="header">
  49. <img id="logo" src="https://www.babylonjs.com/Assets/logo-babylonjs-social-twitter.png" />
  50. <div id="title">
  51. NODE MATERIAL EDITOR
  52. </div>
  53. </div>
  54. <div>
  55. <LineContainerComponent title="PROPERTIES">
  56. </LineContainerComponent>
  57. <LineContainerComponent title="GENERAL">
  58. <ButtonLineComponent label="Reset to default" onClick={() => {
  59. this.props.globalState.nodeMaterial!.setToDefault();
  60. this.props.globalState.onResetRequiredObservable.notifyObservers();
  61. }} />
  62. </LineContainerComponent>
  63. <LineContainerComponent title="UI">
  64. <ButtonLineComponent label="Zoom to fit" onClick={() => {
  65. this.props.globalState.onZoomToFitRequiredObservable.notifyObservers();
  66. }} />
  67. <ButtonLineComponent label="Reorganize" onClick={() => {
  68. this.props.globalState.onReOrganizedRequiredObservable.notifyObservers();
  69. }} />
  70. </LineContainerComponent>
  71. <LineContainerComponent title="FILE">
  72. <FileButtonLineComponent label="Load" onClick={(file) => this.load(file)} accept=".json" />
  73. <ButtonLineComponent label="Save" onClick={() => {
  74. let json = JSON.stringify(this.props.globalState.nodeMaterial!.serialize());
  75. StringTools.DownloadAsFile(json, "nodeMaterial.json");
  76. }} />
  77. <ButtonLineComponent label="Export shaders" onClick={() => {
  78. StringTools.DownloadAsFile(this.props.globalState.nodeMaterial!.compiledShaders, "shaders.txt");
  79. }} />
  80. </LineContainerComponent>
  81. </div>
  82. </div>
  83. );
  84. }
  85. }