123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- #if UNITY_EDITOR
- using UnityEngine;
- using UnityEditor;
- using System.Collections.Generic;
- namespace O3DWB
- {
- public class PrefabPreviewTextureCache
- {
- #region Private Variables
- private Dictionary<Prefab, Texture2D> _prefabToPreviewTexture = new Dictionary<Prefab, Texture2D>();
- #endregion
- public int NumPreviews { get { return _prefabToPreviewTexture.Count; } }
- #region Public Static Functions
- public static PrefabPreviewTextureCache Get()
- {
- if (Octave3DWorldBuilder.ActiveInstance == null) return null;
- return Octave3DWorldBuilder.ActiveInstance.ToolResources.PrefabPreviewTextureCache;
- }
- #endregion
- #region Public Methods
- public bool IsPreviewTextureAvailableForPrefab(Prefab prefab)
- {
- return _prefabToPreviewTexture.ContainsKey(prefab);
- }
- public Texture2D GetPrefabPreviewTexture(Prefab prefab)
- {
- if (IsPreviewTextureAvailableForPrefab(prefab)) return _prefabToPreviewTexture[prefab];
- return GeneratePrefabPreviewTextureAndStore(prefab);
- }
- public void DisposeTextures()
- {
- foreach (var pair in _prefabToPreviewTexture)
- {
- if (pair.Value != null) Octave3DWorldBuilder.DestroyImmediate(pair.Value, true);
- }
- _prefabToPreviewTexture.Clear();
- }
- public void DestroyTexturesForNullPrefabEntries()
- {
- Dictionary<Prefab, Texture2D> newPrefabToPreviewTexture = GenerateNewDictionaryExcludingPairsWithNullPrefabReferences();
- _prefabToPreviewTexture.Clear();
- _prefabToPreviewTexture = newPrefabToPreviewTexture;
- }
- public void GeneratePreviewForAllPrefabCategories(bool showProgress)
- {
- PrefabPreviewGenerator.Get().BeginPreviewGenSession();
- if (!showProgress)
- {
- PrefabCategoryDatabase categoryDatabase = PrefabCategoryDatabase.Get();
- List<PrefabCategory> allCategories = categoryDatabase.GetAllPrefabCategories();
- foreach(var category in allCategories)
- {
- int numPrefabs = category.NumberOfPrefabs;
- if (numPrefabs == 0) continue;
- List<Prefab> allPrefabs = category.GetAllPrefabs();
- foreach(var prefab in allPrefabs)
- {
- if (prefab == null || prefab.UnityPrefab == null || IsPreviewTextureAvailableForPrefab(prefab)) continue;
- Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
- if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
- }
- }
- }
- else
- {
- PrefabCategoryDatabase categoryDatabase = PrefabCategoryDatabase.Get();
- List<PrefabCategory> allCategories = categoryDatabase.GetAllPrefabCategories();
- foreach (var category in allCategories)
- {
- int numPrefabs = category.NumberOfPrefabs;
- if (numPrefabs == 0) continue;
- float invPrefabCount = 1.0f / numPrefabs;
- List<Prefab> allPrefabs = category.GetAllPrefabs();
- for(int prefabIndex = 0; prefabIndex < allPrefabs.Count; ++prefabIndex)
- {
- Prefab prefab = allPrefabs[prefabIndex];
- if (prefab == null || prefab.UnityPrefab == null || IsPreviewTextureAvailableForPrefab(prefab)) continue;
-
- EditorUtility.DisplayProgressBar("Generating prefab previews (" + category.Name + ")", "Prefab: " + prefab.UnityPrefab.name, (float)(prefabIndex + 1) * invPrefabCount);
- Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
- if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
- }
- }
- EditorUtility.ClearProgressBar();
- }
- PrefabPreviewGenerator.Get().EndPreviewGenSession();
- }
- public void GeneratePreviewsForPrefabCollection(List<Prefab> prefabs, bool showProgress)
- {
- int numPrefabs = prefabs.Count;
- if (numPrefabs == 0) return;
- PrefabPreviewGenerator.Get().BeginPreviewGenSession();
- if(!showProgress)
- {
- foreach (var prefab in prefabs)
- {
- if (prefab == null || prefab.UnityPrefab == null || IsPreviewTextureAvailableForPrefab(prefab)) continue;
- Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
- if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
- }
- }
- else
- {
- float invPrefabCount = 1.0f / numPrefabs;
- for(int prefabIndex = 0; prefabIndex < numPrefabs; ++prefabIndex)
- {
- Prefab prefab = prefabs[prefabIndex];
- if (prefab == null || prefab.UnityPrefab == null || IsPreviewTextureAvailableForPrefab(prefab)) continue;
- EditorUtility.DisplayProgressBar("Generating prefab previews...", "Prefab: " + prefab.UnityPrefab.name, (float)(prefabIndex + 1) * invPrefabCount);
- Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
- if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
- }
- EditorUtility.ClearProgressBar();
- }
- PrefabPreviewGenerator.Get().EndPreviewGenSession();
- }
- #endregion
- #region Private Methods
- private Texture2D GeneratePrefabPreviewTextureAndStore(Prefab prefab)
- {
- PrefabPreviewGenerator.Get().BeginPreviewGenSession();
- Texture2D prefabPreview = PrefabPreviewGenerator.Get().GeneratePreview(prefab);
- PrefabPreviewGenerator.Get().EndPreviewGenSession();
- if (prefabPreview != null) _prefabToPreviewTexture.Add(prefab, prefabPreview);
- return prefabPreview;
- }
- /* private Texture2D ClonePrefabPreviewAndStore(Prefab prefab, Texture2D prefabPreview)
- {
- if (prefabPreview != null)
- {
- Texture2D clonedPreviewTexture = prefabPreview.Clone(true);
- if (clonedPreviewTexture != null)
- {
- _prefabToPreviewTexture.Add(prefab, clonedPreviewTexture);
- return clonedPreviewTexture;
- }
- }
- return null;
- }*/
- private Dictionary<Prefab, Texture2D> GenerateNewDictionaryExcludingPairsWithNullPrefabReferences()
- {
- var newPrefabPreviewTextureDictionary = new Dictionary<Prefab, Texture2D>();
- foreach (KeyValuePair<Prefab, Texture2D> pair in _prefabToPreviewTexture)
- {
- if ((pair.Key == null || pair.Key.UnityPrefab == null) && pair.Value != null) Octave3DWorldBuilder.DestroyImmediate(pair.Value);
- else newPrefabPreviewTextureDictionary.Add(pair.Key, pair.Value);
- }
- return newPrefabPreviewTextureDictionary;
- }
- #endregion
- }
- }
- #endif
|