diff options
Diffstat (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/TrackResourceCache.cs')
| -rw-r--r-- | Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/TrackResourceCache.cs | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/TrackResourceCache.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/TrackResourceCache.cs new file mode 100644 index 0000000..8eda6fe --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Utilities/TrackResourceCache.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.Timeline; + +namespace UnityEditor.Timeline +{ + static class TrackResourceCache + { + private static Dictionary<System.Type, GUIContent> s_TrackIconCache = new Dictionary<Type, GUIContent>(10); + private static Dictionary<System.Type, Color> s_TrackColorCache = new Dictionary<Type, Color>(10); + public static GUIContent s_DefaultIcon = EditorGUIUtility.IconContent("UnityEngine/ScriptableObject Icon"); + + public static GUIContent GetTrackIcon(TrackAsset track) + { + if (track == null) + return s_DefaultIcon; + + GUIContent content = null; + if (!s_TrackIconCache.TryGetValue(track.GetType(), out content)) + { + content = FindTrackIcon(track); + s_TrackIconCache[track.GetType()] = content; + } + return content; + } + + public static Color GetTrackColor(TrackAsset track) + { + if (track == null) + return Color.white; + + // Try to ensure DirectorStyles is initialized first + // Note: GUISkin.current must exist to be able do so + if (!DirectorStyles.IsInitialized && GUISkin.current != null) + DirectorStyles.ReloadStylesIfNeeded(); + + Color color; + if (!s_TrackColorCache.TryGetValue(track.GetType(), out color)) + { + var attr = track.GetType().GetCustomAttributes(typeof(TrackColorAttribute), true); + if (attr.Length > 0) + { + color = ((TrackColorAttribute)attr[0]).color; + } + else + { + // case 1141958 + // There was an error initializing DirectorStyles + if (!DirectorStyles.IsInitialized) + return Color.white; + + color = DirectorStyles.Instance.customSkin.colorDefaultTrackDrawer; + } + + s_TrackColorCache[track.GetType()] = color; + } + return color; + } + + public static void ClearTrackIconCache() + { + s_TrackIconCache.Clear(); + } + + public static void SetTrackIcon<T>(GUIContent content) where T : TrackAsset + { + s_TrackIconCache[typeof(T)] = content; + } + + public static void ClearTrackColorCache() + { + s_TrackColorCache.Clear(); + } + + public static void SetTrackColor<T>(Color c) where T : TrackAsset + { + s_TrackColorCache[typeof(T)] = c; + } + + private static GUIContent FindTrackIcon(TrackAsset track) + { + // backwards compatible -- try to load from Gizmos folder + Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/Gizmos/" + track.GetType().Name + ".png"); + if (texture != null) + return new GUIContent(texture); + + // try to load based on the binding type + var binding = track.outputs.FirstOrDefault(); + if (binding.outputTargetType != null) + { + // Type calls don't properly handle monobehaviours, because an instance is required to + // get the monoscript icons + if (typeof(MonoBehaviour).IsAssignableFrom(binding.outputTargetType)) + { + texture = null; + var scripts = UnityEngine.Resources.FindObjectsOfTypeAll<MonoScript>(); + foreach (var script in scripts) + { + if (script.GetClass() == binding.outputTargetType) + { + texture = AssetPreview.GetMiniThumbnail(script); + break; + } + } + } + else + { + texture = EditorGUIUtility.FindTexture(binding.outputTargetType); + } + + if (texture != null) + return new GUIContent(texture); + } + + // default to the scriptable object icon + return s_DefaultIcon; + } + } +} |
