Beispiel #1
0
        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);
                    }
                }
            }
        }