2021-06-17 08:58:34 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "SequencePlayerLibrary.h"
|
2021-06-22 04:50:11 -04:00
|
|
|
|
|
|
|
|
#include "Animation/AnimNode_Inertialization.h"
|
2021-06-17 08:58:34 -04:00
|
|
|
#include "Animation/AnimNode_SequencePlayer.h"
|
|
|
|
|
|
2021-06-22 04:50:11 -04:00
|
|
|
DEFINE_LOG_CATEGORY_STATIC(LogSequencePlayerLibrary, Verbose, All);
|
|
|
|
|
|
2021-06-23 10:58:34 -04:00
|
|
|
FSequencePlayerReference USequencePlayerLibrary::ConvertToSequencePlayer(const FAnimNodeReference& Node, EAnimNodeReferenceConversionResult& Result)
|
2021-06-17 08:58:34 -04:00
|
|
|
{
|
2021-06-21 07:54:03 -04:00
|
|
|
return FAnimNodeReference::ConvertToType<FSequencePlayerReference>(Node, Result);
|
2021-06-17 08:58:34 -04:00
|
|
|
}
|
|
|
|
|
|
2021-06-22 04:50:11 -04:00
|
|
|
FSequencePlayerReference USequencePlayerLibrary::SetAccumulatedTime(const FSequencePlayerReference& SequencePlayer, float Time)
|
2021-06-17 08:58:34 -04:00
|
|
|
{
|
2021-06-22 04:50:11 -04:00
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
2021-06-21 07:54:03 -04:00
|
|
|
TEXT("SetAccumulatedTime"),
|
2021-06-22 04:50:11 -04:00
|
|
|
[Time](FAnimNode_SequencePlayer& InSequencePlayer)
|
2021-06-17 08:58:34 -04:00
|
|
|
{
|
2021-06-22 04:50:11 -04:00
|
|
|
InSequencePlayer.SetAccumulatedTime(Time);
|
2021-06-21 07:54:03 -04:00
|
|
|
});
|
|
|
|
|
|
2021-06-22 04:50:11 -04:00
|
|
|
return SequencePlayer;
|
2021-06-17 08:58:34 -04:00
|
|
|
}
|
|
|
|
|
|
2021-06-22 04:50:11 -04:00
|
|
|
FSequencePlayerReference USequencePlayerLibrary::SetStartPosition(const FSequencePlayerReference& SequencePlayer, float StartPosition)
|
2021-06-17 08:58:34 -04:00
|
|
|
{
|
2021-06-22 04:50:11 -04:00
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
2021-06-21 07:54:03 -04:00
|
|
|
TEXT("SetStartPosition"),
|
2021-06-22 04:50:11 -04:00
|
|
|
[StartPosition](FAnimNode_SequencePlayer& InSequencePlayer)
|
2021-06-17 08:58:34 -04:00
|
|
|
{
|
2021-06-22 04:50:11 -04:00
|
|
|
if(!InSequencePlayer.SetStartPosition(StartPosition))
|
|
|
|
|
{
|
|
|
|
|
UE_LOG(LogSequencePlayerLibrary, Warning, TEXT("Could not set start position on sequence player, value is not dynamic. Set it as Always Dynamic."));
|
|
|
|
|
}
|
2021-06-21 07:54:03 -04:00
|
|
|
});
|
|
|
|
|
|
2021-06-22 04:50:11 -04:00
|
|
|
return SequencePlayer;
|
2021-06-21 07:54:03 -04:00
|
|
|
}
|
|
|
|
|
|
2021-06-22 04:50:11 -04:00
|
|
|
FSequencePlayerReference USequencePlayerLibrary::SetPlayRate(const FSequencePlayerReference& SequencePlayer, float PlayRate)
|
2021-06-21 07:54:03 -04:00
|
|
|
{
|
2021-06-22 04:50:11 -04:00
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
2021-06-21 07:54:03 -04:00
|
|
|
TEXT("SetPlayRate"),
|
2021-06-22 04:50:11 -04:00
|
|
|
[PlayRate](FAnimNode_SequencePlayer& InSequencePlayer)
|
2021-06-21 07:54:03 -04:00
|
|
|
{
|
2021-06-22 04:50:11 -04:00
|
|
|
if(!InSequencePlayer.SetPlayRate(PlayRate))
|
|
|
|
|
{
|
|
|
|
|
UE_LOG(LogSequencePlayerLibrary, Warning, TEXT("Could not set play rate on sequence player, value is not dynamic. Set it as Always Dynamic."));
|
|
|
|
|
}
|
2021-06-21 07:54:03 -04:00
|
|
|
});
|
|
|
|
|
|
2021-06-22 04:50:11 -04:00
|
|
|
return SequencePlayer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FSequencePlayerReference USequencePlayerLibrary::SetSequence(const FSequencePlayerReference& SequencePlayer, UAnimSequenceBase* Sequence)
|
|
|
|
|
{
|
|
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
|
|
|
|
TEXT("SetSequence"),
|
|
|
|
|
[Sequence](FAnimNode_SequencePlayer& InSequencePlayer)
|
|
|
|
|
{
|
|
|
|
|
if(!InSequencePlayer.SetSequence(Sequence))
|
|
|
|
|
{
|
|
|
|
|
UE_LOG(LogSequencePlayerLibrary, Warning, TEXT("Could not set sequence on sequence player, value is not dynamic. Set it as Always Dynamic."));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return SequencePlayer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FSequencePlayerReference USequencePlayerLibrary::SetSequenceWithInertialBlending(const FAnimUpdateContext& UpdateContext, const FSequencePlayerReference& SequencePlayer, UAnimSequenceBase* Sequence, float BlendTime)
|
|
|
|
|
{
|
|
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
|
|
|
|
TEXT("SetSequenceWithInterialBlending"),
|
|
|
|
|
[Sequence, &UpdateContext, BlendTime](FAnimNode_SequencePlayer& InSequencePlayer)
|
|
|
|
|
{
|
|
|
|
|
const UAnimSequenceBase* CurrentSequence = InSequencePlayer.GetSequence();
|
|
|
|
|
const bool bAnimSequenceChanged = (CurrentSequence != Sequence);
|
|
|
|
|
|
|
|
|
|
if(!InSequencePlayer.SetSequence(Sequence))
|
|
|
|
|
{
|
|
|
|
|
UE_LOG(LogSequencePlayerLibrary, Warning, TEXT("Could not set sequence on sequence player, value is not dynamic. Set it as Always Dynamic."));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(bAnimSequenceChanged && BlendTime > 0.0f)
|
|
|
|
|
{
|
|
|
|
|
if (const FAnimationUpdateContext* AnimationUpdateContext = UpdateContext.GetContext())
|
|
|
|
|
{
|
|
|
|
|
if (UE::Anim::IInertializationRequester* InertializationRequester = AnimationUpdateContext->GetMessage<UE::Anim::IInertializationRequester>())
|
|
|
|
|
{
|
|
|
|
|
InertializationRequester->RequestInertialization(BlendTime);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
UE_LOG(LogSequencePlayerLibrary, Warning, TEXT("SetSequenceWithInertialBlending called with invalid context"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return SequencePlayer;
|
2021-09-16 22:34:04 -04:00
|
|
|
}
|
|
|
|
|
|
2022-01-21 15:23:50 -05:00
|
|
|
FSequencePlayerReference USequencePlayerLibrary::GetSequence(const FSequencePlayerReference& SequencePlayer, UAnimSequenceBase*& SequenceBase)
|
2021-09-16 22:34:04 -04:00
|
|
|
{
|
|
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
2022-01-21 15:23:50 -05:00
|
|
|
TEXT("GetSequence"),
|
|
|
|
|
[&SequenceBase](FAnimNode_SequencePlayer& InSequencePlayer)
|
2021-09-16 22:34:04 -04:00
|
|
|
{
|
2022-01-21 15:23:50 -05:00
|
|
|
SequenceBase = InSequencePlayer.GetSequence();
|
2021-09-16 22:34:04 -04:00
|
|
|
});
|
|
|
|
|
|
2022-01-21 15:23:50 -05:00
|
|
|
return SequencePlayer;
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-04 08:48:06 -05:00
|
|
|
UAnimSequenceBase* USequencePlayerLibrary::GetSequencePure(const FSequencePlayerReference& SequencePlayer)
|
|
|
|
|
{
|
|
|
|
|
UAnimSequenceBase* SequenceBase = nullptr;
|
|
|
|
|
|
|
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
|
|
|
|
TEXT("GetSequence"),
|
|
|
|
|
[&SequenceBase](FAnimNode_SequencePlayer& InSequencePlayer)
|
|
|
|
|
{
|
|
|
|
|
SequenceBase = InSequencePlayer.GetSequence();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return SequenceBase;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-21 15:23:50 -05:00
|
|
|
float USequencePlayerLibrary::GetAccumulatedTime(const FSequencePlayerReference& SequencePlayer)
|
|
|
|
|
{
|
|
|
|
|
float AccumulatedTime = 0.f;
|
|
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
|
|
|
|
TEXT("GetAccumulatedTime"),
|
|
|
|
|
[&AccumulatedTime](FAnimNode_SequencePlayer& InSequencePlayer)
|
|
|
|
|
{
|
|
|
|
|
AccumulatedTime = InSequencePlayer.GetAccumulatedTime();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return AccumulatedTime;
|
2021-09-16 22:34:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float USequencePlayerLibrary::GetStartPosition(const FSequencePlayerReference& SequencePlayer)
|
|
|
|
|
{
|
2022-01-21 15:23:50 -05:00
|
|
|
float StartPosition = 0.f;
|
2021-09-16 22:34:04 -04:00
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
|
|
|
|
TEXT("GetStartPosition"),
|
2022-01-21 15:23:50 -05:00
|
|
|
[&StartPosition](FAnimNode_SequencePlayer& InSequencePlayer)
|
2021-09-16 22:34:04 -04:00
|
|
|
{
|
2022-01-21 15:23:50 -05:00
|
|
|
StartPosition = InSequencePlayer.GetStartPosition();
|
2021-09-16 22:34:04 -04:00
|
|
|
});
|
|
|
|
|
|
2022-01-21 15:23:50 -05:00
|
|
|
return StartPosition;
|
2021-09-16 22:34:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float USequencePlayerLibrary::GetPlayRate(const FSequencePlayerReference& SequencePlayer)
|
|
|
|
|
{
|
2022-01-21 15:23:50 -05:00
|
|
|
float PlayRate = 1.f;
|
2021-09-16 22:34:04 -04:00
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
|
|
|
|
TEXT("GetPlayRate"),
|
2022-01-21 15:23:50 -05:00
|
|
|
[&PlayRate](FAnimNode_SequencePlayer& InSequencePlayer)
|
2021-09-16 22:34:04 -04:00
|
|
|
{
|
2022-01-21 15:23:50 -05:00
|
|
|
PlayRate = InSequencePlayer.GetPlayRate();
|
2021-09-16 22:34:04 -04:00
|
|
|
});
|
|
|
|
|
|
2022-01-21 15:23:50 -05:00
|
|
|
return PlayRate;
|
2021-09-16 22:34:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool USequencePlayerLibrary::GetLoopAnimation(const FSequencePlayerReference& SequencePlayer)
|
|
|
|
|
{
|
2022-01-21 15:23:50 -05:00
|
|
|
bool bLoopAnimation = false;
|
2021-09-16 22:34:04 -04:00
|
|
|
SequencePlayer.CallAnimNodeFunction<FAnimNode_SequencePlayer>(
|
|
|
|
|
TEXT("GetLoopAnimation"),
|
2022-01-21 15:23:50 -05:00
|
|
|
[&bLoopAnimation](FAnimNode_SequencePlayer& InSequencePlayer)
|
2021-09-16 22:34:04 -04:00
|
|
|
{
|
2022-01-21 15:23:50 -05:00
|
|
|
bLoopAnimation = InSequencePlayer.GetLoopAnimation();
|
2021-09-16 22:34:04 -04:00
|
|
|
});
|
|
|
|
|
|
2022-01-21 15:23:50 -05:00
|
|
|
return bLoopAnimation;
|
2021-06-17 08:58:34 -04:00
|
|
|
}
|