[LYN-4727] Memory management improvements and clear ownership for motion meta data
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user