Files
UnrealEngine/Engine/Source/Editor/AnimGraph/Public/AnimGraphNodeAlphaOptions.h
2025-05-18 13:04:45 +08:00

163 lines
6.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Kismet2/BlueprintEditorUtils.h"
#include "Animation/InputScaleBias.h"
#include "AnimGraphNode_Base.h"
#include "ScopedTransaction.h"
#include "DetailLayoutBuilder.h"
// Helper struct used to handle graph (editor) node alpha options
struct FAnimGraphNodeAlphaOptions
{
// This assumes that a anim node contains the following members:
//
// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Alpha, meta = (PinShownByDefault))
// float Alpha;
//
// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Alpha)
// FInputScaleBias AlphaScaleBias;
//
// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Alpha, meta = (DisplayName = "Blend Settings"))
// FInputAlphaBoolBlend AlphaBoolBlend;
//
// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Alpha, meta = (PinShownByDefault))
// FName AlphaCurveName;
//
// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Alpha)
// FInputScaleBiasClamp AlphaScaleBiasClamp;
//
// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Alpha)
// EAnimAlphaInputType AlphaInputType;
//
// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Alpha, meta = (PinShownByDefault, DisplayName = "bEnabled", DisplayAfter = "AlphaScaleBias"))
// bool bAlphaBoolEnabled;
//
// This is implemented in this way (rather than encapsulating the options in their own struct) because
// we dont support exposing pins from sub-structs on anim nodes (or anything else for that matter).
// Called from an UAnimGraphNode_Base-derived classes CustomizePinData to update alpha pins
template<typename AnimNodeType>
static void HandleCustomizePinData(const AnimNodeType& InAnimNode, UEdGraphPin* InPin)
{
if (InPin->PinName == GET_MEMBER_NAME_STRING_CHECKED(AnimNodeType, Alpha))
{
InPin->bHidden = (InAnimNode.AlphaInputType != EAnimAlphaInputType::Float);
if (!InPin->bHidden)
{
InPin->PinFriendlyName = InAnimNode.AlphaScaleBias.GetFriendlyName(InAnimNode.AlphaScaleBiasClamp.GetFriendlyName(InPin->PinFriendlyName));
}
}
if (InPin->PinName == GET_MEMBER_NAME_STRING_CHECKED(AnimNodeType, bAlphaBoolEnabled))
{
InPin->bHidden = (InAnimNode.AlphaInputType != EAnimAlphaInputType::Bool);
}
if (InPin->PinName == GET_MEMBER_NAME_STRING_CHECKED(AnimNodeType, AlphaCurveName))
{
InPin->bHidden = (InAnimNode.AlphaInputType != EAnimAlphaInputType::Curve);
if (!InPin->bHidden)
{
InPin->PinFriendlyName = InAnimNode.AlphaScaleBiasClamp.GetFriendlyName(InPin->PinFriendlyName);
}
}
}
// Called from an UAnimGraphNode_Base-derived classes PostEditChangeProperty to update alpha properties and pins
template<typename AnimNodeType>
static void HandlePostEditChangeProperty(const AnimNodeType& InAnimNode, UAnimGraphNode_Base* InNode, FPropertyChangedEvent& PropertyChangedEvent)
{
const FName PropertyName = (PropertyChangedEvent.Property ? PropertyChangedEvent.Property->GetFName() : NAME_None);
// Reconstruct node to show updates to PinFriendlyNames.
if ((PropertyName == GET_MEMBER_NAME_STRING_CHECKED(AnimNodeType, AlphaScaleBias))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputScaleBiasClamp, bMapRange))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputRange, Min))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputRange, Max))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputScaleBiasClamp, Scale))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputScaleBiasClamp, Bias))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputScaleBiasClamp, bClampResult))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputScaleBiasClamp, ClampMin))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputScaleBiasClamp, ClampMax))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputScaleBiasClamp, bInterpResult))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputScaleBiasClamp, InterpSpeedIncreasing))
|| (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(FInputScaleBiasClamp, InterpSpeedDecreasing)))
{
InNode->ReconstructNode();
}
if (PropertyName == GET_MEMBER_NAME_STRING_CHECKED(AnimNodeType, AlphaInputType))
{
FScopedTransaction Transaction(NSLOCTEXT("AnimGraphNodeAlphaOptions", "ChangeAlphaInputType", "Change Alpha Input Type"));
InNode->Modify();
// Break links to pins going away
for (int32 PinIndex = 0; PinIndex < InNode->Pins.Num(); ++PinIndex)
{
UEdGraphPin* Pin = InNode->Pins[PinIndex];
if (Pin->PinName == GET_MEMBER_NAME_STRING_CHECKED(AnimNodeType, Alpha))
{
if (InAnimNode.AlphaInputType != EAnimAlphaInputType::Float)
{
Pin->BreakAllPinLinks();
InNode->RemoveBindings(Pin->PinName);
}
}
else if (Pin->PinName == GET_MEMBER_NAME_STRING_CHECKED(AnimNodeType, bAlphaBoolEnabled))
{
if (InAnimNode.AlphaInputType != EAnimAlphaInputType::Bool)
{
Pin->BreakAllPinLinks();
InNode->RemoveBindings(Pin->PinName);
}
}
else if (Pin->PinName == GET_MEMBER_NAME_STRING_CHECKED(AnimNodeType, AlphaCurveName))
{
if (InAnimNode.AlphaInputType != EAnimAlphaInputType::Curve)
{
Pin->BreakAllPinLinks();
InNode->RemoveBindings(Pin->PinName);
}
}
}
InNode->ReconstructNode();
FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(InNode->GetBlueprint());
}
}
// Called from an UAnimGraphNode_Base-derived classes CustomizeDetails to update alpha properties and pins
template<typename AnimNodeType>
static void HandleCustomizeDetails(const AnimNodeType& InAnimNode, TSharedRef<IPropertyHandle> InNodeHandle, IDetailLayoutBuilder& InDetailBuilder)
{
if (InAnimNode.AlphaInputType != EAnimAlphaInputType::Bool)
{
InDetailBuilder.HideProperty(InNodeHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(AnimNodeType, bAlphaBoolEnabled)));
InDetailBuilder.HideProperty(InNodeHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(AnimNodeType, AlphaBoolBlend)));
}
if (InAnimNode.AlphaInputType != EAnimAlphaInputType::Float)
{
InDetailBuilder.HideProperty(InNodeHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(AnimNodeType, Alpha)));
InDetailBuilder.HideProperty(InNodeHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(AnimNodeType, AlphaScaleBias)));
}
if (InAnimNode.AlphaInputType != EAnimAlphaInputType::Curve)
{
InDetailBuilder.HideProperty(InNodeHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(AnimNodeType, AlphaCurveName)));
}
if ((InAnimNode.AlphaInputType != EAnimAlphaInputType::Float)
&& (InAnimNode.AlphaInputType != EAnimAlphaInputType::Curve))
{
InDetailBuilder.HideProperty(InNodeHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(AnimNodeType, AlphaScaleBiasClamp)));
}
}
};