A game about forced loneliness, made by TACStudios
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}