2
0

CustomNodeEditor.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { LabelElement } from 'flow';
  2. import { Color, Vector2, Vector3, Vector4 } from 'three';
  3. import * as Nodes from 'three/nodes';
  4. import { uniform } from 'three/nodes';
  5. import { BaseNodeEditor } from '../BaseNodeEditor.js';
  6. import { createInputLib } from '../NodeEditorUtils.js';
  7. import { setInputAestheticsFromType } from '../DataTypeLib.js';
  8. const typeToValue = {
  9. 'color': Color,
  10. 'vec2': Vector2,
  11. 'vec3': Vector3,
  12. 'vec4': Vector4
  13. };
  14. const createElementFromProperty = ( node, property ) => {
  15. const nodeType = property.nodeType;
  16. const defaultValue = uniform( typeToValue[ nodeType ] ? new typeToValue[ nodeType ]() : 0 );
  17. let label = property.label;
  18. if ( label === undefined ) {
  19. label = property.name;
  20. if ( label.endsWith( 'Node' ) === true ) {
  21. label = label.slice( 0, label.length - 4 );
  22. }
  23. }
  24. node[ property.name ] = defaultValue;
  25. const element = setInputAestheticsFromType( new LabelElement( label ), nodeType );
  26. if ( createInputLib[ nodeType ] !== undefined ) {
  27. createInputLib[ nodeType ]( defaultValue, element );
  28. }
  29. element.onConnect( ( elmt ) => {
  30. elmt.setEnabledInputs( ! elmt.getLinkedObject() );
  31. node[ property.name ] = elmt.getLinkedObject() || defaultValue;
  32. } );
  33. return element;
  34. };
  35. export class CustomNodeEditor extends BaseNodeEditor {
  36. constructor( settings ) {
  37. const shaderNode = Nodes[ settings.shaderNode ];
  38. let node = null;
  39. const elements = [];
  40. if ( settings.properties !== undefined ) {
  41. node = shaderNode();
  42. for ( const property of settings.properties ) {
  43. elements.push( createElementFromProperty( node, property ) );
  44. }
  45. } else {
  46. node = shaderNode;
  47. }
  48. node.nodeType = node.nodeType || settings.nodeType;
  49. super( settings.name, node, 300 );
  50. this.title.setIcon( 'ti ti-' + settings.icon );
  51. for ( const element of elements ) {
  52. this.add( element );
  53. }
  54. }
  55. }