mathe/Library/PackageCache/com.unity.shadergraph@14.0.8/Editor/Drawing/Views/ShaderPort.cs
2024-09-20 20:30:10 +02:00

80 lines
2.5 KiB
C#

using System;
using UnityEngine;
using UnityEditor.Experimental.GraphView;
using UnityEngine.UIElements;
namespace UnityEditor.ShaderGraph.Drawing
{
sealed class ShaderPort : Port
{
public static StyleSheet styleSheet;
ShaderPort(Orientation portOrientation, Direction portDirection, Capacity portCapacity, Type type)
: base(portOrientation, portDirection, portCapacity, type)
{
if(styleSheet == null)
styleSheet = Resources.Load<StyleSheet>("Styles/ShaderPort");
styleSheets.Add(styleSheet);
}
MaterialSlot m_Slot;
public static ShaderPort Create(MaterialSlot slot, IEdgeConnectorListener connectorListener)
{
var port = new ShaderPort(Orientation.Horizontal, slot.isInputSlot ? Direction.Input : Direction.Output,
slot.isInputSlot ? Capacity.Single : Capacity.Multi, null)
{
m_EdgeConnector = new EdgeConnector<Edge>(connectorListener),
};
port.AddManipulator(port.m_EdgeConnector);
port.slot = slot;
port.portName = slot.displayName;
port.visualClass = slot.concreteValueType.ToClassName();
return port;
}
public void Dispose()
{
this.RemoveManipulator(m_EdgeConnector);
m_EdgeConnector = null;
m_Slot = null;
styleSheets.Clear();
DisconnectAll();
OnDisconnect = null;
}
public MaterialSlot slot
{
get { return m_Slot; }
set
{
if (ReferenceEquals(value, m_Slot))
return;
if (value == null)
throw new NullReferenceException();
if (m_Slot != null && value.isInputSlot != m_Slot.isInputSlot)
throw new ArgumentException("Cannot change direction of already created port");
m_Slot = value;
portName = slot.displayName;
visualClass = slot.concreteValueType.ToClassName();
}
}
public Action<Port> OnDisconnect;
public override void Disconnect(Edge edge)
{
base.Disconnect(edge);
OnDisconnect?.Invoke(this);
}
}
static class ShaderPortExtensions
{
public static MaterialSlot GetSlot(this Port port)
{
var shaderPort = port as ShaderPort;
return shaderPort != null ? shaderPort.slot : null;
}
}
}