// Copyright Epic Games, Inc. All Rights Reserved. #include "BlendSpacePlayerLibrary.h" #include "Animation/AnimNode_Inertialization.h" #include "AnimNodes/AnimNode_BlendSpacePlayer.h" #include "Animation/AnimTrace.h" #include "Animation/AnimInstanceProxy.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(BlendSpacePlayerLibrary) DEFINE_LOG_CATEGORY_STATIC(LogBlendSpacePlayerLibrary, Verbose, All); FBlendSpacePlayerReference UBlendSpacePlayerLibrary::ConvertToBlendSpacePlayer(const FAnimNodeReference& Node, EAnimNodeReferenceConversionResult& Result) { return FAnimNodeReference::ConvertToType(Node, Result); } FBlendSpacePlayerReference UBlendSpacePlayerLibrary::SetBlendSpace( const FBlendSpacePlayerReference& BlendSpacePlayer, UBlendSpace* BlendSpace) { BlendSpacePlayer.CallAnimNodeFunction( TEXT("SetBlendSpace"), [BlendSpace](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { if (!InBlendSpacePlayer.SetBlendSpace(BlendSpace)) { UE_LOG(LogBlendSpacePlayerLibrary, Warning, TEXT("Could not set blendspace on blendspace player, value is not dynamic. Set it as Always Dynamic.")); } }); return BlendSpacePlayer; } FBlendSpacePlayerReference UBlendSpacePlayerLibrary::SetBlendSpaceWithInertialBlending( const FAnimUpdateContext& UpdateContext, const FBlendSpacePlayerReference& BlendSpacePlayer, UBlendSpace* BlendSpace, float BlendTime) { BlendSpacePlayer.CallAnimNodeFunction( TEXT("SetBlendSpaceWithInertialBlending"), [BlendSpace, &UpdateContext, BlendTime](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { const UBlendSpace* CurrentBlendSpace = InBlendSpacePlayer.GetBlendSpace(); const bool bBlendSpaceChanged = (CurrentBlendSpace != BlendSpace); if (!InBlendSpacePlayer.SetBlendSpace(BlendSpace)) { UE_LOG(LogBlendSpacePlayerLibrary, Warning, TEXT("Could not set blendspace on blendspace player, value is not dynamic. Set it as Always Dynamic.")); } if (bBlendSpaceChanged && BlendTime > 0.0f) { if (const FAnimationUpdateContext* AnimationUpdateContext = UpdateContext.GetContext()) { if (UE::Anim::IInertializationRequester* InertializationRequester = AnimationUpdateContext->GetMessage()) { FInertializationRequest Request; Request.Duration = BlendTime; #if ANIM_TRACE_ENABLED Request.NodeId = AnimationUpdateContext->GetCurrentNodeId(); Request.AnimInstance = AnimationUpdateContext->AnimInstanceProxy->GetAnimInstanceObject(); #endif InertializationRequester->RequestInertialization(Request); } } else { UE_LOG(LogBlendSpacePlayerLibrary, Warning, TEXT("SetBlendSpaceWithIntertialBlending called with invalid context.")); } } }); return BlendSpacePlayer; } FBlendSpacePlayerReference UBlendSpacePlayerLibrary::SetResetPlayTimeWhenBlendSpaceChanges( const FBlendSpacePlayerReference& BlendSpacePlayer, bool bReset) { BlendSpacePlayer.CallAnimNodeFunction( TEXT("SetResetPlayTimeWhenBlendSpaceChanges"), [bReset](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { if (!InBlendSpacePlayer.SetResetPlayTimeWhenBlendSpaceChanges(bReset)) { UE_LOG(LogBlendSpacePlayerLibrary, Warning, TEXT("Could not set reset play time when blend space changes on blendspace player, value is not dynamic. Set it as Always Dynamic.")); } }); return BlendSpacePlayer; } FBlendSpacePlayerReference UBlendSpacePlayerLibrary::SetPlayRate(const FBlendSpacePlayerReference& BlendSpacePlayer, float PlayRate) { BlendSpacePlayer.CallAnimNodeFunction( TEXT("SetPlayRate"), [PlayRate](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { if (!InBlendSpacePlayer.SetPlayRate(PlayRate)) { UE_LOG(LogBlendSpacePlayerLibrary, Warning, TEXT("Could not set play rate on blendspace player, value is not dynamic. Set it as Always Dynamic.")); } }); return BlendSpacePlayer; } FBlendSpacePlayerReference UBlendSpacePlayerLibrary::SetLoop(const FBlendSpacePlayerReference& BlendSpacePlayer, bool bLoop) { BlendSpacePlayer.CallAnimNodeFunction( TEXT("SetLoop"), [bLoop](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { if (!InBlendSpacePlayer.SetLoop(bLoop)) { UE_LOG(LogBlendSpacePlayerLibrary, Warning, TEXT("Could not set loop on blendspace player, value is not dynamic. Set it as Always Dynamic.")); } }); return BlendSpacePlayer; } UBlendSpace* UBlendSpacePlayerLibrary::GetBlendSpace(const FBlendSpacePlayerReference& BlendSpacePlayer) { UBlendSpace* BlendSpace = nullptr; BlendSpacePlayer.CallAnimNodeFunction( TEXT("GetBlendSpace"), [&BlendSpace](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { BlendSpace = InBlendSpacePlayer.GetBlendSpace(); }); return BlendSpace; } FVector UBlendSpacePlayerLibrary::GetPosition(const FBlendSpacePlayerReference& BlendSpacePlayer) { FVector Position = FVector::ZeroVector; BlendSpacePlayer.CallAnimNodeFunction( TEXT("GetPosition"), [&Position](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { Position = InBlendSpacePlayer.GetPosition(); }); return Position; } float UBlendSpacePlayerLibrary::GetStartPosition(const FBlendSpacePlayerReference& BlendSpacePlayer) { float StartPosition = 0.f; BlendSpacePlayer.CallAnimNodeFunction( TEXT("GetStartPosition"), [&StartPosition](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { StartPosition = InBlendSpacePlayer.GetStartPosition(); }); return StartPosition; } float UBlendSpacePlayerLibrary::GetPlayRate(const FBlendSpacePlayerReference& BlendSpacePlayer) { float PlayRate = 0.f; BlendSpacePlayer.CallAnimNodeFunction( TEXT("GetPlayRate"), [&PlayRate](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { PlayRate = InBlendSpacePlayer.GetPlayRate(); }); return PlayRate; } bool UBlendSpacePlayerLibrary::GetLoop(const FBlendSpacePlayerReference& BlendSpacePlayer) { bool bLoop = false; BlendSpacePlayer.CallAnimNodeFunction( TEXT("GetLoop"), [&bLoop](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { bLoop = InBlendSpacePlayer.IsLooping(); }); return bLoop; } bool UBlendSpacePlayerLibrary::ShouldResetPlayTimeWhenBlendSpaceChanges( const FBlendSpacePlayerReference& BlendSpacePlayer) { bool bResetPlayTimeWhenBlendSpaceChanges = false; BlendSpacePlayer.CallAnimNodeFunction( TEXT("ShouldResetPlayTimeWhenBlendSpaceChanges"), [&bResetPlayTimeWhenBlendSpaceChanges](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { bResetPlayTimeWhenBlendSpaceChanges = InBlendSpacePlayer.ShouldResetPlayTimeWhenBlendSpaceChanges(); }); return bResetPlayTimeWhenBlendSpaceChanges; } void UBlendSpacePlayerLibrary::SnapToPosition( const FBlendSpacePlayerReference& BlendSpacePlayer, FVector NewPosition) { BlendSpacePlayer.CallAnimNodeFunction( TEXT("SnapToPosition"), [&NewPosition](FAnimNode_BlendSpacePlayer& InBlendSpacePlayer) { InBlendSpacePlayer.SnapToPosition(NewPosition); }); }