#if GRIFFIN
using UnityEngine;

namespace Pinwheel.Griffin.GroupTool
{
    [System.Serializable]
    public struct GShadingOverride
    {
        [SerializeField]
        private bool overrideCustomMaterial;
        public bool OverrideCustomMaterial
        {
            get
            {
                return overrideCustomMaterial;
            }
            set
            {
                overrideCustomMaterial = value;
            }
        }

        [SerializeField]
        private Material customMaterial;
        public Material CustomMaterial
        {
            get
            {
                return customMaterial;
            }
            set
            {
                customMaterial = value;
            }
        }

        [SerializeField]
        private bool overrideAlbedoMapResolution;
        public bool OverrideAlbedoMapResolution
        {
            get
            {
                return overrideAlbedoMapResolution;
            }
            set
            {
                overrideAlbedoMapResolution = value;
            }
        }

        [SerializeField]
        private int albedoMapResolution;
        public int AlbedoMapResolution
        {
            get
            {
                return albedoMapResolution;
            }
            set
            {
                albedoMapResolution = Mathf.Clamp(Mathf.ClosestPowerOfTwo(value), GCommon.TEXTURE_SIZE_MIN, GCommon.TEXTURE_SIZE_MAX);
            }
        }

        [SerializeField]
        private bool overrideMetallicMapResolution;
        public bool OverrideMetallicMapResolution
        {
            get
            {
                return overrideMetallicMapResolution;
            }
            set
            {
                overrideMetallicMapResolution = value;
            }
        }

        [SerializeField]
        private int metallicMapResolution;
        public int MetallicMapResolution
        {
            get
            {
                return metallicMapResolution;
            }
            set
            {
                metallicMapResolution = Mathf.Clamp(Mathf.ClosestPowerOfTwo(value), GCommon.TEXTURE_SIZE_MIN, GCommon.TEXTURE_SIZE_MAX);
            }
        }

        [SerializeField]
        private bool overrideAlbedoMapPropertyName;
        public bool OverrideAlbedoMapPropertyName
        {
            get
            {
                return overrideAlbedoMapPropertyName;
            }
            set
            {
                overrideAlbedoMapPropertyName = value;
            }
        }

        [SerializeField]
        private string albedoMapPropertyName;
        public string AlbedoMapPropertyName
        {
            get
            {
                return albedoMapPropertyName;
            }
            set
            {
                albedoMapPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideMetallicMapPropertyName;
        public bool OverrideMetallicMapPropertyName
        {
            get
            {
                return overrideMetallicMapPropertyName;
            }
            set
            {
                overrideMetallicMapPropertyName = value;
            }
        }

        [SerializeField]
        private string metallicMapPropertyName;
        public string MetallicMapPropertyName
        {
            get
            {
                return metallicMapPropertyName;
            }
            set
            {
                metallicMapPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideColorByHeight;
        public bool OverrideColorByHeight
        {
            get
            {
                return overrideColorByHeight;
            }
            set
            {
                overrideColorByHeight = value;
            }
        }

        [SerializeField]
        private Gradient colorByHeight;
        public Gradient ColorByHeight
        {
            get
            {
                if (colorByHeight == null)
                {
                    colorByHeight = GUtilities.Clone(GRuntimeSettings.Instance.shadingDefault.colorByHeight);
                }
                return colorByHeight;
            }
            set
            {
                colorByHeight = value;
            }
        }

        [SerializeField]
        private bool overrideColorByNormal;
        public bool OverrideColorByNormal
        {
            get
            {
                return overrideColorByNormal;
            }
            set
            {
                overrideColorByNormal = value;
            }
        }

        [SerializeField]
        private Gradient colorByNormal;
        public Gradient ColorByNormal
        {
            get
            {
                if (colorByNormal == null)
                {
                    colorByNormal = GUtilities.Clone(GRuntimeSettings.Instance.shadingDefault.colorByNormal);
                }
                return colorByNormal;
            }
            set
            {
                colorByNormal = value;
            }
        }

        [SerializeField]
        private bool overrideColorBlendCurve;
        public bool OverrideColorBlendCurve
        {
            get
            {
                return overrideColorBlendCurve;
            }
            set
            {
                overrideColorBlendCurve = value;
            }
        }

        [SerializeField]
        private AnimationCurve colorBlendCurve;
        public AnimationCurve ColorBlendCurve
        {
            get
            {
                if (colorBlendCurve == null)
                {
                    colorBlendCurve = GUtilities.Clone(GRuntimeSettings.Instance.shadingDefault.colorBlendCurve);
                }
                return colorBlendCurve;
            }
            set
            {
                colorBlendCurve = value;
            }
        }

        [SerializeField]
        private bool overrideColorByHeightPropertyName;
        public bool OverrideColorByHeightPropertyName
        {
            get
            {
                return overrideColorByHeightPropertyName;
            }
            set
            {
                overrideColorByHeightPropertyName = value;
            }
        }

        [SerializeField]
        private string colorByHeightPropertyName;
        public string ColorByHeightPropertyName
        {
            get
            {
                return colorByHeightPropertyName;
            }
            set
            {
                colorByHeightPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideColorByNormalPropertyName;
        public bool OverrideColorByNormalPropertyName
        {
            get
            {
                return overrideColorByNormalPropertyName;
            }
            set
            {
                overrideColorByNormalPropertyName = value;
            }
        }

        [SerializeField]
        private string colorByNormalPropertyName;
        public string ColorByNormalPropertyName
        {
            get
            {
                return colorByNormalPropertyName;
            }
            set
            {
                colorByNormalPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideColorBlendPropertyName;
        public bool OverrideColorBlendPropertyName
        {
            get
            {
                return overrideColorBlendPropertyName;
            }
            set
            {
                overrideColorBlendPropertyName = value;
            }
        }

        [SerializeField]
        private string colorBlendPropertyName;
        public string ColorBlendPropertyName
        {
            get
            {
                return colorBlendPropertyName;
            }
            set
            {
                colorBlendPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideDimensionPropertyName;
        public bool OverrideDimensionPropertyName
        {
            get
            {
                return overrideDimensionPropertyName;
            }
            set
            {
                overrideDimensionPropertyName = value;
            }
        }

        [SerializeField]
        private string dimensionPropertyName;
        public string DimensionPropertyName
        {
            get
            {
                return dimensionPropertyName;
            }
            set
            {
                dimensionPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideSplats;
        public bool OverrideSplats
        {
            get
            {
                return overrideSplats;
            }
            set
            {
                overrideSplats = value;
            }
        }

        [SerializeField]
        private GSplatPrototypeGroup splats;
        public GSplatPrototypeGroup Splats
        {
            get
            {
                return splats;
            }
            set
            {
                splats = value;
            }
        }

        [SerializeField]
        private bool overrideSplatControlResolution;
        public bool OverrideSplatControlResolution
        {
            get
            {
                return overrideSplatControlResolution;
            }
            set
            {
                overrideSplatControlResolution = value;
            }
        }

        [SerializeField]
        private int splatControlResolution;
        public int SplatControlResolution
        {
            get
            {
                return splatControlResolution;
            }
            set
            {
                splatControlResolution = Mathf.Clamp(Mathf.ClosestPowerOfTwo(value), GCommon.TEXTURE_SIZE_MIN, GCommon.TEXTURE_SIZE_MAX);
            }
        }

        [SerializeField]
        private bool overrideSplatControlMapPropertyName;
        public bool OverrideSplatControlMapPropertyName
        {
            get
            {
                return overrideSplatControlMapPropertyName;
            }
            set
            {
                overrideSplatControlMapPropertyName = value;
            }
        }

        [SerializeField]
        private string splatControlMapPropertyName;
        public string SplatControlMapPropertyName
        {
            get
            {
                return splatControlMapPropertyName;
            }
            set
            {
                splatControlMapPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideSplatMapPropertyName;
        public bool OverrideSplatMapPropertyName
        {
            get
            {
                return overrideSplatMapPropertyName;
            }
            set
            {
                overrideSplatMapPropertyName = value;
            }
        }

        [SerializeField]
        private string splatMapPropertyName;
        public string SplatMapPropertyName
        {
            get
            {
                return splatMapPropertyName;
            }
            set
            {
                splatMapPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideSplatNormalPropertyName;
        public bool OverrideSplatNormalPropertyName
        {
            get
            {
                return overrideSplatNormalPropertyName;
            }
            set
            {
                overrideSplatNormalPropertyName = value;
            }
        }

        [SerializeField]
        private string splatNormalPropertyName;
        public string SplatNormalPropertyName
        {
            get
            {
                return splatNormalPropertyName;
            }
            set
            {
                splatNormalPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideSplatMetallicPropertyName;
        public bool OverrideSplatMetallicPropertyName
        {
            get
            {
                return overrideSplatMetallicPropertyName;
            }
            set
            {
                overrideSplatMetallicPropertyName = value;
            }
        }

        [SerializeField]
        private string splatMetallicPropertyName;
        public string SplatMetallicPropertyName
        {
            get
            {
                return splatMetallicPropertyName;
            }
            set
            {
                splatMetallicPropertyName = value;
            }
        }

        [SerializeField]
        private bool overrideSplatSmoothnessPropertyName;
        public bool OverrideSplatSmoothnessPropertyName
        {
            get
            {
                return overrideSplatSmoothnessPropertyName;
            }
            set
            {
                overrideSplatSmoothnessPropertyName = value;
            }
        }

        [SerializeField]
        private string splatSmoothnessPropertyName;
        public string SplatSmoothnessPropertyName
        {
            get
            {
                return splatSmoothnessPropertyName;
            }
            set
            {
                splatSmoothnessPropertyName = value;
            }
        }

        public void Reset()
        {
            OverrideCustomMaterial = false;
            OverrideCustomMaterial = false;
            OverrideAlbedoMapResolution = false;
            OverrideMetallicMapResolution = false;
            OverrideAlbedoMapPropertyName = false;
            OverrideMetallicMapPropertyName = false;
            OverrideColorByHeight = false;
            OverrideColorByNormal = false;
            OverrideColorBlendCurve = false;
            OverrideColorByHeightPropertyName = false;
            OverrideColorByNormalPropertyName = false;
            OverrideColorBlendPropertyName = false;
            OverrideDimensionPropertyName = false;
            OverrideSplatControlResolution = false;
            OverrideSplatControlMapPropertyName = false;
            OverrideSplatMapPropertyName = false;
            OverrideSplatNormalPropertyName = false;
            OverrideSplatMetallicPropertyName = false;
            OverrideSplatSmoothnessPropertyName = false;

            CustomMaterial = null;
            AlbedoMapResolution = GRuntimeSettings.Instance.shadingDefault.albedoMapResolution; ;
            MetallicMapResolution = GRuntimeSettings.Instance.shadingDefault.metallicMapResolution; ;
            AlbedoMapPropertyName = GRuntimeSettings.Instance.shadingDefault.albedoMapPropertyName;
            MetallicMapPropertyName = GRuntimeSettings.Instance.shadingDefault.metallicMapPropertyName;
            ColorByHeight = GUtilities.Clone(GRuntimeSettings.Instance.shadingDefault.colorByHeight);
            ColorByNormal = GUtilities.Clone(GRuntimeSettings.Instance.shadingDefault.colorByNormal);
            ColorBlendCurve = GUtilities.Clone(GRuntimeSettings.Instance.shadingDefault.colorBlendCurve);
            ColorByHeightPropertyName = GRuntimeSettings.Instance.shadingDefault.colorByHeightPropertyName;
            ColorByNormalPropertyName = GRuntimeSettings.Instance.shadingDefault.colorByNormalPropertyName;
            ColorBlendPropertyName = GRuntimeSettings.Instance.shadingDefault.colorBlendPropertyName;
            DimensionPropertyName = GRuntimeSettings.Instance.shadingDefault.dimensionPropertyName;
            SplatControlResolution = GRuntimeSettings.Instance.shadingDefault.splatControlResolution;
            SplatControlMapPropertyName = GRuntimeSettings.Instance.shadingDefault.splatControlMapPropertyName;
            SplatMapPropertyName = GRuntimeSettings.Instance.shadingDefault.splatMapPropertyName;
            SplatNormalPropertyName = GRuntimeSettings.Instance.shadingDefault.splatNormalPropertyName;
            SplatMetallicPropertyName = GRuntimeSettings.Instance.shadingDefault.splatMetallicPropertyName;
            SplatSmoothnessPropertyName = GRuntimeSettings.Instance.shadingDefault.splatSmoothnessPropertyName;
        }

        public void Override(GShading s)
        {
            if (OverrideCustomMaterial && CustomMaterial != null)
            {
                if (s.CustomMaterial == null)
                {
                    Material mat = Object.Instantiate(CustomMaterial);
                    mat.name = "TerrainMaterial_" + s.TerrainData.Id;
#if UNITY_EDITOR
                    UnityEditor.AssetDatabase.CreateAsset(mat, string.Format("Assets/{0}.mat", mat.name));
#endif
                    s.CustomMaterial = mat;
                }
                else
                {
                    s.CustomMaterial.shader = CustomMaterial.shader;
                }
                s.UpdateMaterials();
            }
            if (OverrideAlbedoMapResolution)
                s.AlbedoMapResolution = AlbedoMapResolution;
            if (OverrideMetallicMapResolution)
                s.MetallicMapResolution = MetallicMapResolution;
            if (OverrideAlbedoMapPropertyName)
                s.AlbedoMapPropertyName = AlbedoMapPropertyName;
            if (OverrideMetallicMapPropertyName)
                s.MetallicMapPropertyName = MetallicMapPropertyName;
            if (OverrideColorByHeight)
                s.ColorByHeight = GUtilities.Clone(ColorByHeight);
            if (OverrideColorByNormal)
                s.ColorByNormal = GUtilities.Clone(ColorByNormal);
            if (OverrideColorBlendCurve)
                s.ColorBlendCurve = GUtilities.Clone(ColorBlendCurve);
            if (OverrideColorByHeightPropertyName)
                s.ColorByHeightPropertyName = ColorByHeightPropertyName;
            if (OverrideColorByNormalPropertyName)
                s.ColorByNormalPropertyName = ColorByNormalPropertyName;
            if (OverrideColorBlendPropertyName)
                s.ColorBlendPropertyName = ColorBlendPropertyName;
            if (OverrideDimensionPropertyName)
                s.DimensionPropertyName = DimensionPropertyName;
            if (OverrideSplats)
                s.Splats = Splats;
            if (OverrideSplatControlResolution)
                s.SplatControlResolution = SplatControlResolution;
            if (OverrideSplatControlMapPropertyName)
                s.SplatControlMapPropertyName = SplatControlMapPropertyName;
            if (OverrideSplatMapPropertyName)
                s.SplatMapPropertyName = SplatMapPropertyName;
            if (OverrideSplatNormalPropertyName)
                s.SplatNormalPropertyName = SplatNormalPropertyName;
            if (OverrideSplatMetallicPropertyName)
                s.SplatMetallicPropertyName = SplatMetallicPropertyName;
            if (OverrideSplatSmoothnessPropertyName)
                s.SplatSmoothnessPropertyName = SplatSmoothnessPropertyName;

            if (OverrideColorByHeight || OverrideColorByNormal || OverrideColorBlendCurve)
            {
                s.UpdateLookupTextures();
            }
        }
    }
}
#endif