132 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			132 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Text; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.Playables; | ||
|  | using UnityEngine.Timeline; | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline | ||
|  | { | ||
|  |     [Serializable] | ||
|  |     class SequencePath | ||
|  |     { | ||
|  |         [SerializeField] int m_SelectionRoot; | ||
|  | 
 | ||
|  |         public int selectionRoot | ||
|  |         { | ||
|  |             get { return m_SelectionRoot; } | ||
|  |         } | ||
|  | 
 | ||
|  |         [SerializeField] List<SequencePathSubElement> m_SubElements; | ||
|  | 
 | ||
|  |         public List<SequencePathSubElement> subElements | ||
|  |         { | ||
|  |             get { return m_SubElements ?? (m_SubElements = new List<SequencePathSubElement>()); } | ||
|  |         } | ||
|  | 
 | ||
|  |         public void SetSelectionRoot(int instanceID) | ||
|  |         { | ||
|  |             m_SelectionRoot = instanceID; | ||
|  |             subElements.Clear(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void AddSubSequence(ISequenceState state, IExposedPropertyTable resolver) | ||
|  |         { | ||
|  |             subElements.Add(SequencePathSubElement.Create(state, resolver)); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void Clear() | ||
|  |         { | ||
|  |             m_SelectionRoot = 0; | ||
|  |             subElements.Clear(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool AreEqual(SequencePath lhs, SequencePath rhs) | ||
|  |         { | ||
|  |             if (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) return true; | ||
|  |             if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) return false; | ||
|  |             if (ReferenceEquals(lhs, rhs)) return true; | ||
|  | 
 | ||
|  |             var result = lhs.selectionRoot == rhs.selectionRoot && | ||
|  |                 lhs.subElements.Count == rhs.subElements.Count; | ||
|  | 
 | ||
|  |             if (!result) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             for (int i = 0, n = lhs.subElements.Count; i < n; ++i) | ||
|  |                 result = result && SequencePathSubElement.AreEqual(lhs.subElements[i], rhs.subElements[i]); | ||
|  | 
 | ||
|  |             return result; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override string ToString() | ||
|  |         { | ||
|  |             var sb = new StringBuilder(); | ||
|  | 
 | ||
|  |             sb.AppendFormat("[{0}]", m_SelectionRoot.ToString()); | ||
|  | 
 | ||
|  |             if (m_SubElements != null && m_SubElements.Count > 0) | ||
|  |             { | ||
|  |                 foreach (var element in m_SubElements) | ||
|  |                 { | ||
|  |                     sb.Append(" > "); | ||
|  |                     sb.Append(element.ToString()); | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             return sb.ToString(); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [Serializable] | ||
|  |     class SequencePathSubElement | ||
|  |     { | ||
|  |         public int trackInstanceID; | ||
|  |         public int trackHash; | ||
|  |         public int clipIndex; | ||
|  |         public int clipHash; | ||
|  |         public int subDirectorIndex; | ||
|  | 
 | ||
|  |         public static SequencePathSubElement Create(ISequenceState state, IExposedPropertyTable resolver) | ||
|  |         { | ||
|  |             var clip = state.hostClip; | ||
|  |             Debug.Assert(clip != null); | ||
|  |             var track = clip.GetParentTrack(); | ||
|  |             Debug.Assert(track != null); | ||
|  |             var asset = track.timelineAsset; | ||
|  |             Debug.Assert(asset != null); | ||
|  |             var directors = TimelineUtility.GetSubTimelines(clip, resolver as PlayableDirector); | ||
|  | 
 | ||
|  |             return new SequencePathSubElement | ||
|  |             { | ||
|  |                 trackInstanceID = track.GetInstanceID(), | ||
|  |                 trackHash = track.Hash(), | ||
|  |                 clipIndex = Array.IndexOf(track.clips, clip), | ||
|  |                 clipHash = clip.Hash(), | ||
|  |                 subDirectorIndex = directors.IndexOf(state.director) | ||
|  |             }; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool AreEqual(SequencePathSubElement lhs, SequencePathSubElement rhs) | ||
|  |         { | ||
|  |             if (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) return true; | ||
|  |             if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) return false; | ||
|  |             if (ReferenceEquals(lhs, rhs)) return true; | ||
|  | 
 | ||
|  |             return lhs.trackInstanceID == rhs.trackInstanceID && | ||
|  |                 lhs.trackHash == rhs.trackHash && | ||
|  |                 lhs.clipIndex == rhs.clipIndex && | ||
|  |                 lhs.clipHash == rhs.clipHash && | ||
|  |                 lhs.subDirectorIndex == rhs.subDirectorIndex; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override string ToString() | ||
|  |         { | ||
|  |             return string.Format( | ||
|  |                 "[track[{0}] ({1}) > clip[{2}] ({3})]", | ||
|  |                 trackInstanceID.ToString(), trackHash.ToString(), | ||
|  |                 clipIndex.ToString(), clipHash.ToString()); | ||
|  |         } | ||
|  |     } | ||
|  | } |