EMotion FX: Added helper to sample a pose from a motion without an motion instance (#6005)

Signed-off-by: Benjamin Jillich <jillich@amazon.com>
This commit is contained in:
Benjamin Jillich
2021-11-30 11:25:25 +01:00
committed by GitHub
parent abf3e69b97
commit 21cae1603a
9 changed files with 57 additions and 34 deletions
@@ -6,7 +6,6 @@
*
*/
// include the required headers
#include "EMotionFXConfig.h"
#include "Motion.h"
#include <MCore/Source/IDGenerator.h>
@@ -19,9 +18,9 @@
#include "EventHandler.h"
#include "MotionEventTable.h"
#include <EMotionFX/Source/Allocators.h>
#include <EMotionFX/Source/MotionData/MotionData.h>
#include <EMotionFX/Source/Node.h>
#include <EMotionFX/Source/TransformData.h>
#include <EMotionFX/Source/MotionData/MotionData.h>
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;
@@ -9,14 +9,13 @@
#pragma once
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <MCore/Source/StringIdPool.h>
#include <MCore/Source/Distance.h>
#include "EMotionFXConfig.h"
#include "EMotionFXManager.h"
#include "PlayBackInfo.h"
#include "BaseObject.h"
#include <MCore/Source/StringIdPool.h>
#include <MCore/Source/Distance.h>
#include <EMotionFX/Source/MotionData/MotionDataSampleSettings.h>
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.
@@ -9,18 +9,17 @@
#pragma once
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <EMotionFX/Source/Allocators.h>
#include <EMotionFX/Source/EMotionFXConfig.h>
#include <EMotionFX/Source/EventHandler.h>
#include <EMotionFX/Source/Transform.h>
#include <AzCore/Math/Quaternion.h>
#include <AzCore/Math/Vector3.h>
#include <AzCore/Memory/Memory.h>
#include <AzCore/RTTI/RTTI.h>
#include <AzCore/std/containers/vector.h>
#include <MCore/Source/Endian.h>
#include <EMotionFX/Source/Allocators.h>
#include <EMotionFX/Source/EMotionFXConfig.h>
#include <EMotionFX/Source/EventHandler.h>
#include <EMotionFX/Source/Transform.h>
#include <EMotionFX/Source/MotionData/MotionDataSampleSettings.h>
namespace MCore
{
@@ -109,16 +108,6 @@ namespace EMotionFX
using QuaternionKey = Key<AZ::Quaternion>;
using FloatKey = Key<float>;
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<size_t> 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;
@@ -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 <EMotionFX/Source/EMotionFXConfig.h>
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
@@ -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();
@@ -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;
@@ -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();
@@ -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;
@@ -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