| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | using System;using UnityEngine;namespace MPUIKIT {    /// <summary>    /// Basic Rectangle shape with the same width and height of the rect-transform    /// </summary>    [Serializable]    public struct Rectangle : IMPUIComponent{        [SerializeField] private Vector4 m_CornerRadius;#if UNITY_EDITOR        [SerializeField] private bool m_UniformCornerRadius;#endif        /// <summary>        /// <para>Radius of the four corners. 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.zero);                if (ShouldModifySharedMat) {                    SharedMat.SetVector(SpRectangleCornerRadius, m_CornerRadius);                }                OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);            }        }        public Material SharedMat { get; set; }        public bool ShouldModifySharedMat { get; set; }        public RectTransform RectTransform { get; set; }                private static readonly int SpRectangleCornerRadius = Shader.PropertyToID("_RectangleCornerRadius");        public void Init(Material sharedMat, Material renderMat, RectTransform rectTransform) {            SharedMat = sharedMat;            ShouldModifySharedMat = sharedMat == renderMat;            RectTransform = rectTransform;        }        public event EventHandler OnComponentSettingsChanged;                public void OnValidate() {            CornerRadius = m_CornerRadius;        }        public void InitValuesFromMaterial(ref Material material) {            m_CornerRadius = material.GetVector(SpRectangleCornerRadius);        }        public void ModifyMaterial(ref Material material, params object[] otherProperties)        {            Vector4 cornerRadius = FixRadius(m_CornerRadius);            material.SetVector(SpRectangleCornerRadius, cornerRadius);        }        private Vector4 FixRadius(Vector4 radius)        {            Rect rect = RectTransform.rect;                        radius = Vector4.Max(radius, Vector4.zero);            radius = Vector4.Min(radius, Vector4.one * Mathf.Min(rect.width, rect.height));            float scaleFactor =                 Mathf.Min (                    Mathf.Min (                        Mathf.Min (                            Mathf.Min (                                rect.width / (radius.x + radius.y),                                 rect.width / (radius.z + radius.w)),                            rect.height / (radius.x + radius.w)),                         rect.height / (radius.z + radius.y)),                     1f);            return radius * scaleFactor;        }    }}
 |