UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ConstraintsManager.inl
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7#include "Algo/StableSort.h"
8
9template< typename TConstraint >
11{
13 if (!Subsystem)
14 {
15 return nullptr;
16 }
17 // unique name (we may want to use another approach here to manage uniqueness)
18 FName Name = MakeUniqueObjectName(Subsystem, TConstraint::StaticClass(), InBaseName);
19
20 // ensure that the constraint isn't already registered in the ConstraintManager
22 const bool bNameFound = Constraints.ContainsByPredicate([Name](const TWeakObjectPtr<UTickableConstraint>& Constraint)
23 {
24 return Constraint.IsValid() && Constraint->GetFName() == Name;
25 });
26 if (bNameFound)
27 {
28 Name = MakeUniqueObjectName(Subsystem, TConstraint::StaticClass(), InBaseName, EUniqueObjectNameOptions::GloballyUnique);
29 }
30
31 UObject* Template = bUseDefault ? Subsystem->GetConfig(TConstraint::StaticClass()) : nullptr;
32 TConstraint* NewConstraint = NewObject<TConstraint>(Subsystem, Name, RF_Transactional, Template, Template != nullptr);
33 NewConstraint->Modify();
34 return NewConstraint;
35}
36
37template <typename Predicate>
39 Predicate Pred, const bool bSorted) const
40{
41 using ConstraintPtr = TWeakObjectPtr<UTickableConstraint>;
43
44 if (!Subsystem)
45 {
47 return Empty;
48 }
49
51 if (!bSorted)
52 {
53 return Constraints;
54 }
55
56 // LHS ticks before RHS = LHS is a prerex of RHS
57 auto TicksBefore = [this](const UTickableConstraint& LHS, const UTickableConstraint& RHS)
58 {
59 const TArray<FTickPrerequisite>& RHSPrerex = RHS.GetTickFunction(World).GetPrerequisites();
60 const FConstraintTickFunction& LHSTickFunction = LHS.GetTickFunction(World);
61 const bool bIsLHSAPrerexOfRHS = RHSPrerex.ContainsByPredicate([&LHSTickFunction](const FTickPrerequisite& Prerex)
62 {
63 return Prerex.PrerequisiteTickFunction == &LHSTickFunction;
64 });
65 return bIsLHSAPrerexOfRHS;
66 };
67
68 Algo::StableSort(Constraints, [TicksBefore](const ConstraintPtr& LHS, const ConstraintPtr& RHS)
69 {
70 return (LHS.IsValid() && RHS.IsValid()) ? TicksBefore(*LHS, *RHS) : false;
71 });
72
73 return Constraints;
74}
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ RF_Transactional
Object is transactional.
Definition ObjectMacros.h:562
FName MakeUniqueObjectName(UObject *Parent, const UClass *Class, FName InBaseName, EUniqueObjectNameOptions Options)
Definition UObjectGlobals.cpp:2811
Definition Constraints.Build.cs:6
TArray< TWeakObjectPtr< UTickableConstraint > > GetConstraintsByPredicate(Predicate Pred, const bool bSorted=false) const
Definition ConstraintsManager.inl:38
TConstraint * AllocateConstraintT(const FName &InBaseName, const bool bUseDefault=false) const
Definition ConstraintsManager.inl:10
Definition NameTypes.h:617
Definition Array.h:670
TArray< ElementType > FilterByPredicate(Predicate Pred) const
Definition Array.h:1498
Definition ConstraintSubsystem.h:41
static UConstraintSubsystem * Get()
Definition ConstraintSubsystem.cpp:75
CONSTRAINTS_API TArray< TWeakObjectPtr< UTickableConstraint > > GetConstraints(const UWorld *InWorld) const
Definition ConstraintSubsystem.cpp:138
UTickableConstraint * GetConfig(const UClass *InConstraintClass)
Definition ConstraintSubsystem.cpp:53
Definition Object.h:95
Definition ConstraintsManager.h:74
UE_REWRITE void StableSort(RangeType &&Range)
Definition StableSort.h:125
Definition ConstraintsManager.h:25
Definition EngineBaseTypes.h:117
Definition WeakObjectPtrTemplates.h:25
FORCEINLINE bool IsValid(bool bEvenIfPendingKill, bool bThreadsafeTest=false) const
Definition WeakObjectPtrTemplates.h:232