// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. #include "EnvironmentQueryEditorPrivatePCH.h" #include "ScopedTransaction.h" #include "SGraphEditorActionMenu_EnvironmentQuery.h" #define LOCTEXT_NAMESPACE "BehaviorTreeGraphNode" UEnvironmentQueryGraphNode_Option::UEnvironmentQueryGraphNode_Option(const class FPostConstructInitializeProperties& PCIP) : Super(PCIP) { } void UEnvironmentQueryGraphNode_Option::AllocateDefaultPins() { UEdGraphPin* Inputs = CreatePin(EGPD_Input, TEXT("Transition"), TEXT(""), NULL, false, false, TEXT("Out")); } void UEnvironmentQueryGraphNode_Option::PostPlacedNewNode() { if (EnvQueryNodeClass != NULL) { UEnvQuery* Query = Cast(GetEnvironmentQueryGraph()->GetOuter()); UEnvQueryOption* QueryOption = ConstructObject(UEnvQueryOption::StaticClass(), Query); QueryOption->Generator = ConstructObject(EnvQueryNodeClass, Query); QueryOption->SetFlags(RF_Transactional); QueryOption->Generator->SetFlags(RF_Transactional); NodeInstance = QueryOption; } } void UEnvironmentQueryGraphNode_Option::ResetNodeOwner() { Super::ResetNodeOwner(); UEnvQueryOption* OptionInstance = Cast(NodeInstance); if (OptionInstance && OptionInstance->Generator) { UEnvQuery* Query = Cast(GetEnvironmentQueryGraph()->GetOuter()); OptionInstance->Generator->Rename(NULL, Query, REN_DontCreateRedirectors | REN_DoNotDirty); } } void UEnvironmentQueryGraphNode_Option::PrepareForCopying() { Super::PrepareForCopying(); UEnvQueryOption* OptionInstance = Cast(NodeInstance); if (OptionInstance && OptionInstance->Generator) { // Temporarily take ownership of the node instance, so that it is not deleted when cutting OptionInstance->Generator->Rename(NULL, this, REN_DontCreateRedirectors | REN_DoNotDirty ); } } FText UEnvironmentQueryGraphNode_Option::GetNodeTitle(ENodeTitleType::Type TitleType) const { UEnvQueryOption* OptionInstance = Cast(NodeInstance); return OptionInstance ? OptionInstance->GetDescriptionTitle() : FText::GetEmpty(); } FText UEnvironmentQueryGraphNode_Option::GetDescription() const { UEnvQueryOption* OptionInstance = Cast(NodeInstance); return OptionInstance ? OptionInstance->GetDescriptionDetails() : FText::GetEmpty(); } void UEnvironmentQueryGraphNode_Option::AddSubNode(UEnvironmentQueryGraphNode_Test* NodeTemplate, class UEdGraph* ParentGraph) { const FScopedTransaction Transaction(LOCTEXT("AddNode", "Add Node")); ParentGraph->Modify(); Modify(); NodeTemplate->SetFlags(RF_Transactional); // set outer to be the graph so it doesn't go away NodeTemplate->Rename(NULL, ParentGraph, REN_NonTransactional); NodeTemplate->ParentNode = this; Tests.Add(NodeTemplate); NodeTemplate->CreateNewGuid(); NodeTemplate->PostPlacedNewNode(); NodeTemplate->AllocateDefaultPins(); NodeTemplate->AutowireNewNode(NULL); NodeTemplate->NodePosX = 0; NodeTemplate->NodePosY = 0; ParentGraph->NotifyGraphChanged(); UEnvironmentQueryGraph* MyGraph = Cast(ParentGraph); if (MyGraph) { MyGraph->UpdateAsset(); } } void UEnvironmentQueryGraphNode_Option::GetContextMenuActions(const FGraphNodeContextMenuBuilder& Context) const { Context.MenuBuilder->AddSubMenu( LOCTEXT("AddTest", "Add Test..." ), LOCTEXT("AddTestTooltip", "Adds new test to generator" ), FNewMenuDelegate::CreateUObject( this, &UEnvironmentQueryGraphNode_Option::CreateAddTestSubMenu,(UEdGraph*)Context.Graph) ); } void UEnvironmentQueryGraphNode_Option::CreateAddTestSubMenu(class FMenuBuilder& MenuBuilder, UEdGraph* Graph) const { TSharedRef Menu = SNew(SGraphEditorActionMenu_EnvironmentQuery) .GraphObj( Graph ) .GraphNode((UEnvironmentQueryGraphNode_Option*)this) .AutoExpandActionMenu(true); MenuBuilder.AddWidget(Menu,FText(),true); } void UEnvironmentQueryGraphNode_Option::CalculateWeights() { float MaxWeight = -1.0f; for (int32 i = 0; i < Tests.Num(); i++) { if (Tests[i] == NULL || !Tests[i]->bTestEnabled) { continue; } UEnvQueryTest* TestInstance = Cast(Tests[i]->NodeInstance); if (TestInstance && !TestInstance->Weight.IsNamedParam()) { MaxWeight = FMath::Max(MaxWeight, FMath::Abs(TestInstance->Weight.Value)); } } if (MaxWeight <= 0.0f) { MaxWeight = 1.0f; } for (int32 i = 0; i < Tests.Num(); i++) { if (Tests[i] == NULL) { continue; } UEnvQueryTest* TestInstance = Cast(Tests[i]->NodeInstance); const bool bHasNamed = TestInstance && Tests[i]->bTestEnabled && TestInstance->Weight.IsNamedParam(); const float NewWeight = (TestInstance && Tests[i]->bTestEnabled) ? (TestInstance->Weight.IsNamedParam() ? 1.0f : FMath::Clamp(FMath::Abs(TestInstance->Weight.Value) / MaxWeight, 0.0f, 1.0f)) : -1.0f; Tests[i]->SetDisplayedWeight(NewWeight, bHasNamed); } } #undef LOCTEXT_NAMESPACE