Description

The Remove-On-Break (ROB) feature, set on Fracture Mode on Geometry Collections (GC), was supposed to make the particle shrink until it vanishes. When the GC goes to sleep the shrinking stops and shows strange behaviors depending on the structure of the GC as well as if it's under the influence of some types of fields.

Once the particle is broken from a cluster, the ROB automatically applies a visual animation of each particle shrinking until vanishing. Upon inspecting the broken GC using the Chaos Visual Debugger (CVD), I believe the shrinking only happens in the rendering side, as all physical representations remain unchanged in CVD, until the particle completely vanishes. That might also be why the rendered shrinking particles look like they are flying above the ground.

While testing I noticed that Particles that entered Sleep state would suffer from this issue, so I suggested the licensee some strategies to avoid it going into sleep, by either setting a Sleep Family to custom and Custom Sleep Threshold Multiplier to a small number or by console command:

p.Chaos.Solver.Sleep.Enabled false

It looks like the Sleep state is stopping the update to the rendering, although it does not stop the timers that make the particle be deleted entirely. I was not able to pinpoint the exact place where the issue occurs but I suspect it's somewhere around UGeometryCollectionComponent::OnPostPhysicsSync()

Steps to Reproduce

Remove on Break instructions:

  • Create a New Level using the Basic Template
  • Add a Cube blueprint to the level
  • Set scale to (1,4,1)
  • Select it and activate Fracture Mode (SHIFT+6)
  • Press New - save the new GC preferably in your project folder
  • Select Fracture>Slice
  • Slicing> X = 0, Y = 1, Z = 0
  • Press Fracture - that will split it in 2 and add one level
  • On Fracture Hierarchy select the first child and press Fracture so it further splits into 2, repeat for the second child - we end up with two levels of particles, 4 in total
  • Select a fracture level 1 and in Utilities go to Set Removal-On-Break Parameters
  • Set Remove On Break> Enabled = true; Cluster Crumbling = true
  • Set Post Break Timer to 0,0
  • Set Removal Timer to 10,10
  • Apply removal-on-break parameters
  • Repeat the process for the second level 1
  • After this is done, back in the level, select the GC and Enable Gravity
  • Move it up and let it fall down on the floor or in another static cube so it breaks on impact
  • Adjust the height so the impact breaks the cluster but there is enough time for it to go to sleep while still shrinking.
  • When the particle sleeps the shrinking will stop - this is the issue
  • After the Remove Time has passed the particle will vanish normally
Callstack

> UnrealEditor-GeometryCollectionEngine.dll!UGeometryCollectionComponent::OnPostPhysicsSync() Line 4360 C++
[Inline Frame] UnrealEditor-Chaos.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<0>,void __cdecl(void)>::operator()() Line 555 C++
UnrealEditor-Chaos.dll!FGeometryCollectionPhysicsProxy::PullFromPhysicsState(const Chaos::FDirtyGeometryCollectionData & PullData, const int SolverSyncTimestamp, const Chaos::FDirtyGeometryCollectionData * NextPullData, const float * Alpha, const Chaos::FDirtyRigidParticleReplicationErrorData * Error, const double AsyncFixedTimeStep) Line 4458 C++
UnrealEditor-Engine.dll!Chaos::FPhysicsSolverBase::PullPhysicsStateForEachDirtyProxy_External<`FPhysScene_Chaos::OnSyncBodies'::`2'::FDispatcher>(FPhysScene_Chaos::OnSyncBodies::__l2::FDispatcher & Dispatcher) Line 164 C++
[Inline Frame] UnrealEditor-Engine.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::FFunctionRefStoragePolicy,void __cdecl(FPhysScene_Chaos *)>::operator()(FPhysScene_Chaos * <Params_0>) Line 555 C++
UnrealEditor-Engine.dll!FPhysInterface_Chaos::ExecuteWrite(FPhysScene_Chaos * InScene, TFunctionRef<void __cdecl(FPhysScene_Chaos *)> InCallable) Line 630 C++
UnrealEditor-Engine.dll!FPhysScene_Chaos::OnSyncBodies(Chaos::FPhysicsSolverBase * Solver) Line 2417 C++
UnrealEditor-PhysicsCore.dll!FChaosScene::SyncBodies<Chaos::FPBDRigidsSolver>(Chaos::FPBDRigidsSolver * Solver) Line 459 C++
UnrealEditor-PhysicsCore.dll!`FChaosScene::EndFrame'::`65'::<lambda_1>::operator()<Chaos::FPBDRigidsSolver>(Chaos::FPBDRigidsSolver & Concrete) Line 559 C++
[Inline Frame] UnrealEditor-PhysicsCore.dll!Chaos::FPhysicsSolverBase::CastHelper(const FChaosScene::EndFrame::__l65::<lambda_1> &) Line 313 C++
UnrealEditor-PhysicsCore.dll!FChaosScene::EndFrame() Line 554 C++
[Inline Frame] UnrealEditor-Engine.dll!Invoke(void(UWorld::*)()) Line 66 C++
[Inline Frame] UnrealEditor-Engine.dll!UE::Core::Private::Tuple::TTupleBase<TIntegerSequence<unsigned int>>::ApplyAfter(void(UWorld::*)() &) Line 309 C++
UnrealEditor-Engine.dll!TBaseUObjectMethodDelegateInstance<0,UWorld,void __cdecl(void),FDefaultDelegateUserPolicy>::ExecuteIfSafe() Line 667 C++
[Inline Frame] UnrealEditor-Engine.dll!TDelegate<void __cdecl(void),FDefaultDelegateUserPolicy>::ExecuteIfBound() Line 570 C++
[Inline Frame] UnrealEditor-Engine.dll!FSimpleDelegateGraphTask::DoTask(ENamedThreads::Type) Line 1580 C++
UnrealEditor-Engine.dll!TGraphTask<FSimpleDelegateGraphTask>::ExecuteTask(TArray<FBaseGraphTask *,TSizedDefaultAllocator<32>> & NewTasks, ENamedThreads::Type CurrentThread, bool bDeleteOnCompletion) Line 1235 C++
[Inline Frame] UnrealEditor-Core.dll!FBaseGraphTask::Execute(TArray<FBaseGraphTask *,TSizedDefaultAllocator<32>> & CurrentThread, ENamedThreads::Type) Line 840 C++
UnrealEditor-Core.dll!FNamedTaskThread::ProcessTasksNamedThread(int QueueIndex, bool bAllowStall) Line 760 C++
UnrealEditor-Core.dll!FNamedTaskThread::ProcessTasksUntilQuit(int QueueIndex) Line 651 C++
[Inline Frame] UnrealEditor-Core.dll!FTaskGraphCompatibilityImplementation::ProcessThreadUntilRequestReturn(ENamedThreads::Type) Line 2068 C++
UnrealEditor-Core.dll!FTaskGraphCompatibilityImplementation::WaitUntilTasksComplete(const TArray<TRefCountPtr<FGraphEvent>,TSizedInlineAllocator<4,32,TSizedDefaultAllocator<32>>> & Tasks, ENamedThreads::Type CurrentThreadIfKnown) Line 2122 C++
UnrealEditor-Engine.dll!FTickTaskSequencer::ReleaseTickGroup(ETickingGroup WorldTickGroup, bool bBlockTillComplete) Line 556 C++
UnrealEditor-Engine.dll!FTickTaskManager::RunTickGroup(ETickingGroup Group, bool bBlockTillComplete) Line 1583 C++
UnrealEditor-Engine.dll!UWorld::RunTickGroup(ETickingGroup Group, bool bBlockTillComplete) Line 772 C++
UnrealEditor-Engine.dll!UWorld::Tick(ELevelTick TickType, float DeltaSeconds) Line 1521 C++
UnrealEditor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 2015 C++
UnrealEditor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 550 C++
UnrealEditor.exe!FEngineLoop::Tick() Line 5921 C++
[Inline Frame] UnrealEditor.exe!EngineTick() Line 61 C++
UnrealEditor.exe!GuardedMain(const wchar_t * CmdLine) Line 180 C++
UnrealEditor.exe!GuardedMainWrapper(const wchar_t * CmdLine) Line 118 C++
UnrealEditor.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) Line 258 C++
UnrealEditor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) Line 298 C++
[External Code]

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-227628 in the post.

0
Login to Vote

Unresolved
ComponentUE - Simulation - Physics - Destruction
Affects Versions5.4.4
Target Fix5.6
CreatedOct 15, 2024
UpdatedOct 18, 2024
View Jira Issue