mirror of
https://github.com/Siccity/xNode.git
synced 2025-12-20 09:16:01 +08:00
RuntimeMathGraph functional
This commit is contained in:
parent
e1109e4a0a
commit
42bb9a927a
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -4,12 +4,12 @@ using UnityEngine;
|
|||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
|
|
||||||
namespace XNode.Examples.RuntimeMathNodes {
|
namespace XNode.Examples.RuntimeMathNodes {
|
||||||
public class NodeDrag : MonoBehaviour, IPointerDownHandler, IDragHandler {
|
public class NodeDrag : MonoBehaviour, IPointerDownHandler, IDragHandler, IEndDragHandler {
|
||||||
private Vector3 offset;
|
private Vector3 offset;
|
||||||
private RuntimeMathNodes node;
|
private UGUIMathBaseNode node;
|
||||||
|
|
||||||
private void Awake() {
|
private void Awake() {
|
||||||
node = GetComponentInParent<RuntimeMathNodes>();
|
node = GetComponentInParent<UGUIMathBaseNode>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnDrag(PointerEventData eventData) {
|
public void OnDrag(PointerEventData eventData) {
|
||||||
@ -21,5 +21,12 @@ namespace XNode.Examples.RuntimeMathNodes {
|
|||||||
Vector2 pos = node.transform.localPosition;
|
Vector2 pos = node.transform.localPosition;
|
||||||
offset = pointer - pos;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2,38 +2,58 @@
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using UnityEngine.EventSystems;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using XNode.Examples.MathNodes;
|
using XNode.Examples.MathNodes;
|
||||||
|
|
||||||
namespace XNode.Examples.RuntimeMathNodes {
|
namespace XNode.Examples.RuntimeMathNodes {
|
||||||
public class RuntimeMathGraph : MonoBehaviour {
|
public class RuntimeMathGraph : MonoBehaviour, IPointerClickHandler {
|
||||||
[Header("Graph")]
|
[Header("Graph")]
|
||||||
public MathGraph graph;
|
public MathGraph graph;
|
||||||
[Header("Prefabs")]
|
[Header("Prefabs")]
|
||||||
public XNode.Examples.RuntimeMathNodes.MathNode runtimeMathNodePrefab;
|
public XNode.Examples.RuntimeMathNodes.UGUIMathNode runtimeMathNodePrefab;
|
||||||
public XNode.Examples.RuntimeMathNodes.Vector runtimeVectorPrefab;
|
public XNode.Examples.RuntimeMathNodes.UGUIVector runtimeVectorPrefab;
|
||||||
public XNode.Examples.RuntimeMathNodes.DisplayValue runtimeDisplayValuePrefab;
|
public XNode.Examples.RuntimeMathNodes.UGUIDisplayValue runtimeDisplayValuePrefab;
|
||||||
public XNode.Examples.RuntimeMathNodes.Connection runtimeConnectionPrefab;
|
public XNode.Examples.RuntimeMathNodes.Connection runtimeConnectionPrefab;
|
||||||
|
[Header("References")]
|
||||||
|
public UGUIContextMenu contextMenu;
|
||||||
|
public UGUITooltip tooltip;
|
||||||
|
|
||||||
public ScrollRect scrollRect { get; private set; }
|
public ScrollRect scrollRect { get; private set; }
|
||||||
private List<RuntimeMathNodes> nodes;
|
private List<UGUIMathBaseNode> nodes;
|
||||||
|
|
||||||
private void Awake() {
|
private void Awake() {
|
||||||
|
// Create a clone so we don't modify the original asset
|
||||||
|
graph = graph.Copy() as MathGraph;
|
||||||
scrollRect = GetComponentInChildren<ScrollRect>();
|
scrollRect = GetComponentInChildren<ScrollRect>();
|
||||||
|
contextMenu.onClickSpawn -= SpawnNode;
|
||||||
|
contextMenu.onClickSpawn += SpawnNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Start() {
|
private void Start() {
|
||||||
SpawnGraph();
|
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() {
|
public void SpawnGraph() {
|
||||||
if (nodes != null) nodes.Clear();
|
if (nodes != null) nodes.Clear();
|
||||||
else nodes = new List<RuntimeMathNodes>();
|
else nodes = new List<UGUIMathBaseNode>();
|
||||||
|
|
||||||
for (int i = 0; i < graph.nodes.Count; i++) {
|
for (int i = 0; i < graph.nodes.Count; i++) {
|
||||||
Node node = graph.nodes[i];
|
Node node = graph.nodes[i];
|
||||||
|
|
||||||
RuntimeMathNodes runtimeNode = null;
|
UGUIMathBaseNode runtimeNode = null;
|
||||||
if (node is XNode.Examples.MathNodes.MathNode) {
|
if (node is XNode.Examples.MathNodes.MathNode) {
|
||||||
runtimeNode = Instantiate(runtimeMathNodePrefab);
|
runtimeNode = Instantiate(runtimeMathNodePrefab);
|
||||||
} else if (node is XNode.Examples.MathNodes.Vector) {
|
} 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++) {
|
for (int i = 0; i < nodes.Count; i++) {
|
||||||
if (nodes[i].node == node) {
|
if (nodes[i].node == node) {
|
||||||
return nodes[i];
|
return nodes[i];
|
||||||
} else {
|
} else { }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return null;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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 { }
|
|
||||||
}
|
|
||||||
@ -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 { }
|
|
||||||
}
|
|
||||||
@ -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<Transform> ports;
|
|
||||||
|
|
||||||
private List<Connection> connections = new List<Connection>();
|
|
||||||
|
|
||||||
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) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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<object>("input");
|
||||||
|
if (obj != null) label.text = obj.ToString();
|
||||||
|
else label.text = "n/a";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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<UGUIPort>();
|
||||||
|
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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
51
Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIVector.cs
Normal file
51
Examples/RuntimeMathGraph/Scripts/RuntimeNodes/UGUIVector.cs
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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 { }
|
|
||||||
}
|
|
||||||
54
Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs
Normal file
54
Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs
Normal file
@ -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<Type, Vector2> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs.meta
Normal file
13
Examples/RuntimeMathGraph/Scripts/UGUIContextMenu.cs.meta
Normal file
@ -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:
|
||||||
132
Examples/RuntimeMathGraph/Scripts/UGUIPort.cs
Normal file
132
Examples/RuntimeMathGraph/Scripts/UGUIPort.cs
Normal file
@ -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<Connection> connections = new List<Connection>();
|
||||||
|
|
||||||
|
void Start() {
|
||||||
|
port = node.GetPort(fieldName);
|
||||||
|
graph = GetComponentInParent<RuntimeMathGraph>();
|
||||||
|
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<GameObject> stack) {
|
||||||
|
for (int i = 0; i < stack.Count; i++) {
|
||||||
|
UGUIPort port = stack[i].GetComponent<UGUIPort>();
|
||||||
|
if (port) return port;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPointerEnter(PointerEventData eventData) {
|
||||||
|
graph.tooltip.Show();
|
||||||
|
object obj = node.GetInputValue<object>(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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
Examples/RuntimeMathGraph/Scripts/UGUIPort.cs.meta
Normal file
13
Examples/RuntimeMathGraph/Scripts/UGUIPort.cs.meta
Normal file
@ -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:
|
||||||
45
Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs
Normal file
45
Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs
Normal file
@ -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<RuntimeMathGraph>();
|
||||||
|
}
|
||||||
|
|
||||||
|
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<Canvas>().worldCamera;
|
||||||
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, Input.mousePosition, cam, out pos);
|
||||||
|
transform.localPosition = pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs.meta
Normal file
13
Examples/RuntimeMathGraph/Scripts/UGUITooltip.cs.meta
Normal file
@ -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:
|
||||||
Loading…
x
Reference in New Issue
Block a user