public static Dictionary <Guid, NodeData> Create(FrpGraphContainer frpGraphContainer)
        {
            var nodeDict = new Dictionary <Guid, NodeData>();

            foreach (var nodeData in frpGraphContainer.FrpNodeData)
            {
                nodeDict[new Guid(nodeData.Guid)] = new NodeData
                {
                    OperatorType = nodeData.OperatorInfo.OperatorName,
                    CodeText     = nodeData.CodeText,
                    Return       = null,
                    ReturnType   = nodeData.OperatorInfo.OperatorReturnType,
                    Arguments    = new List <string>()
                };
            }
            foreach (var nodeLink in frpGraphContainer.NodeLinks)
            {
                nodeDict[new Guid(nodeLink.BaseNodeGuid)].Return = nodeLink.ConnectionName;
                var targetNodeArguments = nodeDict[new Guid(nodeLink.TargetNodeGuid)].Arguments;
                while (targetNodeArguments.Count < nodeLink.TargetPortNum + 1)
                {
                    targetNodeArguments.Add(null);
                }
                targetNodeArguments[nodeLink.TargetPortNum] = nodeLink.ConnectionName;
            }
            return(nodeDict);
        }
    private bool SaveNodes(FrpGraphContainer frpGraphContainer)
    {
        if (!Edges.Any())
        {
            return(false);
        }

        var edges = Edges.ToArray();

        for (var i = 0; i < edges.Length; ++i)
        {
            var outputNode = edges[i].output.node as FrpNode;
            var inputNode  = edges[i].input.node as FrpNode;

            var basePortName = edges[i].output.portName;

            var basePortNames = new List <string>();
            for (int j = 0; j < outputNode.outputContainer.childCount; ++j)
            {
                basePortNames.Add(outputNode.outputContainer[j].Q <Port>().portName);
            }

            var basePortIndex = basePortNames.FindIndex(x => x == basePortName);

            var targetPortName = edges[i].input.portName;

            var targetPortNames = new List <string>();
            for (int j = 0; j < inputNode.inputContainer.childCount; ++j)
            {
                targetPortNames.Add(inputNode.inputContainer[j].Q <Port>().portName);
            }

            var targetPortIndex = targetPortNames.FindIndex(x => x == targetPortName);

            var connectionName = edges[i].Q <TextField>().value;

            frpGraphContainer.NodeLinks.Add(new NodeLinkData
            {
                ConnectionName = connectionName,
                BaseNodeGuid   = outputNode.frpNodeData.Guid,
                BasePortName   = basePortName,
                BasePortNum    = basePortIndex,
                TargetNodeGuid = inputNode.frpNodeData.Guid,
                TargetPortName = targetPortName,
                TargetPortNum  = targetPortIndex
            });
        }

        foreach (var node in Nodes)
        {
            node.frpNodeData.Position = node.GetPosition().position;
            frpGraphContainer.FrpNodeData.Add(node.frpNodeData.Clone());
        }

        return(true);
    }
    public void LoadGraph(string fileName)
    {
        _containerCache = Resources.Load <FrpGraphContainer>(fileName);
        if (_containerCache == null)
        {
            EditorUtility.DisplayDialog("File Not Found", "Target dialogue graph file does not exists!", "OK");
            return;
        }

        ClearGraph();
        CreateNodes();
        ConnectNodes();
        //CreateExposedProperties();
        //GenerateCommentBlocks();
    }
    private void SaveCommentBlocks(FrpGraphContainer dialogueContainer)
    {
        foreach (var block in CommentBlocks)
        {
            var nodes = block.containedElements.Where(x => x is FrpNode).Cast <FrpNode>().Select(x => x.frpNodeData.Guid)
                        .ToList();

            dialogueContainer.CommentBlockData.Add(new CommentBlockData
            {
                ChildNodes = nodes,
                Title      = block.title,
                Position   = block.GetPosition().position
            });
        }
    }
Exemple #5
0
        public static DependencyGraph Create(FrpGraphContainer frpGraphContainer)
        {
            var dictionary = new Dictionary <Guid, Node <Guid> >();
            var edgeToPort = new Dictionary <Edge, int>();

            foreach (var nodeLinkData in frpGraphContainer.NodeLinks)
            {
                Guid baseGuid, targetGuid;
                try
                {
                    baseGuid   = new Guid(nodeLinkData.BaseNodeGuid);
                    targetGuid = new Guid(nodeLinkData.TargetNodeGuid);
                }
                catch (Exception e) when(
                    e is ArgumentNullException ||
                    e is FormatException ||
                    e is OverflowException)
                {
                    Debug.Log($"Invalid Id string format.\n{e}");
                    return(null);
                }

                var baseNode = dictionary.ContainsKey(baseGuid)
                    ? dictionary[baseGuid]
                    : dictionary[baseGuid] = new Node <Guid>(baseGuid);
                var targetNode = dictionary.ContainsKey(targetGuid)
                    ? dictionary[targetGuid]
                    : dictionary[targetGuid] = new Node <Guid>(targetGuid);
                baseNode.OutputLinks.Add(targetNode);
                targetNode.InputLinks.Add(baseNode);
                edgeToPort.Add(new Edge(baseGuid, targetGuid), nodeLinkData.BasePortNum);
            }

            return(new DependencyGraph
            {
                _adjacencyList = dictionary.Values.ToList(),
                _edgeToPort = edgeToPort
            });
        }
        public static IntermediateRepresentation Create(FrpGraphContainer graphContainer)
        {
            var depGraph      = DependencyGraph.Create(graphContainer);
            var edgePortPairs = depGraph.CutToAcyclicGraph();
            var refEvents     = new Dictionary <string, Tuple <string, EventType> >();

            var table = NodeDataTable.Create(graphContainer);

            foreach (var edgePortPair in edgePortPairs)
            {
                var name    = table[edgePortPair.Edge.Vertex2].Arguments[edgePortPair.Port];
                var type    = table[edgePortPair.Edge.Vertex1].ReturnType;
                var refName = ToRefName(name);
                refEvents[name] = new Tuple <string, EventType>(name, type);
                table[edgePortPair.Edge.Vertex2].Arguments[edgePortPair.Port] = refName;
            }

            var order = depGraph.TopologicalSort();

            return(new IntermediateRepresentation {
                order = order, table = table, refEvents = refEvents.Values.ToList()
            });
        }
 private void SaveExposedProperties(FrpGraphContainer dialogueContainer)
 {
     dialogueContainer.ExposedProperties.AddRange(_targetGraphView.ExposedProperties);
 }