Circle.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using UnityEngine;
  3. namespace MPUIKIT {
  4. /// <summary>
  5. /// Just a basic circle.
  6. /// </summary>
  7. [Serializable]
  8. public struct Circle : IMPUIComponent {
  9. [SerializeField] private float m_Radius;
  10. [SerializeField] private bool m_FitRadius;
  11. private static readonly int SpRadius = Shader.PropertyToID("_CircleRadius");
  12. private static readonly int SpFitRadius = Shader.PropertyToID("_CircleFitRadius");
  13. /// <summary>
  14. /// Radius of the circle. This has no effect if FitToRect is set to true.
  15. /// </summary>
  16. public float Radius {
  17. get => m_Radius;
  18. set {
  19. m_Radius = Mathf.Max(value, 0f);
  20. if (ShouldModifySharedMat) {
  21. SharedMat.SetFloat(SpRadius, m_Radius);
  22. }
  23. OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);
  24. }
  25. }
  26. /// <summary>
  27. /// Fit the circe to the rect-transform
  28. /// </summary>
  29. public bool FitToRect {
  30. get => m_FitRadius;
  31. set {
  32. m_FitRadius = value;
  33. if (ShouldModifySharedMat) {
  34. SharedMat.SetInt(SpFitRadius, m_FitRadius?1:0);
  35. }
  36. OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);
  37. }
  38. }
  39. private float CircleFitRadius => Mathf.Min(RectTransform.rect.width, RectTransform.rect.height) / 2;
  40. public Material SharedMat { get; set; }
  41. public bool ShouldModifySharedMat { get; set; }
  42. public RectTransform RectTransform { get; set; }
  43. public void Init(Material sharedMat, Material renderMat, RectTransform rectTransform) {
  44. this.SharedMat = sharedMat;
  45. this.ShouldModifySharedMat = sharedMat == renderMat;
  46. this.RectTransform = rectTransform;
  47. }
  48. public event EventHandler OnComponentSettingsChanged;
  49. public void OnValidate() {
  50. Radius = m_Radius;
  51. FitToRect = m_FitRadius;
  52. }
  53. public void InitValuesFromMaterial(ref Material material) {
  54. m_Radius = material.GetFloat(SpRadius);
  55. m_FitRadius = material.GetInt(SpFitRadius) == 1;
  56. }
  57. public void ModifyMaterial(ref Material material, params object[] otherProperties) {
  58. material.SetFloat(SpRadius, m_Radius);
  59. material.SetInt(SpFitRadius, m_FitRadius?1:0);
  60. }
  61. internal void UpdateCircleRadius(RectTransform rectT) {
  62. this.RectTransform = rectT;
  63. if (m_FitRadius) {
  64. m_Radius = CircleFitRadius;
  65. }
  66. }
  67. }
  68. }