From d608eaab9a5a24848dc6b26e88f7582c266e2811 Mon Sep 17 00:00:00 2001 From: Thor Date: Wed, 11 Oct 2017 09:03:20 +0200 Subject: [PATCH] NodeDataCache initialization now works correctly Still needs work on GetPorts, keep connections, disconnect invalid, etc. --- Example/ExampleNodeGraph.asset | Bin 856 -> 5424 bytes Example/ExampleNodeGraph.asset.meta | 6 ++-- Scripts/NodeDataCache.cs | 52 ++++++++++++---------------- 3 files changed, 25 insertions(+), 33 deletions(-) diff --git a/Example/ExampleNodeGraph.asset b/Example/ExampleNodeGraph.asset index c624f534de48bb18e310d624abb24f20ac39f9ae..2871ba7b5313da89a7d7aabe05d1ed1d8c8b822b 100644 GIT binary patch literal 5424 zcmeI0Uu+ab9LIm#UVE)5v=%CYApK(j!D^*NtWf(Ou(cFo2+=g<+HTv!>)qvgt*uGP znt-v1-QdGJ9|UX0Jgx2lQ8#KZ?eg2V^w_dBz@-KiuXZzlIk=62?@ zv)`Hh{dVRztw_<7$co2Aq)?>jJg!nxxwW#Yze@g|pP#p~0aBzQiG4ZeUZ1M^F1&yC zboJ<8GZTkLr~mk}{l>=dj;RCdj~`r%KD8(oO4t(T2@wYp^Jt<*Zpp{l;#|PJ5D@$6 z!e5aq;CJJig`#Bj z&Zw)yF&fl8b3XY29@M$Z=a!tnJiDO7`7NOaggigAf%Coi&ffe7G4Ai~xc7k5EO;b1 z|D}p)9vpX>&n?-7anC@9{x2YRRDY`q{$wFXz{RR3&sO@Y@eJp4FS#n&vKM_1p|D-# zbFII{)n88TIGm@Uzkn$Sj;YSvXnn+f{5JTsU0xfrTR{u?QXk;{sn;I9ZB6>hgt!qj{Cf7Z#4@ z*w~d07Y>c_s>5|B3KuLF4%RoQxgo6exw#>5Bd2krpbi%-b=DC&RGX&)W2JS;#+kI}veFsGx)!&FazwMjF z{b_Pl%(&P4+>ARy;_91zXk`C-YMFj$B3H$Xd$Z5YxVM1cEbgu3Fvk5PW^e}e5DM2l z?RFDo%I;0en2gIy(Z2Mc4BF9w!L%@Cb|zA3iN=#7X(UqAn-cLjIwRpquU|EDEVHik zN9|Z&M`XyB?m*R!M|xs*pLF*{IV4pQBWWc*8i|eAIzMO0r9ESRI&*#9WcN2Etm_V7q7EkpP#{kid^E!lX5`fGH8wxoMKF9U^NESSJf$wr-&Q8Vdh6#pikNr*S$=Gq28j!MYrJbF!zh{qyFFWwmn$TZ=2$L1Z%VLBX<_ znuZJSq<*X2v+os6OPBuo;nmXGkB16fT&9m0d zR3tgbK71#d_pYpazF_@!%o~qd-uv@UspjZ#G8P%%uZ~+v==nx*+P=ld*TmvImxFuy wOs40oy57N$r$^U$^WdlZEP}7(zMjO`N5ApLC-a`+{{`J|MKO=7=iHxv01o6p1ONa4 literal 856 zcmdr~!D<^Z5WVkLj1TF_4lAuB+q$K#;}~K$5ECdNlv!)+Rat8nt+tI@`tOl<2^gHv zdvuUAdNaeDr+4xFYIzInk|h`Gt2qqX0R-IX*4c2#%;l!q4|&R%PDZ2A5oJukr?{oZ zl`Jb)eWn6`*{bzA0oecemj9$pxUq(=OWZXY((d`r(-!kP^yEUHqT%n>mbCa9Q~sUg zELO{WvCh;M|* zg&5}<$Bay>lu%6ZA%sIs8nT}8Dl*bAd&YfT(yB5v_gEJv48D}uGz$}lwp&YHL&RLn zi@H2MooT8vAyg{mRE{HykEbr@luF{rwi3-)2|1Cek(@KmM5g%kO?8(T{->yqjyt*! zpdoLuw13DvkZ)||H1H01?u`g=c)k3#CKM5lHa=DsWOqfhMju;Ox1s+efT|5A5%vx8 T{_xbaWi0Dl9+|E?d!)$=0yzCE diff --git a/Example/ExampleNodeGraph.asset.meta b/Example/ExampleNodeGraph.asset.meta index 723ec56..04eb901 100644 --- a/Example/ExampleNodeGraph.asset.meta +++ b/Example/ExampleNodeGraph.asset.meta @@ -1,7 +1,7 @@ fileFormatVersion: 2 -guid: 5398d565241ec2d489f41c368ca6cf24 -timeCreated: 1507498811 -licenseType: Free +guid: b21c76861277d8445a55b4691205fd00 +timeCreated: 1507704049 +licenseType: Pro NativeFormatImporter: mainObjectFileID: 11400000 userData: diff --git a/Scripts/NodeDataCache.cs b/Scripts/NodeDataCache.cs index aa02cd1..681eaa2 100644 --- a/Scripts/NodeDataCache.cs +++ b/Scripts/NodeDataCache.cs @@ -7,52 +7,46 @@ using UnityEditor; /// Precaches reflection data in editor so we won't have to do it runtime public sealed class NodeDataCache : ScriptableObject { - public static NodeDataCache instance { - get { - if (_instance == null) _instance = Resources.FindObjectsOfTypeAll().FirstOrDefault(); - return _instance; + public static NodeDataCache instance { get; private set;} + public static bool Initialized { get { return instance != null; } } + + [SerializeField] private PortDataCache portDataCache; + +#if UNITY_EDITOR + [UnityEditor.Callbacks.DidReloadScripts] +#endif + public static void Initialize() { + if (!Initialized) { + instance = Resources.LoadAll("").FirstOrDefault(); +#if UNITY_EDITOR + instance.BuildCache(); +#endif } } - public static NodeDataCache _instance; - public static bool Initialized { get { return _instance != null; } } - - [SerializeField] - private PortDataCache portDataCache = new PortDataCache(); /// Return port data from cache public static void GetPorts(Node node, ref List inputs, ref List outputs) { - if (!Initialized) Initialize(); + Initialize(); System.Type nodeType = node.GetType(); inputs = new List(); outputs = new List(); - if (!_instance.portDataCache.ContainsKey(nodeType)) return; - for (int i = 0; i < _instance.portDataCache[nodeType].Count; i++) { - if (_instance.portDataCache[nodeType][i].direction == NodePort.IO.Input) inputs.Add(new NodePort(_instance.portDataCache[nodeType][i], node)); - else outputs.Add(new NodePort(_instance.portDataCache[nodeType][i], node)); - } - } - - public static void Initialize() { - _instance = Resources.LoadAll("").FirstOrDefault(); + if (!instance.portDataCache.ContainsKey(nodeType)) return; + for (int i = 0; i < instance.portDataCache[nodeType].Count; i++) { + if (instance.portDataCache[nodeType][i].direction == NodePort.IO.Input) inputs.Add(new NodePort(instance.portDataCache[nodeType][i], node)); + else outputs.Add(new NodePort(instance.portDataCache[nodeType][i], node)); + } } #if UNITY_EDITOR - [UnityEditor.Callbacks.DidReloadScripts] - private static void Reload() { - Initialize(); - instance.BuildCache(); - } -#endif - private void BuildCache() { + portDataCache = new PortDataCache(); System.Type baseType = typeof(Node); Assembly assembly = Assembly.GetAssembly(baseType); System.Type[] nodeTypes = assembly.GetTypes().Where(t => !t.IsAbstract && baseType.IsAssignableFrom(t) ).ToArray(); - portDataCache.Clear(); for (int i = 0; i < nodeTypes.Length; i++) { CachePorts(nodeTypes[i]); @@ -60,9 +54,6 @@ public sealed class NodeDataCache : ScriptableObject { } private void CachePorts(System.Type nodeType) { - List inputPorts = new List(); - List outputPorts = new List(); - System.Reflection.FieldInfo[] fieldInfo = nodeType.GetFields(); for (int i = 0; i < fieldInfo.Length; i++) { @@ -80,6 +71,7 @@ public sealed class NodeDataCache : ScriptableObject { } } } +#endif [System.Serializable] private class PortDataCache : Dictionary>, ISerializationCallbackReceiver {