您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
113 行
3.4 KiB
113 行
3.4 KiB
using System;
|
|
using UnityEditor.Experimental.UIElements.GraphView;
|
|
using UnityEngine;
|
|
using UnityEngine.Experimental.UIElements;
|
|
using UnityEngine.Experimental.UIElements.StyleSheets;
|
|
|
|
namespace UnityEditor.ShaderGraph.Drawing
|
|
{
|
|
public class PortInputView : GraphElement, IDisposable
|
|
{
|
|
const string k_EdgeColorProperty = "edge-color";
|
|
|
|
StyleValue<Color> m_EdgeColor;
|
|
|
|
public Color edgeColor
|
|
{
|
|
get { return m_EdgeColor.GetSpecifiedValueOrDefault(Color.red); }
|
|
}
|
|
|
|
public MaterialSlot slot
|
|
{
|
|
get { return m_Slot; }
|
|
}
|
|
|
|
MaterialSlot m_Slot;
|
|
ConcreteSlotValueType m_SlotType;
|
|
VisualElement m_Control;
|
|
VisualElement m_Container;
|
|
EdgeControl m_EdgeControl;
|
|
|
|
public PortInputView(MaterialSlot slot)
|
|
{
|
|
AddStyleSheetPath("Styles/PortInputView");
|
|
pickingMode = PickingMode.Ignore;
|
|
ClearClassList();
|
|
m_Slot = slot;
|
|
m_SlotType = slot.concreteValueType;
|
|
AddToClassList("type" + m_SlotType);
|
|
|
|
m_EdgeControl = new EdgeControl
|
|
{
|
|
@from = new Vector2(212f - 21f, 11.5f),
|
|
to = new Vector2(212f, 11.5f),
|
|
edgeWidth = 2,
|
|
pickingMode = PickingMode.Ignore
|
|
};
|
|
Add(m_EdgeControl);
|
|
|
|
m_Container = new VisualElement { name = "container" };
|
|
{
|
|
m_Control = this.slot.InstantiateControl();
|
|
if (m_Control != null)
|
|
m_Container.Add(m_Control);
|
|
|
|
var slotElement = new VisualElement { name = "slot" };
|
|
{
|
|
slotElement.Add(new VisualElement { name = "dot" });
|
|
}
|
|
m_Container.Add(slotElement);
|
|
}
|
|
Add(m_Container);
|
|
|
|
m_Container.visible = m_EdgeControl.visible = m_Control != null;
|
|
}
|
|
|
|
protected override void OnStyleResolved(ICustomStyle styles)
|
|
{
|
|
base.OnStyleResolved(styles);
|
|
styles.ApplyCustomProperty(k_EdgeColorProperty, ref m_EdgeColor);
|
|
m_EdgeControl.UpdateLayout();
|
|
m_EdgeControl.inputColor = edgeColor;
|
|
m_EdgeControl.outputColor = edgeColor;
|
|
}
|
|
|
|
public void UpdateSlot(MaterialSlot newSlot)
|
|
{
|
|
m_Slot = newSlot;
|
|
Recreate();
|
|
}
|
|
|
|
public void UpdateSlotType()
|
|
{
|
|
if (slot.concreteValueType != m_SlotType)
|
|
Recreate();
|
|
}
|
|
|
|
void Recreate()
|
|
{
|
|
RemoveFromClassList("type" + m_SlotType);
|
|
m_SlotType = slot.concreteValueType;
|
|
AddToClassList("type" + m_SlotType);
|
|
if (m_Control != null)
|
|
{
|
|
var disposable = m_Control as IDisposable;
|
|
if (disposable != null)
|
|
disposable.Dispose();
|
|
m_Container.Remove(m_Control);
|
|
}
|
|
m_Control = slot.InstantiateControl();
|
|
if (m_Control != null)
|
|
m_Container.Insert(0, m_Control);
|
|
|
|
m_Container.visible = m_EdgeControl.visible = m_Control != null;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
var disposable = m_Control as IDisposable;
|
|
if (disposable != null)
|
|
disposable.Dispose();
|
|
}
|
|
}
|
|
}
|