From 21cae1603adabf9baaa8a9a58e4be6eb94f435a6 Mon Sep 17 00:00:00 2001 From: Benjamin Jillich <43751992+amzn-jillich@users.noreply.github.com> Date: Tue, 30 Nov 2021 11:25:25 +0100 Subject: [PATCH] EMotion FX: Added helper to sample a pose from a motion without an motion instance (#6005) Signed-off-by: Benjamin Jillich --- .../Code/EMotionFX/Source/Motion.cpp | 13 ++++++--- Gems/EMotionFX/Code/EMotionFX/Source/Motion.h | 9 ++++--- .../EMotionFX/Source/MotionData/MotionData.h | 25 +++++------------ .../MotionData/MotionDataSampleSettings.h | 27 +++++++++++++++++++ .../MotionData/NonUniformMotionData.cpp | 4 +-- .../Source/MotionData/NonUniformMotionData.h | 4 +-- .../Source/MotionData/UniformMotionData.cpp | 4 +-- .../Source/MotionData/UniformMotionData.h | 4 +-- .../Code/EMotionFX/emotionfx_files.cmake | 1 + 9 files changed, 57 insertions(+), 34 deletions(-) create mode 100644 Gems/EMotionFX/Code/EMotionFX/Source/MotionData/MotionDataSampleSettings.h diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Motion.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/Motion.cpp index 9ad55b1c40..caf2acbaa2 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Motion.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Motion.cpp @@ -6,7 +6,6 @@ * */ -// include the required headers #include "EMotionFXConfig.h" #include "Motion.h" #include @@ -19,9 +18,9 @@ #include "EventHandler.h" #include "MotionEventTable.h" #include -#include #include #include +#include namespace EMotionFX { @@ -286,7 +285,7 @@ namespace EMotionFX { AZ_Assert(m_motionData, "Expecting motion data"); - MotionData::SampleSettings sampleSettings; + MotionDataSampleSettings sampleSettings; sampleSettings.m_actorInstance = instance->GetActorInstance(); sampleSettings.m_inPlace = instance->GetIsInPlace(); sampleSettings.m_mirror = instance->GetMirrorMotion(); @@ -301,7 +300,7 @@ namespace EMotionFX { AZ_Assert(m_motionData, "Expecting motion data"); - MotionData::SampleSettings sampleSettings; + MotionDataSampleSettings sampleSettings; sampleSettings.m_actorInstance = instance->GetActorInstance(); sampleSettings.m_inPlace = instance->GetIsInPlace(); sampleSettings.m_mirror = instance->GetMirrorMotion(); @@ -312,6 +311,12 @@ namespace EMotionFX m_motionData->SamplePose(sampleSettings, outputPose); } + void Motion::SamplePose(Pose* outputPose, const MotionDataSampleSettings& sampleSettings) + { + AZ_Assert(m_motionData, "Expecting motion data"); + m_motionData->SamplePose(sampleSettings, outputPose); + } + const MotionData* Motion::GetMotionData() const { return m_motionData; diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Motion.h b/Gems/EMotionFX/Code/EMotionFX/Source/Motion.h index e6ec99835b..3873924b7c 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Motion.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Motion.h @@ -9,14 +9,13 @@ #pragma once #include +#include +#include #include "EMotionFXConfig.h" #include "EMotionFXManager.h" #include "PlayBackInfo.h" #include "BaseObject.h" - -#include -#include - +#include namespace EMotionFX { @@ -138,6 +137,8 @@ namespace EMotionFX */ void Update(const Pose* inputPose, Pose* outputPose, MotionInstance* instance); + void SamplePose(Pose* outputPose, const MotionDataSampleSettings& sampleSettings); + /** * Specify the actor to use as retargeting source. * This would be the actor from which the motion was originally exported. diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/MotionData.h b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/MotionData.h index fe831f1df0..3950d99de0 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/MotionData.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/MotionData.h @@ -9,18 +9,17 @@ #pragma once #include -#include -#include -#include -#include - #include #include #include #include #include - #include +#include +#include +#include +#include +#include namespace MCore { @@ -109,16 +108,6 @@ namespace EMotionFX using QuaternionKey = Key; using FloatKey = Key; - struct EMFX_API SampleSettings - { - const ActorInstance* m_actorInstance = nullptr; - const Pose* m_inputPose = nullptr; - float m_sampleTime = 0.0f; - bool m_mirror = false; - bool m_retarget = false; - bool m_inPlace = false; - }; - struct EMFX_API OptimizeSettings { AZStd::vector m_jointIgnoreList; // The joint data indices to skip optimization for. @@ -162,8 +151,8 @@ namespace EMotionFX virtual const char* GetSceneSettingsName() const = 0; // Sampling - virtual Transform SampleJointTransform(const SampleSettings& settings, size_t jointSkeletonIndex) const = 0; - virtual void SamplePose(const SampleSettings& settings, Pose* outputPose) const = 0; + virtual Transform SampleJointTransform(const MotionDataSampleSettings& settings, size_t jointSkeletonIndex) const = 0; + virtual void SamplePose(const MotionDataSampleSettings& settings, Pose* outputPose) const = 0; virtual float SampleMorph(float sampleTime, size_t morphDataIndex) const = 0; virtual float SampleFloat(float sampleTime, size_t morphDataIndex) const = 0; diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/MotionDataSampleSettings.h b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/MotionDataSampleSettings.h new file mode 100644 index 0000000000..ea3f766c56 --- /dev/null +++ b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/MotionDataSampleSettings.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include + +namespace EMotionFX +{ + class ActorInstance; + class Pose; + + struct EMFX_API MotionDataSampleSettings + { + const ActorInstance* m_actorInstance = nullptr; + const Pose* m_inputPose = nullptr; + float m_sampleTime = 0.0f; + bool m_mirror = false; + bool m_retarget = false; + bool m_inPlace = false; + }; +} // namespace EMotionFX diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.cpp index 50f3a1f73f..3078978d2c 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.cpp @@ -74,7 +74,7 @@ namespace EMotionFX return values[indexA].ToQuaternion().NLerp(values[indexB].ToQuaternion(), t); } - Transform NonUniformMotionData::SampleJointTransform(const SampleSettings& settings, size_t jointSkeletonIndex) const + Transform NonUniformMotionData::SampleJointTransform(const MotionDataSampleSettings& settings, size_t jointSkeletonIndex) const { const Actor* actor = settings.m_actorInstance->GetActor(); const MotionLinkData* motionLinkData = FindMotionLinkData(actor); @@ -131,7 +131,7 @@ namespace EMotionFX return result; } - void NonUniformMotionData::SamplePose(const SampleSettings& settings, Pose* outputPose) const + void NonUniformMotionData::SamplePose(const MotionDataSampleSettings& settings, Pose* outputPose) const { AZ_Assert(settings.m_actorInstance, "Expecting a valid actor instance."); const Actor* actor = settings.m_actorInstance->GetActor(); diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.h b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.h index b5d8a05c44..16b9842479 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/NonUniformMotionData.h @@ -55,8 +55,8 @@ namespace EMotionFX AZ::u32 GetStreamSaveVersion() const override; const char* GetSceneSettingsName() const override; - Transform SampleJointTransform(const SampleSettings& settings, size_t jointSkeletonIndex) const override; - void SamplePose(const SampleSettings& settings, Pose* outputPose) const override; + Transform SampleJointTransform(const MotionDataSampleSettings& settings, size_t jointSkeletonIndex) const override; + void SamplePose(const MotionDataSampleSettings& settings, Pose* outputPose) const override; Transform SampleJointTransform(float sampleTime, size_t jointDataIndex) const override; AZ::Vector3 SampleJointPosition(float sampleTime, size_t jointDataIndex) const override; diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/UniformMotionData.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/UniformMotionData.cpp index 881604c7ff..0f096e7a8b 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/UniformMotionData.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/UniformMotionData.cpp @@ -130,7 +130,7 @@ namespace EMotionFX } } - Transform UniformMotionData::SampleJointTransform(const SampleSettings& settings, size_t jointSkeletonIndex) const + Transform UniformMotionData::SampleJointTransform(const MotionDataSampleSettings& settings, size_t jointSkeletonIndex) const { const Actor* actor = settings.m_actorInstance->GetActor(); const MotionLinkData* motionLinkData = FindMotionLinkData(actor); @@ -195,7 +195,7 @@ namespace EMotionFX return result; } - void UniformMotionData::SamplePose(const SampleSettings& settings, Pose* outputPose) const + void UniformMotionData::SamplePose(const MotionDataSampleSettings& settings, Pose* outputPose) const { AZ_Assert(settings.m_actorInstance, "Expecting a valid actor instance."); const Actor* actor = settings.m_actorInstance->GetActor(); diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/UniformMotionData.h b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/UniformMotionData.h index 40674cf2d1..d51f51ffd9 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/UniformMotionData.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/MotionData/UniformMotionData.h @@ -53,8 +53,8 @@ namespace EMotionFX const char* GetSceneSettingsName() const override; // Overloaded. - Transform SampleJointTransform(const SampleSettings& settings, size_t jointSkeletonIndex) const override; - void SamplePose(const SampleSettings& settings, Pose* outputPose) const override; + Transform SampleJointTransform(const MotionDataSampleSettings& settings, size_t jointSkeletonIndex) const override; + void SamplePose(const MotionDataSampleSettings& settings, Pose* outputPose) const override; float SampleMorph(float sampleTime, size_t morphDataIndex) const override; float SampleFloat(float sampleTime, size_t floatDataIndex) const override; Transform SampleJointTransform(float sampleTime, size_t jointDataIndex) const override; diff --git a/Gems/EMotionFX/Code/EMotionFX/emotionfx_files.cmake b/Gems/EMotionFX/Code/EMotionFX/emotionfx_files.cmake index f0443ade44..8135f14f12 100644 --- a/Gems/EMotionFX/Code/EMotionFX/emotionfx_files.cmake +++ b/Gems/EMotionFX/Code/EMotionFX/emotionfx_files.cmake @@ -350,6 +350,7 @@ set(FILES Source/MotionData/MotionData.h Source/MotionData/MotionDataFactory.cpp Source/MotionData/MotionDataFactory.h + Source/MotionData/MotionDataSampleSettings.h Source/MotionData/NonUniformMotionData.cpp Source/MotionData/NonUniformMotionData.h Source/MotionData/UniformMotionData.cpp