Ejemplo n.º 1
0
        //public void CopyAll<T>(T source, T target)
        //{
        //	var type = typeof(T);
        //	foreach (var sourceProperty in type.GetProperties())
        //	{
        //		var targetProperty = type.GetProperty(sourceProperty.Name);
        //		targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null);
        //	}
        //	foreach (var sourceField in type.GetFields())
        //	{
        //		var targetField = type.GetField(sourceField.Name);
        //		targetField.SetValue(target, sourceField.GetValue(source));
        //	}
        //}


        // EDITOR Subgraph copy method
                #if UNITY_EDITOR
        public Graph CopyEditorSubGraph(Graph _rootGraph, Graph _parentGraph, FlowReactor.Editor.FREditorSettings settings)
        {
            Graph _subGraph = Graph.CreateSubGraph("SubGraph", _parentGraph, _rootGraph);

            _subGraph.isRoot   = false;
            _subGraph.isActive = false;

            _parentGraph.subGraphs.Add(_subGraph);


            var _copiedNodes       = new List <Node>();
            var _selectedNodesList = new List <Node>(nodes);

            rootGraph.selectedNodes = new Dictionary <int, Node>();

            for (int n = 0; n < _selectedNodesList.Count; n++)
            {
                SerializationUtility.SerializeValue(_selectedNodesList[n], DataFormat.Binary, out settings.objectReferences);
                var _original1 = settings.objectReferences[0] as Node;
                var _newCopy   = NodeCreator.CreateNodeFromCopy(_original1.nodeData, _original1, _rootGraph, _subGraph, _original1.nodeData.typeName, 0);


                _newCopy.outputNodes = new List <Node.NodeOutput>();
                _newCopy.inputNodes  = new List <Node.InputNode>();

                for (int o = 0; o < _original1.outputNodes.Count; o++)
                {
                    _newCopy.outputNodes.Add(new Node.NodeOutput(_original1.outputNodes[o].outputNode));
                    _newCopy.outputNodes[_newCopy.outputNodes.Count - 1].guid = _original1.outputNodes[o].guid;
                }


                for (int i = 0; i < _original1.inputNodes.Count; i++)
                {
                    _newCopy.inputNodes.Add(new Node.InputNode(_original1.inputNodes[i].inputNode));
                    _newCopy.inputNodes[_newCopy.inputNodes.Count - 1].guid = _original1.inputNodes[i].guid;
                }



                rootGraph.selectedNodes.Add(_newCopy.GetInstanceID(), _newCopy);


                _copiedNodes.Add(_newCopy);
            }

            // connect in and outputs
            for (int c = 0; c < _copiedNodes.Count; c++)
            {
                _copiedNodes[c].AssignNewOutAndInputsFromList(_copiedNodes);
            }


            // Assign new guids
            for (int n = 0; n < _copiedNodes.Count; n++)
            {
                _copiedNodes[n].guid = Guid.NewGuid().ToString();

                for (int o = 0; o < _copiedNodes[n].outputNodes.Count; o++)
                {
                    if (_copiedNodes[n].outputNodes[o].outputNode != null)
                    {
                        for (int i = 0; i < _copiedNodes[n].outputNodes[o].outputNode.inputNodes.Count; i++)
                        {
                            if (_copiedNodes[n].outputNodes[o].outputNode.inputNodes[i].inputNode == _copiedNodes[n])
                            {
                                _copiedNodes[n].outputNodes[o].outputNode.inputNodes[i].guid = _copiedNodes[n].guid;
                            }
                        }
                    }
                }

                for (int o = 0; o < _copiedNodes[n].inputNodes.Count; o++)
                {
                    for (int i = 0; i < _copiedNodes[n].inputNodes[o].inputNode.outputNodes.Count; i++)
                    {
                        if (_copiedNodes[n].inputNodes[o].inputNode.outputNodes[i].outputNode == _copiedNodes[n])
                        {
                            _copiedNodes[n].inputNodes[o].inputNode.outputNodes[i].guid = _copiedNodes[n].guid;
                        }
                    }
                }
            }


            for (int h = 0; h < _copiedNodes.Count; h++)
            {
                if (_copiedNodes[h].nodeData.nodeType == NodeAttributes.NodeType.SubGraph)
                {
                    var _subGraphNode = _copiedNodes[h] as SubGraph;
                    var _cs           = _subGraphNode.subGraph.CopyEditorSubGraph(_rootGraph, _subGraph, settings);

                    _subGraphNode.subGraph = _cs;

                    _cs.subGraphNode = _subGraphNode;
                }
            }

            return(_subGraph);
        }