Hi Dustin,
Here is the callstack.
`UnrealEditor-Engine.dll!UAnimSequence::ExtractRootTrackTransform_Lockless::__l2::<lambda_1>::operator()() Line 2218 C++
UnrealEditor-Engine.dll!UAnimSequence::ExtractRootTrackTransform_Lockless(const FAnimExtractContext & ExtractionContext, const FBoneContainer * RequiredBones) Line 2275 C++
UnrealEditor-Engine.dll!UAnimSequence::ExtractRootMotionFromRange(double StartTime, double EndTime, const FAnimExtractContext & ExtractionContext) Line 1608 C++
UnrealEditor-Engine.dll!UAnimSequence::ExtractRootMotion(const FAnimExtractContext & ExtractionContext) Line 1569 C++
*** Custom code calling eventually UAnimSequence::ExtractRootMotion ***
UnrealEditor-EDITORCUSTOMMODULE-Win64-DebugGame.dll!EDITORCUSTOMMODULE::OnObjectSaved(UObject * ObjectSaved, FObjectPreSaveContext Context) Line 528 C++
[External Code]
[Inline Frame] UnrealEditor-CoreUObject.dll!TMulticastDelegateBase::Broadcast(UObject *) Line 258 C++
[Inline Frame] UnrealEditor-CoreUObject.dll!TMulticastDelegate<void __cdecl(UObject *,FObjectPreSaveContext),FDefaultDelegateUserPolicy>::Broadcast(UObject *) Line 1080 C++
UnrealEditor-CoreUObject.dll!UObject::PreSave(FObjectPreSaveContext SaveContext) Line 1488 C++
UnrealEditor-CUSTOMMODULE-Win64-DebugGame.dll!CUSTOMDATAASSET::PreSave(FObjectPreSaveContext ObjectSaveContext) Line 301 C++
UnrealEditor-CoreUObject.dll!UE::SavePackageUtilities::CallPreSave(UObject * Object, FObjectSaveContextData & ObjectSaveContext) Line 682 C++
UnrealEditor-CoreUObject.dll!anonymous namespace'::RoutePresave(FSaveContext & SaveContext) Line 340 C++ UnrealEditor-CoreUObject.dll!UPackage::Save2(UPackage * InPackage, UObject * InAsset, const wchar_t * InFilename, const FSavePackageArgs & SaveArgs) Line 3791 C++ UnrealEditor-CoreUObject.dll!UPackage::Save(UPackage * InOuter, UObject * InAsset, const wchar_t * Filename, const FSavePackageArgs & SaveArgs) Line 20 C++ UnrealEditor-UnrealEd.dll!UEditorEngine::Save(UPackage * InOuter, UObject * InAsset, const wchar_t * Filename, const FSavePackageArgs & InSaveArgs) Line 4525 C++ UnrealEditor-UnrealEd.dll!UCookOnTheFlyServer::SaveCookedPackage(UE::Cook::FSaveCookedPackageContext & Context) Line 126 C++ UnrealEditor-UnrealEd.dll!UCookOnTheFlyServer::PumpRuntimeSaves(UE::Cook::FTickStackData & StackData, unsigned int DesiredQueueLength, int & OutNumPushed, bool & bOutBusy) Line 5163 C++ [Inline Frame] UnrealEditor-UnrealEd.dll!IsEngineExitRequested() Line 404 C++ UnrealEditor-UnrealEd.dll!UCookOnTheFlyServer::TickMainCookLoop(UE::Cook::FTickStackData & StackData) Line 1632 C++ UnrealEditor-UnrealEd.dll!UCookOnTheFlyServer::TickCookByTheBook(const float TimeSlice, ECookTickFlags TickFlags) Line 1512 C++ UnrealEditor-UnrealEd.dll!UCookCommandlet::RunCookByTheBookCook(UCookOnTheFlyServer * CookOnTheFlyServer, void * StartupOptionsAsVoid, ECookByTheBookOptions CookOptions) Line 598 C++ UnrealEditor-UnrealEd.dll!UCookCommandlet::CookByTheBook(const TArray<ITargetPlatform *,TSizedDefaultAllocator<32>> & Platforms) Line 550 C++ UnrealEditor-UnrealEd.dll!UCookCommandlet::Main(const FString & CmdLineParams) Line 269 C++ UnrealEditor-Win64-DebugGame.exe!FEngineLoop::PreInitPostStartupScreen(const wchar_t * CmdLine) Line 3904 C++ [Inline Frame] UnrealEditor-Win64-DebugGame.exe!FEngineLoop::PreInit(const wchar_t *) Line 4203 C++ [Inline Frame] UnrealEditor-Win64-DebugGame.exe!EnginePreInit(const wchar_t *) Line 40 C++ UnrealEditor-Win64-DebugGame.exe!GuardedMain(const wchar_t * CmdLine) Line 143 C++ UnrealEditor-Win64-DebugGame.exe!GuardedMainWrapper(const wchar_t * CmdLine) Line 128 C++ UnrealEditor-Win64-DebugGame.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) Line 282 C++ UnrealEditor-Win64-DebugGame.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) Line 339 C++ [External Code]
We have a custom DataAsset that contains AnimSequences on which we are calling ExtractRootMotion.
Since 5.6, I noticed PlatformCompressedData in UAnimSequence::ExtractRootTrackTransform_Lockless is empty but bValidCompressedData is set to true because of the check “CompressedTrackToSkeletonMapTable.Num() == 0” in FCompressedAnimSequence::IsBoneDataValid. This happens because my animation has bone tracks but no curve data. If my animation had curve data, bValidCompressedData would be set to false because the logic in FCompressedAnimSequence::IsCurveDataValid is correct.
UAnimSequence::ExtractRootTrackTransform_Lockless ends up returning the root bone from the default skeleton instead of the root bone from the raw data.
[Image Removed]
We have currently removed “CompressedTrackToSkeletonMapTable.Num() == 0” in FCompressedAnimSequence::IsBoneDataValid to temporarily fix this issue.
Let me know what do you think about it.
Thank you
Stéphane