From 42bb9a927ae7b2483cd69a5cc70df22f569fbc71 Mon Sep 17 00:00:00 2001 From: Thor Brigsted Date: Sat, 12 May 2018 14:39:49 +0200 Subject: [PATCH] RuntimeMathGraph functional --- .../Prefabs/Connection.prefab | Bin 2774 -> 7960 bytes .../RuntimeMathGraph/Prefabs/NodeGraph.prefab | Bin 7767 -> 35692 bytes .../Prefabs/Nodes/DisplayValue.prefab | Bin 20122 -> 21880 bytes .../Prefabs/Nodes/MathNode.prefab | Bin 78297 -> 62640 bytes .../Prefabs/Nodes/Vector.prefab | Bin 58535 -> 39880 bytes .../Scenes/RuntimeGraph.unity | Bin 15035 -> 24600 bytes Examples/RuntimeMathGraph/Scripts/NodeDrag.cs | 13 +- .../Scripts/RuntimeMathGraph.cs | 53 +++++-- .../Scripts/RuntimeNodes/DisplayValue.cs | 8 -- .../Scripts/RuntimeNodes/MathNode.cs | 8 -- .../Scripts/RuntimeNodes/RuntimeMathNodes.cs | 72 ---------- .../Scripts/RuntimeNodes/UGUIDisplayValue.cs | 18 +++ ...Value.cs.meta => UGUIDisplayValue.cs.meta} | 0 .../Scripts/RuntimeNodes/UGUIMathBaseNode.cs | 49 +++++++ ...Nodes.cs.meta => UGUIMathBaseNode.cs.meta} | 0 .../Scripts/RuntimeNodes/UGUIMathNode.cs | 48 +++++++ ...{MathNode.cs.meta => UGUIMathNode.cs.meta} | 0 .../Scripts/RuntimeNodes/UGUIVector.cs | 51 +++++++ .../{Vector.cs.meta => UGUIVector.cs.meta} | 0 .../Scripts/RuntimeNodes/Vector.cs | 8 -- .../Scripts/UGUIContextMenu.cs | 54 +++++++ .../Scripts/UGUIContextMenu.cs.meta | 13 ++ Examples/RuntimeMathGraph/Scripts/UGUIPort.cs | 132 ++++++++++++++++++ .../RuntimeMathGraph/Scripts/UGUIPort.cs.meta | 13 ++ .../RuntimeMathGraph/Scripts/UGUITooltip.cs | 45 ++++++ .../Scripts/UGUITooltip.cs.meta | 13 ++ 26 files changed, 489 insertions(+), 109 deletions(-) delete mode 100644 Examples/RuntimeMathGraph/Scripts/RuntimeNodes/DisplayValue.cs delete mode 100644 Examples/RuntimeMathGraph/Scripts/RuntimeNodes/MathNode.cs delete mode 100644 Examples/RuntimeMathGraph/Scripts/RuntimeNodes/RuntimeMathNodes.cs create mode 100644 Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIDisplayValue.cs rename Examples/RuntimeMathGraph/Scripts/RuntimeNodes/{DisplayValue.cs.meta => UGUIDisplayValue.cs.meta} (100%) create mode 100644 Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathBaseNode.cs rename Examples/RuntimeMathGraph/Scripts/RuntimeNodes/{RuntimeMathNodes.cs.meta => UGUIMathBaseNode.cs.meta} (100%) create mode 100644 Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathNode.cs rename Examples/RuntimeMathGraph/Scripts/RuntimeNodes/{MathNode.cs.meta => UGUIMathNode.cs.meta} (100%) create mode 100644 Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIVector.cs rename Examples/RuntimeMathGraph/Scripts/RuntimeNodes/{Vector.cs.meta => UGUIVector.cs.meta} (100%) delete mode 100644 Examples/RuntimeMathGraph/Scripts/RuntimeNodes/Vector.cs create mode 100644 Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs create mode 100644 Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs.meta create mode 100644 Examples/RuntimeMathGraph/Scripts/UGUIPort.cs create mode 100644 Examples/RuntimeMathGraph/Scripts/UGUIPort.cs.meta create mode 100644 Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs create mode 100644 Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs.meta diff --git a/Examples/RuntimeMathGraph/Prefabs/Connection.prefab b/Examples/RuntimeMathGraph/Prefabs/Connection.prefab index 90c209c06f5a7e91e9927a926c9a7789a20ae7f8..a2a26449c573be4bf05f288df78b3cf1472980c4 100644 GIT binary patch literal 7960 zcmeHLZEPIH8J_jou@g#23x%|Ch(jC*#C7upgg}zJobAL(9A9k5K_Ck2^ZI=8`PSWA zA2E^0@*`~}Nb~7WGR?Nn0x7KF`d~ z-t5^4iTG8Cv0mTIv+q9h&O0;jyt6_yE)`d1iu03` zlhzDie@@`vY9Mdch~Rc10=zPbCTc=h`1@u; z1V6MyPz%V4gf$_qhESjHTLGWfh+l%|2DCo}VXx|)gm@E-tI#G-g)1Ri!M_$*1Edb3 z^lQXxz&p?;KZl_B6V`I@P>9zPe}V7RO8$9xhuq{+Jhh@9^GE;cWX25#CjKf*2X8O-mu(I(IJ5ndDHSzzEMPg8_j zVikCfqD`KK5gzB^dRO+>#Mbko2)D#mjOj$!Zsu=Nh>Yh9*#lkfV16i{wf($X6r=Z7 zHTyifSQ>J@(TwdmMIQI^gYbM%}VAn080U+#>oc$-daTGMFl^>uzDY1X2h29vpJH0p~RYB2I)1IQV72VPN3`<;G7) zOyQhRPB4Q(CE%!q@$-;}cIb&Sd1Szm&(wr!9vN^XZpi?(1a&TW_K^x?zp;(afRjoR zR{>B5C-e4m$KtCEzIhY7%NLz*>^Z-)|5q#T z|4Z{R`iX0nw%229|Iho6fw>&+W4Zt2xZ?3Z?!OQ>=fAT5EO7w);6CusC-T6@#?gt- zmT>;L#`v80F#3Hf?3eqGrFz}T13$#gek%w5)cvOp%$ivIc)$B^CG6Du&k6$C8RJ*` zk9a&jsr{#LbAPM-7l=z;?{ZmM;?&ho=Z`-pZe2a|z89bV?Dn-s|FQF#lOscmwyaoo z;J4z9b6s#%0x|uAWmyT^A1uquUzXgS3~#F;@Ap{fN0?88hesoi1tFTiULy_y-+~s8 z3zdgfaIRzG>R71Y-65{>&AU;F9i0VlQ{d^OI zMc;22K58NQs3C5K!JDP7;$a%{d$h@a3w{-Ueaz0K)K5~sA$EUiAugpMmWF&H!qq+I z?`YGWRtO92KZoC1yv%+-NiZN@FUK_pILEb&IEwC9k88Qa6mE`dMTFPO^lD+qzmg<@ z)Q^p874?(EXU4{LD{(0^W8=Cl!qq);1C%%}9OJUk{)6Z#6XM(lEX3*O2Y_?DcMuGS zH^l5&L)|3txIK3gmlC(P8oEQ)`+CBC})-L&d>f)FlFBE!xyqO-hi#cboy{s;y z-NouBBI9_ad6ad&v$H)NNi@6@f;k0I5>R867B0^i7O8A!TRLH`F@{u5Gqe9&RXXaNUB@ zr18={=qe&rW9c39^1j2ds2VD`DwiCu?4(L#xOxM?J)w}sP-NQAh8k`7BsJ=e>zjWe zU2wA_59Ui8F*Uord@f()GUZ-+Y44$}JHEd8-bXw7Z|XW;o4W!iqXQOw{Jc(Setz#BL5u5$*Ys4t^%K9Y@pDEhNj!dCtP~ri&)OF##oBGO0)(WoqmqhxC=Lp*5Vct3&&n;EB=2;ryisu;GWeS6ODmP=6V&Fomv_SjbrE_pjh&OTB8sY0Ln(%i#8s@v0X{Bvi1^Nace zTNEn!N%dYukC*mbsAxZNJS=)ltm`qeu6@F)_8G@J3zBw=MXV{V3b`hFr?|F=1YWMcrbN3OF2}&ahMKcrz4n9tl?vg%i~04v^vvg`KNL>? XXo+i1)1og;kt%zBy)KPPQa}42cGv-Y literal 2774 zcmds3TaOwy6n^JdI1kB70oijOqKAnkXOPUWl2vv)R{8v^q?|I4I3A(BWh`@HuG^c`pVdc+E*IdZ~@~re& zm3+wy+L%4qF&gHY%6h4EHKCfxW`MpfxnQHW1B8EXMNY4QiBG?@`%_k_9V;_cZIpz& zhqG$obhVCNXsi}frJ6fhG3We=MS_FWOTsh`J&(kGWE`j#quMDtI7p7b7*x)0bWZfz z%U1wlyM3zh$_*Ph1YvO=$%bi3#hIIJDvW>M06VlMj<6V{dkE6%P&!fMd4V5AY3wDK zL_w4iYx#S!UhIWwib)zru;LeF2?>IPBp?&|Ng77UpU9FVi6V>>&x?HQIn?jzp6LN{ zv3!7R4N#_}1hxTrY=CpRnl+ls)c`$8VDO5Sc7IeD#+}osT700pF{{_DT9<`c15_+- zOWr8m^4A@V>LJ+Kfz9V+lK|2Uft@?s87rxNWNW(PYO7x;ibFmfi~d>8tHlY;o+G^^ zqXY6*(p<38m1ebY(VkRn3q_&%=Ct|<32nJ|(Q3=#b`(a;4{|>a3ytaTF#v0v;WpUB);J z!zFO5OoEiq!~;+h959>~QA~=z53OliV+xG}`tWrrWJ)MVz*qPZ@Bun)KlKUrgD~o% z9Da5Yg(H{9Dcu*eZst_481TdNcWC=E+X`XIhh=Ljq4Eyxd}2C&-9VZ%Dn#wJ%@z0a zxp~ilEsi9QX7Jp~6_>34IO>mS{bU$>r|D+Riytm6-R?kn7fSy0Ru|kdpLXEfkUlnl zT?DtAt!6ipZ5vHR7frUg;KfgDKUYso-bjeUhBVt~-T;4(eZwRESpm=#r$A8}<{{4G zC|KsuwOCXpMT{}cgNrPg_zrUqIytoI9UImg=wAS^wfK$;kwGk`7#yr-XUv+lf_e*% zGQ&!3&0u_%$%HDNKJ(i4Cj+jz_@FsJXq2~e+w(m129}Gq-N~rj(R#{c$u!uucCN;h zGxqO|slVK^j?P27y`E2tQ+1r<|eCW{?Izu9`)+x3fGKObw$%1%_x zza!gDLZfj8U&BsN2Q>@oUe-_3iI@N(2#h;lcT%0 zTfy{Dt^}*!bNdFn^xAncl*L-m@N=+`!1O9oicOk(*7SJjXkgc diff --git a/Examples/RuntimeMathGraph/Prefabs/NodeGraph.prefab b/Examples/RuntimeMathGraph/Prefabs/NodeGraph.prefab index b98c8dcedd7f56376d436da0e68cd622e01ebcce..fe4dd1b688fe1684c129376cc2006b46b2c88985 100644 GIT binary patch literal 35692 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 literal 7767 zcmds5TW{Mo6n^)wP#@Zt+5t(CB4wZtnUl7`>L!TO0K+gCltkHDbulE_Sz7eJ?~s%e zSys|vO%bCGqQn$=?w60}4-P)UgO^vw@0=Iw7fvk~<8_|Yw{CP47TJ&>jK_n~ zXr$j_gs}5UKau_nE=m>4U_5Y~YcN{W2! z5VLz)L`j^4ves*`qA6UJGOyyI%r0c9@_OuijgwTJos1pyt=ZB(1}y&kt69HPS+P;k zq{vo94rjOTvbm+z2-=~T%`c0hekU_!g>P}h*mXfokNFG>4^b^ZHb1K@p{;=U&M;t= z&WS;bt~tDCAY_)?6!*k1ih~ly&S!b8%3P*xF}JSJ^7R;-85VbD(Uu-L;8ts;79m0? zVIJcIxvoHzyGG;wy%PRmWkSY=GsC zPYB0^a>h9lLO{TN*C#q?xAwMPepa7Q#xSQ0gRQ9`LfiRap9o+0o<}hFg^EY^5<(cq zf^g;%>SE%0kJ4p8lQYJV4-w*v7*KEQ>UCv=^VrgB&B_5)5il z!MXUp2M;V+p=?4qrr<+CsV$(ri83jmkmt{mCz$F+MLQ`ym=<~Qn_9|EQmo5I+WAvf z#%$gy#`nb^s@G1*wyotfmqDr`3o5d?Z2&E-(R7EfOjd2&FybB)$fH;coy9tV^D#$^ zu^3Yt3F>1h2#XOkJcazw<2W2T_3a9}h->-UE@tw<@|>iys?H*CAHWyg?aaHWgw6~= zXTOO}inM@TU*Q*n4CWb_r-Y|vaw%^^S=CpvTquy2w3chtQ+j zr-q=Z{xm@D4L(BpXXwD`dR?kFxmwqyOoz_JI!Kf7cXfMJd{+6J9P}_&nyt#D2HSQU zy_OR&p4kIP2Vl%b9ak$rliSs|Nt#YTCT(zQ9=$SE^|An;Qgc$T9B0K^1IPP4le7pw z-z1d*2HHq^+j*IQDKzmdu5I$718WW{FFNq@hw?(BH~qQG3MOI}a!GhZg>q>e0P01G zbI<2Wc;5fXiiL)KEoVd7+2QH)0L1Wc6iXtBM?HxN=D=6^2tZ}9oGOB>cU>D#QXA^eK6 zj}gEu1Z9JB*Q0Pl*fJ6<=3ItCNh&A`sq_U=1pAz07Q|ls5Tlc%TBY*#TBhq>z2F)G zO`cKY`UH7*F7uTj0rrIQc#K^E&t2E0IPzlg5Ibl-Ij9ELu0GwMQi8h?=tn#k zk*#h#L_~&xP(kDcVMK{QOe(2;=Yk0<3^d&~L$+Fpe?9hFl-iFu{C1QK3pzX(lF@fC}_RC=K?d1@AMJR|(vL z4Vi{{b1B=Eyyse(&F>|*)B>r2OWYp8Wb>^uk8J6obDdO4kfcT~JOA0Ev%jT>&TJ(^ zGd>u(#wL4Ix*N`OQ&*oHL0R=Lp^(15|F<7D?Exl`Tz~!(Y-%bg+zOpn@aWv-1{0ZY zWOb?XNR@z%j7|2&Og0c~wSS6{#zVk;FRweocV-TUCH!6=xDy_3O#8V$(5}CmS3a}h zJNIT=P(Kt`YX(#`ga>kPp8<04 z1ab|b$udbJnB6v$SwPzW*feOrDhK=vi)2&i>!xOT#H@9X z*thMi0(3R8(;2KDRP6NLDxNoX!2P40fa#fx^+Z-PD*u%OsgpSe6-avpR702p3#4Aa z)>oo>Bkos@td7D56tAmf B5Geov diff --git a/Examples/RuntimeMathGraph/Prefabs/Nodes/DisplayValue.prefab b/Examples/RuntimeMathGraph/Prefabs/Nodes/DisplayValue.prefab index 1d7820f3af606d6024b950c6b4bba11d7f310c41..06a69a9c714a6546b02c7c40d1250ccbccb7fb42 100644 GIT binary patch literal 21880 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 JiS1mj{|}#ZhZq0= literal 78297 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 diff --git a/Examples/RuntimeMathGraph/Prefabs/Nodes/Vector.prefab b/Examples/RuntimeMathGraph/Prefabs/Nodes/Vector.prefab index 4ac6da7939c5af27814c93bedb50b4e09cf7e313..bb62ddb114b90face1802f16c0cd12817d3a3375 100644 GIT binary patch literal 39880 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 diff --git a/Examples/RuntimeMathGraph/Scenes/RuntimeGraph.unity b/Examples/RuntimeMathGraph/Scenes/RuntimeGraph.unity index 4e5127239fd4a292f75437ecf26df84f9f4d35bd..23b162cba5673e88709ee894c778b87f426a797e 100644 GIT binary patch literal 24600 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 B6F~p~ literal 15035 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 (); + node = GetComponentInParent(); } public void OnDrag(PointerEventData eventData) { @@ -21,5 +21,12 @@ namespace XNode.Examples.RuntimeMathNodes { Vector2 pos = node.transform.localPosition; offset = pointer - pos; } + + public void OnEndDrag(PointerEventData eventData) { + node.transform.localPosition = node.graph.scrollRect.content.InverseTransformPoint(eventData.position) - offset; + Vector2 pos = node.transform.localPosition; + pos.y = -pos.y; + node.node.position = pos; + } } } \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeMathGraph.cs b/Examples/RuntimeMathGraph/Scripts/RuntimeMathGraph.cs index 2f182b3..114c6be 100644 --- a/Examples/RuntimeMathGraph/Scripts/RuntimeMathGraph.cs +++ b/Examples/RuntimeMathGraph/Scripts/RuntimeMathGraph.cs @@ -2,38 +2,58 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.EventSystems; using UnityEngine.UI; using XNode.Examples.MathNodes; namespace XNode.Examples.RuntimeMathNodes { - public class RuntimeMathGraph : MonoBehaviour { + public class RuntimeMathGraph : MonoBehaviour, IPointerClickHandler { [Header("Graph")] public MathGraph graph; [Header("Prefabs")] - public XNode.Examples.RuntimeMathNodes.MathNode runtimeMathNodePrefab; - public XNode.Examples.RuntimeMathNodes.Vector runtimeVectorPrefab; - public XNode.Examples.RuntimeMathNodes.DisplayValue runtimeDisplayValuePrefab; + public XNode.Examples.RuntimeMathNodes.UGUIMathNode runtimeMathNodePrefab; + public XNode.Examples.RuntimeMathNodes.UGUIVector runtimeVectorPrefab; + public XNode.Examples.RuntimeMathNodes.UGUIDisplayValue runtimeDisplayValuePrefab; public XNode.Examples.RuntimeMathNodes.Connection runtimeConnectionPrefab; + [Header("References")] + public UGUIContextMenu contextMenu; + public UGUITooltip tooltip; public ScrollRect scrollRect { get; private set; } - private List nodes; + private List nodes; private void Awake() { + // Create a clone so we don't modify the original asset + graph = graph.Copy() as MathGraph; scrollRect = GetComponentInChildren(); + contextMenu.onClickSpawn -= SpawnNode; + contextMenu.onClickSpawn += SpawnNode; } private void Start() { SpawnGraph(); } + public void Refresh() { + Clear(); + SpawnGraph(); + } + + public void Clear() { + for (int i = nodes.Count - 1; i >= 0; i--) { + Destroy(nodes[i].gameObject); + } + nodes.Clear(); + } + public void SpawnGraph() { if (nodes != null) nodes.Clear(); - else nodes = new List(); + else nodes = new List(); for (int i = 0; i < graph.nodes.Count; i++) { Node node = graph.nodes[i]; - RuntimeMathNodes runtimeNode = null; + UGUIMathBaseNode runtimeNode = null; if (node is XNode.Examples.MathNodes.MathNode) { runtimeNode = Instantiate(runtimeMathNodePrefab); } else if (node is XNode.Examples.MathNodes.Vector) { @@ -48,14 +68,27 @@ namespace XNode.Examples.RuntimeMathNodes { } } - public RuntimeMathNodes GetRuntimeNode(Node node) { + public UGUIMathBaseNode GetRuntimeNode(Node node) { for (int i = 0; i < nodes.Count; i++) { if (nodes[i].node == node) { return nodes[i]; - } else { - } + } else { } } return null; } + + public void SpawnNode(Type type, Vector2 position) { + Node node = graph.AddNode(type); + node.name = type.Name; + node.position = position; + Refresh(); + } + + public void OnPointerClick(PointerEventData eventData) { + if (eventData.button != PointerEventData.InputButton.Right) + return; + + contextMenu.OpenAt(eventData.position); + } } } \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/DisplayValue.cs b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/DisplayValue.cs deleted file mode 100644 index bf6d820..0000000 --- a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/DisplayValue.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using XNode.Examples.MathNodes; - -namespace XNode.Examples.RuntimeMathNodes { - public class DisplayValue : RuntimeMathNodes { } -} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/MathNode.cs b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/MathNode.cs deleted file mode 100644 index b7a142f..0000000 --- a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/MathNode.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using XNode.Examples.MathNodes; - -namespace XNode.Examples.RuntimeMathNodes { - public class MathNode : RuntimeMathNodes { } -} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/RuntimeMathNodes.cs b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/RuntimeMathNodes.cs deleted file mode 100644 index 71f39f1..0000000 --- a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/RuntimeMathNodes.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.EventSystems; -using UnityEngine.UI; -using XNode.Examples.MathNodes; - -namespace XNode.Examples.RuntimeMathNodes { - public class RuntimeMathNodes : MonoBehaviour, IDragHandler { - [HideInInspector] public Node node; - [HideInInspector] public RuntimeMathGraph graph; - public Text header; - public List ports; - - private List connections = new List(); - - private void Start() { - header.text = node.name; - SetPosition(node.position); - foreach (NodePort port in node.Outputs) { - if (port.IsConnected) { - for (int i = 0; i < port.ConnectionCount; i++) { - Connection connection = Instantiate(graph.runtimeConnectionPrefab); - connection.transform.SetParent(graph.scrollRect.content); - connections.Add(connection); - } - } - } - } - - void LateUpdate() { - UpdateConnectionTransforms(); - } - - public void UpdateConnectionTransforms() { - int c = 0; - foreach (NodePort port in node.Outputs) { - Transform port1 = GetPort(port.fieldName); - if (!port1) Debug.LogWarning(port.fieldName + " not found", this); - for (int i = 0; i < port.ConnectionCount; i++) { - NodePort other = port.GetConnection(i); - Connection connection = connections[c++]; - RuntimeMathNodes otherNode = graph.GetRuntimeNode(other.node); - if (!otherNode) Debug.LogWarning(other.node.name + " node not found", this); - Transform port2 = otherNode.GetPort(other.fieldName); - if (!port2) Debug.LogWarning(other.fieldName + " not found", this); - connection.SetPosition(port1.position, port2.position); - } - } - } - - public Transform GetPort(string name) { - for (int i = 0; i < ports.Count; i++) { - if (ports[i].name == name) return ports[i]; - } - return null; - } - - public void SetPosition(Vector2 pos) { - pos.y = -pos.y; - transform.localPosition = pos; - } - - public void SetName(string name) { - header.text = name; - } - - public void OnDrag(PointerEventData eventData) { - - } - } -} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIDisplayValue.cs b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIDisplayValue.cs new file mode 100644 index 0000000..da5e4c2 --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIDisplayValue.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; +using XNode.Examples.MathNodes; + +namespace XNode.Examples.RuntimeMathNodes { + public class UGUIDisplayValue : UGUIMathBaseNode { + public Text label; + + void Update() { + DisplayValue displayValue = node as DisplayValue; + object obj = displayValue.GetInputValue("input"); + if (obj != null) label.text = obj.ToString(); + else label.text = "n/a"; + } + } +} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/DisplayValue.cs.meta b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIDisplayValue.cs.meta similarity index 100% rename from Examples/RuntimeMathGraph/Scripts/RuntimeNodes/DisplayValue.cs.meta rename to Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIDisplayValue.cs.meta diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathBaseNode.cs b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathBaseNode.cs new file mode 100644 index 0000000..8b9c649 --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathBaseNode.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; +using XNode.Examples.MathNodes; + +namespace XNode.Examples.RuntimeMathNodes { + public class UGUIMathBaseNode : MonoBehaviour, IDragHandler { + [HideInInspector] public Node node; + [HideInInspector] public RuntimeMathGraph graph; + public Text header; + + private UGUIPort[] ports; + + public virtual void Start() { + ports = GetComponentsInChildren(); + foreach (UGUIPort port in ports) port.node = node; + header.text = node.name; + SetPosition(node.position); + } + + public virtual void UpdateGUI() { } + + private void LateUpdate() { + foreach (UGUIPort port in ports) port.UpdateConnectionTransforms(); + } + + public UGUIPort GetPort(string name) { + for (int i = 0; i < ports.Length; i++) { + if (ports[i].name == name) return ports[i]; + } + return null; + } + + public void SetPosition(Vector2 pos) { + pos.y = -pos.y; + transform.localPosition = pos; + } + + public void SetName(string name) { + header.text = name; + } + + public void OnDrag(PointerEventData eventData) { + + } + } +} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/RuntimeMathNodes.cs.meta b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathBaseNode.cs.meta similarity index 100% rename from Examples/RuntimeMathGraph/Scripts/RuntimeNodes/RuntimeMathNodes.cs.meta rename to Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathBaseNode.cs.meta diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathNode.cs b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathNode.cs new file mode 100644 index 0000000..76c2663 --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathNode.cs @@ -0,0 +1,48 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; +using XNode.Examples.MathNodes; + +namespace XNode.Examples.RuntimeMathNodes { + public class UGUIMathNode : UGUIMathBaseNode { + public InputField valA; + public InputField valB; + public Dropdown dropDown; + + private MathNode mathNode; + + public override void Start() { + base.Start(); + mathNode = node as MathNode; + + valA.onValueChanged.AddListener(OnChangeValA); + valB.onValueChanged.AddListener(OnChangeValB); + dropDown.onValueChanged.AddListener(OnChangeDropdown); + UpdateGUI(); + } + + public override void UpdateGUI() { + NodePort portA = node.GetInputPort("a"); + NodePort portB = node.GetInputPort("b"); + valA.gameObject.SetActive(!portA.IsConnected); + valB.gameObject.SetActive(!portB.IsConnected); + + valA.text = mathNode.a.ToString(); + valB.text = mathNode.b.ToString(); + dropDown.value = (int) mathNode.mathType; + } + + private void OnChangeValA(string val) { + mathNode.a = float.Parse(valA.text); + } + + private void OnChangeValB(string val) { + mathNode.b = float.Parse(valB.text); + } + + private void OnChangeDropdown(int val) { + mathNode.mathType = (MathNode.MathType) val; + } + } +} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/MathNode.cs.meta b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathNode.cs.meta similarity index 100% rename from Examples/RuntimeMathGraph/Scripts/RuntimeNodes/MathNode.cs.meta rename to Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIMathNode.cs.meta diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIVector.cs b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIVector.cs new file mode 100644 index 0000000..ca517a3 --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIVector.cs @@ -0,0 +1,51 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; +using XNode.Examples.MathNodes; + +namespace XNode.Examples.RuntimeMathNodes { + public class UGUIVector : UGUIMathBaseNode { + public InputField valX; + public InputField valY; + public InputField valZ; + + private Vector vectorNode; + + public override void Start() { + base.Start(); + vectorNode = node as Vector; + + valX.onValueChanged.AddListener(OnChangeValX); + valY.onValueChanged.AddListener(OnChangeValY); + valZ.onValueChanged.AddListener(OnChangeValZ); + UpdateGUI(); + } + + public override void UpdateGUI() { + NodePort portX = node.GetInputPort("x"); + NodePort portY = node.GetInputPort("y"); + NodePort portZ = node.GetInputPort("z"); + valX.gameObject.SetActive(!portX.IsConnected); + valY.gameObject.SetActive(!portY.IsConnected); + valZ.gameObject.SetActive(!portZ.IsConnected); + + Vector vectorNode = node as Vector; + valX.text = vectorNode.x.ToString(); + valY.text = vectorNode.y.ToString(); + valZ.text = vectorNode.z.ToString(); + } + + private void OnChangeValX(string val) { + vectorNode.x = float.Parse(valX.text); + } + + private void OnChangeValY(string val) { + vectorNode.y = float.Parse(valY.text); + } + + private void OnChangeValZ(string val) { + vectorNode.z = float.Parse(valZ.text); + } + } +} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/Vector.cs.meta b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIVector.cs.meta similarity index 100% rename from Examples/RuntimeMathGraph/Scripts/RuntimeNodes/Vector.cs.meta rename to Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIVector.cs.meta diff --git a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/Vector.cs b/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/Vector.cs deleted file mode 100644 index 59c8668..0000000 --- a/Examples/RuntimeMathGraph/Scripts/RuntimeNodes/Vector.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using XNode.Examples.MathNodes; - -namespace XNode.Examples.RuntimeMathNodes { - public class Vector : RuntimeMathNodes { } -} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs b/Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs new file mode 100644 index 0000000..7d8dd84 --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.EventSystems; + +namespace XNode.Examples.RuntimeMathNodes { + public class UGUIContextMenu : MonoBehaviour, IPointerExitHandler { + + public Action onClickSpawn; + public CanvasGroup group; + + private Vector2 pos; + + private void Start() { + Close(); + } + + public void OpenAt(Vector2 pos) { + transform.position = pos; + group.alpha = 1; + group.interactable = true; + group.blocksRaycasts = true; + transform.SetAsLastSibling(); + } + + public void Close() { + group.alpha = 0; + group.interactable = false; + group.blocksRaycasts = false; + } + + public void SpawnMathNode() { + SpawnNode(typeof(XNode.Examples.MathNodes.MathNode)); + } + + public void SpawnDisplayNode() { + SpawnNode(typeof(XNode.Examples.MathNodes.DisplayValue)); + } + + public void SpawnVectorNode() { + SpawnNode(typeof(XNode.Examples.MathNodes.Vector)); + } + + private void SpawnNode(Type nodeType) { + Vector2 pos = new Vector2(transform.localPosition.x, -transform.localPosition.y); + onClickSpawn(nodeType, pos); + } + + public void OnPointerExit(PointerEventData eventData) { + Close(); + } + } +} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs.meta b/Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs.meta new file mode 100644 index 0000000..a68a31d --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 402b5de5d75c05445994c83bba07d273 +timeCreated: 1526035634 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs b/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs new file mode 100644 index 0000000..1ed7258 --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; +using XNode; + +namespace XNode.Examples.RuntimeMathNodes { + public class UGUIPort : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler { + + public string fieldName; + [HideInInspector] public XNode.Node node; + + private NodePort port; + private Connection tempConnection; + private NodePort startPort; + private UGUIPort tempHovered; + private RuntimeMathGraph graph; + private Vector2 startPos; + private List connections = new List(); + + void Start() { + port = node.GetPort(fieldName); + graph = GetComponentInParent(); + if (port.IsOutput && port.IsConnected) { + for (int i = 0; i < port.ConnectionCount; i++) { + AddConnection(); + } + } + } + + void Reset() { + fieldName = name; + } + + private void OnDestroy() { + // Also destroy connections + for (int i = connections.Count - 1; i >= 0; i--) { + Destroy(connections[i].gameObject); + } + connections.Clear(); + } + + public void UpdateConnectionTransforms() { + if (port.IsInput) return; + + while (connections.Count < port.ConnectionCount) AddConnection(); + while (connections.Count > port.ConnectionCount) { + Destroy(connections[0].gameObject); + connections.RemoveAt(0); + } + + // Loop through connections + for (int i = 0; i < port.ConnectionCount; i++) { + NodePort other = port.GetConnection(i); + UGUIMathBaseNode otherNode = graph.GetRuntimeNode(other.node); + if (!otherNode) Debug.LogWarning(other.node.name + " node not found", this); + Transform port2 = otherNode.GetPort(other.fieldName).transform; + if (!port2) Debug.LogWarning(other.fieldName + " not found", this); + connections[i].SetPosition(transform.position, port2.position); + } + } + + private void AddConnection() { + Connection connection = Instantiate(graph.runtimeConnectionPrefab); + connection.transform.SetParent(graph.scrollRect.content); + connections.Add(connection); + } + + public void OnBeginDrag(PointerEventData eventData) { + if (port.IsOutput) { + tempConnection = Instantiate(graph.runtimeConnectionPrefab); + tempConnection.transform.SetParent(graph.scrollRect.content); + tempConnection.SetPosition(transform.position, eventData.position); + startPos = transform.position; + startPort = port; + } else { + if (port.IsConnected) { + NodePort output = port.Connection; + Debug.Log("has " + port.ConnectionCount + " connections"); + Debug.Log(port.GetConnection(0)); + UGUIMathBaseNode otherNode = graph.GetRuntimeNode(output.node); + UGUIPort otherUGUIPort = otherNode.GetPort(output.fieldName); + Debug.Log("Disconnect"); + output.Disconnect(port); + tempConnection = Instantiate(graph.runtimeConnectionPrefab); + tempConnection.transform.SetParent(graph.scrollRect.content); + tempConnection.SetPosition(otherUGUIPort.transform.position, eventData.position); + startPos = otherUGUIPort.transform.position; + startPort = otherUGUIPort.port; + graph.GetRuntimeNode(node).UpdateGUI(); + } + } + } + + public void OnDrag(PointerEventData eventData) { + if (tempConnection == null) return; + UGUIPort otherPort = FindPortInStack(eventData.hovered); + tempHovered = otherPort; + tempConnection.SetPosition(startPos, eventData.position); + } + + public void OnEndDrag(PointerEventData eventData) { + if (tempConnection == null) return; + if (tempHovered) { + startPort.Connect(tempHovered.port); + graph.GetRuntimeNode(tempHovered.node).UpdateGUI(); + } + Destroy(tempConnection.gameObject); + } + + public UGUIPort FindPortInStack(List stack) { + for (int i = 0; i < stack.Count; i++) { + UGUIPort port = stack[i].GetComponent(); + if (port) return port; + } + return null; + } + + public void OnPointerEnter(PointerEventData eventData) { + graph.tooltip.Show(); + object obj = node.GetInputValue(port.fieldName, null); + if (obj != null) graph.tooltip.label.text = obj.ToString(); + else graph.tooltip.label.text = "n/a"; + } + + public void OnPointerExit(PointerEventData eventData) { + graph.tooltip.Hide(); + } + } +} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs.meta b/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs.meta new file mode 100644 index 0000000..15b8f2f --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/UGUIPort.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 76c005fc401e40f42b1e76d5ffc80292 +timeCreated: 1526084889 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs b/Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs new file mode 100644 index 0000000..fd61a32 --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs @@ -0,0 +1,45 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +namespace XNode.Examples.RuntimeMathNodes { + public class UGUITooltip : MonoBehaviour { + public CanvasGroup group; + public Text label; + private bool show; + private RuntimeMathGraph graph; + + private void Awake() { + graph = GetComponentInParent(); + } + + private void Start() { + Hide(); + } + + private void Update() { + if (show) UpdatePosition(); + } + + public void Show() { + show = true; + group.alpha = 1; + UpdatePosition(); + transform.SetAsLastSibling(); + } + + public void Hide() { + show = false; + group.alpha = 0; + } + + private void UpdatePosition() { + Vector2 pos; + RectTransform rect = graph.scrollRect.content.transform as RectTransform; + Camera cam = graph.gameObject.GetComponentInParent().worldCamera; + RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, Input.mousePosition, cam, out pos); + transform.localPosition = pos; + } + } +} \ No newline at end of file diff --git a/Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs.meta b/Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs.meta new file mode 100644 index 0000000..4490bf7 --- /dev/null +++ b/Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 6ea6060c58096cd4d8c959a427a9b059 +timeCreated: 1526123957 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: