2021-06-22 04:50:11 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "SequenceEvaluatorLibrary.h"
# include "Animation/AnimNode_Inertialization.h"
# include "AnimNodes/AnimNode_SequenceEvaluator.h"
2022-07-07 11:35:25 -04:00
# include "AnimationRuntime.h"
2023-06-05 12:21:53 -04:00
# include "Animation/AnimTrace.h"
2023-06-19 15:03:03 -04:00
# include "Animation/AnimInstanceProxy.h"
2021-06-22 04:50:11 -04:00
2022-09-24 13:57:58 -04:00
# include UE_INLINE_GENERATED_CPP_BY_NAME(SequenceEvaluatorLibrary)
2021-06-22 04:50:11 -04:00
DEFINE_LOG_CATEGORY_STATIC ( LogSequenceEvaluatorLibrary , Verbose , All ) ;
2021-06-23 10:58:34 -04:00
FSequenceEvaluatorReference USequenceEvaluatorLibrary : : ConvertToSequenceEvaluator ( const FAnimNodeReference & Node , EAnimNodeReferenceConversionResult & Result )
2021-06-22 04:50:11 -04:00
{
return FAnimNodeReference : : ConvertToType < FSequenceEvaluatorReference > ( Node , Result ) ;
}
FSequenceEvaluatorReference USequenceEvaluatorLibrary : : SetExplicitTime ( const FSequenceEvaluatorReference & SequenceEvaluator , float Time )
{
SequenceEvaluator . CallAnimNodeFunction < FAnimNode_SequenceEvaluator > (
TEXT ( " SetExplicitTime " ) ,
[ Time ] ( FAnimNode_SequenceEvaluator & InSequenceEvaluator )
{
if ( ! InSequenceEvaluator . SetExplicitTime ( Time ) )
{
UE_LOG ( LogSequenceEvaluatorLibrary , Warning , TEXT ( " Could not set explicit time on sequence evaluator, value is not dynamic. Set it as Always Dynamic. " ) ) ;
}
} ) ;
return SequenceEvaluator ;
}
2023-09-06 04:14:59 -04:00
FSequenceEvaluatorReference USequenceEvaluatorLibrary : : SetExplicitFrame ( const FSequenceEvaluatorReference & SequenceEvaluator , int32 Frame )
{
SequenceEvaluator . CallAnimNodeFunction < FAnimNode_SequenceEvaluator > (
TEXT ( " SetExplicitTime " ) ,
[ Frame ] ( FAnimNode_SequenceEvaluator & InSequenceEvaluator )
{
if ( ! InSequenceEvaluator . SetExplicitFrame ( Frame ) )
{
UE_LOG ( LogSequenceEvaluatorLibrary , Warning , TEXT ( " Could not set explicit frame on sequence evaluator, value is not dynamic. Set it as Always Dynamic. " ) ) ;
}
} ) ;
return SequenceEvaluator ;
}
2021-09-17 09:42:58 -04:00
FSequenceEvaluatorReference USequenceEvaluatorLibrary : : AdvanceTime ( const FAnimUpdateContext & UpdateContext , const FSequenceEvaluatorReference & SequenceEvaluator , float PlayRate )
{
SequenceEvaluator . CallAnimNodeFunction < FAnimNode_SequenceEvaluator > (
TEXT ( " AdvanceTime " ) ,
[ & UpdateContext , PlayRate ] ( FAnimNode_SequenceEvaluator & InSequenceEvaluator )
{
if ( const FAnimationUpdateContext * AnimationUpdateContext = UpdateContext . GetContext ( ) )
{
float ExplicitTime = InSequenceEvaluator . GetExplicitTime ( ) ;
2023-06-08 14:19:19 -04:00
FAnimationRuntime : : AdvanceTime ( InSequenceEvaluator . IsLooping ( ) , AnimationUpdateContext - > GetDeltaTime ( ) * PlayRate , ExplicitTime , InSequenceEvaluator . GetCurrentAssetLength ( ) ) ;
2021-09-17 09:42:58 -04:00
if ( ! InSequenceEvaluator . SetExplicitTime ( ExplicitTime ) )
{
UE_LOG ( LogSequenceEvaluatorLibrary , Warning , TEXT ( " Could not advance time on sequence evaluator, ExplicitTime is not dynamic. Set it as Always Dynamic. " ) ) ;
}
}
else
{
UE_LOG ( LogSequenceEvaluatorLibrary , Warning , TEXT ( " AdvanceTime called with invalid context " ) ) ;
}
} ) ;
return SequenceEvaluator ;
}
2021-06-22 04:50:11 -04:00
FSequenceEvaluatorReference USequenceEvaluatorLibrary : : SetSequence ( const FSequenceEvaluatorReference & SequenceEvaluator , UAnimSequenceBase * Sequence )
{
SequenceEvaluator . CallAnimNodeFunction < FAnimNode_SequenceEvaluator > (
TEXT ( " SetSequence " ) ,
[ Sequence ] ( FAnimNode_SequenceEvaluator & InSequenceEvaluator )
{
if ( ! InSequenceEvaluator . SetSequence ( Sequence ) )
{
UE_LOG ( LogSequenceEvaluatorLibrary , Warning , TEXT ( " Could not set sequence on sequence evaluator, value is not dynamic. Set it as Always Dynamic. " ) ) ;
}
} ) ;
return SequenceEvaluator ;
}
FSequenceEvaluatorReference USequenceEvaluatorLibrary : : SetSequenceWithInertialBlending ( const FAnimUpdateContext & UpdateContext , const FSequenceEvaluatorReference & SequenceEvaluator , UAnimSequenceBase * Sequence , float BlendTime )
{
SequenceEvaluator . CallAnimNodeFunction < FAnimNode_SequenceEvaluator > (
TEXT ( " SetSequenceWithInterialBlending " ) ,
[ Sequence , & UpdateContext , BlendTime ] ( FAnimNode_SequenceEvaluator & InSequenceEvaluator )
{
const UAnimSequenceBase * CurrentSequence = InSequenceEvaluator . GetSequence ( ) ;
const bool bAnimSequenceChanged = ( CurrentSequence ! = Sequence ) ;
if ( ! InSequenceEvaluator . SetSequence ( Sequence ) )
{
UE_LOG ( LogSequenceEvaluatorLibrary , Warning , TEXT ( " Could not set sequence on sequence evaluator, 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 > ( ) )
{
2023-06-05 12:21:53 -04:00
FInertializationRequest Request ;
Request . Duration = BlendTime ;
# if ANIM_TRACE_ENABLED
2023-06-19 15:03:03 -04:00
Request . NodeId = AnimationUpdateContext - > GetCurrentNodeId ( ) ;
Request . AnimInstance = AnimationUpdateContext - > AnimInstanceProxy - > GetAnimInstanceObject ( ) ;
2023-06-05 12:21:53 -04:00
# endif
InertializationRequester - > RequestInertialization ( Request ) ;
2021-06-22 04:50:11 -04:00
}
}
else
{
UE_LOG ( LogSequenceEvaluatorLibrary , Warning , TEXT ( " SetSequenceWithInterialBlending called with invalid context " ) ) ;
}
}
} ) ;
return SequenceEvaluator ;
}
2022-01-19 11:53:03 -05:00
float USequenceEvaluatorLibrary : : GetAccumulatedTime ( const FSequenceEvaluatorReference & SequenceEvaluator )
{
float OutAccumulatedTime = 0.0f ;
SequenceEvaluator . CallAnimNodeFunction < FAnimNode_SequenceEvaluator > (
TEXT ( " GetAccumulatedTime " ) ,
[ & OutAccumulatedTime ] ( FAnimNode_SequenceEvaluator & InSequenceEvaluator )
{
OutAccumulatedTime = InSequenceEvaluator . GetAccumulatedTime ( ) ;
} ) ;
return OutAccumulatedTime ;
}
UAnimSequenceBase * USequenceEvaluatorLibrary : : GetSequence ( const FSequenceEvaluatorReference & SequenceEvaluator )
{
UAnimSequenceBase * OutSequence = nullptr ;
SequenceEvaluator . CallAnimNodeFunction < FAnimNode_SequenceEvaluator > (
TEXT ( " GetAccumulatedTime " ) ,
[ & OutSequence ] ( FAnimNode_SequenceEvaluator & InSequenceEvaluator )
{
OutSequence = InSequenceEvaluator . GetSequence ( ) ;
} ) ;
return OutSequence ;
2022-09-24 13:57:58 -04:00
}