using System; using UnityEngine; namespace MPUIKIT { /// /// Isosceles triangle where two sides of the triangle are equal. Width and height of the shape is /// the same as the rect-transform /// [Serializable] public struct Triangle : IMPUIComponent { [SerializeField] private Vector3 m_CornerRadius; #if UNITY_EDITOR [SerializeField] private bool m_UniformCornerRadius; #endif /// /// Radius of the three corners. Counter-Clockwise from bottom-left /// x => bottom-left, y => bottom-right /// z => top /// public Vector3 CornerRadius { get => m_CornerRadius; set { m_CornerRadius = Vector3.Max(value, Vector3.zero); if (ShouldModifySharedMat) { SharedMat.SetVector(SpTriangleCornerRadius, m_CornerRadius); } OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty); } } private static readonly int SpTriangleCornerRadius = Shader.PropertyToID("_TriangleCornerRadius"); public Material SharedMat { get; set; } public bool ShouldModifySharedMat { get; set; } public RectTransform RectTransform { get; set; } public void Init(Material sharedMat, Material renderMat, RectTransform rectTransform) { this.SharedMat = sharedMat; this.ShouldModifySharedMat = sharedMat == renderMat; this.RectTransform = rectTransform; } public event EventHandler OnComponentSettingsChanged; public void OnValidate() { CornerRadius = m_CornerRadius; } public void InitValuesFromMaterial(ref Material material) { m_CornerRadius = material.GetVector(SpTriangleCornerRadius); } public void ModifyMaterial(ref Material material, params object[] otherProperties) { material.SetVector(SpTriangleCornerRadius, m_CornerRadius); } } }