UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDJointCachedSolverGaussSeidel.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "CoreMinimal.h"
5
6#include "Chaos/DenseMatrix.h"
11#include "Chaos/Utilities.h"
12
13namespace Chaos
14{
15
18{
24
26 void InitDatas(
27 const int32 ConstraintIndex,
28 const bool bHasSoftLimits,
29 const FReal SoftStiffness,
30 const FReal SoftDamping,
31 const FReal HardStiffness,
32 const bool bResetLambdas = true);
33
35 void SetMaxForce(
36 const int32 ConstraintIndex,
37 const FReal InMaxForce,
38 const FReal Dt);
39
41 void UpdateDatas(
42 const int32 ConstraintIndex,
43 const FVec3& DatasAxis,
44 const FReal DatasCX,
46 const bool bCheckLimit = true,
47 const FVec3& DatasArm0 = FVec3::Zero(),
48 const FVec3& DatasArm1 = FVec3::Zero(),
49 const FReal DatasVX = 0.0);
50
52 void UpdateMass(
53 const int32 ConstraintIndex,
54 const FVec3& DatasIA0,
55 const FVec3& DatasIA1,
56 const FReal DatasIM,
57 const FReal Dt,
58 const bool bUsePositionBasedDrives);
59
61 void ApplyMaxLambda(
62 const int32 ConstraintIndex,
64 FReal& Lambda);
65
66
67
88
103
104 union
105 {
108 };
109
114
117
132
133 inline bool GetValidDatas(int32 Index) const
134 {
135 switch (Index)
136 {
137 case 0: return bValidDatas0;
138 case 1: return bValidDatas1;
139 case 2: return bValidDatas2;
140 default: check(false); return false;
141 }
142 }
143
144 inline bool GetLimitsCheck(int32 Index) const
145 {
146 switch (Index)
147 {
148 case 0: return bLimitsCheck0;
149 case 1: return bLimitsCheck1;
150 case 2: return bLimitsCheck2;
151 default: check(false); return false;
152 }
153 }
154
155 inline bool GetSoftLimit(int32 Index) const
156 {
157 switch (Index)
158 {
159 case 0: return bSoftLimit0;
160 case 1: return bSoftLimit1;
161 case 2: return bSoftLimit2;
162 default: check(false); return false;
163 }
164 }
165
167 {
168 switch (Index)
169 {
170 case 0: return EJointMotionType(MotionType0);
171 case 1: return EJointMotionType(MotionType1);
172 case 2: return EJointMotionType(MotionType2);
173 default: check(false); return EJointMotionType();
174 }
175 }
176
177 inline void SetValidDatas(int32 Index, bool bValue)
178 {
179 switch (Index)
180 {
181 case 0: bValidDatas0 = bValue; break;
182 case 1: bValidDatas1 = bValue; break;
183 case 2: bValidDatas2 = bValue; break;
184 default: check(false);
185 }
186 }
187
188 inline void SetLimitsCheck(int32 Index, bool bValue)
189 {
190 switch (Index)
191 {
192 case 0: bLimitsCheck0 = bValue; break;
193 case 1: bLimitsCheck1 = bValue; break;
194 case 2: bLimitsCheck2 = bValue; break;
195 default: check(false);
196 }
197 }
198
199 inline void SetSoftLimit(int32 Index, bool bValue)
200 {
201 switch (Index)
202 {
203 case 0: bSoftLimit0 = bValue; break;
204 case 1: bSoftLimit1 = bValue; break;
205 case 2: bSoftLimit2 = bValue; break;
206 default: check(false);
207 }
208 }
209
211 {
212 check(int32(Value) <= 3); // Stored only on 2 bits
213 switch (Index)
214 {
215 case 0: MotionType0 = uint8(Value); break;
216 case 1: MotionType1 = uint8(Value); break;
217 case 2: MotionType2 = uint8(Value); break;
218 default: check(false);
219 }
220 }
221
222};
223
233 {
234 public:
235 static const int32 MaxConstrainedBodies = 2;
236
237 // Access to the SolverBodies that the constraint is operating on.
238 // \note SolverBodies are transient and exist only as long as we are in the Island's constraint solver loop
240 {
241 check((BodyIndex >= 0) && (BodyIndex < 2));
242 check(SolverBodies[BodyIndex].IsValid());
243
244 return SolverBodies[BodyIndex];
245 }
246
247 inline const FConstraintSolverBody& Body(int32 BodyIndex) const
248 {
249 check((BodyIndex >= 0) && (BodyIndex < 2));
250 check(SolverBodies[BodyIndex].IsValid());
251
252 return SolverBodies[BodyIndex];
253 }
254
256 {
257 return SolverBodies[0];
258 }
259
260 inline const FConstraintSolverBody& Body0() const
261 {
262 return SolverBodies[0];
263 }
264
266 {
267 return SolverBodies[1];
268 }
269
270 inline const FConstraintSolverBody& Body1() const
271 {
272 return SolverBodies[1];
273 }
274
275 inline const FVec3 X(int BodyIndex) const
276 {
277 return Body(BodyIndex).X();
278 }
279
280 inline const FRotation3 R(int BodyIndex) const
281 {
282 return Body(BodyIndex).R();
283 }
284
285 inline const FVec3 P(int BodyIndex) const
286 {
287 // NOTE: Joints always use the latest post-correction position and rotation. This makes the joint error calculations non-linear and more robust against explosion
288 // but adds a cost because we need to apply the latest correction each time we request the latest transform
289 return Body(BodyIndex).CorrectedP();
290 }
291
292 inline const FRotation3 Q(int BodyIndex) const
293 {
294 // NOTE: Joints always use the latest post-correction position and rotation. This makes the joint error calculations non-linear and more robust against explosion
295 // but adds a cost because we need to apply the latest correction each time we request the latest transform
296 return Body(BodyIndex).CorrectedQ();
297 }
298
299 inline const FVec3 V(int BodyIndex) const
300 {
301 return Body(BodyIndex).V();
302 }
303
304 inline const FVec3 W(int BodyIndex) const
305 {
306 return Body(BodyIndex).W();
307 }
308
309 inline FReal InvM(int32 BodyIndex) const
310 {
311 return InvMs[BodyIndex];
312 }
313
314 inline FMatrix33 InvI(int32 BodyIndex) const
315 {
316 return InvIs[BodyIndex];
317 }
318
319 inline bool IsDynamic(int32 BodyIndex) const
320 {
321 return (InvM(BodyIndex) > 0);
322 }
323
324 // NOTE: This is a positional impulse
326 {
327 FVec3 Impulse = FVec3(0);
328 if (PositionConstraints.bUseSimd || PositionDrives.bUseSimd)
329 {
331 if (PositionConstraints.bUseSimd)
332 {
334 ConstraintLambdas[0] = VectorReplicate(PositionConstraints.Simd.ConstraintLambda, 0);
335 ConstraintLambdas[1] = VectorReplicate(PositionConstraints.Simd.ConstraintLambda, 1);
336 ConstraintLambdas[2] = VectorReplicate(PositionConstraints.Simd.ConstraintLambda, 2);
337 for (int32 Axis = 0; Axis < 3; ++Axis)
338 {
340 }
341 }
342 if (PositionDrives.bUseSimd)
343 {
348 for (int32 Axis = 0; Axis < 3; ++Axis)
349 {
351 }
352 }
356 }
357
358 for (int32 Axis = 0; Axis < 3; ++Axis)
359 {
360 if (!PositionConstraints.bUseSimd && PositionConstraints.GetValidDatas(Axis))
361 {
362 Impulse += PositionConstraints.Data.ConstraintLambda[Axis] * PositionConstraints.Data.ConstraintAxis[Axis];
363 }
364 if (!PositionDrives.bUseSimd && PositionDrives.GetValidDatas(Axis))
365 {
366 Impulse += PositionDrives.Data.ConstraintLambda[Axis] * PositionDrives.Data.ConstraintAxis[Axis];
367 }
368 }
369 return Impulse;
370 }
371
372 // NOTE: This is a positional impulse
374 {
375 FVec3 Impulse = FVec3(0);
376 if (RotationConstraints.bUseSimd || RotationDrives.bUseSimd)
377 {
379 if (RotationConstraints.bUseSimd)
380 {
382 ConstraintLambdas[0] = VectorReplicate(RotationConstraints.Simd.ConstraintLambda, 0);
383 ConstraintLambdas[1] = VectorReplicate(RotationConstraints.Simd.ConstraintLambda, 1);
384 ConstraintLambdas[2] = VectorReplicate(RotationConstraints.Simd.ConstraintLambda, 2);
385 for (int32 Axis = 0; Axis < 3; ++Axis)
386 {
388 }
389 }
390 if (RotationDrives.bUseSimd)
391 {
396 for (int32 Axis = 0; Axis < 3; ++Axis)
397 {
399 }
400 }
404 }
405
406 for (int32 Axis = 0; Axis < 3; ++Axis)
407 {
408 if (!RotationConstraints.bUseSimd && RotationConstraints.GetValidDatas(Axis))
409 {
410 Impulse += RotationConstraints.Data.ConstraintLambda[Axis] * RotationConstraints.Data.ConstraintAxis[Axis];
411 }
412 if (!RotationDrives.bUseSimd && RotationDrives.GetValidDatas(Axis))
413 {
414 Impulse += RotationDrives.Data.ConstraintLambda[Axis] * RotationDrives.Data.ConstraintAxis[Axis];
415 }
416 }
417 return Impulse;
418 }
419
421 {
422 return -1.f;
423 }
424
426 {
427 return -1.f;
428 }
429
431 {
432 // We use -1 as unitialized, but that should not be exposed outside the solver
433 return FMath::Max(NumActiveConstraints, 0);
434 }
435
436 inline bool GetIsActive() const
437 {
438 return bIsActive;
439 }
440
444
445 void SetSolverBodies(FSolverBody* SolverBody0, FSolverBody* SolverBody1)
446 {
447 SolverBodies[0] = *SolverBody0;
448 SolverBodies[1] = *SolverBody1;
449 }
450
451 // Called once per frame to initialize the joint solver from the joint settings
452 void Init(
453 const FReal Dt,
454 const FPBDJointSolverSettings& SolverSettings,
455 const FPBDJointSettings& JointSettings,
456 const FRigidTransform3& XL0,
457 const FRigidTransform3& XL1);
458
459 void InitProjection(
460 const FReal Dt,
461 const FPBDJointSolverSettings& SolverSettings,
462 const FPBDJointSettings& JointSettings);
463
464 void Deinit();
465
466 // @todo(chaos): this doesn't do much now we have SolverBodies - remove it
467 void Update(
468 const FReal Dt,
469 const FPBDJointSolverSettings& SolverSettings,
470 const FPBDJointSettings& JointSettings);
471
472 // Run the position solve for the constraints
473 void ApplyConstraints(
474 const FReal Dt,
476 const FPBDJointSolverSettings& SolverSettings,
477 const FPBDJointSettings& JointSettings);
478
479 // Run the velocity solve for the constraints
481 const FReal Dt,
483 const FPBDJointSolverSettings& SolverSettings,
484 const FPBDJointSettings& JointSettings);
485
486 // Apply projection (a position solve where the parent has infinite mass) for the constraints
487 // @todo(chaos): this can be build into the Apply phase when the whole solver is PBD
488 void ApplyProjections(
489 const FReal Dt,
490 const FPBDJointSolverSettings& SolverSettings,
491 const FPBDJointSettings& JointSettings,
492 const bool bLastIteration);
493
495 const FReal Dt,
496 const FPBDJointSolverSettings& SolverSettings,
497 const FPBDJointSettings& JointSettings);
498
500 const FReal LinearProjection,
501 const int32 ConstraintIndex);
502
504 const FReal LinearProjection);
505
507 const FReal Dt,
508 const FPBDJointSolverSettings& SolverSettings,
509 const FPBDJointSettings& JointSettings);
510
512 const FReal AngularProjection,
513 const bool bLinearLocked,
514 const int32 ConstraintIndex);
515
517 const FRealSingle AngularProjection,
518 const bool bLinearLocked);
519
520 void ApplyTeleports(
521 const FReal Dt,
522 const FPBDJointSolverSettings& SolverSettings,
523 const FPBDJointSettings& JointSettings);
524
526 const FReal Dt,
527 const FPBDJointSolverSettings& SolverSettings,
528 const FPBDJointSettings& JointSettings);
529
531 const FReal TeleportDistance,
532 const int32 ConstraintIndex);
533
535 const FRealSingle TeleportDistance);
536
538 const FReal Dt,
539 const FPBDJointSolverSettings& SolverSettings,
540 const FPBDJointSettings& JointSettings);
541
543 const FReal InvMScale0,
544 const FReal InvMScale1,
545 const FReal Dt);
546
547 void SetIsBroken(const bool bInIsBroken)
548 {
549 bIsBroken = bInIsBroken;
550 }
551
552 bool IsBroken() const
553 {
554 return bIsBroken;
555 }
556
558 {
559 bIsViolating = bInIsViolating;
560 }
561
562 bool IsViolating() const
563 {
564 return bIsViolating;
565 }
566
567 bool RequiresSolve() const
568 {
569 return !IsBroken() && (IsDynamic(0) || IsDynamic(1));
570 }
571
572 private:
573
574 // Initialize state dependent on particle positions
575 void InitDerivedState();
576
577 // Update state dependent on particle positions (after moving one or both of them)
578 void UpdateDerivedState(const int32 BodyIndex);
579 void UpdateDerivedState();
580
581 void UpdateMass0(const FReal& InInvM, const FVec3& InInvIL);
582 void UpdateMass1(const FReal& InInvM, const FVec3& InInvIL);
583
584 // Check to see if this constraint still needs further solved
585 // @todo(chaos): the term "active" is used inconsistently with the meaning elsewhere. Active should
586 // mean "contributed impusles". Should use "solved" rather than "active"
587 bool UpdateIsActive();
588
591 void ApplyPositionDelta(
592 const int32 BodyIndex,
593 const FVec3& DP);
594
595 void ApplyRotationDelta(
596 const int32 BodyIndex,
597 const FVec3& DR);
598
601 void InitPositionConstraints(
602 const FReal Dt,
603 const FPBDJointSolverSettings& SolverSettings,
604 const FPBDJointSettings& JointSettings,
605 const bool bResetLambdas);
606
607 void InitPositionDatasMass(
609 const int32 ConstraintIndex,
610 const FReal Dt);
611
612 void InitPositionConstraintDatas(
613 const int32 ConstraintIndex,
614 const FVec3& ConstraintAxis,
615 const FReal& ConstraintDelta,
616 const FReal ConstraintRestitution,
617 const FReal Dt,
620 const FVec3& ConstraintArm0,
621 const FVec3& ConstraintArm1);
622
623 void InitLockedPositionConstraint(
624 const FPBDJointSettings& JointSettings,
625 const FReal Dt,
627
628 void InitLockedPositionConstraintSimd(
629 const FPBDJointSettings& JointSettings,
630 const FReal Dt,
632
633 void InitSphericalPositionConstraint(
634 const FPBDJointSettings& JointSettings,
635 const FReal Dt);
636
637 void InitCylindricalPositionConstraint(
638 const FPBDJointSettings& JointSettings,
639 const FReal Dt,
640 const int32 AxisIndex);
641
642 void InitPlanarPositionConstraint(
643 const FPBDJointSettings& JointSettings,
644 const FReal Dt,
645 const int32 AxisIndex);
646
649 void ApplyPositionConstraints(
650 const FReal Dt);
651
652 void ApplyAxisPositionConstraint(
653 const int32 ConstraintIndex,
654 const FReal Dt);
655
656 void ApplyPositionConstraintsSimd(
657 const FReal Dt);
658
659 void SolvePositionConstraintDelta(
660 const int32 ConstraintIndex,
661 const FReal DeltaLambda,
663
664 void SolvePositionConstraintHard(
665 const int32 ConstraintIndex,
666 const FReal DeltaConstraint);
667
668 void SolvePositionConstraintSoft(
669 const int32 ConstraintIndex,
671 const FReal Dt,
672 const FReal TargetVel);
673
676 void ApplyLinearVelocityConstraints();
677
678 void ApplyAxisVelocityConstraint(
679 const int32 ConstraintIndex);
680
681 void ApplyVelocityConstraintSimd();
682
683 void SolveLinearVelocityConstraint(
684 const int32 ConstraintIndex,
685 const FReal TargetVel);
686
689 void InitRotationConstraints(
690 const FReal Dt,
691 const FPBDJointSolverSettings& SolverSettings,
692 const FPBDJointSettings& JointSettings,
693 const bool bResetLambdas);
694
695 void InitRotationConstraintsSimd(
696 const FPBDJointSettings& JointSettings,
697 const FRealSingle Dt);
698
699 void CorrectAxisAngleConstraint(
700 const FPBDJointSettings& JointSettings,
701 const int32 ConstraintIndex,
702 FVec3& ConstraintAxis,
703 FReal& ConstraintAngle) const;
704
705 void InitRotationConstraintDatas(
706 const FPBDJointSettings& JointSettings,
707 const int32 ConstraintIndex,
708 const FVec3& ConstraintAxis,
710 const FReal ConstraintRestitution,
711 const FReal Dt,
712 const bool bCheckLimit);
713
714 void InitRotationDatasMass(
716 const int32 ConstraintIndex,
717 const FReal Dt);
718
719 void InitTwistConstraint(
720 const FPBDJointSettings& JointSettings,
721 const FReal Dt);
722
723 void InitConeConstraint(
724 const FPBDJointSettings& JointSettings,
725 const FReal Dt);
726
727 void InitPyramidSwingConstraint(
728 const FPBDJointSettings& JointSettings,
729 const FReal Dt,
730 const bool bApplySwing1,
731 const bool bApplySwing2);
732
733 // One Swing axis is free, and the other locked. This applies the lock: Body1 Twist axis is confined to a plane.
734 void InitSingleLockedSwingConstraint(
735 const FPBDJointSettings& JointSettings,
736 const FReal Dt,
738
739 // One Swing axis is free, and the other limited. This applies the limit: Body1 Twist axis is confined to space between two cones.
740 void InitDualConeSwingConstraint(
741 const FPBDJointSettings& JointSettings,
742 const FReal Dt,
744
745 // One swing axis is locked, the other limited or locked. This applies the Limited axis (ApplyDualConeSwingConstraint is used for the locked axis).
746 void InitSwingConstraint(
747 const FPBDJointSettings& JointSettings,
748 const FPBDJointSolverSettings& SolverSettings,
749 const FReal Dt,
751
752 void InitLockedRotationConstraints(
753 const FPBDJointSettings& JointSettings,
754 const FReal Dt,
755 const bool bApplyTwist,
756 const bool bApplySwing1,
757 const bool bApplySwing2);
758
761 void ApplyRotationConstraints(
762 const FReal Dt);
763
764 void ApplyRotationConstraint(
765 const int32 ConstraintIndex,
766 const FReal Dt);
767
768 void ApplyRotationSoftConstraintsSimd(
769 const FReal Dt);
770
771 void SolveRotationConstraintDelta(
772 const int32 ConstraintIndex,
773 const FReal DeltaLambda,
774 const bool bIsSoftConstraint,
776
777 void SolveRotationConstraintHard(
778 const int32 ConstraintIndex,
779 const FReal DeltaConstraint);
780
781 void SolveRotationConstraintSoft(
782 const int32 ConstraintIndex,
784 const FReal Dt,
785 const FReal TargetVel);
786
789 void ApplyAngularVelocityConstraints();
790
791 void SolveAngularVelocityConstraint(
792 const int32 ConstraintIndex,
793 const FReal TargetVel);
794
795 void ApplyAngularVelocityConstraint(
796 const int32 ConstraintIndex);
797
798 void ApplyAngularVelocityConstraintSimd();
799
802 void InitPositionDrives(
803 const FReal Dt,
804 const FPBDJointSolverSettings& SolverSettings,
805 const FPBDJointSettings& JointSettings);
806
807 void InitAxisPositionDrive(
808 const int32 ConstraintIndex,
809 const FVec3& ConstraintAxis,
810 const FVec3& DeltaPosition,
811 const FVec3& DeltaVelocity,
812 const FReal Dt);
813
816 void ApplyPositionDrives(
817 const FReal Dt);
818
819 void ApplyAxisPositionDrive(
820 const int32 ConstraintIndex,
821 const FReal Dt);
822
823 void ApplyPositionVelocityDrives(
824 const FReal Dt);
825
826 void ApplyAxisPositionVelocityDrive(
827 const int32 ConstraintIndex,
828 const FReal Dt);
829
832 void InitRotationDrives(
833 const FReal Dt,
834 const FPBDJointSolverSettings& SolverSettings,
835 const FPBDJointSettings& JointSettings);
836
837 void InitRotationConstraintDrive(
838 const int32 ConstraintIndex,
839 const FVec3& ConstraintAxis,
840 const FReal Dt,
841 const FReal DeltaAngle);
842
843 void InitRotationConstraintDriveSimd(
845 const FRealSingle Dt,
846 const FVec3 DeltaAngles);
847
848 void InitSwingTwistDrives(
849 const FReal Dt,
850 const FPBDJointSolverSettings& SolverSettings,
851 const FPBDJointSettings& JointSettings,
852 const bool bTwistDriveEnabled,
853 const bool bSwing1DriveEnabled,
854 const bool bSwing2DriveEnabled);
855
856 void InitSLerpDrive(
857 const FReal Dt,
858 const FPBDJointSolverSettings& SolverSettings,
859 const FPBDJointSettings& JointSettings);
860
863 void ApplyRotationDrives(
864 const FReal Dt);
865
866 void ApplyAxisRotationDrive(
867 const int32 ConstraintIndex,
868 const FReal Dt);
869
870 void ApplyRotationDrivesSimd(
871 const FReal Dt);
872
873 void ApplyRotationVelocityDrives(
874 const FReal Dt);
875
876 void ApplyAxisRotationVelocityDrive(
877 const int32 ConstraintIndex,
878 const FReal Dt);
879
880 void SetInitConstraintVelocity(
881 const FVec3& ConstraintArm0,
882 const FVec3& ConstraintArm1);
883
884
885 // The cached body state on which the joint operates
887
888 // Local-space constraint settings
889 FRigidTransform3 LocalConnectorXs[MaxConstrainedBodies]; // Local(CoM)-space joint connector transforms
890
891 // World-space constraint settings
892 FVec3 ConnectorXs[MaxConstrainedBodies]; // World-space joint connector positions
893 FRotation3 ConnectorRs[MaxConstrainedBodies]; // World-space joint connector rotations
894 FVec3 ConnectorWDts[MaxConstrainedBodies]; // World-space joint connector angular velocities * dt
895 VectorRegister4Float ConnectorWDtsSimd[MaxConstrainedBodies]; // World-space joint connector angular velocities * dt
896
897 // XPBD Initial iteration world-space body state
898 FVec3 InitConnectorXs[MaxConstrainedBodies]; // World-space joint connector positions
899 FRotation3 InitConnectorRs[MaxConstrainedBodies]; // World-space joint connector rotations
900 FVec3 InitConstraintVelocity; // Initial relative velocity at the constrained position
901
902 // Inverse Mass and Inertia
904 FMatrix33 InvIs[MaxConstrainedBodies]; // World-space
905
906 // Solver stiffness - increased over iterations for stability
907 // \todo(chaos): remove Stiffness from SolverSettings (because it is not a solver constant)
908 FReal SolverStiffness;
909
910 // Tolerances below which we stop solving
911 FReal PositionTolerance; // Distance error below which we consider a constraint or drive solved
912 FReal AngleTolerance; // Angle error below which we consider a constraint or drive solved
913
914 // Tracking whether the solver is resolved
915 FVec3 LastDPs[MaxConstrainedBodies]; // Positions at the beginning of the iteration
916 FVec3 LastDQs[MaxConstrainedBodies]; // Rotations at the beginning of the iteration
917 FVec3 CurrentPs[MaxConstrainedBodies]; // Positions at the beginning of the iteration
918 FRotation3 CurrentQs[MaxConstrainedBodies]; // Rotations at the beginning of the iteration
919 FVec3 InitConstraintAxisLinearVelocities; // Linear velocities along the constraint axes at the beginning of the frame, used by restitution
920 FVec3 InitConstraintAxisAngularVelocities; // Angular velocities along the constraint axes at the beginning of the frame, used by restitution
921 int32 NumActiveConstraints; // The number of active constraints and drives in the last iteration (-1 initial value)
922 bool bIsActive; // Whether any constraints actually moved any bodies in last iteration
923 bool bUsePositionBasedDrives; // Whether to apply velocity drive in the PBD step of the VBD step
924
925 FAxisConstraintDatas PositionConstraints;
926 FAxisConstraintDatas RotationConstraints;
927
928 FAxisConstraintDatas PositionDrives;
929 FAxisConstraintDatas RotationDrives;
930
931 bool bIsBroken;
932 bool bIsViolating;
933 bool bUseSimd;
934
935 // dummy indices
936 static constexpr int32 PointPositionConstraintIndex = 0;
937 static constexpr int32 SphericalPositionConstraintIndex = 0;
938 static constexpr int32 PlanarPositionConstraintIndex = 0;
939
940 private :
944 void ComputeBodyState(const int32 BodyIndex);
945 };
946
947}
#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
void Init()
Definition LockFreeList.h:4
FORCEINLINE VectorRegister4Float VectorMultiplyAdd(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2, const VectorRegister4Float &Vec3)
Definition UnrealMathFPU.h:786
FORCEINLINE VectorRegister4Float VectorZeroFloat(void)
Definition UnrealMathFPU.h:331
FORCEINLINE void VectorStoreFloat3(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:594
#define VectorReplicate(Vec, ElementIndex)
Definition UnrealMathFPU.h:627
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition SolverBody.h:543
FRotation3 CorrectedQ() const
Definition SolverBody.h:646
FVec3 CorrectedP() const
Definition SolverBody.h:645
const FRotation3 & R() const
Definition SolverBody.h:631
const FVec3 & X() const
Definition SolverBody.h:630
const FSolverVec3 & V() const
Definition SolverBody.h:638
const FSolverVec3 & W() const
Definition SolverBody.h:639
Definition PBDJointCachedSolverGaussSeidel.h:233
FConstraintSolverBody & Body(int32 BodyIndex)
Definition PBDJointCachedSolverGaussSeidel.h:239
void ApplyVelocityConstraints(const FReal Dt, const FReal InSolverStiffness, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition PBDJointCachedSolverGaussSeidel.cpp:315
void ApplyPositionProjection(const FReal Dt, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition PBDJointCachedSolverGaussSeidel.cpp:2101
void ApplyPositionTeleportSimd(const FRealSingle TeleportDistance)
Definition PBDJointCachedSolverGaussSeidel.cpp:2307
void ApplyRotationProjection(const FReal Dt, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition PBDJointCachedSolverGaussSeidel.cpp:1931
const FVec3 V(int BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:299
const FRotation3 R(int BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:280
void ApplyPositionTeleport(const FReal Dt, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition PBDJointCachedSolverGaussSeidel.cpp:2250
const FConstraintSolverBody & Body0() const
Definition PBDJointCachedSolverGaussSeidel.h:260
void SetIsBroken(const bool bInIsBroken)
Definition PBDJointCachedSolverGaussSeidel.h:547
bool IsBroken() const
Definition PBDJointCachedSolverGaussSeidel.h:552
void ApplyAxisPositionTeleport(const FReal TeleportDistance, const int32 ConstraintIndex)
Definition PBDJointCachedSolverGaussSeidel.cpp:2272
void ApplyRotationTeleport(const FReal Dt, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition PBDJointCachedSolverGaussSeidel.cpp:2332
bool IsDynamic(int32 BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:319
FVec3 GetNetLinearImpulse() const
Definition PBDJointCachedSolverGaussSeidel.h:325
void SetIsViolating(const bool bInIsViolating)
Definition PBDJointCachedSolverGaussSeidel.h:557
const FVec3 X(int BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:275
FConstraintSolverBody & Body1()
Definition PBDJointCachedSolverGaussSeidel.h:265
bool RequiresSolve() const
Definition PBDJointCachedSolverGaussSeidel.h:567
void Deinit()
Definition PBDJointCachedSolverGaussSeidel.cpp:280
int32 GetNumActiveConstraints() const
Definition PBDJointCachedSolverGaussSeidel.h:430
const FRotation3 Q(int BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:292
void ApplyRotationProjectionSimd(const FRealSingle AngularProjection, const bool bLinearLocked)
Definition PBDJointCachedSolverGaussSeidel.cpp:2012
void SetSolverBodies(FSolverBody *SolverBody0, FSolverBody *SolverBody1)
Definition PBDJointCachedSolverGaussSeidel.h:445
void ApplyPositionProjectionSimd(const FReal LinearProjection)
Definition PBDJointCachedSolverGaussSeidel.cpp:2168
FReal GetAngularViolation() const
Definition PBDJointCachedSolverGaussSeidel.h:425
void ApplyAxisRotationProjection(const FReal AngularProjection, const bool bLinearLocked, const int32 ConstraintIndex)
Definition PBDJointCachedSolverGaussSeidel.cpp:1957
void ApplyTeleports(const FReal Dt, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition PBDJointCachedSolverGaussSeidel.cpp:2240
const FVec3 P(int BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:285
void ApplyAxisPositionProjection(const FReal LinearProjection, const int32 ConstraintIndex)
Definition PBDJointCachedSolverGaussSeidel.cpp:2125
const FConstraintSolverBody & Body(int32 BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:247
const FVec3 W(int BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:304
const FConstraintSolverBody & Body1() const
Definition PBDJointCachedSolverGaussSeidel.h:270
FReal InvM(int32 BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:309
void ApplyProjections(const FReal Dt, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings, const bool bLastIteration)
Definition PBDJointCachedSolverGaussSeidel.cpp:1886
FMatrix33 InvI(int32 BodyIndex) const
Definition PBDJointCachedSolverGaussSeidel.h:314
static const int32 MaxConstrainedBodies
Definition PBDJointCachedSolverGaussSeidel.h:235
FConstraintSolverBody & Body0()
Definition PBDJointCachedSolverGaussSeidel.h:255
void InitProjection(const FReal Dt, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition PBDJointCachedSolverGaussSeidel.cpp:241
FReal GetLinearViolationSq() const
Definition PBDJointCachedSolverGaussSeidel.h:420
FVec3 GetNetAngularImpulse() const
Definition PBDJointCachedSolverGaussSeidel.h:373
void SetShockPropagationScales(const FReal InvMScale0, const FReal InvMScale1, const FReal Dt)
Definition PBDJointCachedSolverGaussSeidel.cpp:123
void ApplyConstraints(const FReal Dt, const FReal InSolverStiffness, const FPBDJointSolverSettings &SolverSettings, const FPBDJointSettings &JointSettings)
Definition PBDJointCachedSolverGaussSeidel.cpp:288
bool GetIsActive() const
Definition PBDJointCachedSolverGaussSeidel.h:436
bool IsViolating() const
Definition PBDJointCachedSolverGaussSeidel.h:562
FPBDJointCachedSolver()
Definition PBDJointCachedSolverGaussSeidel.h:441
Definition PBDJointConstraintTypes.h:114
Definition PBDJointConstraintTypes.h:219
Definition SolverBody.h:99
Definition Vector.h:407
Definition Vector.h:1000
Definition SkeletalMeshComponent.h:307
FRealDouble FReal
Definition Real.h:22
EJointAngularConstraintIndex
Definition PBDJointConstraintTypes.h:48
@ Update
Definition PendingSpatialData.h:19
float FRealSingle
Definition Real.h:14
TVector< FReal, 3 > FVec3
Definition Core.h:17
EJointMotionType
Definition PBDJointConstraintTypes.h:23
U16 Index
Definition radfft.cpp:71
Definition PBDJointCachedSolverGaussSeidel.h:69
VectorRegister4Float ConstraintHardIM
Definition PBDJointCachedSolverGaussSeidel.h:83
VectorRegister4Float ConstraintSoftDamping
Definition PBDJointCachedSolverGaussSeidel.h:78
VectorRegister4Float ConstraintLimits
Definition PBDJointCachedSolverGaussSeidel.h:81
VectorRegister4Float ConstraintDRAxis[3][2]
Definition PBDJointCachedSolverGaussSeidel.h:84
VectorRegister4Float ConstraintSoftStiffness
Definition PBDJointCachedSolverGaussSeidel.h:77
FDataSimd()
Definition PBDJointCachedSolverGaussSeidel.h:70
VectorRegister4Float ConstraintArms[2]
Definition PBDJointCachedSolverGaussSeidel.h:79
VectorRegister4Float ConstraintAxis[3]
Definition PBDJointCachedSolverGaussSeidel.h:80
VectorRegister4Float ConstraintCX
Definition PBDJointCachedSolverGaussSeidel.h:85
VectorRegister4Float ConstraintSoftIM
Definition PBDJointCachedSolverGaussSeidel.h:82
VectorRegister4Float ConstraintHardStiffness
Definition PBDJointCachedSolverGaussSeidel.h:76
VectorRegister4Float ConstraintLambda
Definition PBDJointCachedSolverGaussSeidel.h:86
Definition PBDJointCachedSolverGaussSeidel.h:90
FVec3 ConstraintHardStiffness
Definition PBDJointCachedSolverGaussSeidel.h:91
FVec3 ConstraintAxis[3]
Definition PBDJointCachedSolverGaussSeidel.h:95
FVec3 ConstraintLambda
Definition PBDJointCachedSolverGaussSeidel.h:101
FVec3 ConstraintDRAxis[3][2]
Definition PBDJointCachedSolverGaussSeidel.h:99
FVec3 ConstraintArms[3][2]
Definition PBDJointCachedSolverGaussSeidel.h:94
FVec3 ConstraintSoftStiffness
Definition PBDJointCachedSolverGaussSeidel.h:92
FVec3 ConstraintHardIM
Definition PBDJointCachedSolverGaussSeidel.h:98
FVec3 ConstraintSoftDamping
Definition PBDJointCachedSolverGaussSeidel.h:93
FVec3 ConstraintLimits
Definition PBDJointCachedSolverGaussSeidel.h:96
FVec3 ConstraintCX
Definition PBDJointCachedSolverGaussSeidel.h:100
FVec3 ConstraintSoftIM
Definition PBDJointCachedSolverGaussSeidel.h:97
Definition PBDJointCachedSolverGaussSeidel.h:18
void SetMaxForce(const int32 ConstraintIndex, const FReal InMaxForce, const FReal Dt)
Definition PBDJointCachedSolverGaussSeidel.cpp:2996
uint8 bSoftLimit1
Definition PBDJointCachedSolverGaussSeidel.h:125
FVec3 SettingsSoftStiffness
Definition PBDJointCachedSolverGaussSeidel.h:112
void SetSoftLimit(int32 Index, bool bValue)
Definition PBDJointCachedSolverGaussSeidel.h:199
EJointMotionType GetMotionType(int32 Index) const
Definition PBDJointCachedSolverGaussSeidel.h:166
uint8 MotionType2
Definition PBDJointCachedSolverGaussSeidel.h:131
void UpdateMass(const int32 ConstraintIndex, const FVec3 &DatasIA0, const FVec3 &DatasIA1, const FReal DatasIM, const FReal Dt, const bool bUsePositionBasedDrives)
Definition PBDJointCachedSolverGaussSeidel.cpp:2972
void ApplyMaxLambda(const int32 ConstraintIndex, FReal &DeltaLambda, FReal &Lambda)
Definition PBDJointCachedSolverGaussSeidel.cpp:3016
FVec3 ConstraintLambdaVelocity
Definition PBDJointCachedSolverGaussSeidel.h:116
FAxisConstraintDatas(FAxisConstraintDatas &&)=delete
uint8 bLimitsCheck1
Definition PBDJointCachedSolverGaussSeidel.h:122
bool GetLimitsCheck(int32 Index) const
Definition PBDJointCachedSolverGaussSeidel.h:144
FAxisConstraintDatas()
Definition PBDJointCachedSolverGaussSeidel.h:19
void UpdateDatas(const int32 ConstraintIndex, const FVec3 &DatasAxis, const FReal DatasCX, const FReal DatasRestitution, const bool bCheckLimit=true, const FVec3 &DatasArm0=FVec3::Zero(), const FVec3 &DatasArm1=FVec3::Zero(), const FReal DatasVX=0.0)
Definition PBDJointCachedSolverGaussSeidel.cpp:2951
FDataSimd Simd
Definition PBDJointCachedSolverGaussSeidel.h:106
FData Data
Definition PBDJointCachedSolverGaussSeidel.h:107
void SetLimitsCheck(int32 Index, bool bValue)
Definition PBDJointCachedSolverGaussSeidel.h:188
uint8 bLimitsCheck0
Definition PBDJointCachedSolverGaussSeidel.h:121
FVec3 ConstraintMaxLambda
Definition PBDJointCachedSolverGaussSeidel.h:110
FVec3 ConstraintRestitution
Definition PBDJointCachedSolverGaussSeidel.h:115
uint8 MotionType0
Definition PBDJointCachedSolverGaussSeidel.h:129
void SetValidDatas(int32 Index, bool bValue)
Definition PBDJointCachedSolverGaussSeidel.h:177
void InitDatas(const int32 ConstraintIndex, const bool bHasSoftLimits, const FReal SoftStiffness, const FReal SoftDamping, const FReal HardStiffness, const bool bResetLambdas=true)
Definition PBDJointCachedSolverGaussSeidel.cpp:2925
uint8 bLimitsCheck2
Definition PBDJointCachedSolverGaussSeidel.h:123
uint8 bValidDatas0
Definition PBDJointCachedSolverGaussSeidel.h:118
uint8 bAccelerationMode
Definition PBDJointCachedSolverGaussSeidel.h:127
uint8 bValidDatas2
Definition PBDJointCachedSolverGaussSeidel.h:120
FVec3 SettingsSoftDamping
Definition PBDJointCachedSolverGaussSeidel.h:111
uint8 MotionType1
Definition PBDJointCachedSolverGaussSeidel.h:130
FAxisConstraintDatas & operator=(FAxisConstraintDatas &&)=delete
FVec3 ConstraintVX
Definition PBDJointCachedSolverGaussSeidel.h:113
uint8 bSoftLimit0
Definition PBDJointCachedSolverGaussSeidel.h:124
FAxisConstraintDatas(const FAxisConstraintDatas &)=delete
uint8 bValidDatas1
Definition PBDJointCachedSolverGaussSeidel.h:119
void SetMotionType(int32 Index, EJointMotionType Value)
Definition PBDJointCachedSolverGaussSeidel.h:210
FAxisConstraintDatas & operator=(const FAxisConstraintDatas &)=delete
uint8 bUseSimd
Definition PBDJointCachedSolverGaussSeidel.h:128
bool GetSoftLimit(int32 Index) const
Definition PBDJointCachedSolverGaussSeidel.h:155
uint8 bSoftLimit2
Definition PBDJointCachedSolverGaussSeidel.h:126
bool GetValidDatas(int32 Index) const
Definition PBDJointCachedSolverGaussSeidel.h:133
Definition UnrealMathFPU.h:20