| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 | using System;using System.Collections.Generic;using UnityEngine;namespace GraphProcessor{	[Serializable]	public class ExposedParameter : ISerializationCallbackReceiver	{        [Serializable]        public class Settings        {            public bool isHidden = false;            public bool expanded = false;            [SerializeField]            internal string guid = null;            public override bool Equals(object obj)            {                if (obj is Settings s && s != null)                    return Equals(s);                else                    return false;            }            public virtual bool Equals(Settings param)                => isHidden == param.isHidden && expanded == param.expanded;            public override int GetHashCode() => base.GetHashCode();        }		public string				guid; // unique id to keep track of the parameter		public string				name;		[Obsolete("Use GetValueType()")]		public string				type;		[Obsolete("Use value instead")]		public SerializableObject	serializedValue;		public bool					input = true;        [SerializeReference]		public Settings             settings;		public string shortType => GetValueType()?.Name;        public void Initialize(string name, object value)        {			guid = Guid.NewGuid().ToString(); // Generated once and unique per parameter            settings = CreateSettings();            settings.guid = guid;			this.name = name;			this.value = value;        }		void ISerializationCallbackReceiver.OnAfterDeserialize()		{			// SerializeReference migration step:#pragma warning disable CS0618			if (serializedValue?.value != null) // old serialization system can't serialize null values			{				value = serializedValue.value;				Debug.Log("Migrated: " + serializedValue.value + " | " + serializedValue.serializedName);				serializedValue.value = null;			}#pragma warning restore CS0618		}		void ISerializationCallbackReceiver.OnBeforeSerialize() {}        protected virtual Settings CreateSettings() => new Settings();        public virtual object value { get; set; }        public virtual Type GetValueType() => value == null ? typeof(object) : value.GetType();        static Dictionary<Type, Type> exposedParameterTypeCache = new Dictionary<Type, Type>();        internal ExposedParameter Migrate()        {            if (exposedParameterTypeCache.Count == 0)            {                foreach (var type in AppDomain.CurrentDomain.GetAllTypes())                {                    if (type.IsSubclassOf(typeof(ExposedParameter)) && !type.IsAbstract)                    {                        var paramType = Activator.CreateInstance(type) as ExposedParameter;                        exposedParameterTypeCache[paramType.GetValueType()] = type;                    }                }            }#pragma warning disable CS0618 // Use of obsolete fields            var oldType = Type.GetType(type);#pragma warning restore CS0618            if (oldType == null || !exposedParameterTypeCache.TryGetValue(oldType, out var newParamType))                return null;                        var newParam = Activator.CreateInstance(newParamType) as ExposedParameter;            newParam.guid = guid;            newParam.name = name;            newParam.input = input;            newParam.settings = newParam.CreateSettings();            newParam.settings.guid = guid;            return newParam;             }        public static bool operator ==(ExposedParameter param1, ExposedParameter param2)        {            if (ReferenceEquals(param1, null) && ReferenceEquals(param2, null))                return true;            if (ReferenceEquals(param1, param2))                return true;            if (ReferenceEquals(param1, null))                return false;            if (ReferenceEquals(param2, null))                return false;            return param1.Equals(param2);        }        public static bool operator !=(ExposedParameter param1, ExposedParameter param2) => !(param1 == param2);        public bool Equals(ExposedParameter parameter) => guid == parameter.guid;        public override bool Equals(object obj)        {            if ((obj == null) || !this.GetType().Equals(obj.GetType()))                return false;            else                return Equals((ExposedParameter)obj);        }        public override int GetHashCode() => guid.GetHashCode();        public ExposedParameter Clone()        {            var clonedParam = Activator.CreateInstance(GetType()) as ExposedParameter;            clonedParam.guid = guid;            clonedParam.name = name;            clonedParam.input = input;            clonedParam.settings = settings;            clonedParam.value = value;            return clonedParam;        }	}    // Due to polymorphic constraints with [SerializeReference] we need to explicitly create a class for    // every parameter type available in the graph (i.e. templating doesn't work)    [System.Serializable]    public class ColorParameter : ExposedParameter    {        public enum ColorMode        {            Default,            HDR        }        [Serializable]        public class ColorSettings : Settings        {            public ColorMode mode;            public override bool Equals(Settings param)                => base.Equals(param) && mode == ((ColorSettings)param).mode;        }        [SerializeField] Color val;        public override object value { get => val; set => val = (Color)value; }        protected override Settings CreateSettings() => new ColorSettings();    }    [System.Serializable]    public class FloatParameter : ExposedParameter    {        public enum FloatMode        {            Default,            Slider,        }        [Serializable]        public class FloatSettings : Settings        {            public FloatMode mode;            public float min = 0;            public float max = 1;            public override bool Equals(Settings param)                => base.Equals(param) && mode == ((FloatSettings)param).mode && min == ((FloatSettings)param).min && max == ((FloatSettings)param).max;        }        [SerializeField] float val;        public override object value { get => val; set => val = (float)value; }        protected override Settings CreateSettings() => new FloatSettings();    }    [System.Serializable]    public class Vector2Parameter : ExposedParameter    {        public enum Vector2Mode        {            Default,            MinMaxSlider,        }        [Serializable]        public class Vector2Settings : Settings        {            public Vector2Mode mode;            public float min = 0;            public float max = 1;            public override bool Equals(Settings param)                => base.Equals(param) && mode == ((Vector2Settings)param).mode && min == ((Vector2Settings)param).min && max == ((Vector2Settings)param).max;        }        [SerializeField] Vector2 val;        public override object value { get => val; set => val = (Vector2)value; }        protected override Settings CreateSettings() => new Vector2Settings();    }    [System.Serializable]    public class Vector3Parameter : ExposedParameter    {        [SerializeField] Vector3 val;        public override object value { get => val; set => val = (Vector3)value; }    }    [System.Serializable]    public class Vector4Parameter : ExposedParameter    {        [SerializeField] Vector4 val;        public override object value { get => val; set => val = (Vector4)value; }    }    [System.Serializable]    public class IntParameter : ExposedParameter    {        public enum IntMode        {            Default,            Slider,        }        [Serializable]        public class IntSettings : Settings        {            public IntMode mode;            public int min = 0;            public int max = 10;            public override bool Equals(Settings param)                => base.Equals(param) && mode == ((IntSettings)param).mode && min == ((IntSettings)param).min && max == ((IntSettings)param).max;        }        [SerializeField] int val;        public override object value { get => val; set => val = (int)value; }        protected override Settings CreateSettings() => new IntSettings();    }    [System.Serializable]    public class Vector2IntParameter : ExposedParameter    {        [SerializeField] Vector2Int val;        public override object value { get => val; set => val = (Vector2Int)value; }    }    [System.Serializable]    public class Vector3IntParameter : ExposedParameter    {        [SerializeField] Vector3Int val;        public override object value { get => val; set => val = (Vector3Int)value; }    }    [System.Serializable]    public class DoubleParameter : ExposedParameter    {        [SerializeField] Double val;        public override object value { get => val; set => val = (Double)value; }    }    [System.Serializable]    public class LongParameter : ExposedParameter    {        [SerializeField] long val;        public override object value { get => val; set => val = (long)value; }    }    [System.Serializable]    public class StringParameter : ExposedParameter    {        [SerializeField] string val;        public override object value { get => val; set => val = (string)value; }        public override Type GetValueType() => typeof(String);    }    [System.Serializable]    public class RectParameter : ExposedParameter    {        [SerializeField] Rect val;        public override object value { get => val; set => val = (Rect)value; }    }    [System.Serializable]    public class RectIntParameter : ExposedParameter    {        [SerializeField] RectInt val;        public override object value { get => val; set => val = (RectInt)value; }    }    [System.Serializable]    public class BoundsParameter : ExposedParameter    {        [SerializeField] Bounds val;        public override object value { get => val; set => val = (Bounds)value; }    }    [System.Serializable]    public class BoundsIntParameter : ExposedParameter    {        [SerializeField] BoundsInt val;        public override object value { get => val; set => val = (BoundsInt)value; }    }    [System.Serializable]    public class AnimationCurveParameter : ExposedParameter    {        [SerializeField] AnimationCurve val;        public override object value { get => val; set => val = (AnimationCurve)value; }        public override Type GetValueType() => typeof(AnimationCurve);    }    [System.Serializable]    public class GradientParameter : ExposedParameter    {        public enum GradientColorMode        {            Default,            HDR,        }        [Serializable]        public class GradientSettings : Settings        {            public GradientColorMode mode;            public override bool Equals(Settings param)                => base.Equals(param) && mode == ((GradientSettings)param).mode;        }        [SerializeField] Gradient val;        [SerializeField, GradientUsage(true)] Gradient hdrVal;        public override object value { get => val; set => val = (Gradient)value; }        public override Type GetValueType() => typeof(Gradient);        protected override Settings CreateSettings() => new GradientSettings();    }    [System.Serializable]    public class GameObjectParameter : ExposedParameter    {        [SerializeField] GameObject val;        public override object value { get => val; set => val = (GameObject)value; }        public override Type GetValueType() => typeof(GameObject);    }    [System.Serializable]    public class BoolParameter : ExposedParameter    {        [SerializeField] bool val;        public override object value { get => val; set => val = (bool)value; }    }    [System.Serializable]    public class Texture2DParameter : ExposedParameter    {        [SerializeField] Texture2D val;        public override object value { get => val; set => val = (Texture2D)value; }        public override Type GetValueType() => typeof(Texture2D);    }    [System.Serializable]    public class RenderTextureParameter : ExposedParameter    {        [SerializeField] RenderTexture val;        public override object value { get => val; set => val = (RenderTexture)value; }        public override Type GetValueType() => typeof(RenderTexture);    }    [System.Serializable]    public class MeshParameter : ExposedParameter    {        [SerializeField] Mesh val;        public override object value { get => val; set => val = (Mesh)value; }        public override Type GetValueType() => typeof(Mesh);    }    [System.Serializable]    public class MaterialParameter : ExposedParameter    {        [SerializeField] Material val;        public override object value { get => val; set => val = (Material)value; }        public override Type GetValueType() => typeof(Material);    }   }
 |