Files
UnrealEngineUWP/Engine/Source/Editor/AnimGraph/Internal/AnimGraphNodeBinding.h
thomas sarkanen 57122faf0a AnimNext params in Anim BPs
Added a new anim node: AnimNext Parameters. This injects parameters into the AnimNext stack for all leafwards nodes.

Added a new way of binding to parameters on anim nodes.
- Added indirection to UAnimGraphNode_Base to allow different 'binding types' to be authored by deriving from UAnimGraphNodeBinding
- Added new binding type for AnimNext parameters
- Moved existing binding code (inc UI widget creation) into UAnimGraphNodeBinding_Base
- Binding types can be selected on a per-node or per-anim BP basis

Reworked FParamStack API a little
- Allow for better error checking when pushing/popping stack layers. Pushed layers can now only be subsequently popped by passing in the handle of the pushed layer.
- Standalone layers are now wrapped in an opaque handle rather than returning a unique ptr
- GetParamData APIs now perform more involved type checking, allowing derived object types & type conversions to be implemented

Improved parameter type sandboxing for automated tests. If running low-level type tests while execution was happening on another thread, the editor could crash because of invalidating already-existing types.

Lots of other small fixes to get workflows nicer and end-to-end functionality working

#rb Nicholas.Frechette,Jaime.Cifuentes,Jurre.deBaare

[CL 26455905 by thomas sarkanen in ue5-main branch]
2023-07-19 04:36:34 -04:00

68 lines
3.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "AnimGraphNode_Base.h"
#include "Widgets/SNullWidget.h"
#include "AnimGraphNodeBinding.generated.h"
class UEdGraphPin;
struct FSearchTagDataPair;
class UClass;
class UBlueprint;
struct FMemberReference;
UCLASS(MinimalAPI, Abstract)
class UAnimGraphNodeBinding : public UObject
{
GENERATED_BODY()
friend class UAnimGraphNode_Base;
friend class UAnimGraphNode_CustomProperty;
friend class FAnimBlueprintCompilerContext;
friend class UAnimBlueprintExtension;
// Get the struct type for the runtime handling of this binding
virtual UScriptStruct* GetAnimNodeHandlerStruct() const PURE_VIRTUAL(UAnimGraphNodeBinding::GetAnimNodeHandlerStruct, return nullptr;)
// Override point for when pins are re-created on the hosting node
virtual void OnInternalPinCreation(UAnimGraphNode_Base* InNode) {}
// Override point for when the hosting node is reconstructed
virtual void OnReconstructNode(UAnimGraphNode_Base* InNode) {}
// Override point for when the hosting node is expanded during compilation
virtual void OnExpandNode(IAnimBlueprintCompilationContext& InCompilationContext, UAnimGraphNode_Base* InNode, UEdGraph* InSourceGraph) {}
// Check whether this binding binds to the specified name
virtual bool HasBinding(FName InBindingName, bool bCheckArrayIndexName) const PURE_VIRTUAL(UAnimGraphNodeBinding::HasBinding, return false;)
// Remove all bindings to the specified name
virtual void RemoveBindings(FName InBindingName) PURE_VIRTUAL(UAnimGraphNodeBinding::RemoveBindings, )
// Add any search metadata for pin bindings
virtual void AddPinSearchMetaDataInfo(const UEdGraphPin* InPin, FName InBindingName, TArray<FSearchTagDataPair>& OutTaggedMetaData) const {}
virtual void HandleVariableRenamed(UBlueprint* InBlueprint, UClass* InVariableClass, UEdGraph* InGraph, const FName& InOldVarName, const FName& InNewVarName) {}
virtual void ReplaceReferences(UBlueprint* InBlueprint, UBlueprint* InReplacementBlueprint, const FMemberReference& InSource, const FMemberReference& InReplacement) {}
virtual bool ReferencesVariable(const FName& InVarName, const UStruct* InScope) const { return false; }
virtual bool ReferencesFunction(const FName& InFunctionName, const UStruct* InScope) const { return false; }
// Update function for binding names - if a binding string tghat differs from InOldName is
// returned from InModifierFunction then the binding will be replaced
virtual void UpdateBindingNames(TFunctionRef<FString(const FString& InOldName)> InModifierFunction) PURE_VIRTUAL(UAnimGraphNodeBinding::UpdateBindingNames, )
// Get any extensions that are needed to process this binding
virtual void GetRequiredExtensions(TArray<TSubclassOf<UAnimBlueprintExtension>>& OutExtensions) const {}
// Process binding for this node during compilation
virtual void ProcessDuringCompilation(IAnimBlueprintCompilationContext& InCompilationContext, IAnimBlueprintGeneratedClassCompiledData& OutCompiledData) {}
#if WITH_EDITOR
// Create the binding widget for a pin/property. This is only called on the CDO. Use InArgs to determine the nodes to create the widget for.
virtual TSharedRef<SWidget> MakePropertyBindingWidget(const UAnimGraphNode_Base::FAnimPropertyBindingWidgetArgs& InArgs) { return SNullWidget::NullWidget; }
#endif
};