void FBehaviorTreeDebugger::CollectBreakpointsFromAsset(class UBehaviorTreeGraphNode* Node) { if (Node == NULL) { return; } for (int32 PinIdx = 0; PinIdx < Node->Pins.Num(); PinIdx++) { UEdGraphPin* Pin = Node->Pins[PinIdx]; if (Pin->Direction != EGPD_Output) { continue; } for (int32 i = 0; i < Pin->LinkedTo.Num(); i++) { UBehaviorTreeGraphNode* LinkedNode = Cast<UBehaviorTreeGraphNode>(Pin->LinkedTo[i]->GetOwningNode()); if (LinkedNode) { UBTNode* BTNode = Cast<UBTNode>(LinkedNode->NodeInstance); if (BTNode && LinkedNode->bHasBreakpoint && LinkedNode->bIsBreakpointEnabled) { ActiveBreakpoints.Add(BTNode->GetExecutionIndex()); } CollectBreakpointsFromAsset(LinkedNode); } } } }
void FBehaviorTreeDebugger::OnBreakpointRemoved(class UBehaviorTreeGraphNode* Node) { if (IsDebuggerReady()) { UBTNode* BTNode = Cast<UBTNode>(Node->NodeInstance); if (BTNode) { ActiveBreakpoints.RemoveSingleSwap(BTNode->GetExecutionIndex()); } } }
void UBehaviorTreeGraph::UpdateAbortHighlight(struct FAbortDrawHelper& Mode0, struct FAbortDrawHelper& Mode1) { for (int32 Index = 0; Index < Nodes.Num(); ++Index) { UBehaviorTreeGraphNode* Node = Cast<UBehaviorTreeGraphNode>(Nodes[Index]); UBTNode* NodeInstance = Node ? Cast<UBTNode>(Node->NodeInstance) : NULL; if (NodeInstance) { const uint16 ExecIndex = NodeInstance->GetExecutionIndex(); Node->bHighlightInAbortRange0 = (ExecIndex != MAX_uint16) && (ExecIndex >= Mode0.AbortStart) && (ExecIndex <= Mode0.AbortEnd); Node->bHighlightInAbortRange1 = (ExecIndex != MAX_uint16) && (ExecIndex >= Mode1.AbortStart) && (ExecIndex <= Mode1.AbortEnd); Node->bHighlightInSearchRange0 = (ExecIndex != MAX_uint16) && (ExecIndex >= Mode0.SearchStart) && (ExecIndex <= Mode0.SearchEnd); Node->bHighlightInSearchRange1 = (ExecIndex != MAX_uint16) && (ExecIndex >= Mode1.SearchStart) && (ExecIndex <= Mode1.SearchEnd); Node->bHighlightInSearchTree = false; } } }