From 44c813824e0f08a74988d1e27d763cc692be8090 Mon Sep 17 00:00:00 2001 From: Benjamin Jillich Date: Fri, 25 Jun 2021 16:18:12 +0200 Subject: [PATCH] [LYN-4727] Memory management improvements and clear ownership for motion meta data --- .../SceneAPIExt/Rules/MotionMetaDataRule.cpp | 38 +++++++++++++++++-- .../SceneAPIExt/Rules/MotionMetaDataRule.h | 22 +++++++---- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionMetaDataRule.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionMetaDataRule.cpp index f57e4ec268..2bd7e2a57e 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionMetaDataRule.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionMetaDataRule.cpp @@ -28,12 +28,44 @@ namespace EMotionFX::Pipeline::Rule ; } - MotionMetaDataRule::MotionMetaDataRule() - : ExternalToolRule() + MotionMetaData::MotionMetaData(EMotionFX::EMotionExtractionFlags extractionFlags, EMotionFX::MotionEventTable* eventTable) + : m_motionExtractionFlags(extractionFlags) + { + m_motionEventTable = CloneMotionEventTable(eventTable); + } + + MotionMetaData::MotionMetaData() + : m_motionExtractionFlags(static_cast(0)) { } - MotionMetaDataRule::MotionMetaDataRule(const MotionMetaData& data) + AZStd::unique_ptr MotionMetaData::GetClonedEventTable(EMotionFX::Motion* targetMotion) const + { + AZStd::unique_ptr clonedEventTable = AZStd::move(CloneMotionEventTable(m_motionEventTable.get())); + clonedEventTable->InitAfterLoading(targetMotion); + return AZStd::move(clonedEventTable); + } + + AZStd::unique_ptr MotionMetaData::CloneMotionEventTable(EMotionFX::MotionEventTable* sourceEventTable) + { + AZ::SerializeContext* serializeContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + if (!serializeContext) + { + AZ_Error("EMotionFX", false, "Cannot clone motion event table for motion meta data. Can't get serialize context from component application."); + return {}; + } + + AZStd::unique_ptr clonedEventTable(serializeContext->CloneObject(sourceEventTable)); + return AZStd::move(clonedEventTable); + } + + MotionMetaDataRule::MotionMetaDataRule() + : ExternalToolRule>() + { + } + + MotionMetaDataRule::MotionMetaDataRule(const AZStd::shared_ptr& data) : MotionMetaDataRule() { m_data = data; diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionMetaDataRule.h b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionMetaDataRule.h index 099451ff7e..8ede0e130f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionMetaDataRule.h +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Rules/MotionMetaDataRule.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include #include @@ -20,32 +21,39 @@ namespace EMotionFX::Pipeline::Rule AZ_RTTI(EMotionFX::Pipeline::Rule::MotionMetaData, "{A381A915-3CB3-4F60-82B3-70865CFA1F4F}"); AZ_CLASS_ALLOCATOR(MotionMetaData, AZ::SystemAllocator, 0) - MotionMetaData() = default; + MotionMetaData(); + MotionMetaData(EMotionFX::EMotionExtractionFlags extractionFlags, EMotionFX::MotionEventTable* eventTable); virtual ~MotionMetaData() = default; + EMotionFX::EMotionExtractionFlags GetMotionExtractionFlags() const { return m_motionExtractionFlags; } + AZStd::unique_ptr GetClonedEventTable(EMotionFX::Motion* targetMotion) const; + static void Reflect(AZ::ReflectContext* context); - EMotionFX::MotionEventTable* m_motionEventTable = nullptr; + private: + static AZStd::unique_ptr CloneMotionEventTable(EMotionFX::MotionEventTable* sourceEventTable); + EMotionFX::EMotionExtractionFlags m_motionExtractionFlags; + AZStd::unique_ptr m_motionEventTable; }; class MotionMetaDataRule - : public ExternalToolRule + : public ExternalToolRule> { public: AZ_RTTI(EMotionFX::Pipeline::Rule::MotionMetaDataRule, "{E68D0C3D-CBFF-4536-95C1-676474B351A5}", AZ::SceneAPI::DataTypes::IRule); AZ_CLASS_ALLOCATOR(MotionMetaDataRule, AZ::SystemAllocator, 0) MotionMetaDataRule(); - MotionMetaDataRule(const MotionMetaData& data); + MotionMetaDataRule(const AZStd::shared_ptr& data); ~MotionMetaDataRule() final = default; - const MotionMetaData& GetData() const override { return m_data; } - void SetData(const MotionMetaData& data) override { m_data = data; } + const AZStd::shared_ptr& GetData() const override { return m_data; } + void SetData(const AZStd::shared_ptr& data) override { m_data = data; } static void Reflect(AZ::ReflectContext* context); private: - MotionMetaData m_data; + AZStd::shared_ptr m_data; }; } // EMotionFX::Pipeline::Rule