123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848 |
- using UnityEngine;
- using UnityEngine.Rendering;
- using UnityEngine.UI;
- using System.Collections;
- using System.Collections.Generic;
- using Object = UnityEngine.Object;
- #pragma warning disable 0414 // Disabled a few warnings related to serialized variables not used in this script but used in the editor.
- namespace TMPro
- {
- [ExecuteAlways]
- public class TMP_SubMeshUI : MaskableGraphic
- {
-
-
-
- public TMP_FontAsset fontAsset
- {
- get { return m_fontAsset; }
- set { m_fontAsset = value; }
- }
- [SerializeField]
- private TMP_FontAsset m_fontAsset;
-
-
-
- public TMP_SpriteAsset spriteAsset
- {
- get { return m_spriteAsset; }
- set { m_spriteAsset = value; }
- }
- [SerializeField]
- private TMP_SpriteAsset m_spriteAsset;
-
-
-
- public override Texture mainTexture
- {
- get
- {
- if (this.sharedMaterial != null)
- return this.sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex);
- return null;
- }
- }
-
-
-
- public override Material material
- {
-
- get { return GetMaterial(m_sharedMaterial); }
-
- set
- {
- if (m_sharedMaterial != null && m_sharedMaterial.GetInstanceID() == value.GetInstanceID())
- return;
- m_sharedMaterial = m_material = value;
- m_padding = GetPaddingForMaterial();
- SetVerticesDirty();
- SetMaterialDirty();
- }
- }
- [SerializeField]
- private Material m_material;
-
-
-
- public Material sharedMaterial
- {
- get { return m_sharedMaterial; }
- set { SetSharedMaterial(value); }
- }
- [SerializeField]
- private Material m_sharedMaterial;
-
-
-
- public Material fallbackMaterial
- {
- get { return m_fallbackMaterial; }
- set
- {
- if (m_fallbackMaterial == value) return;
- if (m_fallbackMaterial != null && m_fallbackMaterial != value)
- TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
- m_fallbackMaterial = value;
- TMP_MaterialManager.AddFallbackMaterialReference(m_fallbackMaterial);
- SetSharedMaterial(m_fallbackMaterial);
- }
- }
- private Material m_fallbackMaterial;
-
-
-
- public Material fallbackSourceMaterial
- {
- get { return m_fallbackSourceMaterial; }
- set { m_fallbackSourceMaterial = value; }
- }
- private Material m_fallbackSourceMaterial;
-
-
-
- public override Material materialForRendering
- {
- get
- {
- return TMP_MaterialManager.GetMaterialForRendering(this, m_sharedMaterial);
- }
- }
-
-
-
- public bool isDefaultMaterial
- {
- get { return m_isDefaultMaterial; }
- set { m_isDefaultMaterial = value; }
- }
- [SerializeField]
- private bool m_isDefaultMaterial;
-
-
-
- public float padding
- {
- get { return m_padding; }
- set { m_padding = value; }
- }
- [SerializeField]
- private float m_padding;
-
-
-
- public Mesh mesh
- {
- get
- {
- if (m_mesh == null)
- {
- m_mesh = new Mesh();
- m_mesh.hideFlags = HideFlags.HideAndDontSave;
- }
- return m_mesh;
- }
- set { m_mesh = value; }
- }
- private Mesh m_mesh;
-
-
-
- public TMP_Text textComponent
- {
- get
- {
- if (m_TextComponent == null)
- m_TextComponent = GetComponentInParent<TextMeshProUGUI>();
- return m_TextComponent;
- }
- }
- [SerializeField]
- private TextMeshProUGUI m_TextComponent;
- [System.NonSerialized]
- private bool m_isRegisteredForEvents;
- private bool m_materialDirty;
- [SerializeField]
- private int m_materialReferenceIndex;
-
-
-
-
-
-
- public static TMP_SubMeshUI AddSubTextObject(TextMeshProUGUI textComponent, MaterialReference materialReference)
- {
- GameObject go = new GameObject("TMP UI SubObject [" + materialReference.material.name + "]", typeof(RectTransform));
- go.hideFlags = HideFlags.DontSave;
- go.transform.SetParent(textComponent.transform, false);
- go.transform.SetAsFirstSibling();
- go.layer = textComponent.gameObject.layer;
- RectTransform rectTransform = go.GetComponent<RectTransform>();
- rectTransform.anchorMin = Vector2.zero;
- rectTransform.anchorMax = Vector2.one;
- rectTransform.sizeDelta = Vector2.zero;
- rectTransform.pivot = textComponent.rectTransform.pivot;
- LayoutElement layoutElement = go.AddComponent<LayoutElement>();
- layoutElement.ignoreLayout = true;
- TMP_SubMeshUI subMesh = go.AddComponent<TMP_SubMeshUI>();
-
- subMesh.m_TextComponent = textComponent;
- subMesh.m_materialReferenceIndex = materialReference.index;
- subMesh.m_fontAsset = materialReference.fontAsset;
- subMesh.m_spriteAsset = materialReference.spriteAsset;
- subMesh.m_isDefaultMaterial = materialReference.isDefaultMaterial;
- subMesh.SetSharedMaterial(materialReference.material);
- return subMesh;
- }
-
-
-
- protected override void OnEnable()
- {
-
-
- if (!m_isRegisteredForEvents)
- {
- #if UNITY_EDITOR
- TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Add(ON_MATERIAL_PROPERTY_CHANGED);
- TMPro_EventManager.FONT_PROPERTY_EVENT.Add(ON_FONT_PROPERTY_CHANGED);
-
- TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Add(ON_DRAG_AND_DROP_MATERIAL);
-
- TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Add(ON_SPRITE_ASSET_PROPERTY_CHANGED);
-
- #endif
- m_isRegisteredForEvents = true;
- }
-
- if (hideFlags != HideFlags.DontSave)
- hideFlags = HideFlags.DontSave;
- m_ShouldRecalculateStencil = true;
- RecalculateClipping();
- RecalculateMasking();
-
- }
- protected override void OnDisable()
- {
-
- base.OnDisable();
-
-
-
-
-
- if (m_fallbackMaterial != null)
- {
- TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
- m_fallbackMaterial = null;
- }
- }
- protected override void OnDestroy()
- {
-
-
- if (m_mesh != null) DestroyImmediate(m_mesh);
- if (m_MaskMaterial != null)
- TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);
- if (m_fallbackMaterial != null)
- {
- TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
- m_fallbackMaterial = null;
- }
- #if UNITY_EDITOR
-
- TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Remove(ON_MATERIAL_PROPERTY_CHANGED);
- TMPro_EventManager.FONT_PROPERTY_EVENT.Remove(ON_FONT_PROPERTY_CHANGED);
-
- TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Remove(ON_DRAG_AND_DROP_MATERIAL);
-
- TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Remove(ON_SPRITE_ASSET_PROPERTY_CHANGED);
-
- #endif
- m_isRegisteredForEvents = false;
- RecalculateClipping();
-
- m_TextComponent.havePropertiesChanged = true;
- m_TextComponent.SetAllDirty();
- }
- #if UNITY_EDITOR
-
- void ON_MATERIAL_PROPERTY_CHANGED(bool isChanged, Material mat)
- {
-
- if (m_sharedMaterial == null)
- return;
- int targetMaterialID = mat.GetInstanceID();
- int sharedMaterialID = m_sharedMaterial.GetInstanceID();
- int maskingMaterialID = m_MaskMaterial == null ? 0 : m_MaskMaterial.GetInstanceID();
- int fallbackSourceMaterialID = m_fallbackSourceMaterial == null ? 0 : m_fallbackSourceMaterial.GetInstanceID();
-
- bool hasCullModeProperty = m_sharedMaterial.HasProperty(ShaderUtilities.ShaderTag_CullMode);
- float cullMode = 0;
- if (hasCullModeProperty)
- {
- cullMode = textComponent.fontSharedMaterial.GetFloat(ShaderUtilities.ShaderTag_CullMode);
- m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, cullMode);
- }
-
- if (m_fallbackMaterial != null && fallbackSourceMaterialID == targetMaterialID && TMP_Settings.matchMaterialPreset)
- {
- TMP_MaterialManager.CopyMaterialPresetProperties(mat, m_fallbackMaterial);
-
- m_fallbackMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, cullMode);
- }
-
- if (m_MaskMaterial != null)
- {
- UnityEditor.Undo.RecordObject(m_MaskMaterial, "Material Property Changes");
- UnityEditor.Undo.RecordObject(m_sharedMaterial, "Material Property Changes");
- if (targetMaterialID == sharedMaterialID)
- {
-
- float stencilID = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilID);
- float stencilComp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilComp);
- m_MaskMaterial.CopyPropertiesFromMaterial(mat);
- m_MaskMaterial.shaderKeywords = mat.shaderKeywords;
- m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);
- m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);
- }
- else if (targetMaterialID == maskingMaterialID)
- {
-
- GetPaddingForMaterial(mat);
- m_sharedMaterial.CopyPropertiesFromMaterial(mat);
- m_sharedMaterial.shaderKeywords = mat.shaderKeywords;
- m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilID, 0);
- m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 8);
- }
- else if (fallbackSourceMaterialID == targetMaterialID)
- {
- float stencilID = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilID);
- float stencilComp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilComp);
- m_MaskMaterial.CopyPropertiesFromMaterial(m_fallbackMaterial);
- m_MaskMaterial.shaderKeywords = m_fallbackMaterial.shaderKeywords;
- m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);
- m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);
- }
-
- if (hasCullModeProperty)
- m_MaskMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, cullMode);
- }
- m_padding = GetPaddingForMaterial();
- SetVerticesDirty();
- m_ShouldRecalculateStencil = true;
- RecalculateClipping();
- RecalculateMasking();
- }
-
- void ON_DRAG_AND_DROP_MATERIAL(GameObject obj, Material currentMaterial, Material newMaterial)
- {
-
- #if UNITY_2018_2_OR_NEWER
- if (obj == gameObject || UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject) == obj)
- #else
- if (obj == gameObject || UnityEditor.PrefabUtility.GetPrefabParent(gameObject) == obj)
- #endif
- {
- if (!m_isDefaultMaterial) return;
-
-
- UnityEditor.Undo.RecordObject(this, "Material Assignment");
- UnityEditor.Undo.RecordObject(canvasRenderer, "Material Assignment");
- SetSharedMaterial(newMaterial);
- m_TextComponent.havePropertiesChanged = true;
- }
- }
-
- void ON_SPRITE_ASSET_PROPERTY_CHANGED(bool isChanged, UnityEngine.Object obj)
- {
-
-
- if (m_TextComponent != null)
- {
- m_TextComponent.havePropertiesChanged = true;
-
- }
-
- }
-
- void ON_FONT_PROPERTY_CHANGED(bool isChanged, Object fontAsset)
- {
- if (m_fontAsset != null && fontAsset.GetInstanceID() == m_fontAsset.GetInstanceID())
- {
-
- if (m_fallbackMaterial != null)
- {
- if (TMP_Settings.matchMaterialPreset)
- {
- TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
- TMP_MaterialManager.CleanupFallbackMaterials();
- }
- }
- }
- }
-
-
-
- void ON_TMP_SETTINGS_CHANGED()
- {
-
-
-
- }
- #endif
-
-
-
- protected override void OnTransformParentChanged()
- {
- if (!this.IsActive())
- return;
- m_ShouldRecalculateStencil = true;
- RecalculateClipping();
- RecalculateMasking();
- }
-
-
-
-
-
- public override Material GetModifiedMaterial(Material baseMaterial)
- {
- Material mat = baseMaterial;
- if (m_ShouldRecalculateStencil)
- {
- var rootCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform);
- m_StencilValue = maskable ? MaskUtilities.GetStencilDepth(transform, rootCanvas) : 0;
- m_ShouldRecalculateStencil = false;
- }
- if (m_StencilValue > 0)
- {
- var maskMat = StencilMaterial.Add(mat, (1 << m_StencilValue) - 1, StencilOp.Keep, CompareFunction.Equal, ColorWriteMask.All, (1 << m_StencilValue) - 1, 0);
- StencilMaterial.Remove(m_MaskMaterial);
- m_MaskMaterial = maskMat;
- mat = m_MaskMaterial;
- }
- return mat;
- }
-
-
-
-
- public float GetPaddingForMaterial()
- {
- float padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_TextComponent.extraPadding, m_TextComponent.isUsingBold);
- return padding;
- }
-
-
-
-
- public float GetPaddingForMaterial(Material mat)
- {
- float padding = ShaderUtilities.GetPadding(mat, m_TextComponent.extraPadding, m_TextComponent.isUsingBold);
- return padding;
- }
-
-
-
-
-
- public void UpdateMeshPadding(bool isExtraPadding, bool isUsingBold)
- {
- m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, isExtraPadding, isUsingBold);
- }
-
-
-
- public override void SetAllDirty()
- {
-
-
-
- }
-
-
-
- public override void SetVerticesDirty()
- {
- if (!this.IsActive())
- return;
-
- if (m_TextComponent != null)
- {
- m_TextComponent.havePropertiesChanged = true;
- m_TextComponent.SetVerticesDirty();
- }
- }
-
-
-
- public override void SetLayoutDirty()
- {
- }
-
-
-
- public override void SetMaterialDirty()
- {
-
-
-
- m_materialDirty = true;
- UpdateMaterial();
- if (m_OnDirtyMaterialCallback != null)
- m_OnDirtyMaterialCallback();
-
-
-
- }
-
-
-
- public void SetPivotDirty()
- {
- if (!this.IsActive())
- return;
- this.rectTransform.pivot = m_TextComponent.rectTransform.pivot;
- }
- Transform GetRootCanvasTransform()
- {
- if (m_RootCanvasTransform == null)
- m_RootCanvasTransform = m_TextComponent.canvas.rootCanvas.transform;
- return m_RootCanvasTransform;
- }
- private Transform m_RootCanvasTransform;
-
-
-
-
-
- public override void Cull(Rect clipRect, bool validRect)
- {
-
- }
-
-
-
- protected override void UpdateGeometry()
- {
-
-
- }
-
-
-
-
- public override void Rebuild(CanvasUpdate update)
- {
- if (update == CanvasUpdate.PreRender)
- {
- if (!m_materialDirty) return;
- UpdateMaterial();
- m_materialDirty = false;
- }
- }
-
-
-
- public void RefreshMaterial()
- {
- UpdateMaterial();
- }
-
-
-
- protected override void UpdateMaterial()
- {
-
- if (m_sharedMaterial == null)
- return;
-
-
- if (m_sharedMaterial.HasProperty(ShaderUtilities.ShaderTag_CullMode))
- {
- float cullMode = textComponent.fontSharedMaterial.GetFloat(ShaderUtilities.ShaderTag_CullMode);
- m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, cullMode);
- }
- canvasRenderer.materialCount = 1;
- canvasRenderer.SetMaterial(materialForRendering, 0);
-
- #if UNITY_EDITOR
- if (m_sharedMaterial != null && gameObject.name != "TMP SubMeshUI [" + m_sharedMaterial.name + "]")
- gameObject.name = "TMP SubMeshUI [" + m_sharedMaterial.name + "]";
- #endif
- }
-
-
-
-
- public override void RecalculateClipping()
- {
-
- base.RecalculateClipping();
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Material GetMaterial()
- {
-
-
-
-
-
-
-
-
-
-
- return m_sharedMaterial;
- }
-
- Material GetMaterial(Material mat)
- {
-
-
-
-
-
- if (m_material == null || m_material.GetInstanceID() != mat.GetInstanceID())
- m_material = CreateMaterialInstance(mat);
- m_sharedMaterial = m_material;
-
- m_padding = GetPaddingForMaterial();
- SetVerticesDirty();
- SetMaterialDirty();
- return m_sharedMaterial;
- }
-
-
-
-
-
- Material CreateMaterialInstance(Material source)
- {
- Material mat = new Material(source);
- mat.shaderKeywords = source.shaderKeywords;
- mat.name += " (Instance)";
- return mat;
- }
-
-
-
-
- Material GetSharedMaterial()
- {
-
-
- return canvasRenderer.GetMaterial();
- }
-
-
-
-
- void SetSharedMaterial(Material mat)
- {
-
-
- m_sharedMaterial = mat;
- m_Material = m_sharedMaterial;
-
-
-
-
- m_padding = GetPaddingForMaterial();
-
- SetMaterialDirty();
- #if UNITY_EDITOR
-
-
- #endif
- }
- }
- }
|