PrefabPreviewTextureCache.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using UnityEditor;
  4. using System.Collections.Generic;
  5. namespace O3DWB
  6. {
  7. public class PrefabPreviewTextureCache
  8. {
  9. #region Private Variables
  10. private Dictionary<Prefab, Texture2D> _prefabToPreviewTexture = new Dictionary<Prefab, Texture2D>();
  11. #endregion
  12. public int NumPreviews { get { return _prefabToPreviewTexture.Count; } }
  13. #region Public Static Functions
  14. public static PrefabPreviewTextureCache Get()
  15. {
  16. if (Octave3DWorldBuilder.ActiveInstance == null) return null;
  17. return Octave3DWorldBuilder.ActiveInstance.ToolResources.PrefabPreviewTextureCache;
  18. }
  19. #endregion
  20. #region Public Methods
  21. public bool IsPreviewTextureAvailableForPrefab(Prefab prefab)
  22. {
  23. return _prefabToPreviewTexture.ContainsKey(prefab);
  24. }
  25. public Texture2D GetPrefabPreviewTexture(Prefab prefab)
  26. {
  27. if (IsPreviewTextureAvailableForPrefab(prefab)) return _prefabToPreviewTexture[prefab];
  28. return GeneratePrefabPreviewTextureAndStore(prefab);
  29. }
  30. public void DisposeTextures()
  31. {
  32. foreach (var pair in _prefabToPreviewTexture)
  33. {
  34. if (pair.Value != null) Octave3DWorldBuilder.DestroyImmediate(pair.Value, true);
  35. }
  36. _prefabToPreviewTexture.Clear();
  37. }
  38. public void DestroyTexturesForNullPrefabEntries()
  39. {
  40. Dictionary<Prefab, Texture2D> newPrefabToPreviewTexture = GenerateNewDictionaryExcludingPairsWithNullPrefabReferences();
  41. _prefabToPreviewTexture.Clear();
  42. _prefabToPreviewTexture = newPrefabToPreviewTexture;
  43. }
  44. public void GeneratePreviewForAllPrefabCategories(bool showProgress)
  45. {
  46. PrefabPreviewGenerator.Get().BeginPreviewGenSession();
  47. if (!showProgress)
  48. {
  49. PrefabCategoryDatabase categoryDatabase = PrefabCategoryDatabase.Get();
  50. List<PrefabCategory> allCategories = categoryDatabase.GetAllPrefabCategories();
  51. foreach(var category in allCategories)
  52. {
  53. int numPrefabs = category.NumberOfPrefabs;
  54. if (numPrefabs == 0) continue;
  55. List<Prefab> allPrefabs = category.GetAllPrefabs();
  56. foreach(var prefab in allPrefabs)
  57. {
  58. if (prefab == null || prefab.UnityPrefab == null || IsPreviewTextureAvailableForPrefab(prefab)) continue;
  59. Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
  60. if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
  61. }
  62. }
  63. }
  64. else
  65. {
  66. PrefabCategoryDatabase categoryDatabase = PrefabCategoryDatabase.Get();
  67. List<PrefabCategory> allCategories = categoryDatabase.GetAllPrefabCategories();
  68. foreach (var category in allCategories)
  69. {
  70. int numPrefabs = category.NumberOfPrefabs;
  71. if (numPrefabs == 0) continue;
  72. float invPrefabCount = 1.0f / numPrefabs;
  73. List<Prefab> allPrefabs = category.GetAllPrefabs();
  74. for(int prefabIndex = 0; prefabIndex < allPrefabs.Count; ++prefabIndex)
  75. {
  76. Prefab prefab = allPrefabs[prefabIndex];
  77. if (prefab == null || prefab.UnityPrefab == null || IsPreviewTextureAvailableForPrefab(prefab)) continue;
  78. EditorUtility.DisplayProgressBar("Generating prefab previews (" + category.Name + ")", "Prefab: " + prefab.UnityPrefab.name, (float)(prefabIndex + 1) * invPrefabCount);
  79. Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
  80. if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
  81. }
  82. }
  83. EditorUtility.ClearProgressBar();
  84. }
  85. PrefabPreviewGenerator.Get().EndPreviewGenSession();
  86. }
  87. public void GeneratePreviewsForPrefabCollection(List<Prefab> prefabs, bool showProgress)
  88. {
  89. int numPrefabs = prefabs.Count;
  90. if (numPrefabs == 0) return;
  91. PrefabPreviewGenerator.Get().BeginPreviewGenSession();
  92. if(!showProgress)
  93. {
  94. foreach (var prefab in prefabs)
  95. {
  96. if (prefab == null || prefab.UnityPrefab == null || IsPreviewTextureAvailableForPrefab(prefab)) continue;
  97. Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
  98. if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
  99. }
  100. }
  101. else
  102. {
  103. float invPrefabCount = 1.0f / numPrefabs;
  104. for(int prefabIndex = 0; prefabIndex < numPrefabs; ++prefabIndex)
  105. {
  106. Prefab prefab = prefabs[prefabIndex];
  107. if (prefab == null || prefab.UnityPrefab == null || IsPreviewTextureAvailableForPrefab(prefab)) continue;
  108. EditorUtility.DisplayProgressBar("Generating prefab previews...", "Prefab: " + prefab.UnityPrefab.name, (float)(prefabIndex + 1) * invPrefabCount);
  109. Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
  110. if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
  111. }
  112. EditorUtility.ClearProgressBar();
  113. }
  114. PrefabPreviewGenerator.Get().EndPreviewGenSession();
  115. }
  116. #endregion
  117. #region Private Methods
  118. private Texture2D GeneratePrefabPreviewTextureAndStore(Prefab prefab)
  119. {
  120. PrefabPreviewGenerator.Get().BeginPreviewGenSession();
  121. Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
  122. PrefabPreviewGenerator.Get().EndPreviewGenSession();
  123. if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
  124. return prefabPreview;
  125. }
  126. /* private Texture2D ClonePrefabPreviewAndStore(Prefab prefab, Texture2D prefabPreview)
  127. {
  128. if (prefabPreview != null)
  129. {
  130. Texture2D clonedPreviewTexture = prefabPreview.Clone(true);
  131. if (clonedPreviewTexture != null)
  132. {
  133. _prefabToPreviewTexture.Add(prefab, clonedPreviewTexture);
  134. return clonedPreviewTexture;
  135. }
  136. }
  137. return null;
  138. }*/
  139. private Dictionary<Prefab, Texture2D> GenerateNewDictionaryExcludingPairsWithNullPrefabReferences()
  140. {
  141. var newPrefabPreviewTextureDictionary = new Dictionary<Prefab, Texture2D>();
  142. foreach (KeyValuePair<Prefab, Texture2D> pair in _prefabToPreviewTexture)
  143. {
  144. if ((pair.Key == null || pair.Key.UnityPrefab == null) && pair.Value != null) Octave3DWorldBuilder.DestroyImmediate(pair.Value);
  145. else newPrefabPreviewTextureDictionary.Add(pair.Key, pair.Value);
  146. }
  147. return newPrefabPreviewTextureDictionary;
  148. }
  149. #endregion
  150. }
  151. }
  152. #endif