| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 | using System;using UnityEngine;namespace MPUIKIT {    /// <summary>    /// Hexagon shape with two opposite parallel equal sides. It is basically a rectangle where two    /// of it's sides are broken into halves and pulled out of the shape that creates two triangle tips    /// left and right of the shape.    /// </summary>    [Serializable]    public struct Hexagon: IMPUIComponent {        [SerializeField] private Vector4 m_CornerRadius;        [SerializeField] private bool m_UniformCornerRadius;        [SerializeField] private Vector2 m_TipSize;        [SerializeField] private bool m_UniformTipSize;        [SerializeField] private Vector2 m_TipRadius;        [SerializeField] private bool m_UniformTipRadius;                /// <summary>        /// Sizes of the two tips (the triangular part sticking out of the rectangular part of the shape)        /// <para>x => left tip, y => right tip</para>        /// </summary>        public Vector2 TipSize {            get => m_TipSize;            set {                m_TipSize = Vector2.Max(value, Vector2.one);                if (ShouldModifySharedMat) {                    SharedMat.SetVector(SpHexagonTipSizes, m_TipSize);                }                OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);            }        }        /// <summary>        /// Radius of the corner of the tips.        /// <para>x => left tip's corner, y => right tip's corner</para>        /// </summary>        public Vector2 TipRadius {            get => m_TipRadius;            set {                m_TipRadius = Vector2.Max(value, Vector2.one);                 if (ShouldModifySharedMat) {                    SharedMat.SetVector(SpHexagonTipRadius, m_TipRadius);                }                OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);            }        }        /// <summary>        /// <para>Radius of the four corners of the rectangular part of the shape.        /// Counter-Clockwise from bottom-left</para>        /// <para>x => bottom-left, y => bottom-right</para>        /// <para>z => top-right, w => top-left</para>        /// </summary>        public Vector4 CornerRadius {            get => m_CornerRadius;            set {                m_CornerRadius = Vector4.Max(value, Vector4.one);                if (ShouldModifySharedMat) {                    SharedMat.SetVector(SpHexagonRectCornerRadius, m_CornerRadius);                }                OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);            }        }                private static readonly int SpHexagonTipSizes = Shader.PropertyToID("_HexagonTipSize");        private static readonly int SpHexagonTipRadius = Shader.PropertyToID("_HexagonTipRadius");        private static readonly int SpHexagonRectCornerRadius = Shader.PropertyToID("_HexagonCornerRadius");        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;            TipRadius = m_TipRadius;            TipSize = m_TipSize;        }        public event EventHandler OnComponentSettingsChanged;        public void OnValidate() {            CornerRadius = m_CornerRadius;            TipSize = m_TipSize;            TipRadius = m_TipRadius;        }        public void InitValuesFromMaterial(ref Material material) {            m_CornerRadius = material.GetVector(SpHexagonRectCornerRadius);            m_TipRadius = material.GetVector(SpHexagonTipRadius);            m_TipSize = material.GetVector(SpHexagonTipSizes);        }        public void ModifyMaterial(ref Material material, params object[] otherProperties) {            material.SetVector(SpHexagonTipSizes, m_TipSize);            material.SetVector(SpHexagonTipRadius, m_TipRadius);            material.SetVector(SpHexagonRectCornerRadius, m_CornerRadius);        }    }}
 |