void UK2Node_AddComponent::ValidateNodeDuringCompilation(FCompilerResultsLog& MessageLog) const { Super::ValidateNodeDuringCompilation(MessageLog); UActorComponent* Template = GetTemplateFromNode(); if (Template) { UClass* TemplateClass = Template->GetClass(); if (!TemplateClass->IsChildOf(UActorComponent::StaticClass()) || TemplateClass->HasAnyClassFlags(CLASS_Abstract) || !TemplateClass->HasMetaData(FBlueprintMetadata::MD_BlueprintSpawnableComponent) ) { FFormatNamedArguments Args; Args.Add(TEXT("TemplateClass"), FText::FromString(TemplateClass->GetName())); Args.Add(TEXT("NodeTitle"), GetNodeTitle(ENodeTitleType::FullTitle)); MessageLog.Error(*FText::Format(NSLOCTEXT("KismetCompiler", "InvalidComponentTemplate_Error", "Invalid class '{TemplateClass}' used as template by '{NodeTitle}' for @@"), Args).ToString(), this); } if (UChildActorComponent const* ChildActorComponent = Cast<UChildActorComponent const>(Template)) { UBlueprint const* Blueprint = GetBlueprint(); UClass const* ChildActorClass = ChildActorComponent->GetChildActorClass(); if (ChildActorClass == Blueprint->GeneratedClass) { UEdGraph const* ParentGraph = GetGraph(); UEdGraphSchema_K2 const* K2Schema = GetDefault<UEdGraphSchema_K2>(); if (K2Schema->IsConstructionScript(ParentGraph)) { FFormatNamedArguments Args; Args.Add(TEXT("ChildActorClass"), FText::FromString(ChildActorClass->GetName())); MessageLog.Error(*FText::Format(NSLOCTEXT("KismetCompiler", "AddSelfComponent_Error", "@@ cannot add a '{ChildActorClass}' component in the construction script (could cause infinite recursion)."), Args).ToString(), this); } } else if (ChildActorClass != nullptr) { AActor const* ChildActor = Cast<AActor>(ChildActorClass->ClassDefaultObject); check(ChildActor != nullptr); USceneComponent* RootComponent = ChildActor->GetRootComponent(); if ((RootComponent != nullptr) && (RootComponent->Mobility == EComponentMobility::Static) && (ChildActorComponent->Mobility != EComponentMobility::Static)) { FFormatNamedArguments Args; Args.Add(TEXT("ChildActorClass"), FText::FromString(ChildActorClass->GetName())); MessageLog.Error(*FText::Format(NSLOCTEXT("KismetCompiler", "AddStaticChildActorComponent_Error", "@@ cannot add a '{ChildActorClass}' component as it has static mobility, and the ChildActorComponent does not."), Args).ToString(), this); } } } } else { FFormatNamedArguments Args; Args.Add(TEXT("NodeTitle"), GetNodeTitle(ENodeTitleType::FullTitle)); MessageLog.Error(*FText::Format(NSLOCTEXT("KismetCompiler", "MissingComponentTemplate_Error", "Unknown template referenced by '{NodeTitle}' for @@"), Args).ToString(), this); } }
void UK2Node_VariableGet::Serialize(FArchive& Ar) { // The following code is to attempt to log info related to UE-19729 if (Ar.IsSaving() && !Ar.IsTransacting()) { if (UEdGraph* Graph = Cast<UEdGraph>(GetOuter())) { if (UBlueprint* Blueprint = FBlueprintEditorUtils::FindBlueprintForGraph(Graph)) { if (!Blueprint->bBeingCompiled) { FString VariableName = GetVarNameString(); FString BlueprintPath = Blueprint->GetPathName(); FString SetupStyle = bIsPureGet? TEXT("pure") : TEXT("validated"); UE_LOG(LogBlueprintUserMessages, Log, TEXT("Serialization for Get node for variable '%s' in Blueprint '%s' which is setup as %s"), *VariableName, *BlueprintPath, *SetupStyle); // The following line may spur the crash noted in UE-19729 and will confirm that the crash happens before the FiB gather. GetNodeTitle(ENodeTitleType::ListView); } } } } Super::Serialize(Ar); }
void UNiagaraNodeOp::Compile(class INiagaraCompiler* Compiler, TArray<FNiagaraNodeResult>& Outputs) { const FNiagaraOpInfo* OpInfo = FNiagaraOpInfo::GetOpInfo(OpName); check(OpInfo); int32 NumInputs = OpInfo->Inputs.Num(); int32 NumOutputs = OpInfo->Outputs.Num(); TArray<TNiagaraExprPtr> Inputs; bool bError = false; for (int32 i = 0; i < NumInputs; ++i) { UEdGraphPin *Pin = Pins[i]; check(Pin->Direction == EGPD_Input); TNiagaraExprPtr InputExpr = Compiler->CompilePin(Pin); if (!InputExpr.IsValid()) { bError = true; FFormatNamedArguments Args; Args.Add(TEXT("OpName"), GetNodeTitle(ENodeTitleType::FullTitle)); FText Format = LOCTEXT("InputErrorFormat", "Error compiling input on {OpName} node."); Compiler->Error(FText::Format(Format, Args), this, Pin); } Inputs.Add(InputExpr); } TArray<TNiagaraExprPtr> OutputExpressions; if ( !bError && OpInfo->OpDelegate.Execute(Compiler, Inputs, OutputExpressions)) { check(OutputExpressions.Num() == OpInfo->Outputs.Num()); for (int32 i = 0; i < NumOutputs; ++i) { UEdGraphPin *Pin = Pins[NumInputs + i]; check(Pin->Direction == EGPD_Output); Outputs.Add(FNiagaraNodeResult(OutputExpressions[i], Pin)); } } else { FFormatNamedArguments Args; Args.Add(TEXT("OpName"), GetNodeTitle(ENodeTitleType::FullTitle)); FText Format = LOCTEXT("NodeErrorFormat", "Error compiling {OpName} node."); Compiler->Error(FText::Format(Format, Args), this, nullptr); } }
FText USoundCueGraphNode::GetTooltipText() const { FText Tooltip; if (SoundNode) { Tooltip = SoundNode->GetClass()->GetToolTipText(); } if (Tooltip.IsEmpty()) { Tooltip = GetNodeTitle(ENodeTitleType::ListView); } return Tooltip; }
int32 USoundCueGraphNode::EstimateNodeWidth() const { const int32 EstimatedCharWidth = 6; FString NodeTitle = GetNodeTitle(ENodeTitleType::FullTitle).ToString(); UFont* Font = GetDefault<UEditorEngine>()->EditorFont; int32 Result = NodeTitle.Len()*EstimatedCharWidth; if (Font) { Result = Font->GetStringSize(*NodeTitle); } return Result; }
void UEdGraphNode::AddSearchMetaDataInfo(TArray<struct FSearchTagDataPair>& OutTaggedMetaData) const { // Searchable - Primary label for the item in the search results OutTaggedMetaData.Add(FSearchTagDataPair(FFindInBlueprintSearchTags::FiB_Name, GetNodeTitle(ENodeTitleType::ListView))); // Searchable - As well as being searchable, this displays in the tooltip for the node OutTaggedMetaData.Add(FSearchTagDataPair(FFindInBlueprintSearchTags::FiB_ClassName, FText::FromString(GetClass()->GetName()))); // Non-searchable - Used to lookup the node when attempting to jump to it OutTaggedMetaData.Add(FSearchTagDataPair(FFindInBlueprintSearchTags::FiB_NodeGuid, FText::FromString(NodeGuid.ToString(EGuidFormats::Digits)))); // Non-searchable - Important for matching pin types with icons and colors, stored here so that each pin does not store it OutTaggedMetaData.Add(FSearchTagDataPair(FFindInBlueprintSearchTags::FiB_SchemaName, FText::FromString(GetSchema()->GetClass()->GetName()))); // Non-Searchable - Used to display the icon and color for this node for better visual identification. FLinearColor GlyphColor = FLinearColor::White; OutTaggedMetaData.Add(FSearchTagDataPair(FFindInBlueprintSearchTags::FiB_Glyph, FText::FromString(GetPaletteIcon(GlyphColor).ToString()))); OutTaggedMetaData.Add(FSearchTagDataPair(FFindInBlueprintSearchTags::FiB_GlyphColor, FText::FromString(GlyphColor.ToString()))); OutTaggedMetaData.Add(FSearchTagDataPair(FFindInBlueprintSearchTags::FiB_Comment, FText::FromString(NodeComment))); }
void UK2Node_VariableGet::Serialize(FArchive& Ar) { // The following code is to attempt to log info related to UE-19729 if (Ar.IsSaving() && Ar.IsPersistent()) { uint32 PortFlagsToSkip = PPF_Duplicate | PPF_DuplicateForPIE; if (!(Ar.GetPortFlags() & PortFlagsToSkip)) { if (UEdGraph* Graph = Cast<UEdGraph>(GetOuter())) { if (UBlueprint* Blueprint = FBlueprintEditorUtils::FindBlueprintForGraph(Graph)) { if (!Blueprint->bBeingCompiled) { // The following line may spur the crash noted in UE-19729 and will confirm that the crash happens before the FiB gather. GetNodeTitle(ENodeTitleType::ListView); } } } } } Super::Serialize(Ar); }
FText UAnimGraphNode_PoseByName::GetTooltipText() const { // FText::Format() is slow, so we utilize the cached list title return GetNodeTitle(ENodeTitleType::ListView); }
FText UK2Node_ForEachElementInEnum::GetTooltipText() const { return GetNodeTitle(ENodeTitleType::FullTitle); }
void UK2Node_Timeline::FindDiffs( class UEdGraphNode* OtherNode, struct FDiffResults& Results ) { UK2Node_Timeline* Timeline1 = this; UK2Node_Timeline* Timeline2 = Cast<UK2Node_Timeline>(OtherNode); UBlueprint* Blueprint1 = Timeline1->GetBlueprint(); int32 Index1 = FBlueprintEditorUtils::FindTimelineIndex(Blueprint1,Timeline1->TimelineName); UBlueprint* Blueprint2 = Timeline2->GetBlueprint(); int32 Index2 = FBlueprintEditorUtils::FindTimelineIndex(Blueprint2,Timeline2->TimelineName); if(Index1 != INDEX_NONE && Index2 != INDEX_NONE) { UTimelineTemplate* Template1 = Blueprint1->Timelines[Index1]; UTimelineTemplate* Template2 = Blueprint2->Timelines[Index2]; FDiffSingleResult Diff; Diff.Node1 = Timeline2; Diff.Node2 = Timeline1; if(Template1->bAutoPlay != Template2->bAutoPlay) { Diff.Diff = EDiffType::TIMELINE_AUTOPLAY; FText NodeName = GetNodeTitle(ENodeTitleType::ListView); FFormatNamedArguments Args; Args.Add(TEXT("NodeName"), NodeName); Diff.ToolTip = FText::Format(LOCTEXT("DIF_TimelineAutoPlayToolTip", "Timeline '{NodeName}' had its AutoPlay state changed"), Args); Diff.DisplayColor = FLinearColor(0.15f,0.61f,0.15f); Diff.DisplayString = FText::Format(LOCTEXT("DIF_TimelineAutoPlay", "Timeline AutoPlay Changed '{NodeName}'"), Args); Results.Add(Diff); } if(Template1->bLoop != Template2->bLoop) { Diff.Diff = EDiffType::TIMELINE_LOOP; FText NodeName = GetNodeTitle(ENodeTitleType::ListView); FFormatNamedArguments Args; Args.Add(TEXT("NodeName"), NodeName); Diff.ToolTip = FText::Format(LOCTEXT("DIF_TimelineLoopingToolTip", "Timeline '{NodeName}' had its looping state changed"), Args); Diff.DisplayColor = FLinearColor(0.75f,0.1f,0.75f); Diff.DisplayString = FText::Format(LOCTEXT("DIF_TimelineLooping", "Timeline Loop Changed '{NodeName}'"), Args); Results.Add(Diff); } if(Template1->TimelineLength != Template2->TimelineLength) { FText NodeName = GetNodeTitle(ENodeTitleType::ListView); FFormatNamedArguments Args; Args.Add(TEXT("NodeName"), NodeName); Args.Add(TEXT("TimelineLength1"), Template1->TimelineLength); Args.Add(TEXT("TimelineLength2"), Template2->TimelineLength); Diff.Diff = EDiffType::TIMELINE_LENGTH; Diff.ToolTip = FText::Format(LOCTEXT("DIF_TimelineLengthToolTip", "Length of Timeline '{NodeName}' has changed. Was {TimelineLength1}, but is now {TimelineLength2}"), Args); Diff.DisplayColor = FLinearColor(0.25f,0.1f,0.15f); Diff.DisplayString = FText::Format(LOCTEXT("DIF_TimelineLength", "Timeline Length '{NodeName}' [{TimelineLength1} -> {TimelineLength2}]"), Args); Results.Add(Diff); } //something specific inside has changed if(Diff.Diff == EDiffType::NO_DIFFERENCE) { FindExactTimelineDifference(Results, Diff, Template1->EventTracks, Template2->EventTracks, LOCTEXT("Event", "Event").ToString()); FindExactTimelineDifference(Results, Diff, Template1->FloatTracks, Template2->FloatTracks, LOCTEXT("Float", "Float").ToString()); FindExactTimelineDifference(Results, Diff, Template1->VectorTracks, Template2->VectorTracks, LOCTEXT("Vector", "Vector").ToString() ); } } }
FText UK2Node_TransitionRuleGetter::GetTooltipText() const { return GetNodeTitle(ENodeTitleType::FullTitle); }
FText UAnimGraphNode_RotationOffsetBlendSpace::GetTooltipText() const { // FText::Format() is slow, so we utilize the cached list title return GetNodeTitle(ENodeTitleType::ListView); }
FText UEdGraphNode_Documentation::GetPinNameOverride(const UEdGraphPin& Pin) const { return GetNodeTitle( ENodeTitleType::ListView ); }
FString UEdGraphNode_Comment::GetPinNameOverride(const UEdGraphPin& Pin) const { return GetNodeTitle(ENodeTitleType::ListView).ToString(); }