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); }
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); }