133 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | 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 Texture2D GetTrackIconForType(System.Type trackType) | ||
|  |         { | ||
|  |             if (trackType == null || !typeof(TrackAsset).IsAssignableFrom(trackType)) | ||
|  |                 return null; | ||
|  | 
 | ||
|  |             GUIContent content; | ||
|  |             if (!s_TrackIconCache.TryGetValue(trackType, out content) || content.image == null) | ||
|  |                 return s_DefaultIcon.image as Texture2D; | ||
|  |             return content.image as Texture2D; | ||
|  |         } | ||
|  | 
 | ||
|  |         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; | ||
|  |         } | ||
|  |     } | ||
|  | } |