UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDCollisionContainerSolverSimd.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
9
10namespace Chaos
11{
12 class FPBDCollisionConstraint;
13 class FPBDCollisionConstraints;
14 class FSolverBody;
15 class FSolverBodyContainer;
16
17 namespace Private
18 {
19 template<int TNumLanes>
21
29 {
30 public:
32
35
36 virtual void Reset(const int32 InMaxCollisions) override final;
37
38 virtual int32 GetNumConstraints() const override final { return NumConstraints; }
39
40 //
41 // IslandGroup API
42 //
43 virtual void AddConstraints() override final;
45 virtual void AddBodies(FSolverBodyContainer& SolverBodyContainer) override final;
46 virtual void GatherInput(const FReal Dt) override final;
47 virtual void GatherInput(const FReal Dt, const int32 BeginIndex, const int32 EndIndex) override final;
48 virtual void ScatterOutput(const FReal Dt) override final;
49 virtual void ScatterOutput(const FReal Dt, const int32 BeginIndex, const int32 EndIndex) override final;
50 virtual void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final;
51 virtual void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final;
52 virtual void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final;
53
54 // Rows of collision constraints and solvers.
55 // We solve each row using SIMD.
56 // NumLanes is the width of a row and will be the same as the float SIMD register width (or less).
57 template<int TNumLanes>
68
69 // Used to recover the solver for a constraint
70 // @todo(chaos): this is only really needed for debug validation
76
77 // For testing
78 const FConstraintSolverId& GetConstraintSolverId(const int32 ConstraintIndex) const { return ConstraintSolverIds[ConstraintIndex]; }
79 const TPBDCollisionSolverSimd<4>& GetConstraintSolver(const int32 SolverIndex) const { return SimdData.SimdSolvers[SolverIndex]; }
81
82 private:
83 int32 GetNumLanes() const { return 4; }
84 void CreateSolvers();
85 void UpdatePositionShockPropagation(const int32 It, const int32 NumIts, const FPBDCollisionSolverSettings& SolverSettings);
86 void UpdateVelocityShockPropagation(const int32 It, const int32 NumIts, const FPBDCollisionSolverSettings& SolverSettings);
87 void ApplyShockPropagation(const FSolverReal ShockPropagation);
88 void UpdateCollisions(const FSolverReal InDt);
89
90 const FPBDCollisionConstraints& ConstraintContainer;
91
92 FDataSimd<4> SimdData;
93 TArray<FConstraintSolverId> ConstraintSolverIds;
94 int32 NumConstraints;
95 FSolverReal AppliedShockPropagation;
96 bool bPerIterationCollisionDetection;
97 };
98
99 } // namespace Private
100} // namespace Chaos
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
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
Definition PBDCollisionConstraints.h:49
Settings to control the low-level collision solver behaviour.
Definition PBDCollisionSolverSettings.h:12
Definition SolverBodyContainer.h:37
Definition SolverBody.h:99
Definition PBDCollisionContainerSolverSimd.h:29
virtual void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
Definition PBDCollisionContainerSolverSimd.cpp:634
virtual void GatherInput(const FReal Dt) override final
Definition PBDCollisionContainerSolverSimd.cpp:470
virtual void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
Definition PBDCollisionContainerSolverSimd.cpp:553
virtual void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
Definition PBDCollisionContainerSolverSimd.cpp:601
TArrayView< const TPBDCollisionSolverManifoldPointsSimd< 4 > > GetManifoldPointBuffer() const
Definition PBDCollisionContainerSolverSimd.h:80
virtual void AddConstraints() override final
Definition PBDCollisionContainerSolverSimd.cpp:343
virtual void ScatterOutput(const FReal Dt) override final
Definition PBDCollisionContainerSolverSimd.cpp:518
const FConstraintSolverId & GetConstraintSolverId(const int32 ConstraintIndex) const
Definition PBDCollisionContainerSolverSimd.h:78
UE_NONCOPYABLE(FPBDCollisionContainerSolverSimd)
const TPBDCollisionSolverSimd< 4 > & GetConstraintSolver(const int32 SolverIndex) const
Definition PBDCollisionContainerSolverSimd.h:79
virtual int32 GetNumConstraints() const override final
Definition PBDCollisionContainerSolverSimd.h:38
~FPBDCollisionContainerSolverSimd()
Definition PBDCollisionContainerSolverSimd.cpp:323
virtual void AddBodies(FSolverBodyContainer &SolverBodyContainer) override final
Definition PBDCollisionContainerSolverSimd.cpp:448
Definition IslandManager.h:151
Definition PBDCollisionSolverSimd.h:232
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
Definition PBDCollisionContainerSolverSimd.h:72
int32 LaneIndex
Definition PBDCollisionContainerSolverSimd.h:74
int32 SolverIndex
Definition PBDCollisionContainerSolverSimd.h:73
Definition PBDCollisionContainerSolverSimd.h:59
TArray< TConstraintPtrSimd< TNumLanes > > SimdConstraints
Definition PBDCollisionContainerSolverSimd.h:64
TSimdInt32< TNumLanes > SimdNumConstraints
Definition PBDCollisionContainerSolverSimd.h:60
TArray< TPBDCollisionSolverSimd< TNumLanes > > SimdSolvers
Definition PBDCollisionContainerSolverSimd.h:62
TArray< TPBDCollisionSolverManifoldPointsSimd< TNumLanes > > SimdManifoldPoints
Definition PBDCollisionContainerSolverSimd.h:63
TArray< TSolverBodyPtrPairSimd< TNumLanes > > SimdSolverBodies
Definition PBDCollisionContainerSolverSimd.h:61
Definition SimdTypes.h:127
Definition SimdTypes.h:99