nodePort.ts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import { BlockTools } from '../blockTools';
  2. import { NodeMaterialBlockConnectionPointTypes } from 'babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes';
  3. import { NodeMaterialConnectionPoint } from 'babylonjs/Materials/Node/nodeMaterialBlockConnectionPoint';
  4. import { GlobalState } from '../globalState';
  5. import { Nullable } from 'babylonjs/types';
  6. import { Observer } from 'babylonjs/Misc/observable';
  7. import { Vector2 } from 'babylonjs/Maths/math.vector';
  8. import { IDisplayManager } from './display/displayManager';
  9. import { GraphNode } from './graphNode';
  10. import { NodeLink } from './nodeLink';
  11. import { GraphFrame } from './graphFrame';
  12. import { FrameNodePort } from './frameNodePort';
  13. import { FramePortData } from './graphCanvas';
  14. export class NodePort {
  15. protected _element: HTMLDivElement;
  16. protected _img: HTMLImageElement;
  17. protected _globalState: GlobalState;
  18. protected _onCandidateLinkMovedObserver: Nullable<Observer<Nullable<Vector2>>>;
  19. protected _onSelectionChangedObserver: Nullable<Observer<Nullable<GraphFrame | GraphNode | NodeLink | NodePort | FramePortData>>>;
  20. public delegatedPort: Nullable<FrameNodePort> = null;
  21. public get element(): HTMLDivElement {
  22. if (this.delegatedPort) {
  23. return this.delegatedPort.element;
  24. }
  25. return this._element;
  26. }
  27. public refresh() {
  28. this._element.style.background = BlockTools.GetColorFromConnectionNodeType(this.connectionPoint.type);
  29. switch (this.connectionPoint.type) {
  30. case NodeMaterialBlockConnectionPointTypes.Float:
  31. case NodeMaterialBlockConnectionPointTypes.Int:
  32. this._img.src = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAyMSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiNmZmY7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5WZWN0b3IxPC90aXRsZT48ZyBpZD0iTGF5ZXJfNSIgZGF0YS1uYW1lPSJMYXllciA1Ij48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjEwLjUiIGN5PSIxMC41IiByPSI3LjUiLz48L2c+PC9zdmc+";
  33. break;
  34. case NodeMaterialBlockConnectionPointTypes.Vector2:
  35. this._img.src = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAyMSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiNmZmY7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5WZWN0b3IyPC90aXRsZT48ZyBpZD0iTGF5ZXJfNSIgZGF0YS1uYW1lPSJMYXllciA1Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLDEwLjVhNy41Miw3LjUyLDAsMCwwLDYuNSw3LjQzVjMuMDdBNy41Miw3LjUyLDAsMCwwLDMsMTAuNVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMS41LDMuMDdWMTcuOTNhNy41LDcuNSwwLDAsMCwwLTE0Ljg2WiIvPjwvZz48L3N2Zz4=";
  36. break;
  37. case NodeMaterialBlockConnectionPointTypes.Vector3:
  38. case NodeMaterialBlockConnectionPointTypes.Color3:
  39. this._img.src = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAyMSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiNmZmY7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5WZWN0b3IzPC90aXRsZT48ZyBpZD0iTGF5ZXJfNSIgZGF0YS1uYW1lPSJMYXllciA1Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjU3LDEzLjMxLDkuNSw5Ljg5VjNBNy41MSw3LjUxLDAsMCwwLDMsMTAuNDYsNy4zMiw3LjMyLDAsMCwwLDMuNTcsMTMuMzFaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTYuNDMsMTUsMTAuNSwxMS42Miw0LjU3LDE1YTcuNDgsNy40OCwwLDAsMCwxMS44NiwwWiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE4LDEwLjQ2QTcuNTEsNy41MSwwLDAsMCwxMS41LDNWOS44OWw1LjkzLDMuNDJBNy4zMiw3LjMyLDAsMCwwLDE4LDEwLjQ2WiIvPjwvZz48L3N2Zz4=";
  40. break;
  41. case NodeMaterialBlockConnectionPointTypes.Vector4:
  42. case NodeMaterialBlockConnectionPointTypes.Color4:
  43. this._img.src = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAyMSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiNmZmY7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5WZWN0b3I0PC90aXRsZT48ZyBpZD0iTGF5ZXJfNSIgZGF0YS1uYW1lPSJMYXllciA1Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMS41LDExLjV2Ni40M2E3LjUxLDcuNTEsMCwwLDAsNi40My02LjQzWiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTExLjUsMy4wN1Y5LjVoNi40M0E3LjUxLDcuNTEsMCwwLDAsMTEuNSwzLjA3WiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTkuNSwxNy45M1YxMS41SDMuMDdBNy41MSw3LjUxLDAsMCwwLDkuNSwxNy45M1oiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik05LjUsMy4wN0E3LjUxLDcuNTEsMCwwLDAsMy4wNyw5LjVIOS41WiIvPjwvZz48L3N2Zz4=";
  44. break;
  45. case NodeMaterialBlockConnectionPointTypes.Matrix:
  46. this._img.src = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAyMSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiNmZmY7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5NYXRyaXg8L3RpdGxlPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTExLjUsNi4xMVY5LjVoMy4zOUE0LjUxLDQuNTEsMCwwLDAsMTEuNSw2LjExWiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTExLjUsMTQuODlhNC41MSw0LjUxLDAsMCwwLDMuMzktMy4zOUgxMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTExLjUsMy4wN3YyQTUuNTQsNS41NCwwLDAsMSwxNS45Miw5LjVoMkE3LjUxLDcuNTEsMCwwLDAsMTEuNSwzLjA3WiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE1LjkyLDExLjVhNS41NCw1LjU0LDAsMCwxLTQuNDIsNC40MnYyYTcuNTEsNy41MSwwLDAsMCw2LjQzLTYuNDNaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4wOCwxMS41aC0yQTcuNTEsNy41MSwwLDAsMCw5LjUsMTcuOTN2LTJBNS41NCw1LjU0LDAsMCwxLDUuMDgsMTEuNVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik05LjUsMy4wN0E3LjUxLDcuNTEsMCwwLDAsMy4wNyw5LjVoMkE1LjU0LDUuNTQsMCwwLDEsOS41LDUuMDhaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41LDExLjVINi4xMUE0LjUxLDQuNTEsMCwwLDAsOS41LDE0Ljg5WiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTkuNSw2LjExQTQuNTEsNC41MSwwLDAsMCw2LjExLDkuNUg5LjVaIi8+PC9nPjwvc3ZnPg==";
  47. break;
  48. }
  49. }
  50. public constructor(portContainer: HTMLElement, public connectionPoint: NodeMaterialConnectionPoint, public node: GraphNode, globalState: GlobalState) {
  51. this._element = portContainer.ownerDocument!.createElement("div");
  52. this._element.classList.add("port");
  53. portContainer.appendChild(this._element);
  54. this._globalState = globalState;
  55. this._img = portContainer.ownerDocument!.createElement("img");
  56. this._element.appendChild(this._img );
  57. (this._element as any).port = this;
  58. // Drag support
  59. this._element.ondragstart= () => false;
  60. this._onCandidateLinkMovedObserver = globalState.onCandidateLinkMoved.add(coords => {
  61. const rect = this._element.getBoundingClientRect();
  62. if (!coords || rect.left > coords.x || rect.right < coords.x || rect.top > coords.y || rect.bottom < coords.y) {
  63. this._element.classList.remove("selected");
  64. return;
  65. }
  66. this._element.classList.add("selected");
  67. this._globalState.onCandidatePortSelectedObservable.notifyObservers(this);
  68. });
  69. this.refresh();
  70. }
  71. public dispose() {
  72. this._globalState.onCandidateLinkMoved.remove(this._onCandidateLinkMovedObserver);
  73. if (this._onSelectionChangedObserver) {
  74. this._globalState.onSelectionChangedObservable.remove(this._onSelectionChangedObserver);
  75. }
  76. }
  77. public static CreatePortElement(connectionPoint: NodeMaterialConnectionPoint, node: GraphNode, root: HTMLElement,
  78. displayManager: Nullable<IDisplayManager>, globalState: GlobalState) {
  79. let portContainer = root.ownerDocument!.createElement("div");
  80. let block = connectionPoint.ownerBlock;
  81. portContainer.classList.add("portLine");
  82. root.appendChild(portContainer);
  83. if (!displayManager || displayManager.shouldDisplayPortLabels(block)) {
  84. let portLabel = root.ownerDocument!.createElement("div");
  85. portLabel.classList.add("port-label");
  86. portLabel.innerHTML = connectionPoint.name;
  87. portContainer.appendChild(portLabel);
  88. }
  89. return new NodePort(portContainer, connectionPoint, node, globalState);
  90. }
  91. }