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}