Enabling Override Instance Data to a LevelSequencerActor that has a Shot Track can lead to an Actor being translated really far, or even a crash in the engine.
The licensee has encountered a particular setup with a Level Sequencer and a Shot Track that, when manipulating an actor's position on both base track and shot track, while enabling OverrideInstanceData on the LevelSequencerActor, and also translating it, will move the Actor to unexpectedly far positions when compared to the expected end points.
While testing this out I've noticed that adding rotation or scale to TransformOrigin will usually result in the engine throwing EnsureErrors from bad Matrix multiplication.
I'll add both the call stack for the UpdateSubSequenceData() call and one of the crash callstacks I got while trying different rotations and scales.
Steps to Reproduce
Using the repro project:
The licensee has added a repro project and I strongly recommend using it
Open the SequencerLevel map,
Open the Level Sequence in the scene,
Play it
Verify the CubeActor be shot into the distance.
For manual reproduction:
Create a new level
Create a new level sequence, called 'OuterSequence'
Add cube to the level, name it 'Parent'
Add a sphere mesh component to it as a child (will call this 'Child')
Drag this cube into the OuterSequence as a possessable binding
Key the transform of the Parent cube
Add a binding to the Child mesh component
Key the transform of the Child mesh component
Create a new shot sequence within OuterSequence, named eg. InnerSequence
Drag this cube into the InnerSequence as a possessable binding
Key the transform of the Parent actor here too
Finally select the sequence player actor in the world outliner, and tick 'Override Instance Data'
Set a 'Transform Origin' of eg. (100, 100, 100)
Scrub the Outer sequence in sequencer and observe that the cube flies off into the distance
Mute the Child mesh transform track and observe this no longer occurs
Sometimes you need to adjust a key on the Child mesh transform track before it starts behaving weirdly (though can undo your actual value change and it'll still fly away)
Expected result: Cube Actor should end up at (X=120.000000,Y=210.000000,Z=360.000000)
Actual result: Cube Actor ends up at (X=49020.000000,Y=49110.000000,Z=49269.604151) - this position varies
To crash the engine, add rotation and scale to TransformOrigin on the LevelSequenceActor - this should trigger an EnsureError and a crash.
UpdateSubSequenceData() call:
> UnrealEditor-Sequencer.dll!FSequencer::UpdateSubSequenceData() Line 1554 C++
UnrealEditor-Sequencer.dll!FSequencer::Tick(float InDeltaTime) Line 1088 C++
[Inline Frame] UnrealEditor-UnrealEd.dll!FTickableEditorObject::TickObjects::__l2::<lambda_1>::operator()(FTickableObjectBase * TickableObject) Line 33 C++
[Inline Frame] UnrealEditor-UnrealEd.dll!Invoke(FTickableEditorObject::TickObjects::__l2::<lambda_1> &) Line 47 C++
UnrealEditor-UnrealEd.dll!?Call@?$TFunctionRefCaller@V<lambda_1>@?1??TickObjects@FTickableEditorObject@@SAXM@Z@XPEAVFTickableObjectBase@@@Function@Private@Core@UE@@SAXPEAXAEAPEAVFTickableObjectBase@@@Z(void * Obj, FTickableObjectBase * & <Params_0>) Line 315 C++
[Inline Frame] UnrealEditor-Engine.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::FFunctionRefStoragePolicy,void __cdecl(FTickableObjectBase *)>::operator()(FTickableObjectBase * <Params_0>) Line 470 C++
UnrealEditor-Engine.dll!FTickableObjectBase::SimpleTickObjects(FTickableObjectBase::FTickableStatics & Statics, TFunctionRef<void __cdecl(FTickableObjectBase *)> TickFunc) Line 112 C++
[Inline Frame] UnrealEditor-UnrealEd.dll!FTickableEditorObject::TickObjects(const float) Line 30 C++
UnrealEditor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 1898 C++
UnrealEditor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 550 C++
UnrealEditor.exe!FEngineLoop::Tick() Line 5877 C++
[Inline Frame] UnrealEditor.exe!EngineTick() Line 69 C++
UnrealEditor.exe!GuardedMain(const wchar_t * CmdLine) Line 188 C++
UnrealEditor.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) Line 266 C++
UnrealEditor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) Line 317 C++
[External Code]
-----------------------------------------------
Crash callstack if OverrideInstanceData contains rotation and scale:
UnrealEditor-Core.dll!CheckMatrixPrecision::__l2::<lambda>() Line 19 C++
> [Inline Frame] UnrealEditor-Core.dll!CheckMatrixPrecision(const UE::Math::TMatrix<double> &) Line 19 C++
UnrealEditor-Core.dll!FDFMatrix::MakeToRelativeWorldMatrixDouble(const UE::Math::TVector<double> Origin, const UE::Math::TMatrix<double> & ToWorld) Line 34 C++
UnrealEditor-Core.dll!FDFMatrix::MakeToRelativeWorldMatrix(const UE::Math::TVector<float> Origin, const UE::Math::TMatrix<double> & ToWorld) Line 39 C++
UnrealEditor-Renderer.dll!??R<lambda_1>@?CO@??UpdateDistanceFieldObjectBuffers@FDistanceFieldSceneData@@QEAAXAEAVFRDGBuilder@@AEAVFRDGExternalAccessQueue@@PEAVFScene@@AEAV?$TArray@VFDistanceFieldAssetMipId@@V?$TSizedDefaultAllocator@$0CA@@@@@AEAV?$TArray@VFSetElementId@@V?$TSizedDefaultAllocator@$0CA@@@@@@Z@QEBA@H@Z(int RangeIndex) Line 623 C++
[Inline Frame] UnrealEditor-Renderer.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::FFunctionRefStoragePolicy,void __cdecl(int)>::operator()(int <Params_0>) Line 470 C++
[Inline Frame] UnrealEditor-Renderer.dll!ParallelForImpl::CallBody(const TFunctionRef<void __cdecl(int)> &) Line 80 C++
UnrealEditor-Renderer.dll!??$ParallelForInternal@V?$TFunctionRef@$$A6AXH@Z@@V<lambda_1>@?1??ParallelFor@@YAXHV1@N1@Z@$$T@ParallelForImpl@@YAXPEB_WHHV?$TFunctionRef@$$A6AXH@Z@@V<lambda_1>@?1??ParallelFor@@YAXH1_N2@Z@W4EParallelForFlags@@AEBV?$TArrayView@$$TH@@@Z(const wchar_t * DebugName, int Num, int MinBatchSize, TFunctionRef<void __cdecl(int)> Body, ParallelFor::_l2::<lambda_1> CurrentThreadWorkToDoBeforeHelping, EParallelForFlags Flags, const TArrayView<std::nullptr_t,int> & Contexts) Line 143 C++
[Inline Frame] UnrealEditor-Renderer.dll!ParallelFor(int) Line 466 C++
UnrealEditor-Renderer.dll!FDistanceFieldSceneData::UpdateDistanceFieldObjectBuffers(FRDGBuilder & GraphBuilder, FRDGExternalAccessQueue & ExternalAccessQueue, FScene * Scene, TArray<FDistanceFieldAssetMipId,TSizedDefaultAllocator<32>> & DistanceFieldAssetAdds, TArray<FSetElementId,TSizedDefaultAllocator<32>> & DistanceFieldAssetRemoves) Line 585 C++
UnrealEditor-Renderer.dll!FSceneRenderer::PrepareDistanceFieldScene(FRDGBuilder & GraphBuilder, FRDGExternalAccessQueue & ExternalAccessQueue) Line 944 C++
UnrealEditor-Renderer.dll!FDeferredShadingSceneRenderer::Render(FRDGBuilder & GraphBuilder) Line 1490 C++
UnrealEditor-Renderer.dll!RenderViewFamilies_RenderThread(FRHICommandListImmediate & RHICmdList, const TArray<FSceneRenderer *,TSizedDefaultAllocator<32>> & SceneRenderers) Line 5431 C++
UnrealEditor-Renderer.dll!FRendererModule::BeginRenderingViewFamilies::__l96::<lambda_3>::operator()(FRHICommandListImmediate & RHICmdList) Line 5734 C++
[Inline Frame] UnrealEditor-RenderCore.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(FRHICommandListImmediate &)>::operator()(FRHICommandListImmediate &) Line 470 C++
UnrealEditor-RenderCore.dll!??R<lambda_1>@?4??EnqueueAndLaunch@FRenderThreadCommandPipe@@AEAAXPEB_WAEAIUTStatId@@$$QEAV?$TUniqueFunction@$$A6AXAEAVFRHICommandListImmediate@@@Z@@@Z@QEBA@XZ() Line 1541 C++
[Inline Frame] UnrealEditor-RenderCore.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(void)>::operator()() Line 470 C++
[Inline Frame] UnrealEditor-RenderCore.dll!TFunctionGraphTaskImpl<void __cdecl(void),1>::DoTaskImpl(TUniqueFunction<void __cdecl(void)> & Function, ENamedThreads::Type) Line 1710 C++
[Inline Frame] UnrealEditor-RenderCore.dll!TFunctionGraphTaskImpl<void __cdecl(void),1>::DoTask(ENamedThreads::Type) Line 1703 C++
UnrealEditor-RenderCore.dll!TGraphTask<TFunctionGraphTaskImpl<void __cdecl(void),1>>::ExecuteTask() Line 634 C++
UnrealEditor-Core.dll!UE::Tasks::Private::FTaskBase::TryExecuteTask() Line 504 C++
[Inline Frame] UnrealEditor-Core.dll!FBaseGraphTask::Execute(TArray<FBaseGraphTask *,TSizedDefaultAllocator<32>> &) Line 482 C++
UnrealEditor-Core.dll!FNamedTaskThread::ProcessTasksNamedThread(int QueueIndex, bool bAllowStall) Line 779 C++
UnrealEditor-Core.dll!FNamedTaskThread::ProcessTasksUntilQuit(int QueueIndex) Line 668 C++
UnrealEditor-RenderCore.dll!RenderingThreadMain(FEvent * TaskGraphBoundSyncEvent) Line 317 C++
UnrealEditor-RenderCore.dll!FRenderingThread::Run() Line 470 C++
UnrealEditor-Core.dll!FRunnableThreadWin::Run() Line 159 C++
UnrealEditor-Core.dll!FRunnableThreadWin::GuardedRun() Line 71 C++
[External Code]
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-256678 in the post.
0 |
Component | UE - Anim - Sequencer |
---|---|
Affects Versions | 5.5.4 |
Created | Mar 17, 2025 |
---|---|
Resolved | Mar 25, 2025 |
Updated | Mar 25, 2025 |