private void ResolveScriptNodeConnections(IEnumerable <CNode> nodes, Dictionary <CNode, CScriptNodeViewmodel> nodeToViewModel) { foreach (CNode graphNode in nodes) { CScriptNodeViewmodel sourceViewModel = nodeToViewModel[graphNode]; for (int i = 0; i < graphNode.OutExecutionPins.Count; i++) { CExecutionPin inExecutionPin = graphNode.OutExecutionPins[i]; if (inExecutionPin.TargetNode == null) { continue; } CScriptNodeViewmodel targetViewModel = nodeToViewModel[inExecutionPin.TargetNode]; if (targetViewModel.InExecutionPins.Count > 0) { CNodeConnectionViewModel newConnection = new CNodeConnectionViewModel(sourceViewModel.OutExecutionPins[i], targetViewModel.InExecutionPins[inExecutionPin.TargetPinIndex], this); newConnection.Connect(); } else { inExecutionPin.TargetNode = null; LogUtility.Log("[ScriptLoadError] node {0} tried to connect to {1} but the target does not have an in execution pin", sourceViewModel.Name, targetViewModel.Name); } } for (int i = 0; i < graphNode.InputPins.Count; i++) { CInputPin inputPin = graphNode.InputPins[i]; if (inputPin.SourceNode == null) { continue; } CScriptNodeViewmodel inputSourceVm = nodeToViewModel[inputPin.SourceNode]; if (inputSourceVm.OutputPins.Count > inputPin.SourceParameterIndex) { COutputPinViewModel sourcePinVM = inputSourceVm.OutputPins[inputPin.SourceParameterIndex]; if (inputPin.Type.IsAssignableFrom(sourcePinVM.ValueType)) { CNodeConnectionViewModel newConnection = new CNodeConnectionViewModel(sourcePinVM, sourceViewModel.InputPins[i], this); newConnection.Connect(); } else { inputPin.SourceNode = null; inputPin.SourceParameterIndex = -1; LogUtility.Log("[ScriptLoadWarning] Node {0} tried to connect to {1} at output pin index {2} but the pin types are not compatible, connection removed", sourceViewModel.Name, inputSourceVm.Name, inputPin.SourceParameterIndex); } } else { inputPin.SourceNode = null; inputPin.SourceParameterIndex = -1; LogUtility.Log("[ScriptLoadError] node {0} tried to connect to {1} at output pin index {2} but there are not enough pins", sourceViewModel.Name, inputSourceVm.Name, inputPin.SourceParameterIndex); } } } }
public void OnNodeRebuilt() { if (m_inputPins.Count <= ScriptNode.InputPins.Count) { for (int i = 0; i < ScriptNode.InputPins.Count; i++) { CInputPin scriptInput = ScriptNode.InputPins[i]; if (m_inputPins.Count > i) { CInputPinViewModel inputViewModel = m_inputPins[i]; inputViewModel.Name = scriptInput.Name; if (inputViewModel.ValueType != scriptInput.Type) { inputViewModel.ValueType = scriptInput.Type; inputViewModel.Literal = scriptInput.Type.IsValueType ? Activator.CreateInstance(scriptInput.Type) : null; } } else { m_inputPins.Add(new CInputPinViewModel(scriptInput, this, i)); } } } else { for (int i = m_inputPins.Count - 1; i >= 0; i--) { if (ScriptNode.InputPins.Count > i) { CInputPin scriptInput = ScriptNode.InputPins[i]; CInputPinViewModel inputViewModel = m_inputPins[i]; inputViewModel.Name = scriptInput.Name; if (inputViewModel.ValueType != scriptInput.Type) { inputViewModel.ValueType = scriptInput.Type; inputViewModel.Literal = scriptInput.Type.IsValueType ? Activator.CreateInstance(scriptInput.Type) : null; } } else { m_inputPins[i].DisconnectAll(); m_inputPins.RemoveAt(i); } } } if (m_outputPins.Count <= ScriptNode.OutputPins.Count) { for (int i = 0; i < ScriptNode.OutputPins.Count; i++) { COutputPin scriptOutput = ScriptNode.OutputPins[i]; if (m_outputPins.Count > i) { COutputPinViewModel outputViewModel = m_outputPins[i]; outputViewModel.Name = scriptOutput.Name; outputViewModel.ValueType = scriptOutput.Type; } else { m_outputPins.Add(new COutputPinViewModel(scriptOutput, this, i)); } } } else { for (int i = m_outputPins.Count - 1; i >= 0; i--) { if (ScriptNode.OutputPins.Count > i) { COutputPin scriptOutput = ScriptNode.OutputPins[i]; COutputPinViewModel outputViewModel = m_outputPins[i]; outputViewModel.Name = scriptOutput.Name; outputViewModel.ValueType = scriptOutput.Type; } else { m_outputPins[i].DisconnectAll(); m_outputPins.RemoveAt(i); } } } }