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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user