inputNodeWidget.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import * as React from "react";
  2. import { InputNodeModel } from './inputNodeModel';
  3. import { Nullable } from 'babylonjs/types';
  4. import { GlobalState } from '../../../globalState';
  5. import { NodeMaterialSystemValues } from 'babylonjs/Materials/Node/Enums/nodeMaterialSystemValues';
  6. import { NodeMaterialBlockConnectionPointTypes } from 'babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes';
  7. import { Color3, Vector2, Vector3, Vector4 } from 'babylonjs/Maths/math';
  8. import { StringTools } from '../../../stringTools';
  9. import { PortHelper } from '../portHelper';
  10. import { AnimatedInputBlockTypes } from 'babylonjs/Materials/Node/Blocks/Input/animatedInputBlockTypes';
  11. /**
  12. * GenericNodeWidgetProps
  13. */
  14. export interface IInputNodeWidgetProps {
  15. node: Nullable<InputNodeModel>;
  16. globalState: GlobalState;
  17. }
  18. /**
  19. * Used to display a node block for the node editor
  20. */
  21. export class InputNodeWidget extends React.Component<IInputNodeWidgetProps> {
  22. /**
  23. * Creates a GenericNodeWidget
  24. * @param props
  25. */
  26. constructor(props: IInputNodeWidgetProps) {
  27. super(props);
  28. this.state = {};
  29. if (this.props.node) {
  30. this.props.node.addListener({
  31. selectionChanged: () => {
  32. let selected = (this.props.node as any).selected;
  33. this.props.globalState.onSelectionChangedObservable.notifyObservers(selected ? this.props.node : null);
  34. }
  35. });
  36. }
  37. }
  38. renderValue(value: string) {
  39. if (value !== "") {
  40. return (
  41. <div className="value-text">
  42. {value}
  43. </div>
  44. )
  45. }
  46. return null;
  47. }
  48. render() {
  49. var outputPorts = PortHelper.GenerateOutputPorts(this.props.node, true);
  50. let inputBlock = this.props.node!.inputBlock;
  51. let value = "";
  52. let name = `${inputBlock.name} (${StringTools.GetBaseType(inputBlock.output.type)})`;
  53. let color = "";
  54. if (inputBlock) {
  55. if (inputBlock.isAttribute) {
  56. value = "mesh." + inputBlock.name;
  57. name = StringTools.GetBaseType(inputBlock.output.type);
  58. } else if (inputBlock.isSystemValue) {
  59. switch (inputBlock.systemValue) {
  60. case NodeMaterialSystemValues.World:
  61. value = "World";
  62. break;
  63. case NodeMaterialSystemValues.WorldView:
  64. value = "World x View";
  65. break;
  66. case NodeMaterialSystemValues.WorldViewProjection:
  67. value = "World x View x Projection";
  68. break;
  69. case NodeMaterialSystemValues.View:
  70. value = "View";
  71. break;
  72. case NodeMaterialSystemValues.ViewProjection:
  73. value = "View x Projection";
  74. break;
  75. case NodeMaterialSystemValues.Projection:
  76. value = "Projection";
  77. break;
  78. case NodeMaterialSystemValues.CameraPosition:
  79. value = "Camera position";
  80. break;
  81. case NodeMaterialSystemValues.FogColor:
  82. value = "Fog color";
  83. break;
  84. }
  85. } else {
  86. if (!inputBlock || !inputBlock.isUniform) {
  87. return null;
  88. }
  89. switch (inputBlock.type) {
  90. case NodeMaterialBlockConnectionPointTypes.Float:
  91. if (inputBlock.animationType !== AnimatedInputBlockTypes.None) {
  92. value = AnimatedInputBlockTypes[inputBlock.animationType];
  93. } else {
  94. value = inputBlock.value.toFixed(2);
  95. }
  96. break;
  97. case NodeMaterialBlockConnectionPointTypes.Vector2:
  98. let vec2Value = inputBlock.value as Vector2
  99. value = `(${vec2Value.x.toFixed(2)}, ${vec2Value.y.toFixed(2)})`;
  100. break;
  101. case NodeMaterialBlockConnectionPointTypes.Vector3:
  102. let vec3Value = inputBlock.value as Vector3
  103. value = `(${vec3Value.x.toFixed(2)}, ${vec3Value.y.toFixed(2)}, ${vec3Value.z.toFixed(2)})`;
  104. break;
  105. case NodeMaterialBlockConnectionPointTypes.Vector4:
  106. let vec4Value = inputBlock.value as Vector4
  107. value = `(${vec4Value.x.toFixed(2)}, ${vec4Value.y.toFixed(2)}, ${vec4Value.z.toFixed(2)}, ${vec4Value.w.toFixed(2)})`;
  108. break;
  109. case NodeMaterialBlockConnectionPointTypes.Color3:
  110. case NodeMaterialBlockConnectionPointTypes.Color4: {
  111. color = (inputBlock.value as Color3).toHexString();
  112. break;
  113. }
  114. }
  115. }
  116. } else {
  117. name = "Not connected input";
  118. }
  119. return (
  120. <div className={"diagramBlock input" + (inputBlock && inputBlock.isAttribute ? " attribute" : "")} style={{
  121. background: color
  122. }}>
  123. <div className="header">
  124. {name}
  125. </div>
  126. <div className="outputs">
  127. {outputPorts}
  128. </div>
  129. <div className="value">
  130. {
  131. this.renderValue(value)
  132. }
  133. </div>
  134. </div>
  135. );
  136. }
  137. }