A game about forced loneliness, made by TACStudios
at master 131 lines 4.2 kB view raw
1using System; 2using System.Collections.Generic; 3using System.Text; 4using UnityEngine; 5using UnityEngine.Playables; 6using UnityEngine.Timeline; 7 8namespace UnityEditor.Timeline 9{ 10 [Serializable] 11 class SequencePath 12 { 13 [SerializeField] int m_SelectionRoot; 14 15 public int selectionRoot 16 { 17 get { return m_SelectionRoot; } 18 } 19 20 [SerializeField] List<SequencePathSubElement> m_SubElements; 21 22 public List<SequencePathSubElement> subElements 23 { 24 get { return m_SubElements ?? (m_SubElements = new List<SequencePathSubElement>()); } 25 } 26 27 public void SetSelectionRoot(int instanceID) 28 { 29 m_SelectionRoot = instanceID; 30 subElements.Clear(); 31 } 32 33 public void AddSubSequence(ISequenceState state, IExposedPropertyTable resolver) 34 { 35 subElements.Add(SequencePathSubElement.Create(state, resolver)); 36 } 37 38 public void Clear() 39 { 40 m_SelectionRoot = 0; 41 subElements.Clear(); 42 } 43 44 public static bool AreEqual(SequencePath lhs, SequencePath rhs) 45 { 46 if (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) return true; 47 if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) return false; 48 if (ReferenceEquals(lhs, rhs)) return true; 49 50 var result = lhs.selectionRoot == rhs.selectionRoot && 51 lhs.subElements.Count == rhs.subElements.Count; 52 53 if (!result) 54 return false; 55 56 for (int i = 0, n = lhs.subElements.Count; i < n; ++i) 57 result = result && SequencePathSubElement.AreEqual(lhs.subElements[i], rhs.subElements[i]); 58 59 return result; 60 } 61 62 public override string ToString() 63 { 64 var sb = new StringBuilder(); 65 66 sb.AppendFormat("[{0}]", m_SelectionRoot.ToString()); 67 68 if (m_SubElements != null && m_SubElements.Count > 0) 69 { 70 foreach (var element in m_SubElements) 71 { 72 sb.Append(" > "); 73 sb.Append(element.ToString()); 74 } 75 } 76 77 return sb.ToString(); 78 } 79 } 80 81 [Serializable] 82 class SequencePathSubElement 83 { 84 public int trackInstanceID; 85 public int trackHash; 86 public int clipIndex; 87 public int clipHash; 88 public int subDirectorIndex; 89 90 public static SequencePathSubElement Create(ISequenceState state, IExposedPropertyTable resolver) 91 { 92 var clip = state.hostClip; 93 Debug.Assert(clip != null); 94 var track = clip.GetParentTrack(); 95 Debug.Assert(track != null); 96 var asset = track.timelineAsset; 97 Debug.Assert(asset != null); 98 var directors = TimelineUtility.GetSubTimelines(clip, resolver as PlayableDirector); 99 100 return new SequencePathSubElement 101 { 102 trackInstanceID = track.GetInstanceID(), 103 trackHash = track.Hash(), 104 clipIndex = Array.IndexOf(track.clips, clip), 105 clipHash = clip.Hash(), 106 subDirectorIndex = directors.IndexOf(state.director) 107 }; 108 } 109 110 public static bool AreEqual(SequencePathSubElement lhs, SequencePathSubElement rhs) 111 { 112 if (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) return true; 113 if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) return false; 114 if (ReferenceEquals(lhs, rhs)) return true; 115 116 return lhs.trackInstanceID == rhs.trackInstanceID && 117 lhs.trackHash == rhs.trackHash && 118 lhs.clipIndex == rhs.clipIndex && 119 lhs.clipHash == rhs.clipHash && 120 lhs.subDirectorIndex == rhs.subDirectorIndex; 121 } 122 123 public override string ToString() 124 { 125 return string.Format( 126 "[track[{0}] ({1}) > clip[{2}] ({3})]", 127 trackInstanceID.ToString(), trackHash.ToString(), 128 clipIndex.ToString(), clipHash.ToString()); 129 } 130 } 131}