| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | using System;using UnityEngine;namespace MPUIKIT {    /// <summary>    /// N-star polygon shape is equal sided uniform polygon shape with the ability to morph    /// to a star corresponding to the original shape. ie: an equilateral pentagon will morph    /// to a five sided star.    /// </summary>    [Serializable]    public struct NStarPolygon: IMPUIComponent {        [SerializeField] private float m_SideCount;        [SerializeField] private float m_Inset;        [SerializeField] private float m_CornerRadius;        [SerializeField] private Vector2 m_Offset;                /// <summary>        /// How many sides should there be in the shape. These sides are equal is size.        /// 3 sides create an equilateral triangle, 6 sides create a hexagon and so on        /// <para>Value of SideCount should remain between 3 and 10.</para>        /// </summary>        public float SideCount {            get => m_SideCount;            set {                m_SideCount = Mathf.Clamp(value, 3f, 10f);                if (ShouldModifySharedMat) {                    SharedMat.SetFloat(SpNStarPolygonSideCount, m_SideCount);                }                OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);                Inset = m_Inset;            }        }        /// <summary>        /// Inset is the value that determine how much should the sides go inside the shape        /// and create a concave star shape. Each sides will break into half and their middle        /// point will go towards the center of the shape        /// <para>Value of inset should remain between 2 and (SideCount - 0.01). 2 is default        /// and means no breaking of the sides. </para>        /// </summary>        public float Inset {            get => m_Inset;            set {                m_Inset = Mathf.Clamp(value, 2f, SideCount - 0.01f);                if (ShouldModifySharedMat) {                    SharedMat.SetFloat(SpNStarPolygonInset, m_Inset);                }                OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);            }        }        /// <summary>        /// Corner Radius of all the corners of the shape.        /// </summary>        public float CornerRadius {            get => m_CornerRadius;            set {                m_CornerRadius = Mathf.Max(value, 0);                if (ShouldModifySharedMat) {                    SharedMat.SetFloat(SpNStarPolygonCornerRadius, m_CornerRadius);                }                OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);            }        }        /// <summary>        /// Position offset of the shape from the origin.        /// </summary>        public Vector2 Offset {            get => m_Offset;            set {                m_Offset = value;                if (ShouldModifySharedMat) {                    SharedMat.SetVector(SpNStarPolygonOffset, m_Offset);                }                OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);            }        }                private static readonly int SpNStarPolygonSideCount = Shader.PropertyToID("_NStarPolygonSideCount");        private static readonly int SpNStarPolygonInset = Shader.PropertyToID("_NStarPolygonInset");        private static readonly int SpNStarPolygonCornerRadius = Shader.PropertyToID("_NStarPolygonCornerRadius");        private static readonly int SpNStarPolygonOffset = Shader.PropertyToID("_NStarPolygonOffset");        public Material SharedMat { get; set; }        public bool ShouldModifySharedMat { get; set; }        public RectTransform RectTransform { get; set; }                public void Init(Material sharedMat, Material renderMat, RectTransform rectTransform) {            SharedMat = sharedMat;            ShouldModifySharedMat = sharedMat == renderMat;            RectTransform = rectTransform;                        OnValidate();        }        public event EventHandler OnComponentSettingsChanged;        public void OnValidate() {            SideCount = m_SideCount;            Inset = m_Inset;            CornerRadius = m_CornerRadius;            Offset = m_Offset;        }        public void InitValuesFromMaterial(ref Material material) {            m_SideCount = material.GetFloat(SpNStarPolygonSideCount);            m_Inset = material.GetFloat(SpNStarPolygonInset);            m_CornerRadius = material.GetFloat(SpNStarPolygonCornerRadius);            m_Offset = material.GetVector(SpNStarPolygonOffset);        }        public void ModifyMaterial(ref Material material, params object[] otherProperties) {            material.SetFloat(SpNStarPolygonSideCount, m_SideCount);            material.SetFloat(SpNStarPolygonInset, m_Inset);            material.SetFloat(SpNStarPolygonCornerRadius, m_CornerRadius);            material.SetVector(SpNStarPolygonOffset, m_Offset);        }    }}
 |