A game about forced loneliness, made by TACStudios
at master 622 lines 23 kB view raw
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}