12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- using System;
- using UnityEngine;
- namespace MPUIKIT {
- /// <summary>
- /// Just a basic circle.
- /// </summary>
- [Serializable]
- public struct Circle : IMPUIComponent {
- [SerializeField] private float m_Radius;
- [SerializeField] private bool m_FitRadius;
-
- private static readonly int SpRadius = Shader.PropertyToID("_CircleRadius");
- private static readonly int SpFitRadius = Shader.PropertyToID("_CircleFitRadius");
- /// <summary>
- /// Radius of the circle. This has no effect if FitToRect is set to true.
- /// </summary>
- public float Radius {
- get => m_Radius;
- set {
- m_Radius = Mathf.Max(value, 0f);
- if (ShouldModifySharedMat) {
- SharedMat.SetFloat(SpRadius, m_Radius);
- }
- OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);
- }
- }
- /// <summary>
- /// Fit the circe to the rect-transform
- /// </summary>
- public bool FitToRect {
- get => m_FitRadius;
- set {
- m_FitRadius = value;
- if (ShouldModifySharedMat) {
- SharedMat.SetInt(SpFitRadius, m_FitRadius?1:0);
- }
- OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);
- }
- }
-
- private float CircleFitRadius => Mathf.Min(RectTransform.rect.width, RectTransform.rect.height) / 2;
- 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() {
- Radius = m_Radius;
- FitToRect = m_FitRadius;
- }
- public void InitValuesFromMaterial(ref Material material) {
- m_Radius = material.GetFloat(SpRadius);
- m_FitRadius = material.GetInt(SpFitRadius) == 1;
- }
- public void ModifyMaterial(ref Material material, params object[] otherProperties) {
- material.SetFloat(SpRadius, m_Radius);
- material.SetInt(SpFitRadius, m_FitRadius?1:0);
- }
- internal void UpdateCircleRadius(RectTransform rectT) {
- this.RectTransform = rectT;
- if (m_FitRadius) {
- m_Radius = CircleFitRadius;
- }
- }
- }
- }
|