diff --git a/UNEB_Project_Root/Assets/Examples/LibNoiseEditor/Nodes/OutputTexture2D.cs b/UNEB_Project_Root/Assets/Examples/LibNoiseEditor/Nodes/OutputTexture2D.cs index 27eafe8..8cf5809 100644 --- a/UNEB_Project_Root/Assets/Examples/LibNoiseEditor/Nodes/OutputTexture2D.cs +++ b/UNEB_Project_Root/Assets/Examples/LibNoiseEditor/Nodes/OutputTexture2D.cs @@ -50,7 +50,7 @@ public void UpdateTexture() return; } - var noise = inputNoise.OutputConnection.GetValue(); + var noise = inputNoise.Outputs[0].GetValue(); for (int x = 0; x < texPreview.width; ++x) { for (int y = 0; y < texPreview.height; ++y) { diff --git a/UNEB_Project_Root/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs b/UNEB_Project_Root/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs index c169a2b..06ef66d 100644 --- a/UNEB_Project_Root/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs +++ b/UNEB_Project_Root/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs @@ -249,7 +249,7 @@ private bool isMouseOverInputStartConn() { Action startConnFromInput = (NodeInput input) => { - window.state.selectedOutput = input.OutputConnection; + window.state.selectedOutput = input.Outputs[0]; // Detach this input if we are starting a connection action from the input. if (window.state.selectedOutput != null) { diff --git a/UNEB_Project_Root/Assets/UNEB/Editor/Actions/CreateConnection.cs b/UNEB_Project_Root/Assets/UNEB/Editor/Actions/CreateConnection.cs index 728bfaf..09d3e52 100644 --- a/UNEB_Project_Root/Assets/UNEB/Editor/Actions/CreateConnection.cs +++ b/UNEB_Project_Root/Assets/UNEB/Editor/Actions/CreateConnection.cs @@ -74,8 +74,16 @@ public override bool OnActionEnd() // Make the connection. if (_input != null && _output.CanConnectInput(_input)) { - cacheOldConnections(); - disconnectOldConnections(); + if (!_output.bCanHaveMultipleConnections) + { + _output.RemoveAll(); + } + + if (!_input.bCanHaveMultipleConnections) { + cacheOldConnections(); + disconnectOldConnections(); + } + return _output.Add(_input); } @@ -86,7 +94,7 @@ private void cacheOldConnections() { // Check if the receiving node was already connected. if (_input != null && _input.HasOutputConnected()) { - _oldConnectedOutput = _input.OutputConnection; + _oldConnectedOutput = _input.Outputs[0]; } // Check if the origin node already had inputs diff --git a/UNEB_Project_Root/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs b/UNEB_Project_Root/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs index 6071e51..b8b6f11 100644 --- a/UNEB_Project_Root/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs +++ b/UNEB_Project_Root/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs @@ -46,7 +46,7 @@ public override void Do() foreach (var input in _nodeRemoved.Inputs) { if (input.HasOutputConnected()) { - _oldConnectedOutputs.Add(new InputToOutputPair(input, input.OutputConnection)); + _oldConnectedOutputs.Add(new InputToOutputPair(input, input.Outputs[0])); } } @@ -90,7 +90,8 @@ private void disconnectOldConnections() foreach (var input in _nodeRemoved.Inputs) { if (input.HasOutputConnected()) { - input.OutputConnection.Remove(input); + //input.Outputs.Remove(input); + input.Outputs.Clear(); } } } diff --git a/UNEB_Project_Root/Assets/UNEB/Editor/Actions/RemoveConnection.cs b/UNEB_Project_Root/Assets/UNEB/Editor/Actions/RemoveConnection.cs index 6741aad..341e9f6 100644 --- a/UNEB_Project_Root/Assets/UNEB/Editor/Actions/RemoveConnection.cs +++ b/UNEB_Project_Root/Assets/UNEB/Editor/Actions/RemoveConnection.cs @@ -12,7 +12,7 @@ public class RemoveConnection : UndoableAction public override void Do() { _input = manager.window.state.selectedInput; - _output = _input.OutputConnection; + _output = _input.Outputs[0]; _output.Remove(_input); diff --git a/UNEB_Project_Root/Assets/UNEB/Node.cs b/UNEB_Project_Root/Assets/UNEB/Node.cs index 526a001..13d2d74 100644 --- a/UNEB_Project_Root/Assets/UNEB/Node.cs +++ b/UNEB_Project_Root/Assets/UNEB/Node.cs @@ -160,18 +160,18 @@ protected virtual void onBodyGuiInternal() EditorGUILayout.EndVertical(); } - public NodeInput AddInput(string name = "input") + public NodeInput AddInput(string name = "input", bool multipleConnections = false) { - var input = NodeInput.Create(this); + var input = NodeInput.Create(this, multipleConnections); input.name = name; _inputs.Add(input); return input; } - public NodeOutput AddOutput(string name = "output") + public NodeOutput AddOutput(string name = "output", bool multipleConnections = false) { - var output = NodeOutput.Create(this); + var output = NodeOutput.Create(this, multipleConnections); output.name = name; _outputs.Add(output); diff --git a/UNEB_Project_Root/Assets/UNEB/NodeInput.cs b/UNEB_Project_Root/Assets/UNEB/NodeInput.cs index 5210cb4..bdf0e71 100644 --- a/UNEB_Project_Root/Assets/UNEB/NodeInput.cs +++ b/UNEB_Project_Root/Assets/UNEB/NodeInput.cs @@ -1,4 +1,5 @@  +using System.Collections.Generic; using System.Linq; using UnityEngine; @@ -7,14 +8,18 @@ namespace UNEB public class NodeInput : NodeConnection { [SerializeField] - private NodeOutput _connectedOutput; + private bool _bCanHaveMultipleConnections; + + [SerializeField] + private List _outputs = new List(); private GUIStyle _style; - public override void Init(Node parent) + public virtual void Init(Node parent, bool multipleConnections = true) { base.Init(parent); name = "input"; + _bCanHaveMultipleConnections = multipleConnections; } /// @@ -23,49 +28,37 @@ public override void Init(Node parent) /// internal void Connect(NodeOutput output) { - if (!HasOutputConnected()) { - _connectedOutput = output; - } - - else { - - const string msg = - "Connot Connect." + - "The Input has an output connected and should be disconnected first, " + - "before trying to connect to some output."; - - Debug.LogWarning(msg); - } + if (!_outputs.Contains(output)) + _outputs.Add(output); } /// /// Should only be called by NodeOutput. /// - internal void Disconnect() + internal void Disconnect(NodeOutput output) { - if (_connectedOutput.Inputs.Contains(this)) { - - const string msg = - "Cannot disconnect. " + - "The Output should remove this Input from its input list first, " + - "before calling Disconnect()."; - - Debug.LogWarning(msg); - } - - else { - _connectedOutput = null; - } + if (_outputs.Contains(output)) + _outputs.Remove(output); } public bool HasOutputConnected() { - return _connectedOutput != null; + return _outputs.Count > 0; } - public NodeOutput OutputConnection + public List Outputs { - get { return _connectedOutput; } + get { return _outputs; } + } + + public int OutputCount + { + get { return _outputs.Count; } + } + + public NodeOutput GetOutput(int index) + { + return _outputs[index]; } public override GUIStyle GetStyle() @@ -92,10 +85,15 @@ public override float GetNodeAnchor() return parentNode.bodyRect.xMin; } - public static NodeInput Create(Node parent) + public bool bCanHaveMultipleConnections + { + get { return _bCanHaveMultipleConnections; } + } + + public static NodeInput Create(Node parent, bool multipleConnections = false) { var input = ScriptableObject.CreateInstance(); - input.Init(parent); + input.Init(parent, multipleConnections); NodeConnection.OnConnectionCreated(input); return input; diff --git a/UNEB_Project_Root/Assets/UNEB/NodeOutput.cs b/UNEB_Project_Root/Assets/UNEB/NodeOutput.cs index 7ccdc80..4a64ec7 100644 --- a/UNEB_Project_Root/Assets/UNEB/NodeOutput.cs +++ b/UNEB_Project_Root/Assets/UNEB/NodeOutput.cs @@ -21,7 +21,7 @@ public virtual void Init(Node parent, bool multipleConnections = true) _bCanHaveMultipleConnections = multipleConnections; } - public IEnumerable Inputs + public List Inputs { get { return _inputs; } } @@ -51,7 +51,7 @@ public bool Add(NodeInput input) // This test is not inside the CanConnectInput() because // an action can remove the old connections automatically to make it // easier for the user to change connections between nodes. - if (input.HasOutputConnected()) { + if (input.HasOutputConnected() && !input.bCanHaveMultipleConnections) { // Changes to the inputs need to be properly handled by the Action system, // so it works with undo. @@ -86,7 +86,7 @@ public bool CanConnectInput(NodeInput input) } // Avoid connecting when it is already connected. - if (input.OutputConnection == this) { + if (input.Outputs.Contains(this)) { Debug.LogWarning("Already Connected"); return false; } @@ -98,7 +98,7 @@ public void Remove(NodeInput input) { if (_inputs.Remove(input)) { parentNode.OnInputConnectionRemoved(input); - input.Disconnect(); + input.Disconnect(this); } } @@ -112,7 +112,7 @@ public void RemoveAll() foreach (NodeInput input in inputs) { parentNode.OnInputConnectionRemoved(input); - input.Disconnect(); + input.Disconnect(this); } }