A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using UnityEngine;
5
6namespace Unity.VisualScripting
7{
8 public abstract class Graph : IGraph
9 {
10 protected Graph()
11 {
12 elements = new MergedGraphElementCollection();
13 }
14
15 public override string ToString()
16 {
17 return StringUtility.FallbackWhitespace(title, base.ToString());
18 }
19
20 public abstract IGraphData CreateData();
21
22 public virtual IGraphDebugData CreateDebugData()
23 {
24 return new GraphDebugData(this);
25 }
26
27 public virtual void Instantiate(GraphReference instance)
28 {
29 // Debug.Log($"Instantiating graph {instance}");
30
31 foreach (var element in elements)
32 {
33 element.Instantiate(instance);
34 }
35 }
36
37 public virtual void Uninstantiate(GraphReference instance)
38 {
39 // Debug.Log($"Uninstantiating graph {instance}");
40
41 foreach (var element in elements)
42 {
43 element.Uninstantiate(instance);
44 }
45 }
46
47 #region Elements
48
49 [SerializeAs(nameof(elements))]
50 private List<IGraphElement> _elements = new List<IGraphElement>();
51
52 [DoNotSerialize]
53 public MergedGraphElementCollection elements { get; }
54
55 #endregion
56
57
58 #region Metadata
59
60 [Serialize]
61 public string title { get; set; }
62
63 [Serialize]
64 [InspectorTextArea(minLines = 1, maxLines = 10)]
65 public string summary { get; set; }
66
67 #endregion
68
69
70 #region Canvas
71
72 [Serialize]
73 public Vector2 pan { get; set; }
74
75 [Serialize]
76 public float zoom { get; set; } = 1;
77
78 #endregion
79
80
81 #region Serialization
82
83 public IEnumerable<ISerializationDependency> deserializationDependencies => _elements.SelectMany(e => e.deserializationDependencies);
84
85 public virtual void OnBeforeSerialize()
86 {
87 _elements.Clear();
88 _elements.AddRange(elements);
89 }
90
91 public void OnAfterDeserialize()
92 {
93 Serialization.AwaitDependencies(this);
94 }
95
96 public virtual void OnAfterDependenciesDeserialized()
97 {
98 elements.Clear();
99
100 // _elements.OrderBy(e => e.dependencyOrder)
101 var sortedElements = ListPool<IGraphElement>.New();
102 foreach (var element in _elements)
103 {
104 sortedElements.Add(element);
105 }
106 sortedElements.Sort((a, b) => a.dependencyOrder.CompareTo(b.dependencyOrder));
107
108 foreach (var element in sortedElements)
109 {
110 try
111 {
112 if (!element.HandleDependencies())
113 {
114 continue;
115 }
116
117 elements.Add(element);
118 }
119 catch (Exception ex)
120 {
121 Debug.LogWarning($"Failed to add element to graph during deserialization: {element}\n{ex}");
122 }
123 }
124
125 ListPool<IGraphElement>.Free(sortedElements);
126 }
127
128 #endregion
129
130
131 #region Poutine
132
133 public IEnumerable<object> GetAotStubs(HashSet<object> visited)
134 {
135 return elements
136 .Where(element => !visited.Contains(element))
137 .Select(element =>
138 {
139 visited.Add(element);
140 return element;
141 })
142 .SelectMany(element => element.GetAotStubs(visited));
143 }
144
145 private bool prewarmed;
146
147 public void Prewarm()
148 {
149 if (prewarmed)
150 {
151 return;
152 }
153
154 foreach (var element in elements)
155 {
156 element.Prewarm();
157 }
158
159 prewarmed = true;
160 }
161
162 public virtual void Dispose()
163 {
164 foreach (var element in elements)
165 {
166 element.Dispose();
167 }
168 }
169
170 #endregion
171 }
172}