A game about forced loneliness, made by TACStudios
1using System; 2using System.Reflection; 3using UnityEngine; 4using UnityEditor.Graphing; 5using UnityEditor.ShaderGraph; 6using UnityEditor.UIElements; 7using UnityEngine.UIElements; 8 9namespace UnityEditor.ShaderGraph.Drawing.Controls 10{ 11 [AttributeUsage(AttributeTargets.Property)] 12 class GradientControlAttribute : Attribute, IControlAttribute 13 { 14 string m_Label; 15 16 public GradientControlAttribute(string label = null) 17 { 18 m_Label = label; 19 } 20 21 public VisualElement InstantiateControl(AbstractMaterialNode node, PropertyInfo propertyInfo) 22 { 23 return new GradientControlView(m_Label, node, propertyInfo); 24 } 25 } 26 27 [Serializable] 28 class GradientObject : ScriptableObject 29 { 30 public Gradient gradient = new Gradient(); 31 } 32 33 class GradientControlView : VisualElement 34 { 35 GUIContent m_Label; 36 37 AbstractMaterialNode m_Node; 38 39 PropertyInfo m_PropertyInfo; 40 41 [SerializeField] 42 GradientObject m_GradientObject; 43 44 [SerializeField] 45 SerializedObject m_SerializedObject; 46 47 public GradientControlView(string label, AbstractMaterialNode node, PropertyInfo propertyInfo) 48 { 49 m_Node = node; 50 m_PropertyInfo = propertyInfo; 51 styleSheets.Add(Resources.Load<StyleSheet>("Styles/Controls/GradientControlView")); 52 53 if (propertyInfo.PropertyType != typeof(Gradient)) 54 throw new ArgumentException("Property must be of type Gradient.", "propertyInfo"); 55 new GUIContent(label ?? ObjectNames.NicifyVariableName(propertyInfo.Name)); 56 57 m_GradientObject = ScriptableObject.CreateInstance<GradientObject>(); 58 m_GradientObject.gradient = new Gradient(); 59 m_SerializedObject = new SerializedObject(m_GradientObject); 60 61 var gradient = (Gradient)m_PropertyInfo.GetValue(m_Node, null); 62 m_GradientObject.gradient.SetKeys(gradient.colorKeys, gradient.alphaKeys); 63 m_GradientObject.gradient.mode = gradient.mode; 64 65 var gradientPanel = new VisualElement { name = "gradientPanel" }; 66 if (!string.IsNullOrEmpty(label)) 67 gradientPanel.Add(new Label(label)); 68 69 var gradientField = new GradientField() { value = m_GradientObject.gradient, colorSpace = ColorSpace.Linear, hdr = true }; 70 gradientField.RegisterValueChangedCallback(OnValueChanged); 71 gradientPanel.Add(gradientField); 72 73 Add(gradientPanel); 74 } 75 76 void OnValueChanged(ChangeEvent<Gradient> evt) 77 { 78 m_SerializedObject.Update(); 79 var value = (Gradient)m_PropertyInfo.GetValue(m_Node, null); 80 if (!evt.newValue.Equals(value)) 81 { 82 m_GradientObject.gradient.SetKeys(evt.newValue.colorKeys, evt.newValue.alphaKeys); 83 m_GradientObject.gradient.mode = evt.newValue.mode; 84 m_SerializedObject.ApplyModifiedProperties(); 85 86 m_Node.owner.owner.RegisterCompleteObjectUndo("Change " + m_Node.name); 87 m_PropertyInfo.SetValue(m_Node, m_GradientObject.gradient, null); 88 this.MarkDirtyRepaint(); 89 } 90 } 91 } 92}