3 using System.Collections;
4 using System.Collections.Generic;
6 #pragma warning disable 0414 // Disabled a few warnings related to serialized variables not used in this script but used in the editor. 12 public class TMP_SubMeshUI : MaskableGraphic, IClippable, IMaskable, IMaterialModifier
19 get {
return m_fontAsset; }
20 set { m_fontAsset = value; }
31 get {
return m_spriteAsset; }
32 set { m_spriteAsset = value; }
65 if (m_sharedMaterial !=
null && m_sharedMaterial.GetInstanceID() == value.GetInstanceID())
68 m_sharedMaterial = m_material = value;
77 private Material m_material;
85 get {
return m_sharedMaterial; }
89 private Material m_sharedMaterial;
97 get {
return m_fallbackMaterial; }
100 if (m_fallbackMaterial == value)
return;
102 if (m_fallbackMaterial !=
null && m_fallbackMaterial != value)
103 TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
105 m_fallbackMaterial = value;
106 TMP_MaterialManager.AddFallbackMaterialReference(m_fallbackMaterial);
111 private Material m_fallbackMaterial;
119 get {
return m_fallbackSourceMaterial; }
120 set { m_fallbackSourceMaterial = value; }
122 private Material m_fallbackSourceMaterial;
132 return TMP_MaterialManager.GetMaterialForRendering(
this, m_sharedMaterial);
142 get {
return m_isDefaultMaterial; }
143 set { m_isDefaultMaterial = value; }
146 private bool m_isDefaultMaterial;
154 get {
return m_padding; }
155 set { m_padding = value; }
158 private float m_padding;
166 get {
if (m_canvasRenderer ==
null) m_canvasRenderer = GetComponent<CanvasRenderer>();
168 return m_canvasRenderer;
172 private CanvasRenderer m_canvasRenderer;
185 m_mesh.hideFlags = HideFlags.HideAndDontSave;
190 set { m_mesh = value; }
199 [System.NonSerialized]
200 private bool m_isRegisteredForEvents;
201 private bool m_materialDirty;
203 private int m_materialReferenceIndex;
215 GameObject go =
new GameObject(
"TMP UI SubObject [" + materialReference.material.name +
"]", typeof(RectTransform));
217 go.transform.SetParent(textComponent.
transform,
false);
218 go.layer = textComponent.gameObject.layer;
220 RectTransform rectTransform = go.GetComponent<RectTransform>();
221 rectTransform.anchorMin = Vector2.zero;
222 rectTransform.anchorMax = Vector2.one;
223 rectTransform.sizeDelta = Vector2.zero;
229 subMesh.m_TextComponent = textComponent;
231 subMesh.m_materialReferenceIndex = materialReference.index;
232 subMesh.m_fontAsset = materialReference.fontAsset;
233 subMesh.m_spriteAsset = materialReference.spriteAsset;
234 subMesh.m_isDefaultMaterial = materialReference.isDefaultMaterial;
250 if (!m_isRegisteredForEvents)
254 TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Add(ON_MATERIAL_PROPERTY_CHANGED);
255 TMPro_EventManager.FONT_PROPERTY_EVENT.Add(ON_FONT_PROPERTY_CHANGED);
257 TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Add(ON_DRAG_AND_DROP_MATERIAL);
259 TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Add(ON_SPRITE_ASSET_PROPERTY_CHANGED);
263 m_isRegisteredForEvents =
true;
266 m_ShouldRecalculateStencil =
true;
274 protected override void OnDisable()
281 if (m_MaskMaterial !=
null)
283 TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);
284 m_MaskMaterial =
null;
287 if (m_fallbackMaterial !=
null)
289 TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
290 m_fallbackMaterial =
null;
297 protected override void OnDestroy()
302 if (m_mesh !=
null) DestroyImmediate(m_mesh);
304 if (m_MaskMaterial !=
null)
305 TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);
307 if (m_fallbackMaterial !=
null)
309 TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
310 m_fallbackMaterial =
null;
315 TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Remove(ON_MATERIAL_PROPERTY_CHANGED);
316 TMPro_EventManager.FONT_PROPERTY_EVENT.Remove(ON_FONT_PROPERTY_CHANGED);
318 TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Remove(ON_DRAG_AND_DROP_MATERIAL);
320 TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Remove(ON_SPRITE_ASSET_PROPERTY_CHANGED);
324 m_isRegisteredForEvents =
false;
333 void ON_MATERIAL_PROPERTY_CHANGED(
bool isChanged, Material mat)
337 int targetMaterialID = mat.GetInstanceID();
338 int sharedMaterialID = m_sharedMaterial.GetInstanceID();
339 int maskingMaterialID = m_MaskMaterial ==
null ? 0 : m_MaskMaterial.GetInstanceID();
340 int fallbackSourceMaterialID = m_fallbackSourceMaterial ==
null ? 0 : m_fallbackSourceMaterial.GetInstanceID();
346 if (m_fallbackMaterial !=
null && fallbackSourceMaterialID == targetMaterialID)
347 TMP_MaterialManager.CopyMaterialPresetProperties(mat, m_fallbackMaterial);
349 if (m_TextComponent ==
null) m_TextComponent = GetComponentInParent<TextMeshProUGUI>();
352 if (m_MaskMaterial !=
null)
354 UnityEditor.Undo.RecordObject(m_MaskMaterial,
"Material Property Changes");
355 UnityEditor.Undo.RecordObject(m_sharedMaterial,
"Material Property Changes");
357 if (targetMaterialID == sharedMaterialID)
360 float stencilID = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilID);
361 float stencilComp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilComp);
362 m_MaskMaterial.CopyPropertiesFromMaterial(mat);
363 m_MaskMaterial.shaderKeywords = mat.shaderKeywords;
365 m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);
366 m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);
368 else if (targetMaterialID == maskingMaterialID)
373 m_sharedMaterial.CopyPropertiesFromMaterial(mat);
374 m_sharedMaterial.shaderKeywords = mat.shaderKeywords;
375 m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilID, 0);
376 m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 8);
378 else if (fallbackSourceMaterialID == targetMaterialID)
380 float stencilID = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilID);
381 float stencilComp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilComp);
382 m_MaskMaterial.CopyPropertiesFromMaterial(m_fallbackMaterial);
383 m_MaskMaterial.shaderKeywords = m_fallbackMaterial.shaderKeywords;
385 m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);
386 m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);
393 m_ShouldRecalculateStencil =
true;
400 void ON_DRAG_AND_DROP_MATERIAL(GameObject obj, Material currentMaterial, Material newMaterial)
403 #if UNITY_2018_2_OR_NEWER 404 if (obj == gameObject ||
UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject) == obj)
406 if (obj == gameObject ||
UnityEditor.PrefabUtility.GetPrefabParent(gameObject) == obj)
409 if (!m_isDefaultMaterial)
return;
412 if (m_canvasRenderer ==
null) m_canvasRenderer = GetComponent<CanvasRenderer>();
414 UnityEditor.Undo.RecordObject(
this,
"Material Assignment");
415 UnityEditor.Undo.RecordObject(m_canvasRenderer,
"Material Assignment");
423 void ON_SPRITE_ASSET_PROPERTY_CHANGED(
bool isChanged,
UnityEngine.Object obj)
427 if (m_TextComponent !=
null)
437 void ON_FONT_PROPERTY_CHANGED(
bool isChanged, TMP_FontAsset font)
439 if (m_fontAsset !=
null && font.GetInstanceID() == m_fontAsset.GetInstanceID())
442 if (m_fallbackMaterial !=
null)
444 m_fallbackMaterial.SetFloat(ShaderUtilities.ID_WeightNormal, m_fontAsset.normalStyle);
445 m_fallbackMaterial.SetFloat(ShaderUtilities.ID_WeightBold, m_fontAsset.boldStyle);
453 void ON_TMP_SETTINGS_CHANGED()
466 if (!this.IsActive())
469 m_ShouldRecalculateStencil =
true;
482 Material mat = baseMaterial;
484 if (m_ShouldRecalculateStencil)
486 m_StencilValue = TMP_MaterialManager.GetStencilID(gameObject);
487 m_ShouldRecalculateStencil =
false;
490 if (m_StencilValue > 0)
492 mat = TMP_MaterialManager.GetStencilMaterial(baseMaterial, m_StencilValue);
493 if (m_MaskMaterial !=
null)
494 TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);
496 m_MaskMaterial = mat;
534 m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, isExtraPadding, isUsingBold);
554 if (!this.IsActive())
558 if (m_TextComponent !=
null)
561 m_TextComponent.SetVerticesDirty();
585 m_materialDirty =
true;
589 if (m_OnDirtyMaterialCallback !=
null)
590 m_OnDirtyMaterialCallback();
604 if (!this.IsActive())
607 this.rectTransform.pivot = m_TextComponent.
rectTransform.pivot;
616 public override void Cull(Rect clipRect,
bool validRect)
620 base.Cull(clipRect, validRect);
630 Debug.Log(
"UpdateGeometry()");
638 public override void Rebuild(CanvasUpdate update)
640 if (update == CanvasUpdate.PreRender)
642 if (!m_materialDirty)
return;
645 m_materialDirty =
false;
669 if (m_canvasRenderer ==
null) m_canvasRenderer = this.
canvasRenderer;
671 m_canvasRenderer.materialCount = 1;
676 if (m_sharedMaterial !=
null && gameObject.name !=
"TMP SubMeshUI [" + m_sharedMaterial.name +
"]")
677 gameObject.name =
"TMP SubMeshUI [" + m_sharedMaterial.name +
"]";
689 base.RecalculateClipping();
700 this.m_ShouldRecalculateStencil =
true;
724 return m_sharedMaterial;
737 if (m_material ==
null || m_material.GetInstanceID() != mat.GetInstanceID())
740 m_sharedMaterial = m_material;
748 return m_sharedMaterial;
759 Material mat =
new Material(source);
760 mat.shaderKeywords = source.shaderKeywords;
761 mat.name +=
" (Instance)";
773 if (m_canvasRenderer ==
null)
774 m_canvasRenderer = GetComponent<CanvasRenderer>();
776 return m_canvasRenderer.GetMaterial();
789 m_sharedMaterial = mat;
790 m_Material = m_sharedMaterial;
override Texture mainTexture
float padding
Padding value resulting for the property settings on the material.
override void UpdateMaterial()
void UpdateMeshPadding(bool isExtraPadding, bool isUsingBold)
override void SetLayoutDirty()
override Material materialForRendering
Get the material that will be used for rendering.
override void RecalculateClipping()
Method called when the state of a parent changes.
override void Cull(Rect clipRect, bool validRect)
Override to Cull function of MaskableGraphic to prevent Culling.
void RefreshMaterial()
Function to update the material from the parent text object.
void SetSharedMaterial(Material mat)
Method to set the shared material.
override void RecalculateMasking()
float GetPaddingForMaterial()
Function called when the padding value for the material needs to be re-calculated.
Class for handling and scheduling text object updates.
Material CreateMaterialInstance(Material source)
Method used to create an instance of the material
static void UnRegisterCanvasElementForRebuild(ICanvasElement element)
Function to unregister elements which no longer require a rebuild.
Mesh mesh
The Mesh of this text sub object.
override void Rebuild(CanvasUpdate update)
new Transform transform
Returns are reference to the Transform
override Material GetModifiedMaterial(Material baseMaterial)
Function returning the modified material for masking if necessary.
override void SetVerticesDirty()
new RectTransform rectTransform
Returns are reference to the RectTransform
bool havePropertiesChanged
Property tracking if any of the text properties have changed. Flag is set before the text is regenera...
override void UpdateGeometry()
Material GetSharedMaterial()
Method returning the shared material assigned to the text object.
TMP_FontAsset fontAsset
The TMP Font Asset assigned to this sub text object.
override Material material
The material to be assigned to this object. Returns an instance of the material.
Material fallbackSourceMaterial
The source material used by the fallback font
static TMP_SubMeshUI AddSubTextObject(TextMeshProUGUI textComponent, MaterialReference materialReference)
Function to add a new sub text object.
Material GetMaterial()
Method which returns an instance of the shared material
bool isDefaultMaterial
Is the text object using the default font asset material.
bool isUsingBold
Property used in conjunction with padding calculation for the geometry.
bool extraPadding
Adds extra padding around each character. This may be necessary when the displayed text is very small...
TMP_SpriteAsset spriteAsset
The TMP Sprite Asset assigned to this sub text object.
new CanvasRenderer canvasRenderer
The Mesh Renderer of this text sub object.
override void OnTransformParentChanged()
override void SetMaterialDirty()
Material sharedMaterial
The material to be assigned to this text object.
override void SetAllDirty()
float GetPaddingForMaterial(Material mat)
Function called when the padding value for the material needs to be re-calculated.
bool ignoreRectMaskCulling
Controls whether or not the text object will be culled when using a 2D Rect Mask.
Material fallbackMaterial