暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TMP_SubMeshUI.cs 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. using UnityEngine.UI;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using Object = UnityEngine.Object;
  7. #pragma warning disable 0414 // Disabled a few warnings related to serialized variables not used in this script but used in the editor.
  8. namespace TMPro
  9. {
  10. [ExecuteAlways]
  11. [RequireComponent(typeof(CanvasRenderer))]
  12. public class TMP_SubMeshUI : MaskableGraphic
  13. {
  14. /// <summary>
  15. /// The TMP Font Asset assigned to this sub text object.
  16. /// </summary>
  17. public TMP_FontAsset fontAsset
  18. {
  19. get { return m_fontAsset; }
  20. set { m_fontAsset = value; }
  21. }
  22. [SerializeField]
  23. private TMP_FontAsset m_fontAsset;
  24. /// <summary>
  25. /// The TMP Sprite Asset assigned to this sub text object.
  26. /// </summary>
  27. public TMP_SpriteAsset spriteAsset
  28. {
  29. get { return m_spriteAsset; }
  30. set { m_spriteAsset = value; }
  31. }
  32. [SerializeField]
  33. private TMP_SpriteAsset m_spriteAsset;
  34. /// <summary>
  35. ///
  36. /// </summary>
  37. public override Texture mainTexture
  38. {
  39. get
  40. {
  41. if (this.sharedMaterial != null)
  42. return this.sharedMaterial.GetTexture(ShaderUtilities.ID_MainTex);
  43. return null;
  44. }
  45. }
  46. /// <summary>
  47. /// The material to be assigned to this object. Returns an instance of the material.
  48. /// </summary>
  49. public override Material material
  50. {
  51. // Return a new Instance of the Material if none exists. Otherwise return the current Material Instance.
  52. get { return GetMaterial(m_sharedMaterial); }
  53. // Assign new font material
  54. set
  55. {
  56. if (m_sharedMaterial != null && m_sharedMaterial.GetInstanceID() == value.GetInstanceID())
  57. return;
  58. m_sharedMaterial = m_material = value;
  59. m_padding = GetPaddingForMaterial();
  60. SetVerticesDirty();
  61. SetMaterialDirty();
  62. }
  63. }
  64. [SerializeField]
  65. private Material m_material;
  66. /// <summary>
  67. /// The material to be assigned to this text object.
  68. /// </summary>
  69. public Material sharedMaterial
  70. {
  71. get { return m_sharedMaterial; }
  72. set { SetSharedMaterial(value); }
  73. }
  74. [SerializeField]
  75. private Material m_sharedMaterial;
  76. /// <summary>
  77. ///
  78. /// </summary>
  79. public Material fallbackMaterial
  80. {
  81. get { return m_fallbackMaterial; }
  82. set
  83. {
  84. if (m_fallbackMaterial == value) return;
  85. if (m_fallbackMaterial != null && m_fallbackMaterial != value)
  86. TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
  87. m_fallbackMaterial = value;
  88. TMP_MaterialManager.AddFallbackMaterialReference(m_fallbackMaterial);
  89. SetSharedMaterial(m_fallbackMaterial);
  90. }
  91. }
  92. private Material m_fallbackMaterial;
  93. /// <summary>
  94. /// The source material used by the fallback font
  95. /// </summary>
  96. public Material fallbackSourceMaterial
  97. {
  98. get { return m_fallbackSourceMaterial; }
  99. set { m_fallbackSourceMaterial = value; }
  100. }
  101. private Material m_fallbackSourceMaterial;
  102. /// <summary>
  103. /// Get the material that will be used for rendering.
  104. /// </summary>
  105. public override Material materialForRendering
  106. {
  107. get
  108. {
  109. return TMP_MaterialManager.GetMaterialForRendering(this, m_sharedMaterial);
  110. }
  111. }
  112. /// <summary>
  113. /// Is the text object using the default font asset material.
  114. /// </summary>
  115. public bool isDefaultMaterial
  116. {
  117. get { return m_isDefaultMaterial; }
  118. set { m_isDefaultMaterial = value; }
  119. }
  120. [SerializeField]
  121. private bool m_isDefaultMaterial;
  122. /// <summary>
  123. /// Padding value resulting for the property settings on the material.
  124. /// </summary>
  125. public float padding
  126. {
  127. get { return m_padding; }
  128. set { m_padding = value; }
  129. }
  130. [SerializeField]
  131. private float m_padding;
  132. /// <summary>
  133. /// The Mesh of this text sub object.
  134. /// </summary>
  135. public Mesh mesh
  136. {
  137. get
  138. {
  139. if (m_mesh == null)
  140. {
  141. m_mesh = new Mesh();
  142. m_mesh.hideFlags = HideFlags.HideAndDontSave;
  143. }
  144. return m_mesh;
  145. }
  146. set { m_mesh = value; }
  147. }
  148. private Mesh m_mesh;
  149. /// <summary>
  150. /// Reference to the parent Text Component.
  151. /// </summary>
  152. public TMP_Text textComponent
  153. {
  154. get
  155. {
  156. if (m_TextComponent == null)
  157. m_TextComponent = GetComponentInParent<TextMeshProUGUI>();
  158. return m_TextComponent;
  159. }
  160. }
  161. [SerializeField]
  162. private TextMeshProUGUI m_TextComponent;
  163. [System.NonSerialized]
  164. private bool m_isRegisteredForEvents;
  165. private bool m_materialDirty;
  166. [SerializeField]
  167. private int m_materialReferenceIndex;
  168. /// <summary>
  169. /// Function to add a new sub text object.
  170. /// </summary>
  171. /// <param name="textComponent"></param>
  172. /// <param name="materialReference"></param>
  173. /// <returns></returns>
  174. public static TMP_SubMeshUI AddSubTextObject(TextMeshProUGUI textComponent, MaterialReference materialReference)
  175. {
  176. GameObject go = new GameObject("TMP UI SubObject [" + materialReference.material.name + "]", typeof(RectTransform));
  177. go.hideFlags = HideFlags.DontSave;
  178. go.transform.SetParent(textComponent.transform, false);
  179. go.transform.SetAsFirstSibling();
  180. go.layer = textComponent.gameObject.layer;
  181. RectTransform rectTransform = go.GetComponent<RectTransform>();
  182. rectTransform.anchorMin = Vector2.zero;
  183. rectTransform.anchorMax = Vector2.one;
  184. rectTransform.sizeDelta = Vector2.zero;
  185. rectTransform.pivot = textComponent.rectTransform.pivot;
  186. LayoutElement layoutElement = go.AddComponent<LayoutElement>();
  187. layoutElement.ignoreLayout = true;
  188. TMP_SubMeshUI subMesh = go.AddComponent<TMP_SubMeshUI>();
  189. //subMesh.canvasRenderer = subMesh.canvasRenderer;
  190. subMesh.m_TextComponent = textComponent;
  191. subMesh.m_materialReferenceIndex = materialReference.index;
  192. subMesh.m_fontAsset = materialReference.fontAsset;
  193. subMesh.m_spriteAsset = materialReference.spriteAsset;
  194. subMesh.m_isDefaultMaterial = materialReference.isDefaultMaterial;
  195. subMesh.SetSharedMaterial(materialReference.material);
  196. return subMesh;
  197. }
  198. /// <summary>
  199. ///
  200. /// </summary>
  201. protected override void OnEnable()
  202. {
  203. //Debug.Log("*** SubObject OnEnable() ***");
  204. // Register Callbacks for various events.
  205. if (!m_isRegisteredForEvents)
  206. {
  207. #if UNITY_EDITOR
  208. TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Add(ON_MATERIAL_PROPERTY_CHANGED);
  209. TMPro_EventManager.FONT_PROPERTY_EVENT.Add(ON_FONT_PROPERTY_CHANGED);
  210. //TMPro_EventManager.TEXTMESHPRO_PROPERTY_EVENT.Add(ON_TEXTMESHPRO_PROPERTY_CHANGED);
  211. TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Add(ON_DRAG_AND_DROP_MATERIAL);
  212. //TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Add(ON_TEXT_STYLE_CHANGED);
  213. TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Add(ON_SPRITE_ASSET_PROPERTY_CHANGED);
  214. //TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Add(ON_TMP_SETTINGS_CHANGED);
  215. #endif
  216. m_isRegisteredForEvents = true;
  217. }
  218. // Update HideFlags on previously created sub text objects.
  219. if (hideFlags != HideFlags.DontSave)
  220. hideFlags = HideFlags.DontSave;
  221. m_ShouldRecalculateStencil = true;
  222. RecalculateClipping();
  223. RecalculateMasking();
  224. //SetAllDirty();
  225. }
  226. protected override void OnDisable()
  227. {
  228. //Debug.Log("*** SubObject OnDisable() ***");
  229. base.OnDisable();
  230. // if (m_MaskMaterial != null)
  231. // {
  232. // TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);
  233. // m_MaskMaterial = null;
  234. // }
  235. if (m_fallbackMaterial != null)
  236. {
  237. TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
  238. m_fallbackMaterial = null;
  239. }
  240. }
  241. protected override void OnDestroy()
  242. {
  243. //Debug.Log("*** OnDestroy() ***");
  244. // Destroy Mesh
  245. if (m_mesh != null) DestroyImmediate(m_mesh);
  246. if (m_MaskMaterial != null)
  247. TMP_MaterialManager.ReleaseStencilMaterial(m_MaskMaterial);
  248. if (m_fallbackMaterial != null)
  249. {
  250. TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
  251. m_fallbackMaterial = null;
  252. }
  253. #if UNITY_EDITOR
  254. // Unregister the event this object was listening to
  255. TMPro_EventManager.MATERIAL_PROPERTY_EVENT.Remove(ON_MATERIAL_PROPERTY_CHANGED);
  256. TMPro_EventManager.FONT_PROPERTY_EVENT.Remove(ON_FONT_PROPERTY_CHANGED);
  257. //TMPro_EventManager.TEXTMESHPRO_PROPERTY_EVENT.Remove(ON_TEXTMESHPRO_PROPERTY_CHANGED);
  258. TMPro_EventManager.DRAG_AND_DROP_MATERIAL_EVENT.Remove(ON_DRAG_AND_DROP_MATERIAL);
  259. //TMPro_EventManager.TEXT_STYLE_PROPERTY_EVENT.Remove(ON_TEXT_STYLE_CHANGED);
  260. TMPro_EventManager.SPRITE_ASSET_PROPERTY_EVENT.Remove(ON_SPRITE_ASSET_PROPERTY_CHANGED);
  261. //TMPro_EventManager.TMP_SETTINGS_PROPERTY_EVENT.Remove(ON_TMP_SETTINGS_CHANGED);
  262. #endif
  263. m_isRegisteredForEvents = false;
  264. RecalculateClipping();
  265. // Notify parent text object
  266. if (m_TextComponent != null)
  267. {
  268. m_TextComponent.havePropertiesChanged = true;
  269. m_TextComponent.SetAllDirty();
  270. }
  271. }
  272. #if UNITY_EDITOR
  273. // Event received when custom material editor properties are changed.
  274. void ON_MATERIAL_PROPERTY_CHANGED(bool isChanged, Material mat)
  275. {
  276. //Debug.Log("*** ON_MATERIAL_PROPERTY_CHANGED ***");
  277. if (m_sharedMaterial == null)
  278. return;
  279. int targetMaterialID = mat.GetInstanceID();
  280. int sharedMaterialID = m_sharedMaterial.GetInstanceID();
  281. int maskingMaterialID = m_MaskMaterial == null ? 0 : m_MaskMaterial.GetInstanceID();
  282. int fallbackSourceMaterialID = m_fallbackSourceMaterial == null ? 0 : m_fallbackSourceMaterial.GetInstanceID();
  283. // Sync culling with parent text object
  284. bool hasCullModeProperty = m_sharedMaterial.HasProperty(ShaderUtilities.ShaderTag_CullMode);
  285. float cullMode = 0;
  286. if (hasCullModeProperty)
  287. {
  288. cullMode = textComponent.fontSharedMaterial.GetFloat(ShaderUtilities.ShaderTag_CullMode);
  289. m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, cullMode);
  290. }
  291. // Filter events and return if the affected material is not this object's material.
  292. if (m_fallbackMaterial != null && fallbackSourceMaterialID == targetMaterialID && TMP_Settings.matchMaterialPreset)
  293. {
  294. TMP_MaterialManager.CopyMaterialPresetProperties(mat, m_fallbackMaterial);
  295. // Re-sync culling with parent text object
  296. m_fallbackMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, cullMode);
  297. }
  298. // Make sure material properties are synchronized between the assigned material and masking material.
  299. if (m_MaskMaterial != null)
  300. {
  301. UnityEditor.Undo.RecordObject(m_MaskMaterial, "Material Property Changes");
  302. UnityEditor.Undo.RecordObject(m_sharedMaterial, "Material Property Changes");
  303. if (targetMaterialID == sharedMaterialID)
  304. {
  305. //Debug.Log("Copy base material properties to masking material if not null.");
  306. float stencilID = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilID);
  307. float stencilComp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilComp);
  308. m_MaskMaterial.CopyPropertiesFromMaterial(mat);
  309. m_MaskMaterial.shaderKeywords = mat.shaderKeywords;
  310. m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);
  311. m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);
  312. }
  313. else if (targetMaterialID == maskingMaterialID)
  314. {
  315. // Update the padding
  316. GetPaddingForMaterial(mat);
  317. m_sharedMaterial.CopyPropertiesFromMaterial(mat);
  318. m_sharedMaterial.shaderKeywords = mat.shaderKeywords;
  319. m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilID, 0);
  320. m_sharedMaterial.SetFloat(ShaderUtilities.ID_StencilComp, 8);
  321. }
  322. else if (fallbackSourceMaterialID == targetMaterialID)
  323. {
  324. float stencilID = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilID);
  325. float stencilComp = m_MaskMaterial.GetFloat(ShaderUtilities.ID_StencilComp);
  326. m_MaskMaterial.CopyPropertiesFromMaterial(m_fallbackMaterial);
  327. m_MaskMaterial.shaderKeywords = m_fallbackMaterial.shaderKeywords;
  328. m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilID, stencilID);
  329. m_MaskMaterial.SetFloat(ShaderUtilities.ID_StencilComp, stencilComp);
  330. }
  331. // Re-sync culling with parent text object
  332. if (hasCullModeProperty)
  333. m_MaskMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, cullMode);
  334. }
  335. m_padding = GetPaddingForMaterial();
  336. SetVerticesDirty();
  337. m_ShouldRecalculateStencil = true;
  338. RecalculateClipping();
  339. RecalculateMasking();
  340. }
  341. // Event to Track Material Changed resulting from Drag-n-drop.
  342. void ON_DRAG_AND_DROP_MATERIAL(GameObject obj, Material currentMaterial, Material newMaterial)
  343. {
  344. // Check if event applies to this current object
  345. #if UNITY_2018_2_OR_NEWER
  346. if (obj == gameObject || UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject) == obj)
  347. #else
  348. if (obj == gameObject || UnityEditor.PrefabUtility.GetPrefabParent(gameObject) == obj)
  349. #endif
  350. {
  351. if (!m_isDefaultMaterial) return;
  352. // Make sure we have a valid reference to the renderer.
  353. //if (m_canvasRenderer == null) m_canvasRenderer = GetComponent<CanvasRenderer>();
  354. UnityEditor.Undo.RecordObject(this, "Material Assignment");
  355. UnityEditor.Undo.RecordObject(canvasRenderer, "Material Assignment");
  356. SetSharedMaterial(newMaterial);
  357. m_TextComponent.havePropertiesChanged = true;
  358. }
  359. }
  360. // Event received when font asset properties are changed in Font Inspector
  361. void ON_SPRITE_ASSET_PROPERTY_CHANGED(bool isChanged, UnityEngine.Object obj)
  362. {
  363. //if (spriteSheet != null && (obj as TMP_SpriteAsset == m_spriteAsset || obj as Texture2D == m_spriteAsset.spriteSheet))
  364. //{
  365. if (m_TextComponent != null)
  366. {
  367. m_TextComponent.havePropertiesChanged = true;
  368. //m_TextComponent.SetVerticesDirty();
  369. }
  370. //}
  371. }
  372. // Event received when font asset properties are changed in Font Inspector
  373. void ON_FONT_PROPERTY_CHANGED(bool isChanged, Object fontAsset)
  374. {
  375. if (m_fontAsset != null && fontAsset.GetInstanceID() == m_fontAsset.GetInstanceID())
  376. {
  377. // Copy Normal and Bold Weight
  378. if (m_fallbackMaterial != null)
  379. {
  380. if (TMP_Settings.matchMaterialPreset)
  381. {
  382. TMP_MaterialManager.ReleaseFallbackMaterial(m_fallbackMaterial);
  383. TMP_MaterialManager.CleanupFallbackMaterials();
  384. }
  385. }
  386. }
  387. }
  388. /// <summary>
  389. /// Event received when the TMP Settings are changed.
  390. /// </summary>
  391. void ON_TMP_SETTINGS_CHANGED()
  392. {
  393. //Debug.Log("TMP Setting have changed.");
  394. //SetVerticesDirty();
  395. //SetMaterialDirty();
  396. }
  397. #endif
  398. /// <summary>
  399. ///
  400. /// </summary>
  401. protected override void OnTransformParentChanged()
  402. {
  403. if (!this.IsActive())
  404. return;
  405. m_ShouldRecalculateStencil = true;
  406. RecalculateClipping();
  407. RecalculateMasking();
  408. }
  409. /// <summary>
  410. /// Function returning the modified material for masking if necessary.
  411. /// </summary>
  412. /// <param name="baseMaterial"></param>
  413. /// <returns></returns>
  414. public override Material GetModifiedMaterial(Material baseMaterial)
  415. {
  416. Material mat = baseMaterial;
  417. if (m_ShouldRecalculateStencil)
  418. {
  419. var rootCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform);
  420. m_StencilValue = maskable ? MaskUtilities.GetStencilDepth(transform, rootCanvas) : 0;
  421. m_ShouldRecalculateStencil = false;
  422. }
  423. if (m_StencilValue > 0)
  424. {
  425. var maskMat = StencilMaterial.Add(mat, (1 << m_StencilValue) - 1, StencilOp.Keep, CompareFunction.Equal, ColorWriteMask.All, (1 << m_StencilValue) - 1, 0);
  426. StencilMaterial.Remove(m_MaskMaterial);
  427. m_MaskMaterial = maskMat;
  428. mat = m_MaskMaterial;
  429. }
  430. return mat;
  431. }
  432. /// <summary>
  433. /// Function called when the padding value for the material needs to be re-calculated.
  434. /// </summary>
  435. /// <returns></returns>
  436. public float GetPaddingForMaterial()
  437. {
  438. float padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_TextComponent.extraPadding, m_TextComponent.isUsingBold);
  439. return padding;
  440. }
  441. /// <summary>
  442. /// Function called when the padding value for the material needs to be re-calculated.
  443. /// </summary>
  444. /// <returns></returns>
  445. public float GetPaddingForMaterial(Material mat)
  446. {
  447. float padding = ShaderUtilities.GetPadding(mat, m_TextComponent.extraPadding, m_TextComponent.isUsingBold);
  448. return padding;
  449. }
  450. /// <summary>
  451. ///
  452. /// </summary>
  453. /// <param name="isExtraPadding"></param>
  454. /// <param name="isBold"></param>
  455. public void UpdateMeshPadding(bool isExtraPadding, bool isUsingBold)
  456. {
  457. m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, isExtraPadding, isUsingBold);
  458. }
  459. /// <summary>
  460. ///
  461. /// </summary>
  462. public override void SetAllDirty()
  463. {
  464. //SetLayoutDirty();
  465. //SetVerticesDirty();
  466. //SetMaterialDirty();
  467. }
  468. /// <summary>
  469. ///
  470. /// </summary>
  471. public override void SetVerticesDirty()
  472. {
  473. if (!this.IsActive())
  474. return;
  475. // This is called on the parent TextMeshPro component.
  476. if (m_TextComponent != null)
  477. {
  478. m_TextComponent.havePropertiesChanged = true;
  479. m_TextComponent.SetVerticesDirty();
  480. }
  481. }
  482. /// <summary>
  483. ///
  484. /// </summary>
  485. public override void SetLayoutDirty()
  486. {
  487. }
  488. /// <summary>
  489. ///
  490. /// </summary>
  491. public override void SetMaterialDirty()
  492. {
  493. //Debug.Log("*** STO-UI - SetMaterialDirty() *** FRAME (" + Time.frameCount + ")");
  494. //if (!this.IsActive())
  495. // return;
  496. m_materialDirty = true;
  497. UpdateMaterial();
  498. if (m_OnDirtyMaterialCallback != null)
  499. m_OnDirtyMaterialCallback();
  500. //TMP_ITextElementUpdateManager.RegisterTextElementForGraphicRebuild(this);
  501. //TMP_UpdateRegistry.RegisterCanvasElementForGraphicRebuild((ICanvasElement)this);
  502. //m_TextComponent.SetMaterialDirty();
  503. }
  504. /// <summary>
  505. ///
  506. /// </summary>
  507. public void SetPivotDirty()
  508. {
  509. if (!this.IsActive())
  510. return;
  511. this.rectTransform.pivot = m_TextComponent.rectTransform.pivot;
  512. }
  513. Transform GetRootCanvasTransform()
  514. {
  515. if (m_RootCanvasTransform == null)
  516. m_RootCanvasTransform = m_TextComponent.canvas.rootCanvas.transform;
  517. return m_RootCanvasTransform;
  518. }
  519. private Transform m_RootCanvasTransform;
  520. /// <summary>
  521. /// Override Cull function as this is handled by the parent text object.
  522. /// </summary>
  523. /// <param name="clipRect"></param>
  524. /// <param name="validRect"></param>
  525. public override void Cull(Rect clipRect, bool validRect)
  526. {
  527. // Do nothing as this functionality is handled by the parent text object.
  528. }
  529. /// <summary>
  530. ///
  531. /// </summary>
  532. protected override void UpdateGeometry()
  533. {
  534. // Need to override to prevent Unity from changing the geometry of the object.
  535. //Debug.Log("UpdateGeometry()");
  536. }
  537. /// <summary>
  538. ///
  539. /// </summary>
  540. /// <param name="update"></param>
  541. public override void Rebuild(CanvasUpdate update)
  542. {
  543. if (update == CanvasUpdate.PreRender)
  544. {
  545. if (!m_materialDirty) return;
  546. UpdateMaterial();
  547. m_materialDirty = false;
  548. }
  549. }
  550. /// <summary>
  551. /// Function to update the material from the parent text object.
  552. /// </summary>
  553. public void RefreshMaterial()
  554. {
  555. UpdateMaterial();
  556. }
  557. /// <summary>
  558. ///
  559. /// </summary>
  560. protected override void UpdateMaterial()
  561. {
  562. //Debug.Log("*** STO-UI - UpdateMaterial() *** FRAME (" + Time.frameCount + ")");
  563. if (m_sharedMaterial == null)
  564. return;
  565. //if (canvasRenderer == null) m_canvasRenderer = this.canvasRenderer;
  566. // Special handling to keep the Culling of the material in sync with parent text object
  567. if (m_sharedMaterial.HasProperty(ShaderUtilities.ShaderTag_CullMode))
  568. {
  569. float cullMode = textComponent.fontSharedMaterial.GetFloat(ShaderUtilities.ShaderTag_CullMode);
  570. m_sharedMaterial.SetFloat(ShaderUtilities.ShaderTag_CullMode, cullMode);
  571. }
  572. canvasRenderer.materialCount = 1;
  573. canvasRenderer.SetMaterial(materialForRendering, 0);
  574. //canvasRenderer.SetTexture(materialForRendering.mainTexture);
  575. #if UNITY_EDITOR
  576. if (m_sharedMaterial != null && gameObject.name != "TMP SubMeshUI [" + m_sharedMaterial.name + "]")
  577. gameObject.name = "TMP SubMeshUI [" + m_sharedMaterial.name + "]";
  578. #endif
  579. }
  580. // IClippable implementation
  581. /// <summary>
  582. /// Method called when the state of a parent changes.
  583. /// </summary>
  584. public override void RecalculateClipping()
  585. {
  586. //Debug.Log("*** RecalculateClipping() ***");
  587. base.RecalculateClipping();
  588. }
  589. /// <summary>
  590. ///
  591. /// </summary>
  592. // public override void RecalculateMasking()
  593. // {
  594. // //Debug.Log("RecalculateMasking()");
  595. //
  596. // this.m_ShouldRecalculateStencil = true;
  597. // SetMaterialDirty();
  598. // }
  599. /// <summary>
  600. /// Method which returns an instance of the shared material
  601. /// </summary>
  602. /// <returns></returns>
  603. Material GetMaterial()
  604. {
  605. // Make sure we have a valid reference to the renderer.
  606. //if (m_renderer == null) m_renderer = GetComponent<Renderer>();
  607. //if (m_material == null || m_isNewSharedMaterial)
  608. //{
  609. // m_renderer.material = m_sharedMaterial;
  610. // m_material = m_renderer.material;
  611. // m_sharedMaterial = m_material;
  612. // m_padding = ShaderUtilities.GetPadding(m_sharedMaterial, m_TextMeshPro.extraPadding, false);
  613. // m_isNewSharedMaterial = false;
  614. //}
  615. return m_sharedMaterial;
  616. }
  617. // Function called internally when a new material is assigned via the fontMaterial property.
  618. Material GetMaterial(Material mat)
  619. {
  620. // Check in case Object is disabled. If so, we don't have a valid reference to the Renderer.
  621. // This can occur when the Duplicate Material Context menu is used on an inactive object.
  622. //if (m_renderer == null)
  623. // m_renderer = GetComponent<Renderer>();
  624. // Create Instance Material only if the new material is not the same instance previously used.
  625. if (m_material == null || m_material.GetInstanceID() != mat.GetInstanceID())
  626. m_material = CreateMaterialInstance(mat);
  627. m_sharedMaterial = m_material;
  628. // Compute and Set new padding values for this new material.
  629. m_padding = GetPaddingForMaterial();
  630. SetVerticesDirty();
  631. SetMaterialDirty();
  632. return m_sharedMaterial;
  633. }
  634. /// <summary>
  635. /// Method used to create an instance of the material
  636. /// </summary>
  637. /// <param name="source"></param>
  638. /// <returns></returns>
  639. Material CreateMaterialInstance(Material source)
  640. {
  641. Material mat = new Material(source);
  642. mat.shaderKeywords = source.shaderKeywords;
  643. mat.name += " (Instance)";
  644. return mat;
  645. }
  646. /// <summary>
  647. /// Method returning the shared material assigned to the text object.
  648. /// </summary>
  649. /// <returns></returns>
  650. Material GetSharedMaterial()
  651. {
  652. //if (canvasRenderer == null)
  653. // canvasRenderer = GetComponent<CanvasRenderer>();
  654. return canvasRenderer.GetMaterial();
  655. }
  656. /// <summary>
  657. /// Method to set the shared material.
  658. /// </summary>
  659. /// <param name="mat"></param>
  660. void SetSharedMaterial(Material mat)
  661. {
  662. //Debug.Log("*** SetSharedMaterial UI() *** FRAME (" + Time.frameCount + ")");
  663. // Assign new material.
  664. m_sharedMaterial = mat;
  665. m_Material = m_sharedMaterial;
  666. //m_isDefaultMaterial = false;
  667. //if (mat.GetInstanceID() == m_fontAsset.material.GetInstanceID())
  668. // m_isDefaultMaterial = true;
  669. // Compute and Set new padding values for this new material.
  670. m_padding = GetPaddingForMaterial();
  671. //SetVerticesDirty();
  672. SetMaterialDirty();
  673. #if UNITY_EDITOR
  674. //if (m_sharedMaterial != null)
  675. // gameObject.name = "TMP SubMesh [" + m_sharedMaterial.name + "]";
  676. #endif
  677. }
  678. }
  679. }