UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ConstraintInstance.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "CoreMinimal.h"
7#include "UObject/Class.h"
9#include "EngineDefines.h"
13#include "ConstraintInstance.generated.h"
14
19struct FBodyInstance;
20
24class UPhysicsAsset;
26
27namespace Chaos
28{
29 struct FSerializedDataBuffer;
30}
31
32UENUM()
48
50
53
55USTRUCT()
57{
59
60
61 UPROPERTY(EditAnywhere, Category = Projection, meta = (ClampMin = "0.0"))
62 float ProjectionLinearTolerance;
63
65 UPROPERTY(EditAnywhere, Category = Projection, meta = (ClampMin = "0.0"))
66 float ProjectionAngularTolerance;
67
69 UPROPERTY(EditAnywhere, Category = Projection, meta = (ClampMin = "0.0", ClampMax = "1.0"))
70 float ProjectionLinearAlpha;
71
73 UPROPERTY(EditAnywhere, Category = Projection, meta = (ClampMin = "0.0", ClampMax = "1.0"))
74 float ProjectionAngularAlpha;
75
81 UPROPERTY(EditAnywhere, Category = Projection, meta = (ClampMin = "0.0", ClampMax = "1.0"))
82 float ShockPropagationAlpha;
83
85 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Linear, meta = (editcondition = "bLinearBreakable", ClampMin = "0.0"))
86 float LinearBreakThreshold;
87
89 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Linear, meta = (editcondition = "bLinearPlasticity", ClampMin = "0.0"))
90 float LinearPlasticityThreshold;
91
93 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Angular, meta = (editcondition = "bAngularBreakable", ClampMin = "0.0"))
94 float AngularBreakThreshold;
95
97 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Angular, meta = (editcondition = "bAngularPlasticity", ClampMin = "0.0"))
98 float AngularPlasticityThreshold;
99
101 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Linear, meta = (ClampMin = "0.0"))
102 float ContactTransferScale;
103
104 UPROPERTY(EditAnywhere, Category = Linear)
105 FLinearConstraint LinearLimit;
106
107 UPROPERTY(EditAnywhere, Category = Angular)
109
110 UPROPERTY(EditAnywhere, Category = Angular)
112
113 // Disable collision between bodies joined by this constraint.
114 UPROPERTY(EditAnywhere, Category = Constraint)
115 uint8 bDisableCollision : 1;
116
117 // When set, the parent body in a constraint will not be affected by the motion of the child
118 UPROPERTY(EditAnywhere, Category = Constraint)
119 uint8 bParentDominates : 1;
120
127 UPROPERTY(EditAnywhere, Category = Projection)
128 uint8 bEnableShockPropagation : 1;
129
144 UPROPERTY(EditAnywhere, Category = Projection)
145 uint8 bEnableProjection : 1;
146
153 UPROPERTY(EditAnywhere, Category = Projection)
154 uint8 bEnableMassConditioning : 1;
155
157 UPROPERTY(EditAnywhere, Category = Projection)
158 uint8 bUseLinearJointSolver : 1;
159
161 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Angular)
162 uint8 bAngularBreakable : 1;
163
165 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Angular)
166 uint8 bAngularPlasticity : 1;
167
169 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Linear)
170 uint8 bLinearBreakable : 1;
171
173 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Linear)
174 uint8 bLinearPlasticity : 1;
175
176 UPROPERTY(EditAnywhere, Category = Linear)
178
179 UPROPERTY(EditAnywhere, Category = Angular)
181
183 UPROPERTY(EditAnywhere, AdvancedDisplay, Category = Linear)
185
187
189 ENGINE_API void Update_AssumesLocked(const FPhysicsConstraintHandle& InConstraintRef, float AverageMass, float UseScale, bool InInitialize = false) const;
190
192 ENGINE_API void UpdateBreakable_AssumesLocked(const FPhysicsConstraintHandle& InConstraintRef) const;
193
195 ENGINE_API void UpdatePlasticity_AssumesLocked(const FPhysicsConstraintHandle& InConstraintRef) const;
196
198 ENGINE_API void UpdateContactTransferScale_AssumesLocked(const FPhysicsConstraintHandle& InConstraintRef) const;
199
201 ENGINE_API void UpdateConstraintFlags_AssumesLocked(const FPhysicsConstraintHandle& InConstraintRef) const;
202
203#if WITH_EDITOR
205#endif
206};
207
208USTRUCT()
251
253USTRUCT()
255{
257
258
259 UPROPERTY(VisibleAnywhere, Category=Constraint)
260 FName JointName;
261
263
268 UPROPERTY(EditAnywhere, Category=Constraint)
269 FName ConstraintBone1;
270
275 UPROPERTY(EditAnywhere, Category=Constraint)
276 FName ConstraintBone2;
277
278private:
280 float LastKnownScale;
281
282public:
283
285
287 UPROPERTY(EditAnywhere, Category = Constraint)
289
291 UPROPERTY(EditAnywhere, Category = Constraint)
292 FVector PriAxis1;
293
295 UPROPERTY(EditAnywhere, Category = Constraint)
296 FVector SecAxis1;
297
299
301 UPROPERTY(EditAnywhere, Category= Constraint)
303
305 UPROPERTY(EditAnywhere, Category = Constraint)
306 FVector PriAxis2;
307
309 UPROPERTY(EditAnywhere, Category = Constraint)
310 FVector SecAxis2;
311
314 UPROPERTY(EditAnywhere, Category = Angular)
315 FRotator AngularRotationOffset;
316
318 UPROPERTY(EditAnywhere, Category = Linear)
319 uint32 bScaleLinearLimits : 1;
320
321 float AverageMass;
322
323 //Constraint Data (properties easily swapped at runtime based on different constraint profiles)
324 UPROPERTY(EditAnywhere, Category = Constraint)
326
327public:
329 ENGINE_API void CopyProfilePropertiesFrom(const FConstraintProfileProperties& FromProperties);
330
332 ENGINE_API const FPhysicsConstraintHandle& GetPhysicsConstraintRef() const;
333
335 UE_INTERNAL void SerializeState(Chaos::FSerializedDataBuffer& OutSerializedState, Chaos::ESerializedDataContext DataContext);
336
338 UE_INTERNAL void ApplySerializedState(Chaos::FSerializedDataBufferPtr&& InSerializedState, Chaos::ESerializedDataContext DataContext);
339
341
344
346 const FName& GetChildBoneName() const { return ConstraintBone1; }
347
349 const FName& GetParentBoneName() const { return ConstraintBone2; }
350
352 float GetLinearLimit() const
353 {
354 return ProfileInstance.LinearLimit.Limit;
355 }
356
359 {
360 ProfileInstance.LinearLimit.XMotion = XConstraintType;
361 ProfileInstance.LinearLimit.YMotion = YConstraintType;
362 ProfileInstance.LinearLimit.ZMotion = ZConstraintType;
363 ProfileInstance.LinearLimit.Limit = InLinearLimitSize;
364 UpdateLinearLimit();
365 }
366
369 {
370 return ProfileInstance.LinearLimit.XMotion;
371 }
372
375 {
376 const FLinearConstraint& prevLimits = ProfileInstance.LinearLimit;
377 SetLinearLimits(XConstraintType, prevLimits.YMotion, prevLimits.ZMotion, prevLimits.Limit);
378 }
379
382 {
383 const FLinearConstraint& prevLimits = ProfileInstance.LinearLimit;
384 SetLinearLimits(XConstraintType, prevLimits.YMotion, prevLimits.ZMotion, InLinearLimitSize);
385 }
386
389 {
390 return ProfileInstance.LinearLimit.YMotion;
391 }
392
395 {
396 const FLinearConstraint& prevLimits = ProfileInstance.LinearLimit;
397 SetLinearLimits(prevLimits.XMotion, YConstraintType, prevLimits.ZMotion, prevLimits.Limit);
398 }
399
402 {
403 const FLinearConstraint& prevLimits = ProfileInstance.LinearLimit;
404 SetLinearLimits(prevLimits.XMotion, YConstraintType, prevLimits.ZMotion, InLinearLimitSize);
405 }
406
409 {
410 return ProfileInstance.LinearLimit.ZMotion;
411 }
412
415 {
416 const FLinearConstraint& prevLimits = ProfileInstance.LinearLimit;
417 SetLinearLimits(prevLimits.XMotion, prevLimits.YMotion, ZConstraintType, prevLimits.Limit);
418 }
419
422 {
423 const FLinearConstraint& prevLimits = ProfileInstance.LinearLimit;
424 SetLinearLimits(prevLimits.XMotion, prevLimits.YMotion, ZConstraintType, InLinearLimitSize);
425 }
426
429 {
430 return ProfileInstance.ConeLimit.Swing1Motion;
431 }
432
435 {
436 ProfileInstance.ConeLimit.Swing1Motion = MotionType;
437 UpdateAngularLimit();
438 }
439
440 // The current swing1 of the constraint
441 ENGINE_API float GetCurrentSwing1() const;
442
445 {
446 return ProfileInstance.ConeLimit.Swing1LimitDegrees;
447 }
448
453 {
454 ProfileInstance.ConeLimit.Swing1Motion = MotionType;
455 ProfileInstance.ConeLimit.Swing1LimitDegrees = InSwing1LimitAngle;
456 UpdateAngularLimit();
457 }
458
461 {
462 return ProfileInstance.ConeLimit.Swing2Motion;
463 }
464
467 {
468 ProfileInstance.ConeLimit.Swing2Motion = MotionType;
469 UpdateAngularLimit();
470 }
471
472 // The current swing2 of the constraint
473 ENGINE_API float GetCurrentSwing2() const;
474
477 {
478 return ProfileInstance.ConeLimit.Swing2LimitDegrees;
479 }
480
485 {
486 ProfileInstance.ConeLimit.Swing2Motion = MotionType;
487 ProfileInstance.ConeLimit.Swing2LimitDegrees = InSwing2LimitAngle;
488 UpdateAngularLimit();
489 }
490
493 {
494 return ProfileInstance.TwistLimit.TwistMotion;
495 }
496
499 {
500 ProfileInstance.TwistLimit.TwistMotion = MotionType;
501 UpdateAngularLimit();
502 }
503
504 // The current twist of the constraint
505 ENGINE_API float GetCurrentTwist() const;
506
509 {
510 return ProfileInstance.TwistLimit.TwistLimitDegrees;
511 }
512
517 {
518 ProfileInstance.TwistLimit.TwistMotion = MotionType;
519 ProfileInstance.TwistLimit.TwistLimitDegrees = InTwistLimitAngle;
520 UpdateAngularLimit();
521 }
522
524 bool GetIsSoftLinearLimit() const { return ProfileInstance.LinearLimit.bSoftConstraint; }
525
527 float GetSoftLinearLimitStiffness() const { return ProfileInstance.LinearLimit.Stiffness; }
528
530 float GetSoftLinearLimitDamping() const { return ProfileInstance.LinearLimit.Damping; }
531
533 float GetSoftLinearLimitRestitution() const { return ProfileInstance.LinearLimit.Restitution; }
534
536 float GetSoftLinearLimitContactDistance() const { return ProfileInstance.LinearLimit.ContactDistance; }
537
539 void SetSoftLinearLimitParams(bool bIsSoftLimit, float Stiffness, float Damping, float Restitution, float ContactDistance)
540 {
541 ProfileInstance.LinearLimit.bSoftConstraint = bIsSoftLimit;
542 ProfileInstance.LinearLimit.Stiffness = Stiffness;
543 ProfileInstance.LinearLimit.Damping = Damping;
544 ProfileInstance.LinearLimit.Restitution = Restitution;
545 ProfileInstance.LinearLimit.ContactDistance = ContactDistance;
546 UpdateLinearLimit();
547 }
548
550 bool GetIsSoftTwistLimit() const { return ProfileInstance.TwistLimit.bSoftConstraint; }
551
553 float GetSoftTwistLimitStiffness() const { return ProfileInstance.TwistLimit.Stiffness; }
554
556 float GetSoftTwistLimitDamping() const { return ProfileInstance.TwistLimit.Damping; }
557
559 float GetSoftTwistLimitRestitution() const { return ProfileInstance.TwistLimit.Restitution; }
560
562 float GetSoftTwistLimitContactDistance() const { return ProfileInstance.TwistLimit.ContactDistance; }
563
565 void SetSoftTwistLimitParams(bool bIsSoftLimit, float Stiffness, float Damping, float Restitution, float ContactDistance)
566 {
567 ProfileInstance.TwistLimit.bSoftConstraint = bIsSoftLimit;
568 ProfileInstance.TwistLimit.Stiffness = Stiffness;
569 ProfileInstance.TwistLimit.Damping = Damping;
570 ProfileInstance.TwistLimit.Restitution = Restitution;
571 ProfileInstance.TwistLimit.ContactDistance = ContactDistance;
572 UpdateAngularLimit();
573 }
574
576 bool GetIsSoftSwingLimit() const { return ProfileInstance.ConeLimit.bSoftConstraint; }
577
579 float GetSoftSwingLimitStiffness() const { return ProfileInstance.ConeLimit.Stiffness; }
580
582 float GetSoftSwingLimitDamping() const { return ProfileInstance.ConeLimit.Damping; }
583
585 float GetSoftSwingLimitRestitution() const { return ProfileInstance.ConeLimit.Restitution; }
586
588 float GetSoftSwingLimitContactDistance() const { return ProfileInstance.ConeLimit.ContactDistance; }
589
591 void SetSoftSwingLimitParams(bool bIsSoftLimit, float Stiffness, float Damping, float Restitution, float ContactDistance)
592 {
593 ProfileInstance.ConeLimit.bSoftConstraint = bIsSoftLimit;
594 ProfileInstance.ConeLimit.Stiffness = Stiffness;
595 ProfileInstance.ConeLimit.Damping = Damping;
596 ProfileInstance.ConeLimit.Restitution = Restitution;
597 ProfileInstance.ConeLimit.ContactDistance = ContactDistance;
598 UpdateAngularLimit();
599 }
600
606 {
607 ProfileInstance.bLinearBreakable = bInLinearBreakable;
608 ProfileInstance.LinearBreakThreshold = InLinearBreakThreshold;
609 UpdateBreakable();
610 }
611
613 bool IsLinearBreakable() const
614 {
615 return ProfileInstance.bLinearBreakable;
616 }
617
620 {
621 return ProfileInstance.LinearBreakThreshold;
622 }
623
629 {
630 ProfileInstance.bLinearPlasticity = bInLinearPlasticity;
631 ProfileInstance.LinearPlasticityThreshold = InLinearPlasticityThreshold;
632 ProfileInstance.LinearPlasticityType = InLinearPlasticityType;
633 UpdatePlasticity();
634 }
635
638 {
639 return ProfileInstance.bLinearPlasticity;
640 }
641
644 {
645 return ProfileInstance.LinearPlasticityThreshold;
646 }
647
650 {
651 return ProfileInstance.LinearPlasticityType;
652 }
653
658 {
659 ProfileInstance.ContactTransferScale = InContactTransferScale;
660 UpdateContactTransferScale();
661 }
662
665 {
666 return ProfileInstance.ContactTransferScale;
667 }
668
674 {
675 ProfileInstance.bAngularBreakable = bInAngularBreakable;
676 ProfileInstance.AngularBreakThreshold = InAngularBreakThreshold;
677 UpdateBreakable();
678 }
679
682 {
683 return ProfileInstance.bAngularBreakable;
684 }
685
688 {
689 return ProfileInstance.AngularBreakThreshold;
690 }
691
697 {
698 ProfileInstance.bAngularPlasticity = bInAngularPlasticity;
699 ProfileInstance.AngularPlasticityThreshold = InAngularPlasticityThreshold;
700 UpdatePlasticity();
701 }
702
705 {
706 return ProfileInstance.bAngularPlasticity;
707 }
708
711 {
712 return ProfileInstance.AngularPlasticityThreshold;
713 }
714
715 // @todo document
716 ENGINE_API void CopyConstraintGeometryFrom(const FConstraintInstance* FromInstance);
717
718 // @todo document
719 ENGINE_API void CopyConstraintParamsFrom(const FConstraintInstance* FromInstance);
720
722 ENGINE_API void CopyConstraintPhysicalPropertiesFrom(const FConstraintInstance* FromInstance, bool bKeepPosition, bool bKeepRotation);
723
724 // Retrieve the constraint force most recently applied to maintain this constraint. Returns 0 forces if the constraint is not initialized or broken.
725 ENGINE_API void GetConstraintForce(FVector& OutLinearForce, FVector& OutAngularForce);
726
727 // Retrieve the status of constraint being broken.
728 ENGINE_API bool IsBroken();
729
731 ENGINE_API void SetLinearPositionDrive(bool bEnableXDrive, bool bEnableYDrive, bool bEnableZDrive);
732
735 {
736 return ProfileInstance.LinearDrive.XDrive.bEnablePositionDrive;
737 }
738
741 {
742 return ProfileInstance.LinearDrive.YDrive.bEnablePositionDrive;
743 }
744
747 {
748 return ProfileInstance.LinearDrive.ZDrive.bEnablePositionDrive;
749 }
750
753 {
754 return ProfileInstance.LinearDrive.IsPositionDriveEnabled();
755 }
756
758 ENGINE_API void SetLinearPositionTarget(const FVector& InPosTarget);
759
762 {
763 return ProfileInstance.LinearDrive.PositionTarget;
764 }
765
767 ENGINE_API void SetLinearVelocityDrive(bool bEnableXDrive, bool bEnableYDrive, bool bEnableZDrive);
768
771 {
772 return ProfileInstance.LinearDrive.XDrive.bEnableVelocityDrive;
773 }
774
777 {
778 return ProfileInstance.LinearDrive.YDrive.bEnableVelocityDrive;
779 }
780
783 {
784 return ProfileInstance.LinearDrive.ZDrive.bEnableVelocityDrive;
785 }
786
789 {
790 return ProfileInstance.LinearDrive.IsVelocityDriveEnabled();
791 }
792
794 ENGINE_API void SetLinearVelocityTarget(const FVector& InVelTarget);
795
798 {
799 return ProfileInstance.LinearDrive.VelocityTarget;
800 }
801
803 ENGINE_API void SetLinearDriveParams(float InPositionStrength, float InVelocityStrength, float InForceLimit);
804
806 ENGINE_API void SetLinearDriveParams(const FVector& InPositionStrength, const FVector& InVelocityStrength, const FVector& InForceLimit);
807
809 ENGINE_API void SetLinearDriveAccelerationMode(bool bAccelerationMode);
810
812 ENGINE_API void GetLinearDriveParams(float& OutPositionStrength, float& OutVelocityStrength, float& OutForceLimit);
813
816
818 ENGINE_API void SetOrientationDriveTwistAndSwing(bool bInEnableTwistDrive, bool bInEnableSwingDrive);
819
821 ENGINE_API void GetOrientationDriveTwistAndSwing(bool& bOutEnableTwistDrive, bool& bOutEnableSwingDrive);
822
824 ENGINE_API void SetOrientationDriveSLERP(bool bInEnableSLERP);
825
828 {
829 return ProfileInstance.AngularDrive.SlerpDrive.bEnablePositionDrive;
830 }
831
834 {
835 return ProfileInstance.AngularDrive.IsOrientationDriveEnabled();
836 }
837
839 ENGINE_API void SetAngularOrientationTarget(const FQuat& InPosTarget);
840
843 {
844 return ProfileInstance.AngularDrive.OrientationTarget;
845 }
846
848 ENGINE_API void SetAngularVelocityDriveTwistAndSwing(bool bInEnableTwistDrive, bool bInEnableSwingDrive);
849
851 ENGINE_API void GetAngularVelocityDriveTwistAndSwing(bool& bOutEnableTwistDrive, bool& bOutEnableSwingDrive);
852
854 ENGINE_API void SetAngularVelocityDriveSLERP(bool bInEnableSLERP);
855
858 {
859 return ProfileInstance.AngularDrive.SlerpDrive.bEnableVelocityDrive;
860 }
861
864 {
865 return ProfileInstance.AngularDrive.IsVelocityDriveEnabled();
866 }
867
869 ENGINE_API void SetAngularVelocityTarget(const FVector& InVelTarget);
870
873 {
874 return ProfileInstance.AngularDrive.AngularVelocityTarget;
875 }
876
878 ENGINE_API void SetAngularDriveParams(float InSpring, float InDamping, float InForceLimit);
879
881 ENGINE_API void GetAngularDriveParams(float& OutSpring, float& OutDamping, float& OutForceLimit) const;
882
884 ENGINE_API void SetAngularDriveMode(EAngularDriveMode::Type DriveMode);
885
887 ENGINE_API void SetAngularDriveAccelerationMode(bool bAccelerationMode);
888
891 {
892 return ProfileInstance.AngularDrive.AngularDriveMode;
893 }
894
902 ENGINE_API void SetDriveParams(
906
908 ENGINE_API void UpdateLinearLimit();
909
911 ENGINE_API void UpdateAngularLimit();
912
914 ENGINE_API void SetAngularDOFLimitScale(float InSwing1LimitScale, float InSwing2LimitScale, float InTwistLimitScale);
915
917 ENGINE_API void SetLinearLimitSize(float NewLimitSize);
918
922
926
928 ENGINE_API void TermConstraint();
929
931 ENGINE_API bool IsTerminated() const;
932
934 ENGINE_API bool IsValidConstraintInstance() const;
935
936 // Get component ref frame
938
939 // Pass in reference frame in. If the constraint is currently active, this will set its active local pose. Otherwise the change will take affect in InitConstraint.
941
943 ENGINE_API FVector GetConstraintLocation();
944
945 // Pass in reference position in (maintains reference orientation). If the constraint is currently active, this will set its active local pose. Otherwise the change will take affect in InitConstraint.
946 ENGINE_API void SetRefPosition(EConstraintFrame::Type Frame, const FVector& RefPosition);
947
948 // Pass in reference orientation in (maintains reference position). If the constraint is currently active, this will set its active local pose. Otherwise the change will take affect in InitConstraint.
949 ENGINE_API void SetRefOrientation(EConstraintFrame::Type Frame, const FVector& PriAxis, const FVector& SecAxis);
950
953 {
954 return ProfileInstance.bDisableCollision;
955 }
956
958 ENGINE_API void SetDisableCollision(bool InDisableCollision);
959
960 // @todo document
961 void DrawConstraint(int32 ViewIndex, class FMeshElementCollector& Collector,
962 float Scale, float LimitDrawScale, bool bDrawLimits, bool bDrawSelected,
964 {
965 DrawConstraintImp(FPDIOrCollector(ViewIndex, Collector), Scale, LimitDrawScale, bDrawLimits, bDrawSelected, Con1Frame, Con2Frame, bDrawAsPoint, bDrawViolatedLimits);
966 }
967
969 float Scale, float LimitDrawScale, bool bDrawLimits, bool bDrawSelected,
971 {
973 }
974
975 ENGINE_API void GetUsedMaterials(TArray<UMaterialInterface*>& Materials);
976
977 ENGINE_API bool Serialize(FArchive& Ar);
978#if WITH_EDITORONLY_DATA
979 ENGINE_API void PostSerialize(const FArchive& Ar);
980#endif
981
984 {
985 return ProfileInstance.bEnableProjection;
986 }
987
989 ENGINE_API void EnableProjection();
990
992 ENGINE_API void DisableProjection();
993
995 ENGINE_API void SetProjectionParams(bool bEnableProjection, float ProjectionLinearAlpha, float ProjectionAngularAlpha, float ProjectionLinearTolerance, float ProjectionAngularTolerance);
996
998 ENGINE_API void GetProjectionParams(float& ProjectionLinearAlpha, float& ProjectionAngularAlpha, float& ProjectionLinearTolerance, float& ProjectionAngularTolerance) const;
999
1001 ENGINE_API void SetShockPropagationParams(bool bEnableShockPropagation, float ShockPropagationAlpha);
1002
1004 ENGINE_API float GetShockPropagationAlpha() const;
1005
1008 {
1009 return ProfileInstance.bParentDominates;
1010 }
1011
1013 ENGINE_API void EnableParentDominates();
1014 ENGINE_API void DisableParentDominates();
1015 ENGINE_API void SetParentDominates(bool bParentDominates);
1016
1019 {
1020 return ProfileInstance.bEnableMassConditioning;
1021 }
1022
1026 ENGINE_API void EnableMassConditioning();
1027
1031 ENGINE_API void DisableMassConditioning();
1032
1033 float GetLastKnownScale() const { return LastKnownScale; }
1034
1035 //Hacks to easily get zeroed memory for special case when we don't use GC
1036 static ENGINE_API void Free(FConstraintInstance * Ptr);
1037 static ENGINE_API FConstraintInstance * Alloc();
1038
1039private:
1040
1041 ENGINE_API bool CreateJoint_AssumesLocked(Chaos::FPhysicsObject* Body1, Chaos::FPhysicsObject* Body2);
1042 ENGINE_API void UpdateAverageMass_AssumesLocked(Chaos::FPhysicsObject* Body1, Chaos::FPhysicsObject* Body2);
1043
1044 struct FPDIOrCollector
1045 {
1047 FMeshElementCollector* Collector;
1048 int32 ViewIndex;
1049
1050 FPDIOrCollector(FPrimitiveDrawInterface* InPDI)
1051 : PDI(InPDI)
1052 , Collector(nullptr)
1053 , ViewIndex(INDEX_NONE)
1054 {
1055 }
1056
1058 : PDI(nullptr)
1060 , ViewIndex(InViewIndex)
1061 {
1062 }
1063
1064 bool HasCollector() const
1065 {
1066 return Collector != nullptr;
1067 }
1068
1069 FPrimitiveDrawInterface* GetPDI() const;
1070
1071 void DrawCylinder(const FVector& Start, const FVector& End, const float Thickness, const FMaterialRenderProxy* const MaterialProxy, const ESceneDepthPriorityGroup DepthPriority) const;
1072 void DrawCone(const FMatrix& ConeTransform, const float AngleWidth, const float AngleHeight, const uint32 NumSides, const FColor& PDIColor, const FMaterialRenderProxy* const MaterialRenderProxy, const ESceneDepthPriorityGroup DepthPriority) const;
1073 void DrawArrow(const FMatrix& ArrowTransform, const float Length, const float Thickness, const uint32 NumSides, const FColor& PDIColor, const FMaterialRenderProxy* const MaterialRenderProxy, const ESceneDepthPriorityGroup DepthPriority) const;
1074
1075 };
1076
1077 ENGINE_API void DrawConstraintImp(const FPDIOrCollector& PDIOrCollector,
1078 float Scale, float LimitDrawScale, bool bDrawLimits, bool bDrawSelected,
1079 const FTransform& Con1Frame, const FTransform& Con2Frame, bool bDrawAsPoint, bool bDrawViolatedLimits = false) const;
1080
1081 ENGINE_API void UpdateBreakable();
1082 ENGINE_API void UpdatePlasticity();
1083 ENGINE_API void UpdateContactTransferScale();
1084 ENGINE_API void UpdateDriveTarget();
1085
1086public:
1087
1088#if WITH_EDITORONLY_DATA
1089
1092
1095
1098#endif // WITH_EDITORONLY_DATA
1099
1101 // Most of these properties have moved inside the ProfileInstance member (FConstraintProfileProperties struct)
1102#if WITH_EDITORONLY_DATA
1103 UPROPERTY()
1104 uint32 bDisableCollision_DEPRECATED : 1;
1105 UPROPERTY()
1107 UPROPERTY()
1109 UPROPERTY()
1111 UPROPERTY()
1113 UPROPERTY()
1115 UPROPERTY()
1117 UPROPERTY()
1119 UPROPERTY()
1121 UPROPERTY()
1123 UPROPERTY()
1125 UPROPERTY()
1127 UPROPERTY()
1129 UPROPERTY()
1131 UPROPERTY()
1133 UPROPERTY()
1135 UPROPERTY()
1137 UPROPERTY()
1139 UPROPERTY()
1141 UPROPERTY()
1143 UPROPERTY()
1145 UPROPERTY()
1147 UPROPERTY()
1149 UPROPERTY()
1151 UPROPERTY()
1153 UPROPERTY()
1155 UPROPERTY()
1157private:
1158 UPROPERTY()
1160 UPROPERTY()
1162 UPROPERTY()
1164 UPROPERTY()
1166 UPROPERTY()
1168 UPROPERTY()
1170public:
1171 UPROPERTY()
1173 UPROPERTY()
1175 UPROPERTY()
1177 UPROPERTY()
1179 UPROPERTY()
1181 UPROPERTY()
1183 UPROPERTY()
1185 UPROPERTY()
1187 UPROPERTY()
1189 UPROPERTY()
1191 UPROPERTY()
1193 UPROPERTY()
1195 UPROPERTY()
1197private:
1198 UPROPERTY()
1200 UPROPERTY()
1202public:
1203 UPROPERTY()
1205 UPROPERTY()
1207 UPROPERTY()
1209 UPROPERTY()
1211 UPROPERTY()
1212 FVector AngularVelocityTarget_DEPRECATED; // Revolutions per second
1213 UPROPERTY()
1215 UPROPERTY()
1217 UPROPERTY()
1219#endif //EDITOR_ONLY_DATA
1220};
1221
1222template<>
1224{
1225 enum
1226 {
1228#if WITH_EDITORONLY_DATA
1229 WithPostSerialize = true
1230#endif
1231 };
1232};
1233
1234
1235// Wrapping type around instance pointer to be returned per value in Blueprints
1236USTRUCT(BlueprintType)
1238{
1240
1241public:
1243 : Owner(nullptr)
1244 , Index(0)
1245 {}
1246
1254
1255#if WITH_EDITOR
1257 {
1258 if (OnRelease)
1259 {
1260 OnRelease();
1261 }
1262 }
1263#endif
1264
1266
1268 ENGINE_API void Modify();
1269
1270private:
1271 UPROPERTY()
1273
1274 UPROPERTY()
1275 uint32 Index;
1276
1277#if WITH_EDITOR
1279 TFunction<void(void)> OnRelease;
1280#endif
1281};
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define WITH_EDITOR
Definition Build.h:67
EConstraintPlasticityType
Definition ChaosEngineInterface.h:173
EAngularConstraintMotion
Definition ChaosEngineInterface.h:114
ELinearConstraintMotion
Definition ChaosEngineInterface.h:187
EConstraintTransformComponentFlags
Definition ConstraintInstance.h:34
ENGINE_API FTransform CalculateRelativeBoneTransform(const FName ToBoneName, const FName FromBoneName, const FReferenceSkeleton &ReferenceSkeleton)
Definition ConstraintInstance.cpp:72
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_INTERNAL
Definition CoreMiscDefines.h:345
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
ESceneDepthPriorityGroup
Definition EngineTypes.h:187
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define UENUM(...)
Definition ObjectMacros.h:749
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
void DrawCone(FPrimitiveDrawInterface *PDI, const FMatrix &ConeToWorld, float Angle1, float Angle2, uint32 NumSides, bool bDrawSideLines, const FLinearColor &SideLineColor, const FMaterialRenderProxy *MaterialRenderProxy, uint8 DepthPriority)
Definition PrimitiveDrawingUtils.cpp:481
void DrawCylinder(FPrimitiveDrawInterface *PDI, const FVector &Base, const FVector &XAxis, const FVector &YAxis, const FVector &ZAxis, double Radius, double HalfHeight, uint32 Sides, const FMaterialRenderProxy *MaterialRenderProxy, uint8 DepthPriority)
Definition PrimitiveDrawingUtils.cpp:744
AUTORTFM_INFER constexpr auto Projection(Invocable0Type &&Invocable0, InvocableTypes &&... Invocables)
Definition Projection.h:108
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
if(Failed) console_printf("Failed.\n")
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition SingleParticlePhysicsProxy.h:58
Definition Archive.h:1208
Definition MaterialRenderProxy.h:102
Definition MeshElementCollector.h:26
Definition NameTypes.h:617
Definition PhysScene_Chaos.h:116
Definition ChaosEngineInterface.h:247
Definition PrimitiveDrawInterface.h:19
Definition Array.h:670
Definition EnumAsByte.h:22
Definition AndroidPlatformMisc.h:14
Definition MaterialInterface.h:296
Definition Object.h:95
Definition PhysicsAsset.h:172
Definition SkeletalMeshComponent.h:307
Definition ConstraintDrives.h:11
Type
Definition ConstraintDrives.h:13
Type
Definition ChaosEngineInterface.h:130
FORCEINLINE T * Get(const FObjectPtr &ObjectPtr)
Definition ObjectPtr.h:426
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition PhysicsObjectInternal.h:16
Definition ConstraintDrives.h:125
Definition BodyInstance.h:320
Definition PhysicsInterfaceTypesCore.h:199
Definition Color.h:486
Definition ConstraintTypes.h:72
Definition PhysicsInterfaceUtils.h:23
Definition PhysScene_Chaos.h:83
Definition ConstraintInstance.h:1238
FConstraintInstanceAccessor()
Definition ConstraintInstance.h:1242
FConstraintInstanceAccessor(const TWeakObjectPtr< UObject > &Owner, uint32 Index=0, TFunction< void(void)> InOnRelease=TFunction< void(void)>())
Definition ConstraintInstance.h:1247
Definition ConstraintInstance.h:210
FOnPlasticDeformation OnPlasticDeformationDelegate
Definition ConstraintInstance.h:243
FPhysScene * PhysScene
Definition ConstraintInstance.h:225
FPhysicsConstraintHandle ConstraintHandle
Definition ConstraintInstance.h:222
FOnConstraintBroken OnConstraintBrokenDelegate
Definition ConstraintInstance.h:241
const FPhysScene * GetPhysicsScene() const
Definition ConstraintInstance.h:228
ENGINE_API void SetPlasticDeformationDelegate(FOnPlasticDeformation InPlasticDeformationDelegate)
int32 ConstraintIndex
Definition ConstraintInstance.h:219
FPhysScene * GetPhysicsScene()
Definition ConstraintInstance.h:227
FOnConstraintViolated OnConstraintViolatedDelegate
Definition ConstraintInstance.h:242
Definition ConstraintInstance.h:255
float GetSoftSwingLimitRestitution() const
Definition ConstraintInstance.h:585
float GetSoftSwingLimitDamping() const
Definition ConstraintInstance.h:582
float GetSoftLinearLimitContactDistance() const
Definition ConstraintInstance.h:536
void SetSoftSwingLimitParams(bool bIsSoftLimit, float Stiffness, float Damping, float Restitution, float ContactDistance)
Definition ConstraintInstance.h:591
void SetAngularSwing2Limit(EAngularConstraintMotion MotionType, float InSwing2LimitAngle)
Definition ConstraintInstance.h:484
float GetAngularBreakThreshold() const
Definition ConstraintInstance.h:687
EAngularConstraintMotion GetAngularSwing1Motion() const
Definition ConstraintInstance.h:428
bool IsLinearPositionDriveEnabled() const
Definition ConstraintInstance.h:752
void SetLinearLimits(ELinearConstraintMotion XConstraintType, ELinearConstraintMotion YConstraintType, ELinearConstraintMotion ZConstraintType, float InLinearLimitSize)
Definition ConstraintInstance.h:358
bool IsLinearVelocityDriveXEnabled() const
Definition ConstraintInstance.h:770
void SetLinearPlasticity(bool bInLinearPlasticity, float InLinearPlasticityThreshold, EConstraintPlasticityType InLinearPlasticityType)
Definition ConstraintInstance.h:628
float GetSoftTwistLimitContactDistance() const
Definition ConstraintInstance.h:562
bool HasAngularPlasticity() const
Definition ConstraintInstance.h:704
ELinearConstraintMotion GetLinearXMotion() const
Definition ConstraintInstance.h:368
bool GetIsSoftTwistLimit() const
Definition ConstraintInstance.h:550
void SetAngularSwing1Motion(EAngularConstraintMotion MotionType)
Definition ConstraintInstance.h:434
float GetLastKnownScale() const
Definition ConstraintInstance.h:1033
void SetSoftTwistLimitParams(bool bIsSoftLimit, float Stiffness, float Damping, float Restitution, float ContactDistance)
Definition ConstraintInstance.h:565
float GetAngularPlasticityThreshold() const
Definition ConstraintInstance.h:710
float GetLinearLimit() const
Definition ConstraintInstance.h:352
bool IsLinearPositionDriveZEnabled() const
Definition ConstraintInstance.h:746
void SetAngularTwistLimit(EAngularConstraintMotion MotionType, float InTwistLimitAngle)
Definition ConstraintInstance.h:516
bool IsLinearPositionDriveYEnabled() const
Definition ConstraintInstance.h:740
EAngularConstraintMotion GetAngularSwing2Motion() const
Definition ConstraintInstance.h:460
bool GetIsSoftSwingLimit() const
Definition ConstraintInstance.h:576
float GetSoftTwistLimitStiffness() const
Definition ConstraintInstance.h:553
void SetLinearXLimit(ELinearConstraintMotion XConstraintType, float InLinearLimitSize)
Definition ConstraintInstance.h:381
void SetLinearYLimit(ELinearConstraintMotion YConstraintType, float InLinearLimitSize)
Definition ConstraintInstance.h:401
void DrawConstraint(FPrimitiveDrawInterface *PDI, float Scale, float LimitDrawScale, bool bDrawLimits, bool bDrawSelected, const FTransform &Con1Frame, const FTransform &Con2Frame, bool bDrawAsPoint, bool bDrawViolatedLimits) const
Definition ConstraintInstance.h:968
bool IsParentDominatesEnabled() const
Definition ConstraintInstance.h:1007
float GetSoftLinearLimitStiffness() const
Definition ConstraintInstance.h:527
bool IsProjectionEnabled() const
Definition ConstraintInstance.h:983
float GetSoftSwingLimitStiffness() const
Definition ConstraintInstance.h:579
float GetAngularSwing2Limit() const
Definition ConstraintInstance.h:476
float GetSoftTwistLimitDamping() const
Definition ConstraintInstance.h:556
const FVector & GetLinearPositionTarget()
Definition ConstraintInstance.h:761
bool IsLinearPositionDriveXEnabled() const
Definition ConstraintInstance.h:734
float GetSoftTwistLimitRestitution() const
Definition ConstraintInstance.h:559
ELinearConstraintMotion GetLinearZMotion() const
Definition ConstraintInstance.h:408
void SetAngularSwing2Motion(EAngularConstraintMotion MotionType)
Definition ConstraintInstance.h:466
bool GetOrientationDriveSLERP()
Definition ConstraintInstance.h:827
void SetAngularTwistMotion(EAngularConstraintMotion MotionType)
Definition ConstraintInstance.h:498
float GetLinearBreakThreshold() const
Definition ConstraintInstance.h:619
void SetLinearYMotion(ELinearConstraintMotion YConstraintType)
Definition ConstraintInstance.h:394
void SetAngularSwing1Limit(EAngularConstraintMotion MotionType, float InSwing1LimitAngle)
Definition ConstraintInstance.h:452
void SetLinearZMotion(ELinearConstraintMotion ZConstraintType)
Definition ConstraintInstance.h:414
bool IsAngularOrientationDriveEnabled() const
Definition ConstraintInstance.h:833
const FRotator & GetAngularOrientationTarget() const
Definition ConstraintInstance.h:842
float GetAngularSwing1Limit() const
Definition ConstraintInstance.h:444
bool IsLinearVelocityDriveYEnabled() const
Definition ConstraintInstance.h:776
const FName & GetParentBoneName() const
Definition ConstraintInstance.h:349
bool IsLinearBreakable() const
Definition ConstraintInstance.h:613
bool IsLinearVelocityDriveZEnabled() const
Definition ConstraintInstance.h:782
float GetSoftLinearLimitRestitution() const
Definition ConstraintInstance.h:533
void DrawConstraint(int32 ViewIndex, class FMeshElementCollector &Collector, float Scale, float LimitDrawScale, bool bDrawLimits, bool bDrawSelected, const FTransform &Con1Frame, const FTransform &Con2Frame, bool bDrawAsPoint, bool bDrawViolatedLimits) const
Definition ConstraintInstance.h:961
bool IsCollisionDisabled() const
Definition ConstraintInstance.h:952
void SetContactTransferScale(float InContactTransferScale)
Definition ConstraintInstance.h:657
bool GetAngularVelocityDriveSLERP()
Definition ConstraintInstance.h:857
const FVector & GetLinearVelocityTarget()
Definition ConstraintInstance.h:797
TEnumAsByte< enum EConstraintPlasticityType > GetLinearPlasticityType() const
Definition ConstraintInstance.h:649
EAngularConstraintMotion GetAngularTwistMotion() const
Definition ConstraintInstance.h:492
const FVector & GetAngularVelocityTarget() const
Definition ConstraintInstance.h:872
bool GetIsSoftLinearLimit() const
Definition ConstraintInstance.h:524
float GetAngularTwistLimit() const
Definition ConstraintInstance.h:508
float GetContactTransferScale() const
Definition ConstraintInstance.h:664
void SetLinearXMotion(ELinearConstraintMotion XConstraintType)
Definition ConstraintInstance.h:374
EAngularDriveMode::Type GetAngularDriveMode()
Definition ConstraintInstance.h:890
bool IsAngularVelocityDriveEnabled() const
Definition ConstraintInstance.h:863
bool IsAngularBreakable() const
Definition ConstraintInstance.h:681
void SetLinearZLimit(ELinearConstraintMotion ZConstraintType, float InLinearLimitSize)
Definition ConstraintInstance.h:421
float GetLinearPlasticityThreshold() const
Definition ConstraintInstance.h:643
bool IsLinearVelocityDriveEnabled() const
Definition ConstraintInstance.h:788
void SetSoftLinearLimitParams(bool bIsSoftLimit, float Stiffness, float Damping, float Restitution, float ContactDistance)
Definition ConstraintInstance.h:539
void SetLinearBreakable(bool bInLinearBreakable, float InLinearBreakThreshold)
Definition ConstraintInstance.h:605
bool HasLinearPlasticity() const
Definition ConstraintInstance.h:637
void SetAngularBreakable(bool bInAngularBreakable, float InAngularBreakThreshold)
Definition ConstraintInstance.h:673
float GetSoftSwingLimitContactDistance() const
Definition ConstraintInstance.h:588
ELinearConstraintMotion GetLinearYMotion() const
Definition ConstraintInstance.h:388
float GetSoftLinearLimitDamping() const
Definition ConstraintInstance.h:530
bool IsMassConditioningEnabled() const
Definition ConstraintInstance.h:1018
void SetAngularPlasticity(bool bInAngularPlasticity, float InAngularPlasticityThreshold)
Definition ConstraintInstance.h:696
Definition ConstraintInstance.h:57
Definition PhysScene_Chaos.h:93
Definition ConstraintTypes.h:43
Definition ConstraintDrives.h:66
Definition PhysScene_Chaos.h:103
Definition UnrealType.h:7001
Definition ReferenceSkeleton.h:100
Definition ConstraintTypes.h:100
Definition StructOpsTypeTraits.h:11
@ WithSerializer
Definition StructOpsTypeTraits.h:23
@ WithPostSerialize
Definition StructOpsTypeTraits.h:25
Definition StructOpsTypeTraits.h:46
Definition WeakObjectPtrTemplates.h:25