Nessuna descrizione
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ShaderPort.cs 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using UnityEngine;
  3. using UnityEditor.Experimental.GraphView;
  4. using UnityEngine.UIElements;
  5. namespace UnityEditor.ShaderGraph.Drawing
  6. {
  7. sealed class ShaderPort : Port
  8. {
  9. public static StyleSheet styleSheet;
  10. ShaderPort(Orientation portOrientation, Direction portDirection, Capacity portCapacity, Type type)
  11. : base(portOrientation, portDirection, portCapacity, type)
  12. {
  13. if(styleSheet == null)
  14. styleSheet = Resources.Load<StyleSheet>("Styles/ShaderPort");
  15. styleSheets.Add(styleSheet);
  16. }
  17. MaterialSlot m_Slot;
  18. public static ShaderPort Create(MaterialSlot slot, IEdgeConnectorListener connectorListener)
  19. {
  20. var port = new ShaderPort(Orientation.Horizontal, slot.isInputSlot ? Direction.Input : Direction.Output,
  21. slot.isInputSlot ? Capacity.Single : Capacity.Multi, null)
  22. {
  23. m_EdgeConnector = new EdgeConnector<Edge>(connectorListener),
  24. };
  25. port.AddManipulator(port.m_EdgeConnector);
  26. port.slot = slot;
  27. port.portName = slot.displayName;
  28. port.visualClass = slot.concreteValueType.ToClassName();
  29. return port;
  30. }
  31. public void Dispose()
  32. {
  33. this.RemoveManipulator(m_EdgeConnector);
  34. m_EdgeConnector = null;
  35. m_Slot = null;
  36. styleSheets.Clear();
  37. DisconnectAll();
  38. OnDisconnect = null;
  39. }
  40. public MaterialSlot slot
  41. {
  42. get { return m_Slot; }
  43. set
  44. {
  45. if (ReferenceEquals(value, m_Slot))
  46. return;
  47. if (value == null)
  48. throw new NullReferenceException();
  49. if (m_Slot != null && value.isInputSlot != m_Slot.isInputSlot)
  50. throw new ArgumentException("Cannot change direction of already created port");
  51. m_Slot = value;
  52. portName = slot.displayName;
  53. visualClass = slot.concreteValueType.ToClassName();
  54. }
  55. }
  56. public Action<Port> OnDisconnect;
  57. public override void Disconnect(Edge edge)
  58. {
  59. base.Disconnect(edge);
  60. OnDisconnect?.Invoke(this);
  61. }
  62. }
  63. static class ShaderPortExtensions
  64. {
  65. public static MaterialSlot GetSlot(this Port port)
  66. {
  67. var shaderPort = port as ShaderPort;
  68. return shaderPort != null ? shaderPort.slot : null;
  69. }
  70. }
  71. }