Hue Preserving Color Blending
MaterialReferenceManager.cs
1 using UnityEngine;
2 using System.Collections;
3 using System.Collections.Generic;
4 
5 
6 namespace TMPro
7 {
8 
10  {
11  private static MaterialReferenceManager s_Instance;
12 
13  // Dictionaries used to track Asset references.
14  private Dictionary<int, Material> m_FontMaterialReferenceLookup = new Dictionary<int, Material>();
15  private Dictionary<int, TMP_FontAsset> m_FontAssetReferenceLookup = new Dictionary<int, TMP_FontAsset>();
16  private Dictionary<int, TMP_SpriteAsset> m_SpriteAssetReferenceLookup = new Dictionary<int, TMP_SpriteAsset>();
17  private Dictionary<int, TMP_ColorGradient> m_ColorGradientReferenceLookup = new Dictionary<int, TMP_ColorGradient>();
18 
19 
24  {
25  get
26  {
27  if (MaterialReferenceManager.s_Instance == null)
29  return MaterialReferenceManager.s_Instance;
30  }
31  }
32 
33 
34 
39  public static void AddFontAsset(TMP_FontAsset fontAsset)
40  {
42  }
43 
48  private void AddFontAssetInternal(TMP_FontAsset fontAsset)
49  {
50  if (m_FontAssetReferenceLookup.ContainsKey(fontAsset.hashCode)) return;
51 
52  // Add reference to the font asset.
53  m_FontAssetReferenceLookup.Add(fontAsset.hashCode, fontAsset);
54 
55  // Add reference to the font material.
56  m_FontMaterialReferenceLookup.Add(fontAsset.materialHashCode, fontAsset.material);
57  }
58 
59 
60 
66  public static void AddSpriteAsset(TMP_SpriteAsset spriteAsset)
67  {
69  }
70 
76  private void AddSpriteAssetInternal(TMP_SpriteAsset spriteAsset)
77  {
78  if (m_SpriteAssetReferenceLookup.ContainsKey(spriteAsset.hashCode)) return;
79 
80  // Add reference to sprite asset.
81  m_SpriteAssetReferenceLookup.Add(spriteAsset.hashCode, spriteAsset);
82 
83  // Adding reference to the sprite asset material as well
84  m_FontMaterialReferenceLookup.Add(spriteAsset.hashCode, spriteAsset.material);
85  }
86 
92  public static void AddSpriteAsset(int hashCode, TMP_SpriteAsset spriteAsset)
93  {
95  }
96 
102  private void AddSpriteAssetInternal(int hashCode, TMP_SpriteAsset spriteAsset)
103  {
104  if (m_SpriteAssetReferenceLookup.ContainsKey(hashCode)) return;
105 
106  // Add reference to Sprite Asset.
107  m_SpriteAssetReferenceLookup.Add(hashCode, spriteAsset);
108 
109  // Add reference to Sprite Asset using the asset hashcode.
110  m_FontMaterialReferenceLookup.Add(hashCode, spriteAsset.material);
111 
112  // Compatibility check
113  if (spriteAsset.hashCode == 0) spriteAsset.hashCode = hashCode;
114  }
115 
116 
122  public static void AddFontMaterial(int hashCode, Material material)
123  {
125  }
126 
132  private void AddFontMaterialInternal(int hashCode, Material material)
133  {
134  // Since this function is called after checking if the material is
135  // contained in the dictionary, there is no need to check again.
136  m_FontMaterialReferenceLookup.Add(hashCode, material);
137  }
138 
139 
145  public static void AddColorGradientPreset(int hashCode, TMP_ColorGradient spriteAsset)
146  {
148  }
149 
155  private void AddColorGradientPreset_Internal(int hashCode, TMP_ColorGradient spriteAsset)
156  {
157  if (m_ColorGradientReferenceLookup.ContainsKey(hashCode)) return;
158 
159  // Add reference to Color Gradient Preset Asset.
160  m_ColorGradientReferenceLookup.Add(hashCode, spriteAsset);
161  }
162 
163 
164 
171  //public int AddMaterial(Material material, int materialHashCode, TMP_FontAsset fontAsset)
172  //{
173  // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode))
174  // {
175  // int index = m_MaterialReferenceLookup.Count;
176 
177  // materialReferences[index].fontAsset = fontAsset;
178  // materialReferences[index].material = material;
179  // materialReferences[index].isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false;
180  // materialReferences[index].index = index;
181  // materialReferences[index].referenceCount = 0;
182 
183  // m_MaterialReferenceLookup[materialHashCode] = index;
184 
185  // // Compute Padding value and store it
186  // // TODO
187 
188  // int fontAssetHashCode = fontAsset.hashCode;
189 
190  // if (!m_FontAssetReferenceLookup.ContainsKey(fontAssetHashCode))
191  // m_FontAssetReferenceLookup.Add(fontAssetHashCode, fontAsset);
192 
193  // m_countInternal += 1;
194 
195  // return index;
196  // }
197  // else
198  // {
199  // return m_MaterialReferenceLookup[materialHashCode];
200  // }
201  //}
202 
203 
211  //public int AddMaterial(Material material, int materialHashCode, TMP_SpriteAsset spriteAsset)
212  //{
213  // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode))
214  // {
215  // int index = m_MaterialReferenceLookup.Count;
216 
217  // materialReferences[index].fontAsset = materialReferences[0].fontAsset;
218  // materialReferences[index].spriteAsset = spriteAsset;
219  // materialReferences[index].material = material;
220  // materialReferences[index].isDefaultMaterial = true;
221  // materialReferences[index].index = index;
222  // materialReferences[index].referenceCount = 0;
223 
224  // m_MaterialReferenceLookup[materialHashCode] = index;
225 
226  // int spriteAssetHashCode = spriteAsset.hashCode;
227 
228  // if (!m_SpriteAssetReferenceLookup.ContainsKey(spriteAssetHashCode))
229  // m_SpriteAssetReferenceLookup.Add(spriteAssetHashCode, spriteAsset);
230 
231  // m_countInternal += 1;
232 
233  // return index;
234  // }
235  // else
236  // {
237  // return m_MaterialReferenceLookup[materialHashCode];
238  // }
239  //}
240 
241 
247  public bool Contains(TMP_FontAsset font)
248  {
249  if (m_FontAssetReferenceLookup.ContainsKey(font.hashCode))
250  return true;
251 
252  return false;
253  }
254 
255 
261  public bool Contains(TMP_SpriteAsset sprite)
262  {
263  if (m_FontAssetReferenceLookup.ContainsKey(sprite.hashCode))
264  return true;
265 
266  return false;
267  }
268 
269 
270 
277  public static bool TryGetFontAsset(int hashCode, out TMP_FontAsset fontAsset)
278  {
279  return MaterialReferenceManager.instance.TryGetFontAssetInternal(hashCode, out fontAsset);
280  }
281 
288  private bool TryGetFontAssetInternal(int hashCode, out TMP_FontAsset fontAsset)
289  {
290  fontAsset = null;
291 
292  if (m_FontAssetReferenceLookup.TryGetValue(hashCode, out fontAsset))
293  {
294  return true;
295  }
296 
297  return false;
298  }
299 
300 
301 
308  public static bool TryGetSpriteAsset(int hashCode, out TMP_SpriteAsset spriteAsset)
309  {
310  return MaterialReferenceManager.instance.TryGetSpriteAssetInternal(hashCode, out spriteAsset);
311  }
312 
319  private bool TryGetSpriteAssetInternal(int hashCode, out TMP_SpriteAsset spriteAsset)
320  {
321  spriteAsset = null;
322 
323  if (m_SpriteAssetReferenceLookup.TryGetValue(hashCode, out spriteAsset))
324  {
325  return true;
326  }
327 
328  return false;
329  }
330 
331 
338  public static bool TryGetColorGradientPreset(int hashCode, out TMP_ColorGradient gradientPreset)
339  {
340  return MaterialReferenceManager.instance.TryGetColorGradientPresetInternal(hashCode, out gradientPreset);
341  }
342 
349  private bool TryGetColorGradientPresetInternal(int hashCode, out TMP_ColorGradient gradientPreset)
350  {
351  gradientPreset = null;
352 
353  if (m_ColorGradientReferenceLookup.TryGetValue(hashCode, out gradientPreset))
354  {
355  return true;
356  }
357 
358  return false;
359  }
360 
361 
368  public static bool TryGetMaterial(int hashCode, out Material material)
369  {
370  return MaterialReferenceManager.instance.TryGetMaterialInternal(hashCode, out material);
371  }
372 
379  private bool TryGetMaterialInternal(int hashCode, out Material material)
380  {
381  material = null;
382 
383  if (m_FontMaterialReferenceLookup.TryGetValue(hashCode, out material))
384  {
385  return true;
386  }
387 
388  return false;
389  }
390 
391 
398  //public bool TryGetMaterial(int hashCode, out MaterialReference materialReference)
399  //{
400  // int materialIndex = -1;
401 
402  // if (m_MaterialReferenceLookup.TryGetValue(hashCode, out materialIndex))
403  // {
404  // materialReference = materialReferences[materialIndex];
405 
406  // return true;
407  // }
408 
409  // materialReference = new MaterialReference();
410 
411  // return false;
412  //}
413 
414 
415 
421  //public int GetMaterialIndex(TMP_FontAsset fontAsset)
422  //{
423  // if (m_MaterialReferenceLookup.ContainsKey(fontAsset.materialHashCode))
424  // return m_MaterialReferenceLookup[fontAsset.materialHashCode];
425 
426  // return -1;
427  //}
428 
429 
435  //public TMP_FontAsset GetFontAsset(int index)
436  //{
437  // if (index >= 0 && index < materialReferences.Length)
438  // return materialReferences[index].fontAsset;
439 
440  // return null;
441  //}
442 
443 
450  //public void SetDefaultMaterial(Material material, int materialHashCode, TMP_FontAsset fontAsset)
451  //{
452  // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode))
453  // {
454  // materialReferences[0].fontAsset = fontAsset;
455  // materialReferences[0].material = material;
456  // materialReferences[0].index = 0;
457  // materialReferences[0].isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false;
458  // materialReferences[0].referenceCount = 0;
459  // m_MaterialReferenceLookup[materialHashCode] = 0;
460 
461  // // Compute Padding value and store it
462  // // TODO
463 
464  // int fontHashCode = fontAsset.hashCode;
465 
466  // if (!m_FontAssetReferenceLookup.ContainsKey(fontHashCode))
467  // m_FontAssetReferenceLookup.Add(fontHashCode, fontAsset);
468  // }
469  // else
470  // {
471  // materialReferences[0].fontAsset = fontAsset;
472  // materialReferences[0].material = material;
473  // materialReferences[0].index = 0;
474  // materialReferences[0].referenceCount = 0;
475  // m_MaterialReferenceLookup[materialHashCode] = 0;
476  // }
477  // // Compute padding
478  // // TODO
479 
480  // m_countInternal = 1;
481  //}
482 
483 
484 
488  //public void Clear()
489  //{
490  // //m_currentIndex = 0;
491  // m_MaterialReferenceLookup.Clear();
492  // m_SpriteAssetReferenceLookup.Clear();
493  // m_FontAssetReferenceLookup.Clear();
494  //}
495 
496 
500  //public void ClearReferenceCount()
501  //{
502  // m_countInternal = 0;
503 
504  // for (int i = 0; i < materialReferences.Length; i++)
505  // {
506  // if (materialReferences[i].fontAsset == null)
507  // return;
508 
509  // materialReferences[i].referenceCount = 0;
510  // }
511  //}
512 
513  }
514 
515 
516 
517  public struct MaterialReference
518  {
519 
520  public int index;
521  public TMP_FontAsset fontAsset;
522  public TMP_SpriteAsset spriteAsset;
523  public Material material;
524  public bool isDefaultMaterial;
525  public bool isFallbackMaterial;
526  public Material fallbackMaterial;
527  public float padding;
528  public int referenceCount;
529 
530 
539  public MaterialReference(int index, TMP_FontAsset fontAsset, TMP_SpriteAsset spriteAsset, Material material, float padding)
540  {
541  this.index = index;
542  this.fontAsset = fontAsset;
543  this.spriteAsset = spriteAsset;
544  this.material = material;
545  this.isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false;
546  this.isFallbackMaterial = false;
547  this.fallbackMaterial = null;
548  this.padding = padding;
549  this.referenceCount = 0;
550  }
551 
552 
559  public static bool Contains(MaterialReference[] materialReferences, TMP_FontAsset fontAsset)
560  {
561  int id = fontAsset.GetInstanceID();
562 
563  for (int i = 0; i < materialReferences.Length && materialReferences[i].fontAsset != null; i++)
564  {
565  if (materialReferences[i].fontAsset.GetInstanceID() == id)
566  return true;
567  }
568 
569  return false;
570  }
571 
572 
581  public static int AddMaterialReference(Material material, TMP_FontAsset fontAsset, MaterialReference[] materialReferences, Dictionary<int, int> materialReferenceIndexLookup)
582  {
583  int materialID = material.GetInstanceID();
584  int index = 0;
585 
586  if (materialReferenceIndexLookup.TryGetValue(materialID, out index))
587  {
588  return index;
589  }
590  else
591  {
592  index = materialReferenceIndexLookup.Count;
593 
594  // Add new reference index
595  materialReferenceIndexLookup[materialID] = index;
596 
597  materialReferences[index].index = index;
598  materialReferences[index].fontAsset = fontAsset;
599  materialReferences[index].spriteAsset = null;
600  materialReferences[index].material = material;
601  materialReferences[index].isDefaultMaterial = materialID == fontAsset.material.GetInstanceID() ? true : false;
602  //materialReferences[index].padding = 0;
603  materialReferences[index].referenceCount = 0;
604 
605  return index;
606  }
607  }
608 
609 
618  public static int AddMaterialReference(Material material, TMP_SpriteAsset spriteAsset, MaterialReference[] materialReferences, Dictionary<int, int> materialReferenceIndexLookup)
619  {
620  int materialID = material.GetInstanceID();
621  int index = 0;
622 
623  if (materialReferenceIndexLookup.TryGetValue(materialID, out index))
624  {
625  return index;
626  }
627  else
628  {
629  index = materialReferenceIndexLookup.Count;
630 
631  // Add new reference index
632  materialReferenceIndexLookup[materialID] = index;
633 
634  materialReferences[index].index = index;
635  materialReferences[index].fontAsset = materialReferences[0].fontAsset;
636  materialReferences[index].spriteAsset = spriteAsset;
637  materialReferences[index].material = material;
638  materialReferences[index].isDefaultMaterial = true;
639  //materialReferences[index].padding = 0;
640  materialReferences[index].referenceCount = 0;
641 
642  return index;
643  }
644  }
645  }
646 }
int hashCode
HashCode based on the name of the asset.
Definition: TMP_Asset.cs:13
static void AddSpriteAsset(int hashCode, TMP_SpriteAsset spriteAsset)
Add new Sprite Asset to dictionary.
void AddColorGradientPreset_Internal(int hashCode, TMP_ColorGradient spriteAsset)
Internal method to add a new Color Gradient Preset to the dictionary.
bool TryGetFontAssetInternal(int hashCode, out TMP_FontAsset fontAsset)
Internal Function returning the Font Asset corresponding to the provided hash code.
bool TryGetMaterialInternal(int hashCode, out Material material)
Internal function returning the Font Material corresponding to the provided hash code.
bool TryGetColorGradientPresetInternal(int hashCode, out TMP_ColorGradient gradientPreset)
Internal function returning the Color Gradient Preset corresponding to the provided hash code.
bool Contains(TMP_SpriteAsset sprite)
Function to check if the sprite asset is already referenced.
bool Contains(TMP_FontAsset font)
Add new material reference and return the index of this new reference in the materialReferences array...
void AddSpriteAssetInternal(int hashCode, TMP_SpriteAsset spriteAsset)
Internal method to add a new sprite asset to the dictionary.
MaterialReference(int index, TMP_FontAsset fontAsset, TMP_SpriteAsset spriteAsset, Material material, float padding)
Constructor for new Material Reference.
static bool Contains(MaterialReference[] materialReferences, TMP_FontAsset fontAsset)
Function to check if a certain font asset is contained in the material reference array.
bool TryGetSpriteAssetInternal(int hashCode, out TMP_SpriteAsset spriteAsset)
Internal function returning the Sprite Asset corresponding to the provided hash code.
void AddFontAssetInternal(TMP_FontAsset fontAsset)
Add new Font Asset reference to dictionary.
static bool TryGetColorGradientPreset(int hashCode, out TMP_ColorGradient gradientPreset)
Function returning the Color Gradient Preset corresponding to the provided hash code.
static int AddMaterialReference(Material material, TMP_FontAsset fontAsset, MaterialReference[] materialReferences, Dictionary< int, int > materialReferenceIndexLookup)
Function to add a new material reference and returning its index in the material reference array.
int materialHashCode
HashCode based on the name of the material assigned to this asset.
Definition: TMP_Asset.cs:23
static void AddColorGradientPreset(int hashCode, TMP_ColorGradient spriteAsset)
Add new Color Gradient Preset to dictionary.
Material material
The material used by this asset.
Definition: TMP_Asset.cs:18
static int AddMaterialReference(Material material, TMP_SpriteAsset spriteAsset, MaterialReference[] materialReferences, Dictionary< int, int > materialReferenceIndexLookup)
static void AddSpriteAsset(TMP_SpriteAsset spriteAsset)
Add new Sprite Asset to dictionary.
static void AddFontMaterial(int hashCode, Material material)
Add new Material reference to dictionary.
static void AddFontAsset(TMP_FontAsset fontAsset)
Add new font asset reference to dictionary.
static bool TryGetMaterial(int hashCode, out Material material)
Function returning the Font Material corresponding to the provided hash code.
void AddSpriteAssetInternal(TMP_SpriteAsset spriteAsset)
Internal method to add a new sprite asset to the dictionary.
static bool TryGetSpriteAsset(int hashCode, out TMP_SpriteAsset spriteAsset)
Function returning the Sprite Asset corresponding to the provided hash code.
static bool TryGetFontAsset(int hashCode, out TMP_FontAsset fontAsset)
Function returning the Font Asset corresponding to the provided hash code.
static MaterialReferenceManager instance
Get a singleton instance of the registry
void AddFontMaterialInternal(int hashCode, Material material)
Add new material reference to dictionary.