72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using System.Text; | ||
|  | using UnityEditorInternal; | ||
|  | using UnityEngine; | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline | ||
|  | { | ||
|  |     interface IPropertyKeyDataSource | ||
|  |     { | ||
|  |         float[] GetKeys(); // Get the keys | ||
|  |         Dictionary<float, string> GetDescriptions(); // Caches for descriptions | ||
|  |     } | ||
|  | 
 | ||
|  |     abstract class BasePropertyKeyDataSource : IPropertyKeyDataSource | ||
|  |     { | ||
|  |         static readonly StringBuilder k_StringBuilder = new StringBuilder(); | ||
|  | 
 | ||
|  |         protected abstract AnimationClip animationClip { get; } | ||
|  | 
 | ||
|  |         public virtual float[] GetKeys() | ||
|  |         { | ||
|  |             if (animationClip == null) | ||
|  |                 return null; | ||
|  | 
 | ||
|  |             var info = AnimationClipCurveCache.Instance.GetCurveInfo(animationClip); | ||
|  |             return info.keyTimes.Select(TransformKeyTime).ToArray(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public virtual Dictionary<float, string> GetDescriptions() | ||
|  |         { | ||
|  |             var map = new Dictionary<float, string>(); | ||
|  |             var info = AnimationClipCurveCache.Instance.GetCurveInfo(animationClip); | ||
|  |             var processed = new HashSet<string>(); | ||
|  | 
 | ||
|  |             foreach (var b in info.bindings) | ||
|  |             { | ||
|  |                 var groupID = b.GetGroupID(); | ||
|  |                 if (processed.Contains(groupID)) | ||
|  |                     continue; | ||
|  | 
 | ||
|  |                 var group = info.GetGroupBinding(groupID); | ||
|  |                 var prefix = AnimationWindowUtility.GetNicePropertyGroupDisplayName(b.type, b.propertyName); | ||
|  | 
 | ||
|  |                 foreach (var t in info.keyTimes) | ||
|  |                 { | ||
|  |                     k_StringBuilder.Length = 0; | ||
|  | 
 | ||
|  |                     var key = TransformKeyTime(t); | ||
|  |                     if (map.ContainsKey(key)) | ||
|  |                         k_StringBuilder.Append(map[key]) | ||
|  |                             .Append('\n'); | ||
|  | 
 | ||
|  |                     k_StringBuilder.Append(prefix) | ||
|  |                         .Append(" : ") | ||
|  |                         .Append(group.GetDescription(key)); | ||
|  | 
 | ||
|  |                     map[key] = k_StringBuilder.ToString(); | ||
|  |                 } | ||
|  |                 processed.Add(groupID); | ||
|  |             } | ||
|  | 
 | ||
|  |             return map; | ||
|  |         } | ||
|  | 
 | ||
|  |         protected virtual float TransformKeyTime(float keyTime) | ||
|  |         { | ||
|  |             return keyTime; | ||
|  |         } | ||
|  |     } | ||
|  | } |