Files
UnrealEngineUWP/Engine/Source/Editor/AnimGraph/Public/AnimGraphNode_LinkedAnimGraphBase.h
thomas sarkanen b506cf5727 Fix crash selecting linked anim layer class
Prevent filtering and selection of anim blueprints with incompatible/null skeletons, depending on context.
Additionally prevents non-template anim blueprints from being selected within templates and adds compile-time checks for compatibilty

#jira UE-136082 - Crash when clicking on the dropdown next to Instance Class in the Linked Anim Layer node settings
#rb Keith.Yerex
#preflight 61b092e55c61dba07bf10535

#ROBOMERGE-AUTHOR: thomas.sarkanen
#ROBOMERGE-SOURCE: CL 18404540 in //UE5/Release-5.0/... via CL 18404541
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v896-18170469)

[CL 18404555 by thomas sarkanen in ue5-release-engine-test branch]
2021-12-08 06:43:16 -05:00

96 lines
4.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Misc/Guid.h"
#include "AnimGraphNode_CustomProperty.h"
#include "EdGraphSchema_K2_Actions.h"
#include "IClassVariableCreator.h"
#include "K2Node_EventNodeInterface.h"
#include "AnimGraphNode_LinkedAnimGraphBase.generated.h"
class FCompilerResultsLog;
class IDetailLayoutBuilder;
class IPropertyHandle;
class SToolTip;
struct FAnimNode_LinkedAnimGraph;
UCLASS(MinimalAPI, Abstract)
class UAnimGraphNode_LinkedAnimGraphBase : public UAnimGraphNode_CustomProperty, public IK2Node_EventNodeInterface
{
GENERATED_BODY()
public:
//~ Begin UEdGraphNode Interface.
virtual FLinearColor GetNodeTitleColor() const override;
virtual FSlateIcon GetIconAndTint(FLinearColor& OutColor) const override;
virtual FText GetTooltipText() const override;
virtual FText GetMenuCategory() const override;
virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;
virtual void ValidateAnimNodeDuringCompilation(USkeleton* ForSkeleton, FCompilerResultsLog& MessageLog) override;
virtual void CreateOutputPins() override;
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;
//~ End UEdGraphNode Interface.
// UAnimGraphNode_Base interface
virtual FPoseLinkMappingRecord GetLinkIDLocation(const UScriptStruct* NodeType, UEdGraphPin* SourcePin) override;
virtual void GetOutputLinkAttributes(FNodeAttributeArray& OutAttributes) const override;
virtual bool ShouldShowAttributesOnPins() const override { return false; }
virtual void OnCopyTermDefaultsToDefaultObject(IAnimBlueprintCopyTermDefaultsContext& InCompilationContext, IAnimBlueprintNodeCopyTermDefaultsContext& InPerNodeContext, IAnimBlueprintGeneratedClassCompiledData& OutCompiledData) override;
virtual void GetRequiredExtensions(TArray<TSubclassOf<UAnimBlueprintExtension>>& OutExtensions) const override;
// UAnimGraphNode_CustomProperty interface
virtual bool IsStructuralProperty(FProperty* InProperty) const override;
// Node accessor
virtual FAnimNode_LinkedAnimGraph* GetLinkedAnimGraphNode() PURE_VIRTUAL(UAnimGraphNode_LinkedAnimGraphBase::GetLinkedAnimGraphNode, return nullptr;);
virtual const FAnimNode_LinkedAnimGraph* GetLinkedAnimGraphNode() const PURE_VIRTUAL(UAnimGraphNode_LinkedAnimGraphBase::GetLinkedAnimGraphNode, return nullptr;);
// IK2Node_EventNodeInterface interface
virtual TSharedPtr<FEdGraphSchemaAction> GetEventNodeAction(const FText& ActionCategory) override;
protected:
friend class UAnimBlueprintExtension_LinkedAnimGraph;
// Called pre-compilation to allocate pose links
void AllocatePoseLinks();
// Finds out whether there is a loop in the graph formed by linked instances from this node
bool HasInstanceLoop();
/** Generates widgets for exposing/hiding Pins for this node using the provided detail builder */
void GenerateExposedPinsDetails(IDetailLayoutBuilder &DetailBuilder);
// Finds out whether there is a loop in the graph formed by linked instances from CurrNode, used by HasInstanceLoop. VisitedNodes and NodeStack are required
// to track the graph links
// VisitedNodes - Node we have searched the links of, so we don't do it twice
// NodeStack - The currently considered chain of nodes. If a loop is detected this will contain the chain that causes the loop
static bool HasInstanceLoop_Recursive(UAnimGraphNode_LinkedAnimGraphBase* CurrNode, TArray<FGuid>& VisitedNodes, TArray<FGuid>& NodeStack);
// ----- UI CALLBACKS ----- //
// Gets path to the currently selected instance class' blueprint
virtual FString GetCurrentInstanceBlueprintPath() const;
// Filter callback for blueprints (only accept matching skeletons/interfaces)
virtual bool OnShouldFilterInstanceBlueprint(const FAssetData& AssetData) const;
// Instance blueprint was changed by user
void OnSetInstanceBlueprint(const FAssetData& AssetData, IDetailLayoutBuilder* InDetailBuilder);
// ----- END UI CALLBACKS ----- //
// Skeleton name used for filtering unloaded classes
FString SkeletonName;
// Template flag used for filtering unloaded classes
bool bIsTemplateAnimBlueprint = false;
// Interface flag used for filtering unloaded classes
bool bIsInterfaceBlueprint = false;
};
UE_DEPRECATED(4.24, "UAnimGraphNode_SubInstanceBase has been renamed to UAnimGraphNode_LinkedAnimGraphBase")
typedef UAnimGraphNode_LinkedAnimGraphBase UAnimGraphNode_SubInstanceBase;