[LYN-4727] Memory management improvements and clear ownership for motion meta data

This commit is contained in:
Benjamin Jillich
2021-06-25 16:18:12 +02:00
parent a462df2991
commit 44c813824e
2 changed files with 50 additions and 10 deletions
@@ -28,12 +28,44 @@ namespace EMotionFX::Pipeline::Rule
;
}
MotionMetaDataRule::MotionMetaDataRule()
: ExternalToolRule<MotionMetaData>()
MotionMetaData::MotionMetaData(EMotionFX::EMotionExtractionFlags extractionFlags, EMotionFX::MotionEventTable* eventTable)
: m_motionExtractionFlags(extractionFlags)
{
m_motionEventTable = CloneMotionEventTable(eventTable);
}
MotionMetaData::MotionMetaData()
: m_motionExtractionFlags(static_cast<EMotionFX::EMotionExtractionFlags>(0))
{
}
MotionMetaDataRule::MotionMetaDataRule(const MotionMetaData& data)
AZStd::unique_ptr<EMotionFX::MotionEventTable> MotionMetaData::GetClonedEventTable(EMotionFX::Motion* targetMotion) const
{
AZStd::unique_ptr<EMotionFX::MotionEventTable> clonedEventTable = AZStd::move(CloneMotionEventTable(m_motionEventTable.get()));
clonedEventTable->InitAfterLoading(targetMotion);
return AZStd::move(clonedEventTable);
}
AZStd::unique_ptr<EMotionFX::MotionEventTable> 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<EMotionFX::MotionEventTable> clonedEventTable(serializeContext->CloneObject<EMotionFX::MotionEventTable>(sourceEventTable));
return AZStd::move(clonedEventTable);
}
MotionMetaDataRule::MotionMetaDataRule()
: ExternalToolRule<AZStd::shared_ptr<MotionMetaData>>()
{
}
MotionMetaDataRule::MotionMetaDataRule(const AZStd::shared_ptr<MotionMetaData>& data)
: MotionMetaDataRule()
{
m_data = data;
@@ -8,6 +8,7 @@
#pragma once
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <EMotionFX/Source/MotionEventTable.h>
#include <SceneAPI/SceneCore/DataTypes/Rules/IRule.h>
#include <SceneAPI/SceneData/SceneDataConfiguration.h>
@@ -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<EMotionFX::MotionEventTable> GetClonedEventTable(EMotionFX::Motion* targetMotion) const;
static void Reflect(AZ::ReflectContext* context);
EMotionFX::MotionEventTable* m_motionEventTable = nullptr;
private:
static AZStd::unique_ptr<EMotionFX::MotionEventTable> CloneMotionEventTable(EMotionFX::MotionEventTable* sourceEventTable);
EMotionFX::EMotionExtractionFlags m_motionExtractionFlags;
AZStd::unique_ptr<EMotionFX::MotionEventTable> m_motionEventTable;
};
class MotionMetaDataRule
: public ExternalToolRule<MotionMetaData>
: public ExternalToolRule<AZStd::shared_ptr<MotionMetaData>>
{
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<MotionMetaData>& 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<MotionMetaData>& GetData() const override { return m_data; }
void SetData(const AZStd::shared_ptr<MotionMetaData>& data) override { m_data = data; }
static void Reflect(AZ::ReflectContext* context);
private:
MotionMetaData m_data;
AZStd::shared_ptr<MotionMetaData> m_data;
};
} // EMotionFX::Pipeline::Rule