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());
 | |
|         }
 | |
|     }
 | |
| }
 |