diff options
Diffstat (limited to 'Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/VertexModifiers/Shadow.cs')
-rw-r--r-- | Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/VertexModifiers/Shadow.cs | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/VertexModifiers/Shadow.cs b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/VertexModifiers/Shadow.cs new file mode 100644 index 0000000..e0a813c --- /dev/null +++ b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/VertexModifiers/Shadow.cs @@ -0,0 +1,126 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace UnityEngine.UI +{ + [AddComponentMenu("UI/Effects/Shadow", 14)] + public class Shadow : BaseMeshEffect + { + [SerializeField] + private Color m_EffectColor = new Color(0f, 0f, 0f, 0.5f); + + [SerializeField] + private Vector2 m_EffectDistance = new Vector2(1f, -1f); + + [SerializeField] + private bool m_UseGraphicAlpha = true; + + private const float kMaxEffectDistance = 600f; + + protected Shadow() + {} + +#if UNITY_EDITOR + protected override void OnValidate() + { + effectDistance = m_EffectDistance; + base.OnValidate(); + } + +#endif + + public Color effectColor + { + get { return m_EffectColor; } + set + { + m_EffectColor = value; + if (graphic != null) + graphic.SetVerticesDirty(); + } + } + + public Vector2 effectDistance + { + get { return m_EffectDistance; } + set + { + if (value.x > kMaxEffectDistance) + value.x = kMaxEffectDistance; + if (value.x < -kMaxEffectDistance) + value.x = -kMaxEffectDistance; + + if (value.y > kMaxEffectDistance) + value.y = kMaxEffectDistance; + if (value.y < -kMaxEffectDistance) + value.y = -kMaxEffectDistance; + + if (m_EffectDistance == value) + return; + + m_EffectDistance = value; + + if (graphic != null) + graphic.SetVerticesDirty(); + } + } + + public bool useGraphicAlpha + { + get { return m_UseGraphicAlpha; } + set + { + m_UseGraphicAlpha = value; + if (graphic != null) + graphic.SetVerticesDirty(); + } + } + + //x,yÊÇÆ«ÒÆÁ¿ + protected void ApplyShadowZeroAlloc(List<UIVertex> verts, Color32 color, int start, int end, float x, float y) + { + UIVertex vt; + + var neededCapacity = verts.Count + end - start; + if (verts.Capacity < neededCapacity) + verts.Capacity = neededCapacity; + + for (int i = start; i < end; ++i) + { + vt = verts[i]; + verts.Add(vt); + + Vector3 v = vt.position; + v.x += x; + v.y += y; + vt.position = v; + + var newColor = color; + if (m_UseGraphicAlpha) + newColor.a = (byte)((newColor.a * verts[i].color.a) / 255); + + vt.color = newColor; + verts[i] = vt; + } + } + + protected void ApplyShadow(List<UIVertex> verts, Color32 color, int start, int end, float x, float y) + { + ApplyShadowZeroAlloc(verts, color, start, end, x, y); + } + + public override void ModifyMesh(VertexHelper vh) + { + if (!IsActive()) + return; + + var output = ListPool<UIVertex>.Get(); + vh.GetUIVertexStream(output); + + ApplyShadow(output, effectColor, 0, output.Count, effectDistance.x, effectDistance.y); + vh.Clear(); + vh.AddUIVertexTriangleStream(output); + ListPool<UIVertex>.Release(output); + } + } +} |