diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/MotionGroup.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/MotionGroup.cpp index d3b74dd72f..c699e12a0c 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/MotionGroup.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/SceneAPIExt/Groups/MotionGroup.cpp @@ -16,9 +16,11 @@ #include #include #include +#include #include #include +#include #include namespace EMotionFX @@ -89,7 +91,7 @@ namespace EMotionFX serializeContext->Class()->Version(1); - serializeContext->Class()->Version(5, VersionConverter) + serializeContext->Class()->Version(6, VersionConverter) ->Field("name", &MotionGroup::m_name) ->Field("selectedRootBone", &MotionGroup::m_selectedRootBone) ->Field("id", &MotionGroup::m_id) @@ -225,6 +227,60 @@ namespace EMotionFX } } + // Motion meta data introduced (no more string- or object-based commands stored in the former meta data rule) + if (version < 6) + { + AZ::SerializeContext::DataElementNode* ruleContainerNode = classElement.FindSubElement(AZ_CRC("rules", 0x899a993c)); + if (!ruleContainerNode) + { + AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Can't find rule container.\n"); + return false; + } + + AZ::SerializeContext::DataElementNode* rulesNode = ruleContainerNode->FindSubElement(AZ_CRC("rules", 0x899a993c)); + if (!rulesNode) + { + AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Can't find rules within rule container.\n"); + return false; + } + + const int numRules = rulesNode->GetNumSubElements(); + for (int i = 0; i < numRules; ++i) + { + AZ::SerializeContext::DataElementNode& sharedPointerNode = rulesNode->GetSubElement(i); + if (sharedPointerNode.GetNumSubElements() == 1) + { + AZ::SerializeContext::DataElementNode& currentRuleNode = sharedPointerNode.GetSubElement(0); + if (currentRuleNode.GetId() == azrtti_typeid()) + { + // Read the old, command-based meta data rule and retrieve the command objects. + Rule::MetaDataRule oldMetaDataRule; + currentRuleNode.GetData(oldMetaDataRule); + const AZStd::vector& commands = oldMetaDataRule.GetMetaData&>(); + + // Apply the commands onto a temporary motion. + auto motion = new EMotionFX::Motion(""); + motion->SetMotionData(aznew EMotionFX::NonUniformMotionData()); + CommandSystem::MetaData::ApplyMetaDataOnMotion(motion, commands); + + // Construct the new motion meta data rule. + auto metaData = AZStd::make_shared(motion->GetMotionExtractionFlags(), motion->GetEventTable()); + auto metaDataRule = AZStd::make_shared(metaData); + + // Add the new motion meta data rule. + AZ::SceneAPI::Containers::RuleContainer ruleContainer; + ruleContainerNode->GetDataHierarchy(context, ruleContainer); + ruleContainer.RemoveRule(i); + ruleContainer.AddRule(metaDataRule); + ruleContainerNode->SetData(context, ruleContainer); + + motion->Destroy(); + break; + } + } + } + } + return result; } }