Hue Preserving Color Blending
TextMeshPro.cs
1 using UnityEngine;
2 using System;
3 using System.Collections;
4 using System.Collections.Generic;
5 using UnityEngine.UI;
6 
7 namespace TMPro
8 {
9  [ExecuteInEditMode]
10  [DisallowMultipleComponent]
11  [RequireComponent(typeof(MeshRenderer))]
12  [RequireComponent(typeof(MeshFilter))]
13  [AddComponentMenu("Mesh/TextMeshPro - Text")]
14  public partial class TextMeshPro : TMP_Text, ILayoutElement
15  {
16  // Public Properties and Serializable Properties
17 
21  public int sortingLayerID
22  {
23  get { return m_renderer.sortingLayerID; }
24  set { m_renderer.sortingLayerID = value; }
25  }
26 
27 
31  public int sortingOrder
32  {
33  get { return m_renderer.sortingOrder; }
34  set { m_renderer.sortingOrder = value; }
35  }
36 
37 
41  public override bool autoSizeTextContainer
42  {
43  get { return m_autoSizeTextContainer; }
44 
45  set { if (m_autoSizeTextContainer == value) return; m_autoSizeTextContainer = value; if (m_autoSizeTextContainer) { TMP_UpdateManager.RegisterTextElementForLayoutRebuild(this); SetLayoutDirty(); } }
46  }
47 
48 
52  [Obsolete("The TextContainer is now obsolete. Use the RectTransform instead.")]
54  {
55  get
56  {
57  return null;
58  }
59  }
60 
61 
65  public new Transform transform
66  {
67  get
68  {
69  if (m_transform == null)
70  m_transform = GetComponent<Transform>();
71 
72  return m_transform;
73  }
74  }
75 
76 
77  #pragma warning disable 0108
78  public Renderer renderer
82  {
83  get
84  {
85  if (m_renderer == null)
86  m_renderer = GetComponent<Renderer>();
87 
88  return m_renderer;
89  }
90  }
91 
92 
96  public override Mesh mesh
97  {
98  get
99  {
100  if (m_mesh == null)
101  {
102  m_mesh = new Mesh();
103  m_mesh.hideFlags = HideFlags.HideAndDontSave;
104  this.meshFilter.mesh = m_mesh;
105  }
106 
107  return m_mesh;
108  }
109  }
110 
114  public MeshFilter meshFilter
115  {
116  get
117  {
118  if (m_meshFilter == null)
119  m_meshFilter = GetComponent<MeshFilter>();
120 
121  return m_meshFilter;
122  }
123  }
124 
125  // MASKING RELATED PROPERTIES
129  public MaskingTypes maskType
130  {
131  get { return m_maskType; }
132  set { m_maskType = value; SetMask(m_maskType); }
133  }
134 
135 
141  public void SetMask(MaskingTypes type, Vector4 maskCoords)
142  {
143  SetMask(type);
144 
145  SetMaskCoordinates(maskCoords);
146  }
147 
155  public void SetMask(MaskingTypes type, Vector4 maskCoords, float softnessX, float softnessY)
156  {
157  SetMask(type);
158 
159  SetMaskCoordinates(maskCoords, softnessX, softnessY);
160  }
161 
162 
166  public override void SetVerticesDirty()
167  {
168  //Debug.Log("SetVerticesDirty()");
169 
170  if (m_verticesAlreadyDirty || this == null || !this.IsActive())
171  return;
172 
174  m_verticesAlreadyDirty = true;
175  }
176 
177 
181  public override void SetLayoutDirty()
182  {
183  m_isPreferredWidthDirty = true;
184  m_isPreferredHeightDirty = true;
185 
186  if (m_layoutAlreadyDirty || this == null || !this.IsActive())
187  return;
188 
189  //TMP_UpdateManager.RegisterTextElementForLayoutRebuild(this);
190  m_layoutAlreadyDirty = true;
191  //LayoutRebuilder.MarkLayoutForRebuild(this.rectTransform);
192  m_isLayoutDirty = true;
193  }
194 
195 
199  public override void SetMaterialDirty()
200  {
201  //Debug.Log("SetMaterialDirty()");
202 
203  //if (!this.IsActive())
204  // return;
205 
206  //m_isMaterialDirty = true;
207  UpdateMaterial();
208  //TMP_UpdateManager.RegisterTextElementForGraphicRebuild(this);
209  }
210 
211 
215  public override void SetAllDirty()
216  {
217  m_isInputParsingRequired = true;
218 
219  SetLayoutDirty();
222  }
223 
224 
229  public override void Rebuild(CanvasUpdate update)
230  {
231  if (this == null) return;
232 
233  if (update == CanvasUpdate.Prelayout)
234  {
235  if (m_autoSizeTextContainer)
236  {
237  m_rectTransform.sizeDelta = GetPreferredValues(Mathf.Infinity, Mathf.Infinity);
238  }
239  }
240  else if (update == CanvasUpdate.PreRender)
241  {
242  this.OnPreRenderObject();
243  m_verticesAlreadyDirty = false;
244  m_layoutAlreadyDirty = false;
245 
246  if (!m_isMaterialDirty) return;
247 
248  UpdateMaterial();
249  m_isMaterialDirty = false;
250  }
251  }
252 
253 
257  protected override void UpdateMaterial()
258  {
259  //Debug.Log("*** UpdateMaterial() ***");
260 
261  //if (!this.IsActive())
262  // return;
263 
264  if (m_sharedMaterial == null)
265  return;
266 
267  if (m_renderer == null) m_renderer = this.renderer;
268 
269  // Only update the material if it has changed.
270  if (m_renderer.sharedMaterial.GetInstanceID() != m_sharedMaterial.GetInstanceID())
271  m_renderer.sharedMaterial = m_sharedMaterial;
272  }
273 
274 
278  public override void UpdateMeshPadding()
279  {
280  m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_enableExtraPadding, m_isUsingBold);
281  m_isMaskingEnabled = ShaderUtilities.IsMaskingEnabled(m_sharedMaterial);
282  m_havePropertiesChanged = true;
283  checkPaddingRequired = false;
284 
285  // Return if text object is not awake yet.
286  if (m_textInfo == null) return;
287 
288  // Update sub text objects
289  for (int i = 1; i < m_textInfo.materialCount; i++)
290  m_subTextObjects[i].UpdateMeshPadding(m_enableExtraPadding, m_isUsingBold);
291  }
292 
293 
297  public override void ForceMeshUpdate()
298  {
299  //Debug.Log("ForceMeshUpdate() called.");
300  m_havePropertiesChanged = true;
302  }
303 
304 
309  public override void ForceMeshUpdate(bool ignoreInactive)
310  {
311  m_havePropertiesChanged = true;
312  m_ignoreActiveState = true;
314  }
315 
316 
322  public override TMP_TextInfo GetTextInfo(string text)
323  {
324  StringToCharArray(text, ref m_char_buffer);
325  SetArraySizes(m_char_buffer);
326 
327  m_renderMode = TextRenderFlags.DontRender;
328 
330 
332 
333  m_renderMode = TextRenderFlags.Render;
334 
335  return this.textInfo;
336  }
337 
338 
342  public override void ClearMesh(bool updateMesh)
343  {
344  if (m_textInfo.meshInfo[0].mesh == null) m_textInfo.meshInfo[0].mesh = m_mesh;
345 
346  m_textInfo.ClearMeshInfo(updateMesh);
347  }
348 
349 
354  //public override void ForceMeshUpdate(TMP_VertexDataUpdateFlags flags) { }
355 
356 
362  public override void UpdateGeometry(Mesh mesh, int index)
363  {
364  mesh.RecalculateBounds();
365  }
366 
367 
371  public override void UpdateVertexData(TMP_VertexDataUpdateFlags flags)
372  {
373  int materialCount = m_textInfo.materialCount;
374 
375  for (int i = 0; i < materialCount; i++)
376  {
377  Mesh mesh;
378 
379  if (i == 0)
380  mesh = m_mesh;
381  else
382  {
383  // Clear unused vertices
384  // TODO: Causes issues when sorting geometry as last vertex data attribute get wiped out.
385  //m_textInfo.meshInfo[i].ClearUnusedVertices();
386 
387  mesh = m_subTextObjects[i].mesh;
388  }
389 
390  //mesh.MarkDynamic();
391 
392  if ((flags & TMP_VertexDataUpdateFlags.Vertices) == TMP_VertexDataUpdateFlags.Vertices)
393  mesh.vertices = m_textInfo.meshInfo[i].vertices;
394 
395  if ((flags & TMP_VertexDataUpdateFlags.Uv0) == TMP_VertexDataUpdateFlags.Uv0)
396  mesh.uv = m_textInfo.meshInfo[i].uvs0;
397 
398  if ((flags & TMP_VertexDataUpdateFlags.Uv2) == TMP_VertexDataUpdateFlags.Uv2)
399  mesh.uv2 = m_textInfo.meshInfo[i].uvs2;
400 
401  //if ((flags & TMP_VertexDataUpdateFlags.Uv4) == TMP_VertexDataUpdateFlags.Uv4)
402  // mesh.uv4 = m_textInfo.meshInfo[i].uvs4;
403 
404  if ((flags & TMP_VertexDataUpdateFlags.Colors32) == TMP_VertexDataUpdateFlags.Colors32)
405  mesh.colors32 = m_textInfo.meshInfo[i].colors32;
406 
407  mesh.RecalculateBounds();
408  }
409  }
410 
411 
415  public override void UpdateVertexData()
416  {
417  int materialCount = m_textInfo.materialCount;
418 
419  for (int i = 0; i < materialCount; i++)
420  {
421  Mesh mesh;
422 
423  if (i == 0)
424  mesh = m_mesh;
425  else
426  {
427  // Clear unused vertices
428  m_textInfo.meshInfo[i].ClearUnusedVertices();
429 
430  mesh = m_subTextObjects[i].mesh;
431  }
432 
433 
434  //mesh.MarkDynamic();
435  mesh.vertices = m_textInfo.meshInfo[i].vertices;
436  mesh.uv = m_textInfo.meshInfo[i].uvs0;
437  mesh.uv2 = m_textInfo.meshInfo[i].uvs2;
438  //mesh.uv4 = m_textInfo.meshInfo[i].uvs4;
439  mesh.colors32 = m_textInfo.meshInfo[i].colors32;
440 
441  mesh.RecalculateBounds();
442  }
443  }
444 
445  public void UpdateFontAsset()
446  {
447  LoadFontAsset();
448  }
449 
450 
451  private bool m_currentAutoSizeMode;
452 
453 
454  public void CalculateLayoutInputHorizontal()
455  {
456  //Debug.Log("*** CalculateLayoutInputHorizontal() ***");
457 
458  if (!this.gameObject.activeInHierarchy)
459  return;
460 
461  //IsRectTransformDriven = true;
462 
463  m_currentAutoSizeMode = m_enableAutoSizing;
464 
465  if (m_isCalculateSizeRequired || m_rectTransform.hasChanged)
466  {
467  //Debug.Log("Calculating Layout Horizontal");
468 
469  //m_LayoutPhase = AutoLayoutPhase.Horizontal;
470  //m_isRebuildingLayout = true;
471 
472  m_minWidth = 0;
473  m_flexibleWidth = 0;
474 
475  //m_renderMode = TextRenderFlags.GetPreferredSizes; // Set Text to not Render and exit early once we have new width values.
476 
477  if (m_enableAutoSizing)
478  {
479  m_fontSize = m_fontSizeMax;
480  }
481 
482  // Set Margins to Infinity
483  m_marginWidth = k_LargePositiveFloat;
484  m_marginHeight = k_LargePositiveFloat;
485 
486  if (m_isInputParsingRequired || m_isTextTruncated)
487  ParseInputText();
488 
490 
491  m_renderMode = TextRenderFlags.Render;
492 
493  //m_preferredWidth = (int)m_preferredWidth + 1f;
494 
496 
497  //Debug.Log("Preferred Width: " + m_preferredWidth + " Margin Width: " + m_marginWidth + " Preferred Height: " + m_preferredHeight + " Margin Height: " + m_marginHeight + " Rendered Width: " + m_renderedWidth + " Height: " + m_renderedHeight + " RectTransform Width: " + m_rectTransform.rect);
498 
499  m_isLayoutDirty = true;
500  }
501  }
502 
503 
504  public void CalculateLayoutInputVertical()
505  {
506  //Debug.Log("*** CalculateLayoutInputVertical() ***");
507 
508  // Check if object is active
509  if (!this.gameObject.activeInHierarchy) // || IsRectTransformDriven == false)
510  return;
511 
512  //IsRectTransformDriven = true;
513 
514  if (m_isCalculateSizeRequired || m_rectTransform.hasChanged)
515  {
516  //Debug.Log("Calculating Layout InputVertical");
517 
518  //m_LayoutPhase = AutoLayoutPhase.Vertical;
519  //m_isRebuildingLayout = true;
520 
521  m_minHeight = 0;
522  m_flexibleHeight = 0;
523 
524  //m_renderMode = TextRenderFlags.GetPreferredSizes;
525 
526  if (m_enableAutoSizing)
527  {
528  m_currentAutoSizeMode = true;
529  m_enableAutoSizing = false;
530  }
531 
532  m_marginHeight = k_LargePositiveFloat;
533 
535 
536  m_enableAutoSizing = m_currentAutoSizeMode;
537 
538  m_renderMode = TextRenderFlags.Render;
539 
540  //m_preferredHeight = (int)m_preferredHeight + 1f;
541 
543 
544  //Debug.Log("Preferred Height: " + m_preferredHeight + " Margin Height: " + m_marginHeight + " Preferred Width: " + m_preferredWidth + " Margin Width: " + m_marginWidth + " Rendered Width: " + m_renderedWidth + " Height: " + m_renderedHeight + " RectTransform Width: " + m_rectTransform.rect);
545 
546  m_isLayoutDirty = true;
547  }
548 
549  m_isCalculateSizeRequired = false;
550  }
551  }
552 }
Mesh mesh
The Mesh of this text sub object.
Definition: TMP_SubMesh.cs:165
Vector2 GetPreferredValues()
Function to Calculate the Preferred Width and Height of the text object.
Definition: TMP_Text.cs:3411
TextRenderFlags
Flags controlling what vertex data gets pushed to the mesh.
Definition: TMP_Text.cs:88
static void RegisterTextElementForLayoutRebuild(TMP_Text element)
Function to register elements which require a layout rebuild.
override void UpdateMeshPadding()
Function to be used to force recomputing of character padding when Shader / Material properties have ...
Definition: TextMeshPro.cs:278
void ClearUnusedVertices()
Function to clear the vertices while preserving the Triangles, Normals and Tangents.
override void ComputeMarginSize()
Update the margin width and height
void SetMask(MaskingTypes type, Vector4 maskCoords, float softnessX, float softnessY)
Function used to set the mask type, coordinates and softness
Definition: TextMeshPro.cs:155
new Transform transform
Returns a reference to the Transform
Definition: TextMeshPro.cs:66
override void LoadFontAsset()
Method which derived classes need to override to load Font Assets.
MaskingTypes maskType
Sets the mask type
Definition: TextMeshPro.cs:130
override int SetArraySizes(int[] chars)
Method used to determine the number of visible characters and required buffer allocations.
Class which contains information about every element contained within the text object.
Definition: TMP_TextInfo.cs:13
void ParseInputText()
Method to parse the input text based on its source
Definition: TMP_Text.cs:1680
override void SetVerticesDirty()
Schedule rebuilding of the text geometry.
Definition: TextMeshPro.cs:166
void StringToCharArray(string sourceText, ref int[] charBuffer)
Method to store the content of a string into an integer array.
Definition: TMP_Text.cs:2286
static void RegisterTextElementForGraphicRebuild(TMP_Text element)
Function to register elements which require a layout rebuild.
int sortingLayerID
Sets the Renderer's sorting Layer ID
Definition: TextMeshPro.cs:22
Renderer renderer
Returns the rendered assigned to the text object.
Definition: TextMeshPro.cs:82
Base class which contains common properties and functions shared between the TextMeshPro and TextMesh...
Definition: TMP_Text.cs:110
TMP_VertexDataUpdateFlags
Flags to control what vertex data is pushed to the mesh and renderer.
override Mesh mesh
Returns the mesh assigned to the text object.
Definition: TextMeshPro.cs:97
override void SetMaterialDirty()
Schedule updating of the material used by the text object.
Definition: TextMeshPro.cs:199
override bool autoSizeTextContainer
Determines if the size of the text container will be adjusted to fit the text object when it is first...
Definition: TextMeshPro.cs:42
override void Rebuild(CanvasUpdate update)
Definition: TextMeshPro.cs:229
override void ForceMeshUpdate(bool ignoreInactive)
Function to force regeneration of the mesh before its normal process time. This is useful when change...
Definition: TextMeshPro.cs:309
override void GenerateTextMesh()
This is the main function that is responsible for creating / displaying the text.
override void SetLayoutDirty()
Definition: TextMeshPro.cs:181
override TMP_TextInfo GetTextInfo(string text)
Function used to evaluate the length of a text string.
Definition: TextMeshPro.cs:322
override void UpdateVertexData()
Function to upload the updated vertex data and renderer.
Definition: TextMeshPro.cs:415
override void SetAllDirty()
Definition: TextMeshPro.cs:215
override void UpdateVertexData(TMP_VertexDataUpdateFlags flags)
Function to upload the updated vertex data and renderer.
Definition: TextMeshPro.cs:371
int sortingOrder
Sets the Renderer's sorting order within the assigned layer.
Definition: TextMeshPro.cs:32
string text
A string containing the text to be displayed.
Definition: TMP_Text.cs:116
TextContainer textContainer
Returns a reference to the Text Container
Definition: TextMeshPro.cs:54
override void ClearMesh(bool updateMesh)
Function to clear the geometry of the Primary and Sub Text objects.
Definition: TextMeshPro.cs:342
override void ForceMeshUpdate()
Function to force regeneration of the mesh before its normal process time. This is useful when change...
Definition: TextMeshPro.cs:297
override void UpdateGeometry(Mesh mesh, int index)
Function to force the regeneration of the text object.
Definition: TextMeshPro.cs:362
override void UpdateMaterial()
Definition: TextMeshPro.cs:257
MeshFilter meshFilter
Returns the Mesh Filter of the text object.
Definition: TextMeshPro.cs:115
void SetMask(MaskingTypes type, Vector4 maskCoords)
Function used to set the mask type and coordinates in World Space
Definition: TextMeshPro.cs:141
void OnPreRenderObject()
Function called when the text needs to be updated.
void ClearMeshInfo(bool updateMesh)
Function to clear the content of the MeshInfo array while preserving the Triangles,...
Definition: TMP_TextInfo.cs:93
TMP_TextInfo textInfo
Returns data about the text object which includes information about each character,...
Definition: TMP_Text.cs:1014