#if TMP_ENABLE
using Coffee.UISoftMaskInternal;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
namespace Coffee.UISoftMask
{
internal sealed class TmpProxy : GraphicProxy
{
///
/// Check if the graphic is valid for this proxy.
///
protected override bool IsValid(Graphic graphic)
{
if (!graphic) return false;
if (graphic is TextMeshProUGUI || graphic is TMP_SubMeshUI) return true;
return false;
}
public override void SetMaterialDirty(Graphic graphic)
{
graphic.SetMaterialDirty();
UpdateMeshUI(graphic);
}
public override Texture GetMainTexture(Graphic graphic)
{
var cr = graphic.canvasRenderer;
if (!cr || cr.materialCount == 0) return null;
var mat = cr.GetMaterial(0);
if (!mat) return null;
return mat.mainTexture;
}
public override float GetAlpha(Graphic graphic)
{
if (graphic is TMP_SubMeshUI sub)
{
return sub.textComponent.color.a;
}
return graphic.color.a;
}
private static void UpdateSubMeshUI(TextMeshProUGUI text, ISoftMasking parent)
{
var subMeshes = InternalListPool.Rent();
text.GetComponentsInChildren(subMeshes, 1);
for (var i = 0; i < subMeshes.Count; i++)
{
var maskingShape = subMeshes[i].GetOrAddComponent();
maskingShape.hideFlags = HideFlags.NotEditable;
maskingShape.enabled = parent.enabled;
maskingShape.parent = parent;
#pragma warning disable CS0618
(maskingShape as IMeshModifier).ModifyMesh(subMeshes[i].mesh);
#pragma warning restore CS0618
}
InternalListPool.Return(ref subMeshes);
}
private static void UpdateMeshUI(Object obj)
{
if (!(obj is TextMeshProUGUI text)) return;
if (text.TryGetComponent(out var sm))
{
#pragma warning disable CS0618
(sm as IMeshModifier).ModifyMesh(text.mesh);
#pragma warning restore CS0618
UpdateSubMeshUI(text, sm);
}
else if (text.TryGetComponent(out var ms))
{
#pragma warning disable CS0618
(ms as IMeshModifier).ModifyMesh(text.mesh);
#pragma warning restore CS0618
UpdateSubMeshUI(text, ms);
}
}
#if UNITY_EDITOR
[InitializeOnLoadMethod]
#else
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
#endif
private static void InitializeOnLoad()
{
Register(new TmpProxy());
TMPro_EventManager.TEXT_CHANGED_EVENT.Add(UpdateMeshUI);
}
}
}
#endif