UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ChaosDeformableSolver.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Chaos/Core.h"
12#include "Chaos/TriangleMesh.h"
31#include "CoreMinimal.h"
33#include "Templates/UniquePtr.h"
34
35namespace Chaos::Softs
36{
38 {
39 friend class FGameThreadAccess;
41
42 public:
43
46
47 /* Physics Thread Access API */
49 {
50 public:
52 bool operator()() { return Solver != nullptr; }
53
54 /* Pre-Simulation Advance */
56
57 /* Simulation Advance */
59 CHAOS_API void Simulate(FSolverReal DeltaTime);
60 CHAOS_API void AdvanceDt(FSolverReal DeltaTime);
62 CHAOS_API void Update(FSolverReal DeltaTime);
66
67 /* Iteration Advance */
73
74 const FDeformableSolverProperties& GetProperties() const { return Solver->GetProperties(); }
75
76 FPBDEvolution* GetEvolution() { return Solver->Evolution.Get(); }
77 const FPBDEvolution* GetEvolution() const { return Solver->Evolution.Get(); }
78
80 const TArrayCollectionArray<const UObject*>& GetObjectsMap() const { return Solver->MObjects; }
81
82 /* Returns per-particle muscle activation: 0-1 for contractibles, -1 for non-contractibles */
84
85 private:
86 FDeformableSolver* Solver;
87 };
88
89
90 /* Game Thread Access API */
92 {
93 public:
95 bool operator()() { return Solver != nullptr; }
96
97 int32 GetFrame() const { return Solver->GetFrame(); }
98 CHAOS_API bool HasObject(UObject* InObject) const;
99 CHAOS_API void AddProxy(FThreadingProxy* InObject);
100 CHAOS_API void RemoveProxy(FThreadingProxy* InObject);
101 CHAOS_API void PushInputPackage(int32 Frame, FDeformableDataMap&& InPackage);
102 CHAOS_API void PushRestartPackage(int32 Frame, FDeformableDataMap&& InPackage);
105
107
108 private:
109 FDeformableSolver* Solver;
110 };
111
112 protected:
113
114 void SetEnableSolver(bool InbEnableSolver) {FScopeLock Lock(&SolverEnabledMutex); bEnableSolver = InbEnableSolver; }
115 bool GetEnableSolver() const { return bEnableSolver; }
116
117 /* Pre-Simulation Advance */
121
122 /* Simulation Advance */
123 int32 GetFrame() const { return Frame; }
125 CHAOS_API void Simulate(FSolverReal DeltaTime);
126 CHAOS_API void AdvanceDt(FSolverReal DeltaTime);
128 CHAOS_API void Update(FSolverReal DeltaTime);
134
135 /* Iteration Advance */
159
160 /*Debug Output*/
164 CHAOS_API void WriteTrisGEO(const FSolverParticles& Particles, const TArray<TVec3<int32>>& Mesh);
165
166 /*Game Thread API*/
167 bool HasObject(UObject* InObject) const { return InitializedObjects_External.Contains(InObject); }
168 CHAOS_API void AddProxy(FThreadingProxy* InObject);
169 CHAOS_API void RemoveProxy(FThreadingProxy* InObject);
171 CHAOS_API void PushInputPackage(int32 Frame, FDeformableDataMap&& InPackage);
173
174 const FDeformableSolverProperties& GetProperties() const { return Property; }
176
177 private:
178
179 // connections outside the solver.
180 static CHAOS_API FCriticalSection InitializationMutex; // @todo(flesh) : change to threaded commands to prevent the lock.
181 static CHAOS_API FCriticalSection RemovalMutex; // @todo(flesh) : change to threaded commands to prevent the lock.
182 static CHAOS_API FCriticalSection PackageOutputMutex;
183 static CHAOS_API FCriticalSection PackageInputMutex;
184 static CHAOS_API FCriticalSection PackageRestartMutex;
185 static CHAOS_API FCriticalSection SolverEnabledMutex;
186
187 TArray< FThreadingProxy* > RemovedProxys_Internal;
188 TArray< FThreadingProxy* > UninitializedProxys_Internal;
189 TArray< TUniquePtr<FDeformablePackage> > BufferedInputPackages;
190 TArray< TUniquePtr<FDeformablePackage> > BufferedOutputPackages;
191 TArray< TUniquePtr<FDeformablePackage> > BufferedRestartPackages;
192 TUniquePtr < FDeformablePackage > CurrentInputPackage;
193 TUniquePtr < FDeformablePackage > PreviousInputPackage;
194 TUniquePtr < FDeformablePackage > CurrentRestartPackage;
195 bool bPendingRestart = false;
196
197 TSet< const UObject* > InitializedObjects_External;
199
200 // User Configuration
202
203
204 // Simulation Variables
222 TUniquePtr <TArray<TVec3<int32>>> SurfaceElements;
223 TUniquePtr <TArray<TVec3<int32>>> TetmeshSurfaceElements;
225 TUniquePtr <FTriangleMesh> SurfaceTriangleMesh;
226 TUniquePtr <TArray<int32>> SurfaceCollisionVertices;
227 TUniquePtr <TArray<TArray<int32>>> AllIncidentElements;
228 TUniquePtr <TArray<TArray<int32>>> AllIncidentElementsLocal;
229 TUniquePtr <TArray<FSolverReal>> AllTetEMeshArray;
230 TUniquePtr <TArray<FSolverReal>> AllTetNuMeshArray;
231 TUniquePtr <TArray<FSolverReal>> AllTetAlphaJArray;
233 TUniquePtr <TArray<TArray<int32>>> AllSecondIndices;
235 TUniquePtr <TArray<FSolverReal>> AllSecondWeights;
236 TUniquePtr <TArray<TVec3<int32>>> AllUnconstrainedSurfaceElementsCorotatedCod; //correspond to the triangle mesh elements that are simulated using corotated cod
237 TUniquePtr <TArray<TVec3<int32>>> AllUnconstrainedSurfaceElementsSkin; //correspond to the triangle mesh elements that are simulated using linear cod constraints
238 TUniquePtr <TArray<FSolverReal>> AllCorotatedCodEMeshArray;
239 TUniquePtr <TArray<FSolverReal>> AllSkinEMeshArray;
240 TUniquePtr <TArray<int32>> ParticleComponentIndex;
241 TMap<int32, TSet<int32>> ParticleTriangleExclusionMap;
242 //Muscle Activation Variables
244 TMap<FThreadingProxy::FKey, int32> MuscleIndexOffset;
245
246 typedef TMap<int32, TTuple<float, float, FVector3f>> TransientConstraintBufferMap;
247 TransientConstraintBufferMap TransientConstraintBuffer;
248
249 bool bEnableSolver = true;
250 FSolverReal Time = 0.f;
251 int32 Frame = 0;
252 int32 Iteration = 0;
253 bool bSimulationInitialized = false;
254 int32 GroupOffset = 1;
255 TArray<TVector<int32, 2>, TInlineAllocator<8>> PrevEvolutionActiveRange;
256 bool bDynamicConstraintIsUpdated = false;
257 };
258
259
260}; // namesapce Chaos::Softs
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
Definition PhysicsSolverBase.h:236
Definition ChaosDeformableCollisionsProxy.h:68
Definition ChaosDeformableConstraintsProxy.h:75
Definition ChaosDeformableSolver.h:92
CHAOS_API void AddProxy(FThreadingProxy *InObject)
Definition ChaosDeformableSolverThreadingWrapper.cpp:144
CHAOS_API void PushRestartPackage(int32 Frame, FDeformableDataMap &&InPackage)
Definition ChaosDeformableSolverThreadingWrapper.cpp:98
int32 GetFrame() const
Definition ChaosDeformableSolver.h:97
CHAOS_API void RemoveProxy(FThreadingProxy *InObject)
Definition ChaosDeformableSolverThreadingWrapper.cpp:150
FGameThreadAccess(FDeformableSolver *InSolver, const FGameThreadAccessor &)
Definition ChaosDeformableSolver.h:94
CHAOS_API bool GetEnableSolver()
Definition ChaosDeformableSolverThreadingWrapper.cpp:162
CHAOS_API void PushInputPackage(int32 Frame, FDeformableDataMap &&InPackage)
Definition ChaosDeformableSolverThreadingWrapper.cpp:92
CHAOS_API TUniquePtr< FDeformablePackage > PullOutputPackage()
Definition ChaosDeformableSolverThreadingWrapper.cpp:137
CHAOS_API bool HasObject(UObject *InObject) const
Definition ChaosDeformableSolverThreadingWrapper.cpp:85
bool operator()()
Definition ChaosDeformableSolver.h:95
CHAOS_API void SetEnableSolver(bool InbEnableSolver)
Definition ChaosDeformableSolverThreadingWrapper.cpp:156
Definition ChaosDeformableSolver.h:49
bool operator()()
Definition ChaosDeformableSolver.h:52
CHAOS_API void InitializeKinematicConstraint()
Definition ChaosDeformableSolverThreadingWrapper.cpp:74
CHAOS_API void InitializeSimulationObject(FThreadingProxy &)
Definition ChaosDeformableSolverThreadingWrapper.cpp:68
CHAOS_API void AdvanceDt(FSolverReal DeltaTime)
Definition ChaosDeformableSolverThreadingWrapper.cpp:50
FPBDEvolution * GetEvolution()
Definition ChaosDeformableSolver.h:76
CHAOS_API void InitializeSelfCollisionVariables()
Definition ChaosDeformableSolverThreadingWrapper.cpp:79
CHAOS_API TUniquePtr< FDeformablePackage > PullInputPackage()
Definition ChaosDeformableSolverThreadingWrapper.cpp:106
CHAOS_API void UpdateOutputState(FThreadingProxy &)
Definition ChaosDeformableSolverThreadingWrapper.cpp:169
CHAOS_API void InitializeSimulationObjects()
Definition ChaosDeformableSolverThreadingWrapper.cpp:62
CHAOS_API void LoadRestartData()
Definition ChaosDeformableSolverThreadingWrapper.cpp:42
CHAOS_API void Simulate(FSolverReal DeltaTime)
Definition ChaosDeformableSolverThreadingWrapper.cpp:56
TArrayCollectionArray< const UObject * > & GetObjectsMap()
Definition ChaosDeformableSolver.h:79
const TArrayCollectionArray< const UObject * > & GetObjectsMap() const
Definition ChaosDeformableSolver.h:80
const FDeformableSolverProperties & GetProperties() const
Definition ChaosDeformableSolver.h:74
CHAOS_API void RemoveSimulationObjects()
Definition ChaosDeformableSolverThreadingWrapper.cpp:119
CHAOS_API TArray< float > GetParticleMuscleActivation()
Definition ChaosDeformableSolverThreadingWrapper.cpp:175
CHAOS_API void UpdateProxyInputPackages()
Definition ChaosDeformableSolverThreadingWrapper.cpp:113
FPhysicsThreadAccess(FDeformableSolver *InSolver, const FPhysicsThreadAccessor &)
Definition ChaosDeformableSolver.h:51
const FPBDEvolution * GetEvolution() const
Definition ChaosDeformableSolver.h:77
CHAOS_API void PushOutputPackage(int32 Frame, FDeformableDataMap &&Package)
Definition ChaosDeformableSolverThreadingWrapper.cpp:131
Definition ChaosDeformableSolver.h:38
CHAOS_API void UpdateConstraintBodies(FConstraintManagerProxy &Proxy, FThreadingProxy::FKey Owner, FSolverReal DeltaTime)
Definition ChaosDeformableSolver.cpp:875
CHAOS_API TArray< Chaos::TVec3< FSolverReal > > ComputeParticleTargets(const TArray< TArray< int32 > > &ParticleIndices)
bool HasObject(UObject *InObject) const
Definition ChaosDeformableSolver.h:167
CHAOS_API void InitializeMuscleActivationVariables()
Definition ChaosDeformableSolver.cpp:1929
CHAOS_API void InitializeSimulationSpace()
Definition ChaosDeformableSolver.cpp:372
CHAOS_API void InitializeSimulationObject(FThreadingProxy &)
Definition ChaosDeformableSolver.cpp:459
CHAOS_API void UpdateRestartParticlePositions()
Definition ChaosDeformableSolver.cpp:231
CHAOS_API void InitializeKinematicParticles(FFleshThreadingProxy &)
Definition ChaosDeformableSolver.cpp:609
CHAOS_API void AddProxy(FThreadingProxy *InObject)
Definition ChaosDeformableSolver.cpp:2332
CHAOS_API void InitializeGridBasedConstraintVariables()
Definition ChaosDeformableSolver.cpp:1646
CHAOS_API void RemoveProxy(FThreadingProxy *InObject)
Definition ChaosDeformableSolver.cpp:2341
CHAOS_API void UpdateTransientConstraints()
Definition ChaosDeformableSolver.cpp:277
void ResetGaussSeidelVariables()
Definition ChaosDeformableSolver.cpp:2031
CHAOS_API void InitializeConstraintBodies(FConstraintManagerProxy &Proxy)
Definition ChaosDeformableSolver.cpp:870
CHAOS_API void LoadRestartData()
Definition ChaosDeformableSolver.cpp:213
CHAOS_API TUniquePtr< FDeformablePackage > PullInputPackage()
Definition ChaosDeformableSolver.cpp:2243
CHAOS_API void InitializeKinematicConstraint()
Definition ChaosDeformableSolver.cpp:1345
CHAOS_API void InitializeWeakConstraint(FFleshThreadingProxy &)
Definition ChaosDeformableSolver.cpp:665
CHAOS_API void InitializeSelfCollisionVariables()
Definition ChaosDeformableSolver.cpp:1467
CHAOS_API void RemoveSimulationObjects()
Definition ChaosDeformableSolver.cpp:2051
virtual CHAOS_API ~FDeformableSolver()
Definition ChaosDeformableSolver.cpp:129
CHAOS_API void InitializeMuscleActivation(FFleshThreadingProxy &Proxy)
Definition ChaosDeformableSolver.cpp:2012
CHAOS_API void PostProcessTransientConstraints()
Definition ChaosDeformableSolver.cpp:357
CHAOS_API void AdvanceDt(FSolverReal DeltaTime)
Definition ChaosDeformableSolver.cpp:2137
CHAOS_API void InitializeGridBasedConstraints(FFleshThreadingProxy &)
Definition ChaosDeformableSolver.cpp:1276
CHAOS_API void InitializeGaussSeidelConstraintVariables()
Definition ChaosDeformableSolver.cpp:1673
CHAOS_API void InitializeSimulationObjects()
Definition ChaosDeformableSolver.cpp:394
CHAOS_API TUniquePtr< FDeformablePackage > PullOutputPackage()
Definition ChaosDeformableSolver.cpp:2323
CHAOS_API void PushOutputPackage(int32 Frame, FDeformableDataMap &&Package)
Definition ChaosDeformableSolver.cpp:2316
CHAOS_API void WriteFrame(FThreadingProxy &InProxy, const FSolverReal DeltaTime)
Definition ChaosDeformableSolver.cpp:2550
CHAOS_API void InitializeGaussSeidelConstraints(FFleshThreadingProxy &Proxy)
Definition ChaosDeformableSolver.cpp:1301
CHAOS_API void UpdateCollisionBodies(FCollisionManagerProxy &, FThreadingProxy::FKey, FSolverReal DeltaTime)
Definition ChaosDeformableSolver.cpp:776
CHAOS_API void PushInputPackage(int32 Frame, FDeformableDataMap &&InPackage)
Definition ChaosDeformableSolver.cpp:2234
CHAOS_API void InitializeDeformableParticles(FFleshThreadingProxy &)
Definition ChaosDeformableSolver.cpp:491
bool GetEnableSolver() const
Definition ChaosDeformableSolver.h:115
CHAOS_API void Simulate(FSolverReal DeltaTime)
Definition ChaosDeformableSolver.cpp:258
CHAOS_API void InitializeCollisionBodies(FCollisionManagerProxy &)
Definition ChaosDeformableSolver.cpp:771
CHAOS_API void WriteTrisGEO(const FSolverParticles &Particles, const TArray< TVec3< int32 > > &Mesh)
Definition ChaosDeformableSolver.cpp:2570
int32 GetFrame() const
Definition ChaosDeformableSolver.h:123
void SetEnableSolver(bool InbEnableSolver)
Definition ChaosDeformableSolver.h:114
CHAOS_API void UpdateProxyRestartPackages()
Definition ChaosDeformableSolver.cpp:221
CHAOS_API void UpdateProxyInputPackages()
Definition ChaosDeformableSolver.cpp:2275
const FDeformableSolverProperties & GetProperties() const
Definition ChaosDeformableSolver.h:174
CHAOS_API void UpdateSimulationObjects(FSolverReal DeltaTime)
Definition ChaosDeformableSolver.cpp:435
CHAOS_API void UpdateOutputState(FThreadingProxy &)
Definition ChaosDeformableSolver.cpp:2372
CHAOS_API void DebugDrawSimulationData()
Definition ChaosDeformableSolver.cpp:2414
CHAOS_API void DebugDrawTetrahedralParticles(FFleshThreadingProxy &Proxy)
Definition ChaosDeformableSolver.cpp:927
CHAOS_API TUniquePtr< FDeformablePackage > PullRestartPackage()
Definition ChaosDeformableSolver.cpp:2263
CHAOS_API void InitializeTetrahedralOrTriangleConstraint(FFleshThreadingProxy &)
Definition ChaosDeformableSolver.cpp:953
CHAOS_API void PushRestartPackage(int32 InFrame, FDeformableDataMap &&InPackage)
Definition ChaosDeformableSolver.cpp:2254
Definition ChaosDeformableSolverProxy.h:74
Definition ChaosDeformableSolverTypes.h:175
Definition PBDEvolution.h:19
Definition ChaosDeformableSolverTypes.h:188
Definition PBDSoftsSolverParticles.h:20
Definition ChaosDeformableSolverProxy.h:24
Definition ArrayCollectionArray.h:15
Definition Vector.h:1000
Definition ScopeLock.h:141
Definition Array.h:670
Definition ContainerAllocationPolicies.h:894
Definition UniquePtr.h:107
Definition Object.h:95
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
@ Update
Definition PendingSpatialData.h:19
Definition ChaosDeformableSolverTypes.h:17