GraphicConnector.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using System;
  4. using System.Collections.Generic;
  5. namespace Coffee.UIEffects
  6. {
  7. public class GraphicConnector
  8. {
  9. private static readonly List<GraphicConnector> s_Connectors = new List<GraphicConnector>();
  10. private static readonly Dictionary<Type, GraphicConnector> s_ConnectorMap =
  11. new Dictionary<Type, GraphicConnector>();
  12. private static readonly GraphicConnector s_EmptyConnector = new GraphicConnector();
  13. #if UNITY_EDITOR
  14. [UnityEditor.InitializeOnLoadMethod]
  15. #endif
  16. [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
  17. private static void Init()
  18. {
  19. AddConnector(new GraphicConnector());
  20. }
  21. protected static void AddConnector(GraphicConnector connector)
  22. {
  23. s_Connectors.Add(connector);
  24. s_Connectors.Sort((x, y) => y.priority - x.priority);
  25. }
  26. public static GraphicConnector FindConnector(Graphic graphic)
  27. {
  28. if (!graphic) return s_EmptyConnector;
  29. var type = graphic.GetType();
  30. GraphicConnector connector = null;
  31. if (s_ConnectorMap.TryGetValue(type, out connector)) return connector;
  32. foreach (var c in s_Connectors)
  33. {
  34. if (!c.IsValid(graphic)) continue;
  35. s_ConnectorMap.Add(type, c);
  36. return c;
  37. }
  38. return s_EmptyConnector;
  39. }
  40. /// <summary>
  41. /// Connector priority.
  42. /// </summary>
  43. protected virtual int priority
  44. {
  45. get { return -1; }
  46. }
  47. /// <summary>
  48. /// Extra channel.
  49. /// </summary>
  50. public virtual AdditionalCanvasShaderChannels extraChannel
  51. {
  52. get { return AdditionalCanvasShaderChannels.TexCoord1; }
  53. }
  54. /// <summary>
  55. /// The connector is valid for the component.
  56. /// </summary>
  57. protected virtual bool IsValid(Graphic graphic)
  58. {
  59. return true;
  60. }
  61. /// <summary>
  62. /// Find effect shader.
  63. /// </summary>
  64. public virtual Shader FindShader(string shaderName)
  65. {
  66. return Shader.Find("Hidden/" + shaderName);
  67. }
  68. /// <summary>
  69. /// This function is called when the object becomes enabled and active.
  70. /// </summary>
  71. public virtual void OnEnable(Graphic graphic)
  72. {
  73. }
  74. /// <summary>
  75. /// This function is called when the behaviour becomes disabled () or inactive.
  76. /// </summary>
  77. public virtual void OnDisable(Graphic graphic)
  78. {
  79. }
  80. /// <summary>
  81. /// Mark the vertices as dirty.
  82. /// </summary>
  83. public virtual void SetVerticesDirty(Graphic graphic)
  84. {
  85. if (graphic)
  86. graphic.SetVerticesDirty();
  87. }
  88. /// <summary>
  89. /// Mark the material as dirty.
  90. /// </summary>
  91. public virtual void SetMaterialDirty(Graphic graphic)
  92. {
  93. if (graphic)
  94. graphic.SetMaterialDirty();
  95. }
  96. /// <summary>
  97. /// Gets position factor for area.
  98. /// </summary>
  99. public virtual void GetPositionFactor(EffectArea area, int index, Rect rect, Vector2 position, out float x, out float y)
  100. {
  101. if (area == EffectArea.Fit)
  102. {
  103. x = Mathf.Clamp01((position.x - rect.xMin) / rect.width);
  104. y = Mathf.Clamp01((position.y - rect.yMin) / rect.height);
  105. }
  106. else
  107. {
  108. x = Mathf.Clamp01(position.x / rect.width + 0.5f);
  109. y = Mathf.Clamp01(position.y / rect.height + 0.5f);
  110. }
  111. }
  112. public virtual bool IsText(Graphic graphic)
  113. {
  114. return graphic && graphic is Text;
  115. }
  116. public virtual void SetExtraChannel(ref UIVertex vertex, Vector2 value)
  117. {
  118. vertex.uv1 = value;
  119. }
  120. /// <summary>
  121. /// Normalize vertex position by local matrix.
  122. /// </summary>
  123. public virtual void GetNormalizedFactor(EffectArea area, int index, Matrix2x3 matrix, Vector2 position,
  124. out Vector2 normalizedPos)
  125. {
  126. normalizedPos = matrix * position;
  127. }
  128. }
  129. }