UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PerParticlePBDTetConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
6
7namespace Chaos::Softs
8{
9
10class UE_DEPRECATED(5.0, "Per particle constraint rules are no longer used by the cloth solver. Use Softs::FPBDTetConstraints instead.") FPerParticlePBDTetConstraints : public Softs::FPBDTetConstraintsBase
11{
12 typedef Softs::FPBDTetConstraintsBase Base;
13 using Base::Constraints;
14
15 public:
16 FPerParticlePBDTetConstraints(const FSolverParticles& InParticles, TArray<TVec4<int32>>&& InConstraints, const FSolverReal InStiffness = (FSolverReal)1.)
18 {
19 for (int32 i = 0; i < Constraints.Num(); ++i)
20 {
21 const TVec4<int32>& Constraint = Constraints[i];
22 int32 i1 = Constraint[0];
23 int32 i2 = Constraint[1];
24 int32 i3 = Constraint[2];
25 int32 i4 = Constraint[3];
26 if (i1 >= ParticleToConstraints.Num())
27 {
28 ParticleToConstraints.SetNum(i1 + 1);
29 }
30 if (i2 >= ParticleToConstraints.Num())
31 {
32 ParticleToConstraints.SetNum(i2 + 1);
33 }
34 if (i3 >= ParticleToConstraints.Num())
35 {
36 ParticleToConstraints.SetNum(i3 + 1);
37 }
38 if (i4 >= ParticleToConstraints.Num())
39 {
40 ParticleToConstraints.SetNum(i4 + 1);
41 }
46 }
47 }
48 virtual ~FPerParticlePBDTetConstraints() override
49 {
50 }
51
52 void Apply(FSolverParticles& InParticles, const FSolverReal Dt, const int32 Index) const
53 {
54 for (int i = 0; i < ParticleToConstraints[Index].Num(); ++i)
55 {
57 const TVec4<int32>& Constraint = Constraints[CIndex];
58 int32 i1 = Constraint[0];
59 int32 i2 = Constraint[1];
60 int32 i3 = Constraint[2];
61 int32 i4 = Constraint[3];
62 const TVec4<FSolverVec3> Grads = Base::GetGradients(InParticles, CIndex);
63 const FSolverReal S = Base::GetScalingFactor(InParticles, CIndex, Grads);
64 if (Index == i1)
65 {
66 InParticles.P(i1) -= S * InParticles.InvM(i1) * Grads[0];
67 }
68 else if (Index == i2)
69 {
70 InParticles.P(i2) -= S * InParticles.InvM(i2) * Grads[1];
71 }
72 else if (Index == i3)
73 {
74 InParticles.P(i3) -= S * InParticles.InvM(i3) * Grads[2];
75 }
76 else
77 {
78 check(Index == i4);
79 InParticles.P(i4) -= S * InParticles.InvM(i4) * Grads[3];
80 }
81 }
82 }
83
84 private:
86};
87
88} // End namespace Chaos::Softs
#define check(expr)
Definition AssertionMacros.h:314
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition Constraints.Build.cs:6
Definition Array.h:670
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition SolverBody.h:38
@ Apply
Definition NavigationModifier.h:49
U16 Index
Definition radfft.cpp:71