using System;
using UnityEngine;
namespace MPUIKIT {
///
/// Basic Rectangle shape with the same width and height of the rect-transform
///
[Serializable]
public struct Rectangle : IMPUIComponent{
[SerializeField] private Vector4 m_CornerRadius;
#if UNITY_EDITOR
[SerializeField] private bool m_UniformCornerRadius;
#endif
///
/// Radius of the four corners. Counter-Clockwise from bottom-left
/// x => bottom-left, y => bottom-right
/// z => top-right, w => top-left
///
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;
}
}
}