UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDCollisionContainerSolver.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
10
11namespace Chaos
12{
13 class FPBDCollisionConstraint;
14 class FPBDCollisionConstraints;
15 class FSolverBody;
16 class FSolverBodyContainer;
17
23 {
24 public:
26
29
30 int32 NumSolvers() const { return NumCollisionSolvers; }
31
32 virtual void Reset(const int32 InMaxCollisions) override final;
33
34 virtual int32 GetNumConstraints() const override final { return CollisionConstraints.Num(); }
35
36 //
37 // IslandGroup API
38 //
39 virtual void AddConstraints() override final;
40 virtual void AddConstraints(const TArrayView<Private::FPBDIslandConstraint*>& ConstraintHandles) override final;
41 virtual void AddBodies(FSolverBodyContainer& SolverBodyContainer) override final;
42 virtual void GatherInput(const FReal Dt) override final;
43 virtual void GatherInput(const FReal Dt, const int32 BeginIndex, const int32 EndIndex) override final;
44 virtual void ScatterOutput(const FReal Dt) override final;
45 virtual void ScatterOutput(const FReal Dt, const int32 BeginIndex, const int32 EndIndex) override final;
46 virtual void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final;
47 virtual void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final;
48 virtual void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final;
49
50 // For testing
51 const Private::FPBDCollisionSolver& GetConstraintSolver(const int32 ConstraintIndex) const { return GetSolver(ConstraintIndex); }
52
53 private:
54 FPBDCollisionConstraint* GetConstraint(const int32 Index) { return CollisionConstraints[Index]; }
55 const FPBDCollisionConstraint* GetConstraint(const int32 Index) const { return CollisionConstraints[Index]; }
56 Private::FPBDCollisionSolver& GetSolver(const int32 Index) { check(Index < NumSolvers()); return CollisionSolvers[Index]; }
57 const Private::FPBDCollisionSolver& GetSolver(const int32 Index) const { check(Index < NumSolvers()); return CollisionSolvers[Index]; }
58
59 void CachePrefetchSolver(const int32 ConstraintIndex) const;
60 void AddConstraint(FPBDCollisionConstraint& Constraint);
61 size_t CalculateCollisionBufferSize(const size_t InTightFittingNum, const size_t InCurrentBufferNum) const;
62 int32 CalculateConstraintMaxManifoldPoints(const FPBDCollisionConstraint* Constraint) const;
63 void PrepareSolverBuffer();
64 void UpdatePositionShockPropagation(const FReal Dt, const int32 It, const int32 NumIts, const int32 BeginIndex, const int32 EndIndex, const FPBDCollisionSolverSettings& SolverSettings);
65 void UpdateVelocityShockPropagation(const FReal Dt, const int32 It, const int32 NumIts, const int32 BeginIndex, const int32 EndIndex, const FPBDCollisionSolverSettings& SolverSettings);
66 void ApplyShockPropagation(const FSolverReal ShockPropagation);
67 void SolvePositionImpl(const FReal Dt, const int32 It, const int32 NumIts, const int32 BeginIndex, const int32 EndIndex, const FPBDCollisionSolverSettings& SolverSettings);
68 void SolveVelocityImpl(const FReal Dt, const int32 It, const int32 NumIts, const int32 BeginIndex, const int32 EndIndex, const FPBDCollisionSolverSettings& SolverSettings);
69 void UpdateCollisions(const FReal InDt, const int32 BeginIndex, const int32 EndIndex);
70
71 // The constraints we are solving and the container to which they belong
72 const FPBDCollisionConstraints& ConstraintContainer;
73 TArray<FPBDCollisionConstraint*> CollisionConstraints;
74
75 // The last shock propagation factor we applied
76 FSolverReal AppliedShockPropagation;
77
78 // Buffer for all allocations for this tick (solvers and manifold points)
79 Private::FScratchBuffer Scratch;
80
81 // The start of the solver array in the scratch buffer
82 Private::FPBDCollisionSolver* CollisionSolvers;
83 int32 NumCollisionSolvers;
84
85 // The start of the manifold points array in the scratch buffer
86 Private::FPBDCollisionSolverManifoldPoint* CollisionSolverManifoldPoints;
87 int32 NumCollisionSolverManifoldPoints;
88 int32 MaxCollisionSolverManifoldPoints;
89
90 // Whether we need to run incremental collision for each constraint (LevelSets only now)
91 TArray<bool> bCollisionConstraintPerIterationCollisionDetection;
92 bool bPerIterationCollisionDetection;
93
94 };
95}
#define check(expr)
Definition AssertionMacros.h:314
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
Definition SolverConstraintContainer.h:29
A contact constraint.
Definition PBDCollisionConstraint.h:225
Definition PBDCollisionConstraints.h:49
Definition PBDCollisionContainerSolver.h:23
virtual void AddConstraints() override final
Definition PBDCollisionContainerSolver.cpp:529
int32 NumSolvers() const
Definition PBDCollisionContainerSolver.h:30
virtual void GatherInput(const FReal Dt) override final
Definition PBDCollisionContainerSolver.cpp:601
virtual void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
Definition PBDCollisionContainerSolver.cpp:687
UE_NONCOPYABLE(FPBDCollisionContainerSolver)
virtual void ScatterOutput(const FReal Dt) override final
Definition PBDCollisionContainerSolver.cpp:656
virtual void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
Definition PBDCollisionContainerSolver.cpp:697
virtual void AddBodies(FSolverBodyContainer &SolverBodyContainer) override final
Definition PBDCollisionContainerSolver.cpp:565
~FPBDCollisionContainerSolver()
Definition PBDCollisionContainerSolver.cpp:414
const Private::FPBDCollisionSolver & GetConstraintSolver(const int32 ConstraintIndex) const
Definition PBDCollisionContainerSolver.h:51
virtual int32 GetNumConstraints() const override final
Definition PBDCollisionContainerSolver.h:34
virtual void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
Definition PBDCollisionContainerSolver.cpp:692
Definition SolverBodyContainer.h:37
Definition ArrayView.h:139
Definition Array.h:670
Definition SkeletalMeshComponent.h:307
FRealDouble FReal
Definition Real.h:22
FRealSingle FSolverReal
Definition SolverBody.h:38
Definition OverriddenPropertySet.cpp:45
U16 Index
Definition radfft.cpp:71