2020-12-09 17:41:56 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "AnimationWarpingRuntimeModule.h"
|
2021-05-05 12:18:35 -04:00
|
|
|
#include "Animation/AnimRootMotionProvider.h"
|
|
|
|
|
#include "Animation/AnimNodeBase.h"
|
|
|
|
|
#include "Animation/AnimSequence.h"
|
|
|
|
|
#include "Animation/BuiltInAttributeTypes.h"
|
2020-12-09 17:41:56 -04:00
|
|
|
#include "Modules/ModuleManager.h"
|
|
|
|
|
|
|
|
|
|
class FAnimationWarpingRuntimeModule : public IAnimationWarpingRuntimeModule
|
|
|
|
|
{
|
|
|
|
|
};
|
|
|
|
|
|
2021-05-05 12:18:35 -04:00
|
|
|
namespace UE { namespace AnimationWarping {
|
2020-12-09 17:41:56 -04:00
|
|
|
|
2021-05-05 12:18:35 -04:00
|
|
|
// Root motion animation attribute data will always be accessible on the root bone's attribute container
|
2021-07-19 17:25:01 -04:00
|
|
|
static const UE::Anim::FAttributeId RootMotionAttributeId = { UE::Anim::IAnimRootMotionProvider::AttributeName , FCompactPoseBoneIndex(0) };
|
2021-05-05 12:18:35 -04:00
|
|
|
|
|
|
|
|
class FModule : public IModuleInterface, public UE::Anim::IAnimRootMotionProvider
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
virtual void StartupModule() override;
|
|
|
|
|
virtual void ShutdownModule() override;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
virtual void SampleRootMotion(const FDeltaTimeRecord& SampleRange, const UAnimSequence& Sequence, bool bLoopingSequence, UE::Anim::FStackAttributeContainer& OutAttributes) const override;
|
|
|
|
|
virtual bool OverrideRootMotion(const FTransform& RootMotionDelta, UE::Anim::FStackAttributeContainer& OutAttributes) const override;
|
|
|
|
|
virtual bool ExtractRootMotion(const UE::Anim::FStackAttributeContainer& Attributes, FTransform& OutRootMotionDelta) const override;
|
|
|
|
|
virtual bool HasRootMotion(const UE::Anim::FStackAttributeContainer& Attributes) const override;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void FModule::StartupModule()
|
|
|
|
|
{
|
|
|
|
|
IModularFeatures::Get().RegisterModularFeature(UE::Anim::IAnimRootMotionProvider::ModularFeatureName, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FModule::ShutdownModule()
|
|
|
|
|
{
|
|
|
|
|
IModularFeatures::Get().UnregisterModularFeature(UE::Anim::IAnimRootMotionProvider::ModularFeatureName, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FModule::SampleRootMotion(const FDeltaTimeRecord& SampleRange, const UAnimSequence& Sequence, bool bLoopingSequence, UE::Anim::FStackAttributeContainer& OutAttributes) const
|
|
|
|
|
{
|
2021-11-24 09:32:29 -05:00
|
|
|
const FTransform RootMotionTransform = Sequence.ExtractRootMotion(SampleRange.GetPrevious(), SampleRange.Delta, bLoopingSequence);
|
2021-05-27 23:25:04 -04:00
|
|
|
FTransformAnimationAttribute* RootMotionAttribute = OutAttributes.FindOrAdd<FTransformAnimationAttribute>(RootMotionAttributeId);
|
|
|
|
|
RootMotionAttribute->Value = RootMotionTransform;
|
2021-05-05 12:18:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FModule::OverrideRootMotion(const FTransform& RootMotionDelta, UE::Anim::FStackAttributeContainer& OutAttributes) const
|
|
|
|
|
{
|
|
|
|
|
if (FTransformAnimationAttribute* RootMotionAttribute = OutAttributes.Find<FTransformAnimationAttribute>(RootMotionAttributeId))
|
|
|
|
|
{
|
|
|
|
|
RootMotionAttribute->Value = RootMotionDelta;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FModule::ExtractRootMotion(const UE::Anim::FStackAttributeContainer& Attributes, FTransform& OutRootMotionDelta) const
|
|
|
|
|
{
|
|
|
|
|
const FTransformAnimationAttribute* RootMotionAttribute = Attributes.Find<FTransformAnimationAttribute>(RootMotionAttributeId);
|
|
|
|
|
OutRootMotionDelta = RootMotionAttribute ? RootMotionAttribute->Value : FTransform::Identity;
|
|
|
|
|
return !!RootMotionAttribute;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FModule::HasRootMotion(const UE::Anim::FStackAttributeContainer& Attributes) const
|
|
|
|
|
{
|
|
|
|
|
return !!Attributes.Find<FTransformAnimationAttribute>(RootMotionAttributeId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
|
|
IMPLEMENT_MODULE(UE::AnimationWarping::FModule, AnimationWarpingRuntime)
|