A game about forced loneliness, made by TACStudios
1using System.Collections.Generic;
2using UnityEngine;
3
4
5namespace TMPro
6{
7
8 public class MaterialReferenceManager
9 {
10 private static MaterialReferenceManager s_Instance;
11
12 // Dictionaries used to track Asset references.
13 private Dictionary<int, Material> m_FontMaterialReferenceLookup = new Dictionary<int, Material>();
14 private Dictionary<int, TMP_FontAsset> m_FontAssetReferenceLookup = new Dictionary<int, TMP_FontAsset>();
15 private Dictionary<int, TMP_SpriteAsset> m_SpriteAssetReferenceLookup = new Dictionary<int, TMP_SpriteAsset>();
16 private Dictionary<int, TMP_ColorGradient> m_ColorGradientReferenceLookup = new Dictionary<int, TMP_ColorGradient>();
17
18
19 /// <summary>
20 /// Get a singleton instance of the registry
21 /// </summary>
22 public static MaterialReferenceManager instance
23 {
24 get
25 {
26 if (MaterialReferenceManager.s_Instance == null)
27 MaterialReferenceManager.s_Instance = new MaterialReferenceManager();
28 return MaterialReferenceManager.s_Instance;
29 }
30 }
31
32
33
34 /// <summary>
35 /// Add new font asset reference to dictionary.
36 /// </summary>
37 /// <param name="fontAsset"></param>
38 public static void AddFontAsset(TMP_FontAsset fontAsset)
39 {
40 MaterialReferenceManager.instance.AddFontAssetInternal(fontAsset);
41 }
42
43 /// <summary>
44 /// Add new Font Asset reference to dictionary.
45 /// </summary>
46 /// <param name="fontAsset"></param>
47 private void AddFontAssetInternal(TMP_FontAsset fontAsset)
48 {
49 if (m_FontAssetReferenceLookup.ContainsKey(fontAsset.hashCode)) return;
50
51 // Add reference to the font asset.
52 m_FontAssetReferenceLookup.Add(fontAsset.hashCode, fontAsset);
53
54 // Add reference to the font material.
55 m_FontMaterialReferenceLookup.Add(fontAsset.materialHashCode, fontAsset.material);
56 }
57
58
59
60 /// <summary>
61 /// Add new Sprite Asset to dictionary.
62 /// </summary>
63 /// <param name="hashCode"></param>
64 /// <param name="spriteAsset"></param>
65 public static void AddSpriteAsset(TMP_SpriteAsset spriteAsset)
66 {
67 MaterialReferenceManager.instance.AddSpriteAssetInternal(spriteAsset);
68 }
69
70 /// <summary>
71 /// Internal method to add a new sprite asset to the dictionary.
72 /// </summary>
73 /// <param name="hashCode"></param>
74 /// <param name="spriteAsset"></param>
75 private void AddSpriteAssetInternal(TMP_SpriteAsset spriteAsset)
76 {
77 if (m_SpriteAssetReferenceLookup.ContainsKey(spriteAsset.hashCode)) return;
78
79 // Add reference to sprite asset.
80 m_SpriteAssetReferenceLookup.Add(spriteAsset.hashCode, spriteAsset);
81
82 // Adding reference to the sprite asset material as well
83 m_FontMaterialReferenceLookup.Add(spriteAsset.hashCode, spriteAsset.material);
84 }
85
86 /// <summary>
87 /// Add new Sprite Asset to dictionary.
88 /// </summary>
89 /// <param name="hashCode"></param>
90 /// <param name="spriteAsset"></param>
91 public static void AddSpriteAsset(int hashCode, TMP_SpriteAsset spriteAsset)
92 {
93 MaterialReferenceManager.instance.AddSpriteAssetInternal(hashCode, spriteAsset);
94 }
95
96 /// <summary>
97 /// Internal method to add a new sprite asset to the dictionary.
98 /// </summary>
99 /// <param name="hashCode"></param>
100 /// <param name="spriteAsset"></param>
101 private void AddSpriteAssetInternal(int hashCode, TMP_SpriteAsset spriteAsset)
102 {
103 if (m_SpriteAssetReferenceLookup.ContainsKey(hashCode)) return;
104
105 // Add reference to Sprite Asset.
106 m_SpriteAssetReferenceLookup.Add(hashCode, spriteAsset);
107
108 // Add reference to Sprite Asset using the asset hashcode.
109 m_FontMaterialReferenceLookup.Add(hashCode, spriteAsset.material);
110
111 // Compatibility check
112 if (spriteAsset.hashCode == 0)
113 spriteAsset.hashCode = hashCode;
114 }
115
116
117 /// <summary>
118 /// Add new Material reference to dictionary.
119 /// </summary>
120 /// <param name="hashCode"></param>
121 /// <param name="material"></param>
122 public static void AddFontMaterial(int hashCode, Material material)
123 {
124 MaterialReferenceManager.instance.AddFontMaterialInternal(hashCode, material);
125 }
126
127 /// <summary>
128 /// Add new material reference to dictionary.
129 /// </summary>
130 /// <param name="hashCode"></param>
131 /// <param name="material"></param>
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
140 /// <summary>
141 /// Add new Color Gradient Preset to dictionary.
142 /// </summary>
143 /// <param name="hashCode"></param>
144 /// <param name="spriteAsset"></param>
145 public static void AddColorGradientPreset(int hashCode, TMP_ColorGradient spriteAsset)
146 {
147 MaterialReferenceManager.instance.AddColorGradientPreset_Internal(hashCode, spriteAsset);
148 }
149
150 /// <summary>
151 /// Internal method to add a new Color Gradient Preset to the dictionary.
152 /// </summary>
153 /// <param name="hashCode"></param>
154 /// <param name="spriteAsset"></param>
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
165 /// <summary>
166 /// Add new material reference and return the index of this new reference in the materialReferences array.
167 /// </summary>
168 /// <param name="material"></param>
169 /// <param name="materialHashCode"></param>
170 /// <param name="fontAsset"></param>
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
204 /// <summary>
205 /// Add new material reference and return the index of this new reference in the materialReferences array.
206 /// </summary>
207 /// <param name="material"></param>
208 /// <param name="materialHashCode"></param>
209 /// <param name="spriteAsset"></param>
210 /// <returns></returns>
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
242 /// <summary>
243 /// Function to check if the font asset is already referenced.
244 /// </summary>
245 /// <param name="font"></param>
246 /// <returns></returns>
247 public bool Contains(TMP_FontAsset font)
248 {
249 return m_FontAssetReferenceLookup.ContainsKey(font.hashCode);
250 }
251
252
253 /// <summary>
254 /// Function to check if the sprite asset is already referenced.
255 /// </summary>
256 /// <param name="font"></param>
257 /// <returns></returns>
258 public bool Contains(TMP_SpriteAsset sprite)
259 {
260 return m_FontAssetReferenceLookup.ContainsKey(sprite.hashCode);
261 }
262
263
264
265 /// <summary>
266 /// Function returning the Font Asset corresponding to the provided hash code.
267 /// </summary>
268 /// <param name="hashCode"></param>
269 /// <param name="fontAsset"></param>
270 /// <returns></returns>
271 public static bool TryGetFontAsset(int hashCode, out TMP_FontAsset fontAsset)
272 {
273 return MaterialReferenceManager.instance.TryGetFontAssetInternal(hashCode, out fontAsset);
274 }
275
276 /// <summary>
277 /// Internal Function returning the Font Asset corresponding to the provided hash code.
278 /// </summary>
279 /// <param name="hashCode"></param>
280 /// <param name="fontAsset"></param>
281 /// <returns></returns>
282 private bool TryGetFontAssetInternal(int hashCode, out TMP_FontAsset fontAsset)
283 {
284 fontAsset = null;
285
286 return m_FontAssetReferenceLookup.TryGetValue(hashCode, out fontAsset);
287 }
288
289
290
291 /// <summary>
292 /// Function returning the Sprite Asset corresponding to the provided hash code.
293 /// </summary>
294 /// <param name="hashCode"></param>
295 /// <param name="spriteAsset"></param>
296 /// <returns></returns>
297 public static bool TryGetSpriteAsset(int hashCode, out TMP_SpriteAsset spriteAsset)
298 {
299 return MaterialReferenceManager.instance.TryGetSpriteAssetInternal(hashCode, out spriteAsset);
300 }
301
302 /// <summary>
303 /// Internal function returning the Sprite Asset corresponding to the provided hash code.
304 /// </summary>
305 /// <param name="hashCode"></param>
306 /// <param name="fontAsset"></param>
307 /// <returns></returns>
308 private bool TryGetSpriteAssetInternal(int hashCode, out TMP_SpriteAsset spriteAsset)
309 {
310 spriteAsset = null;
311
312 return m_SpriteAssetReferenceLookup.TryGetValue(hashCode, out spriteAsset);
313 }
314
315
316 /// <summary>
317 /// Function returning the Color Gradient Preset corresponding to the provided hash code.
318 /// </summary>
319 /// <param name="hashCode"></param>
320 /// <param name="gradientPreset"></param>
321 /// <returns></returns>
322 public static bool TryGetColorGradientPreset(int hashCode, out TMP_ColorGradient gradientPreset)
323 {
324 return MaterialReferenceManager.instance.TryGetColorGradientPresetInternal(hashCode, out gradientPreset);
325 }
326
327 /// <summary>
328 /// Internal function returning the Color Gradient Preset corresponding to the provided hash code.
329 /// </summary>
330 /// <param name="hashCode"></param>
331 /// <param name="fontAsset"></param>
332 /// <returns></returns>
333 private bool TryGetColorGradientPresetInternal(int hashCode, out TMP_ColorGradient gradientPreset)
334 {
335 gradientPreset = null;
336
337 return m_ColorGradientReferenceLookup.TryGetValue(hashCode, out gradientPreset);
338 }
339
340
341 /// <summary>
342 /// Function returning the Font Material corresponding to the provided hash code.
343 /// </summary>
344 /// <param name="hashCode"></param>
345 /// <param name="material"></param>
346 /// <returns></returns>
347 public static bool TryGetMaterial(int hashCode, out Material material)
348 {
349 return MaterialReferenceManager.instance.TryGetMaterialInternal(hashCode, out material);
350 }
351
352 /// <summary>
353 /// Internal function returning the Font Material corresponding to the provided hash code.
354 /// </summary>
355 /// <param name="hashCode"></param>
356 /// <param name="material"></param>
357 /// <returns></returns>
358 private bool TryGetMaterialInternal(int hashCode, out Material material)
359 {
360 material = null;
361
362 return m_FontMaterialReferenceLookup.TryGetValue(hashCode, out material);
363 }
364
365
366 /// <summary>
367 /// Function to lookup a material based on hash code and returning the MaterialReference containing this material.
368 /// </summary>
369 /// <param name="hashCode"></param>
370 /// <param name="material"></param>
371 /// <returns></returns>
372 //public bool TryGetMaterial(int hashCode, out MaterialReference materialReference)
373 //{
374 // int materialIndex = -1;
375
376 // if (m_MaterialReferenceLookup.TryGetValue(hashCode, out materialIndex))
377 // {
378 // materialReference = materialReferences[materialIndex];
379
380 // return true;
381 // }
382
383 // materialReference = new MaterialReference();
384
385 // return false;
386 //}
387
388
389
390 /// <summary>
391 ///
392 /// </summary>
393 /// <param name="fontAsset"></param>
394 /// <returns></returns>
395 //public int GetMaterialIndex(TMP_FontAsset fontAsset)
396 //{
397 // if (m_MaterialReferenceLookup.ContainsKey(fontAsset.materialHashCode))
398 // return m_MaterialReferenceLookup[fontAsset.materialHashCode];
399
400 // return -1;
401 //}
402
403
404 /// <summary>
405 ///
406 /// </summary>
407 /// <param name="index"></param>
408 /// <returns></returns>
409 //public TMP_FontAsset GetFontAsset(int index)
410 //{
411 // if (index >= 0 && index < materialReferences.Length)
412 // return materialReferences[index].fontAsset;
413
414 // return null;
415 //}
416
417
418 /// <summary>
419 ///
420 /// </summary>
421 /// <param name="material"></param>
422 /// <param name="materialHashCode"></param>
423 /// <param name="fontAsset"></param>
424 //public void SetDefaultMaterial(Material material, int materialHashCode, TMP_FontAsset fontAsset)
425 //{
426 // if (!m_MaterialReferenceLookup.ContainsKey(materialHashCode))
427 // {
428 // materialReferences[0].fontAsset = fontAsset;
429 // materialReferences[0].material = material;
430 // materialReferences[0].index = 0;
431 // materialReferences[0].isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID() ? true : false;
432 // materialReferences[0].referenceCount = 0;
433 // m_MaterialReferenceLookup[materialHashCode] = 0;
434
435 // // Compute Padding value and store it
436 // // TODO
437
438 // int fontHashCode = fontAsset.hashCode;
439
440 // if (!m_FontAssetReferenceLookup.ContainsKey(fontHashCode))
441 // m_FontAssetReferenceLookup.Add(fontHashCode, fontAsset);
442 // }
443 // else
444 // {
445 // materialReferences[0].fontAsset = fontAsset;
446 // materialReferences[0].material = material;
447 // materialReferences[0].index = 0;
448 // materialReferences[0].referenceCount = 0;
449 // m_MaterialReferenceLookup[materialHashCode] = 0;
450 // }
451 // // Compute padding
452 // // TODO
453
454 // m_countInternal = 1;
455 //}
456
457
458
459 /// <summary>
460 ///
461 /// </summary>
462 //public void Clear()
463 //{
464 // //m_currentIndex = 0;
465 // m_MaterialReferenceLookup.Clear();
466 // m_SpriteAssetReferenceLookup.Clear();
467 // m_FontAssetReferenceLookup.Clear();
468 //}
469
470
471 /// <summary>
472 /// Function to clear the reference count for each of the material references.
473 /// </summary>
474 //public void ClearReferenceCount()
475 //{
476 // m_countInternal = 0;
477
478 // for (int i = 0; i < materialReferences.Length; i++)
479 // {
480 // if (materialReferences[i].fontAsset == null)
481 // return;
482
483 // materialReferences[i].referenceCount = 0;
484 // }
485 //}
486
487 }
488
489
490 public struct TMP_MaterialReference
491 {
492 public Material material;
493 public int referenceCount;
494 }
495
496
497 public struct MaterialReference
498 {
499
500 public int index;
501 public TMP_FontAsset fontAsset;
502 public TMP_SpriteAsset spriteAsset;
503 public Material material;
504 public bool isDefaultMaterial;
505 public bool isFallbackMaterial;
506 public Material fallbackMaterial;
507 public float padding;
508 public int referenceCount;
509
510
511 /// <summary>
512 /// Constructor for new Material Reference.
513 /// </summary>
514 /// <param name="index"></param>
515 /// <param name="fontAsset"></param>
516 /// <param name="spriteAsset"></param>
517 /// <param name="material"></param>
518 /// <param name="padding"></param>
519 public MaterialReference(int index, TMP_FontAsset fontAsset, TMP_SpriteAsset spriteAsset, Material material, float padding)
520 {
521 this.index = index;
522 this.fontAsset = fontAsset;
523 this.spriteAsset = spriteAsset;
524 this.material = material;
525 this.isDefaultMaterial = material.GetInstanceID() == fontAsset.material.GetInstanceID();
526 this.isFallbackMaterial = false;
527 this.fallbackMaterial = null;
528 this.padding = padding;
529 this.referenceCount = 0;
530 }
531
532
533 /// <summary>
534 /// Function to check if a certain font asset is contained in the material reference array.
535 /// </summary>
536 /// <param name="materialReferences"></param>
537 /// <param name="fontAsset"></param>
538 /// <returns></returns>
539 public static bool Contains(MaterialReference[] materialReferences, TMP_FontAsset fontAsset)
540 {
541 int id = fontAsset.GetInstanceID();
542
543 for (int i = 0; i < materialReferences.Length && materialReferences[i].fontAsset != null; i++)
544 {
545 if (materialReferences[i].fontAsset.GetInstanceID() == id)
546 return true;
547 }
548
549 return false;
550 }
551
552
553 /// <summary>
554 /// Function to add a new material reference and returning its index in the material reference array.
555 /// </summary>
556 /// <param name="material"></param>
557 /// <param name="fontAsset"></param>
558 /// <param name="materialReferences"></param>
559 /// <param name="materialReferenceIndexLookup"></param>
560 /// <returns></returns>
561 public static int AddMaterialReference(Material material, TMP_FontAsset fontAsset, ref MaterialReference[] materialReferences, Dictionary<int, int> materialReferenceIndexLookup)
562 {
563 int materialID = material.GetInstanceID();
564 int index;
565
566 if (materialReferenceIndexLookup.TryGetValue(materialID, out index))
567 return index;
568
569 index = materialReferenceIndexLookup.Count;
570
571 // Add new reference index
572 materialReferenceIndexLookup[materialID] = index;
573
574 if (index >= materialReferences.Length)
575 System.Array.Resize(ref materialReferences, Mathf.NextPowerOfTwo(index + 1));
576
577 materialReferences[index].index = index;
578 materialReferences[index].fontAsset = fontAsset;
579 materialReferences[index].spriteAsset = null;
580 materialReferences[index].material = material;
581 materialReferences[index].isDefaultMaterial = materialID == fontAsset.material.GetInstanceID();
582 materialReferences[index].referenceCount = 0;
583
584 return index;
585 }
586
587
588 /// <summary>
589 ///
590 /// </summary>
591 /// <param name="material"></param>
592 /// <param name="spriteAsset"></param>
593 /// <param name="materialReferences"></param>
594 /// <param name="materialReferenceIndexLookup"></param>
595 /// <returns></returns>
596 public static int AddMaterialReference(Material material, TMP_SpriteAsset spriteAsset, ref MaterialReference[] materialReferences, Dictionary<int, int> materialReferenceIndexLookup)
597 {
598 int materialID = material.GetInstanceID();
599 int index;
600
601 if (materialReferenceIndexLookup.TryGetValue(materialID, out index))
602 return index;
603
604 index = materialReferenceIndexLookup.Count;
605
606 // Add new reference index
607 materialReferenceIndexLookup[materialID] = index;
608
609 if (index >= materialReferences.Length)
610 System.Array.Resize(ref materialReferences, Mathf.NextPowerOfTwo(index + 1));
611
612 materialReferences[index].index = index;
613 materialReferences[index].fontAsset = materialReferences[0].fontAsset;
614 materialReferences[index].spriteAsset = spriteAsset;
615 materialReferences[index].material = material;
616 materialReferences[index].isDefaultMaterial = true;
617 materialReferences[index].referenceCount = 0;
618
619 return index;
620 }
621 }
622}