nodeListComponent.tsx 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import * as React from "react";
  2. import { GlobalState } from '../../globalState';
  3. import { LineContainerComponent } from '../../sharedComponents/lineContainerComponent';
  4. import { DraggableLineComponent } from '../../sharedComponents/draggableLineComponent';
  5. require("./nodeList.scss");
  6. interface INodeListComponentProps {
  7. globalState: GlobalState;
  8. }
  9. export class NodeListComponent extends React.Component<INodeListComponentProps, {filter: string}> {
  10. constructor(props: INodeListComponentProps) {
  11. super(props);
  12. this.state = { filter: "" };
  13. }
  14. filterContent(filter: string) {
  15. this.setState({ filter: filter });
  16. }
  17. render() {
  18. // Block types used to create the menu from
  19. const allBlocks = {
  20. Animation: ["BonesBlock", "MorphTargetsBlock"],
  21. Basic_Math: ["AddBlock", "DivideBlock", "MultiplyBlock", "ScaleBlock", "SubtractBlock", "OneMinusBlock", "MaxBlock", "MinBlock", "LengthBlock", "DistanceBlock", "NegateBlock", "RandomNumberBlock", "ReciprocalBlock"],
  22. Color_Management: ["ReplaceColorBlock", "PosterizeBlock", "GradientBlock"],
  23. Conversion_Blocks: ["ColorMergerBlock", "ColorSplitterBlock", "VectorMergerBlock", "VectorSplitterBlock"],
  24. Inputs: ["Float", "Vector2", "Vector3", "Vector4", "Color3", "Color4", "TextureBlock", "ReflectionTextureBlock", "TimeBlock", "DeltaTimeBlock"],
  25. Interpolation: ["LerpBlock", "SmoothStepBlock", "NLerpBlock"],
  26. Matrices: ["Matrix", "WorldMatrixBlock", "WorldViewMatrixBlock", "WorldViewProjectionMatrixBlock", "ViewMatrixBlock", "ViewProjectionMatrixBlock", "ProjectionMatrixBlock"],
  27. Mesh_Attributes: ["InstancesBlock", "PositionBlock", "UVBlock", "ColorBlock", "NormalBlock", "TangentBlock", "MatrixIndicesBlock", "MatrixWeightsBlock", "WorldPositionBlock", "WorldNormalBlock", "FrontFacingBlock"],
  28. Noises: ["SimplexPerlin3D"],
  29. Output_Blocks: ["VertexOutputBlock", "FragmentOutputBlock", "DiscardBlock"],
  30. Range: ["ClampBlock", "RemapBlock", "NormalizeBlock"],
  31. Round: ["StepBlock", "RoundBlock", "CeilingBlock", "FloorBlock"],
  32. Scene_Attributes: ["FogBlock", "CameraPositionBlock", "FogColorBlock", "ImageProcessingBlock", "LightBlock", "LightInformationBlock", "ViewDirectionBlock", "PerturbNormalBlock"],
  33. Trigonometry: ["CosBlock", "SinBlock", "AbsBlock", "ExpBlock", "Exp2Block", "SqrtBlock", "PowBlock", "LogBlock", "ArcCosBlock", "ArcSinBlock", "TanBlock", "ArcTanBlock", "FractBlock", "SignBlock", "ArcTan2Block", "DegreesToRadiansBlock", "RadiansToDegreesBlock", "SawToothWaveBlock", "TriangleWaveBlock", "SquareWaveBlock"],
  34. Vector_Math: ["CrossBlock", "DotBlock", "TransformBlock", "FresnelBlock"],
  35. }
  36. // Create node menu
  37. var blockMenu = []
  38. for (var key in allBlocks) {
  39. var blockList = (allBlocks as any)[key].filter((b: string) => !this.state.filter || b.toLowerCase().indexOf(this.state.filter.toLowerCase()) !== -1)
  40. .sort((a: string, b: string) => a.localeCompare(b))
  41. .map((block: any, i: number) => {
  42. return <DraggableLineComponent key={block} data={block} />
  43. });
  44. if (blockList.length) {
  45. blockMenu.push(
  46. <LineContainerComponent key={key + " blocks"} title={key.replace("_", " ")} closed={false}>
  47. {blockList}
  48. </LineContainerComponent>
  49. );
  50. }
  51. }
  52. return (
  53. <div id="nodeList">
  54. <div className="panes">
  55. <div className="pane">
  56. <div className="filter">
  57. <input type="text" placeholder="Filter" onChange={(evt) => this.filterContent(evt.target.value)} />
  58. </div>
  59. <div className="list-container">
  60. {blockMenu}
  61. </div>
  62. </div>
  63. </div>
  64. </div>
  65. );
  66. }
  67. }