Ejemplo n.º 1
0
        public GraphElementSearcherDatabase AddNodesWithSearcherItemAttribute()
        {
            var types = TypeCache.GetTypesWithAttribute <SearcherItemAttribute>();

            foreach (var type in types)
            {
                var attributes = type.GetCustomAttributes <SearcherItemAttribute>().ToList();
                if (!attributes.Any())
                {
                    continue;
                }

                foreach (var attribute in attributes)
                {
                    if (!attribute.StencilType.IsInstanceOfType(Stencil))
                    {
                        continue;
                    }

                    var name = attribute.Path.Split('/').Last();
                    var path = attribute.Path.Remove(attribute.Path.LastIndexOf('/') + 1);

                    switch (attribute.Context)
                    {
                    case SearcherContext.Graph:
                    {
                        var node = new GraphNodeModelSearcherItem(
                            new NodeSearcherItemData(type),
                            data => data.CreateNode(type, name),
                            name
                            );
                        Items.AddAtPath(node, path);
                        break;
                    }

                    case SearcherContext.Stack:
                    {
                        var node = new StackNodeModelSearcherItem(
                            new NodeSearcherItemData(type),
                            data => data.CreateNode(type, name),
                            name
                            );
                        Items.AddAtPath(node, path);
                        break;
                    }

                    default:
                        Debug.LogWarning($"The node {type} is not a {SearcherContext.Stack} or " +
                                         $"{SearcherContext.Graph} node, so it cannot be add in the Searcher");
                        break;
                    }

                    break;
                }
            }

            return(this);
        }
Ejemplo n.º 2
0
        public GraphElementSearcherDatabase AddIfCondition(IfConditionMode mode)
        {
            var nodeName = $"{k_IfCondition} {mode}";
            var node     = new StackNodeModelSearcherItem(
                new ControlFlowSearcherItemData(typeof(IfConditionNodeModel)),
                data =>
            {
                var elements   = new List <IGraphElementModel>();
                var stackModel = (StackBaseModel)data.StackModel;
                int guidIndex  = 0;

                // Create If node
                var ifConditionNode = stackModel.CreateStackedNode <IfConditionNodeModel>(nodeName, spawnFlags: data.SpawnFlags, guid: data.GuidAt(guidIndex++));
                elements.Add(ifConditionNode);

                if (mode <= IfConditionMode.Basic)
                {
                    return(elements.ToArray());
                }

                // Create Then and Else stacks
                var graphModel = (VSGraphModel)stackModel.GraphModel;

                var thenPosition = new Vector2(stackModel.Position.x + k_ThenStackOffset.x,
                                               stackModel.Position.y + k_ThenStackOffset.y);
                var thenStack = graphModel.CreateStack(k_Then, thenPosition, data.SpawnFlags, data.GuidAt(guidIndex++));
                elements.Add(thenStack);

                var elsePosition = new Vector2(stackModel.Position.x + k_ElseStackOffset.x,
                                               stackModel.Position.y + k_ElseStackOffset.y);
                var elseStack = graphModel.CreateStack(k_Else, elsePosition, data.SpawnFlags, data.GuidAt(guidIndex++));
                elements.Add(elseStack);

                // Connect Then and Else stacks to If node
                var thenInput = thenStack.InputPorts.First();
                elements.Add(data.SpawnFlags.IsOrphan()
                        ? graphModel.CreateOrphanEdge(thenInput, ifConditionNode.ThenPort)
                        : graphModel.CreateEdge(thenInput, ifConditionNode.ThenPort)
                             );

                var elseInput = elseStack.InputPorts.First();
                elements.Add(data.SpawnFlags.IsOrphan()
                        ? graphModel.CreateOrphanEdge(elseInput, ifConditionNode.ElsePort)
                        : graphModel.CreateEdge(elseInput, ifConditionNode.ElsePort)
                             );

                if (mode != IfConditionMode.Complete)
                {
                    return(elements.ToArray());
                }

                // Create End of Condition stack
                var completeStackPosition = new Vector2(stackModel.Position.x + k_ClosedFlowStackOffset.x,
                                                        stackModel.Position.y + k_ClosedFlowStackOffset.y);

                var completeFlowStack = graphModel.CreateStack("", completeStackPosition, data.SpawnFlags, data.GuidAt(guidIndex));
                elements.Add(completeFlowStack);

                // Connect to Then and Else stacks
                var thenOutput      = thenStack.OutputPorts.First();
                var floatStackInput = completeFlowStack.InputPorts.First();
                elements.Add(data.SpawnFlags.IsOrphan()
                        ? graphModel.CreateOrphanEdge(floatStackInput, thenOutput)
                        : graphModel.CreateEdge(floatStackInput, thenOutput)
                             );

                var elseOutput = elseStack.OutputPorts.First();
                elements.Add(data.SpawnFlags.IsOrphan()
                        ? graphModel.CreateOrphanEdge(floatStackInput, elseOutput)
                        : graphModel.CreateEdge(floatStackInput, elseOutput)
                             );

                return(elements.ToArray());
            },
                nodeName);

            Items.AddAtPath(node, k_ControlFlow);

            return(this);
        }