Files
2026-11-01 23:39:55 +02:00

115 lines
4.1 KiB
C#

using System;
using UnityEditor.Graphing;
using UnityEngine;
using UnityEditor.ShaderGraph;
using UnityEditor.ShaderGraph.Drawing.Controls;
using Object = UnityEngine.Object;
using UnityEditor.UIElements;
using UnityEngine.UIElements;
using UnityEngine.UIElements.StyleSheets;
namespace UnityEditor.ShaderGraph.Drawing.Slots
{
class GradientSlotControlView : VisualElement
{
GradientInputMaterialSlot m_Slot;
[SerializeField]
GradientObject m_GradientObject;
[SerializeField]
SerializedObject m_SerializedObject;
GradientField m_Field;
public bool isShowingGradientEditor => GradientPicker.visible && m_Field.isShowingGradientPicker;
GradientUndoSession m_UndoSession;
public GradientSlotControlView(GradientInputMaterialSlot slot, bool showGradientEditor)
{
m_Slot = slot;
if (!slot.hideConnector)
styleSheets.Add(Resources.Load<StyleSheet>("Styles/Controls/GradientSlotControlView"));
else styleSheets.Add(Resources.Load<StyleSheet>("Styles/Controls/GradientControlView"));
m_GradientObject = ScriptableObject.CreateInstance<GradientObject>();
m_GradientObject.gradient = new Gradient();
m_SerializedObject = new SerializedObject(m_GradientObject);
m_GradientObject.gradient.SetKeys(m_Slot.value.colorKeys, m_Slot.value.alphaKeys);
m_GradientObject.gradient.mode = m_Slot.value.mode;
m_Field = new GradientField() { label = m_Slot.hideConnector ? m_Slot.RawDisplayName() : null, value = m_GradientObject.gradient, colorSpace = ColorSpace.Linear, hdr = true };
m_Field.RegisterValueChangedCallback(OnValueChanged);
m_Field.pickerClosed += OnPickerClosed;
Add(m_Field);
m_UndoSession = new GradientUndoSession(
() => m_Slot.value,
value =>
{
m_Slot.value = value;
m_Slot.owner?.Dirty(ModificationScope.Node);
},
() => m_Slot.owner.owner.owner.RegisterCompleteObjectUndo("Modify Gradient"),
() => m_Slot?.owner?.owner?.owner != null && !m_Slot.owner.owner.replaceInProgress);
RegisterCallback<AttachToPanelEvent>(OnAttachToPanel);
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
if (showGradientEditor)
m_Field.ShowGradientPicker();
}
void OnAttachToPanel(AttachToPanelEvent evt)
{
Undo.undoRedoPerformed += OnUndoRedoPerformed;
}
void OnValueChanged(ChangeEvent<Gradient> evt)
{
m_SerializedObject.Update();
if (!evt.newValue.Equals(m_Slot.value))
{
m_UndoSession.BeginChange();
Undo.RegisterCompleteObjectUndo(m_GradientObject, "Modify Gradient Stop");
m_GradientObject.gradient.SetKeys(evt.newValue.colorKeys, evt.newValue.alphaKeys);
m_GradientObject.gradient.mode = evt.newValue.mode;
m_SerializedObject.ApplyModifiedProperties();
m_Slot.value = m_GradientObject.gradient;
m_Slot.owner.Dirty(ModificationScope.Node);
m_Slot.owner.owner.owner.isDirty = true;
}
}
void OnUndoRedoPerformed()
{
if (m_GradientObject == null || m_Slot == null)
return;
m_SerializedObject.Update();
m_Slot.value = m_GradientObject.gradient;
m_Slot.owner?.Dirty(ModificationScope.Node);
var graphObject = m_Slot.owner?.owner?.owner;
if (graphObject != null)
graphObject.isDirty = true;
m_Field.SetValueWithoutNotify(m_GradientObject.gradient);
}
void OnPickerClosed()
{
m_UndoSession.RecordNetChange();
}
void OnDetachFromPanel(DetachFromPanelEvent evt)
{
m_UndoSession.RecordNetChange();
Undo.undoRedoPerformed -= OnUndoRedoPerformed;
m_Field.pickerClosed -= OnPickerClosed;
}
}
}